diff --git a/.drone.yml b/.drone.yml index 64a7000..e3b1f91 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,9 +6,11 @@ steps: - name: test image: node:16 commands: - - node ./test-server/http.js & - - npm i - - npm run build + - curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7 + - node ./test-server/node-http.js & + - pnpm install + - pnpm run test:nowatch + - pnpm run build --- kind: pipeline @@ -18,7 +20,8 @@ steps: - name: test image: node commands: - - node ./test-server/http.js & - - npm i - - npm run test:nowatch - - npm run build \ No newline at end of file + - curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7 + - node ./test-server/node-http.js & + - pnpm install + - pnpm run test:nowatch + - pnpm run build \ No newline at end of file diff --git a/.env.development b/.env.development index 58cf9aa..9b4e331 100644 --- a/.env.development +++ b/.env.development @@ -1,3 +1 @@ -VITE_API_FETCH_URL=http://localhost:5000 -VITE_API_SET_CONTAINER_LIST_URL=http://localhost:5000/SetContainerList -VITE_API_GET_FEEDBACK_URL=http://localhost:5000/GetFeedback \ No newline at end of file +VITE_API_URL=http://localhost:5000 \ No newline at end of file diff --git a/.env.production b/.env.production index 4eb6fb6..28d2829 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,2 @@ -VITE_API_FETCH_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/GetSVGLayoutConfiguration -VITE_API_SET_CONTAINER_LIST_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/SetContainerList -VITE_API_GET_FEEDBACK_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/GetFeedback \ No newline at end of file + +VITE_API_URL=https://localhost/SmartMenuiserieTemplate \ No newline at end of file diff --git a/.env.test b/.env.test index 58cf9aa..9b4e331 100644 --- a/.env.test +++ b/.env.test @@ -1,3 +1 @@ -VITE_API_FETCH_URL=http://localhost:5000 -VITE_API_SET_CONTAINER_LIST_URL=http://localhost:5000/SetContainerList -VITE_API_GET_FEEDBACK_URL=http://localhost:5000/GetFeedback \ No newline at end of file +VITE_API_URL=http://localhost:5000 \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index d0d3135..0000000 --- a/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -**/*.md - -/csharp -/dist -/docs -/public -/src/dts \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 09807f9..b72be75 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,9 +1,4 @@ module.exports = { - settings: { - react: { - version: "detect" - } - }, env: { browser: true, es2021: true @@ -19,47 +14,19 @@ module.exports = { }, ecmaVersion: 'latest', sourceType: 'module', - project: './tsconfig.json', - tsconfigRootDir: __dirname + project: './tsconfig.json' }, plugins: [ - 'only-warn', 'react', - 'react-hooks', '@typescript-eslint' ], rules: { - 'prefer-arrow-callback': 'error', - 'func-style': ['error', 'declaration'], 'space-before-function-paren': ['error', 'never'], - 'max-len': ['error', { 'code': 120 }], - 'max-depth': ['error', 4], - 'function-paren-newline': ['error', 'multiline-arguments'], - 'multiline-ternary': ['error', 'always'], - 'prefer-template': "error", - - // Import/export - 'import/no-default-export': 'error', - 'import/no-duplicates': 'error', - 'import/newline-after-import': 'error', - 'import/order': 'error', - - // Typescript overload - indent: 'off', - semi: 'off', - "camelcase": "off", - 'no-unused-vars': 'off', - - // Typescript '@typescript-eslint/space-before-function-paren': ['error', 'never'], - '@typescript-eslint/indent': ['warn', 2, {SwitchCase: 1}], + indent: ['warn', 2, { SwitchCase: 1 }], + semi: 'off', '@typescript-eslint/semi': ['warn', 'always'], + 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'error', - '@typescript-eslint/ban-types': ['error'], - '@typescript-eslint/no-floating-promises': 'off', // disabled cuz troublesome for SweetAlert since they never reject - - // React - 'react-hooks/rules-of-hooks': 'error', // Checks rules of Hooks - 'react-hooks/exhaustive-deps': 'warn' // Checks effect dependencies } }; diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 54d6a95..0000000 --- a/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -*.drawio filter=lfs diff=lfs merge=lfs -text -*.pdf filter=lfs diff=lfs merge=lfs -text -*.dwg filter=lfs diff=lfs merge=lfs -text -*.jpg filter=lfs diff=lfs merge=lfs -text -*.pptx filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 2fce477..a547bf3 100644 --- a/.gitignore +++ b/.gitignore @@ -20,410 +20,5 @@ dist-ssr *.suo *.ntvs* *.njsproj +*.sln *.sw? - -# Created by https://www.toptal.com/developers/gitignore/api/visualstudio -# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio - -### VisualStudio ### -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml - -### VisualStudio Patch ### -# Additional files built by Visual Studio - -# End of https://www.toptal.com/developers/gitignore/api/visualstudio \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 1308108..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - }, - { - "type": "msedge", - "request": "launch", - "name": "Launch Edge against localhost", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - }, - { - "type": "chrome", - "request": "launch", - "name": "Launch Brave against localhost", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "runtimeExecutable": "C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe" - }, - { - "type": "chrome", - "request": "launch", - "name": "Launch Thorium against localhost", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - "runtimeExecutable": "/bin/thorium-browser" - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 58cb1d4..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "eslint.rules.customizations": [ - { "rule": "*", "severity": "warn" } - ] -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index a34d5d6..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "build", - "command": "dotnet", - "type": "process", - "args": [ - "build", - "${workspaceFolder}/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" - ], - "problemMatcher": "$msCompile" - }, - { - "label": "publish", - "command": "dotnet", - "type": "process", - "args": [ - "publish", - "${workspaceFolder}/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj", - "/property:GenerateFullPaths=true", - "/consoleloggerparameters:NoSummary" - ], - "problemMatcher": "$msCompile" - }, - { - "label": "watch", - "command": "dotnet", - "type": "process", - "args": [ - "watch", - "run", - "--project", - "${workspaceFolder}/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj" - ], - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 0ee06e3..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,216 +0,0 @@ -# Contributing to SVGLayoutDesigner - -First off, thank you for contributing to the project. -You will be able to navigate through this document with the table of contents. - -# Table of contents - -- [Contributing to SVGLayoutDesigner](#contributing-to-svglayoutdesigner) -- [Table of contents](#table-of-contents) -- [I want to contribute](#i-want-to-contribute) - - [I want to contribute to the .NETFramework API](#i-want-to-contribute-to-the-netframework-api) - - [Getting Started](#getting-started) - - [Before developing](#before-developing) - - [Testing](#testing) - - [Releasing](#releasing) - - [I want to contribute to the React component](#i-want-to-contribute-to-the-react-component) - - [Getting Started](#getting-started-1) - - [Before developing](#before-developing-1) - - [CORS](#cors) - - [Develop with Vite and pnpm](#develop-with-vite-and-pnpm) - - [Develop with mprocs](#develop-with-mprocs) - - [Testing the external API without .NETFramework or Windows](#testing-the-external-api-without-netframework-or-windows) - - [Setup debugging with chrome](#setup-debugging-with-chrome) - - [Testing](#testing-1) - - [Releasing](#releasing-1) -- [I want to report a bug](#i-want-to-report-a-bug) - - [Before submitting a bug report](#before-submitting-a-bug-report) - - [How do i submit a good bug report?](#how-do-i-submit-a-good-bug-report) -- [I want to suggest enhancements](#i-want-to-suggest-enhancements) - - [Before submitting an enhancement](#before-submitting-an-enhancement) - - [How do i submit a good enhancement suggestion?](#how-do-i-submit-a-good-enhancement-suggestion) - -# I want to contribute - -- Assign a `work item` in Azure DevOps to yourself and set it to `Work-in-progress` -- There are two main projects: the back-end API SVGLDLibs in .NETFramework and, the front-end SVGLD in Vite. - -## I want to contribute to the .NETFramework API - -### Getting Started - -Requirements: -- `Windows` >= 10.x -- `MSBuildTools` >= 2017.x or `Visual Studio` >= 2017.x -- `dotnet` >= 6.x - -Anything below is not officially supported. - -### Before developing - -- Make sure you have an existing work item -- Create a new branch for the new API -- Push the branch -- Create a pull request -- Link the work item to the pull request - -### Testing - -SVGLDLibs is a set of models and does not run anything. -Any API must be build from scratch by the end-user. - -In order to test the models, the project SVGLDWebAPI was created. - -- Make sure the dll is compiling with `pnpm build:dotnet` -- Update SVGLDWebAPI with new or updated models -- After that run `pnpm test:full` - -### Releasing - -When the tests are valids and the feature is ready to deploy, please update the version by following the versioning method in [RELEASING.md](RELEASING.md). - -Updating the API is usually a breaking change, so most of the time, the major version will change. So please, create a release candidate branch (or tag if merged on master). - - -## I want to contribute to the React component - -### Getting Started - -If you are new to React and Node.js, please install these tools: - -- A chromium-based browser (`chromium`, `chrome`, `edge`, `brave`, `vivaldi`). -- [VSCode](https://code.visualstudio.com/) -- [pnpm](https://pnpm.io/) -- [React DevTools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) -- [Typescript React code snippets](https://marketplace.visualstudio.com/items?itemName=infeng.vscode-react-typescript) -- [vscode-tailwindcss](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss) -- [vscode-eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) -- [vscode-drawio](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio) - -### Before developing - -- Make sure you have an existing work item -- Create a new branch for the new feature -- Push the branch -- Create a pull request -- Link the work item to the pull request -- Copy the `.env.development` to `.env.development.local` -- Update `.env.development.local` urls to the test server `http://localhost:5000` or `https://localhost/SmartMenuiserieTemplate` - -### CORS - -If you are getting CORS or HTTPS related error, please access the test server with your browser to allow the access to the unsecure website. - -### Develop with Vite and pnpm - -Install the dependencies : - -``` -pnpm i -``` - -Then run the following command to run the projet in a dev environment: - -``` -pnpm dev -``` - -### Develop with mprocs - -[Mprocs](https://github.com/pvolok/mprocs) runs multiple commands in parallel and shows output of each command separately. - -It is useful to run `vite` and the test server at the same time with `mprocs`. - -Run `pnpm d` or `pnpm mprocs` to run mprocs. - -### Testing the external API without .NETFramework or Windows - -Use the Node.js server in `/test-server` to simulate the api. - -```bash -node run ./test-server/http.js -``` - -The web server will be running at `http://localhost:5000` - -### Setup debugging with chrome - -Inside `.vscode/settings.json`, set the following : - -```json -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:5173", - "webRoot": "${workspaceFolder}", - } - ] -} -``` - -Change the `url` to the dev server url. Additionally, set the `runtimeExecutable` to your favorite chromium browser. - -### Testing - -Run `pnpm test` to test. - -### Releasing - -When the tests are valids and the feature is ready to deploy, please update the version by following the versioning method in [RELEASING.md](RELEASING.md). - - -# I want to report a bug - -## Before submitting a bug report - -A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. - -- Make sure that you are using the last version for both the project `svg-layout-designer` and the API `SVGLDLibs` -- Can you reliably reproduce the issue? And can you also reproduce it with older versions? -- Determine if your bug is really a bug and not an error on your side e.g. e.g. using incompatible environment components/versions. -- Make sure you have read the [documentation](docs/%23Project/Home.md). -- Make sure the issue is not already duplicated or solved in [the issue list](https://dev.azure.com/techformsa/SmartConfigurator/_backlogs/backlog/SmartConfigurator%20Team/Epics/?workitem=7092) -- Make sure to search the internet - -Collect the information about the bug: -- Stack trace -- OS, Platform and Version (`Windows`, `Linux`, `macOS`, `x86`, `arm`) -- Browser and version (`Chrome`, `Chromium`, `Firefox` and any chromium and gecko based browsers) - -## How do i submit a good bug report? - -> You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to . - -- Open an [Issue](https://dev.azure.com/techformsa/SmartConfigurator/_backlogs/backlog/SmartConfigurator%20Team/Epics/?workitem=7763) -- Explain the behavior you would expect and the actual behavior -- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. -- Provide the information you collected in the previous section. - -Once it's filed: - -- The project team will assign the bug accordingly -- If the team is not able to reproduce the issue, more information will be asked -- If the team is able to reproduce the issue, it will be marked `TODO` - -# I want to suggest enhancements - -## Before submitting an enhancement - -- Make sure you are using the latest version -- Read the [documentation](docs/%23Project/Home.md) carefully and find out if the functionality is already covered, maybe by an individual configuration. - -## How do i submit a good enhancement suggestion? - -- Use a **clear and descriptive title** for the issue to identify the suggestion. -- Provide a **step-by-step description of the suggested enhancement** in as many details as possible. -- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. -- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to -- **Explain why this enhancement would be useful** to most users. You may also want to point out the other projects that solved it better and which could serve as inspiration. -- Use Azure DevOps to add the new feature request under the [epic](https://dev.azure.com/techformsa/SmartConfigurator/_backlogs/backlog/SmartConfigurator%20Team/Epics/?workitem=7092). diff --git a/README.md b/README.md index 249f794..895f9b3 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,74 @@ # SVG Layout Designer React -[![Build Status](https://dev.azure.com/techformsa/SmartConfigurator/_apis/build/status/SVGLayoutDesignerReact?branchName=master)](https://dev.azure.com/techformsa/SmartConfigurator/_build/latest?definitionId=9&branchName=master) +[![Build Status](https://drone.siklos-chaneru.duckdns.org/api/badges/Siklos/svg-layout-designer-react/status.svg)](https://drone.siklos-chaneru.duckdns.org/Siklos/svg-layout-designer-react) + +[![Build Status](https://drone.siklos-chaneru.duckdns.org/api/badges/Siklos/svg-layout-designer-react/status.svg?ref=refs/heads/dev)](https://drone.siklos-chaneru.duckdns.org/Siklos/svg-layout-designer-react) + +[![Build Status](https://dev.azure.com/enguyen0660/SVGLayoutDesignerReact/_apis/build/status/SVGLayoutDesignerReact?branchName=dev)](https://dev.azure.com/enguyen0660/SVGLayoutDesignerReact/_build/latest?definitionId=4&branchName=dev) An svg layout designer. - # Getting Started -Install these dependancies : +Requierements : +- NodeJS +- npm +- pnpm (optional but recommanded unless you prefer having a huge `node_modules` directory) -- [`node`](https://nodejs.org/en/) >= 18.x -- [`dotnet`](https://dotnet.microsoft.com/en-us/download/visual-studio-sdks) >= 6.x (optional) used for api test -- [`git-lfs`](https://git-lfs.github.com/) (in order to clone the documentation) +# Developping -# Test the project +Run `npm ci` -Test the project with these commands : +Run `npm run dev` -``` -npm i -npm run dev + + + +# Deploy + +Run `npm ci` + +Run `npm run build` + + +# Run the tests + +Run `npm ci` + +Run `npm test` + + +# API + +You can preload a state by setting the `state` URL parameter +with a url address to a `state.json` file. + +Example: `http://localhost:4000/?state=http://localhost:5000/state.json` + +# Testing the external API + +This program fetch the data structure from others applications, allowing it to assemble them later. + +## With NodeJS + +```bash +node run ./test-server/node-http.js ``` -# Contributing +The web server will be running at `http://localhost:5000` -If you want to contribute to the project, please read [CONTRIBUTING.md](CONTRIBUTING.md) \ No newline at end of file +Configure the file `.env.development` with the url + +## With bun.sh + +Install `bun` + +Inside `test-server` folder, run : + +```bash +bun run http.js +``` + +The web server will be running at `http://localhost:5000` + +Configure the file `.env.development` with the url \ No newline at end of file diff --git a/RELEASING.md b/RELEASING.md deleted file mode 100644 index 16211de..0000000 --- a/RELEASING.md +++ /dev/null @@ -1,64 +0,0 @@ -# Versioning - -Le projet utilise [la méthode sémantique de version](https://semver.org/lang/fr/). - -> Étant donné un numéro de version MAJEUR.MINEUR.CORRECTIF, il faut incrémenter : -> -> 1. le numéro de version MAJEUR quand il y a des changements non rétrocompatibles, -> 1. le numéro de version MINEUR quand il y a des ajouts de fonctionnalités rétrocompatibles, -> 1. le numéro de version de CORRECTIF quand il y a des corrections d’anomalies rétrocompatibles. -> -> Des libellés supplémentaires peuvent être ajoutés pour les versions de pré-livraison et pour des méta-données de construction sous forme d’extension du format MAJEURE.MINEURE.CORRECTIF. - -Ainsi nous utilerons le format `MAJOR.MINOR.PATCH` pour nos versions. -Le libellé supplémentaire sera le suffixe `-rcX` pour les version en pré-release (release candidate). - -Examples de noms de versions valides: `1.0.0`, `1.0.1`, `1.1.0`, `2.0.0`, `2.0-rc1`, `2.0-rc2` . - -Un example réel: https://kernel.org/ - - -# `package.json` - -La version courante complète est indiquée dans le `package.json`. - -En utilisant `npm`, on peut facilement mettre à jour ce nombre : - -``` -npm version major -npm version minor -npm version patch -``` - - -# Git - -Chaque version est tag par git sur la branche master. - -Pour tag : - -``` -git tag -a v1.0.0 -m "Release v1.0.0" -``` - -Pour pousser les modifications puis les tags : - -``` -git push origin master -git push origin master --tags -``` - -Ou pour faire les deux en même temps - -``` -git push origin master --follow-tags -``` - -Si vous êtes sur une branche autre que `master`, veuillez **NE PAS TAG**. Si vous voulez versionner la branche, créez une branche avec la version dans le nom : `v1.1-rc1`. - - -# Azure Pipeline - -Les tests d'Azure Pipeline sont lancés à condition que le nom de la branche soit `master` ou soit préfixée par la lettre `v` - -Exemples: `master`, `v1.0.2`, `v1.0-rc1`, `v1.0.1-mafeature` etc. diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7bf7ea9..5c52dac 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -5,17 +5,14 @@ trigger: - master -- v* +- dev +- dev* pool: vmImage: ubuntu-latest variables: pnpm_config_cache: $(Pipeline.Workspace)/.pnpm-store - CSWebProjectLocation: '$(System.DefaultWorkingDirectory)/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj' - CSLibsProjectLocation: '$(System.DefaultWorkingDirectory)/csharp/SVGLDLibs/SVGLDLibs/SVGLDLibs.csproj' - CSLibsProjectModelsLocation: '$(System.DefaultWorkingDirectory)/csharp/SVGLDLibs/SVGLDLibs/Models' - buildConfiguration: 'Release' steps: - task: Cache@2 @@ -24,59 +21,37 @@ steps: path: $(pnpm_config_cache) displayName: Cache pnpm -- bash: | +- script: | curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7 pnpm config set store-dir $(pnpm_config_cache) displayName: "Setup pnpm" - task: NodeTool@0 inputs: - versionSpec: '18.x' - displayName: 'Install Node.js 18.x LTS' + versionSpec: '16.x' + displayName: 'Install Node.js 16.x LTS' -- bash: | - set -euo pipefail +- script: | node --version - node ./test-server/http.js & - dotnet run --project=$(CSWebProjectLocation) & + node ./test-server/node-http.js & jobs - sleep 10 pnpm i pnpm run test:nowatch pnpm run build - kill -2 %1 %2 2>/dev/null - displayName: 'Test on Node.js 18.x LTS' + kill -2 %1 2>/dev/null + displayName: 'Test on Node.js 16.x LTS' - task: NodeTool@0 inputs: - versionSpec: '>=19.1.0' + versionSpec: '>=18.7.0' displayName: 'Install Node.js Latest' -- bash: | - set -euo pipefail +- script: | node --version - node ./test-server/http.js & - dotnet run --project=$(CSWebProjectLocation) & + node ./test-server/node-http.js & jobs - sleep 10 pnpm i pnpm run test:nowatch pnpm run build - kill -2 %1 %2 2>/dev/null - displayName: 'Test on Node.js Latest' - -- bash: | - pnpm run linter - displayName: 'Run eslint on src' - -- publish: $(System.DefaultWorkingDirectory)/dist - artifact: svg-layout-designer - -- script: dotnet build $(CSLibsProjectLocation) --configuration $(buildConfiguration) --output $(build.artifactstagingdirectory) - displayName: 'dotnet build $(buildConfiguration)' - -- publish: $(Build.ArtifactStagingDirectory) - artifact: svg-layout-designer-net - -- publish: $(CSLibsProjectModelsLocation) - artifact: svg-layout-designer-net-source \ No newline at end of file + kill -2 %1 2>/dev/null + displayName: 'Test on Node.js 18.x Latest' \ No newline at end of file diff --git a/csharp/SVGLDLibs/.editorconfig b/csharp/SVGLDLibs/.editorconfig deleted file mode 100644 index 37707e0..0000000 --- a/csharp/SVGLDLibs/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -charset = utf-8 -trim_trailing_whitespace = true -end_of_line = crlf -indent_style = space -indent_size = 4 -insert_final_newline = false diff --git a/csharp/SVGLDLibs/SVGLDLibs.sln b/csharp/SVGLDLibs/SVGLDLibs.sln deleted file mode 100644 index 58e9534..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SVGLDLibs", "SVGLDLibs\SVGLDLibs.csproj", "{462AAD8D-9C0F-44E0-BF9B-B7533741C1FD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SVGLDWebAPI", "SVGLDWebAPI\SVGLDWebAPI.csproj", "{22E1C9F8-9019-481A-9658-0DFE5F363B34}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {462AAD8D-9C0F-44E0-BF9B-B7533741C1FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {462AAD8D-9C0F-44E0-BF9B-B7533741C1FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {462AAD8D-9C0F-44E0-BF9B-B7533741C1FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {462AAD8D-9C0F-44E0-BF9B-B7533741C1FD}.Release|Any CPU.Build.0 = Release|Any CPU - {22E1C9F8-9019-481A-9658-0DFE5F363B34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {22E1C9F8-9019-481A-9658-0DFE5F363B34}.Debug|Any CPU.Build.0 = Debug|Any CPU - {22E1C9F8-9019-481A-9658-0DFE5F363B34}.Release|Any CPU.ActiveCfg = Release|Any CPU - {22E1C9F8-9019-481A-9658-0DFE5F363B34}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {AB7354D7-38C1-482B-A973-01AD4E554A3F} - EndGlobalSection -EndGlobal diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/APIConfiguration.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/APIConfiguration.cs deleted file mode 100644 index 12515bd..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/APIConfiguration.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - - [DataContract] - public class APIConfiguration - { - [DataMember(EmitDefaultValue = false)] - public string apiFetchUrl { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string apiSetContainerListUrl { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string apiGetFeedbackUrl { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/ActionContainerModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/ActionContainerModel.cs deleted file mode 100644 index 4e79f24..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/ActionContainerModel.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class ActionContainerModel - { - [DataMember(EmitDefaultValue = false)] - public string Id { get; set; } - [DataMember(EmitDefaultValue = false)] - public ImageModel CustomLogo { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Label { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Description { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Action { get; set; } - [DataMember(EmitDefaultValue = false)] - public AddingBehaviorEnumModel AddingBehavior { get; set; } - - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/AddingBehaviorEnumModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/AddingBehaviorEnumModel.cs deleted file mode 100644 index 7dc4154..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/AddingBehaviorEnumModel.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public enum AddingBehaviorEnumModel - { - [EnumMember] - Append, - - [EnumMember] - InsertInto, - - [EnumMember] - Replace, - - [EnumMember] - ReplaceParent, - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/AvailableContainerModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/AvailableContainerModel.cs deleted file mode 100644 index c0050b9..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/AvailableContainerModel.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class AvailableContainerModel - { - /** type */ - [DataMember(EmitDefaultValue = false, IsRequired = true)] - public string Type { get; set; } - - /** displayed text */ - [DataMember(EmitDefaultValue = false)] - public string DisplayedText { get; set; } - - /** category */ - [DataMember(EmitDefaultValue = false)] - public string Category { get; set; } - - /** orientation */ - [DataMember(EmitDefaultValue = false)] - public Orientation Orientation { get; set; } - - /** horizontal offset */ - [DataMember(EmitDefaultValue = false)] - public double? X { get; set; } - - /** vertical offset */ - [DataMember(EmitDefaultValue = false)] - public double? Y { get; set; } - - /** width */ - [DataMember(EmitDefaultValue = false)] - public double? Width { get; set; } - - /** height */ - [DataMember(EmitDefaultValue = false)] - public double? Height { get; set; } - - /** - * Minimum width (min=1) - */ - [DataMember(EmitDefaultValue = false)] - public double? MinWidth { get; set; } - - /** - * Maximum width - */ - [DataMember(EmitDefaultValue = false)] - public double? MaxWidth { get; set; } - - /** - * Minimum height (min=1) - */ - [DataMember(EmitDefaultValue = false)] - public double? MinHeight { get; set; } - - /** - * Maximum height - */ - [DataMember(EmitDefaultValue = false)] - public double? MaxHeight { get; set; } - - /** margin */ - [DataMember(EmitDefaultValue = false)] - public Margin Margin { get; set; } - - /** true if anchor, false otherwise */ - [DataMember(EmitDefaultValue = false)] - public bool? IsAnchor { get; set; } - - /** true if flex, false otherwise */ - [DataMember(EmitDefaultValue = false)] - public bool? IsFlex { get; set; } - - /** - * Allow to use a Pattern to create the list of children - * Cannot be used with DefaultChildType, - * DefaultChildType will be disabled for this container and the children - */ - [DataMember(EmitDefaultValue = false)] - public string Pattern { get; set; } - - /** Method used on container add */ - [DataMember(EmitDefaultValue = false)] - public AddingBehaviorEnumModel? AddMethod { get; set; } - - /** - * (optional) - * Disabled when Pattern is used. - * - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - [DataMember(EmitDefaultValue = false)] - public string DefaultChildType { get; set; } - - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - [DataMember(EmitDefaultValue = false)] - public PositionReferenceEnumModel? PositionReference { get; set; } - - [DataMember(EmitDefaultValue = false)] - public bool? HideChildrenInTreeview { get; set; } - - - [DataMember(EmitDefaultValue = false)] - public Dimensions DimensionOptions { get; set; } - - - /** - * if true, hide the entry in the sidebar (default: false) - */ - [DataMember(EmitDefaultValue = false)] - public bool? IsHidden { get; set; } - - /** - * if true, hide the entry in the sidebar (default: false) - */ - [DataMember(EmitDefaultValue = false)] - public string[] Blacklist { get; set; } - - /** - * Cannot be used with blacklist. Whitelist will be prioritized. - * To disable the whitelist, Whitelist must be undefined. - * Only allow a set of available container to be added inside - */ - [DataMember(EmitDefaultValue = false)] - public string[] Whitelist { get; set; } - - /** - * List of possible actions shown on right-click - */ - [DataMember(EmitDefaultValue = false)] - public List Actions { get; set; } - - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - [DataMember(EmitDefaultValue = false)] - public string CustomSVG { get; set; } - - /** - * (optional) - * Style of the - */ - [DataMember(EmitDefaultValue = false)] - public CSSStyle Style { get; set; } - - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - [DataMember(EmitDefaultValue = false)] - public Dictionary UserData { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/AvailableSymbolModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/AvailableSymbolModel.cs deleted file mode 100644 index 9f93ade..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/AvailableSymbolModel.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class AvailableSymbolModel - { - [DataMember(EmitDefaultValue = false)] - public string Name { get; set; } - - [DataMember(EmitDefaultValue = false)] - public ImageModel Image { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double offset { get; set; } - - [DataMember(EmitDefaultValue = false)] - public bool isVertical { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string DisplayedText { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double Width { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double Height { get; set; } - - [DataMember(EmitDefaultValue = false)] - public PositionReferenceEnumModel PositionReference { get; set; } - - [DataMember(EmitDefaultValue = false)] - public AvailableContainerModel AssociatedContainer { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/CSSStyle.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/CSSStyle.cs deleted file mode 100644 index 0c23afe..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/CSSStyle.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class CSSStyle - { - [DataMember(EmitDefaultValue = false)] - public string stroke; - - [DataMember(EmitDefaultValue = false)] - public double? strokeOpacity; - - [DataMember(EmitDefaultValue = false)] - public double? strokeWidth; - - [DataMember(EmitDefaultValue = false)] - public string fill; - - [DataMember(EmitDefaultValue = false)] - public double? fillOpacity; - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Category.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Category.cs deleted file mode 100644 index aab857b..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Category.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class Category - { - [DataMember(EmitDefaultValue = false)] - public string Type { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string DisplayedText { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Configuration.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Configuration.cs deleted file mode 100644 index 8c156e5..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Configuration.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - - [DataContract] - public class Configuration - { - - public Configuration(AvailableContainerModel mainContainer) - { - MainContainer = mainContainer; - AvailableContainers = new List(); - AvailableSymbols = new List(); - Categories = new List(); - Patterns = new List(); - } - - [DataMember(EmitDefaultValue = false)] - public List AvailableContainers { get; set; } - - [DataMember(EmitDefaultValue = false)] - public List AvailableSymbols { get; set; } - - [DataMember(EmitDefaultValue = false)] - public List Categories { get; set; } - - [DataMember(EmitDefaultValue = false)] - public List Patterns { get; set; } - - [DataMember(EmitDefaultValue = false, IsRequired = true)] - public AvailableContainerModel MainContainer { get; set; } - - [DataMember(EmitDefaultValue = false)] - public APIConfiguration APIConfiguration { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/ContainerModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/ContainerModel.cs deleted file mode 100644 index 6864ed7..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/ContainerModel.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class ContainerModel - { - [DataMember(EmitDefaultValue = false)] - public List children; - - [DataMember(EmitDefaultValue = false)] - public ContainerProperties properties; - - [DataMember(EmitDefaultValue = false)] - public Dictionary userData; - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/ContainerProperties.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/ContainerProperties.cs deleted file mode 100644 index b329176..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/ContainerProperties.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System.Runtime.Serialization; -using System.Collections.Generic; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class ContainerProperties - { - /** id of the container */ - [DataMember(EmitDefaultValue = false)] - public string id; - - /** type matching the configuration on construction */ - [DataMember(EmitDefaultValue = false)] - public string type; - - /** id of the parent container (null when there is no parent) */ - [DataMember(EmitDefaultValue = false)] - public string parentId; - - /** id of the linked symbol ('' when there is no parent) */ - [DataMember(EmitDefaultValue = false)] - public string linkedSymbolId; - - /** Text displayed in the container */ - [DataMember(EmitDefaultValue = false)] - public string displayedText; - - /** orientation */ - [DataMember(EmitDefaultValue =false)] - public Orientation orientation; - - /** horizontal offset */ - [DataMember(EmitDefaultValue = false)] - public double x; - - /** vertical offset */ - [DataMember(EmitDefaultValue = false)] - public double y; - - /** margin */ - [DataMember(EmitDefaultValue = false)] - public Margin margin; - - /** width */ - [DataMember(EmitDefaultValue = false)] - public double width; - - /** height */ - [DataMember(EmitDefaultValue = false)] - public double height; - - /** - * Minimum width (min=1) - */ - [DataMember(EmitDefaultValue = false)] - public double minWidth; - - /** - * Maximum width - */ - [DataMember(EmitDefaultValue = false)] - public double maxWidth; - - /** - * Minimum height (min=1) - * Allows the container to set isRigidBody to false when it gets squeezed - * by an anchor - */ - [DataMember(EmitDefaultValue = false)] - public double minHeight; - - /** - * Maximum height - */ - [DataMember(EmitDefaultValue = false)] - public double maxHeight; - - - /** true if anchor, false otherwise */ - [DataMember(EmitDefaultValue = false)] - public bool isAnchor; - - /** true if flex, false otherwise */ - [DataMember(EmitDefaultValue = false)] - public bool isFlex; - - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - [DataMember(EmitDefaultValue = false)] - public PositionReferenceEnumModel positionReference; - - /** Hide the children in the treeview */ - [DataMember(EmitDefaultValue = false)] - public bool hideChildrenInTreeview; - - /** Dimension options */ - [DataMember(EmitDefaultValue = false)] - public Dimensions dimensionOptions; - - /** - * Warnings of a container - */ - [DataMember(EmitDefaultValue = false)] - public string warning; - - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - [DataMember(EmitDefaultValue = false)] - public string customSVG; - - /** - * (optional) - * Style of the - */ - [DataMember(EmitDefaultValue = false)] - public CSSStyle style; - - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - [DataMember(EmitDefaultValue = false)] - public Dictionary userData; - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/DimensionOptions.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/DimensionOptions.cs deleted file mode 100644 index 10c6542..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/DimensionOptions.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; - -namespace SVGLDLibs.Models -{ - - [DataContract] - public class DimensionOptions - { - - /** positions of the dimension */ - [DataMember(EmitDefaultValue = false)] - public Position[] positions; - - /** color */ - [DataMember(EmitDefaultValue = false)] - public string color; - - /** width */ - [DataMember(EmitDefaultValue = false)] - public double width; - - /** color */ - [DataMember(EmitDefaultValue = false)] - public string dashArray; - } -} diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Dimensions.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Dimensions.cs deleted file mode 100644 index dfdbcfe..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Dimensions.cs +++ /dev/null @@ -1,35 +0,0 @@ - -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class Dimensions - { - - /** if true, show the dimension of the container */ - [DataMember(EmitDefaultValue = false)] - public DimensionOptions selfDimensions; - - [DataMember(EmitDefaultValue = false)] - public DimensionOptions selfMarginsDimensions; - - /** if true show the overall dimensions of its children */ - [DataMember(EmitDefaultValue = false)] - public DimensionOptions childrenDimensions; - - /** - * if true, allows a parent dimension borrower to borrow its x coordinate - * as a reference point for a dimension - */ - [DataMember(EmitDefaultValue = false)] - public Orientation[] markPosition; - - /** - * if true, show a dimension from the edge of the container to end - * and insert dimensions marks at lift up children (see liftDimensionToBorrower) - */ - [DataMember(EmitDefaultValue = false)] - public DimensionOptions dimensionWithMarks; - } -} diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/EditorState.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/EditorState.cs deleted file mode 100644 index b25c7b4..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/EditorState.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class EditorState - { - - [DataMember(EmitDefaultValue = false)] - public List history { get; set; } - - [DataMember(EmitDefaultValue = false)] - public int historyCurrentStep { get; set; } - - [DataMember(EmitDefaultValue = false)] - public Configuration configuration { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/GetFeedbackRequest.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/GetFeedbackRequest.cs deleted file mode 100644 index db49263..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/GetFeedbackRequest.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class GetFeedbackRequest - { - [DataMember(EmitDefaultValue = false)] - public HistoryState ApplicationState { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/GetFeedbackResponse.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/GetFeedbackResponse.cs deleted file mode 100644 index 6897ca9..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/GetFeedbackResponse.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class GetFeedbackResponse - { - [DataMember(EmitDefaultValue = false)] - public List messages { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/HistoryState.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/HistoryState.cs deleted file mode 100644 index 07e1d94..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/HistoryState.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class HistoryState - { - [DataMember(EmitDefaultValue = false)] - public string lastAction; - - [DataMember(EmitDefaultValue = false)] - public string mainContainer; - - [DataMember(EmitDefaultValue = false)] - public Dictionary containers; - - [DataMember(EmitDefaultValue = false)] - public Dictionary typeCounters; - - [DataMember(EmitDefaultValue = false)] - public Dictionary symbols; - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/ImageModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/ImageModel.cs deleted file mode 100644 index 2dba4b2..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/ImageModel.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class ImageModel - { - [DataMember(EmitDefaultValue = false)] - public string Name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Base64Image { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Svg { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Margin.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Margin.cs deleted file mode 100644 index 431cfbd..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Margin.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class Margin - { - [DataMember(EmitDefaultValue = false)] - public double? left { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double? bottom { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double? top { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double? right { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Message.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Message.cs deleted file mode 100644 index ac4d5bd..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Message.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class Message - { - [DataMember(EmitDefaultValue = false)] - public string text { get; set; } - [DataMember(EmitDefaultValue = false)] - public MessageType type { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/MessageType.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/MessageType.cs deleted file mode 100644 index d16d3f0..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/MessageType.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public enum MessageType - { - [EnumMember] - Normal, - [EnumMember] - Success, - [EnumMember] - Warning, - [EnumMember] - Error - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Orientation.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Orientation.cs deleted file mode 100644 index c32ef03..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Orientation.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public enum Orientation - { - [EnumMember] - Horizontal, - [EnumMember] - Vertical - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Pattern.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Pattern.cs deleted file mode 100644 index d9de689..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Pattern.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class Pattern - { - - public Pattern() - { - children = new List(); - } - - [DataMember(EmitDefaultValue = false)] - public string id { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string text { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string wrapper { get; set; } - - [DataMember(EmitDefaultValue = true, IsRequired = true)] - public List children { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/PointModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/PointModel.cs deleted file mode 100644 index 4291204..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/PointModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class PointModel - { - [DataMember(EmitDefaultValue = false)] - public double x { get; set; } - [DataMember(EmitDefaultValue = false)] - public double y { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/Position.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/Position.cs deleted file mode 100644 index 995965b..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/Position.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public enum Position - { - [EnumMember] - Left, - [EnumMember] - Down, - [EnumMember] - Up, - [EnumMember] - Right - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/PositionReferenceEnumModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/PositionReferenceEnumModel.cs deleted file mode 100644 index 9c3694e..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/PositionReferenceEnumModel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public enum PositionReferenceEnumModel - { - [EnumMember] - TopLeft, - [EnumMember] - TopCenter, - [EnumMember] - TopRight, - [EnumMember] - CenterLeft, - [EnumMember] - CenterCenter, - [EnumMember] - CenterRight, - [EnumMember] - BottomLeft, - [EnumMember] - BottomCenter, - [EnumMember] - BottomRight - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/SetContainerListRequest.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/SetContainerListRequest.cs deleted file mode 100644 index f038d24..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/SetContainerListRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class SetContainerListRequest - { - [DataMember(EmitDefaultValue = false)] - public ActionContainerModel Action { get; set; } - - [DataMember(EmitDefaultValue = false)] - public ContainerModel Container { get; set; } - - [DataMember(EmitDefaultValue = false)] - public ContainerModel PreviousContainer { get; set; } - - [DataMember(EmitDefaultValue = false)] - public ContainerModel NextContainer { get; set; } - - [DataMember(EmitDefaultValue = false)] - public HistoryState ApplicationState { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/SetContainerListResponse.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/SetContainerListResponse.cs deleted file mode 100644 index f4b1139..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/SetContainerListResponse.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class SetContainerListResponse - { - [DataMember(EmitDefaultValue = false)] - public List Containers { get; set; } - - [DataMember(EmitDefaultValue = false)] - public AddingBehaviorEnumModel AddingBehavior { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/Models/SymbolModel.cs b/csharp/SVGLDLibs/SVGLDLibs/Models/SymbolModel.cs deleted file mode 100644 index 1fa3d3c..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/Models/SymbolModel.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Runtime.Serialization; -using System.Collections.Generic; - -namespace SVGLDLibs.Models -{ - [DataContract] - public class SymbolModel - { - [DataMember(EmitDefaultValue = false)] - public string id { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string type { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string displayedText { get; set; } - - [DataMember(EmitDefaultValue = false)] - public AvailableSymbolModel config { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double offset { get; set; } - - [DataMember(EmitDefaultValue = false)] - public bool isVertical { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double width { get; set; } - - [DataMember(EmitDefaultValue = false)] - public double height { get; set; } - - [DataMember(EmitDefaultValue = false)] - public List linkedContainers { get; set; } - - [DataMember(EmitDefaultValue = false)] - public bool showDimension { get; set; } - } -} \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDLibs/SVGLDLibs.csproj b/csharp/SVGLDLibs/SVGLDLibs/SVGLDLibs.csproj deleted file mode 100644 index 1f5be41..0000000 --- a/csharp/SVGLDLibs/SVGLDLibs/SVGLDLibs.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net472 - disable - disable - - - diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/Controllers/SVGLDController.cs b/csharp/SVGLDLibs/SVGLDWebAPI/Controllers/SVGLDController.cs deleted file mode 100644 index e6031aa..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/Controllers/SVGLDController.cs +++ /dev/null @@ -1,155 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using SVGLDLibs.Models; - -namespace SVGLDWebAPI.Controllers; - - -[ApiController] -[Route("[controller]/[Action]")] -public class SVGLDController : ControllerBase -{ - [HttpPost(Name = nameof(SVGLDLibs.Models.ActionContainerModel))] - public bool ActionContainerModel(ActionContainerModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.AddingBehaviorEnumModel))] - public bool AddingBehaviorEnumModel(AddingBehaviorEnumModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.HistoryState))] - public bool ApplicationStateModel(HistoryState model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.AvailableContainerModel))] - public bool AvailableContainerModel(AvailableContainerModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.AvailableSymbolModel))] - public bool AvailableSymbolModel(AvailableSymbolModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.Category))] - public bool Category(Category model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.Configuration))] - public bool Configuration(Configuration model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.ContainerModel))] - public bool ContainerModel(ContainerModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.ContainerProperties))] - public bool ContainerProperties(ContainerProperties model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.CSSStyle))] - public bool CSSStyle(CSSStyle model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.GetFeedbackRequest))] - public bool GetFeedbackRequest(GetFeedbackRequest model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.GetFeedbackResponse))] - public bool GetFeedbackResponse(GetFeedbackResponse model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.ImageModel))] - public bool ImageModel(ImageModel model) - { - return true; - } - - - [HttpPost(Name = nameof(SVGLDLibs.Models.Margin))] - public bool Margin(Margin model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.Message))] - public bool Message(Message model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.MessageType))] - public bool MessageType(MessageType model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.Orientation))] - public bool Orientation(Orientation model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.Pattern))] - public bool Pattern(Pattern model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.PointModel))] - public bool PointModel(PointModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.Position))] - public bool Position(Position model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.PositionReferenceEnumModel))] - public bool PositionReferenceEnumModel(PositionReferenceEnumModel model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.SetContainerListRequest))] - public bool SetContainerListRequest(SetContainerListRequest model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.SetContainerListResponse))] - public bool SetContainerListResponse(SetContainerListResponse model) - { - return true; - } - - [HttpPost(Name = nameof(SVGLDLibs.Models.SymbolModel))] - public bool SymbolModel(SymbolModel model) - { - return true; - } -} diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/Program.cs b/csharp/SVGLDLibs/SVGLDWebAPI/Program.cs deleted file mode 100644 index 55fb432..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/Program.cs +++ /dev/null @@ -1,37 +0,0 @@ -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. - -builder.Services.AddControllers(); - -const string allowOrigin = "allowOrigin"; -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddCors(options => -{ - options.AddPolicy(name: allowOrigin, - policy => - { - policy.WithOrigins("http://localhost:3000"); - }); -}); -builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); - -var app = builder.Build(); - -// Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) -{ - app.UseSwagger(); - app.UseSwaggerUI(); -} - -app.UseCors(allowOrigin); - -// app.UseHttpsRedirection(); - -app.UseAuthorization(); - -app.MapControllers(); - -app.Run(); \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/Properties/launchSettings.json b/csharp/SVGLDLibs/SVGLDWebAPI/Properties/launchSettings.json deleted file mode 100644 index 0afd7d1..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:2891", - "sslPort": 44305 - } - }, - "profiles": { - "SVGLDWebAPI": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "swagger", - "applicationUrl": "https://localhost:7280;http://localhost:5209", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/README.md b/csharp/SVGLDLibs/SVGLDWebAPI/README.md deleted file mode 100644 index cb2ccd1..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# SVGLDWebAPI - -This project tests the serialization of C# models of SVGLayoutDesigner -by creating an entry point for each model. - -This project must be used in pair with the api.test.tsx from SVGLayoutDesigner nodejs project. - -api.test.tsx will serialize each of its models accordingly to its types -and POST to each corresponding entry point. - -When a test is succeeding `true` will be return. - -When a test is failing `400 Bad Request` will be returned. - -This project does not test any logic in the models. \ No newline at end of file diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj b/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj deleted file mode 100644 index f993247..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net6.0 - enable - enable - - - - - - - - - - - diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/appsettings.Development.json b/csharp/SVGLDLibs/SVGLDWebAPI/appsettings.Development.json deleted file mode 100644 index 0c208ae..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/csharp/SVGLDLibs/SVGLDWebAPI/appsettings.json b/csharp/SVGLDLibs/SVGLDWebAPI/appsettings.json deleted file mode 100644 index 10f68b8..0000000 --- a/csharp/SVGLDLibs/SVGLDWebAPI/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} diff --git a/docs/#Project/Home.md b/docs/#Project/Home.md deleted file mode 100644 index 38836f7..0000000 --- a/docs/#Project/Home.md +++ /dev/null @@ -1,23 +0,0 @@ - -Bienvenue à la documentation du projet de SVGLayoutDesigner. - -Ici se trouve les documents qui explique en détail l'implémentation -des fonctionnalités du projet. - -Sélectionnez un lien ou un fichier pour lire la documentation - -Liens : - -- [Structure du projet](Pages/Project_Structure.md) -- [Structure des composants](Pages/ComponentStructure.drawio) (nécessite diagrams.net) -- [Dépendences du projet](Pages/Dependencies.md) -- [Structure de données des conteneurs](Pages/DataStructure.md) -- [Système de comportement](Pages/Behaviors.md) -- [Cycle de vie de l'application](Pages/Application.md) -- [Implémentation du menu contextuel](Pages/ContextMenu.md) -- [Implémentation du système de cote](Pages/SVGLD_Cotes.pdf) -- [Web workers](Pages/WebWorkers.md) (pdf) -- [Traductions](Pages/Translations.drawio) (nécessite diagrams.net) -- [Méthode de release](../../RELEASING.md) -- [Système de CI/CD](Pages/Behaviors.md) -- [Mise en place du SmartComponent sur Modeler](Pages/SmartComponent.md) diff --git a/docs/#Project/Pages/Application.md b/docs/#Project/Pages/Application.md deleted file mode 100644 index cb731f3..0000000 --- a/docs/#Project/Pages/Application.md +++ /dev/null @@ -1,179 +0,0 @@ -# Cycle de vie de l'application - -# Menu principal - -Lorsque l'on lance l'application pour la première fois, -le premier composant qui s'affiche est `App.tsx`. - -En fonction de la valeur de `FAST_BOOT`, -il peut soit afficher un menu principal (composant `MainMenu`) si `FAST_BOOT=false` -ou soit afficher l'editeur directement (composant `Editor`). - -Lorsque le menu principal est affiché il y a 3 états : *Main*, *Load* ou *Loading*. - -Lorsqu'on est dans Main, nous avons les deux boutons principaux affiché : *Start from scratch* ou *Load* - -## Start from scratch - -Lorsque l'on clique sur *Start from scratch*, -l'action qui se fait est de charger une configuration depuis l'API -(ou d'utiliser une configuration préchargée via un event custom). -On passe à l'état *Loading*. - -Après chargement, `isLoaded` est `true` et le composant `Editor` est affiché. - -## Load - -Quand on veut charger un json, on clique sur *Load* et l'état passe à *Load*. - -Ici, le composant `MainMenu` affichera un bouton pour charger un fichier. -Charger le fichier change l'état de la configuration dans `App` -et active `isLoaded` qui enfin affiche `Editor`. - - -# Editor - -Lorsque `Editor` est affiché, -il reçoit en props la configuration que l'on a chargé au menu principal. - -Il reçoit également un historique par défaut pour avoir au moins quelque chose d'affiché. - -Il reçoit `root` un element HTML où l'on insert SVGLayoutDesigner par `main.tsx`. -`root` est utilisé pour lui donner des events qui seront utilisé pour communiquer avec le SmartComponent. - -Plusieurs sous-composant sont affichés ensuite. -Vous pouvez en savoir plus sur [la structure de composants](./ComponentStructure.drawio) -avec dragrams.net. - - -# Save and load - -Pour enregistrer le travail fait, il existe plusieurs méthode de le faire. - -## SmartComponent - -La première, en passant par le SmartComponent `svg-layout-designer.ts`, est de stringifier l'état de l'éditeur -et de le sauvegarder quelque part. - -On utilise `GetEditorAsString` pour obtenir une version stringifié du projet -que l'on peut ensuite sauvegarder dans un fichier, bdd ou autre. -On peut également utiliser GetEditorState et le sauvegarder tel quel dans le JS -mais on ne peut pas le stringifier à un object json ne peut pas avoir deux références -(sauf si on a le code source de saveload.ts, -utilisant un *replacer* éliminant les références circulaires, -voir [JSON par interaction](#json-par-interaction). - -Pour charger l'état de l'éditeur, il faut en premier le parser avec `JSON.parse` (pas de soucis à ce niveau là); -Enfin, on peut ensuite utiliser `LoadEditor` du SmartComponent pour charger l'état. - -`LoadEditor` est une macro de trois autres appels : -- `ReviveEditorState` qui fait revivre tous les doublons de références -- `SetEditor` qui charge la configuration de l'application -- `SetHistory` qui charge l'historique de l'editeur - -La raison que l'on utilise `SetHistory` en plus de `SetEditor` est parce que, -`SetEditor` ne fait que charger une configuration par défaut de `App.tsx` -(exemple: lorsque l'on crée un conteneur, l'éditeur va lire cette configuration). -Si l'application est déjà chargée, c'est-à-dire que *isLoaded* de `App` est `true`, -alors l'application ne va pas relire `history` et `historyCurrentStep` et l'application n'aura pas *chargé*. -C'est pourquoi on a besoin de `SetHistory` pour charger l'état courant dans `Editor.tsx` (à l'opposé de `App.tsx`). - -Note: Pour rappel, *App* n'est qu'un menu principal. -Comme dans un menu principal de jeu vidéo, -écraser une sauvegarde ne fait pas charger la sauvegarde. -C'est en chargeant la sauvegarde en cours de jeu ou dans le menu principal, -que la partie change. - - -## JSON par interaction - -On peut charger un fichier JSON manuellement. - -Pour cela il faut que `FAST_BOOT` de `default.ts` soit désactivé. - -Dans l'éditeur, on peut exporter une configuration par fichier JSON grâce au composant `Settings.tsx`. -Cette sauvegarde, comme pour sauvegarder avec le SmartComponent, utilise `JSON.stringify`. -Et donc utilise un *replacer* pour supprimer les dépendances circulaires. - -Ce *replacer* se trouve dans `worker.js` mais -un fallback est également donné dans `saveload.ts` -dans le cas où la fonctionnalité de Web Worker n'est pas supportée par le navigateur web. -Pour corriger des bugs sur la sauvegarde, il faudra donc modifier ces deux fichiers. - -Décrivons rapidement ce qu'elle fait : - -```typescript -export function GetCircularReplacer(): (key: any, value: object | Map | null) => object | null | undefined { - return (key: any, value: object | null) => { - if (key === 'parent') { - return; - } - - if (key === 'containers') { - return Array.from((value as Map).entries()); - } - - if (key === 'symbols') { - return Array.from((value as Map).entries()); - } - - if (key === 'linkedContainers') { - return Array.from(value as Set); - } - - return value; - }; -} -``` - -Nous faisons les actions suivantes pour supprimer les types non supportés par le stringify : -- nous transformons les *Map* `containers` et `symbols` en tableau de vecteur clés-valeurs -- nous transformons les *Set* `linkedContainers` en tableau de clés. - -Nous supprimons toutes les références de `parent` qui sont déjà référencés dans `containers`. - -Enfin, nous retournons `value` si tout est bon. - -Normalement, le JSON retourné ressemble à l'objet qu'était EditorState -mais sans les références de parent et avec des tableaux partout. - - -Pour le charger, il faut revenir au menu principal et -cliquer sur Load pour charger avec l'input. - -Charger le fichier JSON, utilisera ce qu'on appelle un *reviver* -qui s'occupe de recréer les types non supportés par JSON et de remettre les références dupliquées. - -Ce reviver se trouve dans `saveload.ts` avec la fonction `Revive()`. - -`Revive` change la valeur de `historyCurrentStep` avec de faire revivre l'historique - -`ReviveHistory` itère sur chaque état de `history` pour les revivre. - -`ReviveState` fait revivre en premier les *Map* et les *Set*. -Ensuite, il va itérer sur tous les conteneurs existants, -pour remettre leur parent. - -Comme vous pouvez vous en douter cette algorithme coûte O(n) juste pour revivre les parents. -avec *n* le nombre total de conteneurs sur toute la durée de vie de l'application. -Surtout qu'il n'est plus très utile depuis que tous les conteneurs sont dans une hash *Map* -(et que donc parent est accessible avec un coût O(1)). - -On pourrait juste utiliser `GetContainerById` au lieu de la référence. - - -## JSON par requête GET HTTP - -Pour charger un JSON via HTTP GET, -il faut que le serveur web distant autorise notre domaine -dans le méchanisme *cross-origin resource sharing (CORS)* -et qu'il nous autorise à faire des requêtes *GET*. - -Après cela pour charger le JSON, -il faut que l'url de SVGLayoutDesigner soit paramétrée avec l'url de la resource : - -``` -http://localhost:5173/?state=http://other-server.com/state.json -``` - -Après cela, l'éditeur chargera directement le fichier. diff --git a/docs/#Project/Pages/Behaviors.md b/docs/#Project/Pages/Behaviors.md deleted file mode 100644 index 47ce155..0000000 --- a/docs/#Project/Pages/Behaviors.md +++ /dev/null @@ -1,449 +0,0 @@ -> TL;DR -> Behaviors.ts définis les comportements qui sont utilisés. - -> Actuellement sont activés par défaut : -> - Corps rigide (simple) : Est restraint dans le parent -> - Ancrage : Impose la priorité de position et de taille -> - Flex : se redimensionne automatiquement - -> Désactivés: -> - Corps rigide (complet) : Est restraint par les parents et par ses voisins (fonctionne mais pas intuitif) -> - Poussé : quand un conteneur est ajouté au bout de la bande filante, pousse tous les conteneurs à sa gauche (fonctionne mais pas intuitif) -> - Swap : échange de place avec un autre conteneur lorsqu'ils sont superposés (buggué ne pas utiliser) - -# Comportements des conteneurs - -Ce document traite des comportements spéciaux et uniques qu'un conteneur peut avoir. - -Chaque comportement est documenté dans une section avec 3 sous-sections : -- Règles -- Applications -- Références de code et algorithmes - - -# Comportement par défaut - -Le comportement par défaut est le panneau flottant. Il peut se déplacer et se redimensionner mais pas ses frères et soeurs. - - -## Règles - -Le comportement par défaut n'a pas de règles particulières qui s'appliquent à lui-même. - -Cependant, il a une règle commune pour tout comportement qui s'applique à ses enfants. - -Il s'agit d'appliquer les comportements spéciaux de ses enfants (rigide ou ancré). - - -## Applications - -The default behavior is important to have a good user experience when adding object. - -The golden rule is to never oppose the user which is why we don't want to applies rigid body by default -as it can block the addition of container. -Allowing freedom of movement can help for better precision if not the same as the rigid property. - -An example would be trying to overlap an element in order to use it as a layer. - - -## Références de code et algorithmes - -Dans le module `ContainerOperations.ts` dans les fonctions suivantes : -- `OnPropertyChange()` - -et dans le module `AddContainer.ts` dans `AddContainer()`, - -il utilise la fonction `ApplyBehaviors` du module `Behaviors.ts` pour appliquer les comportements spéciaux de ses enfants. - - - -# Comportement du corps rigide - -Le comportement de corps rigide est un comportement spécial -qui permet de restreindre un conteneur dans un espace donné. - - -## Règles - -Les principales règles sont : -- Le conteneur rigide doit être maintenu à l'intérieur de son conteneur parent. -- Le conteneur rigide doit se trouver à l'intérieur d'un espace non alloué de son parent. C'est-à-dire qu'il ne peut pas se superposer à un autre frère ou sœur. - - -## Applications - -Ce comportement a de nombreuses applications. Principalement sur les recalculs. - -Vous pouvez vouloir redimensionner/déplacer rapidement et être certain qu'il ne déborde pas de son parent. - -Vous pouvez vouloir redimensionner son parent et faire en sorte qu'il redimensionne ses enfants. - -Vous pouvez vouloir que les frères et sœurs interagissent les uns avec les autres. - - -## Références de code et algorithmes - -Son algorithme peut être un peu compliqué en raison des nombreux cas d'utilisation. - - -### Première règle - -Commençons par la première règle : *Le conteneur rigide doit être maintenu à l'intérieur de son conteneur parent*. - -Dans le fichier `RigidBodyBehaviors.ts`, voyez `constraintBodyInsideParent()` et `constraintBodyInsideSpace()`. - -Comme vous pouvez le voir, `constraintBodyInsideParent()` n'est qu'une enveloppe pour `constraintBodyInsideSpace()`, donc étudions juste cette dernière fonction. - -C'est un problème simple de deux rectangles. - -Afin de restreindre l'enfant à son parent, -nous devons d'abord savoir si l'enfant n'est pas plus grand que son parent. - -Si c'est le cas, il suffit de placer l'enfant au début et de lui faire prendre la taille complète de son parent. - -Si ce n'est pas le cas, nous devons vérifier si l'enfant est hors limites (en dehors de son parent). Et si c'est le cas, nous devons le ramener à l'intérieur. - -Pour vérifier s'il est plus grand que son parent, il suffit de comparer leurs tailles : `childWidth > parentWidth` et verticalement `childHeight > parentHeight`. - -Si c'est faux, nous devons vérifier la sortie de l'objet, vérifier pour x (et y) : `child.x < parent.x` pour le côté gauche ou `child.x + child.width > parent.x + parent.width` pour le côté droit. Nous ne voulons pas non plus de chevauchement, c'est pourquoi nous utilisons `child.width`. - -La condition est également équivalente à `child.x > parent.x + parent.width - child.width` qui pourrait être plus logique puisque l'espace requis doit être plus petit à cause de la taille de l'enfant. - - -Dans mon algorithme, j'ai décidé de les placer près du bord où ils sont sortis de la limite : - -``` -left oob: child.x = parent.x -right oob: child.x = parent.x + parent.width - child.width -``` - -Pseudo-code : - -```c -constraintBodyInsideSpace(child, parent) { - if (child is bigger than parent) { - if (child is larger) { - set child x and width; - } - - if (child is taller) { - set child y and height; - } - } else { - if (child is to the left of parent) { - set child x at the left side of parent - } - - if (child is to the right of parent) { - set child x at the right side of parent - } - - if (child is higher than parent) { - set child y at the top of parent - } - - if (child is lower than parent) { - set child y at the bottom of parent - } - } -} -``` - - -### Deuxième règle - -La deuxième règle est la plus importante et la plus compliquée car elle doit interagir avec ses frères et sœurs. - -*Le conteneur rigide doit se trouver dans un espace non alloué de son parent. Ce qui signifie qu'il ne peut pas chevaucher un autre frère ou une autre soeur. - -Définissons d'abord ce qu'est un *espace* : un *espace* est la largeur d'un conteneur. Ce qui signifie donc que la règle ne s'applique que sur la vue horizontale. Pour simplifier la chose, cela signifie également que nous ne devons travailler que sur une seule dimension. - -Pour résoudre ce problème, comme pour le parent, nous pourrions utiliser la détection de collision entre ses frères et sœurs. Cependant, cela pourrait être très lent car le pire scénario est un produit cartésien : O(n2). En effet, pour chaque conteneur, nous devons rechercher les autres conteneurs qui entrent en collision avec lui. Lorsqu'il entre en collision, nous devons le déplacer et recommencer la recherche. - -Rappelez-vous, cette règle est appliquée chaque fois que vous changez une propriété du conteneur, c'est le *lag*. Nous ne pouvons pas nous permettre des boucles inefficaces. - -Utilisons un "système d'espace" qui a des "conteneurs" qui ne peuvent pas "se chevaucher". - -La mémoire. - -La mémoire, la RAM, l'espace du disque dur, gèrent leur espace par un système d'adresses et de morceaux d'espaces (mots, octets...). Dans notre cas, nous n'avons pas de morceaux d'espaces, mais des nombres flottants (qui peuvent être un casse-tête à cause des cas limites). - -Ce système est particulièrement utile car il se souvient de l'espace utilisé après chaque itération d'allocation, ce qui signifie que nous pouvons savoir exactement quand il n'y a plus d'espace à l'intérieur du parent et quand un conteneur doit se redimensionner afin de tenir à l'intérieur. - -Bien, commençons l'algorithme. Voir `constraintBodyInsideUnallocatedWidth()`, `getAvailableWidths()` et `getAvailableWidthsTwoLines()` dans `RigidBodyBehaviors.ts` pour les références de l'implémentation. - -Nous avons initialement tout l'espace disponible : laissez `space` être cet espace disponible dans le parent. - -`space` est un pointeur, donc au début il a `0` à son adresse de pointeur et `parent.width` comme espace. - -Pour simplifier l'algorithme lors de l'ajout d'un conteneur, comparons cela à manger une bûche de Noël. - -Comme pour le gâteau, il faut le couper et en prendre une part. - -Il y a 5 façons possibles de le couper : -- Ne pas manger le gâteau (on préfère peut-être manger un autre gâteau/une autre part) -- Manger le gâteau entier -- Couper le gâteau à gauche -- Couper le gâteau sur le côté droit -- Couper le gâteau au milieu - -Ne pas couper le gâteau signifie rendre le gâteau entier tel quel. - -Manger le gâteau entier, c'est ne rien rendre. - -Couper à gauche ou à droite signifie laisser une partie. - -Couper au milieu signifie laisser deux parts. - -Après avoir coupé le gâteau, *pendant* qu'il en reste encore, on peut continuer l'opération. (c'est une boucle *pour* dans le code cependant pour des raisons de syntaxe) - -Cependant, après avoir servi les frères et sœurs, nous pouvons remarquer qu'il n'en reste plus pour nous. Nous nous mettons en colère, nous *jetons* une crise de colère. - -```c -// si vous n'avez pas compris la blague -if (there no more cake) { - throw tantrum -} -``` - -Attends, il y a vraiment du gâteau ! - -Mais il est laissé en plusieurs morceaux, nous allons juste prendre le plus proche qui correspond à notre faim. - -S'il y en a un qui correspond à notre faim, prenons-le ! - -Pourtant ! Il y a des gâteaux mais aucun ne correspond à notre faim. Mais nous avons une acceptation *minimale*, soyons humbles, nous prendrons quand même la petite part. D'ailleurs, prendre plusieurs parts serait mauvais pour nous. Néanmoins, si mon acceptation *minimale* devait être supérieure à ce qui reste, je lancerais un *avertissement* pour la prochaine fois. - - -Traduisons cela en pseudo-code. - -Commençons par obtenir les espaces disponibles : - -```typescript -getAvailableSpaces(parent, me) { - spaces = [{ x: 0, size: parent.width }] - - let i = 0 - while (spaces.length > 0 and i < parent.length) { - let sibling = parent.children[i]; - - if (sibling is me or is neither rigid nor is anchor) { - i++; - continue; - } - - let spacesLeft be an array - - foreach(space in spaces) { - spacesLeftOfSpace = allocate(sibling, space); - spacesLeft.concat(spacesLeftOfSpace) - } - - spaces = spacesLeft - i++ - } - - return spaces; -} -``` - -Pour allouer : - -```typescript -allocate(sibling, space) { - if (sibling is not overlapping the space) { - return [space] - } - - if (sibling overlap the space entirely) { - return [] - } - - if (sibling overlap at the left side) { - return [{ - x: right side of sibling - size: right side of space - right side of sibling // "cut the left part" - }] - } - - if (sibling overlap at the right side) { - return [{ - x: left side of space - size: leftSide of sibling - leftSide of space - }] - } - - // if (sibling overlap in the middle) - return [ - { - x: left side of space - size: left side of sibling - left side of space - }, - { - x: right side of sibling - size: right side of space - right side of sibling - } - ] -} -``` - -Enfin pour l'appelant : - -```typescript -constraintBodyInsideUnallocatedWidth(parent, container) { - spaces = getAvailableSpaces(parent, container) - if (there is no more spaces) { - throw error - } - - spaces = sort spaces by closest from the middle of container - - spaceFound = spaces.find(space that fit container.space) - - if (no spaceFound) { - - spaceFound = spaces.find(space that fit container.minimumSpace) - - if (no spaceFound) { - show warning - return container - } - - set container x and width to make it fit - return container; - } - - constraintBodyInsideSpace(container, spaceFound) -} -``` - -Cet algorithme est génial, mais certains problèmes subsistent : -- Trouver le plus proche prend O(nlogn), n étant le nombre d'espaces. Ce n'est généralement pas mauvais puisque l'objectif du corps rigide est de **remplir** l'espace. Mais il y a toujours un très mauvais cas de figure. -- Il y a 2 recherches pour l'espace, même problème mais le tri précédent aide à le rendre plus rapide pour les meilleurs cas. - - - -# Comportement d'ancrage - -Le comportement d'ancrage permet à un conteneur d'être prioritaire sur ses frères et sœurs. - - -## Règles - -Il a les règles suivantes : - - Le conteneur ne peut pas être déplacé par un autre conteneur frère ou sœur rigide. - - Le conteneur ne peut pas être redimensionné par un autre conteneur de la même famille. - - Le conteneur ne peut pas chevaucher un autre conteneur rigide de la même famille : - - les conteneurs qui se chevauchent sont déplacés vers l'espace/largeur disponible le plus proche - - ou redimensionnés lorsqu'il n'y a plus d'autre espace disponible que le leur - - ou perdent leurs propriétés de corps rigide lorsqu'il n'y a absolument plus d'espace disponible (même pas le leur). - - -## Applications - -Le gain de priorité permet de s'assurer qu'un objet rigide ne bougera pas, quoi qu'il arrive, et qu'il bougera absolument, peu importe ce qui se trouve sous lui. - - -## Références de code et algorithmes - -Bien qu'il y ait plusieurs règles appliquées à ce comportement, la plupart d'entre elles ne sont que des conditions. - -Ces trois règles : - - Le conteneur ne peut pas être déplacé par d'autres conteneurs frères et sœurs rigides. - - Le conteneur ne peut pas être redimensionné par un autre conteneur de la même famille. - - Il ne peut pas chevaucher un autre conteneur rigide de la même famille. - -Il peut être traduit en un seul : "Le conteneur est un espace alloué, donc tout conteneur en contact se déplacera ou sera redimensionné". - -Ce qui signifie que l'application des propriétés du corps rigide du frère ou de la sœur appliquera également cette règle. La différence entre le comportement par défaut et le comportement d'ancrage est que le conteneur d'ancrage sera pris en compte lors du calcul de l'espace disponible. - -Vous pouvez considérer le conteneur par défaut comme un panneau flottant et le conteneur d'ancrage comme un mur. Vous pouvez passer sous le panneau flottant mais pas par-dessus le mur. - -Pour optimiser l'algorithme, il suffit de trouver les frères et sœurs qui se chevauchent puisque l'ancre n'est pas appliquée à ceux qui ne sont pas en collision. - -Pseudo-code : - -```c# -ImposePosition(container) { - let rigidBodies be the rigid siblings that are not anchor - let overlappingRigidBodies be the overlapping rigid siblings of rigidBodies - - foreach(overlappingRigidBody of overlappingRigidBodies) { - constraintBodyInsideUnallocatedWidth(overlappingRigidBody) - } -} -``` - -De plus, nous devons modifier `getAvailableSpaces()` pour qu'il prenne en compte les conteneurs d'ancrage. - - -# Le comportement Flex - -Le comportement flex est un comportement qui modifie à la fois la position et la taille d'un conteneur tout en interagissant avec ses frères et sœurs. - - -## Application - -Le comportement flex est utile pour le redimensionnement automatique d'un conteneur en fonction de son parent et de ses frères et sœurs. - - -## Références de code et algorithmes - -Tout d'abord, nous devons déterminer ce qu'est un espace flexible. Un espace flexible est la zone située entre deux objets d'ancrage, un objet d'ancrage pouvant être un conteneur ancré ou les bords du conteneur parent. - -L'algorithme pour trouver un espace flexible est d'itérer sur les conteneurs et de créer un groupe à chaque fois qu'une ancre est trouvée (voir `GetFlexibleGroups`). - -Ensuite, pour appliquer le flex dans ces groupes, il y a trois scénarios principaux : -- Il n'y a pas assez d'espace même si l'on comprime tous les conteneurs à leur largeur minimale. -- Il y a suffisamment d'espace pour que tous les conteneurs aient la même taille. -- Il n'y a pas assez d'espace pour que tous les conteneurs aient la même taille, mais nous pouvons les comprimer. - -Dans le premier scénario, il suffit de renvoyer une erreur. - -Dans le second scénario, nous devons changer la taille de chaque conteneur pour qu'ils aient la même largeur. Ainsi, `wantedWidth = sum(space_width) / n`. La position sera alors `containerIndex * wantedWidth`. - -Enfin, dans le troisième scénario, il existe plusieurs façons de procéder. Nous pourrions simplement appliquer le comportement de poussée tout en redimensionnant un par un chaque conteneur jusqu'à ce qu'ils s'adaptent, mais cela peut ne pas avoir de solution et coûtera un total de O(n2) de complexité. - -L'autre moyen est d'utiliser la programmation linéaire puisque nous pouvons traduire ce problème comme un programme linéaire : la fonction objectif serait de maximiser la largeur de tous les conteneurs sans déborder du conteneur parent `max sum(width_i) <= wantedWidth`. Les inéquations supplémentaires sont les contraintes de largeur minimale et maximale. - -L'algorithme que nous allons utiliser est l'algorithme du simplexe. Il s'agit d'un algorithme populaire dans le domaine de l'optimisation mathématique. - - - -# Comportement de poussée - -Lorsqu'on a un conteneur à droite et qu'on en ajoute un nouveau à sa droite, on pousse ce conteneur à gauche s'il y a assez de place. - - -## Application - -Permet d'ajouter un nouveau conteneur sans empiéter sur les conteneurs existants lorsqu'il y a suffisamment d'espace à leur gauche. - - -## Références de code et algorithmes - -Afin de pousser, nous devons trouver les trous à la gauche du nouveau conteneur. Lorsque nous trouvons un trou, nous devons pousser le conteneur à la droite du trou jusqu'à ce qu'il n'y ait plus de place. - -Pour trouver un trou, nous devons itérer par paire (deux par deux) de la droite vers la gauche. - -Pour pousser le conteneur de droite, nous pouvons simplement soustraire sa position de la taille du trou. - -Lorsque l'espace restant est égal à 0, nous pouvons arrêter de pousser. - -Comme vous pouvez le constater, cet algorithme est très lent et peut coûter jusqu'à O(n2). Et comme les calculs se chevauchent, il est également possible qu'en raison de la précision de la virgule flottante, il reste un espace minuscule. - - -# Comportement de swap - -Lorsque deux conteneurs sont en collision, la position des deux conteneurs est permutée. - - -## Application - -Lorsqu'il n'y a plus de place et que le corps rigide est activé, pour déplacer un conteneur dans la ligne, nous pouvons permuter deux conteneurs en augmentant x. - - -## Références de code et algorithmes - -Le code pour ce comportement est très simple : -- Lorsque deux conteneurs se chevauchent, on permute leur position. \ No newline at end of file diff --git a/docs/#Project/Pages/ComponentStructure.drawio b/docs/#Project/Pages/ComponentStructure.drawio deleted file mode 100644 index 9d3c594..0000000 --- a/docs/#Project/Pages/ComponentStructure.drawio +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a11fc5b268366176f1c42af46e08ba368dbbf97e6a1f687f97643f2868508640 -size 23871 diff --git a/docs/#Project/Pages/ContextMenu.md b/docs/#Project/Pages/ContextMenu.md deleted file mode 100644 index 2e5420b..0000000 --- a/docs/#Project/Pages/ContextMenu.md +++ /dev/null @@ -1,55 +0,0 @@ -> TL;DR: Menu.tsx est le composant qui affiche et qui traite l'event contextmenu sur la page -> InitActions de Editor.tsx prépare le modèle pour Menu.tsx -> ContextMenuActions définient les actions de l'API - -# Context Menu - -Ce document présente comment le menu contextuel est implémenté. - - -# Event listener - -Pour implémenter le menu contextuel, il faut en premier ajouter un event listener sur `contextmenu`. - -Cela se fait dans le composant `Menu.tsx` via la fonction `UseMouseEvents()`. - -Elle équipe plusieurs events sur la page en plus de `contextmenu` afin de fermer correctement lorsque l'on clique ailleurs. - -Il n'existe donc qu'un seul menu contextuel pour toute la page. - - -# Affichage du contenu - -On a vu que `Menu.tsx` s'occupe de traiter l'event `contextmenu`. Regardons maintenant comment elle affiche le menu. - -Ce composant utilise une hashmap `actions: Map` pour lire les différentes actions possible, la clé servant d'identifiant et de pattern. - -En effet, la fonction `AddClassSpecificActions`, obtenant le composant html lit les *classes* et vérifie s'il est présent dans le dictionnaire avec `props.actions.get(className)`. - -S'il est présent, alors on itère sur les différentes actions possible pour cette classe pour ajouter des `MenuItem` représentant une ligne du menu contextuel. Chaque `MenuItem` possède un fonction qui sera exécutée lorsque la ligne est cliquée. Il possède également un texte, un titre qui sera affiché si le curseur survole la ligne, et, optionnellement, un raccourci qui sera affiché à droite de la ligne. - -En plus des actions de classes, il y a aussi des actions universelles comme le `undo` ou `redo` qui sont affichées n'importe où on clique. Celle-ci ont pour id `''`, une chaine de caractères vide. On itère sur cette liste d'action pour ajouter les lignes. - -L'ordre d'affichage est donc défini : - -1) actions de classes -2) actions universelles - -L'ordre des classes est l'ordre d'ajout dans le dictionnaire. - - -# Création du dictionnaire - -Parlons de l'initialisation du dictionnaire. - -Le composant `Menu` est utilisé dans `Editor`. C'est aussi ici que l'ont crée le dictionnaire. - -La fonction `InitActions` s'occupe d'enrichîr le dictionnaire des différentes actions. - -On peut voir qu'au début de la fonction que les actions universelles y sont initialisées. Ensuite, les actions spécifiques aux classes y sont ajoutés avec au début les actions définies dans SVGLayoutDesigner et après, les actions définies dans la configuration de l'API (donc `Diviser remplissage par exemple`). - -Chaque action provenant de l'API utilise la fonction `GetAction` du fichier utilitaire `ContextMenuActions.ts`. - -Cette fonction équipe l'action qui sera exécutée d'une autre fonction appelé `SetContainerList`. Cette autre fonction s'occupe de faire un appel REST vers l'api sur le point d'accès `Configuration.APIConfiguration.apiSetContainerListUrl` ou, si elle n'est pas définie, sur `VITE_API_SET_CONTAINER_LIST_URL`. - -Cela veut dire que pour l'instant toutes les actions provenant de l'API a pour but de remplacer, d'ajouter ou de supprimer des conteneurs. \ No newline at end of file diff --git a/docs/#Project/Pages/DataStructure.md b/docs/#Project/Pages/DataStructure.md deleted file mode 100644 index 1c57864..0000000 --- a/docs/#Project/Pages/DataStructure.md +++ /dev/null @@ -1,220 +0,0 @@ - -> TL;DR: Ce projet utilise un dictionnaire pour représenter un arbre/graphe - -# Préface - -Ce document explique la structure de données utilisée pour les conteneurs. - - -# Graphe - -Avant de parler de la structure principale il faut comprendre ce qu'est un graphe. - -Pourquoi ? Parce que la plupart des algorithmes utilisés dans ce projets découle de la théorie des graphes. - -> Definition : Un graphe est une structure composée d'objets dans laquelle certaines paries d'objets sont en relation. (...) On distingue les graphes non orientés et les graphes orientés. (src: wikipedia) - -Ces objets sont appelé Container dans notre projet. Mais dans cette documentation, nous appelerons cela un *Noeud* - -En programmation un graphe peut être représenter par des divers structure de données (Vector/List/Array, Dictionaries, Tree, Pointer etc.). - -Dans notre projet, nous utilisons les pointeurs, les listes et les dictionnaires. - -# Structures de données - -## Pointeur - -Un graphe représenté par des pointeurs peut être représenté de cette manière. - -Un exemple de graphe peut être représenté de la manière suivante : -``` -type Node = { - child: Node -} - -A: Node = { - child: B -} - -B: Node = { - child: A -} -``` - -Donc le graphe est simplement `A <-> B` - -Ceci est un graphe cyclique que nous ne verrons pas souvent dans ce projet. -En effet, nous avons plutôt quelque chose comme ça: - -``` -type Node = { - parent: Node - child: Node -} - -A: Node = { - parent: null - child: B -} - -B: Node = { - parent: A - child: null -} -``` - -Cela permet de représenter un graphe avec deux liens au lieu d'un seul et d'avoir une information de **hiérarchie**. -On le représente donc comme cela: `A -> B`. Donc par définition, un graphe orienté. - - -## Liste - -Un noeud dans un graphe peut avoir plusieurs voisins/enfants. On peut simplement représenter cela par une *liste* de pointeurs. - -Reprenons l'exemple précédent : - -``` -type Node = { - parent: Node - children: Node[] -} - -A: Node { - parent: null, - children: [ - B, - C, - ] -} - -B: Node { - parent: A - children: [] -} - -C: Node { - parent: A - children: [] -} -``` - -Ici, A contient donc deux enfants dans une liste: B et C. -On peut représenter cela de la manière suivante: - -``` -A -> B -A -> C -``` - -A partir d'ici vous pouvez voir ce qu'on appelle un *arbre*. Cette structure de données d'arbre est la base fondamentale dont repose les Conteneurs. - -Pour des examples réels, vous pouvez voir qu'un livre peut être représenté comme des arbres : - -> Un livre contiennent des pages, et des pages contiennent des lignes, des lignes contiennent des lettres, etc. - - -## Dictionnaire - -### Contexte - -Normalement l'arbre devrait être suffisant pour développer SVGLayoutDesigner mais on va s'en rendre compte que ce n'est pas la meilleure solution. - -Depuis le début du projet, la structure utilisée était celle d'un arbre avec relation parent-enfant comme précédemment montré. - -Mon on a remarqué tardivement que cela commençait à avoir un coût très important sur toutes les opérations d'arbres. En effet, car toutes les opérations d'arbre repose sur une fonction principale: la recherche. - -Pour trouver un noeud dans un arbre, il faut parcours l'arbre grâce à des algorithme de parcours d'arbre appelé Depth-First Search et Breath-First Search, qui sont d'excellent algorithme de recherche dans un graphe (oui! car ça ne se limite pas aux arbres). - -Cependant, cela possède un coût au pire cas de O(N). Il est possible que le noeud que le cherche se trouve tout à la fin de l'arbre et ces deux algorithmes n'aident pas du tout dans ce cas là. Imaginez 1000 conteneurs, et on veut juste changer la position d'un seul conteneur. Cela veut dire qu'il faudrait parcourir les 1000 conteneurs ! - -Et c'est ce qui c'est passé jusqu'au commit `9f4796d0` (10 oct 2022). Faites une recherche globale de `FindContainerById`, cela montrera toutes les opérations impactées par l'arbre. Au jour de l'écriture de ce document, il y a environ 60 fonctions utilisant cette méthode utilisée dans divers opérations actives ou passives. C'est très COUTEUX ! - -Réduisons cela à O(1), le meilleur cas. Pour cela nous allons utiliser ce qu'on appelle un dictionnaire ou aussi appelé aussi HashMap. - - -### Qu'est-ce qu'un dictionnaire ? - -> Un dictionnaire est une structure de données qui implémente un tableau associatif. C'est un type de données abstrait qui permet l'association de clé-valeur. - -Exemples : - -``` -Dict { - key: value - ... -} - -Dict = [ - [key, value], - ... -] -``` - -### Mise en pratique - -On veut accéder aux conteneurs rapidement, nous allons sauvegarder chaque conteneur dans le dictionnaire. Donc dès que l'ont crée un conteneur, on ajoute son id pour clé et le conteneur en tant que valeur. Dès qu'on le supprime, on supprime sa clé. - -Cependant pour éviter la duplication de données, il faut aussi changer comment on représente l'arbre. Il n'est plus nécessaire de sauvegarder la référence de l'enfant en tant qu'enfant, on peut juste utiliser son id. - -Ainsi on obtient la structure suivante utilisée dans le projet : - -``` -type Conteneur = { - parent: string - children: string[] -} - -const dict = new Map(); - -dict = { - "conteneur1": Conteneur { - parent: null, - children: [ - "conteneur2", - "conteneur3" - ] - }, - "conteneur3": Conteneur { - parent: "conteneur1", - children: [] - }, - "conteneur2": Conteneur { - parent: "conteneur1", - children: [] - } -} -``` - -Ainsi, `FindContainerById` utilisant précédemment depth-first search, peut être refactoré par une seule ligne : - -```ts -function FindContainerById( - containers: Map, - id: string -): Conteneur { - return containers.get(id) -} -``` - -Et maintenant déplacer un seul conteneur ne coûte plus aussi cher pas vrai ? - -# FAQ - -Pourquoi est-ce important d'utiliser un dictionnaire dans notre cas ? - -> Cela permet d'accéder un conteneur directement par une clé par exemple son id - - -Pourquoi ne pas l'utiliser tout le temps ? - -> Car ce n'est pas très intuitif, on aime voir les arbres comme des arbres et pas comme des listes. Le coût est parfois suffisamment mineur pour ignorer cela. - - -Pourquoi ne pas utiliser l'arbre avec le dictionnaire en même temps ? - -> Car dans notre projet, la sérialisation des données ne permet pas d'avoir deux instances à deux endroits différents. C'est pourquoi nous utilisons un *replacer*, pour supprimer les références de parents. Mais il serait difficile de faire cela pour tous les enfants, il est plus simple de supprimer entièrement l'arbre et de juste conserver le dictionnaire. Et puis, pourquoi dupliquer les données alors que l'on l'accéder avec un coût minimal O(1) avec juste le dictionnaire sans aucun coût supplémentaire ? - - -Et si je veux itérer sur tout les chassis ? - -> Depth-first search et Breath-first search sont toujours valables. Il faut juste adapter légèrement l'algorithme pour qu'il lit le dictionnaire à chaque fois que l'on veut accéder aux enfants. Voir `MakeDFSIterator` ou `MakeBFSIterator` dans `src/utils/itertools.ts` pour l'exemple. diff --git a/docs/#Project/Pages/Project_Structure.md b/docs/#Project/Pages/Project_Structure.md deleted file mode 100644 index ad784a1..0000000 --- a/docs/#Project/Pages/Project_Structure.md +++ /dev/null @@ -1,50 +0,0 @@ -# Project Structure - -``` -. -├── .vscode/ VSCode config folder -│ ├── launch.json VSCode debug config -│ └── settings.json VSCode project config -├── csharp/ C# models and test project -├── docs/ Documentation folder -├── public/ Public folder in which the index.html -│ │ import its resources -│ ├── smartcomponent/ SmartComponent folder -│ └── workers/ Webworkers folder -├── src/ Source folder for the react app -│ ├── assets/ Assets folder in which the react app -│ │ import its resources -│ ├── Components/ Components folder -│ ├── Enums/ Enums folder -│ ├── Events/ API Events folder -│ ├── Interfaces/ Interface (+ types folder) -│ ├── test/ Setup folder for the tests -│ ├── tests/ Other tests + resources -│ ├── utils/ Utilities folder -│ ├── index.scss Tailwind CSS extends -│ ├── main.tsx Entrypoint for App injection -│ └── vite-env.d.ts Types for .env files -├── test-server/ Tests servers to test the API -│ ├── http.js Test server for bun.sh -│ └── node-http.js Test server for Node.js -├── .drone.yml Drone.io ci configuration -├── .env.development Vite development environment config -├── .env.production Vite production environment config -├── .env.test Vite test environment config -├── .eslintrc.cjs eslint config file -├── .gitattributes git-lfs config file -├── .gitignore git ignore config file -├── azure-pipelines.yml Azure Pipelines YAML config file -├── index.html HTML Page -├── package-lock.json Describe the node_modules tree for npm -├── package.json Node.JS config file -├── pnpm-lock.yaml Describe the node_modules tree for pnpm -├── postcss.config.cjs Postcss config file for SCSS processing -├── README.md -├── tailwind.config.cjs Tailwind CSS config file -├── tsconfig.json Typescript config file -├── tsconfig.node.json Typescript config file for Node modules -├── vite.config.ts Vite config file -└── vitest.config.ts Vitest config file -``` - diff --git a/docs/#Project/Pages/SVGLD_Cotes.pdf b/docs/#Project/Pages/SVGLD_Cotes.pdf deleted file mode 100644 index 938f9d6..0000000 --- a/docs/#Project/Pages/SVGLD_Cotes.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9200f873dc30971dd9f6f88fc4a5c2b0b716d31ba80470d930fef17863866c8b -size 309145 diff --git a/docs/#Project/Pages/SVGLD_Cotes.pptx b/docs/#Project/Pages/SVGLD_Cotes.pptx deleted file mode 100644 index 14fbfc5..0000000 --- a/docs/#Project/Pages/SVGLD_Cotes.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c800e17f3aad51dca4638b4a5474a70fbf7644d32bb7b1d37e88518ad5dc3a2b -size 539089 diff --git a/docs/#Project/Pages/SmartComponent.md b/docs/#Project/Pages/SmartComponent.md deleted file mode 100644 index cd44b09..0000000 --- a/docs/#Project/Pages/SmartComponent.md +++ /dev/null @@ -1,159 +0,0 @@ -Source: https://dev.azure.com/techformsa/SmartConfigurator/_wiki?pageId=122&friendlyName=Int%C3%A9grer-le-projet-en-tant-que-composant-dans-Modeler# - -- [Préface](#préface) -- [Générer des fichiers de définition pour SmartModeler](#générer-des-fichiers-de-définition-pour-smartmodeler) -- [Customiser et build le projet (recommandé)](#customiser-et-build-le-projet-recommandé) - - [Configurer les options de build](#configurer-les-options-de-build) - - [Build le projet](#build-le-projet) -- [Télécharger les défauts](#télécharger-les-défauts) - - [Télécharger les ressources](#télécharger-les-ressources) -- [Utiliser dans modeler](#utiliser-dans-modeler) - -# Préface - -Ce document a pour but d'expliquer comment intégrer SVGLayoutDesigner dans un projet. - -Le projet se compile avec `npm run build` grace à Vite. -Avec les fichiers générés dans `dist` nous allons créer un nouveau composant modeler par injection. -(Plus tard les fichiers "Release" seront fournies par azure-pipeline par artefacts). - -Il utilise le framework JS React pour faire le rendu. - -Les projets modeler vont communiquer avec le composant par [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent) et par REST via un webservice dans les options de build. - -Il y deux manières de récupérer les builds du projets: -- Rebuild le projet (recommandé) -- Récupérer des prébuild - -Mais avant tout cela il faut mettre à jour le fichier de types à fournir. - - -# Générer des fichiers de définition pour SmartModeler - -Pré-requis : `typescript`, `python3` - -Allez dans le répertoire `src/dts` et exécutez la commande suivante - -``` -npx tsc --project tsconfig.dts.json -``` - -Ou si l'installation est globale - -``` -tsc --projet tsconfig.dts.json -``` - - -Ensuite, exécutez `python3` (ou `py` sous Windows) sur `generate_dts.py` : - -``` -python3 generate_dts.py SVGLD svgld.d.ts -``` - -Une définition sera générée sous la forme `svgld.d.ts` avec l'espace de nom `SVGLD`. - -Copiez-le enfin dans `public/` et écrasez le fichier existant. - -Lorsque vous ferez `npm run build`, ce fichier sera copié dans `build`. - - -# Customiser et build le projet (recommandé) - -Customiser le build du projet permet de modifier les urls de l'API et de personnaliser des fonctionnalités. - -## Configurer les options de build - -Il y a deux fichiers principaux à configurer : -- `.env.production.local`: pour configurer les URLs d'API -- `src/utils/default.ts`: pour configurer les fonctionnalités - -Copiez `.env.production` vers `.env.production.local` et modifiez-le comme bon vous semble : - -``` -VITE_API_FETCH_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/GetSVGLayoutConfiguration -VITE_API_SET_CONTAINER_LIST_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/SetContainerList -VITE_API_GET_FEEDBACK_URL=https://localhost/SmartMenuiserieTemplate/Service.svc/GetFeedback -``` - -Vous pouvez modifiez `src/utils/default.ts` mais ne le committez pas. - -## Build le projet - -Lancer la commande `npm run build` dans le projet. - -Les fichiers seront fournis dans `dist`. - - -# Télécharger les défauts - -Les defauts utilise l'API de SmartMenuiserieTemplate sur `localhost` - -## Télécharger les ressources - -Sur Azure DevOps, dans ce projet *SmartConfigurator*, allez dans **Pipelines**. Cliquez sur la pipeline [SVGLayoutDesignerReact](https://techformsa.visualstudio.com/SmartConfigurator/_build?definitionId=9) - -Cliquez sur le dernier run de la branche `dev` ou (`master` pour une version stable). - -Cliquez sur Job (s'il a un statut **Success**) - -Cliquez sur `1 artifact`: -![image.png](/.attachments/image-28004315-69f2-4452-ab83-7f3823f42699.png) - -Cliquez sur le menu hamburger et cliquez sur **Download Artifacts** : -![image.png](/.attachments/image-76f5786f-ef6a-4fd9-8bb7-b7b294c140b6.png) - - -# Utiliser dans modeler - -- Créez un dossier `svg-layout-designer` dans le dossier `Component`. - -- Puis copier les fichiers de build dans le dossier. (copiez l'entièreté du dossier `dist` ou extrayez le zip selon la méthode). - -- Si **besoin**, modifier le fichier `smartcomponent/svg-layout-designer.html` pour avoir la bonne url relative à la basename de l'url : - -```diff -- -``` - -- Ensuite dans Visual Studio, incluez les fichiers et compilez. - -- Enfin sur Modeler, un nouveau composant devrait être disponible. - -- Pour l'utiliser dans un viewModel, créez un observable de type `SVGLayoutDesigner` et assignez-le dans les propriétés du composant : - -```typescript -ConfiguratorViewModel.ts -... - -private OSVGLayoutDesigner: KnockoutObservable = ko.observable(null); - -... -``` - -![image.png](/.attachments/image-63b863d7-9793-459f-b940-a1a26d905053.png) - -- Exemple d'utilisation: - -```typescript -public AddContainer() { - // Récupère la configuration de l'éditeur - this.OSVGLayoutDesigner().GetEditorState((state: SVGLD.IEditorState) => { - // Création d'un nouveau conteneur du premier type de container de la config dans le conteneur sélectionné - const config = state.configuration; - const containerConfig = config.AvailableContainers.shift(); - const type = containerConfig.Type; - this.OSVGLayoutDesigner().AppendContainerToSelectedContainer(type); - }); -} - -public DeleteContainer() { - // Supprime le conteneur sélectionné - this.OSVGLayoutDesigner().GetCurrentHistoryState((state: SVGLD.IHistoryState) => { - const selectedContainer = state.selectedContainerId; - this.OSVGLayoutDesigner().DeleteContainer(selectedContainer); - }) -} -``` \ No newline at end of file diff --git a/docs/#Project/Pages/Translations.drawio b/docs/#Project/Pages/Translations.drawio deleted file mode 100644 index ce4c171..0000000 --- a/docs/#Project/Pages/Translations.drawio +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2780f57a5082686ada87ac826848acf9268a7c0af03d1048121b32e1033e0116 -size 344587 diff --git a/docs/#Project/Pages/WebWorkers.md b/docs/#Project/Pages/WebWorkers.md deleted file mode 100644 index 6b42c0f..0000000 --- a/docs/#Project/Pages/WebWorkers.md +++ /dev/null @@ -1,38 +0,0 @@ -# Web workers - -Cette page explique la raison d'utiliser un web worker. - - -# Qu'est-ce qu'un web worker ? - -Rapidement, c'est juste un fichier js qui est exécuté côté dans un Thread différent. - -Il attend un réponse, la traite et peut répondre ensuite. - - -# Pourquoi en utiliser ? - -Cela permet du véritable code asynchrone évitant le freeze du navigateur lorsqu'il fait des calculs compliqués ou lorsqu'il attend. - -Exemple: https://mdn.github.io/dom-examples/web-workers/fibonacci-worker/ - - -# Comment sont-ils utilisés ? - -## Sauvegarde - -Le premier web worker, situé dans [`public/workers/worker.js`](../../../public/workers/worker.js) s'occupe de faire une seule est unique tâche : `JSON.stringify` cependant on fonction de la taille de l'objet à stringifier en JSON cela peut prendre plusieurs secondes auquel cas l'utilisateur peut croire que son navigateur à bloqué. - -On le met donc dans un web worker pour éviter cela. - -Dans `Save.ts`, on crée le web worker avec `new Worker('workers/worker.js')` et on le termine quand il a fini sa tache avec `terminate()` - -## Envois de message - -Le deuxième web worker, situé dans [`public/workers/worker.js`](../../../public/workers/message_worker.js) s'occupe de faire des appels REST en stringifiant l'état de l'application. - -Pour la même raison que la sauvegarde, on le met pour éviter un freeze. - -Il est évidemment moins utile que la sauvegarde qui prends un objet beaucoup plus lourd. - -Contrairement à la sauvegarde, le web worker est crée dans `UI.tsx` avec `UseWorker()` et existe sur tout le long de la durée de vie de l'application. Il est initialisé dans l'utilisation du module `UseWorker.tsx`. \ No newline at end of file diff --git a/docs/#Project/Pages/CICD.md b/docs/CICD.md similarity index 71% rename from docs/#Project/Pages/CICD.md rename to docs/CICD.md index 55b74db..7c3543f 100644 --- a/docs/#Project/Pages/CICD.md +++ b/docs/CICD.md @@ -5,9 +5,8 @@ This project uses Azure Pipelines to runs automatic tests. Its `azure-pipelines.yml` configuration file can be found at the root project folder. -# Drone.io (deprecated) +# Drone.io -Due to the limitations of Azure Pipelines (limited free usage, no parallel, no dockerhub...), it might be more useful to use Drone.io. -However `pnpm` will not be as useful as in Azure Pipelines since we cannot cache on the parent machine. +Due to the limitations of Azure Pipelines (limited free usage, no parallel, no dockerhub...), it might be more useful to use Drone.io. Its config file can be found in `.drone.yml`. \ No newline at end of file diff --git a/docs/#Project/Pages/Dependencies.md b/docs/Dependencies.md similarity index 72% rename from docs/#Project/Pages/Dependencies.md rename to docs/Dependencies.md index ef15b06..626458e 100644 --- a/docs/#Project/Pages/Dependencies.md +++ b/docs/Dependencies.md @@ -13,8 +13,7 @@ It depends on Vite in order to build the project. Others dependencies: - [react-dom](https://reactjs.org/docs/react-dom.html): library used to inject the app to `#root` html element. -- [react-window](https://www.npmjs.com/package/react-window): component that offers component dynamic loading over scroll (very useful++) -- [react-svg-pan-zoom](https://www.npmjs.com/package/react-svg-pan-zoom): component that offers pan + zoom to a svg element (if this gets deprecated, please try to migrate to HTML Canvas before trying a new library) +- [react-svg-pan-zoom](https://www.npmjs.com/package/react-svg-pan-zoom): component that offers pan + zoom to a svg element # [Vite](https://vitejs.dev/) @@ -49,12 +48,6 @@ Other dependencies: SVG Icons that can be used as JSX elements with Tailwind CSS -# [Interweave](https://interweave.dev/) - -React library to render HTML from string. -In this project, it is particularly used for the CustomSVG property. - -If this dependencies gets deprecated please revert [PR#18 e96e4f12](https://dev.azure.com/enguyen0660/SVGLayoutDesignerReact/_git/SVGLayoutDesignerReact/commit/e96e4f123b4aa4c9cdb327d4d617ab0e63dc4d0f?refName=refs%2Fheads%2Fdev) # Testing diff --git a/docs/Documents/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf b/docs/Documents/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf deleted file mode 100644 index 9b78c58..0000000 --- a/docs/Documents/01_141017-WG-11328-SYME-VERNUCCI-DET BF ind A.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4d97d35d32b6201f0795bbc2b61b475222b23f93652e69f45b1f66d8165d257 -size 765789 diff --git a/docs/Documents/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf b/docs/Documents/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf deleted file mode 100644 index c208e81..0000000 --- a/docs/Documents/02_141017-WG-11328-SYME-VERNUCCI-DET BF ind B.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5af9380fda7a9c9b416ce6e58a21fbd6737b3ed9be06b59f94991903ac667d3a -size 771067 diff --git a/docs/Documents/03_SYME KLINE cde BV.pdf b/docs/Documents/03_SYME KLINE cde BV.pdf deleted file mode 100644 index 3ffaf14..0000000 --- a/docs/Documents/03_SYME KLINE cde BV.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a4ca2dbff7444a802297e5d2a46930cca8b9a4ed801cb2315b37fe8ef54bf10 -size 2230676 diff --git a/docs/Documents/04_ARC KL_K1485985-ARC-K1485985.pdf b/docs/Documents/04_ARC KL_K1485985-ARC-K1485985.pdf deleted file mode 100644 index f737334..0000000 --- a/docs/Documents/04_ARC KL_K1485985-ARC-K1485985.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b064e88d02dfcb1c74ea776b3ca9b3c70595caaba05b76c7d3bc7fbdd609b92 -size 970682 diff --git a/docs/Documents/05_DT_K1485985.pdf b/docs/Documents/05_DT_K1485985.pdf deleted file mode 100644 index b209be1..0000000 --- a/docs/Documents/05_DT_K1485985.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85c0158092cec03ca86c826671e3cb44899e218ac268ac84919fbc69ae65fb55 -size 2577327 diff --git a/docs/Documents/06_ Photo IMG_1406.jpg b/docs/Documents/06_ Photo IMG_1406.jpg deleted file mode 100644 index 203c6f3..0000000 --- a/docs/Documents/06_ Photo IMG_1406.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50ee7ef27161cac6159573fee35ea664048f0bb01756d47cc65b5d378bcd5a56 -size 2283743 diff --git a/docs/Documents/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg b/docs/Documents/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg deleted file mode 100644 index 3b9ea9e..0000000 --- a/docs/Documents/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.dwg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85252dac3e88159e970795d4037f9d6c7bc818914a3097ccacb682025b3f44db -size 1721581 diff --git a/docs/Documents/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf b/docs/Documents/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf deleted file mode 100644 index 21804a3..0000000 --- a/docs/Documents/131421 KALIA - 15541 - PARVIS DE RODE - D0371837 - BANDE FILANTE PLAN 01 à 07 -IND B.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88612b0e6d958e4869169eeadbfe69a0a55b84f7e8696429fcc6e27c6a33cab7 -size 2225972 diff --git a/docs/Documents/image0000001.jpg b/docs/Documents/image0000001.jpg deleted file mode 100644 index c078714..0000000 --- a/docs/Documents/image0000001.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7eeafb479c2c5fa1ac6a2acadc9bee27285ca43cedd029ed43b2da5b6a35dd9 -size 207799 diff --git a/docs/Project_Structure.md b/docs/Project_Structure.md new file mode 100644 index 0000000..890daf8 --- /dev/null +++ b/docs/Project_Structure.md @@ -0,0 +1,38 @@ +# Project Structure + +The project is structured this way + +``` +. +├── docs Documentation folder +├── public Public folder in which the index.html +│ import its resources +├── src Source folder for the react app +│ ├── assets Assets folder in which the react app +│ │ import its resources +│ ├── Components Components folder +│ ├── Enums Enums folder +│ ├── Interfaces Interface (+ types folder) +│ ├── test Setup folder for the tests +│ ├── tests Other tests + resources +│ ├── utils Utilities folder +│ ├── index.scss Tailwind CSS extends +│ ├── main.tsx Entrypoint for App injection +│ └── vite-env.d.ts Types for .env files +├── test-server Tests servers to test the API +│ ├── http.js Test server for bun.sh +│ └── node-http.js Test server for Node.js +├── azure-pipelines.yml Azure Pipelines YAML config file +├── index.html HTML Page +├── package-lock.json Describe the node_modules tree for npm +├── package.json Node.JS config file +├── pnpm-lock.yaml Describe the node_modules tree for pnpm +├── postcss.config.cjs Postcss config file for SCSS processing +├── README.md +├── tailwind.config.cjs Tailwind CSS config file +├── tsconfig.json Typescript config file +├── tsconfig.node.json Typescript config file for Node modules +├── vite.config.ts Vite config file +└── vitest.config.ts Vitest config file +``` + diff --git a/docs/Tutorial/Home.md b/docs/Tutorial/Home.md deleted file mode 100644 index f90ca70..0000000 --- a/docs/Tutorial/Home.md +++ /dev/null @@ -1,7 +0,0 @@ - -Bienvenue au tutoriel de SVGLayoutDesigner. - -Cette documentation a pour objectif de familiariser les nouveaux développeur aux outils du projet -et à apprendre à développer des composants sous React. - -Si vous êtes prêt allez sur la page [Pour commencer](Pages/PourCommencer.md) \ No newline at end of file diff --git a/docs/Tutorial/Pages/BasesReact.md b/docs/Tutorial/Pages/BasesReact.md deleted file mode 100644 index 6131465..0000000 --- a/docs/Tutorial/Pages/BasesReact.md +++ /dev/null @@ -1,251 +0,0 @@ -# Les bases de React - -Pour commencer, je vous recommande fortement de regarder cette vidéo qui expliquera mieux que ce document sur comment fonctionne React : https://www.youtube.com/watch?v=Tn6-PIqc4UM - -Ce document fera quand même de son mieux pour expliquer les bases de React et permettra d'expliquer comment intégrer un composant dans le projet. - -## Qu'est-ce qu'un composant React ? - -Un composant React peut être décrite comme une classe (`class component`) ou une fonction (`functional component`) retournant une description de composant en JSX, un langage permettant de combiner du HTML et du JavaScript. Ces composants ont par convention l'extension de fichier `.jsx` (ou `.tsx` avec TypeScript) - -Un composant est principalement constituer de `props` (propriétés) et d'un `state` (état). Cela est universel pour tous les composants. - -Voici un basique exemple de composant : - -```jsx -function Welcome(props) { - return

Hello, {props.name}

; -} -``` - -> La règle d'or est que le rendu change lorsqu'un props ou un state change. - -Selon comment vous écrivez le composant, classe ou fonctionnelle, la manière de changer les props ou state est différente: - -Pour les props : - -```tsx -// functional -function Welcome(props) { - return

Hello, {props.name}

; -} - -// class -class Welcome extends React.Component { - render() { - return

Hello, {this.props.name}

; - } -} -``` - -Pour l'état: - -```jsx -// Functionnal -const useTicking = (setDate) => { - React.useEffect(() => { - const timerID = setInterval(() => { - setDate(new Date()); - }, 1000); - - return () => { - clearInterval(timerID) - } - }, []); -}; - -export const Clock = (props) => { - const [date, setDate] = React.useState(new Date()); - - useTicking(setDate); - - return ( -
- { date.toLocaleTimeString() } -
- ); -}; - - -// class -class Clock extends React.Component { - constructor(props) { - super(props); - this.state = {date: new Date()}; - } - - componentDidMount() { - this.timerID = setInterval( - () => this.tick(), - 1000 - ); - } - - componentWillUnmount() { - clearInterval(this.timerID); - } - - tick() { - this.setState({ - date: new Date() - }); - } - - render() { - return ( -
- {this.state.date.toLocaleTimeString()} -
- ); - } -} -``` - -Dans ce projet, il est de convention d'écrire en fonctionnel, car cela a pour avantage de fractionner les composants possèdant beaucoup de fonctions (voir par exemple `ContainerOperations.ts`) et de séparer les les propriétés d'états par des `state hooks` (crochet d'états). - -La documentation qui suivra utilisera donc l'écriture fonctionnelle. Pour en savoir plus sur l'écriture de classe, vous pouvez essayer [le tutoriel de React](https://reactjs.org/tutorial/tutorial.html). - - -## Props - -Les props sont des données entrer d'un composant. Comme pour un composant html ils décrivent simplement ce que le composant doit représenter. - -Exemple : - -```tsx -function Welcome(props) { - return

Hello, {props.name}

; -} -``` - -## State vs Stateless - -Un composant possédant un état interne utilise `React.setState(newState)` dans un composant de classe ou `React.useState(defaultValue)` dans un composant fonctionnel. -Un composant ne possédant pas d'état est dit `stateless`. - -Voici donc un exemple de composant React **avec état** : - -```tsx -// Clock.tsx -interface IClockProps { -} - -const useTicking = (setTime: React.Dispatch>) => { - React.useEffect(() => { - const timerID = setInterval(() => { - setTime(new Date()); - }, 1000); - return () => { - clearInterval(timerID) - } - }, []); -}; - -export const Clock: React.FC = (props) => { - const [time, setTime] = React.useState(new Date()); - - useTicking(setTime); - - return ( -
- { time.toLocaleTimeString() } -
- ); -}; - -``` - -Et voici la version **sans état** : - -```tsx -// Clock.tsx -interface IClockProps { - time: Date -} - -export const Clock: React.FC = ({ time }) => { - return ( -
- { time.toLocaleTimeString() } -
- ); -}; - -// Parent.tsx -const useTicking = (setTime: React.Dispatch>) => { - React.useEffect(() => { - const timerID = setInterval(() => { - setTime(new Date()); - }, 1000); - return () => { - clearInterval(timerID); - }; - }, []); -}; - -export const Parent: React.FC = ({ time }) => { - const [time, setTime] = React.useState(new Date()); - - useTicking(setTime); - - return ( - - ); -}; -``` - -Comme vous pouvez le voir, la différence est que la gestion d'état est donnée au composant parent. Cela permet de réduire les mises à jours de rendu en parallèles et de faire le rendu seulement si l'état du composant parent change. - -Vous avez probablement remarqué l'usage de `React.useState()` et `React.useEffect()`. Lorsque l'on utilise une fonction avec le mot clé `use` de React, on utilise ce qu'on appelle un `hook` (crochet). - -Il existe plusieurs type de hook et chacun ont leurs propre effet. Dans ce projet, nous utilisont principalement `useState` et `useEffect` mais il y a aucune interdiction pour utiliser d'autres types. - -### `useState` - -`useState` permet de lier à l'état interne du composant une variable. - -La fonction nous fourni 2 paramètres dans une liste. La valeur courante et le setter de cette valeur : - -```jsx -const [value, setValue] = React.useState(defaultValue); -``` - -### `useEffect` - -`useEffect` permet de lancer une fonction d'effet lors d'un rendu. Il prend en paramètres : -- une fonction callback d'effet lors du rendu qui retourne lui aussi retourne une fonction d'effet lors de la suppression du rendu. -- Il prend aussi optionnellement un liste de dépendance permettant de déterminer les conditions de rendu - -Revenons sur l'exemple de `useTicking`: - -```tsx -const useTicking = (setTime) => { - React.useEffect(() => { - // componentDidMount - const timerID = setInterval(() => { - setTime(new Date()); - }, 1000); - - return () => { - // componentWillUnmount - clearInterval(timerID); - }; - }, []); -}; -``` - -Décrivons ce quelle fait : -- La callback de `useEffect` appelle `setInterval` afin d'exécuter une fonction `setTime` toute les seconde. -- Cette callback retourne la fonction de suppression de `setInterval` qui sera exécutée si le composant est disposé. -- `useEffect` possède un tableu de dépendance mais elle est vide. Cela veut dire que la callback sera exécuté qu'une seule est unique fois sur toute la durée de vie du composant - -Si on avait enlevé le tableau de dépendance, on aurait eu une boucle infinie ! Car rien n'aurait limité l'exécution de la callback à chaque rendu créé par `setTime`. - -> Une règle d'or est qu'il faut mettre un tableau de dépendance lorsque l'on utilise un setteur d'état car il y aura a coup sûr une boucle infinie s'il y en a pas - -> Contraposée: Il n'est pas nécessaire de mettre un tableau de dépendances s'il n'y pas de setteur d'état dans la callback - -> Il est de convention de mettre les fonctions `useEffect` dans une fonction nommée afin de déterminer ce qu'elle fait. Il est possible d'appeler plusieurs fois `useEffect`, donc il n'est pas dangereux de dissocier les effets. - - -Si vous avez compris, essayons de créer notre [premier composant React](PremierComposantReact.md). \ No newline at end of file diff --git a/docs/Tutorial/Pages/Heroicon.md b/docs/Tutorial/Pages/Heroicon.md deleted file mode 100644 index ac82f9b..0000000 --- a/docs/Tutorial/Pages/Heroicon.md +++ /dev/null @@ -1,41 +0,0 @@ -# Heroicon - -Cette page est totalement optionnel pour apprendre à faire un composant. Mais elle vous permettra d'apprendre à utiliser [Heroicon](https://heroicons.com/). - -Heroicon est un ensemble de SVG utilisable sous forme JSX avec React et Tailwind CSS. - - -# Continuation de l'exemple de Premier Composant React - -L'icône Home peut être importé comme tout composant React. - -Il existe plusieurs type de chaque icône de Heroicon : `outline`, `solid`, `mini`. Utilisons donc `outline`. - -```tsx -import { HomeIcon } from '@heroicons/react/outline'; - -... - -export function Home({ goHome }: IHomeProps): JSX.Element { - const defaultIndex = Math.floor(Math.random() * (colors.length - 1)); - const [index, setIndex] = useState(defaultIndex); - - const selectedColor = colors[index]; - const className = `${selectedColor}`; - return ( - - ); -} - -``` \ No newline at end of file diff --git a/docs/Tutorial/Pages/PourCommencer.md b/docs/Tutorial/Pages/PourCommencer.md deleted file mode 100644 index 56eb977..0000000 --- a/docs/Tutorial/Pages/PourCommencer.md +++ /dev/null @@ -1,43 +0,0 @@ -# Pour commencer - -Je vous recommande de lire [README.md](../../../README.md) si ce n'est pas encore fait -et de mettre en place le projet selon ce qui est écrit. - -La documentation fera référence à la configuration suivante : -- [VSCode](https://code.visualstudio.com/) pour l'IDE -- [pNPm](https://pnpm.io/fr/) pour le gestionnaire de paquet -- [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) pour l'outil d'analyse de projet React -- [Typescript React code snippets](https://marketplace.visualstudio.com/items?itemName=infeng.vscode-react-typescript) pour les snippets React - -Si vous n'avez pas installé l'un de ces outils, je vous le recommande **fortement**. - -# Structure du projet - -Commençons par nous familiariser avec la structure du projet: 90% du temps, les modifications que vous allez faire seront dans `src/`. -Si vous souhaitez vous familiariser avec le dossier du projet, lisez [Project_Structure](../../Project_Structure.md). - -Le dossier est composé de la manière suivante: - -``` -./src -├── assets -├── Components -├── dts -├── Enums -├── Events -├── Interfaces -├── test -├── tests -├── utils -├── index.scss -├── main.tsx -└── vite-env.d.ts -``` - -Le point d'entrer est le `main.tsx`, mais vous aurez rarement le besoin de le modifier sauf pour ajouter des fonctionnalité sur le scope global. - -Les dossiers principaux que vous aurez besoin d'utiliser pour développer un nouveau composant seront : `Components`, `Enums`, `Interfaces`, `utils` (et `assets` si vous mettez des images ou polices d'écriture). - -Les autres dossiers ne sont pas nécessaire pour faire un composant, mais sont utilisés pour développer d'autres systèmes comme les évents, les définitions typescript et les tests. - -Si vous avez compris, allons à la suite et regardons [les bases de React](BasesReact.md). \ No newline at end of file diff --git a/docs/Tutorial/Pages/PremierComposantReact.md b/docs/Tutorial/Pages/PremierComposantReact.md deleted file mode 100644 index 60e8b1f..0000000 --- a/docs/Tutorial/Pages/PremierComposantReact.md +++ /dev/null @@ -1,346 +0,0 @@ -# Notre premier composant React - -Si vous êtes arrivé ici, c'est que vous avez compris ce qu'est un composant React et qu'il est composant de `props` et d'un `state`. - -Mettons donc en pratique ce que vous avez vu. - -Voici le cahier de charge fonctionnel du composant à implémenter : - -Fonction: -- On veut ajouter un bouton `Home` dans l'éditeur pour revenir au menu principal - -Contraintes principales : -- Le bouton `home` ne doit pas rafraîchir la page - -Contraites secondaires : -- Le bouton est positionné en bas sur la barre -- Le bouton change de couleur à chaque fois que le curseur entre dedans -- Le bouton possède un icône home - -## Initialiser un composant - -Commençont par créer le composant sans le lier forcément au reste du projet. - -Par convention comme il est dit dans la section [Pour commencer](PourCommencer.md), créons le fichier `Home.tsx` dans un dossier `Home/` dans `src/Components`. Il est recommandé de toujours créer un dossier pour le composant pour plus tard si on veut ajouter des styles propres au composant ou si on veut faire des tests. - -Maintenant créons le squelette du composant. Pour rappel, on utilise la syntaxe *fonctionnelle* (i.e. une fonction = un composant). - -```tsx -// Home.tsx -export function Home(): JSX.Element { - return <>; -} -``` - -Note: vous pouvez utiliser le snippet `tsrfc` si vous utilisez l'extension de VSCode. - -La convention de nommage indique qu'il faut prioriser les fonctions nommées (donc pas de flèches fonctions). - -Mettons le bouton html et mettons du texte dedans : - -```tsx -export function Home(): JSX.Element { - return ( - - ); -} -``` - - -## Appeler une fonction - -Pour que le bouton appelle une fonction nous allons utiliser la propriété `onClick`. Pour lui équiper d'une variable/fonction, on la met entre accolades `prop={var}`. - -```tsx -function GoHome(): void { - location.reload(); -} - -export function Home(): JSX.Element { - return ( - - ); -} -``` - -Cela devrait être suffisant pour revenir au menu principal. Appelons-le dans l'editeur. - - -## Ajouter le composant dans l'editeur - -Tout ce qui est UI doit se mettre dans `UI.tsx`. -On sait que l'on doit l'ajouter dans la **barre** à gauche, soit `Bar.tsx` - -Commençons par importer le composant dans `Bar.tsx`: - -```tsx -// Bar.tsx -import { Home } from '../Home/Home'; -... -``` - -Puis ajoutons-le dans la vue : - -```tsx -// Bar.tsx -export function Bar(props: IBarProps): JSX.Element { - return ( -
- ... - -
- ); -} -``` - -Testez avec `pnpm dev`. Et ouvrez la page sur `http://localhost:5173`. - -Et voilà ! Vous avez fini ! - -... - -Sauf que vous n'avez respecté aucune des contraintes. - -Faisons mieux. Utilisons les `props` et le `state` de l'application. - - -## Props et state - -Le composant doit restaurer l'état du menu principal. - -Dans le menu principal, lorsque l'on clique sur `Start from scratch`, le composant doit forcément changer un état pour cacher le menu. - -Ce que l'on veut faire est donc de renverser cette opération, autrement dit changer l'état qui permet de cacher le menu pour le remontrer. - -Allons donc dans le composant `MainMenu.tsx` et analysons le contenu du bouton `Start from scratch`. - -```tsx -// MainMenu.tsx - ... - default: - return ( -
- - -
- ); -``` - -On trouve la fonction `onClick` suivante : - -```tsx -// MainMenu.tsx - - ); -} -``` - -Note: vous pouvez utiliser `Home(props: IHomeProps)` et appeler `props.goHome` comme tout le reste du projet au lieu de le destructurer en `{ goHome }`, mais le destructuring d'objet est autorisé (et dans certains cas, c'est mieux avec). - -Home est utilisé dans les composants Bar, UI, et Editor avant d'être appelé dans App. Il faut faire la même chose, ajouter la fonction dans les props et l'appeler dans le composant : - -```tsx -// Bar.tsx -interface IBarProps { - goHome: () => void -} -... -export function Bar(props: IBarProps): JSX.Element { - return ( -
- ... - -
- ); -} -``` -*Faites la même chose pour UI et Editor.* - -Enfin dans `App.tsx`, créez la fonction permettant de changer `appState` vers `AppState.MainMenu`: - -```tsx - ... - case AppState.Loaded: - return ( -
- setAppState(AppState.MainMenu)} - /> -
- ); - ... -``` - -Félicitation vous avez correctement développé votre premier composant Home ! - -Essayons maintenant de faire le reste dans le prochain chapitre avec [`TailwindCSS`](Tailwind.md) \ No newline at end of file diff --git a/docs/Tutorial/Pages/Tailwind.md b/docs/Tutorial/Pages/Tailwind.md deleted file mode 100644 index eeeb5e9..0000000 --- a/docs/Tutorial/Pages/Tailwind.md +++ /dev/null @@ -1,240 +0,0 @@ -# Tailwind CSS - -Tailwind CSS est un framework CSS proposant des classes utilitaires comme `flex, pt-4, text-center`. -Ce framework permet d'optimiser notament la génération de css et d'éviter la duplication de code lorsque `Vite` compile le projet. - -On peut confirmer cela en regardant le fichier `.css` généré après avoir lancé la commande `pnpm build`. - -Il utilise `index.scss` si on veut regrouper les propriétés de tailwind dans une classe. - -Il utilise `tailwind.config.cjs` pour configurer et étendre quelques propriétés comme la couleur. - - -# Continuation de l'exemple de Premier Composant React - -Rappelons les contraintes secondaires du bouton Home : -- Le bouton est positionné en bas sur la barre -- Le bouton change de couleur à chaque fois que le curseur entre dedans -- Le bouton possède un icône home - -Essayons Tailwind avec React. - -Je vous recommande fortement d'avoir [la documentation de Tailwind](https://tailwindcss.com/) sous les yeux pour suivre ce que font les propriétés. - -## Positionner avec Tailwind - -Pour positionner le bouton tout en bas il faut modifier le layout de la barre - -Voici le layout actuel du composant Bar. - -```tsx -// Bar.tsx -
- (...) - (...) - (...) - (...) - -
-``` - -```scss -// index.scss - .bar { - @apply fixed z-20 flex flex-col top-0 left-0 - h-full w-16 bg-slate-100 - } -``` - -Traduisont donc ceci en css: - -```css -.bar { - display: flex; /* flex */ - flex-direction: column; /* flex-col */ - position: fixed; /* fixed */ - top: 0; /* top-0 */ - left: 0; /* left-0 */ - z-index: 20; /* z-20 */ - width: 4rem; /* w-16 */ - height: 100%; /* h-full */ -} -``` - -On va juste nous interesser sur `flex` et `flex-col` du coup car elles decident du layout des éléments enfants. - -Pour espacer deux éléments dans un layout flex, il y a plusieurs manière de le faire : -- On peut rajout un `div` d'espacement avec la propriété `grow` -- On peut wrapper tous les `BarIcon` et utiliser `place-content-between` dans `.bar` - -On va utiliser la premiere méthode, mais libre à vous la méthode. - -Pour ajouter une classe sur React, on utilise le mot-clé `className`. C'est pour ne pas rentrer en conflit avec le mot-clé `class` servant de classe d'objet en JavaScript que ce mot-clé a été choisi. - -```tsx -// Bar.tsx -
- (...) - (...) - (...) - (...) -
- -
-``` - -Et voilà ! Aussi simple que cela. - -Continuons avec les couleurs avec le curseur. Cette fois ci, on va utiliser React. - - -# Utiliser Tailwind avec React - -Revenons sur le composant Home définie par un simple bouton : - -```tsx -// Home.tsx -import React from 'react'; - -interface IHomeProps { - goHome: () => void -} - -export function Home({ goHome }: IHomeProps): JSX.Element { - return ( - - ); -} -``` - -Dans ce composant, initialisons la liste des couleurs que l'on veut utiliser. Les couleurs de Tailwind sont définies sur cette page : `https://tailwindcss.com/docs/customizing-colors`. - -Il nous suffit donc de juste mettre une liste de mots-clés de couleurs : - -```tsx -// Home.tsx -... - -const colors = [ - 'bg-state-500', - 'bg-gray-500', - 'bg-zinc-500', - 'bg-neutral-500', - 'bg-stone-500', - 'bg-red-500', - 'bg-orange-500', - 'bg-amber-500', - 'bg-yellow-500', - 'bg-lime-500', - 'bg-emerald-500', - 'bg-teal-500', - 'bg-cyan-500', - 'bg-sky-500', - 'bg-blue-500', - 'bg-indigo-500', - 'bg-violet-500', - 'bg-purple-500', - 'bg-fuchsia-500', - 'bg-pink-500', - 'bg-rose-500' -]; -``` - -Et d'en sélectionner une au hazard. - -```tsx -// Home.tsx -const colors = [ - ... -]; - -export function Home({ goHome }: IHomeProps): JSX.Element { - const index = Math.floor(Math.random() * (colors.length - 1)); - const selectedColor = colors[index]; - const className = `${selectedColor}`; - return ( - - ); -} -``` - -Vous vous demandez peut-être pourquoi je n'ai pas juste interpolé une liste de couleurs (`red`, `blue` etc.) au lieux de la *liste de propriétés de couleurs d'arrière-plan* (`bg-red-500`, `bg-blue-500`...). -Cela est expliqué par l'algorithme d'optimisation de fichier CSS de Tailwind. - -Tailwind CSS purge les classes non utilisées dans son framework en scannant tous les fichiers, cela permet d'avoir un fichier css final léger mais en contrepartie, les opérations d'interpolation ne fonctionne pas. -Vous pouvez vérifier la liste de type fichier scanné dans `tailwind.config.cjs`. - -Note : Cela veut dire que l'on aurait pas créer un fichier de preload appelé `colors.tw` et ajouter ce format `.tw` dans le fichier de config pour qu'il le scanne. Ainsi pouvoir enfin interpoler dans le fichier `.tsx` mais cela revient au même finalement que de faire la liste. - -On a donc enfin un arrière-plan qui change mais n'avons nous pas oublié quelque chose ? -Oui ! Il faut changer la couleur quand la souris passe par dessus ! - -Cette fois-ci, pouvez-vous le faire sans lire la solution ? - -Indice: Cela implique l'utilisation de `state` ;) - -# Réponse - -Suivons donc l'indice et créons un hook d'état afin de sélectionner la couleur et de pouvoir la changer quand la souris passe dans le composant - -```tsx -// Home.tsx -export function Home({ goHome }: IHomeProps): JSX.Element { - const defaultIndex = Math.floor(Math.random() * (colors.length - 1)); - const [index, setIndex] = useState(defaultIndex); - - const selectedColor = colors[index]; - const className = `${selectedColor}`; - return ( - - ); -} -``` - -Ensuite utilisons la propriété `onMouseEnter` pour jeter l'évent. - -```tsx -// Home.tsx -export function Home({ goHome }: IHomeProps): JSX.Element { - const defaultIndex = Math.floor(Math.random() * (colors.length - 1)); - const [index, setIndex] = useState(defaultIndex); - - const selectedColor = colors[index]; - const className = `${selectedColor}`; - return ( - - ); -} -``` - -Et voilà vous avez enfin terminé avec Tailwind CSS ! - -Amusez-vous un peu avec Tailwind CSS pour ajuster le style du bouton (padding, margin, transitions etc.) et découvrir quelques propriétés. - -Finissons ce tutoriel avec [Heroicon](Heroicon.md). diff --git a/index.html b/index.html index 7342bd5..e0d1c84 100644 --- a/index.html +++ b/index.html @@ -3,12 +3,11 @@ - Vite + React + TS
- + diff --git a/mprocs.yaml b/mprocs.yaml deleted file mode 100644 index d158c88..0000000 --- a/mprocs.yaml +++ /dev/null @@ -1,5 +0,0 @@ -procs: - vite: - shell: "npx vite" - test-server: - shell: "npx nodemon ./test-server/http.js" diff --git a/package-lock.json b/package-lock.json index 0dd49c2..285432c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,66 +1,47 @@ { "name": "svg-layout-designer-react", - "version": "v1.0.0", + "version": "0.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "svg-layout-designer-react", - "version": "v1.0.0", + "version": "0.0.0", "dependencies": { - "@heroicons/react": "^2.0.14", - "@react-hook/size": "^2.1.2", - "@types/node": "^18.14.2", - "interweave": "^13.0.0", + "@heroicons/react": "^1.0.6", + "framer-motion": "^6.5.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-svg-pan-zoom": "^3.12.1", - "react-window": "^1.8.8", - "sweetalert2": "^11.7.1", - "sweetalert2-react-content": "^5.0.7", - "transformation-matrix": "^2.14.0" + "react-svg-pan-zoom": "^3.11.0" }, "devDependencies": { - "@testing-library/dom": "^8.20.0", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^14.4.3", - "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.1", + "@types/react": "^18.0.15", + "@types/react-dom": "^18.0.6", "@types/react-svg-pan-zoom": "^3.3.5", - "@types/react-window": "^1.8.5", - "@typescript-eslint/eslint-plugin": "^5.51.0", - "@typescript-eslint/parser": "^5.51.0", - "@vitejs/plugin-react": "^3.1.0", - "@vitejs/plugin-react-swc": "^3.1.0", - "@vitest/ui": "^0.28.4", - "autoprefixer": "^10.4.13", - "eslint": "^8.33.0", + "@typescript-eslint/eslint-plugin": "^5.31.0", + "@typescript-eslint/parser": "^5.31.0", + "@vitejs/plugin-react": "^2.0.0", + "@vitest/ui": "^0.20.3", + "autoprefixer": "^10.4.8", + "eslint": "^8.20.0", "eslint-config-standard": "^17.0.0", - "eslint-config-standard-with-typescript": "^34.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.6.1", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "jsdom": "^21.1.0", - "mprocs": "^0.6.4", - "nodemon": "^2.0.20", - "postcss": "^8.4.21", - "sass": "^1.58.0", - "tailwindcss": "^3.2.4", - "typescript": "^4.9.5", - "vite": "^4.1.1", - "vitest": "^0.28.4" + "eslint-config-standard-with-typescript": "^22.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.2.4", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.30.1", + "jsdom": "^20.0.0", + "postcss": "^8.4.14", + "sass": "^1.54.0", + "tailwindcss": "^3.1.7", + "typescript": "^4.6.4", + "vite": "^3.0.0", + "vitest": "^0.20.3" } }, - "node_modules/@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", - "dev": true - }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -87,34 +68,34 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "engines": { @@ -135,14 +116,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.18.9", "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -163,16 +143,27 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -182,15 +173,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -200,12 +182,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -216,13 +192,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -253,40 +229,40 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -304,42 +280,33 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -360,9 +327,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -371,6 +338,55 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", @@ -387,12 +403,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", + "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -405,6 +421,7 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -413,33 +430,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", + "@babel/generator": "^7.18.9", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -448,381 +465,43 @@ } }, "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@emotion/memoize": "0.7.4" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", - "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", + "espree": "^9.3.2", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -831,15 +510,12 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -851,50 +527,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@heroicons/react": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.16.tgz", - "integrity": "sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", "peerDependencies": { "react": ">= 16" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -951,19 +605,97 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + "node_modules/@motionone/animation": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.13.1.tgz", + "integrity": "sha512-dxQ+1wWxL6iFHDy1uv6hhcPjIdOg36eDT56jN4LI7Z5HZRyLpq8x1t7JFQclo/IEIb+6Bk4atmyinGFdXVECuA==", + "dependencies": { + "@motionone/easing": "^10.13.1", + "@motionone/types": "^10.13.0", + "@motionone/utils": "^10.13.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/animation/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@motionone/dom": { + "version": "10.12.0", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz", + "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==", + "dependencies": { + "@motionone/animation": "^10.12.0", + "@motionone/generators": "^10.12.0", + "@motionone/types": "^10.12.0", + "@motionone/utils": "^10.12.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@motionone/easing": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.13.1.tgz", + "integrity": "sha512-INEsInHHDHVgx0dp5qlXi1lMXBqYicgLMMSn3zfGzaIvcaEbI1Uz8BoyNV4BiclTupG7RYIh+T6BU83ZcEe74g==", + "dependencies": { + "@motionone/utils": "^10.13.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@motionone/generators": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.13.1.tgz", + "integrity": "sha512-+HK5u2YcNJCckTTqfOLgSVcrWv2z1dVwrSZEMVJuAh0EnWEWGDJRvMBoPc0cFf/osbkA2Rq9bH2+vP0Ex/D8uw==", + "dependencies": { + "@motionone/types": "^10.13.0", + "@motionone/utils": "^10.13.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@motionone/types": { + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.13.0.tgz", + "integrity": "sha512-qegk4qg8U1N9ZwAJ187BG3TkZz1k9LP/pvNtCSlqdq/PMUDKlCFG4ZnjJ481P0IOH/vIw1OzIbKIuyg0A3rk9g==" + }, + "node_modules/@motionone/utils": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.13.1.tgz", + "integrity": "sha512-TjDPTIppaf3ofBXQv4ZzAketJgN0sclALXfZ6mfrkjJkOy83mLls9744F+6S+VKCpBmvbZcBY4PQfrfhAfeMtA==", + "dependencies": { + "@motionone/types": "^10.13.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/utils/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -1006,248 +738,21 @@ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", "dev": true }, - "node_modules/@react-hook/latest": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", - "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@react-hook/passive-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", - "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@react-hook/resize-observer": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-1.2.6.tgz", - "integrity": "sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==", - "dependencies": { - "@juggle/resize-observer": "^3.3.1", - "@react-hook/latest": "^1.0.2", - "@react-hook/passive-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@react-hook/size": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@react-hook/size/-/size-2.1.2.tgz", - "integrity": "sha512-BmE5asyRDxSuQ9p14FUKJ0iBRgV9cROjqNG9jT/EjCM+xHha1HVqbPoT+14FQg1K7xIydabClCibUY4+1tw/iw==", - "dependencies": { - "@react-hook/passive-layout-effect": "^1.2.0", - "@react-hook/resize-observer": "^1.2.1" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, "node_modules/@sinclair/typebox": { "version": "0.24.26", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.26.tgz", "integrity": "sha512-1ZVIyyS1NXDRVT8GjWD5jULjhDyM3IsIHef2VGUMdnWOlX2tkPjyEX/7K0TGSH2S8EaPhp1ylFdjSjUGQ+gecg==", "dev": true }, - "node_modules/@swc/core": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.36.tgz", - "integrity": "sha512-Ogrd9uRNIj7nHjXxG66UlKBIcXESUenJ7OD6K2a8p82qlg6ne7Ne5Goiipm/heHYhSfVmjcnRWL9ZJ4gv+YCPA==", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.36", - "@swc/core-darwin-x64": "1.3.36", - "@swc/core-linux-arm-gnueabihf": "1.3.36", - "@swc/core-linux-arm64-gnu": "1.3.36", - "@swc/core-linux-arm64-musl": "1.3.36", - "@swc/core-linux-x64-gnu": "1.3.36", - "@swc/core-linux-x64-musl": "1.3.36", - "@swc/core-win32-arm64-msvc": "1.3.36", - "@swc/core-win32-ia32-msvc": "1.3.36", - "@swc/core-win32-x64-msvc": "1.3.36" - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.36.tgz", - "integrity": "sha512-lsP+C8p9cC/Vd9uAbtxpEnM8GoJI/MMnVuXak7OlxOtDH9/oTwmAcAQTfNGNaH19d2FAIRwf+5RbXCPnxa2Zjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.36.tgz", - "integrity": "sha512-jaLXsozWN5xachl9fPxDMi5nbWq1rRxPAt6ISeiYB6RJk0MQKH1634pOweBBem2pUDDzwDFXFw6f22LTm/cFvA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.36.tgz", - "integrity": "sha512-vcBdTHjoEpvJDbFlgto+S6VwAHzLA9GyCiuNcTU2v4KNQlFzhbO4A4PMfMCb/Z0RLJEr16tirfHdWIxjU3h8nw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.36.tgz", - "integrity": "sha512-o7f5OsvwWppJo+qIZmrGO5+XC6DPt6noecSbRHjF6o1YAcR13ETPC14k1eC9H1YbQwpyCFNVAFXyNcUbCeQyrQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.36.tgz", - "integrity": "sha512-FSHPngMi3c0fuGt9yY2Ubn5UcELi3EiPLJxBSC3X8TF9atI/WHZzK9PE9Gtn0C/LyRh4CoyOugDtSOPzGYmLQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.36.tgz", - "integrity": "sha512-PHSsH2rek5pr3e0K09VgWAbrWK2vJhaI7MW9TPoTjyACYjcs3WwjcjQ30MghXUs2Dc/bXjWAOi9KFTjq/uCyFg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.36.tgz", - "integrity": "sha512-4LfMYQHzozHCKkIcmQy83b+4SpI+mOp6sYNbXqSRz5dYvTVjegKZXe596P1U/87cK2cgR4uYvkgkgBXquaWvwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.36.tgz", - "integrity": "sha512-7y3dDcun79TAjCyk3Iv0eOMw1X/KNQbkVyKOGqnEgq9g22F8F1FoUGKHNTzUqVdzpHeJSsHgW5PlkEkl3c/d9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.36.tgz", - "integrity": "sha512-zK0VR3B4LX5hzQ+7eD+K+FkxJlJg5Lo36BeahMzQ+/i0IURpnuyFlW88sdkFkMsc2swdU6bpvxLZeIRQ3W4OUg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.36.tgz", - "integrity": "sha512-2bIjr9DhAckGiXZEvj6z2z7ECPcTimG+wD0VuQTvr+wkx46uAJKl5Kq+Zk+dd15ErL7JGUtCet1T7bf1k4FwvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@testing-library/dom": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz", - "integrity": "sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", + "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", + "@types/aria-query": "^4.2.0", "aria-query": "^5.0.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", @@ -1329,16 +834,16 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", - "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", + "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", "dev": true, "dependencies": { - "@adobe/css-tools": "^4.0.1", "@babel/runtime": "^7.9.2", "@types/testing-library__jest-dom": "^5.9.1", "aria-query": "^5.0.0", "chalk": "^3.0.0", + "css": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.5.6", "lodash": "^4.17.15", @@ -1418,9 +923,9 @@ } }, "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.3.0.tgz", + "integrity": "sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.12.5", @@ -1436,9 +941,9 @@ } }, "node_modules/@testing-library/user-event": { - "version": "14.4.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", - "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "version": "14.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.1.tgz", + "integrity": "sha512-Gr20dje1RaNxZ1ehHGPvFkLswfetBQKCfRD/lo6sUJQ52X2TV/QnqUpkjoShfEebrB2KiTPfQkcONwdQiofLhg==", "dev": true, "engines": { "node": ">=12", @@ -1458,15 +963,15 @@ } }, "node_modules/@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz", + "integrity": "sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==", "dev": true }, "node_modules/@types/chai-subset": { @@ -1534,9 +1039,10 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", - "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==" + "version": "18.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz", + "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==", + "dev": true }, "node_modules/@types/prop-types": { "version": "15.7.5", @@ -1545,9 +1051,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.0.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", + "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -1556,9 +1062,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", "dev": true, "dependencies": { "@types/react": "*" @@ -1573,27 +1079,12 @@ "@types/react": "*" } }, - "node_modules/@types/react-window": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", - "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.5", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", @@ -1604,18 +1095,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.31.0.tgz", + "integrity": "sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/scope-manager": "5.31.0", + "@typescript-eslint/type-utils": "5.31.0", + "@typescript-eslint/utils": "5.31.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -1638,14 +1128,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.31.0.tgz", + "integrity": "sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.31.0", + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/typescript-estree": "5.31.0", "debug": "^4.3.4" }, "engines": { @@ -1665,13 +1155,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.31.0.tgz", + "integrity": "sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/visitor-keys": "5.31.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1682,13 +1172,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.31.0.tgz", + "integrity": "sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/utils": "5.31.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1709,9 +1198,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.31.0.tgz", + "integrity": "sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1722,13 +1211,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.31.0.tgz", + "integrity": "sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/visitor-keys": "5.31.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1749,19 +1238,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.31.0.tgz", + "integrity": "sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.31.0", + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/typescript-estree": "5.31.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "eslint-utils": "^3.0.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1775,12 +1262,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.31.0.tgz", + "integrity": "sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.31.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1792,109 +1279,45 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", - "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.0.0.tgz", + "integrity": "sha512-zHkRR+X4zqEPNBbKV2FvWSxK7Q6crjMBVIAYroSU8Nbb4M3E5x4qOiLoqJBHtXgr27kfednXjkwr3lr8jS6Wrw==", "dev": true, "dependencies": { - "@babel/core": "^7.20.12", + "@babel/core": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", + "@babel/plugin-transform-react-jsx-source": "^7.18.6", + "magic-string": "^0.26.2", "react-refresh": "^0.14.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14.18.0" }, "peerDependencies": { - "vite": "^4.1.0-beta.0" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.2.0.tgz", - "integrity": "sha512-IcBoXL/mcH7JdQr/nfDlDwTdIaH8Rg7LpfQDF4nAht+juHWIuv6WhpKPCSfY4+zztAaB07qdBoFz1XCZsgo3pQ==", - "dev": true, - "dependencies": { - "@swc/core": "^1.3.35" - }, - "peerDependencies": { - "vite": "^4" - } - }, - "node_modules/@vitest/expect": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.28.5.tgz", - "integrity": "sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.28.5", - "@vitest/utils": "0.28.5", - "chai": "^4.3.7" - } - }, - "node_modules/@vitest/runner": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.28.5.tgz", - "integrity": "sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.28.5", - "p-limit": "^4.0.0", - "pathe": "^1.1.0" - } - }, - "node_modules/@vitest/spy": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.28.5.tgz", - "integrity": "sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==", - "dev": true, - "dependencies": { - "tinyspy": "^1.0.2" + "vite": "^3.0.0" } }, "node_modules/@vitest/ui": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.28.5.tgz", - "integrity": "sha512-hzzZzv38mH/LMFh54QEJpWFuGixZZBOD+C0fHU81d1lsvochPwNZhWJbuRJQNyZLSMZYCYW4hF6PpNQJXDHDmg==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.20.3.tgz", + "integrity": "sha512-Rlg+y3PtE5IcGPVmViF/BXM7euY7LG0yjfIvXKlF0L3OnNSVS8+esgLlAhaYftSJXtcunqa/cYXiQ+qFVTaBGw==", "dev": true, "dependencies": { - "fast-glob": "^3.2.12", - "flatted": "^3.2.7", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", "sirv": "^2.0.2" } }, - "node_modules/@vitest/utils": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.28.5.tgz", - "integrity": "sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==", - "dev": true, - "dependencies": { - "cli-truncate": "^3.1.0", - "diff": "^5.1.0", - "loupe": "^2.3.6", - "picocolors": "^1.0.0", - "pretty-format": "^27.5.1" - } - }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1904,20 +1327,23 @@ } }, "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { "node": ">=0.4.0" } @@ -2047,15 +1473,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" }, "engines": { @@ -2075,14 +1501,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2093,14 +1519,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2110,19 +1536,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2138,10 +1551,22 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", + "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", "dev": true, "funding": [ { @@ -2154,8 +1579,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.3", + "caniuse-lite": "^1.0.30001373", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -2171,18 +1596,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2220,10 +1633,16 @@ "node": ">=8" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "funding": [ { @@ -2236,10 +1655,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "update-browserslist-db": "^1.0.5" }, "bin": { "browserslist": "cli.js" @@ -2248,12 +1667,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -2263,15 +1676,6 @@ "semver": "^7.0.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2304,9 +1708,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", "dev": true, "funding": [ { @@ -2320,14 +1724,14 @@ ] }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^4.1.2", + "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -2399,22 +1803,6 @@ "node": ">= 6" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2471,6 +1859,17 @@ "node": ">= 8" } }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -2551,21 +1950,30 @@ } }, "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.12" } }, "node_modules/deep-is": { @@ -2628,15 +2036,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -2694,28 +2093,16 @@ "node": ">=12" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", "dev": true }, "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", "dev": true, "engines": { "node": ">=0.12" @@ -2725,44 +2112,34 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", + "object.assign": "^4.1.2", "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2771,20 +2148,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -2812,9 +2175,9 @@ } }, "node_modules/esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", "dev": true, "hasInstallScript": true, "bin": { @@ -2824,28 +2187,346 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz", + "integrity": "sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz", + "integrity": "sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz", + "integrity": "sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz", + "integrity": "sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz", + "integrity": "sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz", + "integrity": "sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz", + "integrity": "sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz", + "integrity": "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz", + "integrity": "sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz", + "integrity": "sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz", + "integrity": "sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz", + "integrity": "sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz", + "integrity": "sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz", + "integrity": "sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz", + "integrity": "sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz", + "integrity": "sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz", + "integrity": "sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz", + "integrity": "sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz", + "integrity": "sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/escalade": { @@ -2857,11 +2538,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2945,16 +2621,13 @@ } }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2964,21 +2637,18 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", + "espree": "^9.3.2", + "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -2989,7 +2659,8 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "bin": { "eslint": "bin/eslint.js" @@ -3028,9 +2699,9 @@ } }, "node_modules/eslint-config-standard-with-typescript": { - "version": "34.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-34.0.0.tgz", - "integrity": "sha512-zhCsI4/A0rJ1ma8sf3RLXYc0gc7yPmdTWRVXMh9dtqeUx3yBQyALH0wosHhk1uQ9QyItynLdNOtcHKNw8G7lQw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-22.0.0.tgz", + "integrity": "sha512-VA36U7UlFpwULvkdnh6MQj5GAV2Q+tT68ALLAwJP0ZuNXU2m0wX07uxX4qyLRdHgSzH4QJ73CveKBuSOYvh7vQ==", "dev": true, "dependencies": { "@typescript-eslint/parser": "^5.0.0", @@ -3046,14 +2717,13 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "resolve": "^1.20.0" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -3066,20 +2736,16 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "dependencies": { - "debug": "^3.2.7" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "engines": { "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -3135,25 +2801,23 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", + "object.values": "^1.1.5", + "resolve": "^1.22.0", "tsconfig-paths": "^3.14.1" }, "engines": { @@ -3164,12 +2828,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -3184,29 +2848,26 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.2.4.tgz", + "integrity": "sha512-tjnVMv2fiXYMnuiIFI8QMtyUFI42SckEEWvi8h68SWGWshfqO6SSCASy24dGMGAiy7NUk6DZt90DM0iNUsmQ5w==", "dev": true, "dependencies": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", "eslint-utils": "^3.0.0", "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "is-core-module": "^2.9.0", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.10.1", + "semver": "^7.3.7" }, "engines": { "node": ">=12.22.0" @@ -3218,34 +2879,10 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-only-warn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.1.0.tgz", - "integrity": "sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", + "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3255,26 +2892,25 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.7" }, "engines": { "node": ">=4" @@ -3283,18 +2919,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3465,26 +3089,10 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3505,60 +3113,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3572,20 +3126,17 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.7.1", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -3602,9 +3153,9 @@ } }, "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3650,9 +3201,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3722,6 +3273,18 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -3736,20 +3299,11 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3777,6 +3331,44 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", + "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", + "dependencies": { + "@motionone/dom": "10.12.0", + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "popmotion": "11.0.3", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": ">=16.8 || ^17.0.0 || ^18.0.0", + "react-dom": ">=16.8 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/framer-motion/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/framesync": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", + "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/framesync/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3821,6 +3413,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -3849,9 +3447,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -3919,21 +3517,6 @@ "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3954,24 +3537,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4014,18 +3579,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -4053,6 +3606,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -4113,12 +3671,6 @@ "node": ">= 4" } }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, "node_modules/immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -4176,12 +3728,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.1.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -4189,35 +3741,6 @@ "node": ">= 0.4" } }, - "node_modules/interweave": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/interweave/-/interweave-13.0.0.tgz", - "integrity": "sha512-Mckwj+ix/VtrZu1bRBIIohwrsXj12ZTvJCoYUMZlJmgtvIaQCj0i77eSZ63ckbA1TsPrz2VOvLW9/kTgm5d+mw==", - "dependencies": { - "escape-html": "^1.0.3" - }, - "funding": { - "type": "ko-fi", - "url": "https://ko-fi.com/milesjohnson" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4259,9 +3782,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true, "engines": { "node": ">= 0.4" @@ -4271,9 +3794,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -4306,18 +3829,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4366,15 +3877,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -4439,25 +3941,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -4721,12 +4204,6 @@ "node": ">=8" } }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4745,18 +4222,18 @@ } }, "node_modules/jsdom": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz", - "integrity": "sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz", + "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", "dev": true, "dependencies": { "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", + "acorn": "^8.7.1", + "acorn-globals": "^6.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", + "decimal.js": "^10.3.1", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", @@ -4764,17 +4241,18 @@ "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", + "nwsapi": "^2.2.0", + "parse5": "^7.0.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0", - "ws": "^8.11.0", + "ws": "^8.8.0", "xml-name-validator": "^4.0.0" }, "engines": { @@ -4814,9 +4292,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -4825,12 +4303,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "node_modules/jsx-ast-utils": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz", @@ -4878,6 +4350,19 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -4902,9 +4387,9 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", "dev": true, "dependencies": { "get-func-name": "^2.0.0" @@ -4932,22 +4417,17 @@ } }, "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "sourcemap-codec": "^1.4.8" }, "engines": { "node": ">=12" } }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5018,30 +4498,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "node_modules/mlly": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", - "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.2", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "ufo": "^1.1.0" - } - }, - "node_modules/mprocs": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/mprocs/-/mprocs-0.6.4.tgz", - "integrity": "sha512-Y4eqnAjp3mjy0eT+zPoMQ+P/ISOzjgRG/4kh4I5cRA4Tv0rPxTCBRadn3+j+boMF5id7IoLhrVq9NFWFPuzD9A==", - "dev": true, - "bin": { - "mprocs": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -5075,79 +4531,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "node_modules/nodemon": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", - "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5167,9 +4556,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", "dev": true }, "node_modules/object-assign": { @@ -5190,9 +4579,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5208,14 +4597,14 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", "object-keys": "^1.1.1" }, "engines": { @@ -5226,28 +4615,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" @@ -5257,27 +4646,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dev": true, "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" @@ -5313,30 +4702,36 @@ } }, "node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "yocto-queue": "^1.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/p-limit/node_modules/yocto-queue": { + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/parent-module": { @@ -5352,17 +4747,26 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", "dev": true, "dependencies": { - "entities": "^4.4.0" + "entities": "^4.3.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5396,12 +4800,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", - "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", - "dev": true - }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -5438,21 +4836,26 @@ "node": ">=0.10.0" } }, - "node_modules/pkg-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", - "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", - "dev": true, + "node_modules/popmotion": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", + "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==", "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.1.1", - "pathe": "^1.1.0" + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" } }, + "node_modules/popmotion/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, "funding": [ { @@ -5539,12 +4942,12 @@ } }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.6" }, "engines": { "node": ">=12.0" @@ -5558,9 +4961,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -5633,12 +5036,6 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5648,12 +5045,6 @@ "node": ">=6" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5724,31 +5115,18 @@ } }, "node_modules/react-svg-pan-zoom": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.12.1.tgz", - "integrity": "sha512-ug1LHCN5qed56C64xFypr/ClajuMFkig1OKvwJrIgGeSyHOjWM7XGgSgeP3IfHAkNw8QEc6a31ggZRpTijWYRw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.11.0.tgz", + "integrity": "sha512-xK2tpfp4YksHOfyMZH5zXP52ARLSBgkoJgWNJmJ1B+6O1tkuf23TQp7Q4m9GG5IRSK5KWO0JEGEWlNYG9+iiug==", "dependencies": { - "prop-types": "^15.8.1", - "transformation-matrix": "^2.14.0" + "prop-types": "^15.8.0", + "transformation-matrix": "^2.11.1" }, "funding": { - "url": "https://github.com/sponsors/chrvadala" - } - }, - "node_modules/react-window": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz", - "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" + "url": "https://www.paypal.me/chrvadala/25" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "react": ">=17.0.0" } }, "node_modules/read-cache": { @@ -5788,7 +5166,8 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", @@ -5819,12 +5198,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -5877,16 +5250,15 @@ } }, "node_modules/rollup": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.17.3.tgz", - "integrity": "sha512-p5LaCXiiOL/wrOkj8djsIDFmyU9ysUxcyW+EKRLHb6TKldJzXpImjcRSR+vgo09DBdofGcOoLOsRyxxG2n5/qQ==", + "version": "2.77.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", + "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": ">=10.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" @@ -5921,20 +5293,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5942,9 +5300,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -6028,33 +5386,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/sirv": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", @@ -6078,34 +5409,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6124,85 +5427,36 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "node_modules/std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", - "dev": true - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" }, "funding": { @@ -6210,28 +5464,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "es-abstract": "^1.19.5" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6282,18 +5536,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, + "node_modules/style-value-types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", + "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==", "dependencies": { - "acorn": "^8.8.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "hey-listen": "^1.0.8", + "tslib": "^2.1.0" } }, + "node_modules/style-value-types/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6318,25 +5574,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sweetalert2": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.2.tgz", - "integrity": "sha512-atPjDa3fv/4xwZpiAt7FZUgAhR5VAASiLP2hu7HUeVDXx+v4/9nD1W0u8xal1e9f2/qGh0DwTxPXPV9XoZIBvg==", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/limonte" - } - }, - "node_modules/sweetalert2-react-content": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/sweetalert2-react-content/-/sweetalert2-react-content-5.0.7.tgz", - "integrity": "sha512-8Fk82Mpk45lFXpJWKIFF/lq8k/dJKDDQGFcuqVosaL/qRdViyAs5+u37LoTGfnOIvf+rfQB3PAXcp1XLLn+0ew==", - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0", - "sweetalert2": "^11.0.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -6344,9 +5581,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz", + "integrity": "sha512-r7mgumZ3k0InfVPpGWcX8X/Ut4xBfv+1O/+C73ar/m01LxGVzWvPxF/w6xIUPEztrCoz7axfx0SMdh8FH8ZvRQ==", "dev": true, "dependencies": { "arg": "^5.0.2", @@ -6355,20 +5592,19 @@ "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", + "postcss": "^8.4.14", "postcss-import": "^14.1.0", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", "resolve": "^1.22.1" @@ -6396,25 +5632,19 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/tinybench": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", - "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", - "dev": true - }, "node_modules/tinypool": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", - "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.2.4.tgz", + "integrity": "sha512-Vs3rhkUH6Qq1t5bqtb816oT+HeJTXfwt2cbPH17sWHIYKTotQIFPk3tf2fgqRrVyMDVOc1EnPgzIxfIulXVzwQ==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", - "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.0.tgz", + "integrity": "sha512-FI5B2QdODQYDRjfuLF+OrJ8bjWRMCXokQPcwKm0W3IzcbUmBNv536cQc7eXGoAuXphZwgx1DFbqImwzz08Fnhw==", "dev": true, "engines": { "node": ">=14.0.0" @@ -6450,28 +5680,15 @@ "node": ">=6" } }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "universalify": "^0.1.2" }, "engines": { "node": ">=6" @@ -6490,11 +5707,11 @@ } }, "node_modules/transformation-matrix": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.14.0.tgz", - "integrity": "sha512-iG8EAVSSIXHrIMO5B9gzUGZlIOfIjRpsuNaeqpInuGWVlM52vFDdOYUbjyFE4LsUCw5GoD51/Lvpo00Whs6ecQ==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.12.0.tgz", + "integrity": "sha512-BbzXM7el7rNwIr1s87m8tcffH5qgY+HYROLn3BStRU9Y6vYTL37YZKadfNPEvGbP813iA1h8qflo4pa2TomkyQ==", "funding": { - "url": "https://github.com/sponsors/chrvadala" + "url": "https://www.paypal.me/chrvadala/25" } }, "node_modules/tsconfig-paths": { @@ -6575,24 +5792,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6602,12 +5805,6 @@ "node": ">=4.2.0" } }, - "node_modules/ufo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz", - "integrity": "sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==", - "dev": true - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -6623,25 +5820,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", "dev": true, "funding": [ { @@ -6673,32 +5864,28 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "node_modules/vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.4.tgz", + "integrity": "sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==", "dev": true, "dependencies": { - "esbuild": "^0.16.14", - "postcss": "^8.4.21", + "esbuild": "^0.14.47", + "postcss": "^8.4.14", "resolve": "^1.22.1", - "rollup": "^3.10.0" + "rollup": "^2.75.6" }, "bin": { "vite": "bin/vite.js" @@ -6710,17 +5897,12 @@ "fsevents": "~2.3.2" }, "peerDependencies": { - "@types/node": ">= 14", "less": "*", "sass": "*", "stylus": "*", - "sugarss": "*", "terser": "^5.4.0" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, "less": { "optional": true }, @@ -6730,69 +5912,26 @@ "stylus": { "optional": true }, - "sugarss": { - "optional": true - }, "terser": { "optional": true } } }, - "node_modules/vite-node": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.5.tgz", - "integrity": "sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", - "source-map": "^0.6.1", - "source-map-support": "^0.5.21", - "vite": "^3.0.0 || ^4.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.16.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/vitest": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.28.5.tgz", - "integrity": "sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.20.3.tgz", + "integrity": "sha512-cXMjTbZxBBUUuIF3PUzEGPLJWtIMeURBDXVxckSHpk7xss4JxkiiWh5cnIlfGyfJne2Ii3QpbiRuFL5dMJtljw==", "dev": true, "dependencies": { - "@types/chai": "^4.3.4", + "@types/chai": "^4.3.1", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.28.5", - "@vitest/runner": "0.28.5", - "@vitest/spy": "0.28.5", - "@vitest/utils": "0.28.5", - "acorn": "^8.8.1", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", + "chai": "^4.3.6", "debug": "^4.3.4", "local-pkg": "^0.4.2", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", - "source-map": "^0.6.1", - "std-env": "^3.3.1", - "strip-literal": "^1.0.0", - "tinybench": "^2.3.1", - "tinypool": "^0.3.1", - "tinyspy": "^1.0.2", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.28.5", - "why-is-node-running": "^2.2.2" + "tinypool": "^0.2.4", + "tinyspy": "^1.0.0", + "vite": "^2.9.12 || ^3.0.0-0" }, "bin": { "vitest": "vitest.mjs" @@ -6807,6 +5946,7 @@ "@edge-runtime/vm": "*", "@vitest/browser": "*", "@vitest/ui": "*", + "c8": "*", "happy-dom": "*", "jsdom": "*" }, @@ -6820,6 +5960,9 @@ "@vitest/ui": { "optional": true }, + "c8": { + "optional": true + }, "happy-dom": { "optional": true }, @@ -6828,25 +5971,25 @@ } } }, - "node_modules/vitest/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, - "engines": { - "node": ">=0.4.0" + "dependencies": { + "browser-process-hrtime": "^1.0.0" } }, "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", "dev": true, "dependencies": { "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=12" } }, "node_modules/webidl-conversions": { @@ -6923,42 +6066,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -6975,16 +6082,16 @@ "dev": true }, "node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -7033,27 +6140,9 @@ "engines": { "node": ">= 6" } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } }, "dependencies": { - "@adobe/css-tools": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", - "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", - "dev": true - }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -7074,31 +6163,31 @@ } }, "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true }, "@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", "dev": true, "requires": { - "@ampproject/remapping": "^2.2.0", + "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.1", "semver": "^6.3.0" }, "dependencies": { @@ -7111,14 +6200,13 @@ } }, "@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.18.9", "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -7135,39 +6223,32 @@ } } }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.5", + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -7178,13 +6259,13 @@ "dev": true }, "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { @@ -7206,34 +6287,34 @@ } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { @@ -7245,33 +6326,27 @@ "@babel/types": "^7.18.6" } }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { @@ -7286,11 +6361,42 @@ } }, "@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, "@babel/plugin-transform-react-jsx-self": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", @@ -7301,226 +6407,87 @@ } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", + "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/runtime": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" } }, "@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", + "@babel/generator": "^7.18.9", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, - "@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", - "dev": true, - "optional": true + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "requires": { + "@emotion/memoize": "0.7.4" + } }, - "@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", - "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", - "dev": true, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, "@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", + "espree": "^9.3.2", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -7529,9 +6496,9 @@ }, "dependencies": { "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -7539,35 +6506,23 @@ } } }, - "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", - "dev": true - }, "@heroicons/react": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.16.tgz", - "integrity": "sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", "requires": {} }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.5" + "minimatch": "^3.0.4" } }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -7612,19 +6567,107 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + "@motionone/animation": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.13.1.tgz", + "integrity": "sha512-dxQ+1wWxL6iFHDy1uv6hhcPjIdOg36eDT56jN4LI7Z5HZRyLpq8x1t7JFQclo/IEIb+6Bk4atmyinGFdXVECuA==", + "requires": { + "@motionone/easing": "^10.13.1", + "@motionone/types": "^10.13.0", + "@motionone/utils": "^10.13.1", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "@motionone/dom": { + "version": "10.12.0", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz", + "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==", + "requires": { + "@motionone/animation": "^10.12.0", + "@motionone/generators": "^10.12.0", + "@motionone/types": "^10.12.0", + "@motionone/utils": "^10.12.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "@motionone/easing": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.13.1.tgz", + "integrity": "sha512-INEsInHHDHVgx0dp5qlXi1lMXBqYicgLMMSn3zfGzaIvcaEbI1Uz8BoyNV4BiclTupG7RYIh+T6BU83ZcEe74g==", + "requires": { + "@motionone/utils": "^10.13.1", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "@motionone/generators": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.13.1.tgz", + "integrity": "sha512-+HK5u2YcNJCckTTqfOLgSVcrWv2z1dVwrSZEMVJuAh0EnWEWGDJRvMBoPc0cFf/osbkA2Rq9bH2+vP0Ex/D8uw==", + "requires": { + "@motionone/types": "^10.13.0", + "@motionone/utils": "^10.13.1", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "@motionone/types": { + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.13.0.tgz", + "integrity": "sha512-qegk4qg8U1N9ZwAJ187BG3TkZz1k9LP/pvNtCSlqdq/PMUDKlCFG4ZnjJ481P0IOH/vIw1OzIbKIuyg0A3rk9g==" + }, + "@motionone/utils": { + "version": "10.13.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.13.1.tgz", + "integrity": "sha512-TjDPTIppaf3ofBXQv4ZzAketJgN0sclALXfZ6mfrkjJkOy83mLls9744F+6S+VKCpBmvbZcBY4PQfrfhAfeMtA==", + "requires": { + "@motionone/types": "^10.13.0", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -7658,140 +6701,21 @@ "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", "dev": true }, - "@react-hook/latest": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz", - "integrity": "sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==", - "requires": {} - }, - "@react-hook/passive-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.1.tgz", - "integrity": "sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==", - "requires": {} - }, - "@react-hook/resize-observer": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@react-hook/resize-observer/-/resize-observer-1.2.6.tgz", - "integrity": "sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==", - "requires": { - "@juggle/resize-observer": "^3.3.1", - "@react-hook/latest": "^1.0.2", - "@react-hook/passive-layout-effect": "^1.2.0" - } - }, - "@react-hook/size": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@react-hook/size/-/size-2.1.2.tgz", - "integrity": "sha512-BmE5asyRDxSuQ9p14FUKJ0iBRgV9cROjqNG9jT/EjCM+xHha1HVqbPoT+14FQg1K7xIydabClCibUY4+1tw/iw==", - "requires": { - "@react-hook/passive-layout-effect": "^1.2.0", - "@react-hook/resize-observer": "^1.2.1" - } - }, "@sinclair/typebox": { "version": "0.24.26", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.26.tgz", "integrity": "sha512-1ZVIyyS1NXDRVT8GjWD5jULjhDyM3IsIHef2VGUMdnWOlX2tkPjyEX/7K0TGSH2S8EaPhp1ylFdjSjUGQ+gecg==", "dev": true }, - "@swc/core": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.36.tgz", - "integrity": "sha512-Ogrd9uRNIj7nHjXxG66UlKBIcXESUenJ7OD6K2a8p82qlg6ne7Ne5Goiipm/heHYhSfVmjcnRWL9ZJ4gv+YCPA==", - "dev": true, - "requires": { - "@swc/core-darwin-arm64": "1.3.36", - "@swc/core-darwin-x64": "1.3.36", - "@swc/core-linux-arm-gnueabihf": "1.3.36", - "@swc/core-linux-arm64-gnu": "1.3.36", - "@swc/core-linux-arm64-musl": "1.3.36", - "@swc/core-linux-x64-gnu": "1.3.36", - "@swc/core-linux-x64-musl": "1.3.36", - "@swc/core-win32-arm64-msvc": "1.3.36", - "@swc/core-win32-ia32-msvc": "1.3.36", - "@swc/core-win32-x64-msvc": "1.3.36" - } - }, - "@swc/core-darwin-arm64": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.36.tgz", - "integrity": "sha512-lsP+C8p9cC/Vd9uAbtxpEnM8GoJI/MMnVuXak7OlxOtDH9/oTwmAcAQTfNGNaH19d2FAIRwf+5RbXCPnxa2Zjw==", - "dev": true, - "optional": true - }, - "@swc/core-darwin-x64": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.36.tgz", - "integrity": "sha512-jaLXsozWN5xachl9fPxDMi5nbWq1rRxPAt6ISeiYB6RJk0MQKH1634pOweBBem2pUDDzwDFXFw6f22LTm/cFvA==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm-gnueabihf": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.36.tgz", - "integrity": "sha512-vcBdTHjoEpvJDbFlgto+S6VwAHzLA9GyCiuNcTU2v4KNQlFzhbO4A4PMfMCb/Z0RLJEr16tirfHdWIxjU3h8nw==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-gnu": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.36.tgz", - "integrity": "sha512-o7f5OsvwWppJo+qIZmrGO5+XC6DPt6noecSbRHjF6o1YAcR13ETPC14k1eC9H1YbQwpyCFNVAFXyNcUbCeQyrQ==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-musl": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.36.tgz", - "integrity": "sha512-FSHPngMi3c0fuGt9yY2Ubn5UcELi3EiPLJxBSC3X8TF9atI/WHZzK9PE9Gtn0C/LyRh4CoyOugDtSOPzGYmLQg==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-gnu": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.36.tgz", - "integrity": "sha512-PHSsH2rek5pr3e0K09VgWAbrWK2vJhaI7MW9TPoTjyACYjcs3WwjcjQ30MghXUs2Dc/bXjWAOi9KFTjq/uCyFg==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-musl": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.36.tgz", - "integrity": "sha512-4LfMYQHzozHCKkIcmQy83b+4SpI+mOp6sYNbXqSRz5dYvTVjegKZXe596P1U/87cK2cgR4uYvkgkgBXquaWvwQ==", - "dev": true, - "optional": true - }, - "@swc/core-win32-arm64-msvc": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.36.tgz", - "integrity": "sha512-7y3dDcun79TAjCyk3Iv0eOMw1X/KNQbkVyKOGqnEgq9g22F8F1FoUGKHNTzUqVdzpHeJSsHgW5PlkEkl3c/d9w==", - "dev": true, - "optional": true - }, - "@swc/core-win32-ia32-msvc": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.36.tgz", - "integrity": "sha512-zK0VR3B4LX5hzQ+7eD+K+FkxJlJg5Lo36BeahMzQ+/i0IURpnuyFlW88sdkFkMsc2swdU6bpvxLZeIRQ3W4OUg==", - "dev": true, - "optional": true - }, - "@swc/core-win32-x64-msvc": { - "version": "1.3.36", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.36.tgz", - "integrity": "sha512-2bIjr9DhAckGiXZEvj6z2z7ECPcTimG+wD0VuQTvr+wkx46uAJKl5Kq+Zk+dd15ErL7JGUtCet1T7bf1k4FwvQ==", - "dev": true, - "optional": true - }, "@testing-library/dom": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz", - "integrity": "sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.16.0.tgz", + "integrity": "sha512-uxF4zmnLHHDlmW4l+0WDjcgLVwCvH+OVLpD8Dfp+Bjfz85prwxWGbwXgJdLtkgjD0qfOzkJF9SmA6YZPsMYX4w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", + "@types/aria-query": "^4.2.0", "aria-query": "^5.0.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", @@ -7851,16 +6775,16 @@ } }, "@testing-library/jest-dom": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", - "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz", + "integrity": "sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==", "dev": true, "requires": { - "@adobe/css-tools": "^4.0.1", "@babel/runtime": "^7.9.2", "@types/testing-library__jest-dom": "^5.9.1", "aria-query": "^5.0.0", "chalk": "^3.0.0", + "css": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.5.6", "lodash": "^4.17.15", @@ -7919,9 +6843,9 @@ } }, "@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.3.0.tgz", + "integrity": "sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==", "dev": true, "requires": { "@babel/runtime": "^7.12.5", @@ -7930,9 +6854,9 @@ } }, "@testing-library/user-event": { - "version": "14.4.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", - "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "version": "14.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.1.tgz", + "integrity": "sha512-Gr20dje1RaNxZ1ehHGPvFkLswfetBQKCfRD/lo6sUJQ52X2TV/QnqUpkjoShfEebrB2KiTPfQkcONwdQiofLhg==", "dev": true, "requires": {} }, @@ -7943,15 +6867,15 @@ "dev": true }, "@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", "dev": true }, "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.1.tgz", + "integrity": "sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==", "dev": true }, "@types/chai-subset": { @@ -8012,9 +6936,10 @@ "dev": true }, "@types/node": { - "version": "18.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", - "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==" + "version": "18.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.3.tgz", + "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==", + "dev": true }, "@types/prop-types": { "version": "15.7.5", @@ -8023,9 +6948,9 @@ "dev": true }, "@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.0.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", + "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", "dev": true, "requires": { "@types/prop-types": "*", @@ -8034,9 +6959,9 @@ } }, "@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", + "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", "dev": true, "requires": { "@types/react": "*" @@ -8051,27 +6976,12 @@ "@types/react": "*" } }, - "@types/react-window": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", - "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, "@types/testing-library__jest-dom": { "version": "5.14.5", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", @@ -8082,71 +6992,69 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", - "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.31.0.tgz", + "integrity": "sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/type-utils": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/scope-manager": "5.31.0", + "@typescript-eslint/type-utils": "5.31.0", + "@typescript-eslint/utils": "5.31.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/parser": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", - "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.31.0.tgz", + "integrity": "sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.31.0", + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/typescript-estree": "5.31.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", - "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.31.0.tgz", + "integrity": "sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0" + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/visitor-keys": "5.31.0" } }, "@typescript-eslint/type-utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", - "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.31.0.tgz", + "integrity": "sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.53.0", - "@typescript-eslint/utils": "5.53.0", + "@typescript-eslint/utils": "5.31.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", - "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.31.0.tgz", + "integrity": "sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", - "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.31.0.tgz", + "integrity": "sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/visitor-keys": "5.53.0", + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/visitor-keys": "5.31.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -8155,142 +7063,79 @@ } }, "@typescript-eslint/utils": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", - "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.31.0.tgz", + "integrity": "sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.53.0", - "@typescript-eslint/types": "5.53.0", - "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/scope-manager": "5.31.0", + "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/typescript-estree": "5.31.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", - "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.31.0.tgz", + "integrity": "sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/types": "5.31.0", "eslint-visitor-keys": "^3.3.0" } }, "@vitejs/plugin-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", - "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.0.0.tgz", + "integrity": "sha512-zHkRR+X4zqEPNBbKV2FvWSxK7Q6crjMBVIAYroSU8Nbb4M3E5x4qOiLoqJBHtXgr27kfednXjkwr3lr8jS6Wrw==", "dev": true, "requires": { - "@babel/core": "^7.20.12", + "@babel/core": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", + "@babel/plugin-transform-react-jsx-source": "^7.18.6", + "magic-string": "^0.26.2", "react-refresh": "^0.14.0" } }, - "@vitejs/plugin-react-swc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.2.0.tgz", - "integrity": "sha512-IcBoXL/mcH7JdQr/nfDlDwTdIaH8Rg7LpfQDF4nAht+juHWIuv6WhpKPCSfY4+zztAaB07qdBoFz1XCZsgo3pQ==", - "dev": true, - "requires": { - "@swc/core": "^1.3.35" - } - }, - "@vitest/expect": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.28.5.tgz", - "integrity": "sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==", - "dev": true, - "requires": { - "@vitest/spy": "0.28.5", - "@vitest/utils": "0.28.5", - "chai": "^4.3.7" - } - }, - "@vitest/runner": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.28.5.tgz", - "integrity": "sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==", - "dev": true, - "requires": { - "@vitest/utils": "0.28.5", - "p-limit": "^4.0.0", - "pathe": "^1.1.0" - } - }, - "@vitest/spy": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.28.5.tgz", - "integrity": "sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==", - "dev": true, - "requires": { - "tinyspy": "^1.0.2" - } - }, "@vitest/ui": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.28.5.tgz", - "integrity": "sha512-hzzZzv38mH/LMFh54QEJpWFuGixZZBOD+C0fHU81d1lsvochPwNZhWJbuRJQNyZLSMZYCYW4hF6PpNQJXDHDmg==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.20.3.tgz", + "integrity": "sha512-Rlg+y3PtE5IcGPVmViF/BXM7euY7LG0yjfIvXKlF0L3OnNSVS8+esgLlAhaYftSJXtcunqa/cYXiQ+qFVTaBGw==", "dev": true, "requires": { - "fast-glob": "^3.2.12", - "flatted": "^3.2.7", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", "sirv": "^2.0.2" } }, - "@vitest/utils": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.28.5.tgz", - "integrity": "sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==", - "dev": true, - "requires": { - "cli-truncate": "^3.1.0", - "diff": "^5.1.0", - "loupe": "^2.3.6", - "picocolors": "^1.0.0", - "pretty-format": "^27.5.1" - } - }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" }, "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true } } @@ -8392,15 +7237,15 @@ "dev": true }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" } }, @@ -8411,42 +7256,29 @@ "dev": true }, "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", "es-shim-unscopables": "^1.0.0" } }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -8459,26 +7291,26 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", + "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", "dev": true, "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.3", + "caniuse-lite": "^1.0.30001373", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -8510,24 +7342,24 @@ "fill-range": "^7.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "update-browserslist-db": "^1.0.5" } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -8537,12 +7369,6 @@ "semver": "^7.0.0" } }, - "cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -8566,20 +7392,20 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", "dev": true }, "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^4.1.2", + "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -8630,16 +7456,6 @@ } } }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -8690,6 +7506,17 @@ "which": "^2.0.1" } }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, "css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -8752,15 +7579,21 @@ } }, "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", "dev": true }, "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -8811,12 +7644,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, "diff-sequences": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", @@ -8862,80 +7689,47 @@ "webidl-conversions": "^7.0.0" } }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "electron-to-chromium": { - "version": "1.4.270", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", - "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", "dev": true }, "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", "dev": true }, "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.1.1", "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", + "object.assign": "^4.1.2", "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" } }, "es-shim-unscopables": { @@ -8959,46 +7753,179 @@ } }, "esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.51.tgz", + "integrity": "sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==", "dev": true, "requires": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" + "esbuild-android-64": "0.14.51", + "esbuild-android-arm64": "0.14.51", + "esbuild-darwin-64": "0.14.51", + "esbuild-darwin-arm64": "0.14.51", + "esbuild-freebsd-64": "0.14.51", + "esbuild-freebsd-arm64": "0.14.51", + "esbuild-linux-32": "0.14.51", + "esbuild-linux-64": "0.14.51", + "esbuild-linux-arm": "0.14.51", + "esbuild-linux-arm64": "0.14.51", + "esbuild-linux-mips64le": "0.14.51", + "esbuild-linux-ppc64le": "0.14.51", + "esbuild-linux-riscv64": "0.14.51", + "esbuild-linux-s390x": "0.14.51", + "esbuild-netbsd-64": "0.14.51", + "esbuild-openbsd-64": "0.14.51", + "esbuild-sunos-64": "0.14.51", + "esbuild-windows-32": "0.14.51", + "esbuild-windows-64": "0.14.51", + "esbuild-windows-arm64": "0.14.51" } }, + "esbuild-android-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.51.tgz", + "integrity": "sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.51.tgz", + "integrity": "sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.51.tgz", + "integrity": "sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.51.tgz", + "integrity": "sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.51.tgz", + "integrity": "sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.51.tgz", + "integrity": "sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.51.tgz", + "integrity": "sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.51.tgz", + "integrity": "sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.51.tgz", + "integrity": "sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.51.tgz", + "integrity": "sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.51.tgz", + "integrity": "sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.51.tgz", + "integrity": "sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.51.tgz", + "integrity": "sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.51.tgz", + "integrity": "sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.51.tgz", + "integrity": "sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.51.tgz", + "integrity": "sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.51.tgz", + "integrity": "sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.51.tgz", + "integrity": "sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.51.tgz", + "integrity": "sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.51", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.51.tgz", + "integrity": "sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -9060,16 +7987,13 @@ } }, "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", "dev": true, "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -9079,21 +8003,18 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", + "espree": "^9.3.2", + "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -9104,7 +8025,8 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-styles": { @@ -9157,20 +8079,10 @@ "estraverse": "^5.2.0" } }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -9182,39 +8094,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9234,9 +8113,9 @@ "requires": {} }, "eslint-config-standard-with-typescript": { - "version": "34.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-34.0.0.tgz", - "integrity": "sha512-zhCsI4/A0rJ1ma8sf3RLXYc0gc7yPmdTWRVXMh9dtqeUx3yBQyALH0wosHhk1uQ9QyItynLdNOtcHKNw8G7lQw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-22.0.0.tgz", + "integrity": "sha512-VA36U7UlFpwULvkdnh6MQj5GAV2Q+tT68ALLAwJP0ZuNXU2m0wX07uxX4qyLRdHgSzH4QJ73CveKBuSOYvh7vQ==", "dev": true, "requires": { "@typescript-eslint/parser": "^5.0.0", @@ -9244,14 +8123,13 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "resolve": "^1.20.0" }, "dependencies": { "debug": { @@ -9266,12 +8144,13 @@ } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", "dev": true, "requires": { - "debug": "^3.2.7" + "debug": "^3.2.7", + "find-up": "^2.1.0" }, "dependencies": { "debug": { @@ -9313,35 +8192,33 @@ } }, "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.8.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", + "object.values": "^1.1.5", + "resolve": "^1.22.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, "doctrine": { @@ -9353,75 +8230,57 @@ "esutils": "^2.0.2" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, "eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "version": "15.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.2.4.tgz", + "integrity": "sha512-tjnVMv2fiXYMnuiIFI8QMtyUFI42SckEEWvi8h68SWGWshfqO6SSCASy24dGMGAiy7NUk6DZt90DM0iNUsmQ5w==", "dev": true, "requires": { "builtins": "^5.0.1", "eslint-plugin-es": "^4.1.0", "eslint-utils": "^3.0.0", "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "is-core-module": "^2.9.0", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "resolve": "^1.10.1", + "semver": "^7.3.7" } }, - "eslint-plugin-only-warn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-only-warn/-/eslint-plugin-only-warn-1.1.0.tgz", - "integrity": "sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==", - "dev": true - }, "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", + "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==", "dev": true, "requires": {} }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz", + "integrity": "sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.3", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.7" }, "dependencies": { "doctrine": { @@ -9452,13 +8311,6 @@ } } }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -9501,12 +8353,12 @@ "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.7.1", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } @@ -9518,9 +8370,9 @@ "dev": true }, "esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -9554,9 +8406,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -9616,6 +8468,15 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -9627,20 +8488,11 @@ } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -9658,6 +8510,42 @@ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true }, + "framer-motion": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", + "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "@motionone/dom": "10.12.0", + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "popmotion": "11.0.3", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "framesync": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", + "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -9689,6 +8577,12 @@ "functions-have-names": "^1.2.2" } }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -9708,9 +8602,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -9757,15 +8651,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -9780,21 +8665,6 @@ "slash": "^3.0.0" } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -9825,12 +8695,6 @@ "get-intrinsic": "^1.1.1" } }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -9846,6 +8710,11 @@ "has-symbols": "^1.0.2" } }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, "html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -9891,12 +8760,6 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, "immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -9942,35 +8805,16 @@ "dev": true }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.1.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, - "interweave": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/interweave/-/interweave-13.0.0.tgz", - "integrity": "sha512-Mckwj+ix/VtrZu1bRBIIohwrsXj12ZTvJCoYUMZlJmgtvIaQCj0i77eSZ63ckbA1TsPrz2VOvLW9/kTgm5d+mw==", - "requires": { - "escape-html": "^1.0.3" - } - }, - "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - } - }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -10000,15 +8844,15 @@ } }, "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" @@ -10029,12 +8873,6 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -10065,12 +8903,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -10114,19 +8946,6 @@ "has-symbols": "^1.0.2" } }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -10326,12 +9145,6 @@ } } }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10347,18 +9160,18 @@ } }, "jsdom": { - "version": "21.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz", - "integrity": "sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz", + "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", "dev": true, "requires": { "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", + "acorn": "^8.7.1", + "acorn-globals": "^6.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", + "decimal.js": "^10.3.1", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", @@ -10366,17 +9179,18 @@ "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", + "nwsapi": "^2.2.0", + "parse5": "^7.0.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0", - "ws": "^8.11.0", + "ws": "^8.8.0", "xml-name-validator": "^4.0.0" } }, @@ -10399,15 +9213,9 @@ "dev": true }, "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true }, "jsx-ast-utils": { @@ -10442,6 +9250,16 @@ "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", "dev": true }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -10463,9 +9281,9 @@ } }, "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", + "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", "dev": true, "requires": { "get-func-name": "^2.0.0" @@ -10487,19 +9305,14 @@ "dev": true }, "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", "dev": true, "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "sourcemap-codec": "^1.4.8" } }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -10552,24 +9365,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "mlly": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", - "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", - "dev": true, - "requires": { - "acorn": "^8.8.2", - "pathe": "^1.1.0", - "pkg-types": "^1.0.1", - "ufo": "^1.1.0" - } - }, - "mprocs": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/mprocs/-/mprocs-0.6.4.tgz", - "integrity": "sha512-Y4eqnAjp3mjy0eT+zPoMQ+P/ISOzjgRG/4kh4I5cRA4Tv0rPxTCBRadn3+j+boMF5id7IoLhrVq9NFWFPuzD9A==", - "dev": true - }, "mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -10594,62 +9389,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "nodemon": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", - "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10663,9 +9408,9 @@ "dev": true }, "nwsapi": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", - "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", "dev": true }, "object-assign": { @@ -10680,9 +9425,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "object-keys": { @@ -10692,58 +9437,58 @@ "dev": true }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "es-abstract": "^1.19.5" } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" } }, "once": { @@ -10770,22 +9515,29 @@ } }, "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "yocto-queue": "^1.0.0" - }, - "dependencies": { - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } + "p-try": "^1.0.0" } }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10796,14 +9548,20 @@ } }, "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", "dev": true, "requires": { - "entities": "^4.4.0" + "entities": "^4.3.0" } }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -10828,12 +9586,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pathe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", - "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", - "dev": true - }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -10858,21 +9610,28 @@ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true }, - "pkg-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", - "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", - "dev": true, + "popmotion": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", + "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==", "requires": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.1.1", - "pathe": "^1.1.0" + "framesync": "6.0.1", + "hey-listen": "^1.0.8", + "style-value-types": "5.0.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -10911,18 +9670,18 @@ } }, "postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.6" } }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -10982,24 +9741,12 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11041,21 +9788,12 @@ "dev": true }, "react-svg-pan-zoom": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.12.1.tgz", - "integrity": "sha512-ug1LHCN5qed56C64xFypr/ClajuMFkig1OKvwJrIgGeSyHOjWM7XGgSgeP3IfHAkNw8QEc6a31ggZRpTijWYRw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-3.11.0.tgz", + "integrity": "sha512-xK2tpfp4YksHOfyMZH5zXP52ARLSBgkoJgWNJmJ1B+6O1tkuf23TQp7Q4m9GG5IRSK5KWO0JEGEWlNYG9+iiug==", "requires": { - "prop-types": "^15.8.1", - "transformation-matrix": "^2.14.0" - } - }, - "react-window": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.8.tgz", - "integrity": "sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" + "prop-types": "^15.8.0", + "transformation-matrix": "^2.11.1" } }, "read-cache": { @@ -11089,7 +9827,8 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true }, "regexp.prototype.flags": { "version": "1.4.3", @@ -11108,12 +9847,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -11147,9 +9880,9 @@ } }, "rollup": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.17.3.tgz", - "integrity": "sha512-p5LaCXiiOL/wrOkj8djsIDFmyU9ysUxcyW+EKRLHb6TKldJzXpImjcRSR+vgo09DBdofGcOoLOsRyxxG2n5/qQ==", + "version": "2.77.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", + "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -11170,17 +9903,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -11188,9 +9910,9 @@ "dev": true }, "sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -11250,29 +9972,6 @@ "object-inspect": "^1.9.0" } }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, "sirv": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", @@ -11290,24 +9989,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11320,92 +10001,58 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" } }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "es-abstract": "^1.19.5" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "es-abstract": "^1.19.5" } }, "strip-ansi": { @@ -11438,13 +10085,20 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, + "style-value-types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", + "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==", "requires": { - "acorn": "^8.8.2" + "hey-listen": "^1.0.8", + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "supports-color": { @@ -11462,17 +10116,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "sweetalert2": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.2.tgz", - "integrity": "sha512-atPjDa3fv/4xwZpiAt7FZUgAhR5VAASiLP2hu7HUeVDXx+v4/9nD1W0u8xal1e9f2/qGh0DwTxPXPV9XoZIBvg==" - }, - "sweetalert2-react-content": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/sweetalert2-react-content/-/sweetalert2-react-content-5.0.7.tgz", - "integrity": "sha512-8Fk82Mpk45lFXpJWKIFF/lq8k/dJKDDQGFcuqVosaL/qRdViyAs5+u37LoTGfnOIvf+rfQB3PAXcp1XLLn+0ew==", - "requires": {} - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -11480,9 +10123,9 @@ "dev": true }, "tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.7.tgz", + "integrity": "sha512-r7mgumZ3k0InfVPpGWcX8X/Ut4xBfv+1O/+C73ar/m01LxGVzWvPxF/w6xIUPEztrCoz7axfx0SMdh8FH8ZvRQ==", "dev": true, "requires": { "arg": "^5.0.2", @@ -11491,20 +10134,19 @@ "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", + "postcss": "^8.4.14", "postcss-import": "^14.1.0", "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.10", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", "resolve": "^1.22.1" @@ -11524,22 +10166,16 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "tinybench": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", - "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", - "dev": true - }, "tinypool": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", - "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.2.4.tgz", + "integrity": "sha512-Vs3rhkUH6Qq1t5bqtb816oT+HeJTXfwt2cbPH17sWHIYKTotQIFPk3tf2fgqRrVyMDVOc1EnPgzIxfIulXVzwQ==", "dev": true }, "tinyspy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", - "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.0.tgz", + "integrity": "sha512-FI5B2QdODQYDRjfuLF+OrJ8bjWRMCXokQPcwKm0W3IzcbUmBNv536cQc7eXGoAuXphZwgx1DFbqImwzz08Fnhw==", "dev": true }, "to-fast-properties": { @@ -11563,25 +10199,15 @@ "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", "dev": true }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "universalify": "^0.1.2" } }, "tr46": { @@ -11594,9 +10220,9 @@ } }, "transformation-matrix": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.14.0.tgz", - "integrity": "sha512-iG8EAVSSIXHrIMO5B9gzUGZlIOfIjRpsuNaeqpInuGWVlM52vFDdOYUbjyFE4LsUCw5GoD51/Lvpo00Whs6ecQ==" + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-2.12.0.tgz", + "integrity": "sha512-BbzXM7el7rNwIr1s87m8tcffH5qgY+HYROLn3BStRU9Y6vYTL37YZKadfNPEvGbP813iA1h8qflo4pa2TomkyQ==" }, "tsconfig-paths": { "version": "3.14.1", @@ -11657,27 +10283,10 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "ufo": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz", - "integrity": "sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "unbox-primitive": { @@ -11692,22 +10301,16 @@ "which-boxed-primitive": "^1.0.2" } }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -11723,95 +10326,61 @@ "punycode": "^2.1.0" } }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "vite": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", - "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", - "dev": true, - "requires": { - "esbuild": "^0.16.14", - "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.10.0" - } + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, - "vite-node": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.5.tgz", - "integrity": "sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==", + "vite": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.4.tgz", + "integrity": "sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==", "dev": true, "requires": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.1.0", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", - "source-map": "^0.6.1", - "source-map-support": "^0.5.21", - "vite": "^3.0.0 || ^4.0.0" + "esbuild": "^0.14.47", + "fsevents": "~2.3.2", + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" } }, "vitest": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.28.5.tgz", - "integrity": "sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==", + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.20.3.tgz", + "integrity": "sha512-cXMjTbZxBBUUuIF3PUzEGPLJWtIMeURBDXVxckSHpk7xss4JxkiiWh5cnIlfGyfJne2Ii3QpbiRuFL5dMJtljw==", "dev": true, "requires": { - "@types/chai": "^4.3.4", + "@types/chai": "^4.3.1", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.28.5", - "@vitest/runner": "0.28.5", - "@vitest/spy": "0.28.5", - "@vitest/utils": "0.28.5", - "acorn": "^8.8.1", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", + "chai": "^4.3.6", "debug": "^4.3.4", "local-pkg": "^0.4.2", - "pathe": "^1.1.0", - "picocolors": "^1.0.0", - "source-map": "^0.6.1", - "std-env": "^3.3.1", - "strip-literal": "^1.0.0", - "tinybench": "^2.3.1", - "tinypool": "^0.3.1", - "tinyspy": "^1.0.2", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.28.5", - "why-is-node-running": "^2.2.2" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } + "tinypool": "^0.2.4", + "tinyspy": "^1.0.0", + "vite": "^2.9.12 || ^3.0.0-0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", "dev": true, "requires": { "xml-name-validator": "^4.0.0" @@ -11870,30 +10439,6 @@ "is-symbol": "^1.0.3" } }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -11907,9 +10452,9 @@ "dev": true }, "ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "requires": {} }, @@ -11942,12 +10487,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff --git a/package.json b/package.json index 36500b7..148f302 100644 --- a/package.json +++ b/package.json @@ -1,72 +1,50 @@ { "name": "svg-layout-designer-react", "private": true, - "version": "v2.0.0", + "version": "0.0.0", "type": "module", - "postinstall": "npx patch-package", "scripts": { - "d": "mprocs", "dev": "vite", "build": "tsc && vite build", - "build:dotnet": "dotnet build ./csharp/SVGLDLibs/SVGLDLibs/SVGLDLibs.csproj", - "linter": "eslint src", + "preview": "vite preview", "test": "vitest", "test:ui": "vitest --ui", "test:nowatch": "vitest run", - "test:full": "(node ./test-server/http.js &) && (dotnet run --project=./csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj &) && sleep 3 && vitest ; pkill dotnet ; pkill node", - "test:full:nowatch": "(node ./test-server/http.js &) && (dotnet run --project=./csharp/SVGLDLibs/SVGLDWebAPI/SVGLDWebAPI.csproj &) && sleep 3 && vitest run ; pkill dotnet ; pkill node", "coverage": "vitest run coverage" }, "dependencies": { - "@heroicons/react": "^2.0.16", - "@react-hook/size": "^2.1.2", - "@types/node": "^18.15.5", - "interweave": "^13.1.0", + "@heroicons/react": "^1.0.6", + "framer-motion": "^6.5.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-svg-pan-zoom": "^3.12.1", - "react-window": "^1.8.8", - "sweetalert2": "^11.7.3", - "sweetalert2-react-content": "^5.0.7", - "transformation-matrix": "^2.15.0" + "react-svg-pan-zoom": "^3.11.0" }, "devDependencies": { - "@testing-library/dom": "^9.0.1", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^14.0.0", - "@testing-library/user-event": "^14.4.3", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", + "@testing-library/dom": "^8.16.1", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.1", + "@types/react": "^18.0.15", + "@types/react-dom": "^18.0.6", "@types/react-svg-pan-zoom": "^3.3.5", - "@types/react-window": "^1.8.5", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "@vitejs/plugin-react": "^3.1.0", - "@vitejs/plugin-react-swc": "^3.2.0", - "@vitest/ui": "^0.29.7", - "autoprefixer": "^10.4.14", - "eslint": "^8.36.0", + "@typescript-eslint/eslint-plugin": "^5.31.0", + "@typescript-eslint/parser": "^5.31.0", + "@vitejs/plugin-react": "^2.0.0", + "@vitest/ui": "^0.20.3", + "autoprefixer": "^10.4.8", + "eslint": "^8.20.0", "eslint-config-standard": "^17.0.0", - "eslint-config-standard-with-typescript": "^34.0.1", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.6.1", - "eslint-plugin-only-warn": "^1.1.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "jsdom": "^21.1.1", - "mprocs": "^0.6.4", - "nodemon": "^2.0.22", - "postcss": "^8.4.21", - "sass": "^1.59.3", - "tailwindcss": "^3.2.7", - "typescript": "^5.0.2", - "vite": "^4.2.1", - "vitest": "^0.29.7" - }, - "pnpm": { - "patchedDependencies": { - "@types/react-svg-pan-zoom@3.3.5": "patches/@types__react-svg-pan-zoom@3.3.5.patch" - } + "eslint-config-standard-with-typescript": "^22.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.2.4", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.30.1", + "jsdom": "^20.0.0", + "postcss": "^8.4.14", + "sass": "^1.54.0", + "tailwindcss": "^3.1.7", + "typescript": "^4.6.4", + "vite": "^3.0.0", + "vitest": "^0.20.3" } } diff --git a/patches/@types+react-svg-pan-zoom+3.3.5.patch b/patches/@types+react-svg-pan-zoom+3.3.5.patch deleted file mode 100644 index b7fc8cc..0000000 --- a/patches/@types+react-svg-pan-zoom+3.3.5.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/node_modules/@types/react-svg-pan-zoom/index.d.ts b/node_modules/@types/react-svg-pan-zoom/index.d.ts -index a57d545..83ace9f 100644 ---- a/node_modules/@types/react-svg-pan-zoom/index.d.ts -+++ b/node_modules/@types/react-svg-pan-zoom/index.d.ts -@@ -256,7 +256,11 @@ export function zoom(value: Value, SVGPointX: number, SVGPointY: number, scaleFa - export function fitSelection( - value: Value, selectionSVGPointX: number, selectionSVGPointY: number, selectionWidth: number, selectionHeight: number): Value; - --export function fitToViewer(value: Value): Value; -+export function fitToViewer( -+ value: Value, -+ SVGAlignX?: typeof ALIGN_CENTER | typeof ALIGN_LEFT | typeof ALIGN_RIGHT | undefined, -+ SVGAlignY?: typeof ALIGN_CENTER | typeof ALIGN_TOP | typeof ALIGN_BOTTOM | undefined -+): Value; - - export function zoomOnViewerCenter(value: Value, scaleFactor: number): Value; - diff --git a/patches/@types__react-svg-pan-zoom@3.3.5.patch b/patches/@types__react-svg-pan-zoom@3.3.5.patch deleted file mode 100644 index 506b048..0000000 --- a/patches/@types__react-svg-pan-zoom@3.3.5.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/index.d.ts b/index.d.ts -index a57d545d33b2798024b9762d3d3513e58a38e19d..83ace9fc85b7354e128948402a50e00083eacd8c 100644 ---- a/index.d.ts -+++ b/index.d.ts -@@ -256,7 +256,11 @@ export function zoom(value: Value, SVGPointX: number, SVGPointY: number, scaleFa - export function fitSelection( - value: Value, selectionSVGPointX: number, selectionSVGPointY: number, selectionWidth: number, selectionHeight: number): Value; - --export function fitToViewer(value: Value): Value; -+export function fitToViewer( -+ value: Value, -+ SVGAlignX?: typeof ALIGN_CENTER | typeof ALIGN_LEFT | typeof ALIGN_RIGHT | undefined, -+ SVGAlignY?: typeof ALIGN_CENTER | typeof ALIGN_TOP | typeof ALIGN_BOTTOM | undefined -+): Value; - - export function zoomOnViewerCenter(value: Value, scaleFactor: number): Value; - \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 819023b..f9bce2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,106 +1,77 @@ lockfileVersion: 5.4 -patchedDependencies: - '@types/react-svg-pan-zoom@3.3.5': - hash: kv3ctd73j5hnzcxdc2ceiq5wuy - path: patches/@types__react-svg-pan-zoom@3.3.5.patch - specifiers: - '@heroicons/react': ^2.0.16 - '@react-hook/size': ^2.1.2 - '@testing-library/dom': ^9.0.1 - '@testing-library/jest-dom': ^5.16.5 - '@testing-library/react': ^14.0.0 - '@testing-library/user-event': ^14.4.3 - '@types/node': ^18.15.5 - '@types/react': ^18.0.28 - '@types/react-dom': ^18.0.11 + '@heroicons/react': ^1.0.6 + '@testing-library/dom': ^8.16.1 + '@testing-library/jest-dom': ^5.16.4 + '@testing-library/react': ^13.3.0 + '@testing-library/user-event': ^14.4.1 + '@types/react': ^18.0.15 + '@types/react-dom': ^18.0.6 '@types/react-svg-pan-zoom': ^3.3.5 - '@types/react-window': ^1.8.5 - '@typescript-eslint/eslint-plugin': ^5.56.0 - '@typescript-eslint/parser': ^5.56.0 - '@vitejs/plugin-react': ^3.1.0 - '@vitejs/plugin-react-swc': ^3.2.0 - '@vitest/ui': ^0.29.7 - autoprefixer: ^10.4.14 - eslint: ^8.36.0 + '@typescript-eslint/eslint-plugin': ^5.31.0 + '@typescript-eslint/parser': ^5.31.0 + '@vitejs/plugin-react': ^2.0.0 + '@vitest/ui': ^0.20.3 + autoprefixer: ^10.4.8 + eslint: ^8.20.0 eslint-config-standard: ^17.0.0 - eslint-config-standard-with-typescript: ^34.0.1 - eslint-plugin-import: ^2.27.5 - eslint-plugin-n: ^15.6.1 - eslint-plugin-only-warn: ^1.1.0 - eslint-plugin-promise: ^6.1.1 - eslint-plugin-react: ^7.32.2 - eslint-plugin-react-hooks: ^4.6.0 - interweave: ^13.1.0 - jsdom: ^21.1.1 - mprocs: ^0.6.4 - nodemon: ^2.0.22 - postcss: ^8.4.21 + eslint-config-standard-with-typescript: ^22.0.0 + eslint-plugin-import: ^2.26.0 + eslint-plugin-n: ^15.2.4 + eslint-plugin-promise: ^6.0.0 + eslint-plugin-react: ^7.30.1 + framer-motion: ^6.5.1 + jsdom: ^20.0.0 + postcss: ^8.4.14 react: ^18.2.0 react-dom: ^18.2.0 - react-svg-pan-zoom: ^3.12.1 - react-window: ^1.8.8 - sass: ^1.59.3 - sweetalert2: ^11.7.3 - sweetalert2-react-content: ^5.0.7 - tailwindcss: ^3.2.7 - transformation-matrix: ^2.15.0 - typescript: ^5.0.2 - vite: ^4.2.1 - vitest: ^0.29.7 + react-svg-pan-zoom: ^3.11.0 + sass: ^1.54.0 + tailwindcss: ^3.1.7 + typescript: ^4.6.4 + vite: ^3.0.0 + vitest: ^0.20.3 dependencies: - '@heroicons/react': 2.0.16_react@18.2.0 - '@react-hook/size': 2.1.2_react@18.2.0 - '@types/node': 18.15.5 - interweave: 13.1.0_react@18.2.0 + '@heroicons/react': 1.0.6_react@18.2.0 + framer-motion: 6.5.1_biqbaboplfbrettd7655fr4n2y react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - react-svg-pan-zoom: 3.12.1 - react-window: 1.8.8_biqbaboplfbrettd7655fr4n2y - sweetalert2: 11.7.3 - sweetalert2-react-content: 5.0.7_r4rqjkexjvnqlr7bwwrf47cmui - transformation-matrix: 2.15.0 + react-svg-pan-zoom: 3.11.0_react@18.2.0 devDependencies: - '@testing-library/dom': 9.0.1 + '@testing-library/dom': 8.16.1 '@testing-library/jest-dom': 5.16.5 - '@testing-library/react': 14.0.0_biqbaboplfbrettd7655fr4n2y - '@testing-library/user-event': 14.4.3_@testing-library+dom@9.0.1 - '@types/react': 18.0.28 - '@types/react-dom': 18.0.11 - '@types/react-svg-pan-zoom': 3.3.5_kv3ctd73j5hnzcxdc2ceiq5wuy - '@types/react-window': 1.8.5 - '@typescript-eslint/eslint-plugin': 5.56.0_2hcjazgfnbtq42tcc73br2vup4 - '@typescript-eslint/parser': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - '@vitejs/plugin-react': 3.1.0_vite@4.2.1 - '@vitejs/plugin-react-swc': 3.2.0_vite@4.2.1 - '@vitest/ui': 0.29.7 - autoprefixer: 10.4.14_postcss@8.4.21 - eslint: 8.36.0 - eslint-config-standard: 17.0.0_htxjg2emk4phzexndh6sfdkv2u - eslint-config-standard-with-typescript: 34.0.1_ukpckrjheukrqojeqftadpcodm - eslint-plugin-import: 2.27.5_cnkxirszkzb4o6ts7gbclno24e - eslint-plugin-n: 15.6.1_eslint@8.36.0 - eslint-plugin-only-warn: 1.1.0 - eslint-plugin-promise: 6.1.1_eslint@8.36.0 - eslint-plugin-react: 7.32.2_eslint@8.36.0 - eslint-plugin-react-hooks: 4.6.0_eslint@8.36.0 - jsdom: 21.1.1 - mprocs: 0.6.4 - nodemon: 2.0.22 - postcss: 8.4.21 - sass: 1.59.3 - tailwindcss: 3.2.7_postcss@8.4.21 - typescript: 5.0.2 - vite: 4.2.1_y7rghahg7ddu72pko63vhsxa44 - vitest: 0.29.7_7ihdbf3sbtvnujsbwplempk3fa + '@testing-library/react': 13.3.0_biqbaboplfbrettd7655fr4n2y + '@testing-library/user-event': 14.4.2_znfriv3ismgf3ybh2woqwlpfea + '@types/react': 18.0.17 + '@types/react-dom': 18.0.6 + '@types/react-svg-pan-zoom': 3.3.5 + '@typescript-eslint/eslint-plugin': 5.32.0_iosr3hrei2tubxveewluhu5lhy + '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + '@vitejs/plugin-react': 2.0.0_vite@3.0.4 + '@vitest/ui': 0.20.3 + autoprefixer: 10.4.8_postcss@8.4.16 + eslint: 8.21.0 + eslint-config-standard: 17.0.0_dfwa53o44x4e5xhsfv5mvfhk5a + eslint-config-standard-with-typescript: 22.0.0_mfupvx5msz6are6ggwiepter3m + eslint-plugin-import: 2.26.0_wuikv5nqgdfyng42xxm7lklfmi + eslint-plugin-n: 15.2.4_eslint@8.21.0 + eslint-plugin-promise: 6.0.0_eslint@8.21.0 + eslint-plugin-react: 7.30.1_eslint@8.21.0 + jsdom: 20.0.0 + postcss: 8.4.16 + sass: 1.54.3 + tailwindcss: 3.1.8 + typescript: 4.7.4 + vite: 3.0.4_sass@1.54.3 + vitest: 0.20.3_hymhw3vkyr5yfvzfskw3x5v26q packages: - /@adobe/css-tools/4.2.0: - resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} + /@adobe/css-tools/4.0.1: + resolution: {integrity: sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==} dev: true /@ampproject/remapping/2.2.0: @@ -108,7 +79,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.14 dev: true /@babel/code-frame/7.18.6: @@ -118,55 +89,60 @@ packages: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.21.0: - resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + /@babel/compat-data/7.18.8: + resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.21.3: - resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} + /@babel/core/7.18.10: + resolution: {integrity: sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helpers': 7.21.0 - '@babel/parser': 7.21.3 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 - convert-source-map: 1.9.0 + '@babel/generator': 7.18.12 + '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.10 + '@babel/helper-module-transforms': 7.18.9 + '@babel/helpers': 7.18.9 + '@babel/parser': 7.18.11 + '@babel/template': 7.18.10 + '@babel/traverse': 7.18.11 + '@babel/types': 7.18.10 + convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.3 + json5: 2.2.1 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/generator/7.21.3: - resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} + /@babel/generator/7.18.12: + resolution: {integrity: sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.3 + '@babel/types': 7.18.10 '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.3: - resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.10 + dev: true + + /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.10: + resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.21.3 - '@babel/helper-validator-option': 7.21.0 - browserslist: 4.21.5 - lru-cache: 5.1.1 + '@babel/compat-data': 7.18.8 + '@babel/core': 7.18.10 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 semver: 6.3.0 dev: true @@ -175,85 +151,85 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + /@babel/helper-function-name/7.18.9: + resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.21.3 + '@babel/template': 7.18.10 + '@babel/types': 7.18.10 dev: true /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.3 + '@babel/types': 7.18.10 dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.3 + '@babel/types': 7.18.10 dev: true - /@babel/helper-module-transforms/7.21.2: - resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + /@babel/helper-module-transforms/7.18.9: + resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.20.2 + '@babel/helper-simple-access': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 + '@babel/helper-validator-identifier': 7.18.6 + '@babel/template': 7.18.10 + '@babel/traverse': 7.18.11 + '@babel/types': 7.18.10 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-plugin-utils/7.20.2: - resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + /@babel/helper-plugin-utils/7.18.9: + resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access/7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + /@babel/helper-simple-access/7.18.6: + resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.3 + '@babel/types': 7.18.10 dev: true /@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.21.3 + '@babel/types': 7.18.10 dev: true - /@babel/helper-string-parser/7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + /@babel/helper-string-parser/7.18.10: + resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier/7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier/7.18.6: + resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.21.0: - resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.21.0: - resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + /@babel/helpers/7.18.9: + resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 - '@babel/traverse': 7.21.3 - '@babel/types': 7.21.3 + '@babel/template': 7.18.10 + '@babel/traverse': 7.18.11 + '@babel/types': 7.18.10 transitivePeerDependencies: - supports-color dev: true @@ -262,173 +238,131 @@ packages: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.18.6 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.3: - resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} + /@babel/parser/7.18.11: + resolution: {integrity: sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.3 + '@babel/types': 7.18.10 dev: true - /@babel/plugin-transform-react-jsx-self/7.21.0_@babel+core@7.21.3: - resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==} + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.10: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.18.10 + '@babel/helper-plugin-utils': 7.18.9 dev: true - /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.21.3: - resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==} + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.18.10: + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/core': 7.18.10 + '@babel/plugin-transform-react-jsx': 7.18.10_@babel+core@7.18.10 dev: true - /@babel/runtime/7.21.0: - resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.18.10: + resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.10 + '@babel/helper-plugin-utils': 7.18.9 + dev: true + + /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.18.10: + resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.10 + '@babel/helper-plugin-utils': 7.18.9 + dev: true + + /@babel/plugin-transform-react-jsx/7.18.10_@babel+core@7.18.10: + resolution: {integrity: sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.18.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.10 + '@babel/types': 7.18.10 + dev: true + + /@babel/runtime/7.18.9: + resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.13.11 + regenerator-runtime: 0.13.9 + dev: true - /@babel/template/7.20.7: - resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 + '@babel/parser': 7.18.11 + '@babel/types': 7.18.10 dev: true - /@babel/traverse/7.21.3: - resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} + /@babel/traverse/7.18.11: + resolution: {integrity: sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.21.3 + '@babel/generator': 7.18.12 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 + '@babel/helper-function-name': 7.18.9 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.21.3 - '@babel/types': 7.21.3 + '@babel/parser': 7.18.11 + '@babel/types': 7.18.10 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.21.3: - resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} + /@babel/types/7.18.10: + resolution: {integrity: sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.18.10 + '@babel/helper-validator-identifier': 7.18.6 to-fast-properties: 2.0.0 dev: true - /@esbuild/android-arm/0.17.12: - resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] + /@emotion/is-prop-valid/0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true - dev: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false optional: true - /@esbuild/android-arm64/0.17.12: - resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + /@emotion/memoize/0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + dev: false optional: true - /@esbuild/android-x64/0.17.12: - resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64/0.17.12: - resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64/0.17.12: - resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64/0.17.12: - resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64/0.17.12: - resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm/0.17.12: - resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.17.12: - resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32/0.17.12: - resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64/0.17.12: - resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==} + /@esbuild/linux-loong64/0.14.54: + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -436,129 +370,15 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.12: - resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64/0.17.12: - resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64/0.17.12: - resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x/0.17.12: - resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64/0.17.12: - resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64/0.17.12: - resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64/0.17.12: - resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64/0.17.12: - resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64/0.17.12: - resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32/0.17.12: - resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64/0.17.12: - resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils/4.3.0_eslint@8.36.0: - resolution: {integrity: sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.36.0 - eslint-visitor-keys: 3.3.0 - dev: true - - /@eslint-community/regexpp/4.4.1: - resolution: {integrity: sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc/2.0.1: - resolution: {integrity: sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==} + /@eslint/eslintrc/1.3.0: + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.5.0 - globals: 13.20.0 - ignore: 5.2.4 + espree: 9.3.3 + globals: 13.17.0 + ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -567,21 +387,16 @@ packages: - supports-color dev: true - /@eslint/js/8.36.0: - resolution: {integrity: sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@heroicons/react/2.0.16_react@18.2.0: - resolution: {integrity: sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==} + /@heroicons/react/1.0.6_react@18.2.0: + resolution: {integrity: sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==} peerDependencies: react: '>= 16' dependencies: react: 18.2.0 dev: false - /@humanwhocodes/config-array/0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + /@humanwhocodes/config-array/0.10.4: + resolution: {integrity: sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -591,39 +406,19 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + /@humanwhocodes/gitignore-to-minimatch/1.0.2: + resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==} dev: true /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@jest/expect-utils/29.5.0: - resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@jest/schemas/28.1.3: + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - jest-get-type: 29.4.3 - dev: true - - /@jest/schemas/29.4.3: - resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.25.24 - dev: true - - /@jest/types/29.5.0: - resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.4.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.5 - '@types/yargs': 17.0.23 - chalk: 4.1.2 + '@sinclair/typebox': 0.24.27 dev: true /@jridgewell/gen-mapping/0.1.1: @@ -640,7 +435,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.14 dev: true /@jridgewell/resolve-uri/3.1.0: @@ -657,15 +452,58 @@ packages: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@juggle/resize-observer/3.4.0: - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + /@motionone/animation/10.13.2: + resolution: {integrity: sha512-YGWss58IR2X4lOjW89rv1Q+/Nq/QhfltaggI7i8sZTpKC1yUvM+XYDdvlRpWc6dk8LviMBrddBJAlLdbaqeRmw==} + dependencies: + '@motionone/easing': 10.13.2 + '@motionone/types': 10.13.2 + '@motionone/utils': 10.13.2 + tslib: 2.4.0 + dev: false + + /@motionone/dom/10.12.0: + resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} + dependencies: + '@motionone/animation': 10.13.2 + '@motionone/generators': 10.13.2 + '@motionone/types': 10.13.2 + '@motionone/utils': 10.13.2 + hey-listen: 1.0.8 + tslib: 2.4.0 + dev: false + + /@motionone/easing/10.13.2: + resolution: {integrity: sha512-3HqctS5NyDfDQ+8+cZqc3Pu7I6amFCt9zDUjcozHyFXHh4PKYHK4+GJDFjJIS8bCAF2BrJmpmduDQ2V7lFEYeQ==} + dependencies: + '@motionone/utils': 10.13.2 + tslib: 2.4.0 + dev: false + + /@motionone/generators/10.13.2: + resolution: {integrity: sha512-QMoXV1MXEEhR6D3dct/RMMS1FwJlAsW+kMPbFGzBA4NbweblgeYQCft9DcDAVpV9wIwD6qvlBG9u99sOXLfHiA==} + dependencies: + '@motionone/types': 10.13.2 + '@motionone/utils': 10.13.2 + tslib: 2.4.0 + dev: false + + /@motionone/types/10.13.2: + resolution: {integrity: sha512-yYV4q5v5F0iADhab4wHfqaRJnM/eVtQLjUPhyEcS72aUz/xyOzi09GzD/Gu+K506BDfqn5eULIilUI77QNaqhw==} + dev: false + + /@motionone/utils/10.13.2: + resolution: {integrity: sha512-6Lw5bDA/w7lrPmT/jYWQ76lkHlHs9fl2NZpJ22cVy1kKDdEH+Cl1U6hMTpdphO6VQktQ6v2APngag91WBKLqlA==} + dependencies: + '@motionone/types': 10.13.2 + hey-listen: 1.0.8 + tslib: 2.4.0 dev: false /@nodelib/fs.scandir/2.1.5: @@ -686,172 +524,28 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.13.0 dev: true /@polka/url/1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@react-hook/latest/1.0.3_react@18.2.0: - resolution: {integrity: sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==} - peerDependencies: - react: '>=16.8' - dependencies: - react: 18.2.0 - dev: false - - /@react-hook/passive-layout-effect/1.2.1_react@18.2.0: - resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} - peerDependencies: - react: '>=16.8' - dependencies: - react: 18.2.0 - dev: false - - /@react-hook/resize-observer/1.2.6_react@18.2.0: - resolution: {integrity: sha512-DlBXtLSW0DqYYTW3Ft1/GQFZlTdKY5VAFIC4+km6IK5NiPPDFchGbEJm1j6pSgMqPRHbUQgHJX7RaR76ic1LWA==} - peerDependencies: - react: '>=16.8' - dependencies: - '@juggle/resize-observer': 3.4.0 - '@react-hook/latest': 1.0.3_react@18.2.0 - '@react-hook/passive-layout-effect': 1.2.1_react@18.2.0 - react: 18.2.0 - dev: false - - /@react-hook/size/2.1.2_react@18.2.0: - resolution: {integrity: sha512-BmE5asyRDxSuQ9p14FUKJ0iBRgV9cROjqNG9jT/EjCM+xHha1HVqbPoT+14FQg1K7xIydabClCibUY4+1tw/iw==} - peerDependencies: - react: '>=16.8' - dependencies: - '@react-hook/passive-layout-effect': 1.2.1_react@18.2.0 - '@react-hook/resize-observer': 1.2.6_react@18.2.0 - react: 18.2.0 - dev: false - - /@sinclair/typebox/0.25.24: - resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + /@sinclair/typebox/0.24.27: + resolution: {integrity: sha512-K7C7IlQ3zLePEZleUN21ceBA2aLcMnLHTLph8QWk1JK37L90obdpY+QGY8bXMKxf1ht1Z0MNewvXxWv0oGDYFg==} dev: true - /@swc/core-darwin-arm64/1.3.42: - resolution: {integrity: sha512-hM6RrZFyoCM9mX3cj/zM5oXwhAqjUdOCLXJx7KTQps7NIkv/Qjvobgvyf2gAb89j3ARNo9NdIoLjTjJ6oALtiA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@swc/core-darwin-x64/1.3.42: - resolution: {integrity: sha512-bjsWtHMb6wJK1+RGlBs2USvgZ0txlMk11y0qBLKo32gLKTqzUwRw0Fmfzuf6Ue2a/w//7eqMlPFEre4LvJajGw==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm-gnueabihf/1.3.42: - resolution: {integrity: sha512-Oe0ggMz3MyqXNfeVmY+bBTL0hFSNY3bx8dhcqsh4vXk/ZVGse94QoC4dd92LuPHmKT0x6nsUzB86x2jU9QHW5g==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm64-gnu/1.3.42: - resolution: {integrity: sha512-ZJsa8NIW1RLmmHGTJCbM7OPSbBZ9rOMrLqDtUOGrT0uoJXZnnQqolflamB5wviW0X6h3Z3/PSTNGNDCJ3u3Lqg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-arm64-musl/1.3.42: - resolution: {integrity: sha512-YpZwlFAfOp5vkm/uVUJX1O7N3yJDO1fDQRWqsOPPNyIJkI2ydlRQtgN6ZylC159Qv+TimfXnGTlNr7o3iBAqjg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-x64-gnu/1.3.42: - resolution: {integrity: sha512-0ccpKnsZbyHBzaQFdP8U9i29nvOfKitm6oJfdJzlqsY/jCqwvD8kv2CAKSK8WhJz//ExI2LqNrDI0yazx5j7+A==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-linux-x64-musl/1.3.42: - resolution: {integrity: sha512-7eckRRuTZ6+3K21uyfXXgc2ZCg0mSWRRNwNT3wap2bYkKPeqTgb8pm8xYSZNEiMuDonHEat6XCCV36lFY6kOdQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-arm64-msvc/1.3.42: - resolution: {integrity: sha512-t27dJkdw0GWANdN4TV0lY/V5vTYSx5SRjyzzZolep358ueCGuN1XFf1R0JcCbd1ojosnkQg2L7A7991UjXingg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-ia32-msvc/1.3.42: - resolution: {integrity: sha512-xfpc/Zt/aMILX4IX0e3loZaFyrae37u3MJCv1gJxgqrpeLi7efIQr3AmERkTK3mxTO6R5urSliWw2W3FyZ7D3Q==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core-win32-x64-msvc/1.3.42: - resolution: {integrity: sha512-ra2K4Tu++EJLPhzZ6L8hWUsk94TdK/2UKhL9dzCBhtzKUixsGCEqhtqH1zISXNvW8qaVLFIMUP37ULe80/IJaA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@swc/core/1.3.42: - resolution: {integrity: sha512-nVFUd5+7tGniM2cT3LXaqnu3735Cu4az8A9gAKK+8sdpASI52SWuqfDBmjFCK9xG90MiVDVp2PTZr0BWqCIzpw==} - engines: {node: '>=10'} - requiresBuild: true - optionalDependencies: - '@swc/core-darwin-arm64': 1.3.42 - '@swc/core-darwin-x64': 1.3.42 - '@swc/core-linux-arm-gnueabihf': 1.3.42 - '@swc/core-linux-arm64-gnu': 1.3.42 - '@swc/core-linux-arm64-musl': 1.3.42 - '@swc/core-linux-x64-gnu': 1.3.42 - '@swc/core-linux-x64-musl': 1.3.42 - '@swc/core-win32-arm64-msvc': 1.3.42 - '@swc/core-win32-ia32-msvc': 1.3.42 - '@swc/core-win32-x64-msvc': 1.3.42 - dev: true - - /@testing-library/dom/9.0.1: - resolution: {integrity: sha512-fTOVsMY9QLFCCXRHG3Ese6cMH5qIWwSbgxZsgeF5TNsy81HKaZ4kgehnSF8FsR3OF+numlIV2YcU79MzbnhSig==} - engines: {node: '>=14'} + /@testing-library/dom/8.16.1: + resolution: {integrity: sha512-XEV2mBxgv6DKjL3+U3WEUzBgT2CjYksoXGlLrrJXYP8OvRfGkBonvelkorazpFlp8tkEecO06r43vN4DIEyegQ==} + engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/runtime': 7.21.0 - '@types/aria-query': 5.0.1 - aria-query: 5.1.3 + '@babel/runtime': 7.18.9 + '@types/aria-query': 4.2.2 + aria-query: 5.0.0 chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 + dom-accessibility-api: 0.5.14 + lz-string: 1.4.4 pretty-format: 27.5.1 dev: true @@ -859,38 +553,38 @@ packages: resolution: {integrity: sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==} engines: {node: '>=8', npm: '>=6', yarn: '>=1'} dependencies: - '@adobe/css-tools': 4.2.0 - '@babel/runtime': 7.21.0 + '@adobe/css-tools': 4.0.1 + '@babel/runtime': 7.18.9 '@types/testing-library__jest-dom': 5.14.5 - aria-query: 5.1.3 + aria-query: 5.0.0 chalk: 3.0.0 css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 + dom-accessibility-api: 0.5.14 lodash: 4.17.21 redent: 3.0.0 dev: true - /@testing-library/react/14.0.0_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==} - engines: {node: '>=14'} + /@testing-library/react/13.3.0_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-DB79aA426+deFgGSjnf5grczDPiL4taK3hFaa+M5q7q20Kcve9eQottOG5kZ74KEr55v0tU2CQormSSDK87zYQ==} + engines: {node: '>=12'} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@babel/runtime': 7.21.0 - '@testing-library/dom': 9.0.1 - '@types/react-dom': 18.0.11 + '@babel/runtime': 7.18.9 + '@testing-library/dom': 8.16.1 + '@types/react-dom': 18.0.6 react: 18.2.0 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==} + /@testing-library/user-event/14.4.2_znfriv3ismgf3ybh2woqwlpfea: + resolution: {integrity: sha512-1gVTWtueNimveOjcm2ApFCnCTeky7WqY3EX31/GRKLWyCd+HfH+Gd2l1J8go9FpDNe+0Mx8X4zbQHTg0WWNJwg==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.0.1 + '@testing-library/dom': 8.16.1 dev: true /@tootallnate/once/2.0.0: @@ -898,41 +592,25 @@ packages: engines: {node: '>= 10'} dev: true - /@types/aria-query/5.0.1: - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} + /@types/aria-query/4.2.2: + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} dev: true /@types/chai-subset/1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: - '@types/chai': 4.3.4 + '@types/chai': 4.3.3 dev: true - /@types/chai/4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + /@types/chai/4.3.3: + resolution: {integrity: sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==} dev: true - /@types/istanbul-lib-coverage/2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + /@types/jest/28.1.6: + resolution: {integrity: sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==} dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports/3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - - /@types/jest/29.5.0: - resolution: {integrity: sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==} - dependencies: - expect: 29.5.0 - pretty-format: 29.5.0 + jest-matcher-utils: 28.1.3 + pretty-format: 28.1.3 dev: true /@types/json-schema/7.0.11: @@ -943,70 +621,46 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node/18.15.5: - resolution: {integrity: sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew==} + /@types/node/18.6.4: + resolution: {integrity: sha512-I4BD3L+6AWiUobfxZ49DlU43gtI+FTHSv9pE2Zekg6KjMpre4ByusaljW3vYSLJrvQ1ck1hUaeVu8HVlY3vzHg==} + dev: true /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true - /@types/react-dom/18.0.11: - resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} + /@types/react-dom/18.0.6: + resolution: {integrity: sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==} dependencies: - '@types/react': 18.0.28 + '@types/react': 18.0.17 dev: true - /@types/react-svg-pan-zoom/3.3.5_kv3ctd73j5hnzcxdc2ceiq5wuy: + /@types/react-svg-pan-zoom/3.3.5: resolution: {integrity: sha512-W8GRFCDy7raSDr5OXGjSyvX5KmdWlIQfv0NLa1jfAYVUO4ClVbgorWeAAom7nY3Pl+4h9blXE1Bnu2CW1iMEvQ==} dependencies: - '@types/react': 18.0.28 - dev: true - patched: true - - /@types/react-window/1.8.5: - resolution: {integrity: sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==} - dependencies: - '@types/react': 18.0.28 + '@types/react': 18.0.17 dev: true - /@types/react/18.0.28: - resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} + /@types/react/18.0.17: + resolution: {integrity: sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==} dependencies: '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.1 + '@types/scheduler': 0.16.2 + csstype: 3.1.0 dev: true - /@types/scheduler/0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - dev: true - - /@types/semver/7.3.13: - resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} - dev: true - - /@types/stack-utils/2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + /@types/scheduler/0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: true /@types/testing-library__jest-dom/5.14.5: resolution: {integrity: sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==} dependencies: - '@types/jest': 29.5.0 + '@types/jest': 28.1.6 dev: true - /@types/yargs-parser/21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs/17.0.23: - resolution: {integrity: sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@typescript-eslint/eslint-plugin/5.56.0_2hcjazgfnbtq42tcc73br2vup4: - resolution: {integrity: sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==} + /@typescript-eslint/eslint-plugin/5.32.0_iosr3hrei2tubxveewluhu5lhy: + resolution: {integrity: sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1016,25 +670,24 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.4.1 - '@typescript-eslint/parser': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - '@typescript-eslint/scope-manager': 5.56.0 - '@typescript-eslint/type-utils': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - '@typescript-eslint/utils': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + '@typescript-eslint/scope-manager': 5.32.0 + '@typescript-eslint/type-utils': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + '@typescript-eslint/utils': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq debug: 4.3.4 - eslint: 8.36.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 - typescript: 5.0.2 + eslint: 8.21.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: - resolution: {integrity: sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==} + /@typescript-eslint/parser/5.32.0_qugx7qdu5zevzvxaiqyxfiwquq: + resolution: {integrity: sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1043,26 +696,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.56.0 - '@typescript-eslint/types': 5.56.0 - '@typescript-eslint/typescript-estree': 5.56.0_typescript@5.0.2 + '@typescript-eslint/scope-manager': 5.32.0 + '@typescript-eslint/types': 5.32.0 + '@typescript-eslint/typescript-estree': 5.32.0_typescript@4.7.4 debug: 4.3.4 - eslint: 8.36.0 - typescript: 5.0.2 + eslint: 8.21.0 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.56.0: - resolution: {integrity: sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==} + /@typescript-eslint/scope-manager/5.32.0: + resolution: {integrity: sha512-KyAE+tUON0D7tNz92p1uetRqVJiiAkeluvwvZOqBmW9z2XApmk5WSMV9FrzOroAcVxJZB3GfUwVKr98Dr/OjOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.56.0 - '@typescript-eslint/visitor-keys': 5.56.0 + '@typescript-eslint/types': 5.32.0 + '@typescript-eslint/visitor-keys': 5.32.0 dev: true - /@typescript-eslint/type-utils/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: - resolution: {integrity: sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==} + /@typescript-eslint/type-utils/5.32.0_qugx7qdu5zevzvxaiqyxfiwquq: + resolution: {integrity: sha512-0gSsIhFDduBz3QcHJIp3qRCvVYbqzHg8D6bHFsDMrm0rURYDj+skBK2zmYebdCp+4nrd9VWd13egvhYFJj/wZg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1071,23 +724,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.56.0_typescript@5.0.2 - '@typescript-eslint/utils': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + '@typescript-eslint/utils': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq debug: 4.3.4 - eslint: 8.36.0 - tsutils: 3.21.0_typescript@5.0.2 - typescript: 5.0.2 + eslint: 8.21.0 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.56.0: - resolution: {integrity: sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==} + /@typescript-eslint/types/5.32.0: + resolution: {integrity: sha512-EBUKs68DOcT/EjGfzywp+f8wG9Zw6gj6BjWu7KV/IYllqKJFPlZlLSYw/PTvVyiRw50t6wVbgv4p9uE2h6sZrQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.56.0_typescript@5.0.2: - resolution: {integrity: sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==} + /@typescript-eslint/typescript-estree/5.32.0_typescript@4.7.4: + resolution: {integrity: sha512-ZVAUkvPk3ITGtCLU5J4atCw9RTxK+SRc6hXqLtllC2sGSeMFWN+YwbiJR9CFrSFJ3w4SJfcWtDwNb/DmUIHdhg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1095,133 +747,85 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.56.0 - '@typescript-eslint/visitor-keys': 5.56.0 + '@typescript-eslint/types': 5.32.0 + '@typescript-eslint/visitor-keys': 5.32.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 - tsutils: 3.21.0_typescript@5.0.2 - typescript: 5.0.2 + semver: 7.3.7 + tsutils: 3.21.0_typescript@4.7.4 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.56.0_j4766f7ecgqbon3u7zlxn5zszu: - resolution: {integrity: sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==} + /@typescript-eslint/utils/5.32.0_qugx7qdu5zevzvxaiqyxfiwquq: + resolution: {integrity: sha512-W7lYIAI5Zlc5K082dGR27Fczjb3Q57ECcXefKU/f0ajM5ToM0P+N9NmJWip8GmGu/g6QISNT+K6KYB+iSHjXCQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.3.0_eslint@8.36.0 '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.56.0 - '@typescript-eslint/types': 5.56.0 - '@typescript-eslint/typescript-estree': 5.56.0_typescript@5.0.2 - eslint: 8.36.0 + '@typescript-eslint/scope-manager': 5.32.0 + '@typescript-eslint/types': 5.32.0 + '@typescript-eslint/typescript-estree': 5.32.0_typescript@4.7.4 + eslint: 8.21.0 eslint-scope: 5.1.1 - semver: 7.3.8 + eslint-utils: 3.0.0_eslint@8.21.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.56.0: - resolution: {integrity: sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==} + /@typescript-eslint/visitor-keys/5.32.0: + resolution: {integrity: sha512-S54xOHZgfThiZ38/ZGTgB2rqx51CMJ5MCfVT2IplK4Q7hgzGfe0nLzLCcenDnc/cSjP568hdeKfeDcBgqNHD/g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.56.0 + '@typescript-eslint/types': 5.32.0 eslint-visitor-keys: 3.3.0 dev: true - /@vitejs/plugin-react-swc/3.2.0_vite@4.2.1: - resolution: {integrity: sha512-IcBoXL/mcH7JdQr/nfDlDwTdIaH8Rg7LpfQDF4nAht+juHWIuv6WhpKPCSfY4+zztAaB07qdBoFz1XCZsgo3pQ==} + /@vitejs/plugin-react/2.0.0_vite@3.0.4: + resolution: {integrity: sha512-zHkRR+X4zqEPNBbKV2FvWSxK7Q6crjMBVIAYroSU8Nbb4M3E5x4qOiLoqJBHtXgr27kfednXjkwr3lr8jS6Wrw==} + engines: {node: '>=14.18.0'} peerDependencies: - vite: ^4 + vite: ^3.0.0 dependencies: - '@swc/core': 1.3.42 - vite: 4.2.1_y7rghahg7ddu72pko63vhsxa44 - dev: true - - /@vitejs/plugin-react/3.1.0_vite@4.2.1: - 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 + '@babel/core': 7.18.10 + '@babel/plugin-transform-react-jsx': 7.18.10_@babel+core@7.18.10 + '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.18.10 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.18.10 + '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.18.10 + magic-string: 0.26.2 react-refresh: 0.14.0 - vite: 4.2.1_y7rghahg7ddu72pko63vhsxa44 + vite: 3.0.4_sass@1.54.3 transitivePeerDependencies: - supports-color dev: true - /@vitest/expect/0.29.7: - resolution: {integrity: sha512-UtG0tW0DP6b3N8aw7PHmweKDsvPv4wjGvrVZW7OSxaFg76ShtVdMiMcUkZJgCE8QWUmhwaM0aQhbbVLo4F4pkA==} + /@vitest/ui/0.20.3: + resolution: {integrity: sha512-Rlg+y3PtE5IcGPVmViF/BXM7euY7LG0yjfIvXKlF0L3OnNSVS8+esgLlAhaYftSJXtcunqa/cYXiQ+qFVTaBGw==} dependencies: - '@vitest/spy': 0.29.7 - '@vitest/utils': 0.29.7 - chai: 4.3.7 - dev: true - - /@vitest/runner/0.29.7: - resolution: {integrity: sha512-Yt0+csM945+odOx4rjZSjibQfl2ymxqVsmYz6sO2fiO5RGPYDFCo60JF6tLL9pz4G/kjY4irUxadeB1XT+H1jg==} - dependencies: - '@vitest/utils': 0.29.7 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/spy/0.29.7: - resolution: {integrity: sha512-IalL0iO6A6Xz8hthR8sctk6ZS//zVBX48EiNwQguYACdgdei9ZhwMaBFV70mpmeYAFCRAm+DpoFHM5470Im78A==} - dependencies: - tinyspy: 1.1.1 - dev: true - - /@vitest/ui/0.29.7: - resolution: {integrity: sha512-KeOztcAldlFU5i8DKCQcmGrih1dVowurZy/9iPz5JyQdPJzej+nW1nI4nYvc4ZmUtA8+IAe9uViqnU7IXc1RNw==} - dependencies: - fast-glob: 3.2.12 - flatted: 3.2.7 - pathe: 1.1.0 - picocolors: 1.0.0 sirv: 2.0.2 dev: true - /@vitest/utils/0.29.7: - resolution: {integrity: sha512-vNgGadp2eE5XKCXtZXL5UyNEDn68npSct75OC9AlELenSK0DiV1Mb9tfkwJHKjRb69iek+e79iipoJx8+s3SdA==} - dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - /abab/2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /abbrev/1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /acorn-globals/7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + /acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} dependencies: - acorn: 8.8.2 - acorn-walk: 8.2.0 + acorn: 7.4.1 + acorn-walk: 7.2.0 dev: true - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx/5.3.2_acorn@8.8.0: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.8.0 dev: true /acorn-node/1.8.2: @@ -1237,19 +841,14 @@ packages: engines: {node: '>=0.4.0'} dev: true - /acorn-walk/8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -1277,11 +876,6 @@ packages: engines: {node: '>=8'} dev: true - /ansi-regex/6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1301,13 +895,8 @@ packages: engines: {node: '>=10'} dev: true - /ansi-styles/6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch/3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 @@ -1322,27 +911,19 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-query/5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.0 + /aria-query/5.0.0: + resolution: {integrity: sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==} + engines: {node: '>=6.0'} dev: true - /array-buffer-byte-length/1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes/3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + /array-includes/3.1.5: + resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.0 + define-properties: 1.1.4 + es-abstract: 1.20.1 + get-intrinsic: 1.1.2 is-string: 1.0.7 dev: true @@ -1351,36 +932,26 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.flat/1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + /array.prototype.flat/1.3.0: + resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + /array.prototype.flatmap/1.3.0: + resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 es-shim-unscopables: 1.0.0 dev: true - /array.prototype.tosorted/1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.0 - dev: true - /assertion-error/1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -1389,27 +960,22 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true - /autoprefixer/10.4.14_postcss@8.4.21: - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + /autoprefixer/10.4.8_postcss@8.4.16: + resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001469 + browserslist: 4.21.3 + caniuse-lite: 1.0.30001374 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.21 + postcss: 8.4.16 postcss-value-parser: 4.2.0 dev: true - /available-typed-arrays/1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1433,33 +999,32 @@ packages: fill-range: 7.0.1 dev: true - /browserslist/4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + /browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist/4.21.3: + resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001469 - electron-to-chromium: 1.4.337 - node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + caniuse-lite: 1.0.30001374 + electron-to-chromium: 1.4.211 + node-releases: 2.0.6 + update-browserslist-db: 1.0.5_browserslist@4.21.3 dev: true /builtins/5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.3.8 - dev: true - - /cac/6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + semver: 7.3.7 dev: true /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.2.0 + get-intrinsic: 1.1.2 dev: true /callsites/3.1.0: @@ -1472,19 +1037,19 @@ packages: engines: {node: '>= 6'} dev: true - /caniuse-lite/1.0.30001469: - resolution: {integrity: sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==} + /caniuse-lite/1.0.30001374: + resolution: {integrity: sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==} dev: true - /chai/4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + /chai/4.3.6: + resolution: {integrity: sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 check-error: 1.0.2 - deep-eql: 4.1.3 + deep-eql: 3.0.1 get-func-name: 2.0.0 - loupe: 2.3.6 + loupe: 2.3.4 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -1522,7 +1087,7 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: - anymatch: 3.1.3 + anymatch: 3.1.2 braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 @@ -1533,19 +1098,6 @@ packages: fsevents: 2.3.2 dev: true - /ci-info/3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} - dev: true - - /cli-truncate/3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1578,8 +1130,10 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-source-map/1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} + dependencies: + safe-buffer: 5.1.2 dev: true /cross-spawn/7.0.3: @@ -1601,24 +1155,43 @@ packages: hasBin: true dev: true - /cssstyle/3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom/0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + dev: true + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} dependencies: - rrweb-cssom: 0.6.0 + cssom: 0.3.8 dev: true - /csstype/3.1.1: - resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + /csstype/3.1.0: + resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} dev: true - /data-urls/4.0.0: - resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} - engines: {node: '>=14'} + /data-urls/3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} dependencies: abab: 2.0.6 whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 + whatwg-url: 11.0.0 + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 dev: true /debug/3.2.7: @@ -1632,18 +1205,6 @@ packages: ms: 2.1.3 dev: true - /debug/3.2.7_supports-color@5.5.0: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - dev: true - /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1656,53 +1217,31 @@ packages: ms: 2.1.2 dev: true - /decimal.js/10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + /decimal.js/10.3.1: + resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} dev: true - /deep-eql/4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + /deep-eql/3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} dependencies: type-detect: 4.0.8 dev: true - /deep-equal/2.2.0: - resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} - dependencies: - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.0 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.9 - dev: true - /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /define-properties/1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 dev: true - /defined/1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + /defined/1.0.0: + resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} dev: true /delayed-stream/1.0.0: @@ -1716,22 +1255,17 @@ packages: hasBin: true dependencies: acorn-node: 1.8.2 - defined: 1.0.1 - minimist: 1.2.8 + defined: 1.0.0 + minimist: 1.2.6 dev: true /didyoumean/1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true - /diff-sequences/29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /diff/5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} + /diff-sequences/28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true /dir-glob/3.0.1: @@ -1759,8 +1293,8 @@ packages: esutils: 2.0.3 dev: true - /dom-accessibility-api/0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + /dom-accessibility-api/0.5.14: + resolution: {integrity: sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==} dev: true /domexception/4.0.0: @@ -1770,84 +1304,42 @@ packages: webidl-conversions: 7.0.0 dev: true - /eastasianwidth/0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + /electron-to-chromium/1.4.211: + resolution: {integrity: sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==} dev: true - /electron-to-chromium/1.4.337: - resolution: {integrity: sha512-W8gdzXG86mVPoc56eM8YA+QiLxaAxJ8cmDjxZgfhLLWVvZQxyA918w5tX2JEWApZta45T1/sYcmFHTsTOUE3nw==} - dev: true - - /emoji-regex/9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /entities/4.4.0: - resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + /entities/4.3.1: + resolution: {integrity: sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==} engines: {node: '>=0.12'} dev: true - /es-abstract/1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + /es-abstract/1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} engines: {node: '>= 0.4'} dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 + function-bind: 1.1.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 + get-intrinsic: 1.1.2 get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 - has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 + internal-slot: 1.0.3 + is-callable: 1.2.4 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.10 is-weakref: 1.0.2 - object-inspect: 1.12.3 + object-inspect: 1.12.2 object-keys: 1.1.1 - object.assign: 4.1.4 + object.assign: 4.1.3 regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 + string.prototype.trimend: 1.0.5 + string.prototype.trimstart: 1.0.5 unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: true - - /es-get-iterator/1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - - /es-set-tostringtag/2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - has-tostringtag: 1.0.0 dev: true /es-shim-unscopables/1.0.0: @@ -1860,39 +1352,218 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: - is-callable: 1.2.7 + is-callable: 1.2.4 is-date-object: 1.0.5 is-symbol: 1.0.4 dev: true - /esbuild/0.17.12: - resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==} + /esbuild-android-64/0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.12 - '@esbuild/android-arm64': 0.17.12 - '@esbuild/android-x64': 0.17.12 - '@esbuild/darwin-arm64': 0.17.12 - '@esbuild/darwin-x64': 0.17.12 - '@esbuild/freebsd-arm64': 0.17.12 - '@esbuild/freebsd-x64': 0.17.12 - '@esbuild/linux-arm': 0.17.12 - '@esbuild/linux-arm64': 0.17.12 - '@esbuild/linux-ia32': 0.17.12 - '@esbuild/linux-loong64': 0.17.12 - '@esbuild/linux-mips64el': 0.17.12 - '@esbuild/linux-ppc64': 0.17.12 - '@esbuild/linux-riscv64': 0.17.12 - '@esbuild/linux-s390x': 0.17.12 - '@esbuild/linux-x64': 0.17.12 - '@esbuild/netbsd-x64': 0.17.12 - '@esbuild/openbsd-x64': 0.17.12 - '@esbuild/sunos-x64': 0.17.12 - '@esbuild/win32-arm64': 0.17.12 - '@esbuild/win32-ia32': 0.17.12 - '@esbuild/win32-x64': 0.17.12 + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 dev: true /escalade/3.1.1: @@ -1900,20 +1571,11 @@ packages: engines: {node: '>=6'} dev: true - /escape-html/1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false - /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true - /escape-string-regexp/2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1932,29 +1594,29 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-standard-with-typescript/34.0.1_ukpckrjheukrqojeqftadpcodm: - resolution: {integrity: sha512-J7WvZeLtd0Vr9F+v4dZbqJCLD16cbIy4U+alJMq4MiXdpipdBM3U5NkXaGUjePc4sb1ZE01U9g6VuTBpHHz1fg==} + /eslint-config-standard-with-typescript/22.0.0_mfupvx5msz6are6ggwiepter3m: + resolution: {integrity: sha512-VA36U7UlFpwULvkdnh6MQj5GAV2Q+tT68ALLAwJP0ZuNXU2m0wX07uxX4qyLRdHgSzH4QJ73CveKBuSOYvh7vQ==} peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.43.0 + '@typescript-eslint/eslint-plugin': ^5.0.0 eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 eslint-plugin-n: ^15.0.0 eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 5.56.0_2hcjazgfnbtq42tcc73br2vup4 - '@typescript-eslint/parser': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - eslint: 8.36.0 - eslint-config-standard: 17.0.0_htxjg2emk4phzexndh6sfdkv2u - eslint-plugin-import: 2.27.5_cnkxirszkzb4o6ts7gbclno24e - eslint-plugin-n: 15.6.1_eslint@8.36.0 - eslint-plugin-promise: 6.1.1_eslint@8.36.0 - typescript: 5.0.2 + '@typescript-eslint/eslint-plugin': 5.32.0_iosr3hrei2tubxveewluhu5lhy + '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + eslint: 8.21.0 + eslint-config-standard: 17.0.0_dfwa53o44x4e5xhsfv5mvfhk5a + eslint-plugin-import: 2.26.0_wuikv5nqgdfyng42xxm7lklfmi + eslint-plugin-n: 15.2.4_eslint@8.21.0 + eslint-plugin-promise: 6.0.0_eslint@8.21.0 + typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /eslint-config-standard/17.0.0_htxjg2emk4phzexndh6sfdkv2u: + /eslint-config-standard/17.0.0_dfwa53o44x4e5xhsfv5mvfhk5a: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -1962,36 +1624,32 @@ packages: eslint-plugin-n: ^15.0.0 eslint-plugin-promise: ^6.0.0 dependencies: - eslint: 8.36.0 - eslint-plugin-import: 2.27.5_cnkxirszkzb4o6ts7gbclno24e - eslint-plugin-n: 15.6.1_eslint@8.36.0 - eslint-plugin-promise: 6.1.1_eslint@8.36.0 + eslint: 8.21.0 + eslint-plugin-import: 2.26.0_wuikv5nqgdfyng42xxm7lklfmi + eslint-plugin-n: 15.2.4_eslint@8.21.0 + eslint-plugin-promise: 6.0.0_eslint@8.21.0 dev: true - /eslint-import-resolver-node/0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + /eslint-import-resolver-node/0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} dependencies: debug: 3.2.7 - is-core-module: 2.11.0 resolve: 1.22.1 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils/2.7.4_tf7h2azriypc3gaglz256o6pea: - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils/2.7.3_gjpiwexkhexdr4bbgrtzf23bg4: + resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: '*' eslint-import-resolver-node: '*' eslint-import-resolver-typescript: '*' eslint-import-resolver-webpack: '*' peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint: - optional: true eslint-import-resolver-node: optional: true eslint-import-resolver-typescript: @@ -1999,27 +1657,27 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu + '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq debug: 3.2.7 - eslint: 8.36.0 - eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-node: 0.3.6 + find-up: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es/4.1.0_eslint@8.36.0: + /eslint-plugin-es/4.1.0_eslint@8.21.0: resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.36.0 + eslint: 8.21.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.27.5_cnkxirszkzb4o6ts7gbclno24e: - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + /eslint-plugin-import/2.26.0_wuikv5nqgdfyng42xxm7lklfmi: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -2028,91 +1686,74 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.56.0_j4766f7ecgqbon3u7zlxn5zszu - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 + '@typescript-eslint/parser': 5.32.0_qugx7qdu5zevzvxaiqyxfiwquq + array-includes: 3.1.5 + array.prototype.flat: 1.3.0 + debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.36.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4_tf7h2azriypc3gaglz256o6pea + eslint: 8.21.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3_gjpiwexkhexdr4bbgrtzf23bg4 has: 1.0.3 - is-core-module: 2.11.0 + is-core-module: 2.10.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 + object.values: 1.1.5 resolve: 1.22.1 - semver: 6.3.0 - tsconfig-paths: 3.14.2 + tsconfig-paths: 3.14.1 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color dev: true - /eslint-plugin-n/15.6.1_eslint@8.36.0: - resolution: {integrity: sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==} + /eslint-plugin-n/15.2.4_eslint@8.21.0: + resolution: {integrity: sha512-tjnVMv2fiXYMnuiIFI8QMtyUFI42SckEEWvi8h68SWGWshfqO6SSCASy24dGMGAiy7NUk6DZt90DM0iNUsmQ5w==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.36.0 - eslint-plugin-es: 4.1.0_eslint@8.36.0 - eslint-utils: 3.0.0_eslint@8.36.0 - ignore: 5.2.4 - is-core-module: 2.11.0 + eslint: 8.21.0 + eslint-plugin-es: 4.1.0_eslint@8.21.0 + eslint-utils: 3.0.0_eslint@8.21.0 + ignore: 5.2.0 + is-core-module: 2.10.0 minimatch: 3.1.2 resolve: 1.22.1 - semver: 7.3.8 + semver: 7.3.7 dev: true - /eslint-plugin-only-warn/1.1.0: - resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} - engines: {node: '>=6'} - dev: true - - /eslint-plugin-promise/6.1.1_eslint@8.36.0: - resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} + /eslint-plugin-promise/6.0.0_eslint@8.21.0: + resolution: {integrity: sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.36.0 + eslint: 8.21.0 dev: true - /eslint-plugin-react-hooks/4.6.0_eslint@8.36.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.36.0 - dev: true - - /eslint-plugin-react/7.32.2_eslint@8.36.0: - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + /eslint-plugin-react/7.30.1_eslint@8.21.0: + resolution: {integrity: sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 + array-includes: 3.1.5 + array.prototype.flatmap: 1.3.0 doctrine: 2.1.0 - eslint: 8.36.0 + eslint: 8.21.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + jsx-ast-utils: 3.3.2 minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.hasown: 1.1.1 + object.values: 1.1.5 prop-types: 15.8.1 resolve: 2.0.0-next.4 semver: 6.3.0 - string.prototype.matchall: 4.0.8 + string.prototype.matchall: 4.0.7 dev: true /eslint-scope/5.1.1: @@ -2138,13 +1779,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.36.0: + /eslint-utils/3.0.0_eslint@8.21.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.36.0 + eslint: 8.21.0 eslint-visitor-keys: 2.1.0 dev: true @@ -2163,18 +1804,14 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.36.0: - resolution: {integrity: sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==} + /eslint/8.21.0: + resolution: {integrity: sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.3.0_eslint@8.36.0 - '@eslint-community/regexpp': 4.4.1 - '@eslint/eslintrc': 2.0.1 - '@eslint/js': 8.36.0 - '@humanwhocodes/config-array': 0.11.8 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 + '@eslint/eslintrc': 1.3.0 + '@humanwhocodes/config-array': 0.10.4 + '@humanwhocodes/gitignore-to-minimatch': 1.0.2 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -2182,22 +1819,23 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.21.0 eslint-visitor-keys: 3.3.0 - espree: 9.5.0 - esquery: 1.5.0 + espree: 9.3.3 + esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 + functional-red-black-tree: 1.0.1 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.17.0 + globby: 11.1.0 grapheme-splitter: 1.0.4 - ignore: 5.2.4 + ignore: 5.2.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.0 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 @@ -2205,19 +1843,21 @@ packages: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.1 + regexpp: 3.2.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 + v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color dev: true - /espree/9.5.0: - resolution: {integrity: sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==} + /espree/9.3.3: + resolution: {integrity: sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn: 8.8.0 + acorn-jsx: 5.3.2_acorn@8.8.0 eslint-visitor-keys: 3.3.0 dev: true @@ -2227,8 +1867,8 @@ packages: hasBin: true dev: true - /esquery/1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery/1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -2256,23 +1896,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /expect/29.5.0: - resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.5.0 - jest-get-type: 29.4.3 - jest-matcher-utils: 29.5.0 - jest-message-util: 29.5.0 - jest-util: 29.5.0 - dev: true - /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob/3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob/3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2290,8 +1919,8 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: reusify: 1.0.4 dev: true @@ -2310,6 +1939,13 @@ packages: to-regex-range: 5.0.1 dev: true + /find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + /find-up/5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2322,18 +1958,12 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.7 + flatted: 3.2.6 rimraf: 3.0.2 dev: true - /flatted/3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /for-each/0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 + /flatted/3.2.6: + resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} dev: true /form-data/4.0.0: @@ -2349,6 +1979,30 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true + /framer-motion/6.5.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} + peerDependencies: + react: '>=16.8 || ^17.0.0 || ^18.0.0' + react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' + dependencies: + '@motionone/dom': 10.12.0 + framesync: 6.0.1 + hey-listen: 1.0.8 + popmotion: 11.0.3 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + style-value-types: 5.0.0 + tslib: 2.4.0 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /framesync/6.0.1: + resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} + dependencies: + tslib: 2.4.0 + dev: false + /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -2370,11 +2024,15 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 functions-have-names: 1.2.3 dev: true + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + /functions-have-names/1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true @@ -2388,8 +2046,8 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic/1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic/1.1.2: + resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -2401,7 +2059,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.1.2 dev: true /glob-parent/5.1.2: @@ -2434,42 +2092,25 @@ packages: engines: {node: '>=4'} dev: true - /globals/13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + /globals/13.17.0: + resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalthis/1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - dev: true - /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 + fast-glob: 3.2.11 + ignore: 5.2.0 merge2: 1.4.1 slash: 3.0.0 dev: true - /gopd/1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.0 - dev: true - - /graceful-fs/4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - /grapheme-splitter/1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true @@ -2491,12 +2132,7 @@ packages: /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.2.0 - dev: true - - /has-proto/1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} + get-intrinsic: 1.1.2 dev: true /has-symbols/1.0.3: @@ -2518,6 +2154,10 @@ packages: function-bind: 1.1.1 dev: true + /hey-listen/1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + dev: false + /html-encoding-sniffer/3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -2553,17 +2193,13 @@ packages: safer-buffer: 2.1.2 dev: true - /ignore-by-default/1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true - - /ignore/5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: true - /immutable/4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + /immutable/4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} dev: true /import-fresh/3.3.0: @@ -2595,40 +2231,15 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /internal-slot/1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.1.2 has: 1.0.3 side-channel: 1.0.4 dev: true - /interweave/13.1.0_react@18.2.0: - resolution: {integrity: sha512-JIDq0+2NYg0cgL7AB26fBcV0yZdiJvPDBp+aF6k8gq6Cr1kH5Gd2/Xqn7j8z+TGb8jCWZn739jzalCz+nPYwcA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - escape-html: 1.0.3 - react: 18.2.0 - dev: false - - /is-arguments/1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-array-buffer/3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-typed-array: 1.1.10 - dev: true - /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: @@ -2650,13 +2261,13 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-callable/1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} engines: {node: '>= 0.4'} dev: true - /is-core-module/2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /is-core-module/2.10.0: + resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} dependencies: has: 1.0.3 dev: true @@ -2673,11 +2284,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2685,10 +2291,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-map/2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -2706,11 +2308,6 @@ packages: engines: {node: '>=0.12.0'} dev: true - /is-path-inside/3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -2723,10 +2320,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-set/2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - /is-shared-array-buffer/1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -2747,96 +2340,39 @@ packages: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /is-weakmap/2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-weakset/2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - dev: true - - /isarray/2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jest-diff/29.5.0: - resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-diff/28.1.3: + resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: chalk: 4.1.2 - diff-sequences: 29.4.3 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 + diff-sequences: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 dev: true - /jest-get-type/29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-get-type/28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: true - /jest-matcher-utils/29.5.0: - resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-matcher-utils/28.1.3: + resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.5.0 - jest-get-type: 29.4.3 - pretty-format: 29.5.0 - dev: true - - /jest-message-util/29.5.0: - resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 29.5.0 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.5.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-util/29.5.0: - resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.5.0 - '@types/node': 18.15.5 - chalk: 4.1.2 - ci-info: 3.8.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /js-sdsl/4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 dev: true /js-tokens/4.0.0: @@ -2849,8 +2385,8 @@ packages: argparse: 2.0.1 dev: true - /jsdom/21.1.1: - resolution: {integrity: sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==} + /jsdom/20.0.0: + resolution: {integrity: sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==} engines: {node: '>=14'} peerDependencies: canvas: ^2.5.0 @@ -2859,11 +2395,12 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.2 - acorn-globals: 7.0.1 - cssstyle: 3.0.0 - data-urls: 4.0.0 - decimal.js: 10.4.3 + acorn: 8.8.0 + acorn-globals: 6.0.0 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.3.1 domexception: 4.0.0 escodegen: 2.0.0 form-data: 4.0.0 @@ -2871,18 +2408,18 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.2 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 + nwsapi: 2.2.1 + parse5: 7.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.2 - w3c-xmlserializer: 4.0.0 + tough-cookie: 4.0.0 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 3.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.13.0 + whatwg-url: 11.0.0 + ws: 8.8.1 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -2904,29 +2441,25 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + /json5/1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true dependencies: - minimist: 1.2.8 + minimist: 1.2.6 dev: true - /json5/2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true dev: true - /jsonc-parser/3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsx-ast-utils/3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + /jsx-ast-utils/3.3.2: + resolution: {integrity: sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.6 - object.assign: 4.1.4 + array-includes: 3.1.5 + object.assign: 4.1.3 dev: true /levn/0.3.0: @@ -2945,16 +2478,24 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: true - /local-pkg/0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + /local-pkg/0.4.2: + resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} engines: {node: '>=14'} dev: true + /locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + /locate-path/6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2976,18 +2517,12 @@ packages: dependencies: js-tokens: 4.0.0 - /loupe/2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe/2.3.4: + resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} dependencies: get-func-name: 2.0.0 dev: true - /lru-cache/5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2995,22 +2530,18 @@ packages: yallist: 4.0.0 dev: true - /lz-string/1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + /lz-string/1.4.4: + resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} hasBin: true dev: true - /magic-string/0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} engines: {node: '>=12'} dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + sourcemap-codec: 1.4.8 dev: true - /memoize-one/5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} - dev: false - /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3047,23 +2578,8 @@ packages: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mlly/1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /mprocs/0.6.4: - resolution: {integrity: sha512-Y4eqnAjp3mjy0eT+zPoMQ+P/ISOzjgRG/4kh4I5cRA4Tv0rPxTCBRadn3+j+boMF5id7IoLhrVq9NFWFPuzD9A==} - engines: {node: '>=0.10.0'} - hasBin: true + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true /mrmime/1.0.1: @@ -3071,6 +2587,10 @@ packages: engines: {node: '>=10'} dev: true + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -3085,40 +2605,12 @@ packages: hasBin: true dev: true - /natural-compare-lite/1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-releases/2.0.10: - resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - dev: true - - /nodemon/2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 5.7.1 - simple-update-notifier: 1.1.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - dev: true - - /nopt/1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} dev: true /normalize-path/3.0.0: @@ -3131,8 +2623,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /nwsapi/2.2.2: - resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + /nwsapi/2.2.1: + resolution: {integrity: sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==} dev: true /object-assign/4.1.1: @@ -3144,16 +2636,8 @@ packages: engines: {node: '>= 6'} dev: true - /object-inspect/1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-is/1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: true /object-keys/1.1.1: @@ -3161,48 +2645,48 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign/4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign/4.1.3: + resolution: {integrity: sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.1.4 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true - /object.entries/1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + /object.entries/1.1.5: + resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true - /object.fromentries/2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + /object.fromentries/2.0.5: + resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true - /object.hasown/1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + /object.hasown/1.1.1: + resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true - /object.values/1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + /object.values/1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true /once/1.4.0: @@ -3235,6 +2719,13 @@ packages: word-wrap: 1.2.3 dev: true + /p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + /p-limit/3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3242,11 +2733,11 @@ packages: yocto-queue: 0.1.0 dev: true - /p-limit/4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} dependencies: - yocto-queue: 1.0.0 + p-limit: 1.3.0 dev: true /p-locate/5.0.0: @@ -3256,6 +2747,11 @@ packages: p-limit: 3.1.0 dev: true + /p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3263,10 +2759,15 @@ packages: callsites: 3.1.0 dev: true - /parse5/7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + /parse5/7.0.0: + resolution: {integrity: sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==} dependencies: - entities: 4.4.0 + entities: 4.3.1 + dev: true + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} dev: true /path-exists/4.0.0: @@ -3293,10 +2794,6 @@ packages: engines: {node: '>=8'} dev: true - /pathe/1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - /pathval/1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true @@ -3315,37 +2812,38 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pkg-types/1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + /popmotion/11.0.3: + resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true + framesync: 6.0.1 + hey-listen: 1.0.8 + style-value-types: 5.0.0 + tslib: 2.4.0 + dev: false - /postcss-import/14.1.0_postcss@8.4.21: + /postcss-import/14.1.0_postcss@8.4.16: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.16 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 dev: true - /postcss-js/4.0.1_postcss@8.4.21: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + /postcss-js/4.0.0_postcss@8.4.16: + resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: - postcss: ^8.4.21 + postcss: ^8.3.3 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.21 + postcss: 8.4.16 dev: true - /postcss-load-config/3.1.4_postcss@8.4.21: + /postcss-load-config/3.1.4_postcss@8.4.16: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -3357,23 +2855,23 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.1.0 - postcss: 8.4.21 + lilconfig: 2.0.6 + postcss: 8.4.16 yaml: 1.10.2 dev: true - /postcss-nested/6.0.0_postcss@8.4.21: - resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} + /postcss-nested/5.0.6_postcss@8.4.16: + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.21 - postcss-selector-parser: 6.0.11 + postcss: 8.4.16 + postcss-selector-parser: 6.0.10 dev: true - /postcss-selector-parser/6.0.11: - resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + /postcss-selector-parser/6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -3384,8 +2882,8 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss/8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + /postcss/8.4.16: + resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.4 @@ -3412,11 +2910,12 @@ packages: react-is: 17.0.2 dev: true - /pretty-format/29.5.0: - resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /pretty-format/28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@jest/schemas': 29.4.3 + '@jest/schemas': 28.1.3 + ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -3432,19 +2931,11 @@ packages: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /pstree.remy/1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true - - /punycode/2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true - /querystringify/2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -3479,24 +2970,14 @@ packages: engines: {node: '>=0.10.0'} dev: true - /react-svg-pan-zoom/3.12.1: - resolution: {integrity: sha512-ug1LHCN5qed56C64xFypr/ClajuMFkig1OKvwJrIgGeSyHOjWM7XGgSgeP3IfHAkNw8QEc6a31ggZRpTijWYRw==} + /react-svg-pan-zoom/3.11.0_react@18.2.0: + resolution: {integrity: sha512-xK2tpfp4YksHOfyMZH5zXP52ARLSBgkoJgWNJmJ1B+6O1tkuf23TQp7Q4m9GG5IRSK5KWO0JEGEWlNYG9+iiug==} + peerDependencies: + react: '>=17.0.0' dependencies: prop-types: 15.8.1 - transformation-matrix: 2.15.0 - dev: false - - /react-window/1.8.8_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==} - engines: {node: '>8.0.0'} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - '@babel/runtime': 7.21.0 - memoize-one: 5.2.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + transformation-matrix: 2.12.0 dev: false /react/18.2.0: @@ -3526,15 +3007,16 @@ packages: strip-indent: 3.0.0 dev: true - /regenerator-runtime/0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: true /regexp.prototype.flags/1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 + define-properties: 1.1.4 functions-have-names: 1.2.3 dev: true @@ -3543,10 +3025,6 @@ packages: engines: {node: '>=8'} dev: true - /requires-port/1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3556,7 +3034,7 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.10.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -3565,7 +3043,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.10.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -3582,43 +3060,35 @@ packages: glob: 7.2.3 dev: true - /rollup/3.20.1: - resolution: {integrity: sha512-sz2w8cBJlWQ2E17RcpvHuf4sk2BQx4tfKDnjNPikEpLEevrbIAR7CH3PGa2hpPwWbNgPaA9yh9Jzljds5bc9zg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + /rollup/2.77.2: + resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==} + engines: {node: '>=10.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 - /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /safe-regex-test/1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.0 - is-regex: 1.1.4 + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass/1.59.3: - resolution: {integrity: sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==} + /sass/1.54.3: + resolution: {integrity: sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.3.0 + immutable: 4.1.0 source-map-js: 1.0.2 dev: true @@ -3634,23 +3104,13 @@ packages: dependencies: loose-envify: 1.4.0 - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true - - /semver/7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true dependencies: @@ -3673,19 +3133,8 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 - dev: true - - /siginfo/2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /simple-update-notifier/1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - dependencies: - semver: 7.0.0 + get-intrinsic: 1.1.2 + object-inspect: 1.12.2 dev: true /sirv/2.0.2: @@ -3702,14 +3151,6 @@ packages: engines: {node: '>=8'} dev: true - /slice-ansi/5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true - /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -3720,74 +3161,39 @@ packages: engines: {node: '>=0.10.0'} requiresBuild: true dev: true + optional: true - /stack-utils/2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true - /stackback/0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env/3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /stop-iteration-iterator/1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.5 - dev: true - - /string-width/5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.0.1 - dev: true - - /string.prototype.matchall/4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + /string.prototype.matchall/4.0.7: + resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.0 + define-properties: 1.1.4 + es-abstract: 1.20.1 + get-intrinsic: 1.1.2 has-symbols: 1.0.3 - internal-slot: 1.0.5 + internal-slot: 1.0.3 regexp.prototype.flags: 1.4.3 side-channel: 1.0.4 dev: true - /string.prototype.trim/1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} + /string.prototype.trimend/1.0.5: + resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true - /string.prototype.trimend/1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + /string.prototype.trimstart/1.0.5: + resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimstart/1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true /strip-ansi/6.0.1: @@ -3797,13 +3203,6 @@ packages: ansi-regex: 5.0.1 dev: true - /strip-ansi/7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3821,11 +3220,12 @@ packages: engines: {node: '>=8'} dev: true - /strip-literal/1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + /style-value-types/5.0.0: + resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} dependencies: - acorn: 8.8.2 - dev: true + hey-listen: 1.0.8 + tslib: 2.4.0 + dev: false /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -3846,32 +3246,14 @@ packages: engines: {node: '>= 0.4'} dev: true - /sweetalert2-react-content/5.0.7_r4rqjkexjvnqlr7bwwrf47cmui: - resolution: {integrity: sha512-8Fk82Mpk45lFXpJWKIFF/lq8k/dJKDDQGFcuqVosaL/qRdViyAs5+u37LoTGfnOIvf+rfQB3PAXcp1XLLn+0ew==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - sweetalert2: ^11.0.0 - dependencies: - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - sweetalert2: 11.7.3 - dev: false - - /sweetalert2/11.7.3: - resolution: {integrity: sha512-fUN/fyVSBZNtY4Rr/Qtxn7tNNnlRAbUhQxTQ9uOo0xVMIHBmqq4/9pau5N9dB2pvkB353XL/ywRAycscLoYU3w==} - dev: false - /symbol-tree/3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /tailwindcss/3.2.7_postcss@8.4.21: - resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==} + /tailwindcss/3.1.8: + resolution: {integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==} engines: {node: '>=12.13.0'} hasBin: true - peerDependencies: - postcss: ^8.0.9 dependencies: arg: 5.0.2 chokidar: 3.5.3 @@ -3879,20 +3261,19 @@ packages: detective: 5.2.1 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.2.11 glob-parent: 6.0.2 is-glob: 4.0.3 - lilconfig: 2.1.0 - micromatch: 4.0.5 + lilconfig: 2.0.6 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.21 - postcss-import: 14.1.0_postcss@8.4.21 - postcss-js: 4.0.1_postcss@8.4.21 - postcss-load-config: 3.1.4_postcss@8.4.21 - postcss-nested: 6.0.0_postcss@8.4.21 - postcss-selector-parser: 6.0.11 + postcss: 8.4.16 + postcss-import: 14.1.0_postcss@8.4.16 + postcss-js: 4.0.0_postcss@8.4.16 + postcss-load-config: 3.1.4_postcss@8.4.16 + postcss-nested: 5.0.6_postcss@8.4.16 + postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 resolve: 1.22.1 @@ -3904,17 +3285,13 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /tinybench/2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool/0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + /tinypool/0.2.4: + resolution: {integrity: sha512-Vs3rhkUH6Qq1t5bqtb816oT+HeJTXfwt2cbPH17sWHIYKTotQIFPk3tf2fgqRrVyMDVOc1EnPgzIxfIulXVzwQ==} engines: {node: '>=14.0.0'} dev: true - /tinyspy/1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + /tinyspy/1.0.0: + resolution: {integrity: sha512-FI5B2QdODQYDRjfuLF+OrJ8bjWRMCXokQPcwKm0W3IzcbUmBNv536cQc7eXGoAuXphZwgx1DFbqImwzz08Fnhw==} engines: {node: '>=14.0.0'} dev: true @@ -3935,40 +3312,32 @@ packages: engines: {node: '>=6'} dev: true - /touch/3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: true - - /tough-cookie/4.1.2: - resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + /tough-cookie/4.0.0: + resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 + punycode: 2.1.1 + universalify: 0.1.2 dev: true - /tr46/4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + /tr46/3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} dependencies: - punycode: 2.3.0 + punycode: 2.1.1 dev: true - /transformation-matrix/2.15.0: - resolution: {integrity: sha512-HN3kCvvH4ug3Xm/ycOfCFQOOktg5htxlC4Ih1Z7Wb6BMtQho+q+irOdGo10ARRKpqkRBXgBzQFw/AVmR0oIf0g==} + /transformation-matrix/2.12.0: + resolution: {integrity: sha512-BbzXM7el7rNwIr1s87m8tcffH5qgY+HYROLn3BStRU9Y6vYTL37YZKadfNPEvGbP813iA1h8qflo4pa2TomkyQ==} dev: false - /tsconfig-paths/3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + /tsconfig-paths/3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 + json5: 1.0.1 + minimist: 1.2.6 strip-bom: 3.0.0 dev: true @@ -3976,14 +3345,18 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tsutils/3.21.0_typescript@5.0.2: + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + + /tsutils/3.21.0_typescript@4.7.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.0.2 + typescript: 4.7.4 dev: true /type-check/0.3.2: @@ -4010,24 +3383,12 @@ packages: engines: {node: '>=10'} dev: true - /typed-array-length/1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: true - - /typescript/5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} + /typescript/4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} hasBin: true dev: true - /ufo/1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -4037,22 +3398,18 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undefsafe/2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true - - /universalify/0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + /update-browserslist-db/1.0.5_browserslist@4.21.3: + resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.5 + browserslist: 4.21.3 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -4060,88 +3417,56 @@ packages: /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 - dev: true - - /url-parse/1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 + punycode: 2.1.1 dev: true /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /vite-node/0.29.7_y7rghahg7ddu72pko63vhsxa44: - resolution: {integrity: sha512-PakCZLvz37yFfUPWBnLa1OYHPCGm5v4pmRrTcFN4V/N/T3I6tyP3z07S//9w+DdeL7vVd0VSeyMZuAh+449ZWw==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1_y7rghahg7ddu72pko63vhsxa44 - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser + /v8-compile-cache/2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /vite/4.2.1_y7rghahg7ddu72pko63vhsxa44: - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + /vite/3.0.4_sass@1.54.3: + resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: - '@types/node': '>= 14' less: '*' sass: '*' stylus: '*' - sugarss: '*' terser: ^5.4.0 peerDependenciesMeta: - '@types/node': - optional: true less: optional: true sass: optional: true stylus: optional: true - sugarss: - optional: true terser: optional: true dependencies: - '@types/node': 18.15.5 - esbuild: 0.17.12 - postcss: 8.4.21 + esbuild: 0.14.54 + postcss: 8.4.16 resolve: 1.22.1 - rollup: 3.20.1 - sass: 1.59.3 + rollup: 2.77.2 + sass: 1.54.3 optionalDependencies: fsevents: 2.3.2 dev: true - /vitest/0.29.7_7ihdbf3sbtvnujsbwplempk3fa: - resolution: {integrity: sha512-aWinOSOu4jwTuZHkb+cCyrqQ116Q9TXaJrNKTHudKBknIpR0VplzeaOUuDF9jeZcrbtQKZQt6yrtd+eakbaxHg==} + /vitest/0.20.3_hymhw3vkyr5yfvzfskw3x5v26q: + resolution: {integrity: sha512-cXMjTbZxBBUUuIF3PUzEGPLJWtIMeURBDXVxckSHpk7xss4JxkiiWh5cnIlfGyfJne2Ii3QpbiRuFL5dMJtljw==} engines: {node: '>=v14.16.0'} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@vitest/browser': '*' '@vitest/ui': '*' + c8: '*' happy-dom: '*' jsdom: '*' - safaridriver: '*' - webdriverio: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -4149,53 +3474,41 @@ packages: optional: true '@vitest/ui': optional: true + c8: + optional: true happy-dom: optional: true jsdom: optional: true - safaridriver: - optional: true - webdriverio: - optional: true dependencies: - '@types/chai': 4.3.4 + '@types/chai': 4.3.3 '@types/chai-subset': 1.3.3 - '@types/node': 18.15.5 - '@vitest/expect': 0.29.7 - '@vitest/runner': 0.29.7 - '@vitest/spy': 0.29.7 - '@vitest/ui': 0.29.7 - '@vitest/utils': 0.29.7 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 + '@types/node': 18.6.4 + '@vitest/ui': 0.20.3 + chai: 4.3.6 debug: 4.3.4 - jsdom: 21.1.1 - 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_y7rghahg7ddu72pko63vhsxa44 - vite-node: 0.29.7_y7rghahg7ddu72pko63vhsxa44 - why-is-node-running: 2.2.2 + jsdom: 20.0.0 + local-pkg: 0.4.2 + tinypool: 0.2.4 + tinyspy: 1.0.0 + vite: 3.0.4_sass@1.54.3 transitivePeerDependencies: - less - sass - stylus - - sugarss - supports-color - terser dev: true - /w3c-xmlserializer/4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + /w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer/3.0.0: + resolution: {integrity: sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==} + engines: {node: '>=12'} dependencies: xml-name-validator: 4.0.0 dev: true @@ -4217,11 +3530,11 @@ packages: engines: {node: '>=12'} dev: true - /whatwg-url/12.0.1: - resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} - engines: {node: '>=14'} + /whatwg-url/11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} dependencies: - tr46: 4.1.1 + tr46: 3.0.0 webidl-conversions: 7.0.0 dev: true @@ -4235,27 +3548,6 @@ packages: is-symbol: 1.0.4 dev: true - /which-collection/1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array/1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: true - /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4264,15 +3556,6 @@ packages: isexe: 2.0.0 dev: true - /why-is-node-running/2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} @@ -4282,12 +3565,12 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws/8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + /ws/8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true @@ -4309,10 +3592,6 @@ packages: engines: {node: '>=0.4'} dev: true - /yallist/3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true @@ -4326,8 +3605,3 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - - /yocto-queue/1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true diff --git a/public/images/arrow-down.svg b/public/images/arrow-down.svg deleted file mode 100644 index b15f9a9..0000000 --- a/public/images/arrow-down.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/public/smartcomponent/svg-layout-designer.html b/public/smartcomponent/svg-layout-designer.html deleted file mode 100644 index 210b312..0000000 --- a/public/smartcomponent/svg-layout-designer.html +++ /dev/null @@ -1,2 +0,0 @@ - \ No newline at end of file diff --git a/public/smartcomponent/svg-layout-designer.ts b/public/smartcomponent/svg-layout-designer.ts deleted file mode 100644 index 3915f5b..0000000 --- a/public/smartcomponent/svg-layout-designer.ts +++ /dev/null @@ -1,490 +0,0 @@ -namespace SmartBusiness.Web.Components { - /** - * Types macros - */ - type IHistoryState = SVGLD.IHistoryState; - type IEditorState = SVGLD.IEditorState; - type IConfiguration = SVGLD.IConfiguration; - type ILanguage = SVGLD.ILanguage; - - export class SVGLayoutDesigner extends Components.ComponentBase { - - private _hooks: Record void>; - public App: AppController; - public Editor: EditorController; - - public constructor(componentInfo: KnockoutComponentTypes.ComponentInfo, params: any) { - super(componentInfo, params); - this.App = new AppController(this, this.$component); - this.Editor = new EditorController(this, this.$component); - this._hooks = {}; - } - - /** - * Return the root HTML component of the SmartComponent - * In the iframe, it would be the document. - */ - public GetRootComponent() { - return this.$component[0] - .querySelector('iframe') - .contentDocument; - } - - /** - * Add the a new event listener that will be delete on call, - * optionnally call a callback - * @param callback Callback function to call in the event listener - * @param eventType Event type for the listener to listen to - */ - public AddEventListener(eventType: string, callback: ((...args: any[]) => void) | undefined) { - const root = this.GetRootComponent(); - const listener = (e: CustomEvent) => { - e.target.removeEventListener(e.type, listener); - callback && callback(e.detail); - }; - root.addEventListener(eventType, listener); - } - - /// Hooks /// - - private static EDITOR_LISTENER_TYPE = 'editorListener'; - - /** - * Add a hook to the editor state change. - * After every time an action is perform on the editor, the callback will be called - * @param callback Callback to add that listen to the event - */ - public AddEditorListenerHook(hookId: string, callback: (state: IEditorState) => void): void { - const root = this.GetRootComponent(); - const customEvent = (e: CustomEvent) => { - callback(e.detail); - } - - if (this._hooks[hookId] !== undefined) { - console.error(`HookId is already occupied. Please use a different HookId: ${hookId}`); - return; - } - - this._hooks[hookId] = customEvent; - root.addEventListener(SVGLayoutDesigner.EDITOR_LISTENER_TYPE, customEvent); - } - - /** - * Remove a hook to the editor state change. - * @param callback Callback to remove that listen to the event - */ - public RemoveEditorListenerHook(hookId): void { - const root = this.GetRootComponent(); - root.removeEventListener(SVGLayoutDesigner.EDITOR_LISTENER_TYPE, this._hooks[hookId]); - delete this._hooks[hookId]; - } - - - /// Macros /// - - /** - * Reset to the first state and clear all history - */ - public Reset(): void { - this.Editor.GetEditorState((state) => { - this.Editor.SetHistory({ history: [state.history[0]] }); - }); - } - - /** - * Clear all previous history but the last state - */ - public ClearHistory(): void { - this.Editor.GetEditorState((state) => { - this.Editor.SetHistory({ history: [state.history[state.history.length - 1]] }); - }); - } - } - - - class AppController { - app: SVGLayoutDesigner; - $component: JQuery; - - constructor(app: SVGLayoutDesigner, $component: JQuery) { - this.app = app; - this.$component = $component; - } - - /** - * Return the HTML component handling the editor - */ - public GetAppComponent() { - const component = this.$component[0] - .querySelector('iframe') - .contentDocument - .querySelector('.App'); - - if (component === undefined) { - throw new Error('[SVGLD] Cannot hook the event because the editor is not yet open') - } - - return component; - } - - /// App Events /// - - /** - * Load an existing editor state and its history - * This is a macro function for - * ReviveEditorState -> SetEditor -> SetHistory - * @param editorState - */ - public LoadEditor(editorState: IEditorState) { - this.ReviveEditorState(editorState, (state) => { - this.SetEditor(state, () => { - this.app.App.SetAppState(2, () => { - this.app.Editor.SetHistory({ history: state.history, historyCurrentStep: state.historyCurrentStep }); - }); - }); - }); - } - - - /** - * Not to be confused with setHistory, - * change the default configuration for the new containers, symbols etc. - * @param newEditor New editor configuration to set - * @param callback - */ - public SetEditor(newEditor: IEditorState, callback?: (state: IEditorState) => void) { - const eventType = 'setEditor'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: newEditor })) - } - - /** - * Hide the main menu to go to the application. - * SetEditor must be called first or the application will crash. - * @param appState - * @param callback - */ - public SetAppState(appState: SVGLD.AppState, callback?: (state: IEditorState) => void) { - const eventType = 'setAppState'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: appState })) - } - - /** - * Revive the references in the editor state by mutation - * Useful after using JSON.stringify with a replacer - * @param editorState Editor state to revive - * @param callback Callback with the revived state - */ - public ReviveEditorState(editorState: IEditorState, callback: (state: IEditorState) => void) { - const eventType = 'reviveEditorState'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: editorState })); - } - - /** - * Revive the references in the history by mutation - * Useful after using JSON.stringify with a replacer - * @param history History to revive - * @param callback Callback with the revived state - */ - public ReviveHistory(history: IHistoryState[], callback: (state: IHistoryState[]) => void) { - const eventType = 'reviveHistory'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: history })); - } - - /** - * Construct a default EditorState from a given configuration. - * This is the same method used when loading the editor - * for the first time after fetch the configuration from the API. - * @param configuration History to revive - * @param callback Callback with the revived state - */ - public GetDefaultEditorState(configuration: IConfiguration, callback: (state: IEditorState) => void) { - const eventType = 'getDefaultEditorState'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: configuration })); - } - - /** - * Add a language to the app - * @param option Displayed string of the language - * @param language Language containing an id and a dictionary - * @param callback Callback - */ - public AddLanguage(option: string, language: ILanguage, callback?: () => void) { - const eventType = 'addLanguage'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: { language, option } })); - } - - /** - * Set the language of the app (defaults: ['fr', 'en']) - * @param languageId Language identifier for the language to select - * @param callback Callback - */ - public SetLanguage(languageId: string, callback?: (success: boolean) => void) { - const eventType = 'setLanguage'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: languageId })); - } - - /** - * Set the language of the app (defaults: ['fr', 'en']) - * @param languageId Language identifier for the language to select - * @param callback Callback - */ - public GetLanguages(callback: (languages: Record>) => void) { - const eventType = 'getLanguages'; - this.app.AddEventListener(eventType, callback); - const component = this.GetAppComponent(); - component.dispatchEvent(new CustomEvent(eventType)); - } - } - - - class EditorController { - app: SVGLayoutDesigner; - $component: JQuery; - - constructor(app: SVGLayoutDesigner, $component: JQuery) { - this.app = app; - this.$component = $component; - } - - /** - * Return the HTML component handling the editor - */ - public GetEditorComponent() { - const component = this.$component[0] - .querySelector('iframe') - .contentDocument - .querySelector('.Editor'); - - if (component === undefined) { - throw new Error('[SVGLD] Cannot hook the event because the editor is not yet open') - } - - return component; - } - - /// Editor Events /// - - /** - * Return in a callback the current state in the history of the editor - * @param callback - */ - public GetCurrentHistoryState(callback: (state: IHistoryState) => void) { - const eventType = 'getCurrentHistoryState'; - this.app.AddEventListener(eventType, callback); - const component = this.GetEditorComponent(); - component.dispatchEvent(new CustomEvent(eventType)); - } - - /** - * Return in a callback the current history of the editor - * @param callback - */ - public GetEditorState(callback: (state: IEditorState) => void) { - const eventType = 'getEditorState'; - this.app.AddEventListener(eventType, callback); - const component = this.GetEditorComponent(); - component.dispatchEvent(new CustomEvent(eventType)); - } - - /** - * Return in a callback the current history of the editor as string - * @param callback - */ - public GetEditorStateAsString(callback: (state: string) => void) { - const eventType = 'getEditorStateAsString'; - this.app.AddEventListener(eventType, callback); - const component = this.GetEditorComponent(); - component.dispatchEvent(new CustomEvent(eventType)); - } - - /** - * Set the current history of the editor - * @param history Whole history of the editor - * @param callback (optional) - */ - public SetHistory( - { history, historyCurrentStep }: { history: IHistoryState[], historyCurrentStep?: number}, - callback?: (state: IEditorState) => void - ): void { - const eventType = 'setHistory'; - this.app.AddEventListener(eventType, callback); - const component = this.GetEditorComponent(); - component.dispatchEvent(new CustomEvent(eventType, { detail: { history, historyCurrentStep }})); - } - - /** - * Add a new state to the editor - * @param historyState New history state to append - * @param callback - */ - public AppendNewHistoryState(historyState: IHistoryState, callback?: (state: IEditorState) => void) { - const eventType = 'appendNewState'; - this.app.AddEventListener(eventType, callback); - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail: historyState })); - } - - /** - * Create a new container at the given index position in a given parent container - * @param index Position to insert the container - * @param type Container type to create - * @param parentId Parent container of the new container - * @param callback - */ - public AddContainer(index: number, type: string, parentId: string, callback?: (state: IEditorState) => void) { - const eventType = 'addContainer'; - this.app.AddEventListener(eventType, callback); - const detail = { - index, - type, - parentId - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - /** - * Create a new container at the given index position in the current selected container - * @param index Position to insert the container - * @param type Container type to create - * @param callback - * @deprecated Do not use this function, use AddContainer instead - */ - public AddContainerToSelectedContainer(index: number, type: string, callback?: (state: IEditorState) => void) { - const eventType = 'addContainerToSelectedContainer'; - this.app.AddEventListener(eventType, callback); - const detail = { - index, - type - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - /** - * Append a new container in a given parent container - * @param type Container type to create - * @param parentId Parent container of the new container - * @param callback - */ - public AppendContainer(type: string, parentId: string, callback?: (state: IEditorState) => void) { - const eventType = 'appendContainer'; - this.app.AddEventListener(eventType, callback); - const detail = { - type, - parentId - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - - /** - * Append a new container in the current selected container - * @param type Container type to create - * @param callback - * @deprecated Do not use this function, use AppendContainer instead - */ - public AppendContainerToSelectedContainer(type: string, callback?: (state: IEditorState) => void) { - const eventType = 'appendContainerToSelectedContainer'; - this.app.AddEventListener(eventType, callback); - const detail = { - type - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - /** - * Select a container by id - * @param containerId Container's id to select - * @param callback - * @deprecated Do not use this function - */ - public SelectContainer(containerId: string, callback?: (state: IEditorState) => void) { - const eventType = 'selectContainer'; - this.app.AddEventListener(eventType, callback); - const detail = { - containerId - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - /** - * Delete a container by id - * @param containerId Container's id to delete - * @param callback - */ - public DeleteContainer(containerId: string, callback?: (state: IEditorState) => void) { - const eventType = 'deleteContainer'; - this.app.AddEventListener(eventType, callback); - const detail = { - containerId - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - - /** - * Create a new symbol - * @param name Name of the symbol present in the config - * @param callback - */ - public AddSymbol(name: string, callback?: (state: IEditorState) => void) { - const eventType = 'addSymbol'; - this.app.AddEventListener(eventType, callback); - const detail = { - name - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - /** - * Select a symbol by id - * @param symbolId Symbol's id to select - * @param callback - * @deprecated Do not use this function - */ - public SelectSymbol(symbolId: string, callback?: (state: IEditorState) => void) { - const eventType = 'selectSymbol'; - this.app.AddEventListener(eventType, callback); - const detail = { - symbolId - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - - /** - * Delete a symbol by id - * @param symbolId Symbol's id to delete - * @param callback - */ - public DeleteSymbol(symbolId: string, callback?: (state: IEditorState) => void) { - const eventType = 'deleteSymbol'; - this.app.AddEventListener(eventType, callback); - const detail = { - symbolId - } - this.GetEditorComponent().dispatchEvent(new CustomEvent(eventType, { detail })); - } - } - - ko.components.register('svg-layout-designer', { - viewModel: { - createViewModel: function (params, componentInfo) { - return new SmartBusiness.Web.Components.SVGLayoutDesigner(componentInfo, params); - } - }, - template: { element: 'svg-layout-designer' } - }); -} - diff --git a/public/smartcomponent/svg-layout-designer.xcomponent b/public/smartcomponent/svg-layout-designer.xcomponent deleted file mode 100644 index 0bf7b1d..0000000 --- a/public/smartcomponent/svg-layout-designer.xcomponent +++ /dev/null @@ -1,14 +0,0 @@ - - - false - 0A61000D-FC2D-4490-BB3E-0FAED2AF3FDC - - svg-layout-designer - - - viewModel - ViewModel - - - svg-layout-designer - diff --git a/public/svgld.d.ts b/public/svgld.d.ts deleted file mode 100644 index 114b2ed..0000000 --- a/public/svgld.d.ts +++ /dev/null @@ -1,583 +0,0 @@ -declare namespace SVGLD { -export interface IMargin { - left?: number; - bottom?: number; - top?: number; - right?: number; -} - -export interface IPoint { - x: number; - y: number; -} - - - - -/** - * Model of available symbol to configure the application */ -export interface IAvailableSymbol { - Name: string; - Image: IImage; - /** displayed text */ - DisplayedText?: string; - isVertical?: boolean; - offset?: number; - Width?: number; - Height?: number; - PositionReference?: PositionReference; - /** An existing or new available container */ - AssociatedContainer?: IAvailableContainer; -} - -export interface IAPIConfiguration { - apiFetchUrl?: string; - apiSetContainerListUrl?: string; - apiGetFeedbackUrl?: string; -} - - -export interface ISymbolModel { - /** Identifier */ - id: string; - /** Displayed Text */ - displayedText: string; - /** Type */ - type: string; - /** Configuration of the symbol */ - config: IAvailableSymbol; - isVertical: boolean; - /** offset */ - offset: number; - /** Width */ - width: number; - /** Height */ - height: number; - /** List of linked container id */ - linkedContainers: Set; - /** Dimensions options */ - showDimension: boolean; -} - - -export interface IPattern { - /** - * Unique id for the pattern - */ - id: string; - /** - * Text to display in the sidebar - */ - text: string; - /** - * IAvailableContainer id used to wrap the children. - */ - wrapper: string; - /** - * List of ids of Pattern or IAvailableContainer - * If a IAvailableContainer and a Pattern have the same id, - * IAvailableContainer will be prioritized - */ - children: string[]; -} -export type ContainerOrPattern = IAvailableContainer | IPattern; -export function GetPattern(id: string, configs: Map, patterns: Map): ContainerOrPattern | undefined; -export function IsPattern(id: string, configs: Map, patterns: Map): boolean; - - - -export interface IHistoryState { - /** Last editor action */ - lastAction: string; - /** Reference to the main container */ - mainContainer: string; - containers: Map; - /** Counter of type of container. Used for ids. */ - typeCounters: Record; - /** List of symbols */ - symbols: Map; -} - -export interface IKeyValue { - Key: string; - Value: string; -} - - -export interface IGetFeedbackRequest { - /** Current application state */ - ApplicationState: IHistoryState; -} - - -export interface IInputGroup { - key: string; - text: React.ReactNode; - value: string; -} - - - -export interface IAction { - Id: string; - CustomLogo: IImage; - Label: string; - Description: string; - Action: string; - AddingBehavior: AddMethod; -} - -export interface ILanguage { - language: string; - dictionary: Record; - languageChange?: (selected: string) => void; -} - - - -export interface ISetContainerListResponse { - Containers: IAvailableContainer[]; - AddingBehavior?: AddMethod; -} - - -export interface IContainerModel { - children: string[]; - properties: IContainerProperties; - userData: Record; -} -/** - * Macro for creating the interface - * Do not add methods since they will be lost during serialization - */ -export class ContainerModel implements IContainerModel { - children: string[]; - properties: IContainerProperties; - userData: Record; - constructor(properties: IContainerProperties, children?: string[], userData?: {}); -} - -export interface IStyle { - stroke?: string; - strokeOpacity?: number; - strokeWidth?: number; - fill?: string; - fillOpacity?: number; -} - -/** - * A SizePointer is a pointer in a 1 dimensional array of width/space - * x being the address where the pointer is pointing - * width being the overall (un)allocated space affected to the address - */ -export interface ISizePointer { - x: number; - width: number; -} - - -export interface IGetFeedbackResponse { - messages: IMessage[]; -} - - - - - - -/** Model of configuration for the application to configure it */ -export interface IConfiguration { - AvailableContainers: IAvailableContainer[]; - AvailableSymbols: IAvailableSymbol[]; - Categories: ICategory[]; - Patterns: IPattern[]; - MainContainer: IAvailableContainer; - APIConfiguration?: IAPIConfiguration; -} - - - - -export interface ISetContainerListRequest { - /** Name of the action declared in the API */ - Action: IAction; - /** Selected container */ - Container: IContainerModel; - /** The previous sibling container */ - PreviousContainer: IContainerModel | undefined; - /** The next sibling container */ - NextContainer: IContainerModel | undefined; - /** Current application state */ - ApplicationState: IHistoryState; -} - - - - - - - -/** - * Properties of a container - */ -export interface IContainerProperties { - /** id of the container */ - id: string; - /** type matching the configuration on construction */ - type: string; - /** id of the parent container (null when there is no parent) */ - parentId: string; - /** id of the linked symbol ('' when there is no parent) */ - linkedSymbolId: string; - /** Text displayed in the container */ - displayedText: string; - /** orientation */ - orientation: Orientation; - /** horizontal offset */ - x: number; - /** vertical offset */ - y: number; - /** margin */ - margin: IMargin; - /** width */ - width: number; - /** height */ - height: number; - /** - * Minimum width (min=1) - */ - minWidth: number; - /** - * Maximum width - */ - maxWidth: number; - /** - * Minimum height (min=1) - */ - minHeight: number; - /** - * Maximum height - */ - maxHeight: number; - /** true if anchor, false otherwise */ - isAnchor: boolean; - /** true if flex, false otherwise */ - isFlex: boolean; - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - positionReference: PositionReference; - /** Hide the children in the treeview */ - hideChildrenInTreeview: boolean; - /** Dimensions options */ - dimensionOptions: IDimensions; - /** - * Warnings of a container - */ - warning: string; - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - customSVG?: string; - /** - * (optional) - * Style of the - */ - style?: IStyle; - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - userData?: IKeyValue[]; -} - - - - - - - - - -/** Model of available container used in application configuration */ -export interface IAvailableContainer { - /** type */ - Type: string; - /** displayed text */ - DisplayedText?: string; - /** category */ - Category?: string; - /** orientation */ - Orientation?: Orientation; - /** horizontal offset */ - X?: number; - /** vertical offset */ - Y?: number; - /** width */ - Width?: number; - /** height */ - Height?: number; - /** - * Minimum width (min=1) - */ - MinWidth?: number; - /** - * Maximum width - */ - MaxWidth?: number; - /** - * Minimum height (min=1) - */ - MinHeight?: number; - /** - * Maximum height - */ - MaxHeight?: number; - /** margin */ - Margin?: IMargin; - /** true if anchor, false otherwise */ - IsAnchor?: boolean; - /** true if flex, false otherwise */ - IsFlex?: boolean; - /** Method used on container add */ - AddMethod?: AddMethod; - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - PositionReference?: PositionReference; - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - CustomSVG?: string; - /** - * (optional) - * Disabled when Pattern is used. - * - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - DefaultChildType?: string; - /** - * Allow to use a Pattern to create the list of children - * Cannot be used with DefaultChildType, - * DefaultChildType will be disabled for this container and the children - */ - Pattern?: string; - /** Hide the children in the treeview */ - HideChildrenInTreeview?: boolean; - /** Dimensions options */ - DimensionOptions?: IDimensions; - /** - * if true, hide the entry in the sidebar (default: false) - */ - IsHidden?: boolean; - /** - * Disable a list of available container to be added inside - */ - Blacklist?: string[]; - /** - * Cannot be used with blacklist. Whitelist will be prioritized. - * To disable the whitelist, Whitelist must be undefined. - * Only allow a set of available container to be added inside - */ - Whitelist?: string[]; - /** - * (optional) - * Style of the - */ - Style?: IStyle; - /** - * List of possible actions shown on right-click - */ - Actions?: IAction[]; - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - UserData?: IKeyValue[]; -} - - -export interface IMessage { - text: string; - type: MessageType; -} - - - -export interface IEditorState { - history: IHistoryState[]; - historyCurrentStep: number; - configuration: IConfiguration; -} - -export interface ICategory { - Type: string; - DisplayedText?: string; -} - -export interface IReplaceContainer { - id: string | undefined; - isReplacing: boolean; - category: string | undefined; -} - - -export interface IDimensionOptions { - positions: Position[]; - /** - * Stroke color - */ - color?: string; - /** stroke-width */ - width?: number; - /** stroke-dasharray */ - dashArray?: string; -} - - - -export interface IDimensions { - /** if true, show the dimension of the container */ - selfDimensions: IDimensionOptions; - /** if true, show the dimension of the container */ - selfMarginsDimensions: IDimensionOptions; - /** if true show the overall dimensions of its children */ - childrenDimensions: IDimensionOptions; - /** - * if true, allows a parent dimension borrower to borrow its x coordinate - * as a reference point for a dimension - */ - markPosition: Orientation[]; - /** - * if true, show a dimension from the edge of the container to end - * and insert dimensions marks at lift up children (see liftDimensionToBorrower) - */ - dimensionWithMarks: IDimensionOptions; -} - -/** - * Model of an image with multiple source - * It must at least have one source. - * - * If Url/Base64Image and Svg are set, - * Url/Base64Image will be shown in the menu while SVG will be drawn - */ -export interface IImage { - /** Name of the image */ - Name: string; - /** (optional) Url of the image */ - Url?: string; - /** (optional) base64 data of the image */ - Base64Image?: string; - /** (optional) SVG string */ - Svg?: string; -} - -export enum MessageType { - Normal = 0, - Success = 1, - Warning = 2, - Error = 3 -} - -/** - * Add method when creating a container - * - Append will append to the last children in list - * - Insert will always place it at the begining - * - Replace will remove the selected container and insert a new one - * (default: Append) - */ -export enum AddMethod { - Append = 0, - Insert = 1, - Replace = 2, - ReplaceParent = 3 -} - -/** - * Describe the type of the property. - * Used for the assignation in the OnPropertyChange function - * See ContainerOperations.ts's OnPropertyChange - */ -export enum PropertyType { - /** - * Simple property: is not inside any object: id, x, width... (default) - */ - Simple = 0, - /** - * Style property: is inside the style object: stroke, fillOpacity... - */ - Style = 1, - /** - * Margin property: is inside the margin property: left, bottom, top, right... - */ - Margin = 2, - /** - * Dimension options - */ - SelfDimension = 3, - SelfMarginDimension = 4, - ChildrenDimensions = 5, - DimensionWithMarks = 6, - DimensionOptions = 7 -} - -export enum PositionReference { - TopLeft = 0, - TopCenter = 1, - TopRight = 2, - CenterLeft = 3, - CenterCenter = 4, - CenterRight = 5, - BottomLeft = 6, - BottomCenter = 7, - BottomRight = 8 -} - -export enum AppState { - MainMenu = 0, - Loading = 1, - Loaded = 2 -} - -export enum Orientation { - Horizontal = 0, - Vertical = 1 -} - -export enum Position { - Left = 0, - Down = 1, - Up = 2, - Right = 3 -} - -} diff --git a/public/workers/message_packet_worker.js b/public/workers/message_packet_worker.js deleted file mode 100644 index bd60fc8..0000000 --- a/public/workers/message_packet_worker.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Web worker handling message API. - * When sending quickly multiple request, - * a single packet of message merging all request' responses is returned - */ - -const DELAY_BEFORE_SEND = 200; -const queue = []; -let messagePacket = []; -onmessage = async(e) => { - let packetLength - - const url = e.data.url; - const state = e.data.state; - const request = { - ApplicationState: state - }; - const dataParsed = JSON.stringify(request, GetCircularReplacerKeepDataStructure()); - queue.push(request); - fetch(url, { - method: 'POST', - headers: new Headers({ - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': 'application/json' - }), - body: dataParsed - }) - .then((response) => - response.json() - ) - .then(async(json) => { - messagePacket.push.apply(messagePacket, json.messages); - queue.pop(); - - // The sleep allow the message packet to be filled by - // others requests before being sent as a single batch - // Reducing the wait time will reduce latency but increase error rate - let doLoop = true; - do { - packetLength = messagePacket.length; - await sleep(DELAY_BEFORE_SEND); - const newPacketLength = messagePacket.length; - doLoop = newPacketLength !== packetLength; - packetLength = newPacketLength; - } while (doLoop); - - if (queue.length <= 0 && messagePacket.length > 0) { - console.debug(`[GetFeedback] Packet size before sent: ${messagePacket.length}`) - postMessage(messagePacket) - messagePacket.splice(0); - } - }); -}; - -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -function GetCircularReplacerKeepDataStructure() -{ - return (key, value) => { - if (key === 'parent') { - return; - } - - if (key === 'containers') { - return [...value.entries()].map((keyPair) => { - return { - Key: keyPair[0], - Value: keyPair[1] - }; - }); - } - - if (key === 'symbols') { - return [...value.entries()].map((keyPair) => { - return { - Key: keyPair[0], - Value: keyPair[1] - }; - }); - } - - if (key === 'linkedContainers') { - return Array.from(value); - } - - return value; - }; -} - diff --git a/public/workers/message_worker.js b/public/workers/message_worker.js deleted file mode 100644 index 62465b4..0000000 --- a/public/workers/message_worker.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Web worker handling message API. - * Return a message of the request. - */ - -onmessage = async(e) => { - const url = e.data.url; - const state = e.data.state; - const request = { - ApplicationState: state - }; - const dataParsed = JSON.stringify(request, GetCircularReplacerKeepDataStructure()); - fetch(url, { - method: 'POST', - headers: new Headers({ - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': 'application/json' - }), - body: dataParsed - }) - .then((response) => - response.json() - ) - .then(async(json) => { - postMessage(json.messages) - }); -}; - -function GetCircularReplacerKeepDataStructure() -{ - return (key, value) => { - if (key === 'parent') { - return; - } - - if (key === 'containers') { - const containers = Array.from(value).map(([Key, Value]) => ({ Key, Value })); - return containers; - } - - if (key === 'symbols') { - const symbols = Array.from(value).map(([Key, Value]) => ({ Key, Value })); - return symbols; - } - - return value; - }; -} - diff --git a/public/workers/worker.js b/public/workers/worker.js deleted file mode 100644 index 915c5bf..0000000 --- a/public/workers/worker.js +++ /dev/null @@ -1,24 +0,0 @@ -onmessage = (e) => { - const data = JSON.stringify(e.data.editorState, getCircularReplacer(), e.data.spaces); - postMessage(data); -}; - -const getCircularReplacer = () => { - return (key, value) => { - if (key === 'containers') { - return [...value.entries()] - .map(([Key, Value]) => ({ Key, Value })); - } - - if (key === 'symbols') { - return [...value.entries()] - .map(([Key, Value]) => ({ Key, Value })); - } - - if (key === 'linkedContainers') { - return Array.from(value); - } - - return value; - }; -}; diff --git a/src/Components/API/api.test.tsx b/src/Components/API/api.test.tsx index 631a3a8..55d63b1 100644 --- a/src/Components/API/api.test.tsx +++ b/src/Components/API/api.test.tsx @@ -1,31 +1,14 @@ -/* eslint-disable @typescript-eslint/naming-convention */ import { describe, it, expect } from 'vitest'; -import { AddMethod } from '../../Enums/AddMethod'; -import { PositionReference } from '../../Enums/PositionReference'; -import { type IAction } from '../../Interfaces/IAction'; -import { type IAvailableContainer } from '../../Interfaces/IAvailableContainer'; -import { type IAvailableSymbol } from '../../Interfaces/IAvailableSymbol'; -import { type ICategory } from '../../Interfaces/ICategory'; -import { type IConfiguration } from '../../Interfaces/IConfiguration'; -import { type IContainerModel, ContainerModel } from '../../Interfaces/IContainerModel'; -import { type IHistoryState } from '../../Interfaces/IHistoryState'; -import { type IPattern } from '../../Interfaces/IPattern'; -import { DEFAULT_DIMENSION_OPTION, DEFAULT_MAINCONTAINER_PROPS, GetDefaultContainerProps } from '../../utils/default'; -import { FetchConfiguration } from './api'; +import { fetchConfiguration } from './api'; -const CSHARP_WEB_API_BASE_URL = 'http://localhost:5209/'; -const CHARP_WEB_API_RESOURCE_URL = 'SVGLD'; -const CSHARP_WEB_API_URL = `${CSHARP_WEB_API_BASE_URL + CHARP_WEB_API_RESOURCE_URL}/`; - -// TODO: Migrate this test to SVGLDWebAPI rather than using test-server/ -describe.concurrent('Test server test', () => { +describe.concurrent('API test', () => { it('Load environment', () => { - const url = import.meta.env.VITE_API_FETCH_URL; + const url = import.meta.env.VITE_API_URL; expect(url).toBe('http://localhost:5000'); }); - it('Fetch configuration', async () => { - const configuration = await FetchConfiguration(); + it('Fetch configuration', async() => { + const configuration = await fetchConfiguration(); expect(configuration.MainContainer).toBeDefined(); expect(configuration.MainContainer.Height).toBeGreaterThan(0); expect(configuration.MainContainer.Width).toBeGreaterThan(0); @@ -33,244 +16,3 @@ describe.concurrent('Test server test', () => { expect(configuration.AvailableSymbols.length).toBeGreaterThan(-1); }); }); - -async function Post2API(resource: string, body: string, method = 'POST'): Promise { - return await new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.open(method, CSHARP_WEB_API_URL + resource, true); - xhr.onreadystatechange = () => { // Call a function when the state changes. - if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { - resolve(xhr.response === 'true'); - } - if (xhr.status === 400) { - reject(xhr); - } - }; - xhr.onerror = () => { - reject(xhr); - }; - xhr.setRequestHeader('Content-type', 'application/json'); - xhr.send(body); - }); -} - -/** - * Serialization tests for type compatibility of csharp classes - * See csharp/SVGLDWebAPI/README.md - */ -describe.concurrent('Models test suite', () => { - it('ActionContainerModel', async () => { - const model: IAction = { - Id: 'string', - CustomLogo: { - Name: 'string', - Url: 'string', - Base64Image: 'string', - Svg: 'string' - }, - Label: 'string', - Description: 'string', - Action: 'string', - AddingBehavior: 0 - }; - const res = await Post2API('ActionContainerModel', JSON.stringify(model)); - expect(res).toBe(true); - }); - - it('AddingBehaviorEnumModel', async () => { - let model: AddMethod = AddMethod.Append; - const res0 = await Post2API('AddingBehaviorEnumModel', JSON.stringify(model)); - model = AddMethod.Insert; - const res1 = await Post2API('AddingBehaviorEnumModel', JSON.stringify(model)); - model = AddMethod.Replace; - const res2 = await Post2API('AddingBehaviorEnumModel', JSON.stringify(model)); - model = AddMethod.ReplaceParent; - const res3 = await Post2API('AddingBehaviorEnumModel', JSON.stringify(model)); - model = 1; - const res4 = await Post2API('AddingBehaviorEnumModel', JSON.stringify(model)); - expect(res0).toBe(true); - expect(res1).toBe(true); - expect(res2).toBe(true); - expect(res3).toBe(true); - expect(res4).toBe(true); - }); - - const mainContainer = new ContainerModel(DEFAULT_MAINCONTAINER_PROPS); - - const containers = new Map(); - const historyState: IHistoryState = { - lastAction: 'string', - mainContainer: mainContainer.properties.id, - containers, - typeCounters: { - main: 1 - }, - symbols: new Map() - }; - - it('ApplicationStateModel', async () => { - const res = await Post2API('ApplicationStateModel', JSON.stringify(historyState)); - expect(res).toBe(true); - }); - - const availableContainerModel: IAvailableContainer = { - Type: 'string', - DisplayedText: 'string', - Category: 'string', - Orientation: 0, - X: 0, - Y: 0, - Width: 0, - Height: 0, - MinWidth: 0, - MaxWidth: 0, - MinHeight: 0, - MaxHeight: 0, - Margin: { - left: 0, - bottom: 0, - top: 0, - right: 0 - }, - IsAnchor: true, - IsFlex: true, - Pattern: 'string', - AddMethod: 0, - DefaultChildType: 'string', - PositionReference: 0, - HideChildrenInTreeview: true, - DimensionOptions: { - childrenDimensions: DEFAULT_DIMENSION_OPTION, - selfDimensions: DEFAULT_DIMENSION_OPTION, - selfMarginsDimensions: DEFAULT_DIMENSION_OPTION, - markPosition: [], - dimensionWithMarks: DEFAULT_DIMENSION_OPTION - }, - IsHidden: true, - Blacklist: [ - 'string' - ], - Whitelist: [ - 'string' - ], - Actions: [ - { - Id: 'string', - CustomLogo: { - Name: 'string', - Url: 'string', - Base64Image: 'string', - Svg: 'string' - }, - Label: 'string', - Description: 'string', - Action: 'string', - AddingBehavior: 0 - } - ], - CustomSVG: 'string', - Style: {} - }; - - it('AvailableContainerModel', async () => { - const res = await Post2API('ApplicationStateModel', JSON.stringify(availableContainerModel)); - expect(res).toBe(true); - }); - - const availableSymbolModel: IAvailableSymbol = { - Name: 'string', - Image: { - Name: 'string', - Url: 'string', - Base64Image: 'string', - Svg: 'string' - }, - PositionReference: PositionReference.BottomCenter, - Width: 0, - Height: 0 - }; - - it('AvailableSymbolModel', async () => { - const res = await Post2API('AvailableSymbolModel', JSON.stringify(availableSymbolModel)); - expect(res).toBe(true); - }); - - const category: ICategory = { - Type: 'string', - DisplayedText: 'string' - }; - - it('Category', async () => { - const res = await Post2API('Category', JSON.stringify(category)); - expect(res).toBe(true); - }); - - const pattern: IPattern = { - children: ['string'], - id: 'string', - text: 'string', - wrapper: 'string' - }; - - it('Configuration', async () => { - const model: IConfiguration = { - AvailableContainers: [ - availableContainerModel - ], - AvailableSymbols: [ - availableSymbolModel - ], - Categories: [ - category - ], - MainContainer: availableContainerModel, - Patterns: [pattern], - APIConfiguration: { - apiFetchUrl: '', - apiGetFeedbackUrl: '', - apiSetContainerListUrl: '' - } - }; - - const res = await Post2API('Configuration', JSON.stringify(model)); - expect(res).toBe(true); - }); - - const containerProperties = GetDefaultContainerProps( - 'container', - 0, - null, - 0, - 0, - 0, - 0, - availableContainerModel - ); - - it('ContainerModel', async () => { - const model: IContainerModel = { - children: [], - properties: containerProperties, - userData: {} - }; - const res = await Post2API('ContainerModel', JSON.stringify(model)); - expect(res).toBe(true); - }); - - it('ContainerProperties', async () => { - const res = await Post2API('ContainerModel', JSON.stringify(containerProperties)); - expect(res).toBe(true); - }); - - it('CSSStyle', async () => { - const model: React.CSSProperties = { - strokeWidth: '0', - fillOpacity: '0', - stroke: 'black', - fill: 'black' - }; - - const res = await Post2API('CSSStyle', JSON.stringify(model)); - expect(res).toBe(true); - }); -}); diff --git a/src/Components/API/api.ts b/src/Components/API/api.ts index 492a289..e113cc9 100644 --- a/src/Components/API/api.ts +++ b/src/Components/API/api.ts @@ -1,22 +1,21 @@ -import { type IConfiguration } from '../../Interfaces/IConfiguration'; -import { type ISetContainerListRequest } from '../../Interfaces/ISetContainerListRequest'; -import { type ISetContainerListResponse } from '../../Interfaces/ISetContainerListResponse'; -import { GetCircularReplacer } from '../../utils/saveload'; +import { Configuration } from '../../Interfaces/Configuration'; /** * Fetch the configuration from the API * @returns {Configation} The model of the configuration for the application */ -export async function FetchConfiguration(): Promise { - const url = import.meta.env.VITE_API_FETCH_URL; - // @ts-expect-error The test library cannot use the Fetch API +export async function fetchConfiguration(): Promise { + const url = `${import.meta.env.VITE_API_URL}`; + // The test library cannot use the Fetch API + // @ts-expect-error // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions if (window.fetch) { return await fetch(url, { method: 'POST' }) .then(async(response) => - await response.json()) as IConfiguration; + await response.json() + ) as Configuration; } return await new Promise((resolve) => { const xhr = new XMLHttpRequest(); @@ -26,40 +25,6 @@ export async function FetchConfiguration(): Promise { resolve(JSON.parse(this.responseText)); } }; - xhr.timeout = 5000; xhr.send(); }); } - -export async function SetContainerList( - request: ISetContainerListRequest, - configurationUrl?: string -): Promise { - const url = configurationUrl ?? import.meta.env.VITE_API_SET_CONTAINER_LIST_URL; - const dataParsed = JSON.stringify(request, GetCircularReplacer()); - // @ts-expect-error The test library cannot use the Fetch API - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (window.fetch) { - return await fetch(url, { - method: 'POST', - headers: new Headers({ - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': 'application/json' - }), - body: dataParsed - }) - .then(async(response) => - await response.json()) as ISetContainerListResponse; - } - return await new Promise((resolve) => { - const xhr = new XMLHttpRequest(); - xhr.open('POST', url, true); - xhr.onreadystatechange = function() { // Call a function when the state changes. - if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { - resolve(JSON.parse(this.responseText)); - } - }; - xhr.setRequestHeader('Content-type', 'application/json'); - xhr.send(dataParsed); - }); -} diff --git a/src/Components/App/Actions/Load.ts b/src/Components/App/Actions/Load.ts deleted file mode 100644 index 356c23a..0000000 --- a/src/Components/App/Actions/Load.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type Dispatch, type SetStateAction } from 'react'; -import { AppState } from '../../../Enums/AppState'; -import { type IEditorState } from '../../../Interfaces/IEditorState'; -import { Revive } from '../../../utils/saveload'; - -export function LoadState( - editorState: IEditorState, - setEditorState: Dispatch>, - setAppState: Dispatch> -): void { - Revive(editorState); - setEditorState(editorState); - setAppState(AppState.Loaded); -} diff --git a/src/Components/App/Actions/MenuActions.ts b/src/Components/App/Actions/MenuActions.ts deleted file mode 100644 index 2a42a0c..0000000 --- a/src/Components/App/Actions/MenuActions.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { type Dispatch, type SetStateAction } from 'react'; -import { type IConfiguration } from '../../../Interfaces/IConfiguration'; -import { FetchConfiguration } from '../../API/api'; -import { type IEditorState } from '../../../Interfaces/IEditorState'; -import { DISABLE_API, GetDefaultEditorState } from '../../../utils/default'; -import { type AppState } from '../../../Enums/AppState'; -import { LoadState } from './Load'; - -export function NewEditor( - editorState: IEditorState, - setEditorState: (newState: IEditorState) => void, - enableLoaded: () => void -): void { - if (DISABLE_API) { - enableLoaded(); - } - - if (editorState.configuration.APIConfiguration !== undefined) { - enableLoaded(); - return; - } - - // Fetch the configuration from the API - FetchConfiguration() - .then((configuration: IConfiguration) => { - // Set the editor from the given properties of the API - const editorState: IEditorState = GetDefaultEditorState(configuration); - - setEditorState(editorState); - enableLoaded(); - }, (error) => { - console.debug('[NewEditor] Could not fetch resource from API. Using default.', error); - enableLoaded(); - }); -} - -export function LoadEditor( - files: FileList | null, - setEditorState: Dispatch>, - setAppState: Dispatch> -): void { - if (files === null) { - return; - } - const file = files[0]; - const reader = new FileReader(); - reader.addEventListener('load', () => { - const result = reader.result as string; - const editorState: IEditorState = JSON.parse(result); - - LoadState(editorState, setEditorState, setAppState); - }); - reader.readAsText(file); -} diff --git a/public/style.css b/src/Components/App/App.scss similarity index 86% rename from public/style.css rename to src/Components/App/App.scss index a732b5f..2cb61ee 100644 --- a/public/style.css +++ b/src/Components/App/App.scss @@ -1,6 +1,6 @@ -html, -body, -#root { - width: 100%; - height: 100%; -} +html, +body, +#root { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/src/Components/App/App.test.tsx b/src/Components/App/App.test.tsx deleted file mode 100644 index 32213d5..0000000 --- a/src/Components/App/App.test.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react'; -import { beforeEach, describe, it } from 'vitest'; -import { AppState } from '../../Enums/AppState'; -import { FAST_BOOT } from '../../utils/default'; -import { fireEvent, render, type RenderResult } from '../../utils/test-utils'; -import { App } from './App'; - -describe.concurrent('App', () => { - let app: RenderResult; - - beforeEach(() => { - app = render(); - }); - - it('New editor', async() => { - if (FAST_BOOT !== AppState.MainMenu) { - return; - } - - const start = app.getByText(/Start from scratch/i); - fireEvent.click(start); - }, 10000); - - it('Load editor by file', () => { - if (FAST_BOOT !== AppState.MainMenu) { - return; - } - - const load = app.getByText(/Load a configuration file/i); - fireEvent.click(load); - - const goBack = app.getByText(/Go back/i); - fireEvent.click(goBack); - - const load2 = app.getByText(/Load a configuration file/i); - fireEvent.click(load2); - - app.getByText(/Import Save/i); - document.querySelector('input[type="file"]') as HTMLInputElement; - }); -}); diff --git a/src/Components/App/App.tsx b/src/Components/App/App.tsx index 22870cc..fa725cf 100644 --- a/src/Components/App/App.tsx +++ b/src/Components/App/App.tsx @@ -1,27 +1,36 @@ -import React, { type Dispatch, type SetStateAction, useContext, useEffect, useRef, useState } from 'react'; -import { UseCustomEvents } from '../../Events/AppEvents'; +import React, { useEffect, useState } from 'react'; +import './App.scss'; import { MainMenu } from '../MainMenu/MainMenu'; -import { ContainerModel, type IContainerModel } from '../../Interfaces/IContainerModel'; -import { Editor } from '../Editor/Editor'; -import { type IEditorState } from '../../Interfaces/IEditorState'; -import { DEFAULT_CONFIG, DEFAULT_MAINCONTAINER_PROPS, FAST_BOOT } from '../../utils/default'; -import { AppState } from '../../Enums/AppState'; -import { Loader } from '../Loader/Loader'; -import { LanguageContext } from '../LanguageProvider/LanguageProvider'; -import { LoadEditor, NewEditor } from './Actions/MenuActions'; -import { LoadState } from './Actions/Load'; +import { ContainerModel } from '../../Interfaces/ContainerModel'; +import Editor, { IEditorState } from '../Editor/Editor'; +import { LoadState } from './Load'; +import { LoadEditor, NewEditor } from './MenuActions'; +import { DEFAULT_CONFIG, DEFAULT_MAINCONTAINER_PROPS } from '../../utils/default'; // App will never have props // eslint-disable-next-line @typescript-eslint/no-empty-interface interface IAppProps { - root: Element | Document } -function UseHTTPGETStatePreloading( - appState: AppState, - setEditorState: Dispatch>, - setAppState: Dispatch> -): void { +export const App: React.FunctionComponent = (props) => { + const [isLoaded, setLoaded] = useState(false); + + const defaultMainContainer = new ContainerModel( + null, + DEFAULT_MAINCONTAINER_PROPS + ); + + const [editorState, setEditorState] = useState({ + configuration: DEFAULT_CONFIG, + history: [{ + MainContainer: defaultMainContainer, + SelectedContainer: defaultMainContainer, + SelectedContainerId: defaultMainContainer.properties.id, + TypeCounters: {} + }], + historyCurrentStep: 0 + }); + useEffect(() => { const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); @@ -31,101 +40,40 @@ function UseHTTPGETStatePreloading( return; } - if (appState !== AppState.Loaded) { - fetch(state) - .then( - async(response) => await response.json(), - (error) => { throw new Error(error); } - ) - .then((data: IEditorState) => { - LoadState(data, setEditorState, setAppState); - }, (error) => { throw new Error(error); }); - } - }); -}; - -export function App(props: IAppProps): JSX.Element { - const [appState, setAppState] = useState(FAST_BOOT); - const appRef = useRef(null); - const eventCallbackQueue = useRef([]); - const languageContext = useContext(LanguageContext); - - const defaultMainContainer = new ContainerModel(DEFAULT_MAINCONTAINER_PROPS); - const containers = new Map(); - containers.set(defaultMainContainer.properties.id, defaultMainContainer); - - const [editorState, setEditorState] = useState({ - configuration: DEFAULT_CONFIG, - history: [{ - lastAction: '', - mainContainer: defaultMainContainer.properties.id, - containers, - typeCounters: {}, - symbols: new Map() - }], - historyCurrentStep: 0, - version: APP_VERSION + fetch(state) + .then( + async(response) => await response.json(), + (error) => { throw new Error(error); } + ) + .then((data: IEditorState) => { + LoadState(data, setEditorState, setLoaded); + }, (error) => { throw new Error(error); }); }); - UseCustomEvents( - eventCallbackQueue, - props.root, - appRef, - languageContext, - setEditorState, - setAppState - ); - - UseHTTPGETStatePreloading(appState, setEditorState, setAppState); - - switch (appState) { - case AppState.Loaded: - return ( -
- -
- ); - case AppState.Loading: - return ( -
-
- -
-
- ); - default: - return ( -
- { - setAppState(AppState.Loading); - NewEditor( - editorState, - (newEditor) => { setEditorState(newEditor); }, - () => { setAppState(AppState.Loaded); } - ); - }} - loadEditor={(files: FileList | null) => { - LoadEditor( - files, - setEditorState, - setAppState - ); - }} - /> -
- ); + if (isLoaded) { + return ( +
+ +
+ ); } + + return ( +
+ NewEditor( + setEditorState, setLoaded + )} + loadEditor={(files: FileList | null) => LoadEditor( + files, + setEditorState, + setLoaded + )} + /> +
+ ); }; diff --git a/src/Components/App/Load.ts b/src/Components/App/Load.ts new file mode 100644 index 0000000..b5459c7 --- /dev/null +++ b/src/Components/App/Load.ts @@ -0,0 +1,13 @@ +import { Dispatch, SetStateAction } from 'react'; +import { Revive } from '../../utils/saveload'; +import { IEditorState } from '../Editor/Editor'; + +export function LoadState( + editorState: IEditorState, + setEditorState: Dispatch>, + setLoaded: Dispatch> +): void { + Revive(editorState); + setEditorState(editorState); + setLoaded(true); +} diff --git a/src/Components/App/MenuActions.ts b/src/Components/App/MenuActions.ts new file mode 100644 index 0000000..ce0cd7d --- /dev/null +++ b/src/Components/App/MenuActions.ts @@ -0,0 +1,71 @@ +import { Dispatch, SetStateAction } from 'react'; +import { Configuration } from '../../Interfaces/Configuration'; +import { ContainerModel } from '../../Interfaces/ContainerModel'; +import { fetchConfiguration } from '../API/api'; +import { IEditorState } from '../Editor/Editor'; +import { LoadState } from './Load'; + +export function NewEditor( + setEditorState: Dispatch>, + setLoaded: Dispatch> +): void { + // Fetch the configuration from the API + fetchConfiguration() + .then((configuration: Configuration) => { + // Set the main container from the given properties of the API + const MainContainer = new ContainerModel( + null, + { + id: 'main', + parentId: 'null', + x: 0, + y: 0, + width: configuration.MainContainer.Width, + height: configuration.MainContainer.Height, + fillOpacity: 0, + stroke: 'black' + } + ); + + // Save the configuration and the new MainContainer + // and default the selected container to it + const editorState: IEditorState = { + configuration, + history: + [ + { + MainContainer, + SelectedContainer: MainContainer, + SelectedContainerId: MainContainer.properties.id, + TypeCounters: {} + } + ], + historyCurrentStep: 0 + }; + setEditorState(editorState); + setLoaded(true); + }, (error) => { + // TODO: Implement an alert component + console.warn('[NewEditor] Could not fetch resource from API. Using default.', error); + setLoaded(true); + }); +} + +export function LoadEditor( + files: FileList | null, + setEditorState: Dispatch>, + setLoaded: Dispatch> +): void { + if (files === null) { + return; + } + const file = files[0]; + const reader = new FileReader(); + reader.addEventListener('load', () => { + const result = reader.result as string; + const editorState: IEditorState = JSON.parse(result); + + LoadState(editorState, setEditorState, setLoaded); + }); + reader.readAsText(file); +} diff --git a/src/Components/Bar/Bar.tsx b/src/Components/Bar/Bar.tsx index f3b3636..1738a3f 100644 --- a/src/Components/Bar/Bar.tsx +++ b/src/Components/Bar/Bar.tsx @@ -1,91 +1,39 @@ +import { ClockIcon, CubeIcon, MapIcon } from '@heroicons/react/outline'; import * as React from 'react'; -import { - ClockIcon, - CubeIcon, - LinkIcon, - EnvelopeIcon, - Cog8ToothIcon -} from '@heroicons/react/24/outline'; -import { - ClockIcon as ClockIconS, - CubeIcon as CubeIconS, - LinkIcon as LinkIconS, - EnvelopeIcon as EnvolopeIconS, - Cog8ToothIcon as Cog8ToothIconS -} from '@heroicons/react/24/solid'; -import { Text } from '../Text/Text'; import { BarIcon } from './BarIcon'; interface IBarProps { - className: string - isComponentsOpen: boolean - isSymbolsOpen: boolean + isSidebarOpen: boolean + isElementsSidebarOpen: boolean isHistoryOpen: boolean - isMessagesOpen: boolean - isSettingsOpen: boolean - toggleComponents: () => void - toggleSymbols: () => void - toggleTimeline: () => void - toggleMessages: () => void - toggleSettings: () => void + ToggleSidebar: () => void + ToggleElementsSidebar: () => void + ToggleTimeline: () => void } export const BAR_WIDTH = 64; // 4rem -export function Bar(props: IBarProps): JSX.Element { +export const Bar: React.FC = (props) => { return ( -
+
{ props.toggleComponents(); }}> - { - props.isComponentsOpen - ? - : - } + isActive={props.isSidebarOpen} + title='Components' + onClick={() => props.ToggleSidebar()}> + { props.toggleSymbols(); }}> - { - props.isSymbolsOpen - ? - : - } + isActive={props.isElementsSidebarOpen} + title='Map' + onClick={() => props.ToggleElementsSidebar()}> + - { props.toggleMessages(); }}> - { - props.isMessagesOpen - ? - : - } - -
{ props.toggleTimeline(); }}> - { - props.isHistoryOpen - ? - : - } - - { props.toggleSettings(); }}> - { - props.isSettingsOpen - ? - : - } + title='Timeline' + onClick={() => props.ToggleTimeline()}> +
); -} +}; diff --git a/src/Components/Bar/BarIcon.tsx b/src/Components/Bar/BarIcon.tsx index 0a2dc56..5afaae7 100644 --- a/src/Components/Bar/BarIcon.tsx +++ b/src/Components/Bar/BarIcon.tsx @@ -7,18 +7,16 @@ interface IBarIconProps { onClick: () => void } -export function BarIcon(props: IBarIconProps): JSX.Element { - const isActiveClasses = props.isActive - ? 'border-l-4 border-blue-500 bg-slate-200' - : ''; +export const BarIcon: React.FC = (props) => { + const isActiveClasses = props.isActive ? 'border-l-4 border-blue-500 bg-slate-200' : ''; return ( - ); -} +}; diff --git a/src/Components/Canvas/Canvas.tsx b/src/Components/Canvas/Canvas.tsx deleted file mode 100644 index 207c593..0000000 --- a/src/Components/Canvas/Canvas.tsx +++ /dev/null @@ -1,225 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import { type IPoint } from '../../Interfaces/IPoint'; -import { BAR_WIDTH } from '../Bar/Bar'; -import { SelectorMode } from '../SVG/SVG'; -import { type DrawParams } from '../Viewer/Viewer'; -import { RenderContainers, RenderSymbols } from './Renderer'; -import { RenderContainerSelector } from './SelectorContainer'; -import { RenderSymbolSelector } from './SelectorSymbol'; - -interface ICanvasProps { - className?: string - width: number - height: number - style?: React.CSSProperties - drawParams: DrawParams -}; - -function Draw( - ctx: CanvasRenderingContext2D, - frameCount: number, - scale: number, - translatePos: IPoint, - { - mainContainer, - selectorMode, - selectedContainer, - selectedSymbol, - containers, - symbols - }: DrawParams -): void { - if (mainContainer === undefined) { - return; - } - - const topDim = mainContainer.properties.y; - const leftDim = mainContainer.properties.x; - const rightDim = mainContainer.properties.x + mainContainer.properties.width; - const bottomDim = mainContainer.properties.y + mainContainer.properties.height; - - ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); - ctx.save(); - ctx.setTransform(scale, 0, 0, scale, translatePos.x, translatePos.y); - ctx.fillStyle = '#000000'; - - // Draw containers and symbol dimensions - RenderContainers( - ctx, - mainContainer, - containers, - leftDim, - bottomDim, - topDim, - rightDim, - scale - ); - - // Draw symbols and symbol dimensions - RenderSymbols(ctx, symbols, scale); - - // Draw selector - switch (selectorMode) { - case SelectorMode.Containers: - RenderContainerSelector(ctx, frameCount, { - containers, - scale, - selected: selectedContainer - }); - break; - case SelectorMode.Symbols: - RenderSymbolSelector(ctx, frameCount, { - symbols, - selected: selectedSymbol - }); - break; - } - - ctx.restore(); -} - -function UseCanvas(draw: (context: CanvasRenderingContext2D, - frameCount: number, - scale: number, - translatePos: IPoint) => void): React.RefObject { - const canvasRef = useRef(null); - const frameCount = useRef(0); - const translatePos = useRef({ - x: 0, - y: 0 - }); - - const startDragOffset = useRef({ - x: 0, - y: 0 - }); - - const scale = useRef(1.0); - const scaleMultiplier = useRef(0.8); - const dragging = useRef(false); - - useEffect(() => { - const canvas = canvasRef.current; - - let animationFrameId = 0; - if (canvas === null) { - return; - } - - const context = canvas.getContext('2d'); - - // add event listeners to handle screen drag - function MouseDown(evt: MouseEvent): void { - dragging.current = true; - startDragOffset.current.x = evt.clientX - translatePos.current.x; - startDragOffset.current.y = evt.clientY - translatePos.current.y; - } - - function MouseUp(evt: MouseEvent): void { - dragging.current = false; - } - - function MouseMove(evt: MouseEvent): void { - if (!dragging.current || context === null) { - return; - } - - translatePos.current.x = evt.clientX - startDragOffset.current.x; - translatePos.current.y = evt.clientY - startDragOffset.current.y; - frameCount.current++; - draw(context, frameCount.current, scale.current, translatePos.current); - } - function HandleScroll(evt: WheelEvent): void { - if (context === null) { - return; - } - - if (evt.deltaY >= 0) { - scale.current *= scaleMultiplier.current; - } else { - scale.current /= scaleMultiplier.current; - } - - draw(context, frameCount.current, scale.current, translatePos.current); - } - canvas.addEventListener('mousedown', MouseDown); - window.addEventListener('mouseup', MouseUp); - canvas.addEventListener('mousemove', MouseMove); - canvas.addEventListener('wheel', HandleScroll, { passive: true }); - - function Render(): void { - if (context === null) { - return; - } - - frameCount.current++; - draw(context, frameCount.current, scale.current, translatePos.current); - animationFrameId = window.requestAnimationFrame(Render); - } - - Render(); - - return () => { - window.cancelAnimationFrame(animationFrameId); - canvas.removeEventListener('mousedown', MouseDown); - window.removeEventListener('mouseup', MouseUp); - canvas.removeEventListener('mousemove', MouseMove); - canvas.removeEventListener('wheel', HandleScroll); - }; - }, [draw]); - - return canvasRef; -} - -function UseSVGAutoResizer(setViewer: React.Dispatch>): void { - React.useEffect(() => { - function OnResize(): void { - setViewer({ - viewerWidth: window.innerWidth - BAR_WIDTH, - viewerHeight: window.innerHeight - }); - } - window.addEventListener('resize', OnResize); - - return () => { - window.removeEventListener('resize', OnResize); - }; - }); -} - -interface Viewer { - viewerWidth: number - viewerHeight: number -} - -export function Canvas({ - className, - width, - height, - style, - drawParams -}: ICanvasProps): JSX.Element { - const canvasRef = UseCanvas((...CanvasProps) => { - Draw( - ...CanvasProps, - drawParams - ); - }); - - const [{ viewerWidth, viewerHeight }, setViewer] = React.useState({ - viewerWidth: width, - viewerHeight: height - }); - - UseSVGAutoResizer(setViewer); - - return ( - - ); -} diff --git a/src/Components/Canvas/Container.ts b/src/Components/Canvas/Container.ts deleted file mode 100644 index 4914b4b..0000000 --- a/src/Components/Canvas/Container.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { type IContainerModel } from '../../Interfaces/IContainerModel'; - -export function RenderContainer( - ctx: CanvasRenderingContext2D, - container: IContainerModel, - x: number, - y: number -): void { - ctx.save(); - ctx.strokeStyle = container.properties.style?.stroke ?? '#000000'; - ctx.fillStyle = container.properties.style?.fill ?? '#000000'; - ctx.lineWidth = Number(container.properties.style?.strokeWidth ?? 1); - ctx.globalAlpha = Number(container.properties.style?.fillOpacity ?? 1); - ctx.fillRect(x, y, container.properties.width, container.properties.height); - ctx.globalAlpha = Number(container.properties.style?.strokeOpacity ?? 1); - ctx.strokeRect(x, y, container.properties.width, container.properties.height); - ctx.restore(); -} diff --git a/src/Components/Canvas/Dimension.ts b/src/Components/Canvas/Dimension.ts deleted file mode 100644 index 0846d68..0000000 --- a/src/Components/Canvas/Dimension.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { type IDimensionStyle } from '../../Interfaces/IDimensionStyle'; -import { NOTCHES_LENGTH } from '../../utils/default'; - -interface IDimensionProps { - id: string - xStart: number - yStart: number - xEnd: number - yEnd: number - text: string - style: IDimensionStyle - scale?: number -} - -/** - * 2D Parametric function. Returns a new coordinate from the origin coordinate - * See for more details https://en.wikipedia.org/wiki/Parametric_equation. - * TL;DR a parametric function is a function with a parameter - * @param x0 Origin coordinate - * @param t The parameter - * @param vx Transform vector - * @returns Returns a new coordinate from the origin coordinate - */ -function ApplyParametric(x0: number, t: number, vx: number): number { - return x0 + t * vx; -} - -export function RenderDimension(ctx: CanvasRenderingContext2D, props: IDimensionProps): void { - const scale = props.scale ?? 1; - const strokeStyle = props.style.color ?? 'black'; - const lineWidth = (props.style.width ?? 2) / scale; - const dashArray: number[] = props.style.dashArray?.split(' ') - .flatMap(array => array.split(',')) - .map(stringValue => parseInt(stringValue)) ?? []; - - /// We need to find the points of the notches - // Get the vector of the line - const [deltaX, deltaY] = [(props.xEnd - props.xStart), (props.yEnd - props.yStart)]; - const rotation = (Math.atan2(deltaY, deltaX) / (2 * Math.PI)); - - // Get the unit vector - const norm = Math.sqrt(deltaX * deltaX + deltaY * deltaY); - const [unitX, unitY] = [deltaX / norm, deltaY / norm]; - - // Get the perpandicular vector - const [perpVecX, perpVecY] = [unitY, -unitX]; - - // Use the parametric function to get the coordinates (x = x0 + t * v.x) - const notchesLength = NOTCHES_LENGTH / scale; - const startTopX = ApplyParametric(props.xStart, notchesLength, perpVecX); - const startTopY = ApplyParametric(props.yStart, notchesLength, perpVecY); - const startBottomX = ApplyParametric(props.xStart, -notchesLength, perpVecX); - const startBottomY = ApplyParametric(props.yStart, -notchesLength, perpVecY); - - const endTopX = ApplyParametric(props.xEnd, notchesLength, perpVecX); - const endTopY = ApplyParametric(props.yEnd, notchesLength, perpVecY); - const endBottomX = ApplyParametric(props.xEnd, -notchesLength, perpVecX); - const endBottomY = ApplyParametric(props.yEnd, -notchesLength, perpVecY); - - ctx.save(); - - ctx.globalAlpha = 1; - ctx.lineWidth = lineWidth; - ctx.strokeStyle = strokeStyle; - ctx.fillStyle = strokeStyle; - ctx.setLineDash(dashArray); - ctx.moveTo(startTopX, startTopY); - ctx.lineTo(startBottomX, startBottomY); - ctx.stroke(); - ctx.moveTo(props.xStart, props.yStart); - ctx.lineTo(props.xEnd, props.yEnd); - ctx.stroke(); - ctx.moveTo(endTopX, endTopY); - ctx.lineTo(endBottomX, endBottomY); - ctx.stroke(); - ctx.setLineDash([]); - const textX = (props.xStart + props.xEnd) / 2; - const textY = (props.yStart + props.yEnd) / 2; - ctx.font = `${16 / scale}px Verdana`; - ctx.textAlign = 'center'; - ctx.globalAlpha = 1; - ctx.textBaseline = 'bottom'; - ctx.translate(textX, textY); - ctx.rotate(rotation * Math.PI * 2); - ctx.fillText(props.text, 0, 0); - - ctx.restore(); -} diff --git a/src/Components/Canvas/DimensionLayer.ts b/src/Components/Canvas/DimensionLayer.ts deleted file mode 100644 index b899017..0000000 --- a/src/Components/Canvas/DimensionLayer.ts +++ /dev/null @@ -1,641 +0,0 @@ -import { Orientation } from '../../Enums/Orientation'; -import { Position } from '../../Enums/Position'; -import { type IContainerModel } from '../../Interfaces/IContainerModel'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { - SHOW_SELF_DIMENSIONS, - SHOW_BORROWER_DIMENSIONS, - SHOW_CHILDREN_DIMENSIONS, - DIMENSION_MARGIN, - SHOW_SELF_MARGINS_DIMENSIONS, - DEFAULT_DIMENSION_SYMBOL_STYLE -} from '../../utils/default'; -import { FindContainerById, MakeRecursionDFSIterator, Pairwise } from '../../utils/itertools'; -import { TransformX, TransformY } from '../../utils/svg'; -import { RenderDimension } from './Dimension'; - -export function AddContainerDimensions( - ctx: CanvasRenderingContext2D, - containers: Map, - container: IContainerModel, - dimMapped: number[], - currentTransform: [number, number], - scale: number, - depth: number -): void { - ctx.beginPath(); - if (SHOW_SELF_DIMENSIONS && - container.properties.dimensionOptions.selfDimensions.positions.length > 0) { - ActionByPosition( - ctx, - dimMapped, - container.properties.dimensionOptions.selfDimensions.positions, - AddHorizontalSelfDimension, - AddVerticalSelfDimension, - [ - container, - currentTransform, - scale] - ); - } - - if (SHOW_SELF_MARGINS_DIMENSIONS && - container.properties.dimensionOptions.selfMarginsDimensions.positions.length > 0) { - ActionByPosition( - ctx, - dimMapped, - container.properties.dimensionOptions.selfMarginsDimensions.positions, - AddHorizontalSelfMarginsDimension, - AddVerticalSelfMarginsDimension, - [ - container, - currentTransform, - scale - ] - ); - } - - if (SHOW_BORROWER_DIMENSIONS && - container.properties.dimensionOptions.dimensionWithMarks.positions.length > 0) { - ActionByPosition( - ctx, - dimMapped, - container.properties.dimensionOptions.dimensionWithMarks.positions, - AddHorizontalBorrowerDimension, - AddVerticalBorrowerDimension, - [ - containers, - container, - depth, - currentTransform, - scale] - ); - } - - if (SHOW_CHILDREN_DIMENSIONS && - container.properties.dimensionOptions.childrenDimensions.positions.length > 0 && - container.children.length >= 2) { - ActionByPosition( - ctx, - dimMapped, - container.properties.dimensionOptions.childrenDimensions.positions, - AddHorizontalChildrenDimension, - AddVerticalChildrenDimension, - [ - containers, - container, - currentTransform, - scale] - ); - } -} - -export function AddSymbolDimensions( - ctx: CanvasRenderingContext2D, - symbol: ISymbolModel, - scale: number, - depth: number -): void { - if (symbol.isVertical) { - AddVerticalSymbolDimension( - ctx, - symbol, - scale, - depth - ); - return; - } - - AddHorizontalSymbolDimension( - ctx, - symbol, - scale, - depth - ); -} - -/** - * Fonction that call another function given the positions - * @param ctx - * @param dimMapped Position mapped depending on the Position enum in order: - * [0:left, 1:bottom, 2:up, 3:right] - * @param positions List of positions - * @param horizontalAction Action called when a left or right position is present - * @param verticalAction Action called when a down or up position is present - * @param params Params for the actions - * (the two actions must have the same number of params, and in the same order) - */ -function ActionByPosition( - ctx: CanvasRenderingContext2D, - dimMapped: number[], - positions: Position[], - horizontalAction: (ctx: CanvasRenderingContext2D, dim: number, ...params: any[]) => void, - verticalAction: (ctx: CanvasRenderingContext2D, dim: number, isRight: boolean, ...params: any[]) => void, - params: any[] -): void { - positions.forEach((position: Position) => { - const dim = dimMapped[position]; - switch (position) { - case Position.Left: - case Position.Right: { - const isRight = position === Position.Right; - verticalAction(ctx, dim, isRight, ...params); - } - break; - case Position.Up: - case Position.Down: - horizontalAction(ctx, dim, ...params); - break; - } - }); -} - -function AddHorizontalChildrenDimension( - ctx: CanvasRenderingContext2D, - yDim: number, - containers: Map, - container: IContainerModel, - currentTransform: [number, number], - scale: number -): void { - const childrenId = `dim-y${yDim.toFixed(0)}-children-${container.properties.id}`; - const style = container.properties.dimensionOptions.childrenDimensions; - - const lastChildId = container.children[container.children.length - 1]; - const lastChild = FindContainerById(containers, lastChildId); - - if (lastChild === undefined) { - return; - } - let xChildrenStart = TransformX( - lastChild.properties.x, - lastChild.properties.width, - lastChild.properties.positionReference - ); - let xChildrenEnd = TransformX( - lastChild.properties.x, - lastChild.properties.width, - lastChild.properties.positionReference - ); - - // Find the min and max - for (let i = container.children.length - 2; i >= 0; i--) { - const childId = container.children[i]; - const child = FindContainerById(containers, childId); - - if (child === undefined) { - continue; - } - const left = TransformX(child.properties.x, child.properties.width, child.properties.positionReference); - if (left < xChildrenStart) { - xChildrenStart = left; - } - const right = TransformX(child.properties.x, child.properties.width, child.properties.positionReference); - if (right > xChildrenEnd) { - xChildrenEnd = right; - } - } - - if (xChildrenStart === xChildrenEnd) { - // do not show an empty dimension - return; - } - - const textChildren = (xChildrenEnd - xChildrenStart) - .toFixed(0); - - const offset = currentTransform[0] + container.properties.x; - - RenderDimension(ctx, { - id: childrenId, - xStart: xChildrenStart + offset, - xEnd: xChildrenEnd + offset, - yStart: yDim, - yEnd: yDim, - text: textChildren, - scale, - style - }); -} - -function AddVerticalChildrenDimension( - ctx: CanvasRenderingContext2D, - xDim: number, - isRight: boolean, - containers: Map, - container: IContainerModel, - currentTransform: [number, number], - scale: number -): void { - const childrenId = `dim-x${xDim.toFixed(0)}-children-${container.properties.id}`; - const style = container.properties.dimensionOptions.childrenDimensions; - - const lastChildId = container.children[container.children.length - 1]; - const lastChild = FindContainerById(containers, lastChildId); - - if (lastChild === undefined) { - return; - } - - let yChildrenStart = TransformY( - lastChild.properties.y, - lastChild.properties.height, - lastChild.properties.positionReference - ); - let yChildrenEnd = yChildrenStart; - - // Find the min and max - for (let i = container.children.length - 2; i >= 0; i--) { - const childId = container.children[i]; - const child = FindContainerById(containers, childId); - - if (child === undefined) { - continue; - } - - const top = TransformY(child.properties.y, child.properties.height, child.properties.positionReference); - if (top < yChildrenStart) { - yChildrenStart = top; - } - const bottom = TransformY(child.properties.y, child.properties.height, child.properties.positionReference); - if (bottom > yChildrenEnd) { - yChildrenEnd = bottom; - } - } - - if (yChildrenStart === yChildrenEnd) { - // do not show an empty dimension - return; - } - - const textChildren = (yChildrenEnd - yChildrenStart) - .toFixed(0); - - const offset = currentTransform[0] + container.properties.x; - - if (!isRight) { - [yChildrenStart, yChildrenEnd] = [yChildrenEnd, yChildrenStart]; - } - - RenderDimension(ctx, { - id: childrenId, - xStart: xDim, - xEnd: xDim, - yStart: yChildrenStart + offset, - yEnd: yChildrenEnd + offset, - text: textChildren, - scale, - style - }); -} - -function AddHorizontalBorrowerDimension( - ctx: CanvasRenderingContext2D, - yDim: number, - containers: Map, - container: IContainerModel, - depth: number, - currentTransform: [number, number], - scale: number -): void { - const it = MakeRecursionDFSIterator(container, containers, depth, currentTransform); - const style = container.properties.dimensionOptions.dimensionWithMarks; - const marks = []; // list of vertical lines for the dimension - for (const { - container: childContainer, currentTransform: childCurrentTransform - } of it) { - const isHidden = !childContainer.properties.dimensionOptions.markPosition.includes(Orientation.Horizontal); - if (isHidden) { - continue; - } - - const x = TransformX( - childContainer.properties.x, - childContainer.properties.width, - childContainer.properties.positionReference - ); - - const restoredX = x + childCurrentTransform[0]; - - marks.push(restoredX); - } - - const restoredX = container.properties.x + currentTransform[0]; - marks.push(restoredX); - marks.push(restoredX + container.properties.width); - marks.sort((a, b) => a - b); - let count = 0; - for (const { cur, next } of Pairwise(marks)) { - const id = `dim-y${yDim.toFixed(0)}-borrow-${container.properties.id}-{${count}}`; - const value = next - cur; - if (value === 0) { - return; - } - - RenderDimension(ctx, { - id, - xStart: cur, - xEnd: next, - yStart: yDim, - yEnd: yDim, - text: value.toFixed(0), - scale, - style - }); - count++; - } -} - -function AddVerticalBorrowerDimension( - ctx: CanvasRenderingContext2D, - xDim: number, - isRight: boolean, - containers: Map, - container: IContainerModel, - depth: number, - currentTransform: [number, number], - scale: number -): void { - const it = MakeRecursionDFSIterator(container, containers, depth, currentTransform); - const style = container.properties.dimensionOptions.dimensionWithMarks; - const marks = []; // list of vertical lines for the dimension - for (const { - container: childContainer, currentTransform: childCurrentTransform - } of it) { - const isHidden = !childContainer.properties.dimensionOptions.markPosition.includes(Orientation.Vertical); - if (isHidden) { - continue; - } - - const y = TransformY( - childContainer.properties.y, - childContainer.properties.height, - childContainer.properties.positionReference - ); - - const restoredy = y + childCurrentTransform[1]; - - marks.push(restoredy); - } - - const restoredY = container.properties.y + currentTransform[1]; - marks.push(restoredY); - marks.push(restoredY + container.properties.height); - marks.sort((a, b) => a - b); - - let count = 0; - for (let { cur, next } of Pairwise(marks)) { - const id = `dim-x${xDim.toFixed(0)}-borrow-${container.properties.id}-{${count}}`; - const value = next - cur; - if (value === 0) { - return; - } - - if (!isRight) { - [cur, next] = [next, cur]; - } - - RenderDimension(ctx, { - id, - xStart: xDim, - xEnd: xDim, - yStart: cur, - yEnd: next, - text: value.toFixed(0), - scale, - style - }); - count++; - } -} - -function AddVerticalSelfDimension( - ctx: CanvasRenderingContext2D, - xDim: number, - isRight: boolean, - container: IContainerModel, - currentTransform: [number, number], - scale: number -): void { - const style = container.properties.dimensionOptions.selfDimensions; - const height = container.properties.height; - const idVert = `dim-x${xDim.toFixed(0)}-${container.properties.id}`; - let yStart = container.properties.y + currentTransform[1] + height; - let yEnd = container.properties.y + currentTransform[1]; - const textVert = height - .toFixed(0) - .toString(); - - if (isRight) { - [yStart, yEnd] = [yEnd, yStart]; - } - - RenderDimension(ctx, { - id: idVert, - xStart: xDim, - xEnd: xDim, - yStart, - yEnd, - text: textVert, - scale, - style - }); -} - -function AddHorizontalSelfDimension( - ctx: CanvasRenderingContext2D, - yDim: number, - container: IContainerModel, - currentTransform: [number, number], - scale: number -): void { - const style = container.properties.dimensionOptions.selfDimensions; - const width = container.properties.width; - const id = `dim-y${yDim.toFixed(0)}-${container.properties.id}`; - const xStart = container.properties.x + currentTransform[0]; - const xEnd = xStart + width; - const text = width - .toFixed(0) - .toString(); - RenderDimension(ctx, { - id, - xStart, - yStart: yDim, - xEnd, - yEnd: yDim, - text, - scale, - style - }); -} - -function AddHorizontalSelfMarginsDimension( - ctx: CanvasRenderingContext2D, - yDim: number, - container: IContainerModel, - currentTransform: [number, number], - scale: number -): void { - const style = container.properties.dimensionOptions.selfMarginsDimensions; - const left = container.properties.margin.left; - if (left != null) { - const id = `dim-y-margin-left${yDim.toFixed(0)}-${container.properties.id}`; - const xStart = container.properties.x + currentTransform[0] - left; - const xEnd = xStart + left; - const text = left - .toFixed(0) - .toString(); - RenderDimension(ctx, { - id, - xStart, - yStart: yDim, - xEnd, - yEnd: yDim, - text, - scale, - style - }); - } - - const right = container.properties.margin.right; - if (right != null) { - const id = `dim-y-margin-right${yDim.toFixed(0)}-${container.properties.id}`; - const xStart = container.properties.x + container.properties.width + currentTransform[0]; - const xEnd = xStart + right; - const text = right - .toFixed(0) - .toString(); - - RenderDimension(ctx, { - id, - xStart, - yStart: yDim, - xEnd, - yEnd: yDim, - text, - scale, - style - }); - } -} - -function AddVerticalSelfMarginsDimension( - ctx: CanvasRenderingContext2D, - xDim: number, - isRight: boolean, - container: IContainerModel, - currentTransform: [number, number], - scale: number -): void { - const style = container.properties.dimensionOptions.selfMarginsDimensions; - const top = container.properties.margin.top; - if (top != null) { - const idVert = `dim-x-margin-top${xDim.toFixed(0)}-${container.properties.id}`; - let yStart = container.properties.y + currentTransform[1]; - let yEnd = yStart - top; - const textVert = top - .toFixed(0) - .toString(); - - if (isRight) { - [yStart, yEnd] = [yEnd, yStart]; - } - - RenderDimension(ctx, { - id: idVert, - xStart: xDim, - yStart, - xEnd: xDim, - yEnd, - text: textVert, - scale, - style - }); - } - const bottom = container.properties.margin.bottom; - if (bottom != null) { - const idVert = `dim-x-margin-bottom${xDim.toFixed(0)}-${container.properties.id}`; - let yStart = container.properties.y + container.properties.height + bottom + currentTransform[1]; - let yEnd = yStart - bottom; - const textVert = bottom - .toFixed(0) - .toString(); - - if (isRight) { - [yStart, yEnd] = [yEnd, yStart]; - } - - RenderDimension(ctx, { - id: idVert, - xStart: xDim, - yStart, - xEnd: xDim, - yEnd, - text: textVert, - scale, - style - }); - } -} - -function AddHorizontalSymbolDimension( - ctx: CanvasRenderingContext2D, - symbol: ISymbolModel, - scale: number, - depth: number -): void { - const width = TransformX(symbol.offset, symbol.width, symbol.config.PositionReference); - - if (width == null || width <= 0) { - return; - } - - const id = `dim-y-margin-left${symbol.width.toFixed(0)}-${symbol.id}`; - - const offset = (DIMENSION_MARGIN * (depth + 1)) / scale; - const text = width - .toFixed(0) - .toString(); - - RenderDimension(ctx, { - id, - xStart: 0, - yStart: -offset, - xEnd: width, - yEnd: -offset, - text, - scale, - style: DEFAULT_DIMENSION_SYMBOL_STYLE - }); -} - -function AddVerticalSymbolDimension( - ctx: CanvasRenderingContext2D, - symbol: ISymbolModel, - scale: number, - depth: number -): void { - const height = TransformY(symbol.offset, symbol.height, symbol.config.PositionReference); - - if (height == null || height <= 0) { - return; - } - - const id = `dim-y-margin-left${symbol.width.toFixed(0)}-${symbol.id}`; - - const offset = (DIMENSION_MARGIN * (depth + 1)) / scale; - const text = height - .toFixed(0) - .toString(); - - RenderDimension(ctx, { - id, - xStart: -offset, - yStart: height, - xEnd: -offset, - yEnd: 0, - text, - scale, - style: DEFAULT_DIMENSION_SYMBOL_STYLE - }); -} diff --git a/src/Components/Canvas/README.md b/src/Components/Canvas/README.md deleted file mode 100644 index d98290b..0000000 --- a/src/Components/Canvas/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Canvas API - -Canvas API is currently experimental and supports neither custom SVG nor SVG export yet. - -It is an alternative to the SVG and offers the following pros: -- Hardware acceleration -- Better compatibility with Gecko and WebKit web engine -- More freedom with animations - -However, there are cons: -- Animation must be hand made without CSS -- `csstype` cannot be used and must be mapped to its object (i.e `strokeWidth` become `ctx.lineWidth`) -- More complex to learn and to read - -As you can see, for the user experience Canvas API may be the best solution while SVG is better for fast development. - -Currently, SVG is preferred as it offers more features. However, it is known that Gecko engine is crashing on the SVG rendering when objects are moving. \ No newline at end of file diff --git a/src/Components/Canvas/Renderer.ts b/src/Components/Canvas/Renderer.ts deleted file mode 100644 index ff0be83..0000000 --- a/src/Components/Canvas/Renderer.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { type IContainerModel } from '../../Interfaces/IContainerModel'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { DIMENSION_MARGIN } from '../../utils/default'; -import { MakeRecursionDFSIterator } from '../../utils/itertools'; -import { RenderContainer } from './Container'; -import { AddContainerDimensions, AddSymbolDimensions } from './DimensionLayer'; -import { RenderSymbol } from './Symbol'; - -export function RenderContainers( - ctx: CanvasRenderingContext2D, - root: IContainerModel, - containers: Map, - leftDim: number, - bottomDim: number, - topDim: number, - rightDim: number, - scale: number -): void { - const it = MakeRecursionDFSIterator(root, containers, 0, [0, 0]); - for (const { container, depth, currentTransform } of it) { - const [x, y] = [ - container.properties.x + currentTransform[0], - container.properties.y + currentTransform[1] - ]; - - // Draw container - RenderContainer(ctx, container, x, y); - - // Draw dimensions - RenderContainerDimensions( - ctx, - leftDim, - bottomDim, - topDim, - rightDim, - depth, - scale, - containers, - container, - currentTransform - ); - } -} - -export function RenderContainerDimensions( - ctx: CanvasRenderingContext2D, - leftDim: number, - bottomDim: number, - topDim: number, - rightDim: number, - depth: number, - scale: number, - containers: Map, - container: IContainerModel, - currentTransform: [number, number] -): void { - ctx.save(); - const depthOffset = (DIMENSION_MARGIN * (depth + 1)) / scale; - const containerLeftDim = leftDim - depthOffset; - const containerTopDim = topDim - depthOffset; - const containerBottomDim = bottomDim + depthOffset; - const containerRightDim = rightDim + depthOffset; - const dimMapped = [containerLeftDim, containerBottomDim, containerTopDim, containerRightDim]; - AddContainerDimensions(ctx, containers, container, dimMapped, currentTransform, scale, depth); - ctx.restore(); -} - -export function RenderSymbols( - ctx: CanvasRenderingContext2D, - symbols: Map, - scale: number -): void { - symbols.forEach((symbol: ISymbolModel) => { - RenderSymbol(ctx, symbol); - - if (!symbol.showDimension) { - return; - } - - // TODO: Implement DimensionManager - AddSymbolDimensions(ctx, symbol, scale, 0); - }); -} - -export function RenderSymbolDimensions( - ctx: CanvasRenderingContext2D, - depth: number, - scale: number, - containers: Map, - container: IContainerModel, - currentTransform: [number, number] -): void { - ctx.save(); - const depthOffset = (DIMENSION_MARGIN * (depth + 1)) / scale; - const containerLeftDim = -depthOffset; - const containerTopDim = -depthOffset; - const containerBottomDim = depthOffset; - const containerRightDim = depthOffset; - const dimMapped = [containerLeftDim, containerBottomDim, containerTopDim, containerRightDim]; - AddContainerDimensions(ctx, containers, container, dimMapped, currentTransform, scale, depth); - ctx.restore(); -} diff --git a/src/Components/Canvas/Selector.ts b/src/Components/Canvas/Selector.ts deleted file mode 100644 index 1dc1654..0000000 --- a/src/Components/Canvas/Selector.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { SHOW_SELECTOR_TEXT } from '../../utils/default'; - -interface ISelectorProps { - text: string - x: number - y: number - width: number - height: number - scale: number -} - -export function RenderSelector( - ctx: CanvasRenderingContext2D, - frameCount: number, - { - text, - x, - y, - width, - height, - scale - }: ISelectorProps -): void { - const xText = x + width / 2; - const yText = y + height / 2; - - ctx.strokeStyle = '#3B82F6'; - ctx.lineWidth = 4 / scale; - ctx.globalAlpha = (Math.sin(frameCount * 0.0450) ** 2); - ctx.strokeRect(x, y, width, height); - ctx.globalAlpha = 1; - ctx.lineWidth = 1; - ctx.strokeStyle = 'black'; - - if (SHOW_SELECTOR_TEXT) { - ctx.font = `${16 / scale}px Verdana`; - ctx.textAlign = 'center'; - ctx.fillText(text, xText, yText); - ctx.textAlign = 'left'; - } -} diff --git a/src/Components/Canvas/SelectorContainer.ts b/src/Components/Canvas/SelectorContainer.ts deleted file mode 100644 index ea4a419..0000000 --- a/src/Components/Canvas/SelectorContainer.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { type IContainerModel } from '../../Interfaces/IContainerModel'; -import { GetAbsolutePosition } from '../../utils/itertools'; -import { RemoveMargin } from '../../utils/svg'; -import { RenderSelector } from './Selector'; - -interface ISelectorProps { - containers: Map - selected?: IContainerModel - scale?: number -} - -export function RenderContainerSelector( - ctx: CanvasRenderingContext2D, - frameCount: number, - props: ISelectorProps -): void { - if (props.selected === undefined || props.selected === null) { - return; - } - - const scale = (props.scale ?? 1); - let [x, y] = GetAbsolutePosition(props.containers, props.selected); - let [width, height] = [ - props.selected.properties.width, - props.selected.properties.height - ]; - - ({ x, y, width, height } = RemoveMargin( - x, - y, - width, - height, - props.selected.properties.margin.left, - props.selected.properties.margin.bottom, - props.selected.properties.margin.top, - props.selected.properties.margin.right - )); - - const text = props.selected.properties.displayedText; - RenderSelector( - ctx, - frameCount, - { - text, - x, - y, - width, - height, - scale - } - ); -} diff --git a/src/Components/Canvas/SelectorSymbol.ts b/src/Components/Canvas/SelectorSymbol.ts deleted file mode 100644 index 69f49f5..0000000 --- a/src/Components/Canvas/SelectorSymbol.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { SYMBOL_MARGIN } from '../../utils/default'; -import { RenderSelector } from './Selector'; - -interface ISelectorProps { - symbols: Map - selected?: ISymbolModel -} - -export function RenderSymbolSelector( - ctx: CanvasRenderingContext2D, - frameCount: number, - props: ISelectorProps -): void { - if (props.selected === undefined || props.selected === null) { - return; - } - - const [width, height] = [ - props.selected.width, - props.selected.height - ]; - - let x, y: number; - - if (props.selected.isVertical) { - x = -SYMBOL_MARGIN - props.selected.width; - y = props.selected.offset; - } else { - x = props.selected.offset; - y = -SYMBOL_MARGIN - props.selected.height; - } - - const text = props.selected.displayedText; - RenderSelector( - ctx, - frameCount, - { - text, - x, - y, - width, - height, - scale: 1 - } - ); -} diff --git a/src/Components/Canvas/Symbol.ts b/src/Components/Canvas/Symbol.ts deleted file mode 100644 index a80914a..0000000 --- a/src/Components/Canvas/Symbol.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { SYMBOL_MARGIN } from '../../utils/default'; - -const IMAGE_CACHE = new Map(); - -export function RenderSymbol( - ctx: CanvasRenderingContext2D, - symbol: ISymbolModel -): void { - const href = symbol.config.Image.Base64Image ?? symbol.config.Image.Url; - - if (href === undefined) { - return; - } - const image: HTMLImageElement | undefined = IMAGE_CACHE.get(href); - - if (image === undefined) { - const newImage = new Image(); - newImage.src = href; - IMAGE_CACHE.set(href, newImage); - newImage.onload = () => { - DrawImage(ctx, newImage, symbol); - }; - return; - } - - DrawImage(ctx, image, symbol); -} - -function DrawImage( - ctx: CanvasRenderingContext2D, - image: HTMLImageElement, - symbol: ISymbolModel -): void { - let x, y: number; - if (symbol.isVertical) { - x = -SYMBOL_MARGIN - symbol.width; - y = symbol.offset; - } else { - x = symbol.offset; - y = -SYMBOL_MARGIN - symbol.height; - } - - ctx.save(); - ctx.fillStyle = '#000000'; - const width = symbol.width; - const height = symbol.height; - ctx.drawImage( - image, - x, - y, - width, - height - ); - ctx.restore(); -} diff --git a/src/Components/Category/Category.tsx b/src/Components/Category/Category.tsx deleted file mode 100644 index c1cd6c0..0000000 --- a/src/Components/Category/Category.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { ChevronRightIcon } from '@heroicons/react/24/outline'; -import React, { useState } from 'react'; -import { type ICategory } from '../../Interfaces/ICategory'; -import { TruncateString } from '../../utils/stringtools'; - -interface ICategoryProps { - heightClass?: string - children?: JSX.Element[] | JSX.Element - category: ICategory - defaultIsOpen?: boolean -} - -export function Category(props: ICategoryProps): JSX.Element { - const [isOpen, setIsOpen] = useState(props.defaultIsOpen ?? false); - - const categoryType: string = props.category.Type; - const categoryDisplayedText: string = props.category.DisplayedText ?? categoryType; - - const heightClass = props.heightClass ?? 'h-16'; - - return ( -
-
{ setIsOpen(!isOpen); }} - > - - {TruncateString(categoryDisplayedText, 25)} - - - - -
-
- { props.children } -
-
- ); -} diff --git a/src/Components/CheckboxGroupButtons/CheckboxGroupButtons.tsx b/src/Components/CheckboxGroupButtons/CheckboxGroupButtons.tsx deleted file mode 100644 index 1fb0797..0000000 --- a/src/Components/CheckboxGroupButtons/CheckboxGroupButtons.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import * as React from 'react'; - -interface ICheckboxGroupButtonsProps { - name: string - selectedValues: number[] - inputClassName: string - labelText: string - inputGroups: ICheckboxInputGroup[] - colQty: number - onChange: (newSelectedValues: number[]) => void -} - -// TODO: After modeler uses Typescript >= 4.x, extends Omit -interface ICheckboxInputGroup { - key: string - text: React.ReactNode - value: number -} - -// Use whole class name for react to preparse -const GRID_COLS = [ - 'grid-cols-none', - 'grid-cols-1', - 'grid-cols-2', - 'grid-cols-3', - 'grid-cols-4', - 'grid-cols-5', - 'grid-cols-6', - 'grid-cols-7', - 'grid-cols-8', - 'grid-cols-9', - 'grid-cols-10', - 'grid-cols-11', - 'grid-cols-12' -]; - -export function CheckboxGroupButtons(props: ICheckboxGroupButtonsProps): JSX.Element { - const selectedOptions = new Set(props.selectedValues); - const inputGroups = props.inputGroups.map((inputGroup) => ( -
- { - const newSelectedValues = SetChecked(Number(event.target.value), event.target.checked); - props.onChange(newSelectedValues); - }} /> - -
- )); - - const gridColsClass = GRID_COLS[props.colQty]; - - return ( - <> - -
- {inputGroups} -
- - ); - - function IsChecked(inputGroup: ICheckboxInputGroup): boolean { - return selectedOptions.has(inputGroup.value); - } - - /** - * Sedt an option by using a bitwise operation and returns the new selected values - * example: set the 4th option to 0: (1001) xor (1 << 3) => 0001 - * @param selectedValue The option to set - * @returns The new selected values - */ - function SetChecked(selectedValue: number, isChecked: boolean): number[] { - isChecked - ? selectedOptions.add(selectedValue) - : selectedOptions.delete(selectedValue); - return [...selectedOptions]; - } -} diff --git a/src/Components/CheckboxGroupButtons/OrientationCheckboxes.tsx b/src/Components/CheckboxGroupButtons/OrientationCheckboxes.tsx deleted file mode 100644 index 7f5ff88..0000000 --- a/src/Components/CheckboxGroupButtons/OrientationCheckboxes.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react'; -import { ChevronUpDownIcon } from '@heroicons/react/20/solid'; -import { Orientation } from '../../Enums/Orientation'; -import { CheckboxGroupButtons } from './CheckboxGroupButtons'; - -interface IOrientationCheckboxesProps { - id: string - name: string - labelText: string - value: Orientation[] - onChange: (key: string, value: number[]) => void -} - -export function OrientationCheckboxes({ - id, - name, - labelText, - value, - onChange -}: IOrientationCheckboxesProps): JSX.Element { - return - -
- ), - value: Orientation.Horizontal - }, - { - key: `${id}-vertical`, - text: ( -
- -
- ), - value: Orientation.Vertical - } - ]} - onChange={(newSelectedValues) => { - onChange(id, newSelectedValues); - }} - />; -} diff --git a/src/Components/CheckboxGroupButtons/PositionCheckboxes.tsx b/src/Components/CheckboxGroupButtons/PositionCheckboxes.tsx deleted file mode 100644 index ab87b9c..0000000 --- a/src/Components/CheckboxGroupButtons/PositionCheckboxes.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react'; -import { ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon } from '@heroicons/react/20/solid'; -import { Position } from '../../Enums/Position'; -import { CheckboxGroupButtons } from './CheckboxGroupButtons'; - -interface IPositionCheckboxesProps { - id: string - name: string - labelText: string - value: Position[] - attribute: string - onChange: (key: string, value: number[]) => void -} - -export function PositionCheckboxes({ - id, - name, - labelText, - value, - attribute, - onChange -}: IPositionCheckboxesProps): JSX.Element { - return - - - ), - value: Position.Left - }, - { - key: `${id}-down`, - text: ( -
- -
- ), - value: Position.Down - }, - { - key: `${id}-up`, - text: ( -
- -
- ), - value: Position.Up - }, - { - key: `${id}-right`, - text: ( -
- -
- ), - value: Position.Right - } - ]} - onChange={(newSelectedValues) => { - onChange(attribute, newSelectedValues); - }} - />; -} diff --git a/src/Components/Components/Components.tsx b/src/Components/Components/Components.tsx deleted file mode 100644 index 17d2241..0000000 --- a/src/Components/Components/Components.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { EyeIcon, EyeSlashIcon, XCircleIcon } from '@heroicons/react/24/outline'; -import * as React from 'react'; -import { type Dispatch } from 'react'; -import { type IAvailableContainer } from '../../Interfaces/IAvailableContainer'; -import { type ICategory } from '../../Interfaces/ICategory'; -import { type IContainerModel } from '../../Interfaces/IContainerModel'; -import { TruncateString } from '../../utils/stringtools'; -import { Category } from '../Category/Category'; -import { Text } from '../Text/Text'; -import { type IReplaceContainer } from '../../Interfaces/IReplaceContainer'; - -interface IComponentsProps { - selectedContainer: IContainerModel | undefined - componentOptions: IAvailableContainer[] - categories: ICategory[] - replaceContainer: IReplaceContainer - setReplaceContainer: Dispatch> - buttonOnClick: (type: string) => void -} - -function HandleDragStart(event: React.DragEvent): void { - const element = event.target as HTMLButtonElement; - event.dataTransfer.setData('type', element.id); - event.dataTransfer.setDragImage(element, 0, 0); - window.dispatchEvent(new Event('componentDragStart')); -} - -function HandleDragEnd(): void { - window.dispatchEvent(new Event('componentDragEnd')); -} - -interface SidebarCategory { - category: ICategory - children: JSX.Element[] -} - -export function Components(props: IComponentsProps): JSX.Element { - const [hideDisabled, setHideDisabled] = React.useState(false); - const disabledTitle = hideDisabled - ? Text({ textId: '@ShowDisabledComponents' }) - : Text({ textId: '@HideDisabledComponents' }); - - const rootElements: Array = []; - const categories = new Map(props.categories.map(category => [ - category.Type, - { - category, - children: [] - } - ])); - - // build the categories (sorted with categories first) - categories.forEach((categoryWrapper, categoryName) => { - rootElements.push( - { categoryWrapper.children } - ); - }); - - const selectedContainer = props.selectedContainer; - const config = props.componentOptions.find(option => option.Type === selectedContainer?.properties.type); - // build the components - props.componentOptions.forEach(componentOption => { - if (componentOption.IsHidden === true) { - return; - } - - let disabled = false; - if (config?.Whitelist !== undefined) { - disabled = config.Whitelist?.find(type => type === componentOption.Type) === undefined; - } else if (config?.Blacklist !== undefined) { - disabled = config.Blacklist?.find(type => type === componentOption.Type) !== undefined ?? false; - } - - if (props.replaceContainer.isReplacing && componentOption.Category !== props.replaceContainer.category) { - disabled = true; - } - - if (disabled && hideDisabled) { - return; - } - - const componentButton = (); - - if (componentOption.Category === null || componentOption.Category === undefined) { - rootElements.push(componentButton); - return; - } - - const category = categories.get(componentOption.Category); - if (category === undefined) { - console.error(`[Category] Category does not exists in configuration.Categories: ${componentOption.Category}`); - return; - } - - category.children.push(componentButton); - }); - return ( -
-
- {props.replaceContainer.isReplacing && - } - -
-
-
- {rootElements} -
-
-
- ); -} diff --git a/src/Components/ContainerProperties/ContainerForm.tsx b/src/Components/ContainerProperties/ContainerForm.tsx deleted file mode 100644 index 1d89457..0000000 --- a/src/Components/ContainerProperties/ContainerForm.tsx +++ /dev/null @@ -1,670 +0,0 @@ -import * as React from 'react'; -import { PropertyType } from '../../Enums/PropertyType'; -import { type IContainerProperties } from '../../Interfaces/IContainerProperties'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { - SHOW_BORROWER_DIMENSIONS, - SHOW_CHILDREN_DIMENSIONS, - SHOW_SELF_DIMENSIONS, - SHOW_SELF_MARGINS_DIMENSIONS -} from '../../utils/default'; -import { - ApplyWidthMargin, - ApplyXMargin, - RemoveWidthMargin, - RemoveXMargin, - RestoreX, - RestoreY, - TransformX, - TransformY -} from '../../utils/svg'; -import { Text } from '../Text/Text'; -import { InputGroup } from '../InputGroup/InputGroup'; -import { TextInputGroup } from '../InputGroup/TextInputGroup'; -import { Select } from '../Select/Select'; -import { ToggleButton, ToggleType } from '../ToggleButton/ToggleButton'; -import { PositionReferenceSelector } from '../RadioGroupButtons/PositionReferenceSelector'; -import { OrientationSelector } from '../RadioGroupButtons/OrientationSelector'; -import { OrientationCheckboxes } from '../CheckboxGroupButtons/OrientationCheckboxes'; -import { PositionCheckboxes } from '../CheckboxGroupButtons/PositionCheckboxes'; -import { Category } from '../Category/Category'; -import { Orientation } from '../../Enums/Orientation'; -import { FindContainerById } from '../../utils/itertools'; -import { type IContainerModel } from '../../Interfaces/IContainerModel'; - -interface IContainerFormProps { - containers: Map - properties: IContainerProperties - symbols: Map - onChange: (key: string, value: string | number | boolean | number[], type?: PropertyType) => void -} - -export function ContainerForm(props: IContainerFormProps): JSX.Element { - const categoryHeight = 'h-11'; - const parent = FindContainerById(props.containers, props.properties.parentId); - const isVertical = parent?.properties.orientation === Orientation.Vertical; - return ( -
- { props.onChange('displayedText', value); }}/> - - - -
-
- -
-
- -
-
- -
-
-
- - -
- { - props.onChange( - 'x', - ApplyXMargin( - RestoreX( - Number(value), - props.properties.width, - props.properties.positionReference - ), - props.properties.margin.left - ) - ); - }}/> - { - props.onChange( - 'y', - ApplyXMargin( - RestoreY( - Number(value), - props.properties.height, - props.properties.positionReference - ), - props.properties.margin.top - ) - ); - }}/> -
-
- - -
- { props.onChange('minWidth', Number(value)); }}/> - { - props.onChange('width', ApplyWidthMargin( - Number(value), - props.properties.margin.left, - props.properties.margin.right - )); - }} - isDisabled={props.properties.isFlex}/> - { props.onChange('maxWidth', Number(value)); }}/> -
- { props.onChange('minHeight', Number(value)); }}/> - { - props.onChange('height', ApplyWidthMargin( - Number(value), - props.properties.margin.top, - props.properties.margin.bottom - )); - }} - isDisabled={props.properties.isFlex} - /> - { props.onChange('maxHeight', Number(value)); }}/> -
-
- - -
- { - props.onChange('left', Number(value), PropertyType.Margin); - }}/> - { - props.onChange('bottom', Number(value), PropertyType.Margin); - }}/> - { - props.onChange('top', Number(value), PropertyType.Margin); - }}/> - { - props.onChange('right', Number(value), PropertyType.Margin); - }}/> -
-
- - -
- { props.onChange('isFlex', event.target.checked); }} - /> - { props.onChange('isAnchor', event.target.checked); }}/> -
-
- - -
- -
- - ; -} diff --git a/src/Components/InputGroup/TextInputGroup.tsx b/src/Components/InputGroup/TextInputGroup.tsx deleted file mode 100644 index 91334b3..0000000 --- a/src/Components/InputGroup/TextInputGroup.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import * as React from 'react'; - -interface ITextInputGroupProps { - /** Use key the same way as React.Key */ - id: string - labelKey?: string - labelText: string - inputKey: string - labelClassName: string - inputClassName: string - type: string - value: string - defaultValue?: string - min?: number - max?: number - isDisabled?: boolean - onChange: (newValue: string) => void -} - -const className = 'input-group'; - -export function TextInputGroup(props: ITextInputGroupProps): JSX.Element { - const [value, setValue] = React.useState(props.value); - - React.useEffect(() => { - setValue(props.value); - }, [props.value, props.id]); - - function OnKeyUp(event: React.KeyboardEvent): void { - switch (event.key) { - case 'Enter': - props.onChange(value); - break; - case 'Escape': - setValue(props.value); - break; - } - } - - const warningClass = props.value !== value - ? 'focus:border-yellow-300 border-yellow-300 focus:ring-yellow-300 ring-yellow-300' - : ''; - - return <> - - { setValue(event.target.value); }} - onKeyUp={OnKeyUp} - min={props.min} - max={props.max} - disabled={props.isDisabled} /> - ; -} diff --git a/src/Components/LanguageProvider/LanguageProvider.tsx b/src/Components/LanguageProvider/LanguageProvider.tsx deleted file mode 100644 index 8375a94..0000000 --- a/src/Components/LanguageProvider/LanguageProvider.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import * as React from 'react'; -import { createContext, useState } from 'react'; -import { type ILanguage } from '../../Interfaces/ILanguage'; -import { languageOptions, translations } from '../../Translations/Translations'; -import { DEFAULT_LANGUAGE } from '../../utils/default'; - -// eslint-disable-next-line @typescript-eslint/naming-convention -export const LanguageContext = createContext({ - language: DEFAULT_LANGUAGE, - dictionary: translations.en -}); - -export function LanguageProvider( - { children }: { children: React.ReactNode | React.ReactNode[] | undefined } -): JSX.Element { - const [language, setLanguage] = useState(DEFAULT_LANGUAGE); - const provider = { - language, - dictionary: translations[language], - languageChange: (selected: string) => { - const newLanguage = languageOptions[selected] !== undefined - ? selected - : DEFAULT_LANGUAGE; - setLanguage(newLanguage); - } - }; - - return ( - - { children } - - ); -}; diff --git a/src/Components/Loader/Loader.scss b/src/Components/Loader/Loader.scss deleted file mode 100644 index 959fd3c..0000000 --- a/src/Components/Loader/Loader.scss +++ /dev/null @@ -1,59 +0,0 @@ -$foreground: #3b82f6; - -.loader, -.loader:before, -.loader:after { - background:$foreground; - -webkit-animation:load1 1s infinite ease-in-out; - animation:load1 1s infinite ease-in-out; - width:1em; - height:4em; -} - -.loader { - color:$foreground; - text-indent:-9999em; - margin:88px auto; - position:relative; - font-size:11px; - -webkit-transform: translateZ(0); - -ms-transform: translateZ(0); - transform: translateZ(0); - -webkit-animation-delay:-0.16s; - animation-delay:-0.16s; - - &:before, - &:after { - position:absolute; - top:0; - content:''; - } - - &:before { - left:-1.5em; - -webkit-animation-delay:-0.32s; - animation-delay:-0.32s; - } - - &:after { - left:1.5em; - } - -} - -@mixin load1-frames { - 0%, - 80%, - 100% { - box-shadow:0 0; - height:4em; - } - - 40% { - box-shadow:0 -2em; - height:5em; - } -} - -@-webkit-keyframes load1 {@include load1-frames;} -@keyframes load1 {@include load1-frames;} \ No newline at end of file diff --git a/src/Components/Loader/Loader.tsx b/src/Components/Loader/Loader.tsx deleted file mode 100644 index 85444d2..0000000 --- a/src/Components/Loader/Loader.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import './Loader.scss'; - -import * as React from 'react'; - -export function Loader(): JSX.Element { - return ( -
- Loading... -
- ); -} diff --git a/src/Components/MainMenu/MainMenu.tsx b/src/Components/MainMenu/MainMenu.tsx index e5cbb33..1d84f9a 100644 --- a/src/Components/MainMenu/MainMenu.tsx +++ b/src/Components/MainMenu/MainMenu.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import { Text } from '../Text/Text'; interface IMainMenuProps { newEditor: () => void @@ -7,26 +6,19 @@ interface IMainMenuProps { } enum WindowState { - Main, - Load, + MAIN, + LOAD, } -export function MainMenu(props: IMainMenuProps): JSX.Element { - const [windowState, setWindowState] = React.useState(WindowState.Main); - +export const MainMenu: React.FC = (props) => { + const [windowState, setWindowState] = React.useState(WindowState.MAIN); switch (windowState) { - case WindowState.Load: + case WindowState.LOAD: return ( -
+
- @@ -56,24 +53,9 @@ export function MainMenu(props: IMainMenuProps): JSX.Element { ); default: return ( -
- - +
+ +
); } diff --git a/src/Components/Menu/Menu.tsx b/src/Components/Menu/Menu.tsx index ed1f622..fde491f 100644 --- a/src/Components/Menu/Menu.tsx +++ b/src/Components/Menu/Menu.tsx @@ -1,171 +1,23 @@ -import useSize from '@react-hook/size'; import * as React from 'react'; -import { type IPoint } from '../../Interfaces/IPoint'; -import { MenuItem } from './MenuItem'; interface IMenuProps { - getListener: () => HTMLElement | null - actions: Map className?: string + x: number + y: number + isOpen: boolean + children: React.ReactNode[] | React.ReactNode } -export interface IMenuAction { - /** displayed */ - text: string - - /** title to show on hover */ - title?: string - - /** description of the shortcut */ - shortcut?: string - - /** function to be called on button click */ - action: (target: HTMLElement) => void - -} - -function UseMouseEvents( - getListener: () => HTMLElement | null, - setIsOpen: React.Dispatch>, - setContextMenuPosition: React.Dispatch>, - setTarget: React.Dispatch> -): void { - React.useEffect(() => { - function OnContextMenu(event: MouseEvent): void { - event.preventDefault(); - const contextMenuPosition: IPoint = { x: event.pageX, y: event.pageY }; - - setIsOpen(true); - setContextMenuPosition(contextMenuPosition); - setTarget(event.target as HTMLElement); // this is wrong since target can be null and not undefined - } - - function OnLeftClick(): void { - setIsOpen(false); - } - - getListener()?.addEventListener( - 'contextmenu', - OnContextMenu - ); - - window.addEventListener( - 'click', - OnLeftClick - ); - - return () => { - getListener()?.removeEventListener( - 'contextmenu', - OnContextMenu - ); - - window.removeEventListener( - 'click', - OnLeftClick - ); - }; - }); -} - -const MENU_WIDTH_CLASS = 'w-52'; -const MENU_VERTICAL_PADDING_CLASS = 'py-1'; - -export function Menu(props: IMenuProps): JSX.Element { - const [isOpen, setIsOpen] = React.useState(false); - const [contextMenuPosition, setContextMenuPosition] = React.useState({ - x: 0, - y: 0 - }); - const [target, setTarget] = React.useState(); - const menuRef = React.useRef(null); - const [menuWidth, menuHeight] = useSize(menuRef); - - UseMouseEvents( - props.getListener, - setIsOpen, - setContextMenuPosition, - setTarget - ); - - const children: JSX.Element[] = []; - - if (target !== undefined) { - let count = 0; - count = AddClassSpecificActions(target, count, props, children); - // Add universal actions - AddUniversalActions(props, children, count, target); - } - - const visible = isOpen && children.length > 0 - ? 'visible opacity-1' - : 'invisible opacity-0'; - const isOutOfBoundHorizontally = contextMenuPosition.x + menuWidth > window.innerWidth; - const isOutOfBoundVertically = contextMenuPosition.y + menuHeight > window.innerHeight; - const finalHorizontalPosition = isOutOfBoundHorizontally - ? contextMenuPosition.x - menuWidth - : contextMenuPosition.x; - const finalVerticalPosition = isOutOfBoundVertically - ? contextMenuPosition.y - menuWidth - : contextMenuPosition.y; +export const Menu: React.FC = (props) => { + const visible = props.isOpen ? 'visible opacity-1' : 'invisible opacity-0'; return (
- { children } + { props.children }
); -} - -function AddClassSpecificActions( - target: HTMLElement, - count: number, - props: IMenuProps, - children: JSX.Element[] -): number { - for (const className of target.classList) { - count++; - const actions = props.actions.get(className); - - // Only select action where classname matches - if (actions === undefined) { - continue; - } - - actions.forEach((action, index) => { - children.push( { action.action(target); }} />); - }); - children.push(
); - } - return count; -} - -function AddUniversalActions(props: IMenuProps, children: JSX.Element[], count: number, target: HTMLElement): number { - const actions = props.actions.get(''); - - if (actions !== undefined) { - count++; - actions.forEach((action, index) => { - children.push( { action.action(target); }} />); - }); - } - - return count; -} +}; diff --git a/src/Components/Menu/MenuItem.tsx b/src/Components/Menu/MenuItem.tsx index 1c0eede..9edc8ac 100644 --- a/src/Components/Menu/MenuItem.tsx +++ b/src/Components/Menu/MenuItem.tsx @@ -3,19 +3,14 @@ import * as React from 'react'; interface IMenuItemProps { className?: string text: string - title?: string - shortcut?: string onClick: () => void } -export function MenuItem(props: IMenuItemProps): JSX.Element { +export const MenuItem: React.FC = (props) => { return ( - ); -} +}; diff --git a/src/Components/Messages/Messages.tsx b/src/Components/Messages/Messages.tsx deleted file mode 100644 index 9326403..0000000 --- a/src/Components/Messages/Messages.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { TrashIcon } from '@heroicons/react/24/outline'; -import * as React from 'react'; -import { FixedSizeList as List } from 'react-window'; -import { MessageType } from '../../Enums/MessageType'; -import { type IHistoryState } from '../../Interfaces/IHistoryState'; -import { type IMessage } from '../../Interfaces/IMessage'; -import { TITLE_BAR_HEIGHT } from '../Sidebar/Sidebar'; -import { Text } from '../Text/Text'; - -interface IMessagesProps { - historyState: IHistoryState - messages: IMessage[] - clearMessage: () => void -} - -export function Messages(props: IMessagesProps): JSX.Element { - function Row({ index, style }: { index: number, style: React.CSSProperties }): JSX.Element { - const reversedIndex = (props.messages.length - 1) - index; - const message = props.messages[reversedIndex]; - let classType = ''; - switch (message.type) { - case MessageType.Success: - classType = 'bg-green-400 hover:bg-green-400/60'; - break; - - case MessageType.Warning: - classType = 'bg-yellow-400 hover:bg-yellow-400/60'; - break; - - case MessageType.Error: - classType = 'bg-red-400 hover:bg-red-400/60'; - break; - } - return (

- {message.text} -

); - } - - const toolbarHeight = 28; - - return ( -
-
- -
- - {Row} - -
- ); -}; diff --git a/src/Components/Properties/Properties.test.tsx b/src/Components/Properties/Properties.test.tsx new file mode 100644 index 0000000..86a80e2 --- /dev/null +++ b/src/Components/Properties/Properties.test.tsx @@ -0,0 +1,82 @@ +import { fireEvent, render, screen } from '@testing-library/react'; +import * as React from 'react'; +import { expect, describe, it, vi } from 'vitest'; +import { Properties } from './Properties'; + +describe.concurrent('Properties', () => { + it('No properties', () => { + render( {}} + />); + + expect(screen.queryByText('id')).toBeNull(); + expect(screen.queryByText('parentId')).toBeNull(); + expect(screen.queryByText('x')).toBeNull(); + expect(screen.queryByText('y')).toBeNull(); + }); + + it('Some properties', () => { + const prop = { + id: 'stuff', + parentId: 'parentId', + x: 1, + y: 1 + }; + + const handleChange = vi.fn((key, value) => { + (prop as any)[key] = value; + }); + + const { container, rerender } = render(); + + expect(screen.queryByText('id')).toBeDefined(); + expect(screen.queryByText('parentId')).toBeDefined(); + expect(screen.queryByText('x')).toBeDefined(); + expect(screen.queryByText('y')).toBeDefined(); + + let propertyId = container.querySelector('#property-id'); + let propertyParentId = container.querySelector('#property-parentId'); + let propertyX = container.querySelector('#property-x'); + let propertyY = container.querySelector('#property-y'); + expect(propertyId).toBeDefined(); + expect((propertyId as HTMLInputElement).value).toBe('stuff'); + expect(propertyParentId).toBeDefined(); + expect((propertyParentId as HTMLInputElement).value).toBe('parentId'); + expect(propertyX).toBeDefined(); + expect((propertyX as HTMLInputElement).value).toBe('1'); + expect(propertyY).toBeDefined(); + expect((propertyY as HTMLInputElement).value).toBe('1'); + + fireEvent.change(propertyId as Element, { target: { value: 'stuffed' } }); + fireEvent.change(propertyParentId as Element, { target: { value: 'parentedId' } }); + fireEvent.change(propertyX as Element, { target: { value: '2' } }); + fireEvent.change(propertyY as Element, { target: { value: '2' } }); + expect(handleChange).toBeCalledTimes(4); + + expect(prop.id).toBe('stuffed'); + expect(prop.parentId).toBe('parentedId'); + expect(prop.x).toBe('2'); + expect(prop.y).toBe('2'); + rerender(); + + propertyId = container.querySelector('#property-id'); + propertyParentId = container.querySelector('#property-parentId'); + propertyX = container.querySelector('#property-x'); + propertyY = container.querySelector('#property-y'); + expect(propertyId).toBeDefined(); + expect((propertyId as HTMLInputElement).value).toBe('stuffed'); + expect(propertyParentId).toBeDefined(); + expect((propertyParentId as HTMLInputElement).value).toBe('parentedId'); + expect(propertyX).toBeDefined(); + expect((propertyX as HTMLInputElement).value).toBe('2'); + expect(propertyY).toBeDefined(); + expect((propertyY as HTMLInputElement).value).toBe('2'); + }); +}); diff --git a/src/Components/Properties/Properties.tsx b/src/Components/Properties/Properties.tsx new file mode 100644 index 0000000..ca2056a --- /dev/null +++ b/src/Components/Properties/Properties.tsx @@ -0,0 +1,51 @@ +import * as React from 'react'; +import ContainerProperties from '../../Interfaces/Properties'; + +interface IPropertiesProps { + properties?: ContainerProperties + onChange: (key: string, value: string) => void +} + +export const Properties: React.FC = (props: IPropertiesProps) => { + if (props.properties === undefined) { + return
; + } + + const groupInput: React.ReactNode[] = []; + Object + .entries(props.properties) + .forEach((pair) => handleProperties(pair, groupInput, props.onChange)); + + return ( +
+ { groupInput } +
+ ); +}; + +const handleProperties = ( + [key, value]: [string, string | number], + groupInput: React.ReactNode[], + onChange: (key: string, value: string) => void +): void => { + const id = `property-${key}`; + const type = 'text'; + const isDisabled = key === 'id' || key === 'parentId'; // hardcoded + groupInput.push( +
+ + onChange(key, event.target.value)} + disabled={isDisabled} + /> +
+ ); +}; diff --git a/src/Components/RadioGroupButtons/OrientationSelector.tsx b/src/Components/RadioGroupButtons/OrientationSelector.tsx deleted file mode 100644 index c1b4bfa..0000000 --- a/src/Components/RadioGroupButtons/OrientationSelector.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import { ViewColumnsIcon } from '@heroicons/react/20/solid'; -import { Orientation } from '../../Enums/Orientation'; -import { RadioGroupButtons } from './RadioGroupButtons'; - -// TODO: After modeler uses TypeScript >= 4.x, extends Omit -interface IOrientationSelectorProps { - id: string - name: string - labelText: string - value: Orientation - onChange: (key: string, value: number) => void -} - -export function OrientationSelector({ - id, - name, - labelText, - value, - onChange -}: IOrientationSelectorProps): JSX.Element { - return - -
- ), - value: Orientation.Horizontal.toString() - }, - { - key: `${id}-vertical`, - text: ( -
- -
- ), - value: Orientation.Vertical.toString() - } - ]} - onChange={(event) => { - onChange(id, Number(event.target.value)); - }} - />; -} diff --git a/src/Components/RadioGroupButtons/PositionReferenceSelector.tsx b/src/Components/RadioGroupButtons/PositionReferenceSelector.tsx deleted file mode 100644 index e045cf3..0000000 --- a/src/Components/RadioGroupButtons/PositionReferenceSelector.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import React from 'react'; -import { - Bars3BottomLeftIcon, - Bars3CenterLeftIcon, - Bars3Icon, - Bars3BottomRightIcon, - Bars2Icon -} from '@heroicons/react/24/outline'; -import { PositionReference } from '../../Enums/PositionReference'; -import { RadioGroupButtons } from './RadioGroupButtons'; - -interface IPositionReferenceSelectorProps { - id: string - name: string - labelText: string - value: PositionReference - onChange: (key: string, value: number) => void -} - -export function PositionReferenceSelector({ - id, - name, - labelText, - value, - onChange -}: IPositionReferenceSelectorProps): JSX.Element { - return - -
- ), - value: PositionReference.TopLeft.toString() - }, - { - key: `${id}-tc`, - text: ( -
- -
- ), - value: PositionReference.TopCenter.toString() - }, - { - key: `${id}-tr`, - text: ( -
- -
- ), - value: PositionReference.TopRight.toString() - }, - { - key: `${id}-cl`, - text: ( -
- -
- ), - value: PositionReference.CenterLeft.toString() - }, - { - key: `${id}-cc`, - text: ( -
- -
- ), - value: PositionReference.CenterCenter.toString() - }, - { - key: `${id}-cr`, - text: ( -
- -
- ), - value: PositionReference.CenterRight.toString() - }, - { - key: `${id}-bl`, - text: ( -
- -
- ), - value: PositionReference.BottomLeft.toString() - }, - { - key: `${id}-bc`, - text: ( -
- -
- ), - value: PositionReference.BottomCenter.toString() - }, - { - key: `${id}-br`, - text: ( -
- -
- ), - value: PositionReference.BottomRight.toString() - } - ]} - onChange={(event) => { - onChange(id, Number(event.target.value)); - }} />; -} diff --git a/src/Components/RadioGroupButtons/RadioGroupButtons.tsx b/src/Components/RadioGroupButtons/RadioGroupButtons.tsx deleted file mode 100644 index d27496e..0000000 --- a/src/Components/RadioGroupButtons/RadioGroupButtons.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import * as React from 'react'; -import { type IInputGroup } from '../../Interfaces/IInputGroup'; - -interface IRadioGroupButtonsProps { - name: string - value: string - inputClassName: string - labelText: string - inputGroups: IInputGroup[] - colQty: number - onChange?: (event: React.ChangeEvent) => void -} - -// Use whole class name for react to preparse -const GRID_COLS = [ - 'grid-cols-none', - 'grid-cols-1', - 'grid-cols-2', - 'grid-cols-3', - 'grid-cols-4', - 'grid-cols-5', - 'grid-cols-6', - 'grid-cols-7', - 'grid-cols-8', - 'grid-cols-9', - 'grid-cols-10', - 'grid-cols-11', - 'grid-cols-12' -]; - -export function RadioGroupButtons(props: IRadioGroupButtonsProps): JSX.Element { - const inputGroups = props.inputGroups.map((inputGroup) => ( -
- - -
- - )); - - const gridColsClass = GRID_COLS[props.colQty]; - - return ( - <> - -
- {inputGroups} -
- - ); -} diff --git a/src/Components/SVG/Elements/Container.tsx b/src/Components/SVG/Elements/Container.tsx index 784bd1e..02dea6f 100644 --- a/src/Components/SVG/Elements/Container.tsx +++ b/src/Components/SVG/Elements/Container.tsx @@ -1,51 +1,23 @@ import * as React from 'react'; -import { Interweave, type Node } from 'interweave'; -import { type IContainerModel } from '../../../Interfaces/IContainerModel'; -import { type IContainerProperties } from '../../../Interfaces/IContainerProperties'; -import { Camelize } from '../../../utils/stringtools'; -import { SHOW_TEXT } from '../../../utils/default'; -import { FindContainerById } from '../../../utils/itertools'; +import { IContainerModel } from '../../../Interfaces/ContainerModel'; +import { getDepth } from '../../../utils/itertools'; +import { Dimension } from './Dimension'; -interface IContainerProps { - containers: Map +export interface IContainerProps { model: IContainerModel - depth: number - scale: number - selectContainer: (containerId: string) => void } +const GAP = 50; + /** * Render the container * @returns Render the container */ -export function Container(props: IContainerProps): JSX.Element { - const containersElements = props.model.children.map(childId => { - const child = FindContainerById(props.containers, childId); - - if (child === undefined) { - return <>; - } - - return ; - }); - - const width: number = props.model.properties.width; - const height: number = props.model.properties.height; - - const x = props.model.properties.x; - const y = props.model.properties.y; - - const xText = width / 2; - const yText = height / 2; - - const transform = `translate(${x}, ${y})`; +export const Container: React.FC = (props: IContainerProps) => { + const containersElements = props.model.children.map(child => ); + const xText = Number(props.model.properties.width) / 2; + const yText = Number(props.model.properties.height) / 2; + const transform = `translate(${Number(props.model.properties.x)}, ${Number(props.model.properties.y)})`; // g style const defaultStyle: React.CSSProperties = { @@ -57,18 +29,20 @@ export function Container(props: IContainerProps): JSX.Element { // Rect style const style = Object.assign( JSON.parse(JSON.stringify(defaultStyle)), - props.model.properties.style + props.model.properties ); + style.x = 0; + style.y = 0; + delete style.height; + delete style.width; - const svg = (props.model.properties.customSVG != null) - ? CreateReactCustomSVG(props.model.properties.customSVG, props.model.properties) - : ( { props.selectContainer(props.model.properties.id); }} - > - ); + // Dimension props + const id = `dim-${props.model.properties.id}`; + const xStart: number = 0; + const xEnd = Number(props.model.properties.width); + const y = -(GAP * (getDepth(props.model) + 1)); + const strokeWidth = 1; + const text = (props.model.properties.width ?? 0).toString(); return ( - {svg} - {SHOW_TEXT - ? - {props.model.properties.displayedText} - - : null} - {containersElements} + + + + + {props.model.properties.id} + + { containersElements } ); -} - -function CreateReactCustomSVG(customSVG: string, properties: IContainerProperties): React.ReactNode { - return Transform(node, children, properties)} - />; -} - -function Transform(node: HTMLElement, children: Node[], properties: IContainerProperties): React.ReactNode { - const supportedTags = ['line', 'path', 'rect']; - if (supportedTags.includes(node.tagName.toLowerCase())) { - const attributes: Record = {}; - node.getAttributeNames().forEach(attName => { - const attributeValue = node.getAttribute(attName); - if (attributeValue === null) { - attributes[attName] = attributeValue; - return; - } - - if (attributeValue.startsWith('{userData.') && attributeValue.endsWith('}')) { - // support for userData - const userData = properties.userData; - if (userData === undefined) { - return undefined; - } - - const userDataKey = attributeValue.replace(/userData\./, ''); - - const prop = Object.entries(userData).find(([key]) => `{${key}}` === userDataKey); - if (prop !== undefined) { - attributes[Camelize(attName)] = prop[1]; - return; - } - } - - if (attributeValue.startsWith('{{') && attributeValue.endsWith('}}')) { - // support for object - const stringObject = attributeValue.slice(1, -1); - const object: JSON = JSON.parse(stringObject); - attributes[Camelize(attName)] = object; - return; - } - - const prop = Object.entries(properties).find(([key]) => `{${key}}` === attributeValue); - if (prop !== undefined) { - attributes[Camelize(attName)] = prop[1]; - return; - } - attributes[Camelize(attName)] = attributeValue; - }); - return React.createElement(node.tagName.toLowerCase(), attributes, children); - } - return undefined; -} +}; diff --git a/src/Components/SVG/Elements/Dimension.tsx b/src/Components/SVG/Elements/Dimension.tsx index fb20dc5..ec51873 100644 --- a/src/Components/SVG/Elements/Dimension.tsx +++ b/src/Components/SVG/Elements/Dimension.tsx @@ -1,98 +1,50 @@ import * as React from 'react'; -import { NOTCHES_LENGTH } from '../../../utils/default'; -import { type IDimensionStyle } from '../../../Interfaces/IDimensionStyle'; interface IDimensionProps { id: string xStart: number - yStart: number xEnd: number - yEnd: number + y: number text: string - style: IDimensionStyle - scale?: number + strokeWidth: number } -/** - * 2D Parametric function. Returns a new coordinate from the origin coordinate - * See for more details https://en.wikipedia.org/wiki/Parametric_equation. - * TL;DR a parametric function is a function with a parameter - * @param x0 Origin coordinate - * @param t The parameter - * @param vx Transform vector - * @returns Returns a new coordinate from the origin coordinate - */ -function ApplyParametric(x0: number, t: number, vx: number): number { - return x0 + t * vx; -} - -export function Dimension(props: IDimensionProps): JSX.Element { - const scale = props.scale ?? 1; +export const Dimension: React.FC = (props: IDimensionProps) => { const style: React.CSSProperties = { - stroke: props.style.color ?? '#000000', - strokeWidth: (props.style.width ?? 2) / scale, - strokeDasharray: props.style.dashArray + stroke: 'black' }; - - /// We need to find the points of the notches - // Get the vector of the line - const [deltaX, deltaY] = [(props.xEnd - props.xStart), (props.yEnd - props.yStart)]; - const rotation = (Math.atan2(deltaY, deltaX) / (2 * Math.PI)); - - // Get the unit vector - const norm = Math.sqrt(deltaX * deltaX + deltaY * deltaY); - const [unitX, unitY] = [deltaX / norm, deltaY / norm]; - - // Get the perpandicular vector - const [perpVecX, perpVecY] = [unitY, -unitX]; - - // Use the parametric function to get the coordinates (x = x0 + t * v.x) - const notchesLength = NOTCHES_LENGTH / scale; - const startTopX = ApplyParametric(props.xStart, notchesLength, perpVecX); - const startTopY = ApplyParametric(props.yStart, notchesLength, perpVecY); - const startBottomX = ApplyParametric(props.xStart, -notchesLength, perpVecX); - const startBottomY = ApplyParametric(props.yStart, -notchesLength, perpVecY); - - const endTopX = ApplyParametric(props.xEnd, notchesLength, perpVecX); - const endTopY = ApplyParametric(props.yEnd, notchesLength, perpVecY); - const endBottomX = ApplyParametric(props.xEnd, -notchesLength, perpVecX); - const endBottomY = ApplyParametric(props.yEnd, -notchesLength, perpVecY); - - const textX = ApplyParametric((props.xStart + props.xEnd) / 2, notchesLength, perpVecX); - const textY = ApplyParametric((props.yStart + props.yEnd) / 2, notchesLength, perpVecY); - return ( + x1={props.xStart} + y1={props.y - 4 * props.strokeWidth} + x2={props.xStart} + y2={props.y + 4 * props.strokeWidth} + strokeWidth={props.strokeWidth} + style={style} + /> + y2={props.y} + strokeWidth={props.strokeWidth} + style={style} + /> + x1={props.xEnd} + y1={props.y - 4 * props.strokeWidth} + x2={props.xEnd} + y2={props.y + 4 * props.strokeWidth} + strokeWidth={props.strokeWidth} + style={style} + /> {props.text} ); -} +}; diff --git a/src/Components/SVG/Elements/DimensionLayer.tsx b/src/Components/SVG/Elements/DimensionLayer.tsx index 6a78deb..85f1a43 100644 --- a/src/Components/SVG/Elements/DimensionLayer.tsx +++ b/src/Components/SVG/Elements/DimensionLayer.tsx @@ -1,692 +1,66 @@ import * as React from 'react'; -import { Orientation } from '../../../Enums/Orientation'; -import { Position } from '../../../Enums/Position'; -import { - DEFAULT_DIMENSION_SYMBOL_STYLE, - DIMENSION_MARGIN, - SHOW_BORROWER_DIMENSIONS, - SHOW_CHILDREN_DIMENSIONS, - SHOW_SELF_DIMENSIONS, - SHOW_SELF_MARGINS_DIMENSIONS, - SYMBOL_DIMENSION_MARGIN -} from '../../../utils/default'; -import { FindContainerById, MakeRecursionDFSIterator, Pairwise } from '../../../utils/itertools'; -import { TransformX, TransformY } from '../../../utils/svg'; -import { type IContainerModel } from '../../../Interfaces/IContainerModel'; -import { type ISymbolModel } from '../../../Interfaces/ISymbolModel'; +import { ContainerModel } from '../../../Interfaces/ContainerModel'; +import { getDepth, MakeIterator } from '../../../utils/itertools'; import { Dimension } from './Dimension'; interface IDimensionLayerProps { - containers: Map - symbols: Map - root: IContainerModel - scale: number + isHidden: boolean + roots: ContainerModel | ContainerModel[] | null } -/** - * Fonction that call another function given the positions - * @param dimMapped Position mapped depending on the Position enum in order: - * [0:left, 1:bottom, 2:up, 3:right] - * @param positions List of positions - * @param horizontalAction Action called when a left or right position is present - * @param verticalAction Action called when a down or up position is present - * @param params Params for the actions - * (the two actions must have the same number of params, and in the same order) - */ -function ActionByPosition( - dimMapped: number[], - positions: Position[], - horizontalAction: (dim: number, ...params: any[]) => void, - verticalAction: (dim: number, isRight: boolean, ...params: any[]) => void, - params: any[] -): void { - positions.forEach((position: Position) => { - const dim = dimMapped[position]; - switch (position) { - case Position.Right: - case Position.Left: - verticalAction(dim, false, ...params); - break; - case Position.Up: - case Position.Down: - horizontalAction(dim, ...params); - break; - } - }); -} +const GAP: number = 50; -/** - * Returns a list of dimensions of all containers in root - * @param param0 Object with the root container and the scale of the svg - * @returns A list of dimensions - */ -function Dimensions({ containers, symbols, root, scale }: IDimensionLayerProps): React.ReactNode[] { - const it = MakeRecursionDFSIterator(root, containers, 0, [0, 0]); +const getDimensionsNodes = (root: ContainerModel): React.ReactNode[] => { + const it = MakeIterator(root); const dimensions: React.ReactNode[] = []; - const topDim = root.properties.y; - const leftDim = root.properties.x; - const rightDim = root.properties.x + root.properties.width; - const bottomDim = root.properties.y + root.properties.height; + for (const container of it) { + // WARN: this might be dangerous later when using other units/rules + const width = Number(container.properties.width); - if (!SHOW_SELF_DIMENSIONS) { - return []; - } - - for (const { container, depth, currentTransform } of it) { - const offset = (DIMENSION_MARGIN * (depth + 2)) / scale; - const containerLeftDim = leftDim - offset; - const containerTopDim = topDim - offset; - const containerBottomDim = bottomDim + offset; - const containerRightDim = rightDim + offset; - const dimMapped = [containerLeftDim, containerBottomDim, containerTopDim, containerRightDim]; - if (SHOW_SELF_DIMENSIONS && container.properties.dimensionOptions.selfDimensions.positions.length > 0) { - ActionByPosition( - dimMapped, - container.properties.dimensionOptions.selfDimensions.positions, - AddHorizontalSelfDimension, - AddVerticalSelfDimension, - [ - container, - currentTransform, - dimensions, - scale - ] - ); - } - - if (SHOW_SELF_MARGINS_DIMENSIONS && - container.properties.dimensionOptions.selfMarginsDimensions.positions.length > 0) { - ActionByPosition( - dimMapped, - container.properties.dimensionOptions.selfMarginsDimensions.positions, - AddHorizontalSelfMarginsDimension, - AddVerticalSelfMarginsDimension, - [ - container, - currentTransform, - dimensions, - scale - ] - ); - } - - if (SHOW_BORROWER_DIMENSIONS && container.properties.dimensionOptions.dimensionWithMarks.positions.length > 0) { - ActionByPosition( - dimMapped, - container.properties.dimensionOptions.dimensionWithMarks.positions, - - AddHorizontalBorrowerDimension, - AddVerticalBorrowerDimension, - [ - containers, - container, - depth, - currentTransform, - dimensions, - scale - ] - ); - } - - if (SHOW_CHILDREN_DIMENSIONS && - container.properties.dimensionOptions.childrenDimensions.positions.length > 0 && - container.children.length >= 2) { - ActionByPosition( - dimMapped, - container.properties.dimensionOptions.childrenDimensions.positions, - AddHorizontalChildrenDimension, - AddVerticalChildrenDimension, - [ - containers, - container, - currentTransform, - dimensions, - scale - ] - ); - } - } - - // TODO: Implement DimensionManager - const symbolsWithDimension = [...symbols.values()] - .filter(symbol => symbol.showDimension && symbol.offset > 0); - const horizontalSymbolsWithDimension = symbolsWithDimension - .filter(symbol => !symbol.isVertical); - - horizontalSymbolsWithDimension.forEach((symbol, index) => { - AddHorizontalSymbolDimension( - symbol, - dimensions, - scale, - index, - horizontalSymbolsWithDimension.length + const id = `dim-${container.properties.id}`; + const xStart: number = container.properties.x; + const xEnd = xStart + width; + const y = -(GAP * (getDepth(container) + 1)); + const strokeWidth = 1; + const text = width.toString(); + dimensions.push( + ); - }); - - const verticalSymbolsWithDimension = symbolsWithDimension - .filter(symbol => symbol.isVertical); - - verticalSymbolsWithDimension.forEach((symbol, index) => { - AddVerticalSymbolDimension( - symbol, - dimensions, - scale, - index, - verticalSymbolsWithDimension.length - ); - }); - + } return dimensions; -} - -function AddHorizontalSymbolDimension( - symbol: ISymbolModel, - dimensions: React.ReactNode[], - scale: number, - depth: number, - maxDepth: number -): void { - const width = TransformX(symbol.offset, symbol.width, symbol.config.PositionReference); - if (width == null || width <= 0) { - return; - } - const id = `dim-y-margin-left${symbol.width.toFixed(0)}-${symbol.id}`; - - const spacing = DIMENSION_MARGIN; - const position = spacing * (depth + 1) / maxDepth; - const offset = (SYMBOL_DIMENSION_MARGIN + position) / scale; - const text = width - .toFixed(0) - .toString(); - dimensions.push(); -} - -function AddVerticalSymbolDimension( - symbol: ISymbolModel, - dimensions: React.ReactNode[], - scale: number, - depth: number, - maxDepth: number -): void { - const height = TransformY(symbol.offset, symbol.height, symbol.config.PositionReference); - if (height == null || height <= 0) { - return; - } - const id = `dim-x-margin-left${symbol.height.toFixed(0)}-${symbol.id}`; - - const spacing = DIMENSION_MARGIN; - const position = spacing * (depth + 1) / maxDepth; - const offset = (SYMBOL_DIMENSION_MARGIN + position) / scale; - const text = height - .toFixed(0) - .toString(); - dimensions.push(); -} +}; /** * A layer containing all dimension + * + * @deprecated In order to avoid adding complexity + * with computing the position in a group hierarchy, + * use Dimension directly inside the Container, + * Currently it is glitched as + * it does not take parents into account, + * and will not work correctly * @param props * @returns */ -export function DimensionLayer(props: IDimensionLayerProps): JSX.Element { +export const DimensionLayer: React.FC = (props: IDimensionLayerProps) => { + let dimensions: React.ReactNode[] = []; + if (Array.isArray(props.roots)) { + props.roots.forEach(child => { + dimensions.concat(getDimensionsNodes(child)); + }); + } else if (props.roots !== null) { + dimensions = getDimensionsNodes(props.roots); + } return ( - - {Dimensions(props)} + + { dimensions } ); -} - -/// Dimensions Actions /// - -function AddHorizontalChildrenDimension( - yDim: number, - containers: Map, - container: IContainerModel, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const childrenId = `dim-y${yDim.toFixed(0)}-children-${container.properties.id}`; - const style = container.properties.dimensionOptions.childrenDimensions; - - const lastChildId = container.children[container.children.length - 1]; - const lastChild = FindContainerById(containers, lastChildId); - - if (lastChild === undefined) { - return; - } - - let xChildrenStart = TransformX( - lastChild.properties.x, - lastChild.properties.width, - lastChild.properties.positionReference - ); - let xChildrenEnd = TransformX( - lastChild.properties.x, - lastChild.properties.width, - lastChild.properties.positionReference - ); - - // Find the min and max - for (let i = container.children.length - 2; i >= 0; i--) { - const childId = container.children[i]; - const child = FindContainerById(containers, childId); - - if (child === undefined) { - continue; - } - - const left = TransformX(child.properties.x, child.properties.width, child.properties.positionReference); - if (left < xChildrenStart) { - xChildrenStart = left; - } - const right = TransformX(child.properties.x, child.properties.width, child.properties.positionReference); - if (right > xChildrenEnd) { - xChildrenEnd = right; - } - } - - if (xChildrenStart === xChildrenEnd) { - // do not show an empty dimension - return; - } - - const textChildren = (xChildrenEnd - xChildrenStart) - .toFixed(0) - .toString(); - - const offset = currentTransform[0] + container.properties.x; - dimensions.push(); -} - -function AddVerticalChildrenDimension( - xDim: number, - isRight: boolean, - containers: Map, - container: IContainerModel, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const childrenId = `dim-x${xDim.toFixed(0)}-children-${container.properties.id}`; - const style = container.properties.dimensionOptions.childrenDimensions; - - const lastChildId = container.children[container.children.length - 1]; - const lastChild = FindContainerById(containers, lastChildId); - - if (lastChild === undefined) { - return; - } - - let yChildrenStart = TransformY( - lastChild.properties.y, - lastChild.properties.height, - lastChild.properties.positionReference - ); - let yChildrenEnd = TransformY( - lastChild.properties.y, - lastChild.properties.height, - lastChild.properties.positionReference - ); - - // Find the min and max - for (let i = container.children.length - 2; i >= 0; i--) { - const childId = container.children[i]; - const child = FindContainerById(containers, childId); - - if (child === undefined) { - continue; - } - - const top = TransformY(child.properties.y, child.properties.height, child.properties.positionReference); - if (top < yChildrenStart) { - yChildrenStart = top; - } - const bottom = TransformY(child.properties.y, child.properties.height, child.properties.positionReference); - if (bottom > yChildrenEnd) { - yChildrenEnd = bottom; - } - } - - if (yChildrenStart === yChildrenEnd) { - // do not show an empty dimension - return; - } - - const textChildren = (yChildrenEnd - yChildrenStart) - .toFixed(0) - .toString(); - - const offset = currentTransform[0] + container.properties.x; - - if (!isRight) { - [yChildrenStart, yChildrenEnd] = [yChildrenEnd, yChildrenStart]; - } - - dimensions.push(); -} - -function AddHorizontalBorrowerDimension( - yDim: number, - containers: Map, - container: IContainerModel, - depth: number, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const style = container.properties.dimensionOptions.dimensionWithMarks; - const it = MakeRecursionDFSIterator(container, containers, depth, currentTransform); - const marks = []; // list of vertical lines for the dimension - for (const { - container: childContainer, currentTransform: childCurrentTransform - } of it) { - const isHidden = !childContainer.properties.dimensionOptions.markPosition.includes(Orientation.Horizontal); - if (isHidden) { - continue; - } - - const x = TransformX( - childContainer.properties.x, - childContainer.properties.width, - childContainer.properties.positionReference - ); - - const restoredX = x + childCurrentTransform[0]; - - marks.push(restoredX); - } - - const restoredX = container.properties.x + currentTransform[0]; - marks.push(restoredX); - marks.push(restoredX + container.properties.width); - marks.sort((a, b) => a - b); - let count = 0; - for (const { cur, next } of Pairwise(marks)) { - const id = `dim-y${yDim.toFixed(0)}-borrow-${container.properties.id}-{${count}}`; - const value = next - cur; - if (value === 0) { - return; - } - - dimensions.push(); - count++; - } -} - -function AddVerticalBorrowerDimension( - xDim: number, - isRight: boolean, - containers: Map, - container: IContainerModel, - depth: number, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const style = container.properties.dimensionOptions.dimensionWithMarks; - const it = MakeRecursionDFSIterator(container, containers, depth, currentTransform); - const marks = []; // list of vertical lines for the dimension - for (const { - container: childContainer, currentTransform: childCurrentTransform - } of it) { - const isHidden = !childContainer.properties.dimensionOptions.markPosition.includes(Orientation.Vertical); - if (isHidden) { - continue; - } - - const y = TransformY( - childContainer.properties.y, - childContainer.properties.height, - childContainer.properties.positionReference - ); - - const restoredy = y + childCurrentTransform[1]; - - marks.push(restoredy); - } - - const restoredY = container.properties.y + currentTransform[1]; - marks.push(restoredY); - marks.push(restoredY + container.properties.height); - marks.sort((a, b) => a - b); - - let count = 0; - for (let { cur, next } of Pairwise(marks)) { - const id = `dim-x${xDim.toFixed(0)}-borrow-${container.properties.id}-{${count}}`; - const value = next - cur; - if (value === 0) { - return; - } - - if (!isRight) { - [cur, next] = [next, cur]; - } - - dimensions.push(); - count++; - } -} - -function AddVerticalSelfDimension( - xDim: number, - isRight: boolean, - container: IContainerModel, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const style = container.properties.dimensionOptions.selfDimensions; - const height = container.properties.height; - const idVert = `dim-x${xDim.toFixed(0)}-${container.properties.id}`; - let yStart = container.properties.y + currentTransform[1] + height; - let yEnd = container.properties.y + currentTransform[1]; - const textVert = height - .toFixed(0) - .toString(); - - if (isRight) { - [yStart, yEnd] = [yEnd, yStart]; - } - - dimensions.push(); -} - -function AddHorizontalSelfDimension( - yDim: number, - container: IContainerModel, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const style = container.properties.dimensionOptions.selfDimensions; - const width = container.properties.width; - const id = `dim-y${yDim.toFixed(0)}-${container.properties.id}`; - const xStart = container.properties.x + currentTransform[0]; - const xEnd = xStart + width; - const text = width - .toFixed(0) - .toString(); - dimensions.push(); -} - -function AddHorizontalSelfMarginsDimension( - yDim: number, - container: IContainerModel, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const style = container.properties.dimensionOptions.selfMarginsDimensions; - const left = container.properties.margin.left; - if (left != null && left > 0) { - const id = `dim-y-margin-left${yDim.toFixed(0)}-${container.properties.id}`; - const xStart = container.properties.x + currentTransform[0] - left; - const xEnd = xStart + left; - const text = left - .toFixed(0) - .toString(); - dimensions.push(); - } - - const right = container.properties.margin.right; - if (right != null && right > 0) { - const id = `dim-y-margin-right${yDim.toFixed(0)}-${container.properties.id}`; - const xStart = container.properties.x + container.properties.width + currentTransform[0]; - const xEnd = xStart + right; - const text = right - .toFixed(0) - .toString(); - dimensions.push(); - } -} - -function AddVerticalSelfMarginsDimension( - xDim: number, - isRight: boolean, - container: IContainerModel, - currentTransform: [number, number], - dimensions: React.ReactNode[], - scale: number -): void { - const style = container.properties.dimensionOptions.selfMarginsDimensions; - const top = container.properties.margin.top; - if (top != null && top > 0) { - const idVert = `dim-x-margin-top${xDim.toFixed(0)}-${container.properties.id}`; - let yStart = container.properties.y + currentTransform[1]; - let yEnd = yStart - top; - const textVert = top - .toFixed(0) - .toString(); - - if (isRight) { - [yStart, yEnd] = [yEnd, yStart]; - } - - dimensions.push(); - } - const bottom = container.properties.margin.bottom; - if (bottom != null && bottom > 0) { - const idVert = `dim-x-margin-bottom${xDim.toFixed(0)}-${container.properties.id}`; - let yStart = container.properties.y + container.properties.height + bottom + currentTransform[1]; - let yEnd = yStart - bottom; - const textVert = bottom - .toFixed(0) - .toString(); - - if (isRight) { - [yStart, yEnd] = [yEnd, yStart]; - } - - dimensions.push(); - } -} +}; diff --git a/src/Components/SVG/Elements/Selector.scss b/src/Components/SVG/Elements/Selector.scss deleted file mode 100644 index 906cb5f..0000000 --- a/src/Components/SVG/Elements/Selector.scss +++ /dev/null @@ -1,4 +0,0 @@ -@keyframes fadein { - from { opacity: 0; } - to { opacity: 1; } -} \ No newline at end of file diff --git a/src/Components/SVG/Elements/Selector.tsx b/src/Components/SVG/Elements/Selector.tsx new file mode 100644 index 0000000..c5937e0 --- /dev/null +++ b/src/Components/SVG/Elements/Selector.tsx @@ -0,0 +1,42 @@ +import * as React from 'react'; +import { IContainerModel } from '../../../Interfaces/ContainerModel'; +import { getAbsolutePosition } from '../../../utils/itertools'; + +interface ISelectorProps { + selected: IContainerModel | null +} + +export const Selector: React.FC = (props) => { + if (props.selected === undefined || props.selected === null) { + return ( + + + ); + } + + const [x, y] = getAbsolutePosition(props.selected); + const [width, height] = [ + props.selected.properties.width, + props.selected.properties.height + ]; + const style: React.CSSProperties = { + stroke: '#3B82F6', // tw blue-500 + strokeWidth: 4, + fillOpacity: 0, + transitionProperty: 'all', + transitionTimingFunction: 'cubic-bezier(0.4, 0, 0.2, 1)', + transitionDuration: '150ms', + animation: 'fadein 750ms ease-in alternate infinite' + }; + + return ( + + + ); +}; diff --git a/src/Components/SVG/Elements/Selector/Selector.tsx b/src/Components/SVG/Elements/Selector/Selector.tsx deleted file mode 100644 index 1a8fb3e..0000000 --- a/src/Components/SVG/Elements/Selector/Selector.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import '../Selector.scss'; -import * as React from 'react'; -import { SHOW_SELECTOR_TEXT } from '../../../../utils/default'; - -interface ISelectorProps { - text: string - x: number - y: number - width: number - height: number - scale: number - style?: React.CSSProperties -} - -export function Selector({ text, x, y, width, height, scale, style: overrideStyle }: ISelectorProps): JSX.Element { - const xText = x + width / 2; - const yText = y + height / 2; - - const style: React.CSSProperties = { - stroke: '#3B82F6', - strokeWidth: 4 / scale, - fillOpacity: 0, - transitionProperty: 'all', - transitionTimingFunction: 'cubic-bezier(0.4, 0, 0.2, 1)', - transitionDuration: '150ms', - animation: 'fadein 750ms ease-in alternate infinite', - ...overrideStyle - }; - - return ( - <> - - - {SHOW_SELECTOR_TEXT - ? - { text } - - : null} - - ); -} diff --git a/src/Components/SVG/Elements/SelectorContainer/SelectorContainer.tsx b/src/Components/SVG/Elements/SelectorContainer/SelectorContainer.tsx deleted file mode 100644 index 4665169..0000000 --- a/src/Components/SVG/Elements/SelectorContainer/SelectorContainer.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import '../Selector.scss'; -import * as React from 'react'; -import { type IContainerModel } from '../../../../Interfaces/IContainerModel'; -import { GetAbsolutePosition } from '../../../../utils/itertools'; -import { RemoveMargin } from '../../../../utils/svg'; -import { Selector } from '../Selector/Selector'; - -interface ISelectorContainerProps { - containers: Map - selected?: IContainerModel - scale?: number -} - -export function SelectorContainer(props: ISelectorContainerProps): JSX.Element { - if (props.selected === undefined || props.selected === null) { - return ( - - - ); - } - - const scale = (props.scale ?? 1); - let [x, y] = GetAbsolutePosition(props.containers, props.selected); - let [width, height] = [ - props.selected.properties.width, - props.selected.properties.height - ]; - - ({ x, y, width, height } = RemoveMargin( - x, - y, - width, - height, - props.selected.properties.margin.left, - props.selected.properties.margin.bottom, - props.selected.properties.margin.top, - props.selected.properties.margin.right - )); - - return ( - - ); -} diff --git a/src/Components/SVG/Elements/SelectorSymbol/SelectorSymbol.tsx b/src/Components/SVG/Elements/SelectorSymbol/SelectorSymbol.tsx deleted file mode 100644 index d61b4aa..0000000 --- a/src/Components/SVG/Elements/SelectorSymbol/SelectorSymbol.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import '../Selector.scss'; -import * as React from 'react'; -import { SYMBOL_MARGIN } from '../../../../utils/default'; -import { type ISymbolModel } from '../../../../Interfaces/ISymbolModel'; -import { Selector } from '../Selector/Selector'; - -interface ISelectorSymbolProps { - symbols: Map - selected?: ISymbolModel -} - -export function SelectorSymbol(props: ISelectorSymbolProps): JSX.Element { - if (props.selected === undefined || props.selected === null) { - return ( - - - ); - } - - let x, y: number; - - const scaledHeight = props.selected.height; - const scaledWidth = props.selected.width; - - if (props.selected.isVertical) { - x = -SYMBOL_MARGIN - props.selected.width; - y = props.selected.offset; - } else { - x = props.selected.offset; - y = -SYMBOL_MARGIN - props.selected.height; - } - - return ( - - ); -} diff --git a/src/Components/SVG/Elements/Symbol.tsx b/src/Components/SVG/Elements/Symbol.tsx deleted file mode 100644 index c3a6eb8..0000000 --- a/src/Components/SVG/Elements/Symbol.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { Interweave } from 'interweave'; -import * as React from 'react'; -import { type ISymbolModel } from '../../../Interfaces/ISymbolModel'; -import { SYMBOL_MARGIN } from '../../../utils/default'; - -interface ISymbolProps { - model: ISymbolModel - scale: number -} - -export function Symbol(props: ISymbolProps): JSX.Element { - const href = props.model.config.Image.Base64Image ?? props.model.config.Image.Url; - const hasSVG = props.model.config.Image.Svg !== undefined && - props.model.config.Image.Svg !== null; - - let x, y: number; - - if (props.model.isVertical) { - x = -SYMBOL_MARGIN - props.model.width; - y = props.model.offset; - } else { - x = props.model.offset; - y = -SYMBOL_MARGIN - props.model.height; - } - - if (hasSVG) { - return ( - - - - ); - } - - return ( - - ); -} diff --git a/src/Components/SVG/Elements/SymbolLayer.tsx b/src/Components/SVG/Elements/SymbolLayer.tsx deleted file mode 100644 index 8610e7f..0000000 --- a/src/Components/SVG/Elements/SymbolLayer.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import * as React from 'react'; -import { type ISymbolModel } from '../../../Interfaces/ISymbolModel'; -import { Symbol } from './Symbol'; - -interface ISymbolLayerProps { - symbols: Map - scale: number -} - -export function SymbolLayer(props: ISymbolLayerProps): JSX.Element { - const symbols: JSX.Element[] = []; - props.symbols.forEach((symbol) => { - symbols.push(); - }); - return ( - - {symbols} - - ); -} diff --git a/src/Components/SVG/SVG.tsx b/src/Components/SVG/SVG.tsx index 86d3895..aaa3b22 100644 --- a/src/Components/SVG/SVG.tsx +++ b/src/Components/SVG/SVG.tsx @@ -1,57 +1,46 @@ import * as React from 'react'; -import { ReactSVGPanZoom, type Tool, TOOL_PAN, type Value, ALIGN_CENTER } from 'react-svg-pan-zoom'; -import { MAX_FRAMERATE } from '../../utils/default'; -import { type DrawParams } from '../Viewer/Viewer'; +import { UncontrolledReactSVGPanZoom } from 'react-svg-pan-zoom'; import { Container } from './Elements/Container'; -import { SelectorContainer } from './Elements/SelectorContainer/SelectorContainer'; -import { SymbolLayer } from './Elements/SymbolLayer'; -import { DimensionLayer } from './Elements/DimensionLayer'; -import { SelectorSymbol } from './Elements/SelectorSymbol/SelectorSymbol'; -import { type IToolbarProps, Toolbar } from './SVGReactPanZoom/ui-toolbar/toolbar'; +import { ContainerModel } from '../../Interfaces/ContainerModel'; +import { Selector } from './Elements/Selector'; +import { BAR_WIDTH } from '../Bar/Bar'; interface ISVGProps { - className?: string - viewerWidth: number - viewerHeight: number width: number height: number - drawParams: DrawParams - selectContainer: (containerId: string) => void + children: ContainerModel | ContainerModel[] | null + selected: ContainerModel | null } -export enum SelectorMode { - Nothing, - Containers, - Symbols +interface Viewer { + viewerWidth: number + viewerHeight: number } export const ID = 'svg'; -export function SVG(props: ISVGProps): JSX.Element { - const { - mainContainer, - selectorMode, - selectedContainer, - selectedSymbol, - containers, - symbols - } = props.drawParams; - const [tool, setTool] = React.useState(TOOL_PAN); - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const [value, setValue] = React.useState({} as Value); - const [scale, setScale] = React.useState(value.a ?? 1); +function resizeViewBox( + setViewer: React.Dispatch> +): void { + setViewer({ + viewerWidth: window.innerWidth - BAR_WIDTH, + viewerHeight: window.innerHeight + }); +} - const svgViewer = React.useRef(null); +export const SVG: React.FC = (props: ISVGProps) => { + const [viewer, setViewer] = React.useState({ + viewerWidth: window.innerWidth, + viewerHeight: window.innerHeight + }); - // Framerate limiter - const delta = React.useRef(0); - const timer = React.useRef(performance.now()); - const renderCounter = React.useRef(0); - // Debug: FPS counter - // const startTimer = React.useRef(Date.now()); - // console.log(renderCounter.current / ((Date.now() - startTimer.current) / 1000)); + React.useEffect(() => { + window.addEventListener('resize', () => resizeViewBox(setViewer)); - UseFitOnce(svgViewer, props.width, props.height); + return () => { + window.addEventListener('resize', () => resizeViewBox(setViewer)); + }; + }); const xmlns = ''; const properties = { @@ -60,96 +49,32 @@ export function SVG(props: ISVGProps): JSX.Element { xmlns }; - const children: React.ReactNode | React.ReactNode[] = ; - - function Selector(): JSX.Element { - switch (selectorMode) { - case SelectorMode.Containers: - return ; - case SelectorMode.Symbols: - return ; - default: - return <>; - } + let children: React.ReactNode | React.ReactNode[] = []; + if (Array.isArray(props.children)) { + children = props.children.map(child => ); + } else if (props.children !== null) { + children = ; } return ( -
- { - // Framerate limiter - const newTimer = performance.now(); - delta.current += (newTimer - timer.current) / 1000; - timer.current = newTimer; - if (delta.current <= (1 / MAX_FRAMERATE)) { - return; - } - - renderCounter.current = renderCounter.current + 1; - delta.current = delta.current % (1 / MAX_FRAMERATE); - setValue(value); - }} - onZoom={(event: unknown) => { - const value = event as Value; - setScale(value.a); - }} - onDoubleClick={() => { - svgViewer?.current?.setPointOnViewerCenter(props.width / 2, props.height / 2, 0.8); - }} +
+ ( - - )} > - {children} - - - + { children } + - +
); -} - -function UseFitOnce(svgViewer: React.RefObject, width: number, height: number): void { - React.useCallback(() => { - // TODO: Fix this - svgViewer?.current?.setPointOnViewerCenter(width / 2, height / 2, 0.8); - }, [svgViewer, width, height]); -} +}; diff --git a/src/Components/SVG/SVGReactPanZoom/LICENSE b/src/Components/SVG/SVGReactPanZoom/LICENSE deleted file mode 100644 index 2f083c0..0000000 --- a/src/Components/SVG/SVGReactPanZoom/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 https://github.com/chrvadala - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/src/Components/SVG/SVGReactPanZoom/ui-toolbar/toolbar-button.tsx b/src/Components/SVG/SVGReactPanZoom/ui-toolbar/toolbar-button.tsx deleted file mode 100644 index e606a70..0000000 --- a/src/Components/SVG/SVGReactPanZoom/ui-toolbar/toolbar-button.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import { POSITION_TOP, POSITION_BOTTOM } from 'react-svg-pan-zoom'; - -interface IToolbarButtonProps { - title: string - name: string - toolbarPosition: string - activeColor: string - onClick: (event: React.MouseEvent | React.TouchEvent) => void - active: boolean - children: JSX.Element | JSX.Element[] -} - -interface IToolbarButtonState { - hover: boolean -} - -export class ToolbarButton extends React.Component { - public state: IToolbarButtonState; - - constructor(props: IToolbarButtonProps) { - super(props); - this.state = { hover: false }; - } - - change(event: (React.MouseEvent | React.TouchEvent)): void { - event.preventDefault(); - event.stopPropagation(); - - switch (event.type) { - case 'mouseenter': - case 'touchstart': - this.setState({ hover: true }); - break; - case 'mouseleave': - case 'touchend': - case 'touchcancel': - this.setState({ hover: false }); - break; - default: - // noop - } - } - - render(): JSX.Element { - const style = { - display: 'block', - width: '24px', - height: '24px', - margin: [POSITION_TOP, POSITION_BOTTOM].includes(this.props.toolbarPosition) - ? '2px 1px' - : '1px 2px', - color: this.props.active || this.state.hover - ? this.props.activeColor - : '#FFF', - transition: 'color 200ms ease', - background: 'none', - padding: '0px', - border: '0px', - outline: '0px', - cursor: 'pointer' - }; - - return ( - - ); - } -} diff --git a/src/Components/SVG/SVGReactPanZoom/ui-toolbar/toolbar.tsx b/src/Components/SVG/SVGReactPanZoom/ui-toolbar/toolbar.tsx deleted file mode 100644 index 5b0a223..0000000 --- a/src/Components/SVG/SVGReactPanZoom/ui-toolbar/toolbar.tsx +++ /dev/null @@ -1,204 +0,0 @@ -import { - ArrowsPointingOutIcon, - CursorArrowRaysIcon, - HandRaisedIcon, - MagnifyingGlassMinusIcon, - MagnifyingGlassPlusIcon -} from '@heroicons/react/24/outline'; -import React from 'react'; -import { applyToPoint, fromObject, inverse, scale, transform, translate } from 'transformation-matrix'; - -import { - fitToViewer, - POSITION_TOP, - POSITION_BOTTOM, - POSITION_LEFT, - POSITION_RIGHT, - TOOL_NONE, - TOOL_PAN, - TOOL_ZOOM_IN, - TOOL_ZOOM_OUT, ALIGN_LEFT, ALIGN_TOP, - type Value, - type Tool, - type ALIGN_BOTTOM, - type ALIGN_CENTER, - type ALIGN_RIGHT, - type ToolbarPosition -} from 'react-svg-pan-zoom'; -import { ToolbarButton } from './toolbar-button'; - -export interface IToolbarProps { - tool: Tool - value: Value - onChangeValue: (value: Value) => void - onChangeTool: (tool: Tool) => void - activeToolColor?: string - position?: ToolbarPosition | undefined - SVGAlignX?: typeof ALIGN_CENTER | typeof ALIGN_LEFT | typeof ALIGN_RIGHT | undefined - SVGAlignY?: typeof ALIGN_CENTER | typeof ALIGN_TOP | typeof ALIGN_BOTTOM | undefined - fittingScale?: number | undefined -} - -/** - * Change value - * @param value - * @param patch - * @param action - * @returns {Object} - */ -function set(value: Value, patch: object, action = null): Value { - value = Object.assign({}, value, patch, { lastAction: action }); - return Object.freeze(value); -} - -/** - * Export x,y coords relative to SVG - * @param value - * @param viewerX - * @param viewerY - * @returns {*|{x, y}|{x: number, y: number}} - */ -function getSVGPoint(value: Value, viewerX: number, viewerY: number): PointObjectNotation { - const matrix = fromObject(value); - - const inverseMatrix = inverse(matrix); - return applyToPoint(inverseMatrix, { x: viewerX, y: viewerY }); -} - -export function zoom( - value: Value, - SVGPointX: number, - SVGPointY: number, - scaleFactor: number -): Value { - const matrix = transform( - fromObject(value), - translate(SVGPointX, SVGPointY), - scale(scaleFactor, scaleFactor), - translate(-SVGPointX, -SVGPointY) - ); - - return set(value, { - ...matrix - }); -} - -export function Toolbar({ - tool, - value, - onChangeValue, - onChangeTool, - activeToolColor = '#1CA6FC', - position = POSITION_RIGHT, - SVGAlignX = ALIGN_LEFT, - SVGAlignY = ALIGN_TOP, - fittingScale = undefined -}: IToolbarProps): JSX.Element { - function handleChangeTool(event: React.MouseEvent | React.TouchEvent, tool: Tool): void { - onChangeTool(tool); - event.stopPropagation(); - event.preventDefault(); - }; - - function handleFit(event: React.MouseEvent | React.TouchEvent): void { - let fittedValue: Value = fitToViewer(value, SVGAlignX, SVGAlignY); - if (fittingScale !== undefined) { - const { viewerWidth, viewerHeight } = fittedValue; - const SVGPoint = getSVGPoint(value, viewerWidth / 2, viewerHeight / 2); - fittedValue = zoom(fittedValue, SVGPoint.x, SVGPoint.y, fittingScale); - } - - onChangeValue(fittedValue); - event.stopPropagation(); - event.preventDefault(); - }; - - const isHorizontal = [POSITION_TOP, POSITION_BOTTOM].includes(position); - - const style: React.CSSProperties = { - // position - position: 'absolute', - transform: [POSITION_TOP, POSITION_BOTTOM].includes(position) - ? 'translate(-50%, 0px)' - : 'none', - top: [POSITION_LEFT, POSITION_RIGHT, POSITION_TOP].includes(position) - ? '5px' - : 'unset', - left: [POSITION_TOP, POSITION_BOTTOM].includes(position) - ? '50%' - : (POSITION_LEFT === position - ? '5px' - : 'unset'), - right: [POSITION_RIGHT].includes(position) - ? '5px' - : 'unset', - bottom: [POSITION_BOTTOM].includes(position) - ? '5px' - : 'unset', - - // inner styling - backgroundColor: 'rgba(19, 20, 22, 0.90)', - borderRadius: '2px', - display: 'flex', - flexDirection: isHorizontal - ? 'row' - : 'column', - padding: isHorizontal - ? '1px 2px' - : '2px 1px' - }; - - return ( -
- { handleChangeTool(event, TOOL_NONE); } }> - - - - { handleChangeTool(event, TOOL_PAN); } }> - - - - { handleChangeTool(event, TOOL_ZOOM_IN); } }> - - - - { handleChangeTool(event, TOOL_ZOOM_OUT); } }> - - - - { handleFit(event); } }> - - -
- ); -} diff --git a/src/Components/Select/Select.tsx b/src/Components/Select/Select.tsx deleted file mode 100644 index 5a94107..0000000 --- a/src/Components/Select/Select.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import * as React from 'react'; -import { type IInputGroup } from '../../Interfaces/IInputGroup'; - -interface ISelectProps { - labelKey?: string - labelText: string - inputKey: string - labelClassName: string - inputClassName: string - inputs: IInputGroup[] - value?: string - onChange?: (event: React.ChangeEvent) => void -} - -const className = ` - w-full - text-xs font-medium transition-all text-gray-800 mt-1 px-3 py-2 - bg-white border-2 border-white rounded-lg placeholder-gray-800 - focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 - disabled:bg-slate-300 disabled:text-gray-500 disabled:border-slate-300 disabled:shadow-none`; - -export function Select(props: ISelectProps): JSX.Element { - const options = [( - - )]; - - props.inputs.forEach(input => { - options.push(); - }); - - return ( - <> - - - - ); -} diff --git a/src/Components/Settings/Settings.tsx b/src/Components/Settings/Settings.tsx deleted file mode 100644 index 3f65b5a..0000000 --- a/src/Components/Settings/Settings.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { ArrowUpOnSquareIcon, CameraIcon } from '@heroicons/react/24/outline'; -import React from 'react'; -import { Text } from '../Text/Text'; - -interface ISettingsProps { - saveEditorAsJSON: () => void - saveEditorAsSVG: () => void -}; - -export function Settings(props: ISettingsProps): JSX.Element { - return ( -
- - -
- ); -} diff --git a/src/Components/Sidebar/Sidebar.test.tsx b/src/Components/Sidebar/Sidebar.test.tsx new file mode 100644 index 0000000..886496e --- /dev/null +++ b/src/Components/Sidebar/Sidebar.test.tsx @@ -0,0 +1,54 @@ +import * as React from 'react'; +import { describe, it, expect, vi } from 'vitest'; +import { fireEvent, render, screen } from '../../utils/test-utils'; +import { Sidebar } from './Sidebar'; + +describe.concurrent('Sidebar', () => { + it('Start default', () => { + render( + {}} + /> + ); + const stuff = screen.queryByText(/stuff/i); + + expect(screen.getByText(/Components/i).classList.contains('left-0')).toBeDefined(); + expect(stuff).toBeNull(); + }); + + it('Start close', () => { + render( {}} + />); + + const stuff = screen.queryByText(/stuff/i); + expect(screen.getByText(/Components/i).classList.contains('-left-64')).toBeDefined(); + expect(stuff).toBeNull(); + }); + + it('With stuff', () => { + const Type = 'stuff'; + const handleButtonClick = vi.fn(); + render(); + const stuff = screen.getByText(/stuff/i); + + expect(stuff).toBeDefined(); + fireEvent.click(stuff); + expect(handleButtonClick).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/Components/Sidebar/Sidebar.tsx b/src/Components/Sidebar/Sidebar.tsx index 8ea0ec5..dc2f1a7 100644 --- a/src/Components/Sidebar/Sidebar.tsx +++ b/src/Components/Sidebar/Sidebar.tsx @@ -1,25 +1,43 @@ import * as React from 'react'; +import { AvailableContainer } from '../../Interfaces/AvailableContainer'; +import { truncateString } from '../../utils/stringtools'; interface ISidebarProps { - className?: string - title: string - titleButtons?: JSX.Element | JSX.Element[] - children?: JSX.Element | JSX.Element[] + componentOptions: AvailableContainer[] + isOpen: boolean + buttonOnClick: (type: string) => void } -export const TITLE_BAR_HEIGHT = 64; +function handleDragStart(event: React.DragEvent): void { + event.dataTransfer.setData('type', (event.target as HTMLButtonElement).id); +} -export function Sidebar(props: ISidebarProps): JSX.Element { +export const Sidebar: React.FC = (props: ISidebarProps) => { + const listElements = props.componentOptions.map(componentOption => + + ); + + const isOpenClasses = props.isOpen ? 'left-16' : '-left-64'; return ( -
-
- { props.title } - { props.titleButtons } +
+
+ Components
-
- { props.children } +
+ {listElements}
); diff --git a/src/Components/Sidebar/ToggleSideBar/ToggleSideBar.scss b/src/Components/Sidebar/ToggleSideBar/ToggleSideBar.scss deleted file mode 100644 index 50ba0e3..0000000 --- a/src/Components/Sidebar/ToggleSideBar/ToggleSideBar.scss +++ /dev/null @@ -1,4 +0,0 @@ -.text-vertical{ - text-align: right; - writing-mode: vertical-rl; -} \ No newline at end of file diff --git a/src/Components/Sidebar/ToggleSideBar/ToggleSideBar.tsx b/src/Components/Sidebar/ToggleSideBar/ToggleSideBar.tsx deleted file mode 100644 index 9db0ff1..0000000 --- a/src/Components/Sidebar/ToggleSideBar/ToggleSideBar.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import * as React from 'react'; -import './ToggleSideBar.scss'; - -interface IToggleSidebarProps { - title: string - checked: boolean - onClick: () => void -} - -export function ToggleSideBar({ title, checked, onClick }: IToggleSidebarProps): JSX.Element { - return ( -
- -
- ); -} diff --git a/src/Components/SymbolProperties/SymbolForm.tsx b/src/Components/SymbolProperties/SymbolForm.tsx deleted file mode 100644 index 6556b1a..0000000 --- a/src/Components/SymbolProperties/SymbolForm.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import * as React from 'react'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { RestoreX, RestoreY, TransformX, TransformY } from '../../utils/svg'; -import { InputGroup } from '../InputGroup/InputGroup'; -import { TextInputGroup } from '../InputGroup/TextInputGroup'; -import { Text } from '../Text/Text'; -import { ToggleButton } from '../ToggleButton/ToggleButton'; -import { type PositionReference } from '../../Enums/PositionReference'; - -interface ISymbolFormProps { - symbol: ISymbolModel - symbols: Map - onChange: (key: string, value: string | number | boolean) => void -} - -function Restore( - offset: number, - isVertical: boolean, - height: number, - width: number, - position: PositionReference | undefined -): number { - if (isVertical) { - return RestoreY(offset, height, position); - } else { - return RestoreX(offset, width, position); - } -} -function Transform( - offset: number, - isVertical: boolean, - height: number, - width: number, - position: PositionReference | undefined -): number { - if (isVertical) { - return TransformY(offset, height, position); - } else { - return TransformX(offset, width, position); - } -} - -export function SymbolForm(props: ISymbolFormProps): JSX.Element { - return ( -
- - { props.onChange('displayedText', value); }} /> - { - props.onChange( - 'offset', - Restore( - Number(value), - props.symbol.isVertical, - props.symbol.height, - props.symbol.width, - props.symbol.config.PositionReference - ) - ); - }} /> - { props.onChange('isVertical', e.target.checked); }}/> - { props.onChange('height', Number(value)); }} /> - { props.onChange('width', Number(value)); }} /> - { props.onChange('showDimension', e.target.checked); }}/> -
- ); -} diff --git a/src/Components/SymbolProperties/SymbolProperties.tsx b/src/Components/SymbolProperties/SymbolProperties.tsx deleted file mode 100644 index 05b1f5d..0000000 --- a/src/Components/SymbolProperties/SymbolProperties.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { SymbolForm } from './SymbolForm'; - -interface ISymbolPropertiesProps { - symbol?: ISymbolModel - symbols: Map - onChange: (key: string, value: string | number | boolean) => void -} - -export function SymbolProperties(props: ISymbolPropertiesProps): JSX.Element { - if (props.symbol === undefined) { - return
; - } - - return ( -
- -
- ); -} diff --git a/src/Components/Symbols/Symbols.tsx b/src/Components/Symbols/Symbols.tsx deleted file mode 100644 index e845f81..0000000 --- a/src/Components/Symbols/Symbols.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react'; -import { type IAvailableSymbol } from '../../Interfaces/IAvailableSymbol'; -import { TruncateString } from '../../utils/stringtools'; - -interface ISymbolsProps { - componentOptions: IAvailableSymbol[] - buttonOnClick: (type: string) => void -} - -function HandleDragStart(event: React.DragEvent): void { - event.dataTransfer.setData('type', (event.target as HTMLButtonElement).id); -} - -export function Symbols(props: ISymbolsProps): JSX.Element { - const listElements = props.componentOptions.map(componentOption => { - if (componentOption.Image.Url !== undefined || componentOption.Image.Base64Image !== undefined) { - const url = componentOption.Image.Base64Image ?? componentOption.Image.Url; - return (); - } - - return (); - }); - - return ( -
-
- {listElements} -
-
- ); -}; diff --git a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx b/src/Components/SymbolsSidebar/SymbolsSidebar.tsx deleted file mode 100644 index 2404926..0000000 --- a/src/Components/SymbolsSidebar/SymbolsSidebar.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import * as React from 'react'; -import useSize from '@react-hook/size'; -import { FixedSizeList as List } from 'react-window'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; -import { SymbolProperties } from '../SymbolProperties/SymbolProperties'; -import { ToggleSideBar } from '../Sidebar/ToggleSideBar/ToggleSideBar'; -import { Text } from '../Text/Text'; -import { ExtendedSidebar } from '../UI/UI'; - -interface ISymbolsSidebarProps { - selectedSymbolId: string - symbols: Map - selectedExtendedSidebar: ExtendedSidebar - onPropertyChange: (key: string, value: string | number | boolean) => void - selectSymbol: (symbolId: string) => void - onExpandChange: (value: ExtendedSidebar) => void -} - -export function SymbolsSidebar(props: ISymbolsSidebarProps): JSX.Element { - // States - const divRef = React.useRef(null); - const height = useSize(divRef)[1]; - // Render - const symbols = [...props.symbols.values()]; - - const selectedSymbol = props.symbols.get(props.selectedSymbolId); - return ( -
- {props.selectedExtendedSidebar === ExtendedSidebar.Property && -
- {(selectedSymbol == null) &&

{Text({ textId: '@NoSymbolSelected' })}

} - -
} -
-
- { - const newValue = props.selectedExtendedSidebar !== ExtendedSidebar.Property - ? ExtendedSidebar.Property - : ExtendedSidebar.None; - props.onExpandChange(newValue); - }} /> -
- - {Row} - -
-
- ); - - function Row({ index, style }: { index: number, style: React.CSSProperties }): JSX.Element { - const symbol = symbols[index]; - const key = symbol.id; - const text = symbol.displayedText; - const selectedClass: string = props.selectedSymbolId !== '' && - props.selectedSymbolId === symbol.id - ? 'border-l-4 bg-slate-400/60 hover:bg-slate-400' - : 'bg-slate-300/60 hover:bg-slate-300'; - - return ( - - ); - } -} diff --git a/src/Components/Text/Text.tsx b/src/Components/Text/Text.tsx deleted file mode 100644 index f6ea5cd..0000000 --- a/src/Components/Text/Text.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { useContext } from 'react'; -import { LanguageContext } from '../LanguageProvider/LanguageProvider'; - -interface TextProps { - textId: string -}; - -export function Text({ textId }: TextProps): string { - const languageContext = useContext(LanguageContext); - return languageContext.dictionary[textId] ?? textId; -}; diff --git a/src/Components/ToggleButton/ToggleButton.scss b/src/Components/ToggleButton/ToggleButton.scss deleted file mode 100644 index 0948f52..0000000 --- a/src/Components/ToggleButton/ToggleButton.scss +++ /dev/null @@ -1,8 +0,0 @@ -input:checked ~ .dot { - transform: translateX(100%); -} -input:checked ~ .line { - background-color: #3B82F6; -} - - diff --git a/src/Components/ToggleButton/ToggleButton.tsx b/src/Components/ToggleButton/ToggleButton.tsx deleted file mode 100644 index 74829bf..0000000 --- a/src/Components/ToggleButton/ToggleButton.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react'; -import './ToggleButton.scss'; - -interface IToggleButtonProps { - labelKey?: string - labelText: string - inputKey: string - labelClassName: string - inputClassName: string - type?: ToggleType - checked: boolean - onChange: React.ChangeEventHandler -} - -export enum ToggleType { - Material, - Full -} - -export function ToggleButton(props: IToggleButtonProps): JSX.Element { - const type = props.type ?? ToggleType.Material; - let classLine = 'line w-10 h-4 bg-gray-400 rounded-full shadow-inner'; - let classDot = 'dot absolute w-6 h-6 bg-white rounded-full shadow -left-1 -top-1 transition'; - if (type === ToggleType.Full) { - classLine = 'line block bg-gray-600 w-12 h-7 rounded-full'; - classDot = 'dot absolute left-1 top-1 bg-white w-5 h-5 rounded-full transition'; - } - - return <> - - - ; -} diff --git a/src/Components/UI/UI.tsx b/src/Components/UI/UI.tsx index 90cf449..7422471 100644 --- a/src/Components/UI/UI.tsx +++ b/src/Components/UI/UI.tsx @@ -1,290 +1,93 @@ import * as React from 'react'; -import { type Dispatch } from 'react'; import { ElementsSidebar } from '../ElementsSidebar/ElementsSidebar'; -import { History } from '../History/History'; -import { Bar, BAR_WIDTH } from '../Bar/Bar'; -import { Symbols } from '../Symbols/Symbols'; -import { SymbolsSidebar } from '../SymbolsSidebar/SymbolsSidebar'; -import { type PropertyType } from '../../Enums/PropertyType'; -import { Messages } from '../Messages/Messages'; import { Sidebar } from '../Sidebar/Sidebar'; -import { Components } from '../Components/Components'; -import { Viewer } from '../Viewer/Viewer'; -import { Settings } from '../Settings/Settings'; -import { type IMessage } from '../../Interfaces/IMessage'; -import { DISABLE_API } from '../../utils/default'; -import { FindContainerById } from '../../utils/itertools'; -import { type IEditorState } from '../../Interfaces/IEditorState'; -import { GetCurrentHistoryState } from '../Editor/Editor'; -import { Text } from '../Text/Text'; -import { type IReplaceContainer } from '../../Interfaces/IReplaceContainer'; -import { UseWorker, UseAsync } from './UseWorker'; - -export interface IUIProps { - editorState: IEditorState - replaceContainer: IReplaceContainer - selectedContainerId: string - selectedSymbolId: string - selectContainer: (containerId: string) => void - deleteContainer: (containerId: string) => void - onPropertyChange: (key: string, value: string | number | boolean | number[], type?: PropertyType) => void - addOrReplaceContainer: (type: string) => void - addContainerAt: (index: number, type: string, parent: string) => void - addSymbol: (type: string) => void - onSymbolPropertyChange: (key: string, value: string | number | boolean) => void - selectSymbol: (symbolId: string) => void - deleteSymbol: (symbolId: string) => void - saveEditorAsJSON: () => void - saveEditorAsSVG: () => void - loadState: (move: number) => void - setReplaceContainer: Dispatch> +import { History } from '../History/History'; +import { AvailableContainer } from '../../Interfaces/AvailableContainer'; +import { ContainerModel } from '../../Interfaces/ContainerModel'; +import { HistoryState } from "../../Interfaces/HistoryState"; +import { PhotographIcon, UploadIcon } from '@heroicons/react/outline'; +import { FloatingButton } from '../FloatingButton/FloatingButton'; +import { Bar } from '../Bar/Bar'; +interface IUIProps { + current: HistoryState + history: HistoryState[] + historyCurrentStep: number + AvailableContainers: AvailableContainer[] + SelectContainer: (container: ContainerModel) => void + DeleteContainer: (containerId: string) => void + OnPropertyChange: (key: string, value: string) => void + AddContainerToSelectedContainer: (type: string) => void + AddContainer: (index: number, type: string, parentId: string) => void + SaveEditorAsJSON: () => void + SaveEditorAsSVG: () => void + LoadState: (move: number) => void } -export enum SidebarType { - None, - Components, - Symbols, - History, - Messages, - Settings -} +export const UI: React.FunctionComponent = (props: IUIProps) => { + const [isSidebarOpen, setIsSidebarOpen] = React.useState(true); + const [isElementsSidebarOpen, setIsElementsSidebarOpen] = React.useState(false); + const [isHistoryOpen, setIsHistoryOpen] = React.useState(false); -export enum ExtendedSidebar { - None, - Property -} - -function UseSetOrToggleSidebar( - selectedSidebar: SidebarType, - setSelectedSidebar: React.Dispatch> -): (newSidebarType: SidebarType) => void { - return (newSidebarType) => { - if (newSidebarType === selectedSidebar) { - setSelectedSidebar(SidebarType.None); - return; - } - - setSelectedSidebar(newSidebarType); - }; -} - -export function UI({ - editorState, - replaceContainer, - selectedContainerId, - selectedSymbolId, - setReplaceContainer, - ...methods -}: IUIProps): JSX.Element { - const [selectedSidebar, setSelectedSidebar] = React.useState(SidebarType.Components); - const [ - selectedExtendedSidebar, - setSelectedExtendedSidebarType - ] = React.useState(ExtendedSidebar.None); - - const [messages, setMessages] = React.useState([]); - const current = GetCurrentHistoryState(editorState.history, editorState.historyCurrentStep); - const configuration = editorState.configuration; - - // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions - if (window.Worker && !DISABLE_API) { - UseWorker( - current, - configuration.APIConfiguration?.apiGetFeedbackUrl, - setMessages - ); - } else if (!DISABLE_API) { - UseAsync( - current, - configuration.APIConfiguration?.apiGetFeedbackUrl, - setMessages - ); + let buttonRightOffsetClasses = 'right-12'; + if (isElementsSidebarOpen || isHistoryOpen) { + buttonRightOffsetClasses = 'right-72'; } - - // Please use setOrToggleSidebar rather than setSelectedSidebar, so we can close the sidebar - const setOrToggleSidebar = UseSetOrToggleSidebar(selectedSidebar, setSelectedSidebar); - - let leftSidebarTitle = ''; - let rightSidebarTitle = ''; - let leftChildren: JSX.Element = (<>); - let rightChildren: JSX.Element = (<>); - - const mainContainer = FindContainerById(current.containers, current.mainContainer); - - if (mainContainer === undefined) { - throw new Error('Tried to initialized UI but there is no main container!'); + if (isHistoryOpen && isElementsSidebarOpen) { + buttonRightOffsetClasses = 'right-[544px]'; } - const selectedContainer = FindContainerById(current.containers, selectedContainerId); - const selectedSymbol = current.symbols.get(selectedSymbolId); - - switch (selectedSidebar) { - case SidebarType.Components: - leftSidebarTitle = Text({ textId: '@Components' }); - - leftChildren = ; - rightSidebarTitle = Text({ textId: '@Elements' }); - rightChildren = { setSelectedExtendedSidebarType(value); } } - />; - break; - - case SidebarType.Symbols: - leftSidebarTitle = Text({ textId: '@SymbolsLeft' }); - leftChildren = ; - rightSidebarTitle = Text({ textId: '@SymbolsRight' }); - rightChildren = { setSelectedExtendedSidebarType(value); } } - />; - break; - - case SidebarType.History: - leftSidebarTitle = Text({ textId: '@Timeline' }); - leftChildren = ; - break; - - case SidebarType.Messages: - leftSidebarTitle = Text({ textId: '@Messages' }); - leftChildren = { setMessages([]); }} - />; - break; - - case SidebarType.Settings: - leftSidebarTitle = Text({ textId: '@Settings' }); - leftChildren = ; - break; - } - - const isLeftSidebarOpen = selectedSidebar !== SidebarType.None; - const isRightSidebarOpen = [SidebarType.Components, SidebarType.Symbols] - .includes(selectedSidebar); - const isRightSidebarOpenExpanded = isRightSidebarOpen && - selectedExtendedSidebar !== ExtendedSidebar.None; - - const isLeftSidebarOpenClasses = new Set([ - 'left-sidebar', - 'left-16', - '-bottom-full', - 'md:-left-64', - 'md:bottom-0' - ]); - - let isRightSidebarOpenClasses = 'right-0 -bottom-full md:-right-80 md:bottom-0'; - - let marginSidebar = BAR_WIDTH; - const viewerMarginClasses = new Set([ - 'ml-16' - ]); - - if (isLeftSidebarOpen) { - isLeftSidebarOpenClasses.delete('-bottom-full'); - isLeftSidebarOpenClasses.delete('md:-left-64'); - isLeftSidebarOpenClasses.delete('md:bottom-0'); - marginSidebar += 256; - viewerMarginClasses.add(' md:ml-80'); - } - - if (isRightSidebarOpen || isRightSidebarOpenExpanded) { - isRightSidebarOpenClasses = 'right-0'; - - if (isRightSidebarOpenExpanded) { - viewerMarginClasses.add(' md:mr-[32rem]'); - marginSidebar += 512; - } else { - viewerMarginClasses.add(' md:mr-64'); - marginSidebar += 256; - } - } else { - isLeftSidebarOpenClasses.delete('left-sidebar'); - isLeftSidebarOpenClasses.add('left-sidebar-single'); - } - - const clickRestrictionsClasses = replaceContainer.isReplacing - ? 'pointer-events-none opacity-50' - : ''; - const isComponentsOpen = selectedSidebar === SidebarType.Components; - const isSymbolsOpen = selectedSidebar === SidebarType.Symbols; - return ( <> { - setOrToggleSidebar(SidebarType.Components); - } } - toggleSymbols={() => { - setOrToggleSidebar(SidebarType.Symbols); - } } - toggleTimeline={() => { - setOrToggleSidebar(SidebarType.History); - } } - toggleMessages={() => { - setOrToggleSidebar(SidebarType.Messages); - } } - toggleSettings={() => { - setOrToggleSidebar(SidebarType.Settings); - } } + isSidebarOpen={isSidebarOpen} + isElementsSidebarOpen={isElementsSidebarOpen} + isHistoryOpen={isHistoryOpen} + ToggleElementsSidebar={() => setIsElementsSidebarOpen(!isElementsSidebarOpen)} + ToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)} + ToggleTimeline={() => setIsHistoryOpen(!isHistoryOpen)} /> + - { leftChildren } - - props.AddContainerToSelectedContainer(type)} /> - - { rightChildren } - + + + + + + + ); -} +}; + +export default UI; diff --git a/src/Components/UI/UseWorker.tsx b/src/Components/UI/UseWorker.tsx deleted file mode 100644 index fe47d2e..0000000 --- a/src/Components/UI/UseWorker.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import * as React from 'react'; -import { type IHistoryState } from '../../Interfaces/IHistoryState'; -import { type IGetFeedbackRequest } from '../../Interfaces/IGetFeedbackRequest'; -import { type IGetFeedbackResponse } from '../../Interfaces/IGetFeedbackResponse'; -import { type IMessage } from '../../Interfaces/IMessage'; -import { GetCircularReplacer } from '../../utils/saveload'; - -// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions -const myWorker = window.Worker && new Worker('workers/message_worker.js'); - -export function UseWorker( - state: IHistoryState, - configurationUrl: string | undefined, - setMessages: React.Dispatch> -): void { - React.useEffect(() => { - // use webworker for the stringify to avoid freezing - myWorker.postMessage({ - state, - url: configurationUrl ?? import.meta.env.VITE_API_GET_FEEDBACK_URL - }); - - return () => { - }; - }, [state, configurationUrl]); - - React.useEffect(() => { - myWorker.onmessage = (event) => { - setMessages(event.data as IMessage[]); - }; - }, [setMessages]); -} -export function UseAsync( - state: IHistoryState, - configurationUrl: string | undefined, - setMessages: React.Dispatch> -): void { - React.useEffect(() => { - const request: IGetFeedbackRequest = { - // eslint-disable-next-line @typescript-eslint/naming-convention - ApplicationState: state - }; - const dataParsed = JSON.stringify(request, GetCircularReplacer()); - const url = configurationUrl ?? import.meta.env.VITE_API_GET_FEEDBACK_URL; - fetch(url, { - method: 'POST', - headers: new Headers({ - // eslint-disable-next-line @typescript-eslint/naming-convention - 'Content-Type': 'application/json' - }), - body: dataParsed - }) - .then(async(response) => await response.json()) - .then(async(json: IGetFeedbackResponse) => { - setMessages(json.messages); - }); - }, [state, configurationUrl, setMessages]); -} diff --git a/src/Components/Viewer/Viewer.tsx b/src/Components/Viewer/Viewer.tsx deleted file mode 100644 index 0ad913d..0000000 --- a/src/Components/Viewer/Viewer.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import * as React from 'react'; -import { useState } from 'react'; -import { type IContainerModel } from '../../Interfaces/IContainerModel'; -import { type IHistoryState } from '../../Interfaces/IHistoryState'; -import { USE_EXPERIMENTAL_CANVAS_API } from '../../utils/default'; -import { FindContainerById } from '../../utils/itertools'; -import { BAR_WIDTH } from '../Bar/Bar'; -import { Canvas } from '../Canvas/Canvas'; -import { SelectorMode, SVG } from '../SVG/SVG'; -import { type ISymbolModel } from '../../Interfaces/ISymbolModel'; - -interface IViewerProps { - className: string - current: IHistoryState - selectedContainer: IContainerModel | undefined - selectedSymbol: ISymbolModel | undefined - margin: number - isComponentsOpen: boolean - isSymbolsOpen: boolean - selectContainer: (containerId: string) => void -} - -export interface DrawParams { - mainContainer: IContainerModel - selectorMode: SelectorMode - selectedContainer: IContainerModel | undefined - selectedSymbol: ISymbolModel | undefined - containers: Map - symbols: Map -} - -function computeWidth(margin: number): number { - return window.innerWidth - (window.innerWidth < 768 - ? BAR_WIDTH - : margin); -} - -export function Viewer({ - className, - current, - selectedContainer, - selectedSymbol, - margin, - isComponentsOpen, - isSymbolsOpen, - selectContainer -}: IViewerProps): JSX.Element { - const [windowSize, setWindowSize] = useState([ - computeWidth(margin), - window.innerHeight - ]); - - React.useEffect(() => { - function SVGAutoResizer(): void { - setWindowSize([ - computeWidth(margin), - window.innerHeight - ]); - } - - window.addEventListener('resize', SVGAutoResizer); - - return () => { - window.removeEventListener('resize', SVGAutoResizer); - }; - }); - - React.useEffect(() => { - setWindowSize([ - computeWidth(margin), - window.innerHeight - ]); - }, [margin]); - - const mainContainer = FindContainerById(current.containers, current.mainContainer); - - if (mainContainer === undefined) { - return <>; - } - - let selectorMode = SelectorMode.Nothing; - if (isComponentsOpen) { - selectorMode = SelectorMode.Containers; - } else if (isSymbolsOpen) { - selectorMode = SelectorMode.Symbols; - } - - const drawParams: DrawParams = { - mainContainer, - selectorMode, - selectedContainer, - selectedSymbol, - containers: current.containers, - symbols: current.symbols - }; - - if (USE_EXPERIMENTAL_CANVAS_API) { - return ( - - ); - } - - return ( - - ); -} diff --git a/src/Enums/AddMethod.ts b/src/Enums/AddMethod.ts deleted file mode 100644 index ce67ed0..0000000 --- a/src/Enums/AddMethod.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Add method when creating a container - * - Append will append to the last children in list - * - Insert will always place it at the begining - * - Replace will remove the selected container and insert a new one - * (default: Append) - */ -export enum AddMethod { - Append, - Insert, - Replace, - ReplaceParent -} diff --git a/src/Enums/AddingBehavior.ts b/src/Enums/AddingBehavior.ts new file mode 100644 index 0000000..fb6ae67 --- /dev/null +++ b/src/Enums/AddingBehavior.ts @@ -0,0 +1,4 @@ +export enum AddingBehavior { + InsertInto, + Replace +} diff --git a/src/Enums/AppState.ts b/src/Enums/AppState.ts deleted file mode 100644 index 7cf01d6..0000000 --- a/src/Enums/AppState.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum AppState { - MainMenu, - Loading, - Loaded -} diff --git a/src/Enums/MessageType.ts b/src/Enums/MessageType.ts deleted file mode 100644 index b84bc13..0000000 --- a/src/Enums/MessageType.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum MessageType { - Normal, - Success, - Warning, - Error -} diff --git a/src/Enums/Orientation.ts b/src/Enums/Orientation.ts deleted file mode 100644 index 3a04a71..0000000 --- a/src/Enums/Orientation.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum Orientation { - Horizontal, - Vertical -} diff --git a/src/Enums/Position.ts b/src/Enums/Position.ts deleted file mode 100644 index e008c50..0000000 --- a/src/Enums/Position.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum Position { - Left, - Down, - Up, - Right -} diff --git a/src/Enums/PositionReference.ts b/src/Enums/PositionReference.ts deleted file mode 100644 index 925b63c..0000000 --- a/src/Enums/PositionReference.ts +++ /dev/null @@ -1,11 +0,0 @@ -export enum PositionReference { - TopLeft, - TopCenter, - TopRight, - CenterLeft, - CenterCenter, - CenterRight, - BottomLeft, - BottomCenter, - BottomRight -} diff --git a/src/Enums/PropertyType.ts b/src/Enums/PropertyType.ts deleted file mode 100644 index f57d2b9..0000000 --- a/src/Enums/PropertyType.ts +++ /dev/null @@ -1,32 +0,0 @@ - -/** - * Describe the type of the property. - * Used for the assignation in the OnPropertyChange function - * See ContainerOperations.ts's OnPropertyChange - */ -export enum PropertyType { - /** - * Simple property: is not inside any object: id, x, width... (default) - */ - Simple, - - /** - * Style property: is inside the style object: stroke, fillOpacity... - */ - Style, - - /** - * Margin property: is inside the margin property: left, bottom, top, right... - */ - Margin, - - /** - * Dimension options - */ - SelfDimension, - SelfMarginDimension, - ChildrenDimensions, - DimensionWithMarks, - - DimensionOptions -} diff --git a/src/Enums/XPositionReference.ts b/src/Enums/XPositionReference.ts new file mode 100644 index 0000000..8571167 --- /dev/null +++ b/src/Enums/XPositionReference.ts @@ -0,0 +1,5 @@ +export enum XPositionReference { + Left, + Center, + Right +} diff --git a/src/Events/AppEvents.ts b/src/Events/AppEvents.ts deleted file mode 100644 index 10d2468..0000000 --- a/src/Events/AppEvents.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { useEffect } from 'react'; -import { AppState } from '../Enums/AppState'; -import { type IConfiguration } from '../Interfaces/IConfiguration'; -import { type IEditorState } from '../Interfaces/IEditorState'; -import { type IHistoryState } from '../Interfaces/IHistoryState'; -import { type ILanguage } from '../Interfaces/ILanguage'; -import { languageOptions, translations } from '../Translations/Translations'; -import { GetDefaultEditorState as GetDefaultEditorStateAction } from '../utils/default'; -import { Revive, ReviveHistory as ReviveHistoryAction } from '../utils/saveload'; - -interface IAppEventParams { - languageContext: ILanguage - setEditor: (newState: IEditorState) => void - setAppState: (appState: AppState) => void - eventInitDict?: CustomEventInit -} - -export interface WrappedCustomEvent { - event: CustomEvent - runAfterRender: boolean -} - -export interface IAppEvent { - name: string - func: (params: IAppEventParams) => WrappedCustomEvent -} - -export const events: IAppEvent[] = [ - { name: 'setEditor', func: SetEditor }, - { name: 'setAppState', func: SetAppState }, - { name: 'reviveEditorState', func: ReviveEditorState }, - { name: 'reviveHistory', func: ReviveHistory }, - { name: 'getDefaultEditorState', func: GetDefaultEditorState }, - { name: 'addLanguage', func: AddLanguage }, - { name: 'setLanguage', func: SetLanguage }, - { name: 'getLanguages', func: GetLanguages } -]; - -export function UseCustomEvents( - callbackQueue: React.RefObject, - root: Element | Document, - appRef: React.RefObject, - languageContext: ILanguage, - setEditor: (newState: IEditorState) => void, - setAppState: (appState: AppState) => void -): void { - useEffect(() => { - const current = appRef.current; - - if (current === null) { - return; - } - - const funcs = new Map void>(); - for (const event of events) { - function Func(eventInitDict?: CustomEventInit): void { - console.debug(`RUN INITIAL FUNCTION: ${event.name}`); - const customEvent = event.func({ - languageContext, - setEditor, - setAppState, - eventInitDict - }); - - if (customEvent.runAfterRender) { - console.debug(`ADDING CALLBACK TO QUEUE: ${customEvent.event.type}`); - callbackQueue.current?.push(customEvent.event); - } else { - console.debug(`EXECUTING CALLBACK IMMEDIATELY: ${customEvent.event.type}`); - root.dispatchEvent(customEvent.event); - } - } - current.addEventListener(event.name, Func); - funcs.set(event.name, Func); - } - return () => { - for (const event of events) { - const func = funcs.get(event.name); - if (func === undefined) { - continue; - } - current.removeEventListener(event.name, func); - } - }; - }); - - useEffect(() => { - if (callbackQueue.current === null) { - return; - } - - if (callbackQueue.current.length > 0) { - const callback = callbackQueue.current.shift(); - - if (callback === undefined) { - return; - } - - console.debug(`RUNNING CALLBACK FROM QUEUE: ${callback.type}`); - root.dispatchEvent(callback); - } - }); -} - -function SetEditor({ - setEditor, - setAppState, - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const editor: IEditorState = eventInitDict?.detail; - setEditor(editor); - setAppState(AppState.Loading); - const event = new CustomEvent('setEditor', { detail: editor }); - return { - event, - runAfterRender: true - }; -} - -function SetAppState({ - setAppState, - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const appState: AppState = eventInitDict?.detail; - setAppState(appState); - return { - event: new CustomEvent('setAppState'), - runAfterRender: true - }; -} - -function ReviveEditorState({ - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const anEditorState: IEditorState = eventInitDict?.detail; - Revive(anEditorState); - const event = new CustomEvent('reviveEditorState', { detail: anEditorState }); - return { - event, - runAfterRender: false - }; -} - -function ReviveHistory({ - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const history: IHistoryState[] = eventInitDict?.detail; - ReviveHistoryAction(history); - const event = new CustomEvent('reviveHistory', { detail: history }); - return { - event, - runAfterRender: false - }; -} - -function GetDefaultEditorState({ - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const configuration: IConfiguration = eventInitDict?.detail; - const editorState = GetDefaultEditorStateAction(configuration); - const event = new CustomEvent('getDefaultEditorState', { detail: editorState }); - return { - event, - runAfterRender: false - }; -} - -function AddLanguage({ - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const language: ILanguage = eventInitDict?.detail.language; - const option: string = eventInitDict?.detail.option; - languageOptions[language.language] = option; - translations[language.language] = language.dictionary; - const event = new CustomEvent('addLanguage'); - - return { - event, - runAfterRender: true - }; -} - -function SetLanguage({ - languageContext, - eventInitDict -}: IAppEventParams): WrappedCustomEvent { - const language: string = eventInitDict?.detail; - let success = false; - if (languageContext.languageChange !== undefined) { - languageContext.languageChange(language); - success = true; - } - const event = new CustomEvent('setLanguage', { detail: success }); - - return { - event, - runAfterRender: true - }; -} - -function GetLanguages(): WrappedCustomEvent { - const customEvent = new CustomEvent>>('getLanguages', { detail: translations }); - return { - event: customEvent, - runAfterRender: false - }; -} diff --git a/src/Events/EditorEvents.ts b/src/Events/EditorEvents.ts deleted file mode 100644 index 6336f8f..0000000 --- a/src/Events/EditorEvents.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { useEffect } from 'react'; -import { - AddContainer as AddContainerAction -} from '../Components/Editor/Actions/AddContainer'; -import { - DeleteContainer as DeleteContainerAction -} from '../Components/Editor/Actions/ContainerOperations'; -import { - AddSymbol as AddSymbolAction, - DeleteSymbol as DeleteSymbolAction -} from '../Components/Editor/Actions/SymbolOperations'; -import { GetCurrentHistory } from '../Components/Editor/Editor'; -import { type IEditorState } from '../Interfaces/IEditorState'; -import { type IHistoryState } from '../Interfaces/IHistoryState'; -import { FindContainerById } from '../utils/itertools'; -import { GetCircularReplacer } from '../utils/saveload'; -import { type WrappedCustomEvent } from './AppEvents'; - -interface IEditorEventParams { - editorState: IEditorState - setNewHistory: (newHistory: IHistoryState[], historyCurrentStep?: number) => void - eventInitDict?: CustomEventInit -} -export interface IEditorEvent { - name: string - func: (params: IEditorEventParams) => WrappedCustomEvent -} - -export const events: IEditorEvent[] = [ - { name: 'getEditorState', func: GetEditorState }, - { name: 'getEditorStateAsString', func: GetEditorStateAsString }, - { name: 'setHistory', func: SetHistory }, - { name: 'getCurrentHistoryState', func: GetCurrentHistoryState }, - { name: 'appendNewState', func: AppendNewState }, - { name: 'addContainer', func: AddContainer }, - { name: 'appendContainer', func: AppendContainer }, - { name: 'deleteContainer', func: DeleteContainer }, - { name: 'addSymbol', func: AddSymbol }, - { name: 'deleteSymbol', func: DeleteSymbol } -]; - -export function UseCustomEvents( - callbackQueue: React.RefObject, - root: Element | Document, - editorState: IEditorState, - editorRef: React.RefObject, - setNewHistory: (newHistory: IHistoryState[], historyCurrentStep?: number) => void -): void { - useEffect(() => { - const current = editorRef.current; - - if (current === null) { - return; - } - - const funcs = new Map void>(); - - for (const event of events) { - function Func(eventInitDict?: CustomEventInit): void { - const customEvent = event.func({ - editorState, - setNewHistory, - eventInitDict - }); - - if (customEvent.runAfterRender) { - callbackQueue.current?.push(customEvent.event); - } else { - root.dispatchEvent(customEvent.event); - } - } - current?.addEventListener(event.name, Func); - funcs.set(event.name, Func); - } - return () => { - for (const event of events) { - const func = funcs.get(event.name); - if (func === undefined) { - continue; - } - current?.removeEventListener(event.name, func); - } - }; - }); - - useEffect(() => { - if (callbackQueue.current === null) { - return; - } - - while (callbackQueue.current.length > 0) { - const callback = callbackQueue.current.shift(); - - if (callback === undefined) { - continue; - } - - root.dispatchEvent(callback); - } - }); -} - -export function UseEditorListener( - root: Element | Document, - editorState: IEditorState -): void { - useEffect(() => { - const event = new CustomEvent('editorListener', { detail: editorState }); - root.dispatchEvent(event); - }); -} - -function GetEditorState({ - editorState -}: IEditorEventParams): WrappedCustomEvent { - const event = new CustomEvent('getEditorState', { detail: structuredClone(editorState) }); - return { - event, - runAfterRender: false - }; -} - -function GetEditorStateAsString({ - editorState -}: IEditorEventParams): WrappedCustomEvent { - const spaces = import.meta.env.DEV - ? 4 - : 0; - const data = JSON.stringify(editorState, GetCircularReplacer(), spaces); - const event = new CustomEvent('getEditorStateAsString', { detail: data }); - return { - event, - runAfterRender: false - }; -} - -function SetHistory({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const history: IHistoryState[] = eventInitDict?.detail.history; - const historyCurrentStep: number | undefined = eventInitDict?.detail.historyCurrentStep; - setNewHistory(history, historyCurrentStep); - const event = new CustomEvent('setHistory', { detail: editorState }); - return { - event, - runAfterRender: true - }; -} - -function GetCurrentHistoryState({ - editorState -}: IEditorEventParams): WrappedCustomEvent { - const event = new CustomEvent( - 'getCurrentHistoryState', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} - -function AppendNewState({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const state: IHistoryState = eventInitDict?.detail.state; - const history = GetCurrentHistory(editorState.history, editorState.historyCurrentStep); - - history.push(state); - setNewHistory(history); - - const event = new CustomEvent( - 'appendNewState', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} - -function AddContainer({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const { - index, - type, - parentId - } = eventInitDict?.detail; - - const newHistory = AddContainerAction( - index, - type, - parentId, - editorState - ); - setNewHistory(newHistory); - - const event = new CustomEvent( - 'addContainer', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} - -function AppendContainer({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const { - type, - parentId - } = eventInitDict?.detail; - - const history = GetCurrentHistory(editorState.history, editorState.historyCurrentStep); - const currentState = history[editorState.historyCurrentStep]; - - const parent = FindContainerById(currentState.containers, parentId); - - const newHistory = AddContainerAction( - parent?.children.length ?? 0, - type, - parentId, - editorState - ); - setNewHistory(newHistory); - - const event = new CustomEvent( - 'appendContainerToSelectedContainer', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} - -function DeleteContainer({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const { - containerId - } = eventInitDict?.detail; - const newHistory = DeleteContainerAction( - containerId, - editorState - ); - setNewHistory(newHistory); - - const event = new CustomEvent( - 'deleteContainer', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} - -function AddSymbol({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const { - name - } = eventInitDict?.detail; - - const newHistory = AddSymbolAction( - name, - editorState - ); - setNewHistory(newHistory); - - const event = new CustomEvent( - 'AddSymbol', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} - -function DeleteSymbol({ - editorState, - setNewHistory, - eventInitDict -}: IEditorEventParams): WrappedCustomEvent { - const { - symbolId - } = eventInitDict?.detail; - - const newHistory = DeleteSymbolAction( - symbolId, - editorState - ); - setNewHistory(newHistory); - - const event = new CustomEvent( - 'DeleteSymbol', - { detail: structuredClone(editorState.history[editorState.historyCurrentStep]) } - ); - return { - event, - runAfterRender: true - }; -} diff --git a/src/Interfaces/AvailableContainer.ts b/src/Interfaces/AvailableContainer.ts new file mode 100644 index 0000000..d7bb22f --- /dev/null +++ b/src/Interfaces/AvailableContainer.ts @@ -0,0 +1,9 @@ +import React from 'react'; + +/** Model of available container used in application configuration */ +export interface AvailableContainer { + Type: string + Width: number + Height: number + Style: React.CSSProperties +} diff --git a/src/Interfaces/AvailableSymbol.ts b/src/Interfaces/AvailableSymbol.ts new file mode 100644 index 0000000..e1d518d --- /dev/null +++ b/src/Interfaces/AvailableSymbol.ts @@ -0,0 +1,12 @@ +import { XPositionReference } from '../Enums/XPositionReference'; +import { Image } from './Image'; + +/** + * Model of available symbol to configure the application */ +export interface AvailableSymbolModel { + Name: string + XPositionReference: XPositionReference + Image: Image + Width: number + Height: number +} diff --git a/src/Interfaces/Configuration.ts b/src/Interfaces/Configuration.ts new file mode 100644 index 0000000..f8d4854 --- /dev/null +++ b/src/Interfaces/Configuration.ts @@ -0,0 +1,9 @@ +import { AvailableContainer } from './AvailableContainer'; +import { AvailableSymbolModel } from './AvailableSymbol'; + +/** Model of configuration for the application to configure it */ +export interface Configuration { + AvailableContainers: AvailableContainer[] + AvailableSymbols: AvailableSymbolModel[] + MainContainer: AvailableContainer +} diff --git a/src/Interfaces/ContainerModel.ts b/src/Interfaces/ContainerModel.ts new file mode 100644 index 0000000..1c70ae3 --- /dev/null +++ b/src/Interfaces/ContainerModel.ts @@ -0,0 +1,26 @@ +import Properties from './Properties'; + +export interface IContainerModel { + children: IContainerModel[] + parent: IContainerModel | null + properties: Properties + userData: Record +} + +export class ContainerModel implements IContainerModel { + public children: IContainerModel[]; + public parent: IContainerModel | null; + public properties: Properties; + public userData: Record; + + constructor( + parent: IContainerModel | null, + properties: Properties, + children: IContainerModel[] = [], + userData = {}) { + this.parent = parent; + this.properties = properties; + this.children = children; + this.userData = userData; + } +}; diff --git a/src/Interfaces/HistoryState.ts b/src/Interfaces/HistoryState.ts new file mode 100644 index 0000000..aa51638 --- /dev/null +++ b/src/Interfaces/HistoryState.ts @@ -0,0 +1,8 @@ +import { IContainerModel } from './ContainerModel'; + +export interface HistoryState { + MainContainer: IContainerModel + SelectedContainer: IContainerModel | null + SelectedContainerId: string + TypeCounters: Record +} diff --git a/src/Interfaces/IAPIConfiguration.ts b/src/Interfaces/IAPIConfiguration.ts deleted file mode 100644 index 1a553fc..0000000 --- a/src/Interfaces/IAPIConfiguration.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IAPIConfiguration { - apiFetchUrl?: string - apiSetContainerListUrl?: string - apiGetFeedbackUrl?: string -} diff --git a/src/Interfaces/IAction.ts b/src/Interfaces/IAction.ts deleted file mode 100644 index fc58a2b..0000000 --- a/src/Interfaces/IAction.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type AddMethod } from '../Enums/AddMethod'; -import { type IImage } from './IImage'; - -export interface IAction { - Id: string - CustomLogo: IImage - Label: string - Description: string - Action: string - AddingBehavior: AddMethod -} diff --git a/src/Interfaces/IAvailableContainer.ts b/src/Interfaces/IAvailableContainer.ts deleted file mode 100644 index b8b52d3..0000000 --- a/src/Interfaces/IAvailableContainer.ts +++ /dev/null @@ -1,152 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type AddMethod } from '../Enums/AddMethod'; -import { type PositionReference } from '../Enums/PositionReference'; -import { type Orientation } from '../Enums/Orientation'; -import { type IAction } from './IAction'; -import { type IMargin } from './IMargin'; -import { type IKeyValue } from './IKeyValue'; -import { type IStyle } from './IStyle'; -import { type IDimensions } from './IDimensions'; - -/** Model of available container used in application configuration */ -export interface IAvailableContainer { - /** type */ - Type: string - - /** displayed text */ - DisplayedText?: string - - /** category */ - Category?: string - - /** orientation */ - Orientation?: Orientation - - /** horizontal offset */ - X?: number - - /** vertical offset */ - Y?: number - - /** width */ - Width?: number - - /** height */ - Height?: number - - /** - * Minimum width (min=1) - */ - MinWidth?: number - - /** - * Maximum width - */ - MaxWidth?: number - - /** - * Minimum height (min=1) - */ - MinHeight?: number - - /** - * Maximum height - */ - MaxHeight?: number - - /** margin */ - Margin?: IMargin - - /** true if anchor, false otherwise */ - IsAnchor?: boolean - - /** true if flex, false otherwise */ - IsFlex?: boolean - - /** Method used on container add */ - AddMethod?: AddMethod - - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - PositionReference?: PositionReference - - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - CustomSVG?: string - - /** - * (optional) - * Disabled when Pattern is used. - * - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - DefaultChildType?: string - - /** - * Allow to use a Pattern to create the list of children - * Cannot be used with DefaultChildType, - * DefaultChildType will be disabled for this container and the children - */ - Pattern?: string - - /** Hide the children in the treeview */ - HideChildrenInTreeview?: boolean - - /** Dimensions options */ - DimensionOptions?: IDimensions - - /** - * if true, hide the entry in the sidebar (default: false) - */ - IsHidden?: boolean - - /** - * Disable a list of available container to be added inside - */ - Blacklist?: string[] - - /** - * Cannot be used with blacklist. Whitelist will be prioritized. - * To disable the whitelist, Whitelist must be undefined. - * Only allow a set of available container to be added inside - */ - Whitelist?: string[] - - /** - * (optional) - * Style of the - */ - Style?: IStyle - - /** - * List of possible actions shown on right-click - */ - Actions?: IAction[] - - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - UserData?: IKeyValue[] -} diff --git a/src/Interfaces/IAvailableSymbol.ts b/src/Interfaces/IAvailableSymbol.ts deleted file mode 100644 index fe085a6..0000000 --- a/src/Interfaces/IAvailableSymbol.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type PositionReference } from '../Enums/PositionReference'; -import { type IAvailableContainer } from './IAvailableContainer'; -import { type IImage } from './IImage'; - -/** - * Model of available symbol to configure the application */ -export interface IAvailableSymbol { - Name: string - - Image: IImage - - /** displayed text */ - DisplayedText?: string - - isVertical?: boolean - - offset?: number - - Width?: number - - Height?: number - - PositionReference?: PositionReference - - /** An existing or new available container */ - AssociatedContainer?: IAvailableContainer -} diff --git a/src/Interfaces/ICategory.ts b/src/Interfaces/ICategory.ts deleted file mode 100644 index a4eac2b..0000000 --- a/src/Interfaces/ICategory.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -export interface ICategory { - Type: string - DisplayedText?: string -} diff --git a/src/Interfaces/IConfiguration.ts b/src/Interfaces/IConfiguration.ts deleted file mode 100644 index 812f5ab..0000000 --- a/src/Interfaces/IConfiguration.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type IAPIConfiguration } from './IAPIConfiguration'; -import { type IAvailableContainer } from './IAvailableContainer'; -import { type IAvailableSymbol } from './IAvailableSymbol'; -import { type ICategory } from './ICategory'; -import { type IPattern } from './IPattern'; - -/** Model of configuration for the application to configure it */ -export interface IConfiguration { - AvailableContainers: IAvailableContainer[] // TODO: Use a Map - AvailableSymbols: IAvailableSymbol[] // TODO: Use a Map - Categories: ICategory[] - Patterns: IPattern[] - MainContainer: IAvailableContainer - APIConfiguration?: IAPIConfiguration -} diff --git a/src/Interfaces/IContainerModel.ts b/src/Interfaces/IContainerModel.ts deleted file mode 100644 index da6592e..0000000 --- a/src/Interfaces/IContainerModel.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { type IContainerProperties } from './IContainerProperties'; - -export interface IContainerModel { - children: string[] - properties: IContainerProperties - userData: Record -} - -/** - * Macro for creating the interface - * Do not add methods since they will be lost during serialization - */ -export class ContainerModel implements IContainerModel { - public children: string[]; - public properties: IContainerProperties; - public userData: Record; - - constructor( - properties: IContainerProperties, - children: string[] = [], - userData = {} - ) { - this.properties = properties; - this.children = children; - this.userData = userData; - } -}; diff --git a/src/Interfaces/IContainerProperties.ts b/src/Interfaces/IContainerProperties.ts deleted file mode 100644 index fd43417..0000000 --- a/src/Interfaces/IContainerProperties.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { type PositionReference } from '../Enums/PositionReference'; -import { type Orientation } from '../Enums/Orientation'; -import { type IMargin } from './IMargin'; -import { type IKeyValue } from './IKeyValue'; -import { type IStyle } from './IStyle'; -import { type IDimensions } from './IDimensions'; - -/** - * Properties of a container - */ -export interface IContainerProperties { - /** id of the container */ - id: string - - /** type matching the configuration on construction */ - type: string - - /** id of the parent container (null when there is no parent) */ - parentId: string - - /** id of the linked symbol ('' when there is no parent) */ - linkedSymbolId: string - - /** Text displayed in the container */ - displayedText: string - - /** orientation */ - orientation: Orientation - - // TODO: Refactor x, y in IPoint interface - /** horizontal offset */ - x: number - - /** vertical offset */ - y: number - - /** margin */ - margin: IMargin - - // TODO: Refactor width, height, minWidth... in ISize interface - /** width */ - width: number - - /** height */ - height: number - - /** - * Minimum width (min=1) - */ - minWidth: number - - /** - * Maximum width - */ - maxWidth: number - - /** - * Minimum height (min=1) - */ - minHeight: number - - /** - * Maximum height - */ - maxHeight: number - - // TODO: Refactor isAnchor, isFlex in IBehaviors interface - /** true if anchor, false otherwise */ - isAnchor: boolean - - /** true if flex, false otherwise */ - isFlex: boolean - - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - positionReference: PositionReference - - // TODO: Refactor hideChildrenInTreeview in IUserInterface interface - /** Hide the children in the treeview */ - hideChildrenInTreeview: boolean - - /** Dimensions options */ - dimensionOptions: IDimensions - - /** - * Warnings of a container - */ - warning: string - - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - customSVG?: string - - /** - * (optional) - * Style of the - */ - style?: IStyle - - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - userData?: IKeyValue[] -} diff --git a/src/Interfaces/IDimensionOptions.ts b/src/Interfaces/IDimensionOptions.ts deleted file mode 100644 index a12865a..0000000 --- a/src/Interfaces/IDimensionOptions.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { type Position } from '../Enums/Position'; - -export interface IDimensionOptions { - - positions: Position[] - - /** - * Stroke color - */ - color?: string - - /** stroke-width */ - width?: number - - /** stroke-dasharray */ - dashArray?: string -} diff --git a/src/Interfaces/IDimensionStyle.ts b/src/Interfaces/IDimensionStyle.ts deleted file mode 100644 index 59853df..0000000 --- a/src/Interfaces/IDimensionStyle.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { IDimensionOptions } from "./IDimensionOptions"; - -export type IDimensionStyle = Omit; diff --git a/src/Interfaces/IDimensions.ts b/src/Interfaces/IDimensions.ts deleted file mode 100644 index 0e833fa..0000000 --- a/src/Interfaces/IDimensions.ts +++ /dev/null @@ -1,28 +0,0 @@ - -import { type Orientation } from '../Enums/Orientation'; -import { type IDimensionOptions } from './IDimensionOptions'; - -export interface IDimensions { - - /** if true, show the dimension of the container */ - selfDimensions: IDimensionOptions - - /** if true, show the dimension of the container */ - selfMarginsDimensions: IDimensionOptions - - /** if true show the overall dimensions of its children */ - childrenDimensions: IDimensionOptions - - /** - * if true, allows a parent dimension borrower to borrow its x coordinate - * as a reference point for a dimension - */ - markPosition: Orientation[] - - /** - * if true, show a dimension from the edge of the container to end - * and insert dimensions marks at lift up children (see liftDimensionToBorrower) - */ - dimensionWithMarks: IDimensionOptions - -} diff --git a/src/Interfaces/IEditorState.ts b/src/Interfaces/IEditorState.ts deleted file mode 100644 index 870d9a4..0000000 --- a/src/Interfaces/IEditorState.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type IConfiguration } from './IConfiguration'; -import { type IHistoryState } from './IHistoryState'; - -export interface IEditorState { - history: IHistoryState[] - historyCurrentStep: number - configuration: IConfiguration - version: string -} diff --git a/src/Interfaces/IGetFeedbackRequest.ts b/src/Interfaces/IGetFeedbackRequest.ts deleted file mode 100644 index 60919e2..0000000 --- a/src/Interfaces/IGetFeedbackRequest.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type IHistoryState } from './IHistoryState'; - -export interface IGetFeedbackRequest { - /** Current application state */ - ApplicationState: IHistoryState -} diff --git a/src/Interfaces/IGetFeedbackResponse.ts b/src/Interfaces/IGetFeedbackResponse.ts deleted file mode 100644 index a8bdb88..0000000 --- a/src/Interfaces/IGetFeedbackResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { type IMessage } from './IMessage'; - -export interface IGetFeedbackResponse { - messages: IMessage[] -} diff --git a/src/Interfaces/IHistoryState.ts b/src/Interfaces/IHistoryState.ts deleted file mode 100644 index ae7628d..0000000 --- a/src/Interfaces/IHistoryState.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { type IContainerModel } from './IContainerModel'; -import { type ISymbolModel } from './ISymbolModel'; - -export interface IHistoryState { - /** Last editor action */ - lastAction: string - - /** Reference to the main container */ - mainContainer: string - - // TODO: Add hashmap to optimize FincContainerById from worst O(n) to O(1) - // TODO: this hashmap will not be serialized, modify it in the replacer and reviver in saveload.ts + worker.js - // TODO: Update addContainers and deleteContainer to update the hashmap - containers: Map - - /** Counter of type of container. Used for ids. */ - typeCounters: Record - - /** List of symbols */ - symbols: Map -} diff --git a/src/Interfaces/IImage.ts b/src/Interfaces/IImage.ts deleted file mode 100644 index 7a9e5c4..0000000 --- a/src/Interfaces/IImage.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -/** - * Model of an image with multiple source - * It must at least have one source. - * - * If Url/Base64Image and Svg are set, - * Url/Base64Image will be shown in the menu while SVG will be drawn - */ -export interface IImage { - /** Name of the image */ - Name: string - - /** (optional) Url of the image */ - Url?: string - - /** (optional) base64 data of the image */ - Base64Image?: string - - /** (optional) SVG string */ - Svg?: string -} diff --git a/src/Interfaces/IInputGroup.ts b/src/Interfaces/IInputGroup.ts deleted file mode 100644 index 905ce8a..0000000 --- a/src/Interfaces/IInputGroup.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type React from 'react'; - -export interface IInputGroup { - key: string - text: React.ReactNode - value: string -} diff --git a/src/Interfaces/IKeyValue.ts b/src/Interfaces/IKeyValue.ts deleted file mode 100644 index 06a7b0c..0000000 --- a/src/Interfaces/IKeyValue.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -export interface IKeyValue { - Key: string - Value: string -} diff --git a/src/Interfaces/ILanguage.ts b/src/Interfaces/ILanguage.ts deleted file mode 100644 index cefc747..0000000 --- a/src/Interfaces/ILanguage.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ILanguage { - language: string - dictionary: Record - languageChange?: (selected: string) => void -} diff --git a/src/Interfaces/IMargin.ts b/src/Interfaces/IMargin.ts deleted file mode 100644 index 55c6d7a..0000000 --- a/src/Interfaces/IMargin.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface IMargin { - left?: number - bottom?: number - top?: number - right?: number -} diff --git a/src/Interfaces/IMessage.ts b/src/Interfaces/IMessage.ts deleted file mode 100644 index 7cbb8cb..0000000 --- a/src/Interfaces/IMessage.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type MessageType } from '../Enums/MessageType'; - -export interface IMessage { - text: string - type: MessageType -} diff --git a/src/Interfaces/IPattern.ts b/src/Interfaces/IPattern.ts deleted file mode 100644 index 5a1f424..0000000 --- a/src/Interfaces/IPattern.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { type IAvailableContainer } from './IAvailableContainer'; - -export interface IPattern { - /** - * Unique id for the pattern - */ - id: string - - /** - * Text to display in the sidebar - */ - text: string - - /** - * IAvailableContainer id used to wrap the children. - */ - wrapper: string - - /** - * List of ids of Pattern or IAvailableContainer - * If a IAvailableContainer and a Pattern have the same id, - * IAvailableContainer will be prioritized - */ - children: string[] -} - -export type ContainerOrPattern = IAvailableContainer | IPattern; - -export function GetPattern( - id: string, - configs: Map, - patterns: Map -): ContainerOrPattern | undefined { - let containerOrPattern: ContainerOrPattern | undefined = configs.get(id); - containerOrPattern = containerOrPattern ?? patterns.get(id); - return containerOrPattern; -} - -export function IsPattern( - id: string, - configs: Map, - patterns: Map -): boolean { - let containerOrPattern: ContainerOrPattern | undefined = configs.get(id); - - if (containerOrPattern !== undefined) { - return false; - } - - containerOrPattern = patterns.get(id); - - if (containerOrPattern === undefined) { - return false; - } - - return true; -} diff --git a/src/Interfaces/IReplaceContainer.ts b/src/Interfaces/IReplaceContainer.ts deleted file mode 100644 index c1c8a71..0000000 --- a/src/Interfaces/IReplaceContainer.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IReplaceContainer { - id: string | undefined - isReplacing: boolean - category: string | undefined -} diff --git a/src/Interfaces/ISetContainerListRequest.ts b/src/Interfaces/ISetContainerListRequest.ts deleted file mode 100644 index a26ce7d..0000000 --- a/src/Interfaces/ISetContainerListRequest.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { type IAction } from './IAction'; -import { type IContainerModel } from './IContainerModel'; -import { type IHistoryState } from './IHistoryState'; - -/* eslint-disable @typescript-eslint/naming-convention */ -export interface ISetContainerListRequest { - /** Name of the action declared in the API */ - Action: IAction - - /** Selected container */ - Container: IContainerModel - - /** The previous sibling container */ - PreviousContainer: IContainerModel | undefined - - /** The next sibling container */ - NextContainer: IContainerModel | undefined - - /** Current application state */ - ApplicationState: IHistoryState -} diff --git a/src/Interfaces/ISetContainerListResponse.ts b/src/Interfaces/ISetContainerListResponse.ts deleted file mode 100644 index b9f1d0a..0000000 --- a/src/Interfaces/ISetContainerListResponse.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type AddMethod } from '../Enums/AddMethod'; -import { type IAvailableContainer } from './IAvailableContainer'; - -export interface ISetContainerListResponse { - Containers: IAvailableContainer[] - AddingBehavior?: AddMethod -} diff --git a/src/Interfaces/ISizePointer.ts b/src/Interfaces/ISizePointer.ts deleted file mode 100644 index 05f880c..0000000 --- a/src/Interfaces/ISizePointer.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * A SizePointer is a pointer in a 1 dimensional array of width/space - * x being the address where the pointer is pointing - * width being the overall (un)allocated space affected to the address - */ -export interface ISizePointer { - x: number - width: number -} diff --git a/src/Interfaces/IStyle.ts b/src/Interfaces/IStyle.ts deleted file mode 100644 index 7b6cda9..0000000 --- a/src/Interfaces/IStyle.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface IStyle { - stroke?: string - - strokeOpacity?: number - - strokeWidth?: number - - fill?: string - - fillOpacity?: number -} diff --git a/src/Interfaces/ISymbolModel.ts b/src/Interfaces/ISymbolModel.ts deleted file mode 100644 index ff91b00..0000000 --- a/src/Interfaces/ISymbolModel.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { type IAvailableSymbol } from './IAvailableSymbol'; - -export interface ISymbolModel { - /** Identifier */ - id: string - - /** Displayed Text */ - displayedText: string - - /** Type */ - type: string - - /** Configuration of the symbol */ - config: IAvailableSymbol - - isVertical: boolean - - /** offset */ - offset: number - - /** Width */ - width: number - - /** Height */ - height: number - - /** List of linked container id */ - linkedContainers: Set - - /** Dimensions options */ - showDimension: boolean -} diff --git a/src/Interfaces/Image.ts b/src/Interfaces/Image.ts new file mode 100644 index 0000000..b839b09 --- /dev/null +++ b/src/Interfaces/Image.ts @@ -0,0 +1,7 @@ +/** Model of an image with multiple source */ +export interface Image { + Name: string + Url: string + Base64Image: string + Svg: string +} diff --git a/src/Interfaces/IPoint.ts b/src/Interfaces/Point.ts similarity index 50% rename from src/Interfaces/IPoint.ts rename to src/Interfaces/Point.ts index d2e202a..43fd673 100644 --- a/src/Interfaces/IPoint.ts +++ b/src/Interfaces/Point.ts @@ -1,4 +1,4 @@ -export interface IPoint { +export interface Point { x: number y: number } diff --git a/src/Interfaces/Properties.ts b/src/Interfaces/Properties.ts new file mode 100644 index 0000000..ed185f2 --- /dev/null +++ b/src/Interfaces/Properties.ts @@ -0,0 +1,8 @@ +import * as React from 'react'; + +export default interface Properties extends React.CSSProperties { + id: string + parentId: string | null + x: number + y: number +} diff --git a/src/Translations/Translations.ts b/src/Translations/Translations.ts deleted file mode 100644 index b1d8a52..0000000 --- a/src/Translations/Translations.ts +++ /dev/null @@ -1,17 +0,0 @@ -import en from './translation.en.json'; -import fr from './translation.fr.json'; -import frKline from './translation.fr.kline.json'; - -export const translations: Record> = { - en, - fr, - frKline -}; - -// Use languageOptions to restrict existing dictionary -// and create a select input -export const languageOptions: Record = { - en: 'English', - fr: 'French', - frKline: 'K-Line' -}; diff --git a/src/Translations/translation.en.json b/src/Translations/translation.en.json deleted file mode 100644 index 0ac3c3c..0000000 --- a/src/Translations/translation.en.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "@StartFromScratch": "Start from scratch", - "@LoadConfigFile": "Load a configuration file", - "@GoBack": "Go back", - "@Properties" : "Properties", - - "@Components": "Components", - "@Elements": "Elements", - "@Symbols": "Symbols", - "@SymbolsLeft": "Symbols", - "@SymbolsRight": "Symbols", - "@NoSymbolSelected": "No symbol selected", - "@Timeline": "Timeline", - "@Messages": "Messages", - "@Settings": "Settings", - - "@Undo": "Undo", - "@UndoTitle": "Undo last action", - "@Redo": "Redo", - "@RedoTitle": "Redo last action", - "@DeleteContainer": "Delete", - "@DeleteContainerTitle": "Delete the container", - "@DeleteSymbol": "Delete", - "@DeleteSymbolTitle": "Delete the container", - "@ReplaceByContainer": "Replace by component", - - "@ExportAsJSON": "Export as JSON", - "@ExportAsSVG": "Export as SVG", - - "@HideDisabledComponents": "Hide disabled components", - "@ShowDisabledComponents": "Show disabled components", - - "@ClearAllMessages": "Clear all messages", - - "@ContainerDisplayedText": "Displayed text", - "@ContainerOrientation": "Orientation", - "@ContainerProperties": "Properties", - "@ContainerName": "Name", - "@ContainerParentName": "Parent name", - "@ContainerType": "Type", - "@ContainerPosition": "Position", - "@ContainerX": "x", - "@ContainerY": "y", - "@ContainerSize": "Size", - "@ContainerMinWidth": "Minimum Width", - "@ContainerWidth": "Width", - "@ContainerMaxWidth": "Maximum Width", - "@ContainerMinHeight": "Minimum Height", - "@ContainerHeight": "Height", - "@ContainerMaxHeight": "Maximum Height", - "@ContainerMargins": "Margins", - "@ContainerMarginLeft": "Margin Left", - "@ContainerMarginBottom": "Margin Bottom", - "@ContainerMarginTop": "Margin Top", - "@ContainerMarginRight": "Margin Right", - "@ContainerBehaviors": "Behaviors", - "@ContainerFlex": "Flex", - "@ContainerAnchor": "Lock position and size", - "@ContainerAlignment": "Alignment", - "@ContainerAlignmentInput": "Alignment", - "@ContainerAlignWithSymbol": "Align to symbol", - "@ContainerDimensions": "Dimensions", - "@ContainerShowDimension": "Show dimensions", - "@ContainerShowChildrenDimension": "Show surrounding dimensions of children", - "@ContainerMarkPosition": "Mark the position for the parents", - "@ContainerShowDimensionWithMarks": "Show dimensions with marked children", - "@ContainerShowMarginsDimension": "Show margins dimensions", - "@ContainerStyle": "Style", - "@StyleStrokeColor": "Stroke Color", - "@StyleStrokeDashArray": "Stroke Dash Array", - "@StyleStroke": "Stroke", - "@StyleStrokeOpacity": "Stroke Opacity", - "@StyleStrokeWidth": "Stroke Width", - "@StyleFill": "Fill", - "@StyleFillOpacity": "Fill Opacity", - - "@SymbolName": "Name", - "@SymbolDisplayedText": "Displayed text", - "@SymbolOffset" : "Offset", - "@IsVertical" : "Vertical", - "@ShowDimension" : "Dimension", - "@SymbolHeight": "Height", - "@SymbolWidth": "Width" -} diff --git a/src/Translations/translation.fr.json b/src/Translations/translation.fr.json deleted file mode 100644 index 60b9cfe..0000000 --- a/src/Translations/translation.fr.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "@StartFromScratch": "Partir de zéro", - "@LoadConfigFile": "Charger un fichier de configuration", - "@GoBack": "Revenir", - "@Properties" : "Propriétés", - - "@Components": "Composants", - "@Elements": "Éléments", - "@Symbols": "Symboles", - "@SymbolsLeft": "Symboles", - "@SymbolsRight": "Symboles", - "@NoSymbolSelected": "Pas de symbole sélectionné", - "@Timeline": "Chronologie", - "@Messages": "Messages", - "@Settings": "Paramètres", - - "@Undo": "Annuler", - "@UndoTitle": "Annuler la dernière action", - "@Redo": "Refaire", - "@RedoTitle": "Refaire la dernière action", - "@DeleteContainer": "Supprimer", - "@DeleteContainerTitle": "Supprimer le conteneur", - "@DeleteSymbol": "Supprimer", - "@DeleteSymbolTitle": "Supprimer le symbole", - "@ReplaceByContainer": "Replacer par un composant", - - "@ExportAsJSON": "Exporter en JSON", - "@ExportAsSVG": "Exporter en SVG", - - "@HideDisabledComponents": "Cacher les composants désactivés", - "@ShowDisabledComponents": "Montrer les composants activés", - - "@ClearAllMessages": "Effacer tous les messages", - - "@ContainerDisplayedText": "Texte affiché", - "@ContainerOrientation": "Orientation", - "@ContainerProperties": "Propriétés", - "@ContainerName": "Nom", - "@ContainerParentName": "Nom du parent", - "@ContainerType": "Type", - "@ContainerPosition": "Position", - "@ContainerX": "x", - "@ContainerY": "y", - "@ContainerSize": "Taille", - "@ContainerMinWidth": "Largeur minimale", - "@ContainerWidth": "Largeur", - "@ContainerMaxWidth": "Largeur maximale", - "@ContainerMinHeight": "Hauteur minimale", - "@ContainerHeight": "Hauteur", - "@ContainerMaxHeight": "Hauteur maximale", - "@ContainerMargins": "Marges", - "@ContainerMarginLeft": "Marge gauche", - "@ContainerMarginBottom": "Marge inférieure", - "@ContainerMarginTop": "Marge supérieure", - "@ContainerMarginRight": "Marge droite", - "@ContainerBehaviors": "Comportements", - "@ContainerFlex": "Flexible", - "@ContainerAnchor": "Verrouiller la position et la taille", - "@ContainerAlignment": "Alignement", - "@ContainerAlignmentInput": "Alignement", - "@ContainerAlignWithSymbol": "Aligner au symbole", - "@ContainerDimensions": "Cotations", - "@ContainerShowDimension": "Afficher les cotations", - "@ContainerShowChildrenDimension": "Afficher les cotations englobante des enfants", - "@ContainerMarkPosition": "Marquer la position pour les parents", - "@ContainerShowDimensionWithMarks": "Afficher les cotations avec les enfants marqués", - "@ContainerShowMarginsDimension": "Afficher les cotations des marges", - "@ContainerStyle": "Style", - "@StyleStrokeColor": "Couleur du tracé", - "@StyleStrokeDashArray": "Tableau de traits", - "@StyleStroke": "Tracé", - "@StyleStrokeOpacity": "Opacité du tracé", - "@StyleStrokeWidth": "Epaisseur du tracé", - "@StyleFill": "Remplissage", - "@StyleFillOpacity": "Opacité du remplissage", - - "@SymbolName": "Nom", - "@SymbolDisplayedText": "Texte affiché", - "@SymbolOffset" : "Décalage", - "@IsVertical" : "Vertical", - "@ShowDimension" : "Cotation", - "@SymbolHeight": "Hauteur", - "@SymbolWidth": "Largeur" -} diff --git a/src/Translations/translation.fr.kline.json b/src/Translations/translation.fr.kline.json deleted file mode 100644 index 09cface..0000000 --- a/src/Translations/translation.fr.kline.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "@StartFromScratch": "Partir de zéro", - "@LoadConfigFile": "Charger un fichier de configuration", - "@GoBack": "Revenir", - "@Properties": "Propriétés", - - "@Components": "Composants", - "@Elements": "Éléments", - "@Symbols": "Ancrages", - "@SymbolsLeft": "Ancrages", - "@SymbolsRight": "Ancrages", - "@NoSymbolSelected": "Pas d'ancre sélectionnée", - "@Timeline": "Chronologie", - "@Messages": "Messages", - "@Settings": "Paramètres", - - "@Undo": "Annuler", - "@UndoTitle": "Annuler la dernière action", - "@Redo": "Refaire", - "@RedoTitle": "Refaire la dernière action", - "@DeleteContainer": "Supprimer", - "@DeleteContainerTitle": "Supprimer le conteneur", - "@DeleteSymbol": "Supprimer", - "@DeleteSymbolTitle": "Supprimer l'ancre", - - "@ExportAsJSON": "Exporter en JSON", - "@ExportAsSVG": "Exporter en SVG", - - "@HideDisabledComponents": "Cacher les composants désactivés", - "@ShowDisabledComponents": "Montrer les composants activés", - - "@ClearAllMessages": "Effacer tous les messages", - - "@ContainerDisplayedText": "Texte affiché", - "@ContainerOrientation": "Orientation", - "@ContainerProperties": "Propriétés", - "@ContainerName": "Nom", - "@ContainerParentName": "Nom du parent", - "@ContainerType": "Type", - "@ContainerPosition": "Position", - "@ContainerX": "x", - "@ContainerY": "y", - "@ContainerSize": "Taille", - "@ContainerMinWidth": "Largeur minimale", - "@ContainerWidth": "Largeur", - "@ContainerMaxWidth": "Largeur maximale", - "@ContainerMinHeight": "Hauteur minimale", - "@ContainerHeight": "Hauteur", - "@ContainerMaxHeight": "Hauteur maximale", - "@ContainerMargins": "Jeux de pose", - "@ContainerMarginLeft": "Jeu gauche", - "@ContainerMarginBottom": "Jeu bas", - "@ContainerMarginTop": "Jeu haut", - "@ContainerMarginRight": "Jeu droite", - "@ContainerBehaviors": "Comportements", - "@ContainerFlex": "Toute largeur (hauteur)", - "@ContainerAnchor": "Verrouiller la position et la taille", - "@ContainerAlignment": "Alignement", - "@ContainerAlignmentInput": "Alignement", - "@ContainerAlignWithSymbol": "Ancrer sur", - "@ContainerDimensions": "Cotations", - "@ContainerShowDimension": "Afficher les cotations", - "@ContainerShowChildrenDimension": "Afficher les cotations englobante des enfants", - "@ContainerMarkPosition": "Marquer la position pour les parents", - "@ContainerShowDimensionWithMarks": "Afficher les cotations avec les enfants marqués", - "@ContainerShowMarginsDimension": "Afficher les cotations des jeux", - "@ContainerStyle": "Style", - "@StyleStrokeColor": "Couleur du tracé", - "@StyleStrokeDashArray": "Tableau de traits", - "@StyleStroke": "Tracé", - "@StyleStrokeOpacity": "Opacité du tracé", - "@StyleStrokeWidth": "Epaisseur du tracé", - "@StyleFill": "Remplissage", - "@StyleFillOpacity": "Opacité du remplissage", - - "@SymbolName": "Nom", - "@SymbolDisplayedText": "Texte affiché", - "@SymbolX": "x", - "@SymbolHeight": "Hauteur", - "@SymbolWidth": "Largeur" -} diff --git a/src/dts/generate_dts.py b/src/dts/generate_dts.py deleted file mode 100644 index 1c5e944..0000000 --- a/src/dts/generate_dts.py +++ /dev/null @@ -1,102 +0,0 @@ -''' -Generate a definition file with a global namespace -from a typescript module definition file -''' - -import os -import pathlib -import re -import argparse - -parser = parser = argparse.ArgumentParser(description='Generate a definition file with a global namespace from a typescript module definition file') -parser.add_argument('namespace', - help='Namespace used in the global script. (example: Three.js use THREE as its namespace)') -parser.add_argument('output_filename', - help='Output d.ts definition file. (example: three.d.ts)') - -args = parser.parse_args() - -output_filename = args.output_filename -namespace = args.namespace - - -import_pattern = re.compile( - r"import(?:[\"'\s]*([\w*{}\n\r\t, ]+)from\s*)?[\"'\s].*([@\w_-]+)[\"'\s].*;" - ) -export_pattern = re.compile( - r"export ([*] from [\"'\s].*[\"'\s]|{.*}(?: from [\"'\s].*[\"'\s])?);" - ) - -filter_directories = ["./dist/Enums", "./dist/Interfaces", "./dist\Enums", "./dist\Interfaces"] - -def main(): - ''' - Entry point function - ''' - with open(output_filename, 'w') as output_file: - output_file.write(('declare namespace {} {{\n'.format(namespace))) - for root, subdirs, files in os.walk('./'): - if root not in filter_directories: - print('SKIP ' + root) - continue - - print('--\nroot = ' + root) - - for subdir in subdirs: - print('\t- subdirectory ' + subdir) - - for filename in files: - if filename == 'output.d.ts': - continue - - if filename == 'my-directory-list.txt': - os.remove(os.path.join(root, filename)) - continue - - suffixes = pathlib.Path(filename).suffixes - if (suffixes != ['.d', '.ts']): - continue - - file_path = os.path.join(root, filename) - file_path = file_path.replace('\\', '/') - - print('\t- file %s (full path: %s)' % (filename, file_path)) - with open(file_path, 'r') as cur_file: - f_content = cur_file.read() - - # removes imports - # see https://gist.github.com/manekinekko/7e58a17bc62a9be47172 - f_content = import_pattern.sub('', f_content) - - # Replace 'export { my_class as synonym };' - # => 'class synonym extend my_class {}' - f_content = re.sub( - r"export ({ ([A-Z].*) as ([A-Z].*) });", - "export class \\g<3> extends \\g<2> {}", - f_content, - 0, - re.MULTILINE - ) - - # Replace 'export declare class' => 'export class' - f_content = re.sub(r"export (declare) class", 'export class', f_content, 0, re.MULTILINE) - f_content = re.sub(r"export (declare) enum", 'export enum', f_content, 0, re.MULTILINE) - f_content = re.sub(r"export (declare) function", 'export function', f_content, 0, re.MULTILINE) - f_content = re.sub(r"export (declare) type", 'export type', f_content, 0, re.MULTILINE) - - # Replace 'export { my_func as synonym }' => 'export function synonym = my_func' - - # Replace 'export default class' => 'export class' - f_content = re.sub(r"(export) default", "\\1", f_content, 0, re.MULTILINE) - - # Replace other exports : 'export { .* } from '.*';' and 'export [*] from '.*'; - f_content = export_pattern.sub('', f_content) - - # Specific to your module - f_content = re.sub('export as namespace {};'.format(namespace), '', f_content) - - output_file.write(f_content) - output_file.write('\n') - output_file.write(('}\n')) - -main() \ No newline at end of file diff --git a/src/dts/svgld.d.ts b/src/dts/svgld.d.ts deleted file mode 100644 index 114b2ed..0000000 --- a/src/dts/svgld.d.ts +++ /dev/null @@ -1,583 +0,0 @@ -declare namespace SVGLD { -export interface IMargin { - left?: number; - bottom?: number; - top?: number; - right?: number; -} - -export interface IPoint { - x: number; - y: number; -} - - - - -/** - * Model of available symbol to configure the application */ -export interface IAvailableSymbol { - Name: string; - Image: IImage; - /** displayed text */ - DisplayedText?: string; - isVertical?: boolean; - offset?: number; - Width?: number; - Height?: number; - PositionReference?: PositionReference; - /** An existing or new available container */ - AssociatedContainer?: IAvailableContainer; -} - -export interface IAPIConfiguration { - apiFetchUrl?: string; - apiSetContainerListUrl?: string; - apiGetFeedbackUrl?: string; -} - - -export interface ISymbolModel { - /** Identifier */ - id: string; - /** Displayed Text */ - displayedText: string; - /** Type */ - type: string; - /** Configuration of the symbol */ - config: IAvailableSymbol; - isVertical: boolean; - /** offset */ - offset: number; - /** Width */ - width: number; - /** Height */ - height: number; - /** List of linked container id */ - linkedContainers: Set; - /** Dimensions options */ - showDimension: boolean; -} - - -export interface IPattern { - /** - * Unique id for the pattern - */ - id: string; - /** - * Text to display in the sidebar - */ - text: string; - /** - * IAvailableContainer id used to wrap the children. - */ - wrapper: string; - /** - * List of ids of Pattern or IAvailableContainer - * If a IAvailableContainer and a Pattern have the same id, - * IAvailableContainer will be prioritized - */ - children: string[]; -} -export type ContainerOrPattern = IAvailableContainer | IPattern; -export function GetPattern(id: string, configs: Map, patterns: Map): ContainerOrPattern | undefined; -export function IsPattern(id: string, configs: Map, patterns: Map): boolean; - - - -export interface IHistoryState { - /** Last editor action */ - lastAction: string; - /** Reference to the main container */ - mainContainer: string; - containers: Map; - /** Counter of type of container. Used for ids. */ - typeCounters: Record; - /** List of symbols */ - symbols: Map; -} - -export interface IKeyValue { - Key: string; - Value: string; -} - - -export interface IGetFeedbackRequest { - /** Current application state */ - ApplicationState: IHistoryState; -} - - -export interface IInputGroup { - key: string; - text: React.ReactNode; - value: string; -} - - - -export interface IAction { - Id: string; - CustomLogo: IImage; - Label: string; - Description: string; - Action: string; - AddingBehavior: AddMethod; -} - -export interface ILanguage { - language: string; - dictionary: Record; - languageChange?: (selected: string) => void; -} - - - -export interface ISetContainerListResponse { - Containers: IAvailableContainer[]; - AddingBehavior?: AddMethod; -} - - -export interface IContainerModel { - children: string[]; - properties: IContainerProperties; - userData: Record; -} -/** - * Macro for creating the interface - * Do not add methods since they will be lost during serialization - */ -export class ContainerModel implements IContainerModel { - children: string[]; - properties: IContainerProperties; - userData: Record; - constructor(properties: IContainerProperties, children?: string[], userData?: {}); -} - -export interface IStyle { - stroke?: string; - strokeOpacity?: number; - strokeWidth?: number; - fill?: string; - fillOpacity?: number; -} - -/** - * A SizePointer is a pointer in a 1 dimensional array of width/space - * x being the address where the pointer is pointing - * width being the overall (un)allocated space affected to the address - */ -export interface ISizePointer { - x: number; - width: number; -} - - -export interface IGetFeedbackResponse { - messages: IMessage[]; -} - - - - - - -/** Model of configuration for the application to configure it */ -export interface IConfiguration { - AvailableContainers: IAvailableContainer[]; - AvailableSymbols: IAvailableSymbol[]; - Categories: ICategory[]; - Patterns: IPattern[]; - MainContainer: IAvailableContainer; - APIConfiguration?: IAPIConfiguration; -} - - - - -export interface ISetContainerListRequest { - /** Name of the action declared in the API */ - Action: IAction; - /** Selected container */ - Container: IContainerModel; - /** The previous sibling container */ - PreviousContainer: IContainerModel | undefined; - /** The next sibling container */ - NextContainer: IContainerModel | undefined; - /** Current application state */ - ApplicationState: IHistoryState; -} - - - - - - - -/** - * Properties of a container - */ -export interface IContainerProperties { - /** id of the container */ - id: string; - /** type matching the configuration on construction */ - type: string; - /** id of the parent container (null when there is no parent) */ - parentId: string; - /** id of the linked symbol ('' when there is no parent) */ - linkedSymbolId: string; - /** Text displayed in the container */ - displayedText: string; - /** orientation */ - orientation: Orientation; - /** horizontal offset */ - x: number; - /** vertical offset */ - y: number; - /** margin */ - margin: IMargin; - /** width */ - width: number; - /** height */ - height: number; - /** - * Minimum width (min=1) - */ - minWidth: number; - /** - * Maximum width - */ - maxWidth: number; - /** - * Minimum height (min=1) - */ - minHeight: number; - /** - * Maximum height - */ - maxHeight: number; - /** true if anchor, false otherwise */ - isAnchor: boolean; - /** true if flex, false otherwise */ - isFlex: boolean; - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - positionReference: PositionReference; - /** Hide the children in the treeview */ - hideChildrenInTreeview: boolean; - /** Dimensions options */ - dimensionOptions: IDimensions; - /** - * Warnings of a container - */ - warning: string; - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - customSVG?: string; - /** - * (optional) - * Style of the - */ - style?: IStyle; - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - userData?: IKeyValue[]; -} - - - - - - - - - -/** Model of available container used in application configuration */ -export interface IAvailableContainer { - /** type */ - Type: string; - /** displayed text */ - DisplayedText?: string; - /** category */ - Category?: string; - /** orientation */ - Orientation?: Orientation; - /** horizontal offset */ - X?: number; - /** vertical offset */ - Y?: number; - /** width */ - Width?: number; - /** height */ - Height?: number; - /** - * Minimum width (min=1) - */ - MinWidth?: number; - /** - * Maximum width - */ - MaxWidth?: number; - /** - * Minimum height (min=1) - */ - MinHeight?: number; - /** - * Maximum height - */ - MaxHeight?: number; - /** margin */ - Margin?: IMargin; - /** true if anchor, false otherwise */ - IsAnchor?: boolean; - /** true if flex, false otherwise */ - IsFlex?: boolean; - /** Method used on container add */ - AddMethod?: AddMethod; - /** Horizontal alignment, also determines the visual location of x {Left = 0, Center, Right } */ - PositionReference?: PositionReference; - /** - * (optional) - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - CustomSVG?: string; - /** - * (optional) - * Disabled when Pattern is used. - * - * Replace a by a customized "SVG". It is not really an svg but it at least allows - * to draw some patterns that can be bind to the properties of the container - * Use {prop} to bind a property. Use {{ styleProp }} to use an object. - * Example : - * ``` - * ` - * - * - * - * ` - * ``` - */ - DefaultChildType?: string; - /** - * Allow to use a Pattern to create the list of children - * Cannot be used with DefaultChildType, - * DefaultChildType will be disabled for this container and the children - */ - Pattern?: string; - /** Hide the children in the treeview */ - HideChildrenInTreeview?: boolean; - /** Dimensions options */ - DimensionOptions?: IDimensions; - /** - * if true, hide the entry in the sidebar (default: false) - */ - IsHidden?: boolean; - /** - * Disable a list of available container to be added inside - */ - Blacklist?: string[]; - /** - * Cannot be used with blacklist. Whitelist will be prioritized. - * To disable the whitelist, Whitelist must be undefined. - * Only allow a set of available container to be added inside - */ - Whitelist?: string[]; - /** - * (optional) - * Style of the - */ - Style?: IStyle; - /** - * List of possible actions shown on right-click - */ - Actions?: IAction[]; - /** - * (optional) - * User data that can be used for data storage or custom SVG - */ - UserData?: IKeyValue[]; -} - - -export interface IMessage { - text: string; - type: MessageType; -} - - - -export interface IEditorState { - history: IHistoryState[]; - historyCurrentStep: number; - configuration: IConfiguration; -} - -export interface ICategory { - Type: string; - DisplayedText?: string; -} - -export interface IReplaceContainer { - id: string | undefined; - isReplacing: boolean; - category: string | undefined; -} - - -export interface IDimensionOptions { - positions: Position[]; - /** - * Stroke color - */ - color?: string; - /** stroke-width */ - width?: number; - /** stroke-dasharray */ - dashArray?: string; -} - - - -export interface IDimensions { - /** if true, show the dimension of the container */ - selfDimensions: IDimensionOptions; - /** if true, show the dimension of the container */ - selfMarginsDimensions: IDimensionOptions; - /** if true show the overall dimensions of its children */ - childrenDimensions: IDimensionOptions; - /** - * if true, allows a parent dimension borrower to borrow its x coordinate - * as a reference point for a dimension - */ - markPosition: Orientation[]; - /** - * if true, show a dimension from the edge of the container to end - * and insert dimensions marks at lift up children (see liftDimensionToBorrower) - */ - dimensionWithMarks: IDimensionOptions; -} - -/** - * Model of an image with multiple source - * It must at least have one source. - * - * If Url/Base64Image and Svg are set, - * Url/Base64Image will be shown in the menu while SVG will be drawn - */ -export interface IImage { - /** Name of the image */ - Name: string; - /** (optional) Url of the image */ - Url?: string; - /** (optional) base64 data of the image */ - Base64Image?: string; - /** (optional) SVG string */ - Svg?: string; -} - -export enum MessageType { - Normal = 0, - Success = 1, - Warning = 2, - Error = 3 -} - -/** - * Add method when creating a container - * - Append will append to the last children in list - * - Insert will always place it at the begining - * - Replace will remove the selected container and insert a new one - * (default: Append) - */ -export enum AddMethod { - Append = 0, - Insert = 1, - Replace = 2, - ReplaceParent = 3 -} - -/** - * Describe the type of the property. - * Used for the assignation in the OnPropertyChange function - * See ContainerOperations.ts's OnPropertyChange - */ -export enum PropertyType { - /** - * Simple property: is not inside any object: id, x, width... (default) - */ - Simple = 0, - /** - * Style property: is inside the style object: stroke, fillOpacity... - */ - Style = 1, - /** - * Margin property: is inside the margin property: left, bottom, top, right... - */ - Margin = 2, - /** - * Dimension options - */ - SelfDimension = 3, - SelfMarginDimension = 4, - ChildrenDimensions = 5, - DimensionWithMarks = 6, - DimensionOptions = 7 -} - -export enum PositionReference { - TopLeft = 0, - TopCenter = 1, - TopRight = 2, - CenterLeft = 3, - CenterCenter = 4, - CenterRight = 5, - BottomLeft = 6, - BottomCenter = 7, - BottomRight = 8 -} - -export enum AppState { - MainMenu = 0, - Loading = 1, - Loaded = 2 -} - -export enum Orientation { - Horizontal = 0, - Vertical = 1 -} - -export enum Position { - Left = 0, - Down = 1, - Up = 2, - Right = 3 -} - -} diff --git a/src/dts/tsconfig.dts.json b/src/dts/tsconfig.dts.json deleted file mode 100644 index 3d2caa3..0000000 --- a/src/dts/tsconfig.dts.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Change this to match your project - "include": ["../Enums/*", "../Interfaces/*"], - "compilerOptions": { - "target": "ES2021", - "module": "es2020", - "allowJs": false, - "declaration": true, - "moduleResolution": "node", - "allowSyntheticDefaultImports": true, - "emitDeclarationOnly": true, - "outDir": "dist", - "declarationMap": false - } -} \ No newline at end of file diff --git a/src/index.scss b/src/index.scss index aba1712..1bc3361 100644 --- a/src/index.scss +++ b/src/index.scss @@ -3,89 +3,28 @@ @tailwind utilities; @layer components { - #root, .Editor, .App { - @apply overflow-hidden - } - - .left-sidebar { - @apply fixed shadow-lg z-20 - w-[calc(100%_-_4rem)] md:w-64 - h-1/4 md:h-full bottom-1/2 md:bottom-0 - } - - .left-sidebar-single { - @apply fixed shadow-lg z-20 - w-[calc(100%_-_4rem)] md:w-64 - h-1/3 md:h-full bottom-0 - } - - .right-sidebar { - @apply fixed shadow-lg z-20 - h-1/2 md:h-full bottom-0 md:bottom-0 - } - - - .sidebar-title { - @apply p-3 md:p-5 font-bold h-12 md:h-16 + @apply p-6 font-bold } .sidebar-component { - @apply transition-all px-2 h-12 flex items-center align-middle - text-sm rounded-lg - bg-slate-300/80 hover:bg-blue-500 hover:text-slate-50 - disabled:bg-slate-400 disabled:text-slate-500 - } - - .sidebar-component-left { - @apply transition-all px-2 h-12 align-middle flex items-center text-sm rounded-l-lg bg-slate-300/80 group-hover:bg-blue-500 group-hover:text-slate-50 - } - - .sidebar-component-right { - @apply transition-all px-2 h-12 align-middle flex items-center text-sm rounded-r-lg bg-slate-400/80 group-hover:bg-blue-600 group-hover:text-slate-50 - } - - .sidebar-component-card { - @apply transition-all overflow-hidden text-sm rounded-lg bg-slate-300/60 hover:bg-slate-300 + @apply transition-all px-2 py-6 text-sm rounded-lg bg-slate-300/60 hover:bg-slate-300 } .elements-sidebar-row { - @apply pl-6 pr-6 w-full - } - .symbols-sidebar-row { - @apply elements-sidebar-row + @apply pl-6 pr-6 pt-2 pb-2 w-full } .close-button { @apply transition-all w-full h-auto p-4 flex } - .mainmenu-bg { - @apply bg-blue-100 h-full w-full - } - .mainmenu-btn { @apply transition-all bg-blue-100 hover:bg-blue-200 text-blue-700 text-lg font-semibold p-8 rounded-lg } - .normal-btn { - @apply text-sm - py-2 px-4 - rounded-full border-0 - font-semibold - transition-all - bg-blue-100 text-blue-700 - hover:bg-blue-200 - } - .floating-btn { - @apply h-full w-full text-white align-middle - items-center justify-center - } - - .bar { - @apply fixed z-30 flex flex-col top-0 left-0 - h-full w-16 bg-slate-100 shadow-sm + @apply h-full w-full text-white align-middle items-center justify-center } .bar-btn { @@ -97,39 +36,16 @@ @apply h-full w-full align-middle items-center justify-center } - .radio-button-icon { - @apply rounded-md shadow-sm bg-white w-8 cursor-pointer inline-block - } - .sidebar-tooltip { @apply absolute w-auto p-2 m-2 min-w-max left-14 rounded-md shadow-md text-gray-800 bg-slate-100 dark:text-white dark:bg-gray-800 text-xs font-bold - transition-all duration-100 scale-0 origin-left - } - - .contextmenu { - @apply grid grid-cols-1 gap-0 + transition-all duration-100 scale-0 origin-left; } .contextmenu-item { - @apply px-2 py-1 hover:bg-slate-300 text-left w-full - } - - .input-group { - @apply w-full - text-xs font-medium transition-all text-gray-800 mt-1 px-3 py-2 - bg-white border-2 border-white rounded-lg placeholder-gray-800 - focus:outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500 - disabled:bg-slate-200 disabled:text-gray-500 disabled:border-slate-300 disabled:shadow-none; - } - .input-group[type='color'] { - @apply py-0 - } - - .prop-category-body { - @apply rounded-lg bg-slate-300 p-3 + @apply px-2 py-1 hover:bg-slate-300 text-left } } \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 314f08e..5399af1 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,24 +1,10 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import { App } from './Components/App/App'; -import { LanguageProvider } from './Components/LanguageProvider/LanguageProvider'; import './index.scss'; -function RenderRoot(root: Element | Document): void { - ReactDOM.createRoot(root.querySelector('#root') as HTMLDivElement).render( - - - - ); -} - -// Specific for Modeler apps -// eslint-disable-next-line @typescript-eslint/no-namespace -namespace SVGLayoutDesigner { - // eslint-disable-next-line @typescript-eslint/naming-convention - export const Render = RenderRoot; -} - -(window as any).SVGLayoutDesigner = SVGLayoutDesigner; - -RenderRoot(document); +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + +); diff --git a/src/tests/resources/state.json b/src/tests/resources/state.json new file mode 100644 index 0000000..2152cd1 --- /dev/null +++ b/src/tests/resources/state.json @@ -0,0 +1,182 @@ +{ + "isSidebarOpen": true, + "isElementsSidebarOpen": false, + "isHistoryOpen": false, + "configuration": { + "AvailableContainers": [ + { + "Type": "Chassis", + "Width": 500, + "Style": { + "fillOpacity": 0, + "borderWidth": 2, + "stroke": "red" + } + }, + { + "Type": "Trou", + "Width": 300, + "Style": { + "fillOpacity": 0, + "borderWidth": 2, + "stroke": "green" + } + }, + { + "Type": "Montant", + "Width": 100, + "Style": { + "fillOpacity": 0, + "borderWidth": 2, + "stroke": "blue", + "transform": "translateX(-50%)", + "transformOrigin": "center", + "transformBox": "fill-box" + } + } + ], + "AvailableSymbols": [ + { + "Height": 0, + "Image": { + "Base64Image": null, + "Name": null, + "Svg": null, + "Url": "https://www.manutan.fr/img/S/GRP/ST/AIG3930272.jpg" + }, + "Name": "Poteau structure", + "Width": 0, + "XPositionReference": 1 + }, + { + "Height": 0, + "Image": { + "Base64Image": null, + "Name": null, + "Svg": null, + "Url": "https://e7.pngegg.com/pngimages/647/127/png-clipart-svg-working-group-information-world-wide-web-internet-structure.png" + }, + "Name": "Joint de structure", + "Width": 0, + "XPositionReference": 0 + } + ], + "MainContainer": { + "Height": 200, + "Width": 1000 + } + }, + "history": [ + { + "MainContainer": { + "children": [], + "properties": { + "id": "main", + "parentId": "null", + "x": 0, + "y": 0, + "width": 1000, + "height": 200, + "fillOpacity": 0, + "stroke": "black" + }, + "userData": {} + }, + "TypeCounters": {} + }, + { + "MainContainer": { + "children": [ + { + "children": [], + "properties": { + "id": "Chassis-0", + "parentId": "main", + "x": 0, + "y": 0, + "width": 500, + "height": 200, + "fillOpacity": 0, + "borderWidth": 2, + "stroke": "red" + }, + "userData": { + "type": "Chassis" + } + } + ], + "properties": { + "id": "main", + "parentId": "null", + "x": 0, + "y": 0, + "width": 1000, + "height": 200, + "fillOpacity": 0, + "stroke": "black" + }, + "userData": {} + }, + "TypeCounters": { + "Chassis": 0 + }, + "SelectedContainerId": "main" + }, + { + "MainContainer": { + "children": [ + { + "children": [], + "properties": { + "id": "Chassis-0", + "parentId": "main", + "x": 0, + "y": 0, + "width": 500, + "height": 200, + "fillOpacity": 0, + "borderWidth": 2, + "stroke": "red" + }, + "userData": { + "type": "Chassis" + } + }, + { + "children": [], + "properties": { + "id": "Chassis-1", + "parentId": "main", + "x": 500, + "y": 0, + "width": 500, + "height": 200, + "fillOpacity": 0, + "borderWidth": 2, + "stroke": "red" + }, + "userData": { + "type": "Chassis" + } + } + ], + "properties": { + "id": "main", + "parentId": "null", + "x": 0, + "y": 0, + "width": 1000, + "height": 200, + "fillOpacity": 0, + "stroke": "black" + }, + "userData": {} + }, + "TypeCounters": { + "Chassis": 1 + }, + "SelectedContainerId": "main" + } + ], + "historyCurrentStep": 2 +} \ No newline at end of file diff --git a/src/utils/default.ts b/src/utils/default.ts index d95347c..60371fc 100644 --- a/src/utils/default.ts +++ b/src/utils/default.ts @@ -1,170 +1,11 @@ -import { PositionReference } from '../Enums/PositionReference'; -import { type IAvailableContainer } from '../Interfaces/IAvailableContainer'; -import { type IAvailableSymbol } from '../Interfaces/IAvailableSymbol'; -import { type IConfiguration } from '../Interfaces/IConfiguration'; -import { ContainerModel, type IContainerModel } from '../Interfaces/IContainerModel'; -import { type IContainerProperties } from '../Interfaces/IContainerProperties'; -import { type IEditorState } from '../Interfaces/IEditorState'; -import { type ISymbolModel } from '../Interfaces/ISymbolModel'; -import { Orientation } from '../Enums/Orientation'; -import { AppState } from '../Enums/AppState'; -import { type IDimensionOptions } from '../Interfaces/IDimensionOptions'; -import { type IDimensionStyle } from '../Interfaces/IDimensionStyle'; +import { Configuration } from '../Interfaces/Configuration'; +import Properties from '../Interfaces/Properties'; -/// EDITOR DEFAULTS /// - -/** Enable fast boot and disable main menu (0 = disabled, 1 = loading, 2 = loaded) */ -export const FAST_BOOT = import.meta.env.PROD - ? AppState.Loaded - : AppState.MainMenu; - -/** Disable any call to the API (default = false) */ -export const DISABLE_API = false; - -export const DEFAULT_LANGUAGE = 'fr'; - -/** - * Replace the SVG viewer by a canvas - * Better compatibility with Gecko and WebKit engines like Firefox and Safari. - * EXPERIMENTAL: svg export wont work and it won't be possible to insert a custom svg) - */ -export const USE_EXPERIMENTAL_CANVAS_API = false; - -/** Enable keyboard shortcuts (default = true) */ -export const ENABLE_SHORTCUTS = true; - -/** Size of the history (recommanded = 200) */ -export const MAX_HISTORY = 200; - -/** Apply beheviors on children (recommanded = true) */ -export const APPLY_BEHAVIORS_ON_CHILDREN = true; - -/** Framerate of the svg controller (recommanded = 60) */ -export const MAX_FRAMERATE = 120; - -/// CONTAINER DEFAULTS /// - -/** Enable the swap behavior (kinda broken recommanded = false) */ -export const ENABLE_SWAP = false; - -/** Enable the rigid behavior (recommanded = true) */ -export const ENABLE_RIGID = true; - -/** - * Enable the hard rigid behavior - * disallowing the container to overlap (ENABLE_RIGID must be true) - * (recommanded = false) - */ -export const ENABLE_HARD_RIGID = false; - -/** Enalbe the text in the containers */ -export const SHOW_TEXT = false; -export const SHOW_SELECTOR_TEXT = true; -export const DEFAULTCHILDTYPE_ALLOW_CYCLIC = false; -export const DEFAULTCHILDTYPE_MAX_DEPTH = 10; - -/// DIMENSIONS DEFAULTS /// - -export const SHOW_SELF_DIMENSIONS = true; -export const SHOW_SELF_MARGINS_DIMENSIONS = true; -export const SHOW_CHILDREN_DIMENSIONS = true; -export const SHOW_BORROWER_DIMENSIONS = true; -export const DIMENSION_MARGIN = 70; -export const SYMBOL_DIMENSION_MARGIN = 30; -export const SYMBOL_MARGIN = 25; -export const NOTCHES_LENGTH = 10; -export const DEFAULT_DIMENSION_SYMBOL_STYLE: IDimensionStyle = { - color: '#000000' -}; - -/// SYMBOL DEFAULTS /// - -export const DEFAULT_SYMBOL_WIDTH = 32; -export const DEFAULT_SYMBOL_IS_VERTICAL = false; -export const DEFAULT_SYMBOL_HEIGHT = 32; - -/** - * Returns the default editor state given the configuration - */ -export function GetDefaultEditorState(configuration: IConfiguration): IEditorState { - if (configuration.MainContainer.Width === undefined || - configuration.MainContainer.Height === undefined) { - throw new Error('Cannot initialize project! Main container has an undefined size'); - } - - const containerConfig = configuration.AvailableContainers.find( - config => config.Type === configuration.MainContainer.Type - ); - - let mainContainerConfig: IContainerProperties; - if (containerConfig !== undefined) { - const clone = structuredClone(containerConfig); - const extendedContainerConfig = Object.assign(clone, configuration.MainContainer); - - if (containerConfig.Style !== undefined) { - const styleClone = structuredClone(containerConfig.Style); - extendedContainerConfig.Style = Object.assign(styleClone, configuration.MainContainer.Style); - } - - if (extendedContainerConfig.Width === undefined || - extendedContainerConfig.Height === undefined) { - throw new Error('Cannot initialize project! Main container has an undefined size'); - } - - mainContainerConfig = GetDefaultContainerProps( - extendedContainerConfig.Type, - 0, - null, - 0, - 0, - extendedContainerConfig.Width, - extendedContainerConfig.Height, - extendedContainerConfig - ); - } else { - mainContainerConfig = GetDefaultContainerProps( - configuration.MainContainer.Type, - 0, - null, - 0, - 0, - configuration.MainContainer.Width, - configuration.MainContainer.Height, - configuration.MainContainer - ); - } - const mainContainer = new ContainerModel(mainContainerConfig); - const containers = new Map(); - containers.set(mainContainer.properties.id, mainContainer); - - const typeCounters = {}; - (typeCounters as any)[mainContainer.properties.type] = 0; - - return { - configuration, - history: [ - { - lastAction: '', - mainContainer: mainContainer.properties.id, - containers, - typeCounters, - symbols: new Map() - } - ], - historyCurrentStep: 0, - version: APP_VERSION ?? 'test-version' - }; -} - -/** - * Default config when the API is not available - */ -export const DEFAULT_CONFIG: IConfiguration = { - /* eslint-disable @typescript-eslint/naming-convention */ +export const DEFAULT_CONFIG: Configuration = { AvailableContainers: [ { Type: 'Container', - MaxWidth: 200, + Width: 75, Height: 100, Style: { fillOpacity: 0, @@ -173,160 +14,24 @@ export const DEFAULT_CONFIG: IConfiguration = { } ], AvailableSymbols: [], - Categories: [], - Patterns: [], MainContainer: { Type: 'Container', - Width: 800, + Width: 2000, Height: 100, Style: { fillOpacity: 0, stroke: 'black' } } - /* eslint-enable */ }; -const DEFAULT_CONTAINER_STYLE = { - stroke: 'black', - fillOpacity: 1, - fill: 'white', - strokeWidth: 2 -}; - -export const DEFAULT_DIMENSION_OPTION: IDimensionOptions = { - positions: [], - color: '#000000', - width: 2 -}; - -/** - * Default Main container properties - */ -export const DEFAULT_MAINCONTAINER_PROPS: IContainerProperties = { +export const DEFAULT_MAINCONTAINER_PROPS: Properties = { id: 'main', - type: 'container', - parentId: '', - linkedSymbolId: '', - displayedText: 'main', - orientation: Orientation.Horizontal, + parentId: 'null', x: 0, y: 0, - margin: {}, - minWidth: 1, - maxWidth: Number.MAX_SAFE_INTEGER, - minHeight: 1, - maxHeight: Number.MAX_SAFE_INTEGER, - width: Number(DEFAULT_CONFIG.MainContainer.Width), - height: Number(DEFAULT_CONFIG.MainContainer.Height), - isAnchor: false, - isFlex: false, - positionReference: PositionReference.TopLeft, - hideChildrenInTreeview: false, - dimensionOptions: { - childrenDimensions: clone(DEFAULT_DIMENSION_OPTION), - selfDimensions: clone(DEFAULT_DIMENSION_OPTION), - selfMarginsDimensions: clone(DEFAULT_DIMENSION_OPTION), - markPosition: [], - dimensionWithMarks: clone(DEFAULT_DIMENSION_OPTION) - }, - warning: '', - style: DEFAULT_CONTAINER_STYLE + width: DEFAULT_CONFIG.MainContainer.Width, + height: DEFAULT_CONFIG.MainContainer.Height, + fillOpacity: 0, + stroke: 'black' }; - -/** - * Returns the default properties of a newly created container - * @param type Type of the container - * @param typeCount index of the container - * @param parent Parent of the container - * @param x horizontal offset - * @param y vertical offset - * @param width - * @param height - * @param containerConfig default config of the container sent by the API - * @returns {IContainerProperties} Default properties of a newly created container - */ -export function GetDefaultContainerProps( - type: string, - typeCount: number, - parent: IContainerModel | undefined | null, - x: number, - y: number, - width: number, - height: number, - containerConfig: IAvailableContainer -): IContainerProperties { - const orientation = containerConfig.Orientation ?? Orientation.Horizontal; - return ({ - id: `${type}-${typeCount}`, - type, - parentId: parent?.properties.id ?? '', - linkedSymbolId: '', - displayedText: `${containerConfig.DisplayedText ?? type}-${typeCount}`, - orientation, - x, - y, - margin: containerConfig.Margin ?? {}, - width, - height, - isAnchor: containerConfig.IsAnchor ?? false, - isFlex: containerConfig.IsFlex ?? false, - positionReference: containerConfig.PositionReference ?? PositionReference.TopLeft, - minWidth: containerConfig.MinWidth ?? 1, - maxWidth: containerConfig.MaxWidth ?? Number.MAX_SAFE_INTEGER, - minHeight: containerConfig.MinWidth ?? 1, - maxHeight: containerConfig.MaxWidth ?? Number.MAX_SAFE_INTEGER, - hideChildrenInTreeview: containerConfig.HideChildrenInTreeview ?? false, - dimensionOptions: { - childrenDimensions: { - ...containerConfig.DimensionOptions?.childrenDimensions, - positions: containerConfig.DimensionOptions?.childrenDimensions?.positions ?? [] - }, - selfDimensions: { - ...containerConfig.DimensionOptions?.selfDimensions, - positions: containerConfig.DimensionOptions?.selfDimensions?.positions ?? [] - }, - selfMarginsDimensions: { - ...containerConfig.DimensionOptions?.selfMarginsDimensions, - positions: containerConfig.DimensionOptions?.selfMarginsDimensions?.positions ?? [] - }, - markPosition: containerConfig.DimensionOptions?.markPosition ?? [], - dimensionWithMarks: { - ...containerConfig.DimensionOptions?.dimensionWithMarks, - positions: containerConfig.DimensionOptions?.dimensionWithMarks?.positions ?? [] - } - }, - warning: '', - customSVG: containerConfig.CustomSVG, - style: Object.assign(structuredClone(DEFAULT_CONTAINER_STYLE), structuredClone(containerConfig.Style)), - userData: structuredClone(containerConfig.UserData) - }); -} - -export function GetDefaultSymbolModel( - name: string, - newCounters: Record, - type: string, - symbolConfig: IAvailableSymbol -): ISymbolModel { - const id = `${name}-${newCounters[type]}`; - return { - id, - displayedText: symbolConfig.DisplayedText ?? id, - type: name, - config: structuredClone(symbolConfig), - offset: 0, - isVertical: symbolConfig.isVertical ?? DEFAULT_SYMBOL_IS_VERTICAL, - width: symbolConfig.Width ?? DEFAULT_SYMBOL_WIDTH, - height: symbolConfig.Height ?? DEFAULT_SYMBOL_HEIGHT, - linkedContainers: new Set(), - showDimension: false - }; -} - -/** - * Macro function for JSON.parse(JSON.stringify(obj)) - */ -function clone(object: T): T { - return JSON.parse(JSON.stringify(object)); -} diff --git a/src/utils/itertools.ts b/src/utils/itertools.ts index 2dbbbdd..67cd40c 100644 --- a/src/utils/itertools.ts +++ b/src/utils/itertools.ts @@ -1,28 +1,9 @@ -import { type IContainerModel } from '../Interfaces/IContainerModel'; - -export function * MakeChildrenIterator( - containers: Map, - childrenIds: string[] -): Generator { - for (const childId of childrenIds) { - const child = FindContainerById(containers, childId); - - if (child === undefined) { - return; - } - - yield child; - }; -} +import { IContainerModel } from '../Interfaces/ContainerModel'; /** * Returns a Generator iterating of over the children depth-first */ -export function * MakeDFSIterator( - root: IContainerModel, - containers: Map, - enableHideChildrenInTreeview = false -): Generator { +export function * MakeIterator(root: IContainerModel): Generator { const queue: IContainerModel[] = [root]; const visited = new Set(queue); while (queue.length > 0) { @@ -30,15 +11,10 @@ export function * MakeDFSIterator( yield container; - if (enableHideChildrenInTreeview && container.properties.hideChildrenInTreeview) { - continue; - } - for (let i = container.children.length - 1; i >= 0; i--) { - const childId = container.children[i]; - const child = FindContainerById(containers, childId); - if (child === undefined || visited.has(child)) { - continue; + const child = container.children[i]; + if (visited.has(child)) { + return; } visited.add(child); queue.push(child); @@ -46,105 +22,17 @@ export function * MakeDFSIterator( } } -export interface ContainerAndDepth { - container: IContainerModel - depth: number -} - -export interface ContainerAndDepthAndTransform extends ContainerAndDepth { - currentTransform: [number, number] -} - -/** - * Returns a Generator iterating of over the children depth-first - */ -export function * MakeBFSIterator( - root: IContainerModel, - containers: Map -): Generator { - const queue: IContainerModel[] = [root]; - let depth = 0; - while (queue.length > 0) { - let levelSize = queue.length; - while (levelSize-- !== 0) { - const container = queue.shift() as IContainerModel; - yield { - container, - depth - }; - - for (let i = container.children.length - 1; i >= 0; i--) { - const childId = container.children[i]; - const child = FindContainerById(containers, childId); - - if (child === undefined) { - continue; - } - - queue.push(child); - } - } - depth++; - } -} - -export function * MakeRecursionDFSIterator( - root: IContainerModel | null, - containers: Map, - depth: number, - currentTransform: [number, number], - enableHideChildrenInTreeview: boolean = false -): Generator { - if (root === null) { - return; - } - - yield { - container: root, - depth, - currentTransform - }; - - if ( - (enableHideChildrenInTreeview && root.properties.hideChildrenInTreeview) || - ('isClosed' in root && root.isClosed === true) - ) { - return; - } - - for (const containerId of root.children) { - const container = FindContainerById(containers, containerId); - - if (container === undefined) { - continue; - } - - yield * MakeRecursionDFSIterator( - container, - containers, - depth + 1, - [ - currentTransform[0] + root.properties.x, - currentTransform[1] + root.properties.y - ], - enableHideChildrenInTreeview - ); - } -} - /** * Returns the depth of the container * @returns The depth of the container - * @deprecated Please avoid using this function inside an iteration, - * use recursive DFS or iterative BFS to get the depth */ -export function GetDepth(containers: Map, parent: IContainerModel): number { +export function getDepth(parent: IContainerModel): number { let depth = 0; let current: IContainerModel | null = parent; while (current != null) { depth++; - current = FindContainerById(containers, current.properties.parentId) ?? null; + current = current.parent; } return depth; @@ -154,104 +42,20 @@ export function GetDepth(containers: Map, parent: ICont * Returns the absolute position by iterating to the parent * @returns The absolute position of the container */ -export function GetAbsolutePosition( - containers: Map, - container: IContainerModel -): [number, number] { - const x = container.properties.x; - const y = container.properties.y; - const parent = FindContainerById(containers, container.properties.parentId) ?? null; - return CancelParentTransform(containers, parent, x, y); -} - -export function GetContainerLinkedList( - containers: Map, - container: IContainerModel, - stop?: IContainerModel -): IContainerModel[] { - const it = MakeContainerLinkedListIterator(containers, container, stop); - return [...it]; -} - -export function * MakeContainerLinkedListIterator( - containers: Map, - container: IContainerModel, - stop?: IContainerModel -): Generator { - let current: IContainerModel | null = container; - while (current !== stop && current != null) { - yield current; - current = FindContainerById(containers, current.properties.parentId) ?? null; +export function getAbsolutePosition(container: IContainerModel): [number, number] { + let x = Number(container.properties.x); + let y = Number(container.properties.y); + let current = container.parent; + while (current != null) { + x += Number(current.properties.x); + y += Number(current.properties.y); + current = current.parent; } -} - -/** - * Cancel the hierarchic transformations to the given x, y - * @param parent Parent of the container to remove its transform - * @param x value to be restored - * @param y value to be restored - * @returns x and y such that the transformations of the parent are cancelled - */ -export function CancelParentTransform( - containers: Map, - parent: IContainerModel | null, - x: number, - y: number, - stop?: IContainerModel -): [number, number] { - if (parent === null) { - return [x, y]; - } - - const it = MakeContainerLinkedListIterator(containers, parent, stop); - for (const current of it) { - x += current.properties.x; - y += current.properties.y; - } - return [x, y]; } -/** - * Apply the hierarchic transformations to the given x, y - * @param parent Parent of the container to remove its transform - * @param x value to be restored - * @param y value to be restored - * @returns x and y such that the transformations of the parent are applied - */ -export function ApplyParentTransform( - containers: Map, - parent: IContainerModel | null, - x: number, - y: number, - stop?: IContainerModel -): [number, number] { - if (parent === null) { - return [x, y]; - } - - const it = MakeContainerLinkedListIterator(containers, parent, stop); - for (const current of it) { - x -= current.properties.x; - y -= current.properties.y; - } - - return [x, y]; -} - -/** - * Returns the container by id - * @deprecated Please use FindContainerById - * @param root Root of the container tree - * @param id Id of the container to find - * @returns The container found or undefined if not found - */ -export function FindContainerByIdDFS( - root: IContainerModel, - containers: Map, - id: string -): IContainerModel | undefined { - const it = MakeDFSIterator(root, containers); +export function findContainerById(root: IContainerModel, id: string): IContainerModel | undefined { + const it = MakeIterator(root); for (const container of it) { if (container.properties.id === id) { return container; @@ -259,31 +63,3 @@ export function FindContainerByIdDFS( } return undefined; } - -/** - * Returns the container by id - * For now, does the same as containers.get(id) - * @param containers Map of containers - * @param id id of container - * @returns Container by id - */ -export function FindContainerById(containers: Map, id: string): IContainerModel | undefined { - return containers.get(id); -} - -export interface IPair { - cur: T - next: T -} - -export function * Pairwise(arr: T[]): Generator, void, unknown> { - for (let i = 0; i < arr.length - 1; i++) { - yield { cur: arr[i], next: arr[i + 1] }; - } -} - -export function * ReversePairwise(arr: T[]): Generator, void, unknown> { - for (let i = arr.length - 1; i > 0; i--) { - yield { cur: arr[i], next: arr[i - 1] }; - } -} diff --git a/src/utils/migration.ts b/src/utils/migration.ts deleted file mode 100644 index 4b56800..0000000 --- a/src/utils/migration.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { type Orientation } from '../Enums/Orientation'; -import { type Position } from '../Enums/Position'; -import { type IDimensions } from '../Interfaces/IDimensions'; -import { DEFAULT_DIMENSION_OPTION } from './default'; - -// V1 Model - -interface V1_IEditorState { - history: Array<{ - containers: Map - }> - configuration: { - AvailableContainers: Array<{ - ShowSelfDimensions?: Position[] - ShowChildrenDimensions?: Position[] - MarkPosition?: Orientation[] - ShowDimensionWithMarks?: Position[] - }> - } -} - -// V2 Changes - -interface V2_IContainerModel { - properties: { - dimensionOptions: IDimensions - - // Call delete on these properties vvv - showSelfDimensions: Position[] | undefined - showChildrenDimensions: Position[] | undefined - markPosition: Orientation[] | undefined - showDimensionWithMarks: Position[] | undefined - } -} - -interface V2_IAvailableContainer { - DimensionOptions: IDimensions - - // Call delete on these properties vvv - ShowSelfDimensions?: Position[] - ShowChildrenDimensions?: Position[] - MarkPosition?: Orientation[] - ShowDimensionWithMarks?: Position[] -} - -export function TryMigration(editorState: any): void { - if (!('version' in editorState)) { - console.debug('Migrating v1.0.0 Editor State to : v2.0.0.'); - MigrateV1ToV2(editorState); - return; - } - - // version 1+ - console.debug('Editor State is at the latest version.'); -} - -export function MigrateV1ToV2(v1EditorState: V1_IEditorState): void { - // Fix breaking change showSelfDimension in all containers - for (const historyState of v1EditorState.history) { - historyState.containers.forEach((v1Container) => { - const v2Container = (v1Container as any) as V2_IContainerModel; - v2Container.properties.dimensionOptions = { - selfDimensions: { - ...DEFAULT_DIMENSION_OPTION, - positions: v1Container.properties.showSelfDimensions - }, - childrenDimensions: { - ...DEFAULT_DIMENSION_OPTION, - positions: v1Container.properties.showChildrenDimensions - }, - dimensionWithMarks: { - ...DEFAULT_DIMENSION_OPTION, - positions: v1Container.properties.showDimensionWithMarks - }, - selfMarginsDimensions: DEFAULT_DIMENSION_OPTION, - markPosition: v1Container.properties.markPosition - }; - - delete v2Container.properties.showSelfDimensions; - delete v2Container.properties.showChildrenDimensions; - delete v2Container.properties.showDimensionWithMarks; - delete v2Container.properties.markPosition; - }); - } - - v1EditorState.configuration.AvailableContainers.forEach((v1AvailableContainer) => { - const v2AvailableContainer = (v1AvailableContainer as any) as V2_IAvailableContainer; - v2AvailableContainer.DimensionOptions = { - selfDimensions: { - positions: v1AvailableContainer.ShowSelfDimensions ?? [] - }, - childrenDimensions: { - positions: v1AvailableContainer.ShowChildrenDimensions ?? [] - }, - dimensionWithMarks: { - positions: v1AvailableContainer.ShowDimensionWithMarks ?? [] - }, - selfMarginsDimensions: { - positions: [] - }, - markPosition: v1AvailableContainer.MarkPosition ?? [] - }; - - delete v2AvailableContainer.ShowSelfDimensions; - delete v2AvailableContainer.ShowChildrenDimensions; - delete v2AvailableContainer.ShowDimensionWithMarks; - delete v2AvailableContainer.MarkPosition; - }); -} diff --git a/src/utils/saveload.ts b/src/utils/saveload.ts index a585a34..de8b835 100644 --- a/src/utils/saveload.ts +++ b/src/utils/saveload.ts @@ -1,9 +1,5 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import { type IEditorState } from '../Interfaces/IEditorState'; -import { type IHistoryState } from '../Interfaces/IHistoryState'; -import { type IContainerModel } from '../Interfaces/IContainerModel'; -import { type ISymbolModel } from '../Interfaces/ISymbolModel'; -import { TryMigration } from './migration'; +import { findContainerById, MakeIterator } from './itertools'; +import { IEditorState } from '../Components/Editor/Editor'; /** * Revive the Editor state @@ -12,54 +8,47 @@ import { TryMigration } from './migration'; */ export function Revive(editorState: IEditorState): void { const history = editorState.history; - - // Restore the parents and the selected container - ReviveHistory(history); - - // Update the editor state to the current version - TryMigration(editorState); -} - -export function ReviveHistory(history: IHistoryState[]): void { for (const state of history) { - ReviveState(state); + if (state.MainContainer === null || state.MainContainer === undefined) { + continue; + } + + const it = MakeIterator(state.MainContainer); + for (const container of it) { + const parentId = container.properties.parentId; + if (parentId === null) { + container.parent = null; + continue; + } + const parent = findContainerById(state.MainContainer, parentId); + if (parent === undefined) { + continue; + } + container.parent = parent; + } + + const selected = findContainerById(state.MainContainer, state.SelectedContainerId); + if (selected === undefined) { + state.SelectedContainer = null; + continue; + } + state.SelectedContainer = selected; } } -export function ReviveState(state: IHistoryState): void { - if (state.mainContainer === null || state.mainContainer === undefined) { - return; - } - - const symbols: Array<{ Key: string, Value: ISymbolModel }> = (state.symbols) as any; - state.symbols = new Map(symbols.map(({ Key, Value }) => [Key, Value])); - for (const symbol of state.symbols.values()) { - symbol.linkedContainers = new Set(symbol.linkedContainers); - } - - const containers: Array<{ Key: string, Value: IContainerModel }> = (state.containers) as any; - state.containers = new Map(containers.map(({ Key, Value }) => [Key, Value])); -} - -export function GetCircularReplacer(): ( - key: any, - value: object | Map | null -) => object | null | undefined { +export const getCircularReplacer = (): (key: any, value: object | null) => object | null | undefined => { + const seen = new WeakSet(); return (key: any, value: object | null) => { - if (key === 'containers') { - return [...(value as Map).entries()] - .map(([Key, Value]: [string, any]) => ({ Key, Value })); + if (key === 'parent') { + return; } - if (key === 'symbols') { - return [...(value as Map).entries()] - .map(([Key, Value]: [string, any]) => ({ Key, Value })); + if (typeof value === 'object' && value !== null) { + if (seen.has(value)) { + return; + } + seen.add(value); } - - if (key === 'linkedContainers') { - return Array.from(value as Set); - } - return value; }; -} +}; diff --git a/src/utils/simplex.ts b/src/utils/simplex.ts deleted file mode 100644 index 4a5965c..0000000 --- a/src/utils/simplex.ts +++ /dev/null @@ -1,258 +0,0 @@ -/** - * @module {Simplex} Apply the simplex algorithm - * https://www.imse.iastate.edu/files/2015/08/Explanation-of-Simplex-Method.docx - */ - -/** - * Apply the simplex algorithms to the minimum widths - * - * Note: Some optimizations were made to improve performance in order to solve - * with max(minWidths). In point of fact most coefficient are equal to 1 or -1. - * - * Let the following format be the linear problem : - * x >= b are the minimum widths constraint - * sum(x) <= b is the maximum width constraint - * s are slack variables - * @param minWidths - * @param requiredMaxWidth - * @returns - */ -export function Simplex(minWidths: number[], maxWidths: number[], requiredMaxWidth: number): number[] { - /// 1) standardized the equations - // add the min widths constraints - const constraints = minWidths.map(minWidth => minWidth * -1); - - /// 2) Create the initial matrix - // get row length (nVariables + nConstraints + 1 (z) + 1 (b)) - const nVariables = minWidths.length; - const nConstraints = constraints.length; - const rowlength = - minWidths.length + // min constraints - maxWidths.length + // max constraints - nConstraints + 1 + // slack variables - 1 + // z - 1; // b - const matrix = GetInitialMatrix(constraints, maxWidths, requiredMaxWidth, rowlength); - - /// Apply the algorithm - const finalMatrix = ApplyMainLoop(matrix, rowlength); - - // 5) read the solutions - const solutions: number[] = GetSolutions(nVariables + nConstraints + 1, finalMatrix); - return solutions; -} - -/** - * Specific to min widths algorithm - * Get the initial matrix from the maximum constraints - * and the number of variables - * @param minConstraints - * @param rowlength - * @param nVariables - * @returns - */ -function GetInitialMatrix( - minConstraints: number[], - maxConstraints: number[], - objectiveConstraint: number, - rowlength: number -): number[][] { - const nVariables = maxConstraints.length; - const constraints = minConstraints.concat(maxConstraints); - constraints.push(objectiveConstraint); - const matrix = constraints.map((constraint, index) => { - const row: number[] = Array(rowlength).fill(0); - - // insert the variable coefficient a of a*x - if (index < nVariables) { - // insert the the variable coefficient of the minimum/maximum widths constraints (negative identity matrix) - row[index] = -1; - } else if (index < (2 * nVariables)) { - row[index - (nVariables)] = 1; - } else { - // insert the the variable coefficient of the maximum desired width constraint - row.fill(1, 0, nVariables); - } - - // insert the slack variable coefficient b of b*s (identity matrix) - row[index + nVariables] = 1; - - // insert the constraint coefficient (b) - row[rowlength - 1] = constraint; - return row; - }); - - // add objective function in the last row - const row: number[] = Array(rowlength).fill(0); - - // insert z coefficient - row[rowlength - 2] = 1; - - // insert variable coefficients - row.fill(-1, 0, nVariables); - matrix.push(row); - return matrix; -} - -function GetAllIndexes(arr: number[], val: number): number[] { - const indexes = []; let i = -1; - while ((i = arr.indexOf(val, i + 1)) !== -1) { - indexes.push(i); - } - return indexes; -} - -/** - * Apply the main loop of the simplex algorithm and return the final matrix: - * - While the last row of the matrix has negative values : - * - 1) find the column with the smallest negative coefficient in the last row - * - 2) in that column, find the pivot by selecting the row with the smallest ratio - * such as ratio = constraint of last column / coefficient of the selected row of the selected column - * - 3) create the new matrix such as: - * - 4) the selected column must have 1 in the pivot and zeroes in the other rows - * - 5) in the selected rows other columns (other than the selected column) - * must be divided by that pivot: coef / pivot - * - 6) for the others cells, apply the pivot: - * new value = (-coefficient in the old col) * (coefficient in the new row) + old value - * - 7) if in the new matrix there are still negative values in the last row, - * redo the algorithm with the new matrix as the base matrix - * - 8) otherwise returns the basic variable such as - * a basic variable is defined by a single 1 and only zeroes in its column - * other variables are equal to zeroes - * @param oldMatrix - * @param rowlength - * @returns - */ -function ApplyMainLoop(oldMatrix: number[][], rowlength: number): number[][] { - let matrix = oldMatrix; - const maxTries = oldMatrix.length * 2; - let tries = maxTries; - const indexesTried: Record = {}; - while (matrix[matrix.length - 1].some((v: number) => v < 0) && tries > 0) { - // 1) find the index with smallest coefficient (O(n)+) - const lastRow = matrix[matrix.length - 1]; - const min = Math.min(...lastRow); - const indexes = GetAllIndexes(lastRow, min); - // to avoid infinite loop try to select the least used selected index - const pivotColIndex = GetLeastUsedIndex(indexes, indexesTried); - // record the usage of index by incrementing - indexesTried[pivotColIndex] = indexesTried[pivotColIndex] !== undefined - ? indexesTried[pivotColIndex] + 1 - : 1; - - // 2) find the smallest non negative non null ratio bi/xij (O(m)) - const ratios = []; - for (let i = 0; i <= matrix.length - 2; i++) { - const coefficient = matrix[i][pivotColIndex]; - const constraint = matrix[i][rowlength - 1]; - if (coefficient === 0) { - ratios.push(Infinity); - continue; - } - const ratio = constraint / coefficient; - if (ratio < 0) { - ratios.push(Infinity); - continue; - } - ratios.push(ratio); - } - const minRatio = Math.min(...ratios); - const pivotRowIndex = ratios.indexOf(minRatio); // i - - /// Init the new matrix - const newMatrix: number[][] = structuredClone(matrix); - const pivot = matrix[pivotRowIndex][pivotColIndex]; - - // 3) apply on the pivot row the inverse of the pivot - const newPivotRow = newMatrix[pivotRowIndex]; - newPivotRow.forEach((coef, colIndex) => { - newPivotRow[colIndex] = coef / pivot; - }); - - // 4) update all values - newMatrix.forEach((row, rowIndex) => { - if (rowIndex === pivotRowIndex) { - return; - } - - row.forEach((coef, colIndex) => { - if (colIndex === pivotColIndex) { - // set zeroes on pivot col - row[colIndex] = 0; - return; - } - - // update value = old value + ((-old coef of pivot column) * (new coef of pivot row)) - row[colIndex] = coef + (-matrix[rowIndex][pivotColIndex] * newMatrix[pivotRowIndex][colIndex]); - }); - }); - - matrix = newMatrix; - tries--; - } - - if (tries === 0) { - console.table(matrix); - throw new Error('[Flex] Simplexe: Could not find a solution'); - } - console.debug(`Simplex was solved in ${maxTries - tries} tries`); - return matrix; -} - -/** - * Get the solutions from the final matrix - * - * @param {number} nCols Number of solutions that you want to obtain - * @param {number[][]} finalMatrix Final matrix after the algorithm is applied - * @return {*} {number[]} A list of solutions of the final matrix - */ -function GetSolutions(nCols: number, finalMatrix: number[][]): number[] { - const solutions: number[] = Array(nCols).fill(0); - for (let i = 0; i < nCols; i++) { - const counts: Record = {}; - const col: number[] = []; - for (let j = 0; j < finalMatrix.length; j++) { - const row = finalMatrix[j]; - counts[row[i]] = counts[row[i]] !== undefined - ? counts[row[i]] + 1 - : 1; - col.push(row[i]); - } - - // a basic variable has a single 1 and only zeroes in the column - const nRows = finalMatrix.length; - const isBasic = counts[1] === 1 && counts[0] === (nRows - 1); - if (isBasic) { - const oneIndex = col.indexOf(1); - const row = finalMatrix[oneIndex]; - solutions[i] = row[row.length - 1]; - } else { - solutions[i] = 0; - } - } - return solutions; -} - -/** - * Returns the least used index from the indexesTried - * @param indexes Indexes of all occurences - * @param indexesTried Record of indexes. Count the number of times the index was used. - * @returns The least used index - */ -function GetLeastUsedIndex(indexes: number[], indexesTried: Record): number { - let minUsed = Infinity; - let minIndex = -1; - for (const index of indexes) { - const occ = indexesTried[index]; - if (occ === undefined) { - minIndex = index; - break; - } - - if (occ < minUsed) { - minIndex = index; - minUsed = occ; - } - } - return minIndex; -} diff --git a/src/utils/stringtools.ts b/src/utils/stringtools.ts index bbbf40e..349e34a 100644 --- a/src/utils/stringtools.ts +++ b/src/utils/stringtools.ts @@ -1,12 +1,6 @@ -export function TruncateString(str: string, num: number): string { +export function truncateString(str: string, num: number): string { if (str.length <= num) { return str; } return `${str.slice(0, num)}...`; } - -export function Camelize(str: string): any { - return str.split('-').map((word, index) => index > 0 - ? word.charAt(0).toUpperCase() + word.slice(1) - : word).join(''); -} diff --git a/src/utils/svg.ts b/src/utils/svg.ts deleted file mode 100644 index 92e7c47..0000000 --- a/src/utils/svg.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { PositionReference } from '../Enums/PositionReference'; - -// TODO: Big refactoring -/** - * TODO: - * All of these methods should have been - * inside ContainerModel class - * But because of serialization, the methods are lost. - * Rather than adding more functions to this class, - * it is better to fix serialization with the reviver. - */ - -export function TransformX(x: number, width: number, positionReference = PositionReference.TopLeft): number { - let transformedX = x; - switch (positionReference) { - case PositionReference.TopCenter: - case PositionReference.CenterCenter: - case PositionReference.BottomCenter: - transformedX += width / 2; - break; - case PositionReference.TopRight: - case PositionReference.CenterRight: - case PositionReference.BottomRight: - transformedX += width; - break; - } - - return transformedX; -} - -export function RestoreX(x: number, width: number, positionReference = PositionReference.TopLeft): number { - let transformedX = x; - switch (positionReference) { - case PositionReference.TopCenter: - case PositionReference.CenterCenter: - case PositionReference.BottomCenter: - transformedX -= width / 2; - break; - case PositionReference.TopRight: - case PositionReference.CenterRight: - case PositionReference.BottomRight: - transformedX -= width; - break; - } - - return transformedX; -} - -export function TransformY(y: number, height: number, xPositionReference = PositionReference.TopLeft): number { - let transformedY = y; - switch (xPositionReference) { - case PositionReference.CenterLeft: - case PositionReference.CenterCenter: - case PositionReference.CenterRight: - transformedY += height / 2; - break; - case PositionReference.BottomLeft: - case PositionReference.BottomCenter: - case PositionReference.BottomRight: - transformedY += height; - break; - } - - return transformedY; -} - -export function RestoreY(y: number, height: number, positionReference = PositionReference.TopLeft): number { - let transformedY = y; - switch (positionReference) { - case PositionReference.CenterLeft: - case PositionReference.CenterCenter: - case PositionReference.CenterRight: - transformedY -= height / 2; - break; - case PositionReference.BottomLeft: - case PositionReference.BottomCenter: - case PositionReference.BottomRight: - transformedY -= height; - break; - } - - return transformedY; -} - -export function ApplyMargin( - x: number, - y: number, - width: number, - height: number, - left?: number, - bottom?: number, - top?: number, - right?: number -): { x: number, y: number, width: number, height: number } { - left = left ?? 0; - right = right ?? 0; - bottom = bottom ?? 0; - top = top ?? 0; - x = ApplyXMargin(x, left); - y = ApplyXMargin(y, top); - width = ApplyWidthMargin(width, left, right); - height = ApplyWidthMargin(height, top, bottom); - return { x, y, width, height }; -} - -export function RemoveMargin( - x: number, - y: number, - width: number, - height: number, - left?: number, - bottom?: number, - top?: number, - right?: number -): { x: number, y: number, width: number, height: number } { - left = left ?? 0; - right = right ?? 0; - bottom = bottom ?? 0; - top = top ?? 0; - x = RemoveXMargin(x, left); - y = RemoveXMargin(y, top); - width = RemoveWidthMargin(width, left, right); - height = RemoveWidthMargin(height, top, bottom); - return { x, y, width, height }; -} - -export function ApplyXMargin(x: number, left?: number): number { - left = left ?? 0; - x += left; - return x; -} - -export function RemoveXMargin(x: number, left?: number): number { - left = left ?? 0; - x -= left; - return x; -} - -export function ApplyWidthMargin(width: number, left?: number, right?: number): number { - left = left ?? 0; - right = right ?? 0; - width -= (left + right); - return width; -} - -export function RemoveWidthMargin(width: number, left?: number, right?: number): number { - left = left ?? 0; - right = right ?? 0; - width += (left + right); - return width; -} diff --git a/src/utils/test-utils.tsx b/src/utils/test-utils.tsx index 29f5f4d..139850e 100644 --- a/src/utils/test-utils.tsx +++ b/src/utils/test-utils.tsx @@ -1,21 +1,20 @@ /* eslint-disable import/export */ -import type * as React from 'react'; -import { cleanup, render, type RenderResult } from '@testing-library/react'; +import * as React from 'react'; +import { cleanup, render, RenderResult } from '@testing-library/react'; import { afterEach } from 'vitest'; afterEach(() => { cleanup(); }); -function CustomRender(ui: React.ReactElement, options = {}): RenderResult { - return render(ui, { +const customRender = (ui: React.ReactElement, options = {}): RenderResult => + render(ui, { // wrap provider(s) here if needed wrapper: ({ children }) => children, ...options }); -} export * from '@testing-library/react'; export { default as userEvent } from '@testing-library/user-event'; // override render export -export { CustomRender as render }; +export { customRender as render }; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 52a1895..9de8372 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,15 +1,10 @@ -// eslint-disable-next-line @typescript-eslint/triple-slash-reference /// interface ImportMetaEnv { - readonly VITE_API_FETCH_URL: string - readonly VITE_API_SET_CONTAINER_LIST_URL: string - readonly VITE_API_GET_FEEDBACK_URL: string + readonly VITE_API_URL: string // more env variables... } interface ImportMeta { readonly env: ImportMetaEnv } - -declare const APP_VERSION: string; diff --git a/test-server/http.js b/test-server/http.js index 9c64416..c4f3238 100644 --- a/test-server/http.js +++ b/test-server/http.js @@ -1,73 +1,51 @@ -import http from 'http'; -const host = 'localhost'; -const port = 5000; +// http.js +import { serve } from 'bun'; -const requestListener = async (request, response) => { - response.setHeader('Access-Control-Allow-Origin', '*'); - response.setHeader('Access-Control-Allow-Headers', '*'); - response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); - if (request.method === 'POST') { - response.setHeader('Content-Type', 'application/json'); - const url = request.url; - let json; - if (url === '/SetContainerList') { - const buffers = []; - for await (const chunk of request) { - buffers.push(chunk); +serve({ + port: 5000, + async fetch(request) { + console.log(`${request.method}: ${request.url}`); + if (request.method === 'POST') { + const url = new URL(request.url); + let json; + if (url.pathname === '/GetSVGLayoutConfiguration') { + json = GetSVGLayoutConfiguration(); + } else if (url.pathname === '/ApplicationState') { + const bodyParsed = await request.json(); + console.log(bodyParsed); + switch (bodyParsed.Action) { + case 'FillHoleWithChassis': + json = FillHoleWithChassis(bodyParsed); + break; + case 'SplitRemplissage': + json = SplitRemplissage(bodyParsed); + break; + default: + break; + } + } else { + // TODO: Return 404 rather than this + json = GetSVGLayoutConfiguration(); } - const data = Buffer.concat(buffers).toString(); - const bodyParsed = JSON.parse(data); - console.log(bodyParsed); - switch (bodyParsed.Action.Action) { - case 'FillHoleWithChassis': - json = FillHoleWithChassis(bodyParsed); - break; - case 'Insert': - json = Insert(bodyParsed); - break; - case 'SplitRemplissage': - json = SplitRemplissage(bodyParsed); - break; - case 'SplitRemplissageParent': - json = SplitRemplissage(bodyParsed); - break; - default: - break; - } - } else if (url === '/GetFeedback') { - const buffers = []; - for await (const chunk of request) { - buffers.push(chunk); - } - const data = Buffer.concat(buffers).toString(); - const bodyParsed = JSON.parse(data); - console.log(bodyParsed); - json = { - messages: [ - { - text: `${new Date()}`, - type: 3 - } - ] - } - } else { - json = GetSVGLayoutConfiguration(); + return new Response(JSON.stringify(json), { + status: 200, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*' + } + }); } - response.writeHead(200); - return response.end(JSON.stringify(json)); - } else if (request.method === 'OPTIONS') { - response.writeHead(200); - return response.end(); + + return new Response('Welcome to Bun!', { + status: 200, + headers: { + 'Content-Type': 'text/plain', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Headers': '*' + } + }); } - - response.setHeader('Content-Type', 'text/plain'); - response.writeHead(200); - return response.end('Hello world'); -}; - -const server = http.createServer(requestListener); -server.listen(port, host, () => { - console.log(`Server is running on http://${host}:${port}`); }); const GetSVGLayoutConfiguration = () => { @@ -75,307 +53,66 @@ const GetSVGLayoutConfiguration = () => { AvailableContainers: [ { Type: 'Chassis', - DisplayedText: 'Chassis horizontal', - MaxHeight: 200, - DefaultChildType: 'Trou', + Width: 500, Style: { - fillOpacity: 1, - strokeWidth: 2, - stroke: '#ff0000', - fill: '#d3c9b7', - }, - IsFlex: true, - Category: "Stuff" - }, - { - Type: 'ChassisVertical', - Orientation: 1, - DisplayedText: 'Chassis vertical', - MaxWidth: 200, - DefaultChildType: 'Trou', - Style: { - fillOpacity: 1, - strokeWidth: 2, - stroke: '#ff0000', - fill: '#d3c9b7', - }, - IsFlex: true, - Category: "Stuff" + fillOpacity: 0, + borderWidth: 2, + stroke: 'red' + } }, { Type: 'Trou', - Blacklist: ["Chassis"], - Margin: { - left: 10, - bottom: 10, - top: 10, - right: 10, - }, - DefaultChildType: 'Remplissage', + Width: 300, Style: { - fillOpacity: 1, - strokeWidth: 2, - stroke: '#00ff00', - fill: '#ffffff' - }, - Category: "Stuff", - IsFlex: true, - Actions: [ - { - Id: "Insert", - Action: "Insert", - Label: "Insert containers", - Description: "Insert containers", - CustomLogo: { - Base64Image: null, - Name: 'Image1', - Svg: null, - Url: "" - }, - AddingBehavior: 1 - }, - { - Id: "SplitRemplissage", - Action: "SplitRemplissage", - Label: "Diviser le remplissage en insérant un montant", - Description: "Diviser le remplissage en insérant un montant", - CustomLogo: { - Base64Image: null, - Name: 'Image1', - Svg: null, - Url: "" - }, - AddingBehavior: 2 - }, - { - Id: "SplitRemplissageParent", - Action: "SplitRemplissageParent", - Label: "Diviser le remplissage en insérant un montant", - Description: "Diviser le remplissage en insérant un montant", - CustomLogo: { - Base64Image: null, - Name: 'Image1', - Svg: null, - Url: "" - }, - AddingBehavior: 3 - } - ], - }, - { - Type: 'Remplissage', - Category: "Other stuff", - CustomSVG: ` - - - - - ` - , - IsFlex: true, - Actions: [ - { - Id: "SplitRemplissage", - Action: "SplitRemplissage", - Label: "Diviser le remplissage", - Description: "Diviser le remplissage en insérant un montant", - CustomLogo: { - Base64Image: null, - Name: 'Image1', - Svg: null, - Url: "" - }, - AddingBehavior: 2 - }, - { - Id: "SplitRemplissageParent", - Action: "SplitRemplissageParent", - Label: "Diviser le parent", - Description: "Diviser le remplissage en insérant un montant", - CustomLogo: { - Base64Image: null, - Name: 'Image1', - Svg: null, - Url: "" - }, - AddingBehavior: 3 - } - ], - Style: { - fillOpacity: 1, - strokeWidth: 1, - fill: '#bfdbfe' - }, - UserData: { - styleLine: { - transform: "scaleY(0.5) translateY(100%)", - transformBox: "fill-box" - } + fillOpacity: 0, + borderWidth: 2, + stroke: 'green' } }, { Type: 'Montant', - Width: 10, - PositionReference: 4, - MarkPositionToDimensionBorrower: [0], + Width: 100, Style: { fillOpacity: 0, - strokeWidth: 2, - stroke: '#713f12', - fill: '#713f12', - } - }, - { - Type: 'Traverse', - Height: 10, - PositionReference: 4, - Orientation: 1, - MarkPositionToDimensionBorrower: [1], - Style: { - fillOpacity: 0, - strokeWidth: 2, - stroke: '#6517fa', - fill: '#6517fa', - } - }, - { - Type: 'Dilatation', - Width: 4, - PositionReference: 1, - MarkPositionToDimensionBorrower: [0], - Style: { - fillOpacity: 0, - strokeWidth: 2, - stroke: '#713f12', - fill: '#713f12', - } - }, - { - Type: '200', - MaxWidth: 500, - MinWidth: 200, - IsFlex: true, - Style: { - fillOpacity: 1, - strokeWidth: 2, - stroke: '#0000ff', - fill: '#0000ff', - } - }, - { - Type: '400', - MaxWidth: 500, - MinWidth: 400, - IsFlex: true, - Style: { - fillOpacity: 1, - strokeWidth: 2, - stroke: '#ff0000', - fill: '#ff0000', + borderWidth: 2, + stroke: 'blue', + transform: 'translateX(-50%)', + transformOrigin: 'center', + transformBox: 'fill-box' } } ], AvailableSymbols: [ { - DisplayedText: 'Nom du Symbol', - Width: 32, - Height: 32, + Height: 0, Image: { Base64Image: null, - Name: 'Image1', + Name: null, Svg: null, Url: 'https://www.manutan.fr/img/S/GRP/ST/AIG3930272.jpg' }, - Name: 'Poteau CenterCenter', - PositionReference: 4, - AssociatedContainer: { - Type: 'Montant' - } + Name: 'Poteau structure', + Width: 0, + XPositionReference: 1 }, { - Width: 32, - Height: 32, + Height: 0, Image: { Base64Image: null, - Name: 'ArrowTopLeft', - Svg: null, - Url: './images/arrow-down.svg' - }, - Name: 'ArrowTopLeft', - PositionReference: 0 - }, - { - Width: 32, - Height: 32, - Image: { - Base64Image: null, - Name: 'ArrowTopRight', - Svg: null, - Url: './images/arrow-down.svg' - }, - Name: 'ArrowTopRight', - PositionReference: 2 - }, - { - Width: 32, - Height: 32, - Image: { - Base64Image: null, - Name: 'ArrowCenterRight', - Svg: null, - Url: './images/arrow-down.svg' - }, - Name: 'ArrowCenterRight', - PositionReference: 5 - }, - { - Width: 32, - Height: 32, - Image: { - Base64Image: null, - Name: 'ArrowBottomRight', - Svg: null, - Url: './images/arrow-down.svg' - }, - Name: 'ArrowBottomRight', - PositionReference: 8 - }, - { - Width: 32, - Height: 32, - Image: { - Base64Image: null, - Name: 'Image2', + Name: null, Svg: null, Url: 'https://e7.pngegg.com/pngimages/647/127/png-clipart-svg-working-group-information-world-wide-web-internet-structure.png' }, Name: 'Joint de structure', - PositionReference: 0 + Width: 0, + XPositionReference: 0 } ], - Categories: [ - { - Type: "Stuff", - DisplayedText: "Stuff made here" - }, - { - Type: "Other stuff", - DisplayedText: "Stuff not made here" - } - ], - Patterns: [], MainContainer: { - Type: 'main', - Width: 800, Height: 200, - Orientation: 0, - Style: { - stroke: '#000000', - strokeWidth: 2, - fillOpacity: 0 - } + Width: 1000 } - } + }; }; const FillHoleWithChassis = (request) => { @@ -395,49 +132,20 @@ const FillHoleWithChassis = (request) => { } } return { - Containers: lstModels + ApplicationState: { + Containers: lstModels + } }; }; -const SplitRemplissage = () => { +const SplitRemplissage = (request) => { const lstModels = [ - { - Type: 'Remplissage', - IsFlex: true - }, - { - Type: 'Montant' - }, - { - Type: 'Remplissage', - IsFlex: true - }, + { Type: 'Remplissage' }, + { Type: 'Montant' }, + { Type: 'Remplissage' } ]; return { - Containers: lstModels + ApplicationState: { Containers: lstModels } }; }; - - -const Insert = () => { - const lstModels = [ - { - Type: 'Remplissage', - IsFlex: true - }, - { - Type: 'Montant', - X: 5, - IsAnchor: true - }, - { - Type: 'Remplissage', - IsFlex: true - }, - ]; - - return { - Containers: lstModels - }; -}; \ No newline at end of file diff --git a/test-server/node-http.js b/test-server/node-http.js new file mode 100644 index 0000000..e6c0d74 --- /dev/null +++ b/test-server/node-http.js @@ -0,0 +1,315 @@ +import http from 'http'; +const host = 'localhost'; +const port = 5000; + +const requestListener = async(request, response) => { + response.setHeader('Access-Control-Allow-Origin', '*'); + response.setHeader('Access-Control-Allow-Headers', '*'); + response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); + if (request.method === 'POST') { + response.setHeader('Content-Type', 'application/json'); + const url = request.url; + let json; + if (url === '/ApplicationState') { + const buffers = []; + for await (const chunk of request) { + buffers.push(chunk); + } + const data = Buffer.concat(buffers).toString(); + const bodyParsed = JSON.parse(data); + console.log(bodyParsed); + switch (bodyParsed.Action) { + case 'FillHoleWithChassis': + json = FillHoleWithChassis(bodyParsed); + break; + case 'SplitRemplissage': + json = SplitRemplissage(bodyParsed); + break; + default: + break; + } + } else { + // TODO: Return 404 rather than this + json = GetSVGLayoutConfiguration(); + } + response.writeHead(200); + return response.end(JSON.stringify(json)); + } else if (request.method === 'OPTIONS') { + response.writeHead(200); + return response.end(); + } + + response.setHeader('Content-Type', 'text/plain'); + response.writeHead(200); + return response.end('Hello world'); +}; + +const server = http.createServer(requestListener); +server.listen(port, host, () => { + console.log(`Server is running on http://${host}:${port}`); +}); + +const GetSVGLayoutConfiguration = () => { + return { + AvailableContainers: [ + { + BodyColor: null, + BorderColor: '#ff0000', + BorderWidth: 48, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 3000, + MinHeight: 0, + MinWidth: 500, + Type: 'Chassis', + TypeChildContainerDefault: 'Trou', + Width: 500, + XPositionReference: 0, + Style: { + fillOpacity: 0, + borderWidth: 2, + stroke: 'red' + } + }, + { + BodyColor: null, + BorderColor: '#FFFFFF', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Trou', + TypeChildContainerDefault: 'Remplissage', + Width: 0, + XPositionReference: 0 + }, + { + BodyColor: '#99C8FF', + BorderColor: '#00FF00', + BorderWidth: 0, + ContainerActions: [ + { + Action: 'SplitRemplissage', + AddingBehavior: 0, + CustomLogo: { + Base64Image: null, + Name: null, + Svg: null, + Url: '' + }, + Description: 'Diviser le remplissage en insérant un montant', + Id: null, + Label: 'Diviser le remplissage' + } + ], + ContainerDimensionning: { + DimensionningStyle: 1, + ShowDimensionning: false, + ShowLabel: false + }, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Remplissage', + TypeChildContainerDefault: null, + Width: 0, + XPositionReference: 0 + }, + { + BodyColor: '#FFA947', + BorderColor: '#FFA947', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Montant', + TypeChildContainerDefault: null, + Width: 50, + XPositionReference: 1 + }, + { + BodyColor: '#FFA3D1', + BorderColor: '#FF6DE6', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: { + DimensionningStyle: 0, + ShowDimensionning: false, + ShowLabel: false + }, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Ouverture', + TypeChildContainerDefault: null, + Width: 0, + XPositionReference: 0 + }, + { + BodyColor: '#000000', + BorderColor: null, + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: { + DimensionningStyle: 0, + ShowDimensionning: false, + ShowLabel: false + }, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Dilatation', + TypeChildContainerDefault: null, + Width: 8, + XPositionReference: 0 + }, + { + BodyColor: '#dee2e4', + BorderColor: '#54616c', + BorderWidth: 0, + ContainerActions: [ + { + Action: 'FillHoleWithChassis', + AddingBehavior: 1, + CustomLogo: { + Base64Image: null, + Name: null, + Svg: null, + Url: '' + }, + Description: 'Remplir le trou avec des châssis', + Id: null, + Label: 'Calepiner' + } + ], + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 0, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: '', + TypeChildContainerDefault: null, + Width: 0, + XPositionReference: 0 + } + ], + AvailableSymbols: [ + { + Height: 0, + Image: { + Base64Image: null, + Name: null, + Svg: null, + Url: 'https://www.manutan.fr/img/S/GRP/ST/AIG3930272.jpg' + }, + Name: 'Poteau structure', + Width: 0, + XPositionReference: 1 + }, + { + Height: 0, + Image: { + Base64Image: null, + Name: null, + Svg: null, + Url: 'https://e7.pngegg.com/pngimages/647/127/png-clipart-svg-working-group-information-world-wide-web-internet-structure.png' + }, + Name: 'Joint de structure', + Width: 0, + XPositionReference: 0 + } + ], + MainContainer: { + BodyColor: null, + BorderColor: '#FFFFFF', + BorderWidth: 0, + ContainerActions: null, + ContainerDimensionning: null, + DefaultChildrenContainers: null, + Height: 200, + IsPositionFixed: false, + IsWidthFixed: false, + MaxHeight: 0, + MaxWidth: 0, + MinHeight: 0, + MinWidth: 0, + Type: 'Trou', + TypeChildContainerDefault: null, + Width: 1000, + XPositionReference: 0 + } + }; +}; + +const FillHoleWithChassis = (request) => { + const maxWidthChassis = 3000; + const nbChassis = Math.ceil(request.ContainerAction.Width / maxWidthChassis); + const lstModels = []; + for (let i = 0; i <= nbChassis; i++) { + if (i === 1 && request.ContainerAction.ExistOnBefore) { + lstModels.push({ Type: 'Dilatation' }); + } + lstModels.push({ Type: 'Chassis' }); + if (i < nbChassis) { + lstModels.push({ Type: 'Dilatation' }); + } + if (i === nbChassis && request.ContainerAction.ExistOnAfter) { + lstModels.push({ Type: 'Dilatation' }); + } + } + return { + ApplicationState: { + Containers: lstModels + } + }; +}; + +const SplitRemplissage = (request) => { + const lstModels = [ + { Type: 'Remplissage' }, + { Type: 'Montant' }, + { Type: 'Remplissage' } + ]; + + return { + ApplicationState: { Containers: lstModels } + }; +}; diff --git a/tsconfig.json b/tsconfig.json index 24da452..034ee0e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2021", + "target": "ESNext", "useDefineForClassFields": true, "lib": ["DOM", "DOM.Iterable", "ESNext"], "allowJs": false, @@ -17,10 +17,6 @@ "jsx": "react-jsx" }, "include": ["src"], - "exclude": [ - "test-server", - "public/**/*", - "src/dts/**/*" - ], + "exclude": ["test-server"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/vite.config.ts b/vite.config.ts index d6fa774..6549182 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,13 +1,7 @@ import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react-swc'; +import react from '@vitejs/plugin-react'; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [ - react() - ], - base: './', - define: { - APP_VERSION: JSON.stringify(process.env.npm_package_version) - } + plugins: [react()] }); diff --git a/vitest.config.ts b/vitest.config.ts index 0b52356..4f85a7e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,5 +1,5 @@ /// -import { defineConfig } from 'vitest/config'; +import { defineConfig } from 'vite'; export default defineConfig({ test: { @@ -12,8 +12,5 @@ export default defineConfig({ deps: { registerNodeLoader: false } - }, - define: { - APP_VERSION: JSON.stringify(process.env.npm_package_version) } });