From 424455661039e38184746613e6df57eb5f3f52c4 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 26 Mar 2023 19:38:03 -0500 Subject: [PATCH 001/254] Install and configure Redux Toolkit. --- client/middleware.js | 5 + client/modules/App/App.jsx | 6 +- client/modules/IDE/selectors/collections.js | 2 +- client/modules/IDE/selectors/projects.js | 2 +- client/modules/IDE/selectors/users.js | 2 +- client/store.js | 42 +- package-lock.json | 966 +++++++++++--------- package.json | 8 +- 8 files changed, 555 insertions(+), 478 deletions(-) create mode 100644 client/middleware.js diff --git a/client/middleware.js b/client/middleware.js new file mode 100644 index 0000000000..0b4230ec9d --- /dev/null +++ b/client/middleware.js @@ -0,0 +1,5 @@ +import { createListenerMiddleware } from '@reduxjs/toolkit'; + +const listenerMiddleware = createListenerMiddleware(); + +export default listenerMiddleware; diff --git a/client/modules/App/App.jsx b/client/modules/App/App.jsx index 1f41446a79..10286ac09a 100644 --- a/client/modules/App/App.jsx +++ b/client/modules/App/App.jsx @@ -1,7 +1,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import { connect } from 'react-redux'; -import getConfig from '../../utils/getConfig'; +import { showReduxDevTools } from '../../store'; import DevTools from './components/DevTools'; import { setPreviousPath } from '../IDE/actions/ide'; import { setLanguage } from '../IDE/actions/preferences'; @@ -51,9 +51,7 @@ class App extends React.Component { return (
- {this.state.isMounted && - !window.devToolsExtension && - getConfig('NODE_ENV') === 'development' && } + {this.state.isMounted && showReduxDevTools() && } {this.props.children}
); diff --git a/client/modules/IDE/selectors/collections.js b/client/modules/IDE/selectors/collections.js index 207dce39a9..136a0a7920 100644 --- a/client/modules/IDE/selectors/collections.js +++ b/client/modules/IDE/selectors/collections.js @@ -1,4 +1,4 @@ -import { createSelector } from 'reselect'; +import { createSelector } from '@reduxjs/toolkit'; import differenceInMilliseconds from 'date-fns/differenceInMilliseconds'; import find from 'lodash/find'; import orderBy from 'lodash/orderBy'; diff --git a/client/modules/IDE/selectors/projects.js b/client/modules/IDE/selectors/projects.js index 08701d211c..d5ba29a268 100644 --- a/client/modules/IDE/selectors/projects.js +++ b/client/modules/IDE/selectors/projects.js @@ -1,4 +1,4 @@ -import { createSelector } from 'reselect'; +import { createSelector } from '@reduxjs/toolkit'; import differenceInMilliseconds from 'date-fns/differenceInMilliseconds'; import orderBy from 'lodash/orderBy'; import { DIRECTION } from '../actions/sorting'; diff --git a/client/modules/IDE/selectors/users.js b/client/modules/IDE/selectors/users.js index 4086348041..15f1f141bb 100644 --- a/client/modules/IDE/selectors/users.js +++ b/client/modules/IDE/selectors/users.js @@ -1,4 +1,4 @@ -import { createSelector } from 'reselect'; +import { createSelector } from '@reduxjs/toolkit'; import getConfig from '../../../utils/getConfig'; const getAuthenticated = (state) => state.user.authenticated; diff --git a/client/store.js b/client/store.js index 4cec9419b7..12beed2e12 100644 --- a/client/store.js +++ b/client/store.js @@ -1,30 +1,36 @@ -import { createStore, applyMiddleware, compose } from 'redux'; -import thunk from 'redux-thunk'; +import { configureStore } from '@reduxjs/toolkit'; +import listenerMiddleware from './middleware'; import DevTools from './modules/App/components/DevTools'; import rootReducer from './reducers'; import { clearState, loadState } from './persistState'; import getConfig from './utils/getConfig'; -export default function configureStore(initialState) { - const enhancers = [applyMiddleware(thunk)]; - - if (getConfig('CLIENT') && getConfig('NODE_ENV') === 'development') { - // Enable DevTools only when rendering on client and during development. - enhancers.push( - window.devToolsExtension - ? window.devToolsExtension() - : DevTools.instrument() - ); - } +// Enable DevTools only when rendering on client and during development. +// Display the dock monitor only if no browser extension is found. +export function showReduxDevTools() { + return ( + getConfig('CLIENT') && + getConfig('NODE_ENV') === 'development' && + !window.__REDUX_DEVTOOLS_EXTENSION__ + ); +} +export default function setupStore(initialState) { const savedState = loadState(); clearState(); - const store = createStore( - rootReducer, - savedState != null ? savedState : initialState, - compose(...enhancers) - ); + const store = configureStore({ + reducer: rootReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + thunk: true, + serializableCheck: true, + // TODO: enable immutableCheck once the mutations are fixed. + immutableCheck: false + }).concat(listenerMiddleware.middleware), + preloadedState: savedState || initialState, + enhancers: showReduxDevTools() ? [DevTools.instrument()] : [] + }); if (module.hot) { // Enable Webpack hot module replacement for reducers diff --git a/package-lock.json b/package-lock.json index c6a5dee419..1677762d97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,9 @@ "@babel/register": "^7.14.5", "@emmetio/codemirror-plugin": "^1.2.4", "@redux-devtools/core": "^3.11.0", - "@redux-devtools/dock-monitor": "^2.1.0", - "@redux-devtools/log-monitor": "^3.1.0", + "@redux-devtools/dock-monitor": "^3.0.1", + "@redux-devtools/log-monitor": "^4.0.2", + "@reduxjs/toolkit": "^1.9.3", "async": "^3.2.3", "axios": "^0.21.2", "babel-plugin-styled-components": "^1.13.2", @@ -88,12 +89,11 @@ "react-split-pane": "^0.1.92", "react-tabs": "^2.3.1", "react-transition-group": "^4.4.2", - "redux": "^3.7.2", + "redux": "^4.2.1", "redux-auth-wrapper": "^2.1.0", "redux-thunk": "^2.3.0", "regenerator-runtime": "^0.13.9", "remark-slug": "^6.1.0", - "reselect": "^4.0.0", "s3-policy-v4": "0.0.3", "shortid": "^2.2.16", "sinon": "^7.5.0", @@ -2282,11 +2282,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2670,6 +2670,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -2689,6 +2690,7 @@ "version": "13.10.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -2703,6 +2705,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, "engines": { "node": ">= 4" } @@ -2711,6 +2714,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2726,6 +2730,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -2734,6 +2739,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -2745,6 +2751,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -2762,6 +2769,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -2774,7 +2782,8 @@ "node_modules/@humanwhocodes/object-schema": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true }, "node_modules/@hypnosphi/create-react-context": { "version": "0.3.1", @@ -5814,39 +5823,23 @@ } }, "node_modules/@redux-devtools/dock-monitor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@redux-devtools/dock-monitor/-/dock-monitor-2.1.0.tgz", - "integrity": "sha512-DFVLgrFCjiuCGeHxZNaRUGVgACeZmkmm7I/grBU72Slx+KW7C5QCm0dS5UEZr3siTcRBLTDKhUzQLXkAT+6PJg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@redux-devtools/dock-monitor/-/dock-monitor-3.0.1.tgz", + "integrity": "sha512-ajIa3NRy89B7mw0/4SCNipXIV+B1eOqvprQXdGJPA66F6Gpzf3TKJ2Mupmj4yZNL1NL2GBIAbApNnWE9u+DU5w==", "dependencies": { - "@babel/runtime": "^7.16.7", - "@types/prop-types": "^15.7.4", + "@babel/runtime": "^7.18.3", + "@types/prop-types": "^15.7.5", "parse-key": "^0.2.1", "prop-types": "^15.8.1", - "react-dock": "^0.5.1" + "react-dock": "^0.6.0" }, "peerDependencies": { - "@redux-devtools/core": "^3.7.0", - "@types/react": "^16.3.0 || ^17.0.0", - "react": "^16.3.0 || ^17.0.0", + "@redux-devtools/core": "^3.13.1", + "@types/react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react": "^16.3.0 || ^17.0.0 || ^18.0.0", "redux": "^3.4.0 || ^4.0.0" } }, - "node_modules/@redux-devtools/dock-monitor/node_modules/react-dock": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/react-dock/-/react-dock-0.5.1.tgz", - "integrity": "sha512-mRY6xQDreHlUQPPgx1PHICUMQpY0Ywo8idS9rDdWhN+1ERWgl85w6en9ad017ERbaodP50f9D9CHg5DrRU9bhg==", - "dependencies": { - "@babel/runtime": "^7.16.7", - "@types/lodash": "^4.14.178", - "@types/prop-types": "^15.7.4", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@types/react": "^16.3.0 || ^17.0.0", - "react": "^16.3.0 || ^17.0.0" - } - }, "node_modules/@redux-devtools/instrument": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@redux-devtools/instrument/-/instrument-2.1.0.tgz", @@ -5860,58 +5853,64 @@ } }, "node_modules/@redux-devtools/log-monitor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@redux-devtools/log-monitor/-/log-monitor-3.1.0.tgz", - "integrity": "sha512-T5NXzasj7250tJmQPiXzFkxlY0Rg0W7feR1eZj8VrdePvVkeXTP5k9VjxkVqtba5EmZR8swGec+Z1eD71ZgUsA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@redux-devtools/log-monitor/-/log-monitor-4.0.2.tgz", + "integrity": "sha512-BaTAwadm/XzRfnN2+8t4mwdbOILWfwsvMfVPn5OuE+NFaUG9pDKGoHRPCdMBaRdggDqqb5nlMgRCVdHzYftgVw==", "dependencies": { - "@babel/runtime": "^7.16.7", - "@types/lodash.debounce": "^4.0.6", - "@types/prop-types": "^15.7.4", + "@babel/runtime": "^7.20.6", + "@types/lodash.debounce": "^4.0.7", + "@types/prop-types": "^15.7.5", "@types/redux-devtools-themes": "^1.0.0", "lodash.debounce": "^4.0.8", "prop-types": "^15.8.1", - "react-json-tree": "^0.16.1", + "react-json-tree": "^0.18.0", "redux-devtools-themes": "^1.0.0" }, "peerDependencies": { - "@redux-devtools/core": "^3.7.0", - "@types/react": "^16.3.0 || ^17.0.0", - "react": "^16.3.0 || ^17.0.0", + "@redux-devtools/core": "^3.13.1", + "@types/react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react": "^16.3.0 || ^17.0.0 || ^18.0.0", "redux": "^3.4.0 || ^4.0.0" } }, - "node_modules/@redux-devtools/log-monitor/node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" - }, - "node_modules/@redux-devtools/log-monitor/node_modules/react-base16-styling": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz", - "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", + "node_modules/@reduxjs/toolkit": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", + "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", "dependencies": { - "@babel/runtime": "^7.16.7", - "@types/base16": "^1.0.2", - "@types/lodash": "^4.14.178", - "base16": "^1.0.0", - "color": "^3.2.1", - "csstype": "^3.0.10", - "lodash.curry": "^4.1.1" + "immer": "^9.0.16", + "redux": "^4.2.0", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.7" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } } }, - "node_modules/@redux-devtools/log-monitor/node_modules/react-json-tree": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.16.2.tgz", - "integrity": "sha512-80F7ZTqeOl1YaS/sDce4tYBcSe69/d0mlUmcIhyXezPFctWrtvyN56EMExX9jWsq3XMdvsUKKPUeNo8QCBy2jg==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/prop-types": "^15.7.4", - "prop-types": "^15.8.1", - "react-base16-styling": "^0.9.1" - }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/@reduxjs/toolkit/node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "peerDependencies": { - "@types/react": "^16.3.0 || ^17.0.0", - "react": "^16.3.0 || ^17.0.0" + "redux": "^4" } }, "node_modules/@sindresorhus/is": { @@ -10477,14 +10476,14 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/lodash": { - "version": "4.14.181", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", - "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" }, "node_modules/@types/lodash.debounce": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz", - "integrity": "sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz", + "integrity": "sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA==", "dependencies": { "@types/lodash": "*" } @@ -10569,9 +10568,9 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/q": { "version": "1.5.2", @@ -10619,14 +10618,6 @@ "redux": "^4.0.0" } }, - "node_modules/@types/react-redux/node_modules/redux": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz", - "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, "node_modules/@types/react-syntax-highlighter": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.4.tgz", @@ -10938,39 +10929,6 @@ "@vue/shared": "3.1.5" } }, - "node_modules/@vue/reactivity": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", - "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/shared": "3.1.5" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.1.5.tgz", - "integrity": "sha512-YQbG5cBktN1RowQDKA22itmvQ+b40f0WgQ6CXK4VYoYICAiAfu6Cc14777ve8zp1rJRGtk5oIeS149TOculrTg==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/reactivity": "3.1.5", - "@vue/shared": "3.1.5" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.1.5.tgz", - "integrity": "sha512-tNcf3JhVR0RfW0kw1p8xZgv30nvX8Y9rsz7eiQ0dHe273sfoCngAG0y4GvMaY4Xd8FsjUwFedd4suQ8Lu8meXg==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/runtime-core": "3.1.5", - "@vue/shared": "3.1.5", - "csstype": "^2.6.8" - } - }, "node_modules/@vue/shared": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", @@ -11343,6 +11301,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -11671,6 +11630,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -12224,6 +12184,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "engines": { "node": ">=8" } @@ -15356,9 +15317,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -18799,6 +18760,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -19200,6 +19162,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, "dependencies": { "ansi-colors": "^4.1.1" }, @@ -19211,6 +19174,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, "engines": { "node": ">=6" } @@ -19437,6 +19401,7 @@ "version": "7.31.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.31.0.tgz", "integrity": "sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==", + "dev": true, "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -20088,6 +20053,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -20102,6 +20068,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, "engines": { "node": ">=4" } @@ -20246,6 +20213,7 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, "dependencies": { "@babel/highlight": "^7.10.4" } @@ -20254,6 +20222,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -20262,6 +20231,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20277,6 +20247,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -20291,6 +20262,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -20302,6 +20274,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -20312,12 +20285,14 @@ "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/eslint/node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -20331,6 +20306,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -20342,6 +20318,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { "node": ">=10" } @@ -20349,12 +20326,14 @@ "node_modules/eslint/node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/eslint/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -20366,6 +20345,7 @@ "version": "13.10.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -20380,6 +20360,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -20388,6 +20369,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, "engines": { "node": ">= 4" } @@ -20396,6 +20378,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -20411,6 +20394,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20419,6 +20403,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -20430,6 +20415,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -20442,6 +20428,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20453,6 +20440,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -20469,6 +20457,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -20477,6 +20466,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -20485,6 +20475,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -20493,6 +20484,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -20507,6 +20499,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -20518,6 +20511,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -20526,6 +20520,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -20537,6 +20532,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -20548,6 +20544,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -20559,6 +20556,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -20570,6 +20568,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -20583,12 +20582,14 @@ "node_modules/eslint/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -20602,6 +20603,7 @@ "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" }, @@ -20613,6 +20615,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, "engines": { "node": ">=4" } @@ -20633,6 +20636,7 @@ "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" }, @@ -20644,6 +20648,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, "engines": { "node": ">=4.0" } @@ -21846,6 +21851,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -22082,6 +22088,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -22094,6 +22101,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -22107,7 +22115,8 @@ "node_modules/flatted": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", - "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==" + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "dev": true }, "node_modules/flatten": { "version": "1.0.2", @@ -23610,7 +23619,8 @@ "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": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "node_modules/functions-have-names": { "version": "1.2.2", @@ -25463,6 +25473,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -33458,6 +33469,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -34168,7 +34180,8 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -34982,7 +34995,8 @@ "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", @@ -35009,12 +35023,13 @@ "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -35122,7 +35137,8 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, "node_modules/lodash.unescape": { "version": "4.0.1", @@ -38155,7 +38171,8 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "node_modules/negotiator": { "version": "0.6.2", @@ -42200,6 +42217,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -42958,6 +42976,25 @@ "node": ">=0.10.0" } }, + "node_modules/react-base16-styling": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz", + "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "@types/base16": "^1.0.2", + "@types/lodash": "^4.14.178", + "base16": "^1.0.0", + "color": "^3.2.1", + "csstype": "^3.0.10", + "lodash.curry": "^4.1.1" + } + }, + "node_modules/react-base16-styling/node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, "node_modules/react-clientside-effect": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz", @@ -43263,6 +43300,22 @@ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true }, + "node_modules/react-dock": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-dock/-/react-dock-0.6.0.tgz", + "integrity": "sha512-jEOhv1s+pqRQ4JxgUw4XUotnprOehZ23mqchf3whxYXnvNgTQOXCxh6bpcqW8P6OybIk2bYO18r3qimZ3ypCbg==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@types/lodash": "^4.14.182", + "@types/prop-types": "^15.7.5", + "lodash.debounce": "^4.0.8", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@types/react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", @@ -43500,6 +43553,20 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-json-tree": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.18.0.tgz", + "integrity": "sha512-Qe6HKSXrr++n9Y31nkRJ3XvQMATISpqigH1vEKhLwB56+nk5thTP0ITThpjxY6ZG/ubpVq/aEHIcyLP/OPHxeA==", + "dependencies": { + "@babel/runtime": "^7.20.6", + "@types/lodash": "^4.14.191", + "react-base16-styling": "^0.9.1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", @@ -44282,14 +44349,11 @@ } }, "node_modules/redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "@babel/runtime": "^7.9.2" } }, "node_modules/redux-auth-wrapper": { @@ -44394,9 +44458,9 @@ } }, "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==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -44455,6 +44519,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, "engines": { "node": ">=8" }, @@ -45021,9 +45086,9 @@ "dev": true }, "node_modules/reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", @@ -46176,7 +46241,7 @@ "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } @@ -46255,6 +46320,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -46271,6 +46337,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -46285,6 +46352,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -46295,12 +46363,14 @@ "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -46684,7 +46754,8 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "node_modules/sshpk": { "version": "1.16.1", @@ -47577,14 +47648,6 @@ "domelementtype": "1" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -47704,6 +47767,7 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, "dependencies": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", @@ -47720,6 +47784,7 @@ "version": "8.6.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -47735,6 +47800,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -47742,17 +47808,20 @@ "node_modules/table/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/table/node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -47760,12 +47829,14 @@ "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/table/node_modules/string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -47779,6 +47850,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.0" }, @@ -48104,7 +48176,8 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "node_modules/thenify": { "version": "3.3.0", @@ -49169,7 +49242,8 @@ "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==" + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "node_modules/v8-to-istanbul": { "version": "8.1.0", @@ -49307,18 +49381,6 @@ "node": ">=0.10.0" } }, - "node_modules/vue": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.1.5.tgz", - "integrity": "sha512-Ho7HNb1nfDoO+HVb6qYZgeaobt1XbY6KXFe4HGs1b9X6RhkWG/113n4/SrtM1LUclM6OrP/Se5aPHHvAPG1iVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.1.5", - "@vue/runtime-dom": "3.1.5", - "@vue/shared": "3.1.5" - } - }, "node_modules/vue-docgen-api": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.40.0.tgz", @@ -50750,6 +50812,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -52543,11 +52606,11 @@ } }, "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -52634,8 +52697,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@egoist/vue-to-react/-/vue-to-react-1.2.0.tgz", "integrity": "sha512-uUtkzw+jtB1t++XjgwmzD/cgPVs7ZWyypw/IjciwZHNWODb/Ij19KJIkwxxKqokzopxmgbJKK4a5Zj9d9+WrPA==", - "dev": true, - "requires": {} + "dev": true }, "@emmetio/codemirror-plugin": { "version": "1.2.4", @@ -52900,6 +52962,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -52916,6 +52979,7 @@ "version": "13.10.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -52923,12 +52987,14 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -52937,17 +53003,20 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true } } }, @@ -52961,6 +53030,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -52970,7 +53040,8 @@ "@humanwhocodes/object-schema": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true }, "@hypnosphi/create-react-context": { "version": "0.3.1", @@ -52997,8 +53068,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", - "dev": true, - "requires": {} + "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -55190,8 +55260,7 @@ "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "dev": true, - "requires": {} + "dev": true }, "@mdx-js/util": { "version": "1.6.22", @@ -55358,29 +55427,15 @@ } }, "@redux-devtools/dock-monitor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@redux-devtools/dock-monitor/-/dock-monitor-2.1.0.tgz", - "integrity": "sha512-DFVLgrFCjiuCGeHxZNaRUGVgACeZmkmm7I/grBU72Slx+KW7C5QCm0dS5UEZr3siTcRBLTDKhUzQLXkAT+6PJg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@redux-devtools/dock-monitor/-/dock-monitor-3.0.1.tgz", + "integrity": "sha512-ajIa3NRy89B7mw0/4SCNipXIV+B1eOqvprQXdGJPA66F6Gpzf3TKJ2Mupmj4yZNL1NL2GBIAbApNnWE9u+DU5w==", "requires": { - "@babel/runtime": "^7.16.7", - "@types/prop-types": "^15.7.4", + "@babel/runtime": "^7.18.3", + "@types/prop-types": "^15.7.5", "parse-key": "^0.2.1", "prop-types": "^15.8.1", - "react-dock": "^0.5.1" - }, - "dependencies": { - "react-dock": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/react-dock/-/react-dock-0.5.1.tgz", - "integrity": "sha512-mRY6xQDreHlUQPPgx1PHICUMQpY0Ywo8idS9rDdWhN+1ERWgl85w6en9ad017ERbaodP50f9D9CHg5DrRU9bhg==", - "requires": { - "@babel/runtime": "^7.16.7", - "@types/lodash": "^4.14.178", - "@types/prop-types": "^15.7.4", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - } - } + "react-dock": "^0.6.0" } }, "@redux-devtools/instrument": { @@ -55393,49 +55448,40 @@ } }, "@redux-devtools/log-monitor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@redux-devtools/log-monitor/-/log-monitor-3.1.0.tgz", - "integrity": "sha512-T5NXzasj7250tJmQPiXzFkxlY0Rg0W7feR1eZj8VrdePvVkeXTP5k9VjxkVqtba5EmZR8swGec+Z1eD71ZgUsA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@redux-devtools/log-monitor/-/log-monitor-4.0.2.tgz", + "integrity": "sha512-BaTAwadm/XzRfnN2+8t4mwdbOILWfwsvMfVPn5OuE+NFaUG9pDKGoHRPCdMBaRdggDqqb5nlMgRCVdHzYftgVw==", "requires": { - "@babel/runtime": "^7.16.7", - "@types/lodash.debounce": "^4.0.6", - "@types/prop-types": "^15.7.4", + "@babel/runtime": "^7.20.6", + "@types/lodash.debounce": "^4.0.7", + "@types/prop-types": "^15.7.5", "@types/redux-devtools-themes": "^1.0.0", "lodash.debounce": "^4.0.8", "prop-types": "^15.8.1", - "react-json-tree": "^0.16.1", + "react-json-tree": "^0.18.0", "redux-devtools-themes": "^1.0.0" + } + }, + "@reduxjs/toolkit": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", + "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", + "requires": { + "immer": "^9.0.16", + "redux": "^4.2.0", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.7" }, "dependencies": { - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==" + "immer": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", + "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==" }, - "react-base16-styling": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz", - "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", - "requires": { - "@babel/runtime": "^7.16.7", - "@types/base16": "^1.0.2", - "@types/lodash": "^4.14.178", - "base16": "^1.0.0", - "color": "^3.2.1", - "csstype": "^3.0.10", - "lodash.curry": "^4.1.1" - } - }, - "react-json-tree": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.16.2.tgz", - "integrity": "sha512-80F7ZTqeOl1YaS/sDce4tYBcSe69/d0mlUmcIhyXezPFctWrtvyN56EMExX9jWsq3XMdvsUKKPUeNo8QCBy2jg==", - "requires": { - "@babel/runtime": "^7.17.8", - "@types/prop-types": "^15.7.4", - "prop-types": "^15.8.1", - "react-base16-styling": "^0.9.1" - } + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==" } } }, @@ -58267,57 +58313,49 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", - "dev": true, - "requires": {} + "dev": true }, "@svgr/babel-preset": { "version": "6.2.0", @@ -59034,14 +59072,14 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/lodash": { - "version": "4.14.181", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", - "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==" + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" }, "@types/lodash.debounce": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz", - "integrity": "sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz", + "integrity": "sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA==", "requires": { "@types/lodash": "*" } @@ -59125,9 +59163,9 @@ "dev": true }, "@types/prop-types": { - "version": "15.7.4", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", - "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/q": { "version": "1.5.2", @@ -59180,16 +59218,6 @@ "@types/react": "*", "hoist-non-react-statics": "^3.3.0", "redux": "^4.0.0" - }, - "dependencies": { - "redux": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz", - "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==", - "requires": { - "@babel/runtime": "^7.9.2" - } - } } }, "@types/react-syntax-highlighter": { @@ -59481,39 +59509,6 @@ "@vue/shared": "3.1.5" } }, - "@vue/reactivity": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", - "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", - "dev": true, - "peer": true, - "requires": { - "@vue/shared": "3.1.5" - } - }, - "@vue/runtime-core": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.1.5.tgz", - "integrity": "sha512-YQbG5cBktN1RowQDKA22itmvQ+b40f0WgQ6CXK4VYoYICAiAfu6Cc14777ve8zp1rJRGtk5oIeS149TOculrTg==", - "dev": true, - "peer": true, - "requires": { - "@vue/reactivity": "3.1.5", - "@vue/shared": "3.1.5" - } - }, - "@vue/runtime-dom": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.1.5.tgz", - "integrity": "sha512-tNcf3JhVR0RfW0kw1p8xZgv30nvX8Y9rsz7eiQ0dHe273sfoCngAG0y4GvMaY4Xd8FsjUwFedd4suQ8Lu8meXg==", - "dev": true, - "peer": true, - "requires": { - "@vue/runtime-core": "3.1.5", - "@vue/shared": "3.1.5", - "csstype": "^2.6.8" - } - }, "@vue/shared": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", @@ -59773,8 +59768,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "requires": {} + "dev": true }, "@webpack-cli/info": { "version": "1.4.1", @@ -59789,8 +59783,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "requires": {} + "dev": true }, "@xmldom/xmldom": { "version": "0.7.5", @@ -59860,7 +59853,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -59949,8 +59942,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv-formats": { "version": "2.1.1", @@ -59986,8 +59978,7 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "ansi-align": { "version": "3.0.0", @@ -60117,6 +60108,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -60531,7 +60523,8 @@ "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true }, "async": { "version": "3.2.3", @@ -60737,8 +60730,7 @@ "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "requires": {} + "dev": true }, "babel-helper-evaluate-path": { "version": "0.5.0", @@ -61458,8 +61450,7 @@ "version": "0.3.7", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", - "dev": true, - "requires": {} + "dev": true }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -62986,8 +62977,7 @@ "codemirror-colorpicker": { "version": "1.9.80", "resolved": "https://registry.npmjs.org/codemirror-colorpicker/-/codemirror-colorpicker-1.9.80.tgz", - "integrity": "sha512-7lGqNxf5haBJXLnVR1ynPiPkN2d1Whm0jdy8Z9QsSOhRWVyK2C2ihgm1dX4DCks57ht/jKMdpL9lYv+zAphxWQ==", - "requires": {} + "integrity": "sha512-7lGqNxf5haBJXLnVR1ynPiPkN2d1Whm0jdy8Z9QsSOhRWVyK2C2ihgm1dX4DCks57ht/jKMdpL9lYv+zAphxWQ==" }, "collapse-white-space": { "version": "1.0.6", @@ -63033,9 +63023,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -64585,8 +64575,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", - "dev": true, - "requires": {} + "dev": true }, "css-select": { "version": "4.3.0", @@ -64787,29 +64776,25 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-duplicates": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-empty": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} + "dev": true }, "postcss-discard-overridden": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-merge-longhand": { "version": "5.1.4", @@ -64877,8 +64862,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} + "dev": true }, "postcss-normalize-display-values": { "version": "5.1.0", @@ -65174,8 +65158,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} + "dev": true }, "csso": { "version": "4.2.0", @@ -65638,6 +65621,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "requires": { "esutils": "^2.0.2" } @@ -66006,6 +65990,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, "requires": { "ansi-colors": "^4.1.1" }, @@ -66013,7 +65998,8 @@ "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true } } }, @@ -66192,6 +66178,7 @@ "version": "7.31.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.31.0.tgz", "integrity": "sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==", + "dev": true, "requires": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -66239,6 +66226,7 @@ "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } @@ -66246,12 +66234,14 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "chalk": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -66261,6 +66251,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -66269,6 +66260,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -66279,6 +66271,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -66286,12 +66279,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -66301,22 +66296,26 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -66325,6 +66324,7 @@ "version": "13.10.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -66332,17 +66332,20 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -66351,12 +66354,14 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -66365,6 +66370,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -66374,6 +66380,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -66382,6 +66389,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -66394,22 +66402,26 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -66418,6 +66430,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -66425,12 +66438,14 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -66438,12 +66453,14 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -66451,12 +66468,14 @@ "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -66464,7 +66483,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -66490,8 +66510,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.4", @@ -66915,6 +66934,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" }, @@ -66922,7 +66942,8 @@ "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, @@ -67020,6 +67041,7 @@ "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, "requires": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -67029,12 +67051,14 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true } } }, @@ -67047,6 +67071,7 @@ "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" }, @@ -67054,7 +67079,8 @@ "estraverse": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true } } }, @@ -68024,6 +68050,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -68206,6 +68233,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -68215,6 +68243,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -68224,7 +68253,8 @@ "flatted": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", - "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==" + "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "dev": true }, "flatten": { "version": "1.0.2", @@ -69390,7 +69420,8 @@ "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": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "functions-have-names": { "version": "1.2.2", @@ -70662,8 +70693,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} + "dev": true }, "ieee754": { "version": "1.1.13", @@ -70817,7 +70847,8 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { "version": "4.0.0", @@ -74625,8 +74656,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "24.9.0", @@ -77006,6 +77036,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -77474,8 +77505,7 @@ "ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "requires": {} + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==" } } }, @@ -77573,7 +77603,8 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -78188,7 +78219,8 @@ "lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", @@ -78215,12 +78247,13 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" }, "lodash.debounce": { "version": "4.0.8", @@ -78328,7 +78361,8 @@ "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, "lodash.unescape": { "version": "4.0.1", @@ -80196,8 +80230,7 @@ "mockingoose": { "version": "2.15.2", "resolved": "https://registry.npmjs.org/mockingoose/-/mockingoose-2.15.2.tgz", - "integrity": "sha512-50mtbAk29Go5hdhzqTmjmE67Z/cB0yPz45u2jrHoGm4nkYnnBq224viWgyKwnxzWw8birnqn98viM2cRBTnJvw==", - "requires": {} + "integrity": "sha512-50mtbAk29Go5hdhzqTmjmE67Z/cB0yPz45u2jrHoGm4nkYnnBq224viWgyKwnxzWw8birnqn98viM2cRBTnJvw==" }, "mongodb": { "version": "2.2.36", @@ -80320,8 +80353,7 @@ "mongoose-legacy-pluralize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", - "requires": {} + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" }, "move-concurrently": { "version": "1.0.1", @@ -80797,7 +80829,8 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "negotiator": { "version": "0.6.2", @@ -82880,8 +82913,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-focus/-/postcss-focus-5.0.1.tgz", "integrity": "sha512-iVP+4VLenlI0tHHJD+7HyE+7pQ6Hlg3+Zm/xTwNE1LT7OgmYC4r1ale6AnEkABGNKKE3j1LkF/BNcv89lDoICw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-focus-visible": { "version": "4.0.0", @@ -83244,8 +83276,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} + "dev": true }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -83880,7 +83911,8 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true }, "promise": { "version": "7.3.1", @@ -84483,6 +84515,27 @@ "prop-types": "^15.6.2" } }, + "react-base16-styling": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.9.1.tgz", + "integrity": "sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==", + "requires": { + "@babel/runtime": "^7.16.7", + "@types/base16": "^1.0.2", + "@types/lodash": "^4.14.178", + "base16": "^1.0.0", + "color": "^3.2.1", + "csstype": "^3.0.10", + "lodash.curry": "^4.1.1" + }, + "dependencies": { + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + } + } + }, "react-clientside-effect": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz", @@ -84734,6 +84787,18 @@ } } }, + "react-dock": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-dock/-/react-dock-0.6.0.tgz", + "integrity": "sha512-jEOhv1s+pqRQ4JxgUw4XUotnprOehZ23mqchf3whxYXnvNgTQOXCxh6bpcqW8P6OybIk2bYO18r3qimZ3ypCbg==", + "requires": { + "@babel/runtime": "^7.18.3", + "@types/lodash": "^4.14.182", + "@types/prop-types": "^15.7.5", + "lodash.debounce": "^4.0.8", + "prop-types": "^15.8.1" + } + }, "react-dom": { "version": "16.12.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", @@ -84820,8 +84885,7 @@ "react-ga": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.0.tgz", - "integrity": "sha512-o8RScHj6Lb8cwy3GMrVH6NJvL+y0zpJvKtc0+wmH7Bt23rszJmnqEQxRbyrqUzk9DTJIHoP42bfO5rswC9SWBQ==", - "requires": {} + "integrity": "sha512-o8RScHj6Lb8cwy3GMrVH6NJvL+y0zpJvKtc0+wmH7Bt23rszJmnqEQxRbyrqUzk9DTJIHoP42bfO5rswC9SWBQ==" }, "react-helmet": { "version": "5.2.1", @@ -84919,6 +84983,16 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-json-tree": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.18.0.tgz", + "integrity": "sha512-Qe6HKSXrr++n9Y31nkRJ3XvQMATISpqigH1vEKhLwB56+nk5thTP0ITThpjxY6ZG/ubpVq/aEHIcyLP/OPHxeA==", + "requires": { + "@babel/runtime": "^7.20.6", + "@types/lodash": "^4.14.191", + "react-base16-styling": "^0.9.1" + } + }, "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", @@ -85542,14 +85616,11 @@ } }, "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "@babel/runtime": "^7.9.2" } }, "redux-auth-wrapper": { @@ -85648,9 +85719,9 @@ } }, "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==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -85696,7 +85767,8 @@ "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true }, "regexpu-core": { "version": "5.0.1", @@ -86145,9 +86217,9 @@ "dev": true }, "reselect": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", - "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", + "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" }, "resize-observer-polyfill": { "version": "1.5.1", @@ -87073,7 +87145,7 @@ "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "requires": { "is-arrayish": "^0.3.1" }, @@ -87126,8 +87198,7 @@ "sinon-mongoose": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/sinon-mongoose/-/sinon-mongoose-2.3.0.tgz", - "integrity": "sha512-d0rrL53wuDDs91GMCFAvQam64IpdVfkaxA4cGLTZfw1d5tTg6+F/D7F080d1n3d1gSHJBZLUf9pGpijC/x7xKQ==", - "requires": {} + "integrity": "sha512-d0rrL53wuDDs91GMCFAvQam64IpdVfkaxA4cGLTZfw1d5tTg6+F/D7F080d1n3d1gSHJBZLUf9pGpijC/x7xKQ==" }, "sisteransi": { "version": "1.0.5", @@ -87145,6 +87216,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -87155,6 +87227,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -87163,6 +87236,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -87170,12 +87244,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true } } }, @@ -87491,7 +87567,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { "version": "1.16.1", @@ -88041,8 +88118,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "requires": {} + "dev": true }, "style-to-object": { "version": "0.3.0", @@ -88191,11 +88267,6 @@ } } }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -88281,6 +88352,7 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", @@ -88294,6 +88366,7 @@ "version": "8.6.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -88304,32 +88377,38 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "string-width": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -88340,6 +88419,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -88570,7 +88650,8 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "thenify": { "version": "3.3.0", @@ -89332,8 +89413,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz", "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==", - "dev": true, - "requires": {} + "dev": true }, "use-sidecar": { "version": "1.0.5", @@ -89388,7 +89468,8 @@ "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==" + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "v8-to-istanbul": { "version": "8.1.0", @@ -89483,18 +89564,6 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" }, - "vue": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.1.5.tgz", - "integrity": "sha512-Ho7HNb1nfDoO+HVb6qYZgeaobt1XbY6KXFe4HGs1b9X6RhkWG/113n4/SrtM1LUclM6OrP/Se5aPHHvAPG1iVQ==", - "dev": true, - "peer": true, - "requires": { - "@vue/compiler-dom": "3.1.5", - "@vue/runtime-dom": "3.1.5", - "@vue/shared": "3.1.5" - } - }, "vue-docgen-api": { "version": "4.40.0", "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.40.0.tgz", @@ -90118,8 +90187,7 @@ "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" }, "glob-to-regexp": { "version": "0.4.1", @@ -90638,7 +90706,8 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, "wordwrap": { "version": "1.0.0", @@ -90758,8 +90827,7 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", - "dev": true, - "requires": {} + "dev": true }, "xdg-basedir": { "version": "4.0.0", diff --git a/package.json b/package.json index 90c91f5d12..3448f48bab 100644 --- a/package.json +++ b/package.json @@ -148,8 +148,9 @@ "@babel/register": "^7.14.5", "@emmetio/codemirror-plugin": "^1.2.4", "@redux-devtools/core": "^3.11.0", - "@redux-devtools/dock-monitor": "^2.1.0", - "@redux-devtools/log-monitor": "^3.1.0", + "@redux-devtools/dock-monitor": "^3.0.1", + "@redux-devtools/log-monitor": "^4.0.2", + "@reduxjs/toolkit": "^1.9.3", "async": "^3.2.3", "axios": "^0.21.2", "babel-plugin-styled-components": "^1.13.2", @@ -222,12 +223,11 @@ "react-split-pane": "^0.1.92", "react-tabs": "^2.3.1", "react-transition-group": "^4.4.2", - "redux": "^3.7.2", + "redux": "^4.2.1", "redux-auth-wrapper": "^2.1.0", "redux-thunk": "^2.3.0", "regenerator-runtime": "^0.13.9", "remark-slug": "^6.1.0", - "reselect": "^4.0.0", "s3-policy-v4": "0.0.3", "shortid": "^2.2.16", "sinon": "^7.5.0", From 81f11bcc46c22819aa7e8d7be9f60ca7228f000f Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sat, 6 May 2023 21:17:30 -0500 Subject: [PATCH 002/254] Update `createSelector` import. --- client/modules/IDE/selectors/project.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/modules/IDE/selectors/project.js b/client/modules/IDE/selectors/project.js index 26197f3b00..cdf7d61826 100644 --- a/client/modules/IDE/selectors/project.js +++ b/client/modules/IDE/selectors/project.js @@ -1,4 +1,4 @@ -import { createSelector } from 'reselect'; +import { createSelector } from '@reduxjs/toolkit'; export const selectProjectOwner = (state) => state.project.owner; export const selectProjectId = (state) => state.project.id; From 80990875192ab8dbc68dd0990743aa55af5d49fb Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Wed, 7 Jun 2023 20:53:08 -0500 Subject: [PATCH 003/254] Revoke outdated blob urls. --- client/modules/Preview/EmbedFrame.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/modules/Preview/EmbedFrame.jsx b/client/modules/Preview/EmbedFrame.jsx index 43f229fa2d..1347a1785d 100644 --- a/client/modules/Preview/EmbedFrame.jsx +++ b/client/modules/Preview/EmbedFrame.jsx @@ -1,3 +1,4 @@ +import blobUtil from 'blob-util'; import PropTypes from 'prop-types'; import React, { useRef, useEffect, useMemo } from 'react'; import styled from 'styled-components'; @@ -276,6 +277,7 @@ function getHtmlFile(files) { function EmbedFrame({ files, isPlaying, basePath, gridOutput, textOutput }) { const iframe = useRef(); const htmlFile = useMemo(() => getHtmlFile(files), [files]); + const srcRef = useRef(); useEffect(() => { const unsubscribe = registerFrame( @@ -300,6 +302,10 @@ function EmbedFrame({ files, isPlaying, basePath, gridOutput, textOutput }) { content: htmlDoc }; const htmlUrl = createBlobUrl(generatedHtmlFile); + if (srcRef.current) { + blobUtil.revokeObjectURL(srcRef.current); + } + srcRef.current = htmlUrl; // BRO FOR SOME REASON YOU HAVE TO DO THIS TO GET IT TO WORK ON SAFARI setTimeout(() => { doc.src = htmlUrl; From a418d430a991bf6f0cc62d4150e9f690ddd36e7d Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Wed, 7 Jun 2023 21:07:38 -0500 Subject: [PATCH 004/254] Revoke blob inside setTimeout. --- client/modules/Preview/EmbedFrame.jsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/modules/Preview/EmbedFrame.jsx b/client/modules/Preview/EmbedFrame.jsx index 1347a1785d..7c98e7717b 100644 --- a/client/modules/Preview/EmbedFrame.jsx +++ b/client/modules/Preview/EmbedFrame.jsx @@ -302,13 +302,14 @@ function EmbedFrame({ files, isPlaying, basePath, gridOutput, textOutput }) { content: htmlDoc }; const htmlUrl = createBlobUrl(generatedHtmlFile); - if (srcRef.current) { - blobUtil.revokeObjectURL(srcRef.current); - } + const toRevoke = srcRef.current; srcRef.current = htmlUrl; // BRO FOR SOME REASON YOU HAVE TO DO THIS TO GET IT TO WORK ON SAFARI setTimeout(() => { doc.src = htmlUrl; + if (toRevoke) { + blobUtil.revokeObjectURL(toRevoke); + } }, 0); } else { doc.src = ''; From 1601e0ff0eab97d30b0da273e2689aa944471447 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Mon, 12 Jun 2023 18:23:18 -0500 Subject: [PATCH 005/254] Adjust the `totalSize` when deleting an asset. --- client/constants.js | 2 -- client/modules/IDE/actions/assets.js | 23 +++++++------------- client/modules/IDE/reducers/assets.js | 31 ++++++++++++++++----------- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/client/constants.js b/client/constants.js index 2678e6950b..fc7ba88914 100644 --- a/client/constants.js +++ b/client/constants.js @@ -131,8 +131,6 @@ export const CLEAR_PERSISTED_STATE = 'CLEAR_PERSISTED_STATE'; export const HIDE_RUNTIME_ERROR_WARNING = 'HIDE_RUNTIME_ERROR_WARNING'; export const SHOW_RUNTIME_ERROR_WARNING = 'SHOW_RUNTIME_ERROR_WARNING'; -export const SET_ASSETS = 'SET_ASSETS'; -export const DELETE_ASSET = 'DELETE_ASSET'; export const TOGGLE_DIRECTION = 'TOGGLE_DIRECTION'; export const SET_SORTING = 'SET_SORTING'; diff --git a/client/modules/IDE/actions/assets.js b/client/modules/IDE/actions/assets.js index 8c7a046121..abeeb22321 100644 --- a/client/modules/IDE/actions/assets.js +++ b/client/modules/IDE/actions/assets.js @@ -1,14 +1,9 @@ import apiClient from '../../../utils/apiClient'; import * as ActionTypes from '../../../constants'; import { startLoader, stopLoader } from './loader'; +import { assetsActions } from '../reducers/assets'; -function setAssets(assets, totalSize) { - return { - type: ActionTypes.SET_ASSETS, - assets, - totalSize - }; -} +const { setAssets, deleteAsset } = assetsActions; export function getAssets() { return (dispatch) => { @@ -16,7 +11,12 @@ export function getAssets() { apiClient .get('/S3/objects') .then((response) => { - dispatch(setAssets(response.data.assets, response.data.totalSize)); + dispatch( + setAssets({ + list: response.data.assets, + totalSize: response.data.totalSize + }) + ); dispatch(stopLoader()); }) .catch(() => { @@ -28,13 +28,6 @@ export function getAssets() { }; } -export function deleteAsset(assetKey) { - return { - type: ActionTypes.DELETE_ASSET, - key: assetKey - }; -} - export function deleteAssetRequest(assetKey) { return (dispatch) => { apiClient diff --git a/client/modules/IDE/reducers/assets.js b/client/modules/IDE/reducers/assets.js index f1dd0f40cb..e2fb58f625 100644 --- a/client/modules/IDE/reducers/assets.js +++ b/client/modules/IDE/reducers/assets.js @@ -1,20 +1,27 @@ -import * as ActionTypes from '../../../constants'; +import { createSlice } from '@reduxjs/toolkit'; -// 1,000,000 bytes in a MB. can't upload if totalSize is bigger than this. const initialState = { list: [], totalSize: 0 }; -const assets = (state = initialState, action) => { - switch (action.type) { - case ActionTypes.SET_ASSETS: - return { list: action.assets, totalSize: action.totalSize }; - case ActionTypes.DELETE_ASSET: - return { list: state.list.filter((asset) => asset.key !== action.key) }; - default: - return state; +const assetsSlice = createSlice({ + name: 'assets', + initialState, + reducers: { + setAssets: (state, action) => action.payload, + deleteAsset: (state, action) => { + const key = action.payload; + const index = state.list.findIndex((asset) => asset.key === key); + if (index !== -1) { + const asset = state.list[index]; + state.totalSize -= asset.size; + state.list.splice(index, 1); + } + } } -}; +}); + +export const assetsActions = assetsSlice.actions; -export default assets; +export default assetsSlice.reducer; From 8f9ddb5f621019db3e41eef9490f96f0318a85d9 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 25 Jun 2023 14:11:20 -0500 Subject: [PATCH 006/254] Support dynamic paths in `loadImage`. --- client/modules/Preview/EmbedFrame.jsx | 8 +++++++ client/utils/previewEntry.js | 32 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/client/modules/Preview/EmbedFrame.jsx b/client/modules/Preview/EmbedFrame.jsx index 43f229fa2d..fbd4847082 100644 --- a/client/modules/Preview/EmbedFrame.jsx +++ b/client/modules/Preview/EmbedFrame.jsx @@ -254,6 +254,14 @@ function injectLocalFiles(files, htmlFile, options) { previewScripts.setAttribute('crossorigin', ''); sketchDoc.head.appendChild(previewScripts); + const fileData = sketchDoc.createElement('script'); + fileData.innerHTML = ` + window.files = ${JSON.stringify( + files.filter((file) => file.url || file.fileType === 'folder') + )}; + `; + sketchDoc.head.prepend(fileData); + const sketchDocString = `\n${sketchDoc.documentElement.outerHTML}`; scriptOffs = getAllScriptOffsets(sketchDocString); const consoleErrorsScript = sketchDoc.createElement('script'); diff --git a/client/utils/previewEntry.js b/client/utils/previewEntry.js index 2dfa2a239b..c19226bf26 100644 --- a/client/utils/previewEntry.js +++ b/client/utils/previewEntry.js @@ -1,6 +1,8 @@ import loopProtect from 'loop-protect'; import { Hook, Decode, Encode } from 'console-feed'; import StackTrace from 'stacktrace-js'; +import { resolvePathToFile } from '../../server/utils/filePath'; +import { EXTERNAL_LINK_REGEX } from '../../server/utils/fileUtils'; import evaluateExpression from './evaluateExpression'; // should postMessage user the dispatcher? does the parent window need to @@ -178,3 +180,33 @@ if (_report) { _report.apply(window.p5, [newMessage, method, color]); }; } + +const __patchedMethods = {}; + +function applyPatching(methodName) { + __patchedMethods[methodName] = window.p5.prototype[methodName]; + if (__patchedMethods[methodName]) { + window.p5.prototype[methodName] = function patched(path, ...args) { + let resolvedPath = path; + if (!EXTERNAL_LINK_REGEX.test(path)) { + const file = resolvePathToFile(path, window.files); + if (file && file.url) { + resolvedPath = file.url; + } + } + return __patchedMethods[methodName].apply(this, [resolvedPath, ...args]); + }; + } +} + +[ + 'loadImage', + 'loadModel', + 'loadJSON', + 'loadStrings', + 'loadTable', + 'loadXML', + 'loadBytes', + 'loadFont', + 'loadShader' +].forEach(applyPatching); From 133c5d9959d371586cb4da05604ac6adc950af61 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 16 Jul 2023 15:09:42 -0500 Subject: [PATCH 007/254] Convert APIKeyForm to a function component and connect to Redux. --- client/modules/User/components/APIKeyForm.jsx | 184 ++++++++---------- client/modules/User/pages/AccountView.jsx | 14 +- 2 files changed, 83 insertions(+), 115 deletions(-) diff --git a/client/modules/User/components/APIKeyForm.jsx b/client/modules/User/components/APIKeyForm.jsx index 17139a8953..eff0ae2d7b 100644 --- a/client/modules/User/components/APIKeyForm.jsx +++ b/client/modules/User/components/APIKeyForm.jsx @@ -1,135 +1,113 @@ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useDispatch, useSelector } from 'react-redux'; import Button from '../../../common/Button'; import { PlusIcon } from '../../../common/icons'; import CopyableInput from '../../IDE/components/CopyableInput'; +import { createApiKey, removeApiKey } from '../actions'; import APIKeyList from './APIKeyList'; export const APIKeyPropType = PropTypes.shape({ - id: PropTypes.objectOf(PropTypes.shape()).isRequired, - token: PropTypes.objectOf(PropTypes.shape()), + id: PropTypes.string.isRequired, + token: PropTypes.string, label: PropTypes.string.isRequired, createdAt: PropTypes.string.isRequired, lastUsedAt: PropTypes.string }); -class APIKeyForm extends React.Component { - constructor(props) { - super(props); - this.state = { keyLabel: '' }; +const APIKeyForm = () => { + const { t } = useTranslation(); + const apiKeys = useSelector((state) => state.user.apiKeys); + const dispatch = useDispatch(); - this.addKey = this.addKey.bind(this); - this.removeKey = this.removeKey.bind(this); - this.renderApiKeys = this.renderApiKeys.bind(this); - } + const [keyLabel, setKeyLabel] = useState(''); - addKey(event) { + const addKey = (event) => { event.preventDefault(); - const { keyLabel } = this.state; + dispatch(createApiKey(keyLabel)); + setKeyLabel(''); + }; - this.setState({ - keyLabel: '' - }); - - this.props.createApiKey(keyLabel); - - return false; - } - - removeKey(key) { - const message = this.props.t('APIKeyForm.ConfirmDelete', { + const removeKey = (key) => { + const message = t('APIKeyForm.ConfirmDelete', { key_label: key.label }); if (window.confirm(message)) { - this.props.removeApiKey(key.id); + dispatch(removeApiKey(key.id)); } - } + }; - renderApiKeys() { - const hasApiKeys = this.props.apiKeys && this.props.apiKeys.length > 0; + const renderApiKeys = () => { + const hasApiKeys = apiKeys && apiKeys.length > 0; if (hasApiKeys) { - return ( - - ); + return ; } - return

{this.props.t('APIKeyForm.NoTokens')}

; - } - - render() { - const keyWithToken = this.props.apiKeys.find((k) => !!k.token); - - return ( -
-

- {this.props.t('APIKeyForm.Summary')} -

- -
-

- {this.props.t('APIKeyForm.CreateToken')} -

-
- - { - this.setState({ keyLabel: event.target.value }); - }} - placeholder={this.props.t('APIKeyForm.TokenPlaceholder')} - type="text" - value={this.state.keyLabel} + return

{t('APIKeyForm.NoTokens')}

; + }; + + const keyWithToken = apiKeys.find((k) => !!k.token); + + return ( +
+

{t('APIKeyForm.Summary')}

+ +
+

{t('APIKeyForm.CreateToken')}

+ + + { + setKeyLabel(event.target.value); + }} + placeholder={t('APIKeyForm.TokenPlaceholder')} + type="text" + value={keyLabel} + /> + + + + {keyWithToken && ( +
+

+ {t('APIKeyForm.NewTokenTitle')} +

+

+ {t('APIKeyForm.NewTokenInfo')} +

+ - - - - {keyWithToken && ( -
-

- {this.props.t('APIKeyForm.NewTokenTitle')} -

-

- {this.props.t('APIKeyForm.NewTokenInfo')} -

- -
- )} -
- -
-

- {this.props.t('APIKeyForm.ExistingTokensTitle')} -

- {this.renderApiKeys()} -
+
+ )}
- ); - } -} -APIKeyForm.propTypes = { - apiKeys: PropTypes.arrayOf(PropTypes.shape(APIKeyPropType)).isRequired, - createApiKey: PropTypes.func.isRequired, - removeApiKey: PropTypes.func.isRequired, - t: PropTypes.func.isRequired +
+

+ {t('APIKeyForm.ExistingTokensTitle')} +

+ {renderApiKeys()} +
+
+ ); }; export default APIKeyForm; diff --git a/client/modules/User/pages/AccountView.jsx b/client/modules/User/pages/AccountView.jsx index 4b392473c8..10e6f6ecb8 100644 --- a/client/modules/User/pages/AccountView.jsx +++ b/client/modules/User/pages/AccountView.jsx @@ -1,12 +1,11 @@ import PropTypes from 'prop-types'; import React from 'react'; -import { useDispatch, useSelector } from 'react-redux'; +import { useSelector } from 'react-redux'; import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; import { Helmet } from 'react-helmet'; import { useTranslation } from 'react-i18next'; import { withRouter, browserHistory } from 'react-router'; import { parse } from 'query-string'; -import { createApiKey, removeApiKey } from '../actions'; import AccountForm from '../components/AccountForm'; import SocialAuthButton from '../components/SocialAuthButton'; import APIKeyForm from '../components/APIKeyForm'; @@ -52,9 +51,6 @@ function AccountView({ location }) { const errorType = queryParams.error; const accessTokensUIEnabled = window.process.env.UI_ACCESS_TOKEN_ENABLED; - const apiKeys = useSelector((state) => state.user.apiKeys); - const dispatch = useDispatch(); - return (
@@ -102,13 +98,7 @@ function AccountView({ location }) { - dispatch(createApiKey)} - removeApiKey={() => dispatch(removeApiKey)} - t={t} - /> + )} From b3750e4fe35b74d4cb56aaccaba95d1d63b7c0c1 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 16 Jul 2023 15:58:12 -0500 Subject: [PATCH 008/254] Convert App to a function component. --- client/modules/App/App.jsx | 98 ++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/client/modules/App/App.jsx b/client/modules/App/App.jsx index 1f41446a79..a2b4d1e7ad 100644 --- a/client/modules/App/App.jsx +++ b/client/modules/App/App.jsx @@ -1,6 +1,6 @@ import PropTypes from 'prop-types'; -import React from 'react'; -import { connect } from 'react-redux'; +import React, { useEffect, useRef, useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; import getConfig from '../../utils/getConfig'; import DevTools from './components/DevTools'; import { setPreviousPath } from '../IDE/actions/ide'; @@ -14,51 +14,50 @@ function hideCookieConsent(pathname) { return false; } -class App extends React.Component { - constructor(props, context) { - super(props, context); - this.state = { isMounted: false }; - } +// TODO: get location from `useLocation` after upgrading react-router to v5. +const App = ({ children, location }) => { + const dispatch = useDispatch(); - componentDidMount() { - this.setState({ isMounted: true }); // eslint-disable-line react/no-did-mount-set-state - document.body.className = this.props.theme; - } + const theme = useSelector((state) => state.preferences.theme); + useEffect(() => { + document.body.className = theme; + }, [theme]); - componentWillReceiveProps(nextProps) { - const locationWillChange = nextProps.location !== this.props.location; - const shouldSkipRemembering = - nextProps.location.state && - nextProps.location.state.skipSavingPath === true; + // TODO: this is only needed for the initial load and would be better handled elsewhere - Linda + const language = useSelector((state) => state.preferences.language); + useEffect(() => { + dispatch(setLanguage(language, { persistPreference: false })); + }, [language]); - if (locationWillChange && !shouldSkipRemembering) { - this.props.setPreviousPath(this.props.location.pathname); - } + // TODO: do we actually need this? - Linda + const [isMounted, setIsMounted] = useState(false); + useEffect(() => setIsMounted(true), []); - if (this.props.language !== nextProps.language) { - this.props.setLanguage(nextProps.language, { persistPreference: false }); - } - } + const previousLocationRef = useRef(location); + useEffect(() => { + const prevLocation = previousLocationRef.current; + const locationChanged = + prevLocation && prevLocation.pathname !== location.pathname; + const shouldSkipRemembering = location.state?.skipSavingPath === true; - componentDidUpdate(prevProps) { - if (this.props.theme !== prevProps.theme) { - document.body.className = this.props.theme; + if (locationChanged && !shouldSkipRemembering) { + dispatch(setPreviousPath(location.pathname)); } - } + previousLocationRef.current = location; + }, [location]); - render() { - const hide = hideCookieConsent(this.props.location.pathname); - return ( -
- - {this.state.isMounted && - !window.devToolsExtension && - getConfig('NODE_ENV') === 'development' && } - {this.props.children} -
- ); - } -} + const hide = hideCookieConsent(location.pathname); + + return ( +
+ + {isMounted && + !window.devToolsExtension && + getConfig('NODE_ENV') === 'development' && } + {children} +
+ ); +}; App.propTypes = { children: PropTypes.element, @@ -67,24 +66,11 @@ App.propTypes = { state: PropTypes.shape({ skipSavingPath: PropTypes.bool }) - }).isRequired, - setPreviousPath: PropTypes.func.isRequired, - setLanguage: PropTypes.func.isRequired, - language: PropTypes.string, - theme: PropTypes.string + }).isRequired }; App.defaultProps = { - children: null, - language: null, - theme: 'light' + children: null }; -const mapStateToProps = (state) => ({ - theme: state.preferences.theme, - language: state.preferences.language -}); - -const mapDispatchToProps = { setPreviousPath, setLanguage }; - -export default connect(mapStateToProps, mapDispatchToProps)(App); +export default App; From 5618c283ac2f7c039798b4e672af5ed01d7e85d8 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 16 Jul 2023 17:52:39 -0500 Subject: [PATCH 009/254] Fix previousPath handling. --- client/modules/App/App.jsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/modules/App/App.jsx b/client/modules/App/App.jsx index a2b4d1e7ad..777ce061ce 100644 --- a/client/modules/App/App.jsx +++ b/client/modules/App/App.jsx @@ -36,12 +36,11 @@ const App = ({ children, location }) => { const previousLocationRef = useRef(location); useEffect(() => { const prevLocation = previousLocationRef.current; - const locationChanged = - prevLocation && prevLocation.pathname !== location.pathname; + const locationChanged = prevLocation && prevLocation !== location; const shouldSkipRemembering = location.state?.skipSavingPath === true; if (locationChanged && !shouldSkipRemembering) { - dispatch(setPreviousPath(location.pathname)); + dispatch(setPreviousPath(prevLocation.pathname)); } previousLocationRef.current = location; }, [location]); From 9da55356bb0fbabd1e20b65b98ccd53a28c464d8 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 16 Jul 2023 18:18:02 -0500 Subject: [PATCH 010/254] Extract common logic from modal component. --- client/common/useModalClose.js | 50 +++++++++++++++++++++++++ client/components/Nav/NavBar.jsx | 42 +++------------------ client/modules/IDE/components/Modal.jsx | 21 ++--------- client/modules/IDE/pages/IDEView.jsx | 10 ----- 4 files changed, 59 insertions(+), 64 deletions(-) create mode 100644 client/common/useModalClose.js diff --git a/client/common/useModalClose.js b/client/common/useModalClose.js new file mode 100644 index 0000000000..b0d36e89ff --- /dev/null +++ b/client/common/useModalClose.js @@ -0,0 +1,50 @@ +import { useEffect, useRef } from 'react'; + +/** + * Common logic for Modal, Overlay, etc. + * + * Pass in the `onClose` handler. + * + * Can optionally pass in a ref, in case the `onClose` function needs to use the ref. + * + * Calls the provided `onClose` function on: + * - Press Escape key. + * - Click outside the element. + * + * Returns a ref to attach to the outermost element of the modal. + * + * @param {() => void} onClose + * @param {React.MutableRefObject} [passedRef] + * @return {React.MutableRefObject} + */ +export default function useModalClose(onClose, passedRef) { + const createdRef = useRef(null); + const modalRef = passedRef || createdRef; + + useEffect(() => { + modalRef.current?.focus(); + + function handleKeyDown(e) { + if (e.key === 'Escape') { + onClose?.(); + } + } + + function handleClick(e) { + // ignore clicks on the component itself + if (modalRef.current && !modalRef.current.contains(e.target)) { + onClose?.(); + } + } + + document.addEventListener('mousedown', handleClick, false); + document.addEventListener('keydown', handleKeyDown, false); + + return () => { + document.removeEventListener('mousedown', handleClick, false); + document.removeEventListener('keydown', handleKeyDown, false); + }; + }, [onClose, modalRef]); + + return modalRef; +} diff --git a/client/components/Nav/NavBar.jsx b/client/components/Nav/NavBar.jsx index d5e33ada23..8452138044 100644 --- a/client/components/Nav/NavBar.jsx +++ b/client/components/Nav/NavBar.jsx @@ -1,11 +1,6 @@ import PropTypes from 'prop-types'; -import React, { - useCallback, - useEffect, - useMemo, - useRef, - useState -} from 'react'; +import React, { useCallback, useMemo, useRef, useState } from 'react'; +import useModalClose from '../../common/useModalClose'; import { MenuOpenContext, NavBarContext } from './contexts'; function NavBar({ children }) { @@ -13,37 +8,12 @@ function NavBar({ children }) { const timerRef = useRef(null); - const nodeRef = useRef(null); - - useEffect(() => { - function handleClick(e) { - if (!nodeRef.current) { - return; - } - if (nodeRef.current.contains(e.target)) { - return; - } - setDropdownOpen('none'); - } - document.addEventListener('mousedown', handleClick, false); - return () => { - document.removeEventListener('mousedown', handleClick, false); - }; - }, [nodeRef, setDropdownOpen]); - - // TODO: replace with `useKeyDownHandlers` after #2052 is merged - useEffect(() => { - function handleKeyDown(e) { - if (e.keyCode === 27) { - setDropdownOpen('none'); - } - } - document.addEventListener('keydown', handleKeyDown, false); - return () => { - document.removeEventListener('keydown', handleKeyDown, false); - }; + const handleClose = useCallback(() => { + setDropdownOpen('none'); }, [setDropdownOpen]); + const nodeRef = useModalClose(handleClose); + const clearHideTimeout = useCallback(() => { if (timerRef.current) { clearTimeout(timerRef.current); diff --git a/client/modules/IDE/components/Modal.jsx b/client/modules/IDE/components/Modal.jsx index 5d1bbc88e0..831527b266 100644 --- a/client/modules/IDE/components/Modal.jsx +++ b/client/modules/IDE/components/Modal.jsx @@ -1,6 +1,7 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; -import React, { useEffect, useRef } from 'react'; +import React from 'react'; +import useModalClose from '../../../common/useModalClose'; import ExitIcon from '../../../images/exit.svg'; // Common logic from NewFolderModal, NewFileModal, UploadFileModal @@ -12,23 +13,7 @@ const Modal = ({ contentClassName, children }) => { - const modalRef = useRef(null); - - const handleOutsideClick = (e) => { - // ignore clicks on the component itself - if (modalRef.current?.contains?.(e.target)) return; - - onClose(); - }; - - useEffect(() => { - modalRef.current?.focus(); - document.addEventListener('click', handleOutsideClick, false); - - return () => { - document.removeEventListener('click', handleOutsideClick, false); - }; - }, []); + const modalRef = useModalClose(onClose); return (
diff --git a/client/modules/IDE/pages/IDEView.jsx b/client/modules/IDE/pages/IDEView.jsx index 5158e33c44..d10a7f24f6 100644 --- a/client/modules/IDE/pages/IDEView.jsx +++ b/client/modules/IDE/pages/IDEView.jsx @@ -220,14 +220,6 @@ class IDEView extends React.Component { } else { this.props.expandConsole(); } - } else if (e.keyCode === 27) { - if (this.props.ide.newFolderModalVisible) { - this.props.closeNewFolderModal(); - } else if (this.props.ide.uploadFileModalVisible) { - this.props.closeUploadFileModal(); - } else if (this.props.ide.modalIsVisible) { - this.props.closeNewFileModal(); - } } } @@ -556,8 +548,6 @@ IDEView.propTypes = { openProjectOptions: PropTypes.func.isRequired, closeProjectOptions: PropTypes.func.isRequired, newFolder: PropTypes.func.isRequired, - closeNewFolderModal: PropTypes.func.isRequired, - closeNewFileModal: PropTypes.func.isRequired, closeShareModal: PropTypes.func.isRequired, closeKeyboardShortcutModal: PropTypes.func.isRequired, autosaveProject: PropTypes.func.isRequired, From 0854d43a36e43e8170d837a8021dfa1fb78968c3 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 16 Jul 2023 18:19:47 -0500 Subject: [PATCH 011/254] Convert `Overlay` to a function component. --- client/modules/App/components/Overlay.jsx | 143 +++++++++------------- 1 file changed, 56 insertions(+), 87 deletions(-) diff --git a/client/modules/App/components/Overlay.jsx b/client/modules/App/components/Overlay.jsx index 39f492fc6f..6759beb5ab 100644 --- a/client/modules/App/components/Overlay.jsx +++ b/client/modules/App/components/Overlay.jsx @@ -1,101 +1,73 @@ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useCallback, useRef } from 'react'; +import { useSelector } from 'react-redux'; import { browserHistory } from 'react-router'; -import { withTranslation } from 'react-i18next'; +import { useTranslation } from 'react-i18next'; +import useModalClose from '../../../common/useModalClose'; import ExitIcon from '../../../images/exit.svg'; -class Overlay extends React.Component { - constructor(props) { - super(props); - this.close = this.close.bind(this); - this.handleClick = this.handleClick.bind(this); - this.handleClickOutside = this.handleClickOutside.bind(this); - this.keyPressHandle = this.keyPressHandle.bind(this); - } +const Overlay = ({ + actions, + ariaLabel, + children, + closeOverlay, + isFixedHeight, + title +}) => { + const { t } = useTranslation(); - componentWillMount() { - document.addEventListener('mousedown', this.handleClick, false); - document.addEventListener('keydown', this.keyPressHandle); - } + const previousPath = useSelector((state) => state.ide.previousPath); - componentDidMount() { - this.node.focus(); - } + const ref = useRef(null); - componentWillUnmount() { - document.removeEventListener('mousedown', this.handleClick, false); - document.removeEventListener('keydown', this.keyPressHandle); - } - - handleClick(e) { - if (this.node.contains(e.target)) { - return; - } - - this.handleClickOutside(e); - } - - handleClickOutside() { - this.close(); - } - - keyPressHandle(e) { - // escape key code = 27. - // So here we are checking if the key pressed was Escape key. - if (e.keyCode === 27) { - this.close(); - } - } - - close() { + const close = useCallback(() => { + const node = ref.current; + if (!node) return; // Only close if it is the last (and therefore the topmost overlay) const overlays = document.getElementsByClassName('overlay'); - if (this.node.parentElement.parentElement !== overlays[overlays.length - 1]) + if (node.parentElement.parentElement !== overlays[overlays.length - 1]) return; - if (!this.props.closeOverlay) { - browserHistory.push(this.props.previousPath); + if (!closeOverlay) { + browserHistory.push(previousPath); } else { - this.props.closeOverlay(); + closeOverlay(); } - } + }, [previousPath, closeOverlay, ref]); - render() { - const { ariaLabel, title, children, actions, isFixedHeight } = this.props; - return ( -
-
-
{ - this.node = node; - }} - className="overlay__body" - > -
-

{title}

-
- {actions} - -
-
- {children} -
-
+ useModalClose(close, ref); + + return ( +
+
+
+
+

{title}

+
+ {actions} + +
+
+ {children} +
- ); - } -} +
+ ); +}; Overlay.propTypes = { children: PropTypes.element, @@ -103,9 +75,7 @@ Overlay.propTypes = { closeOverlay: PropTypes.func, title: PropTypes.string, ariaLabel: PropTypes.string, - previousPath: PropTypes.string, - isFixedHeight: PropTypes.bool, - t: PropTypes.func.isRequired + isFixedHeight: PropTypes.bool }; Overlay.defaultProps = { @@ -114,8 +84,7 @@ Overlay.defaultProps = { title: 'Modal', closeOverlay: null, ariaLabel: 'modal', - previousPath: '/', isFixedHeight: false }; -export default withTranslation()(Overlay); +export default Overlay; From 65823629e1e1ea81c70b2e26ab728e4bf118a4a8 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 16 Jul 2023 18:32:59 -0500 Subject: [PATCH 012/254] Apply `useModalClose` to collection `ShareURL`. --- client/modules/User/components/Collection.jsx | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/client/modules/User/components/Collection.jsx b/client/modules/User/components/Collection.jsx index 563fd7d6ff..196489c3e8 100644 --- a/client/modules/User/components/Collection.jsx +++ b/client/modules/User/components/Collection.jsx @@ -1,5 +1,5 @@ import PropTypes from 'prop-types'; -import React, { useState, useRef, useEffect } from 'react'; +import React, { useState, useCallback } from 'react'; import { Helmet } from 'react-helmet'; import { connect } from 'react-redux'; import { Link } from 'react-router'; @@ -9,6 +9,7 @@ import classNames from 'classnames'; import Button from '../../../common/Button'; import { DropdownArrowIcon } from '../../../common/icons'; +import useModalClose from '../../../common/useModalClose'; import * as ProjectActions from '../../IDE/actions/project'; import * as ProjectsActions from '../../IDE/actions/projects'; import * as CollectionsActions from '../../IDE/actions/collections'; @@ -30,30 +31,12 @@ import RemoveIcon from '../../../images/close.svg'; const ShareURL = ({ value }) => { const [showURL, setShowURL] = useState(false); - const node = useRef(); const { t } = useTranslation(); - - const handleClickOutside = (e) => { - if (node.current.contains(e.target)) { - return; - } - setShowURL(false); - }; - - useEffect(() => { - if (showURL) { - document.addEventListener('mousedown', handleClickOutside); - } else { - document.removeEventListener('mousedown', handleClickOutside); - } - - return () => { - document.removeEventListener('mousedown', handleClickOutside); - }; - }, [showURL]); + const close = useCallback(() => setShowURL(false), [setShowURL]); + const ref = useModalClose(close); return ( -
+
+ {isOpen && ( + + {children} + + )} +
+ ); + } +); + +DropdownMenu.propTypes = { + children: PropTypes.node, + 'aria-label': PropTypes.string.isRequired, + align: PropTypes.oneOf(['left', 'right']), + className: PropTypes.string, + classes: PropTypes.shape({ + button: PropTypes.string, + list: PropTypes.string + }) +}; + +DropdownMenu.defaultProps = { + children: null, + align: 'right', + className: '', + classes: {} +}; + +export default DropdownMenu; diff --git a/client/components/Dropdown/MenuItem.jsx b/client/components/Dropdown/MenuItem.jsx new file mode 100644 index 0000000000..8b6f6d7247 --- /dev/null +++ b/client/components/Dropdown/MenuItem.jsx @@ -0,0 +1,35 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ButtonOrLink from '../../common/ButtonOrLink'; + +// TODO: combine with NavMenuItem + +function MenuItem({ hideIf, ...rest }) { + if (hideIf) { + return null; + } + + return ( +
  • + +
  • + ); +} + +MenuItem.propTypes = { + ...ButtonOrLink.propTypes, + onClick: PropTypes.func, + value: PropTypes.string, + /** + * Provides a way to deal with optional items. + */ + hideIf: PropTypes.bool +}; + +MenuItem.defaultProps = { + onClick: null, + value: null, + hideIf: false +}; + +export default MenuItem; diff --git a/client/components/Dropdown/TableDropdown.jsx b/client/components/Dropdown/TableDropdown.jsx new file mode 100644 index 0000000000..da7b6d7342 --- /dev/null +++ b/client/components/Dropdown/TableDropdown.jsx @@ -0,0 +1,20 @@ +import styled from 'styled-components'; +import { prop, remSize } from '../../theme'; +import DropdownMenu from './DropdownMenu'; + +const TableDropdown = styled(DropdownMenu).attrs({ align: 'right' })` + & > button { + width: ${remSize(25)}; + height: ${remSize(25)}; + & polygon, + & path { + fill: ${prop('inactiveTextColor')}; + } + } + & ul { + top: 63%; + right: calc(100% - 26px); + } +`; + +export default TableDropdown; diff --git a/client/modules/IDE/components/AssetList.jsx b/client/modules/IDE/components/AssetList.jsx index 559f60c580..7da5c0e865 100644 --- a/client/modules/IDE/components/AssetList.jsx +++ b/client/modules/IDE/components/AssetList.jsx @@ -1,129 +1,68 @@ import PropTypes from 'prop-types'; import React from 'react'; -import { connect } from 'react-redux'; +import { connect, useDispatch } from 'react-redux'; import { bindActionCreators } from 'redux'; import { Link } from 'react-router-dom'; import { Helmet } from 'react-helmet'; import prettyBytes from 'pretty-bytes'; -import { withTranslation } from 'react-i18next'; +import { useTranslation, withTranslation } from 'react-i18next'; +import MenuItem from '../../../components/Dropdown/MenuItem'; +import TableDropdown from '../../../components/Dropdown/TableDropdown'; import Loader from '../../App/components/loader'; +import { deleteAssetRequest } from '../actions/assets'; import * as AssetActions from '../actions/assets'; -import DownFilledTriangleIcon from '../../../images/down-filled-triangle.svg'; -class AssetListRowBase extends React.Component { - constructor(props) { - super(props); - this.state = { - isFocused: false, - optionsOpen: false - }; - } - - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeOptions(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; +const AssetMenu = ({ item: asset }) => { + const { t } = useTranslation(); - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; + const dispatch = useDispatch(); - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); + const handleAssetDelete = () => { + const { key, name } = asset; + if (window.confirm(t('Common.DeleteConfirmation', { name }))) { + dispatch(deleteAssetRequest(key)); } }; - handleDropdownOpen = () => { - this.closeOptions(); - this.openOptions(); - }; + return ( + + {t('AssetList.Delete')} + + {t('AssetList.OpenNewTab')} + + + ); +}; - handleAssetDelete = () => { - const { key, name } = this.props.asset; - this.closeOptions(); - if (window.confirm(this.props.t('Common.DeleteConfirmation', { name }))) { - this.props.deleteAssetRequest(key); - } - }; +AssetMenu.propTypes = { + item: PropTypes.shape({ + key: PropTypes.string.isRequired, + url: PropTypes.string.isRequired, + name: PropTypes.string.isRequired + }).isRequired +}; - render() { - const { asset, username, t } = this.props; - const { optionsOpen } = this.state; - return ( - - - - {asset.name} - - - {prettyBytes(asset.size)} - - {asset.sketchId && ( - - {asset.sketchName} - - )} - - - - {optionsOpen && ( -
      -
    • - -
    • -
    • - - {t('AssetList.OpenNewTab')} - -
    • -
    - )} - - - ); - } -} +const AssetListRowBase = ({ asset, username }) => ( + + + + {asset.name} + + + {prettyBytes(asset.size)} + + {asset.sketchId && ( + + {asset.sketchName} + + )} + + + + + +); AssetListRowBase.propTypes = { asset: PropTypes.shape({ @@ -134,9 +73,7 @@ AssetListRowBase.propTypes = { name: PropTypes.string.isRequired, size: PropTypes.number.isRequired }).isRequired, - deleteAssetRequest: PropTypes.func.isRequired, - username: PropTypes.string.isRequired, - t: PropTypes.func.isRequired + username: PropTypes.string.isRequired }; function mapStateToPropsAssetListRow(state) { diff --git a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx index ed109141d7..ffb2d3c3d2 100644 --- a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx +++ b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx @@ -4,84 +4,35 @@ import { connect } from 'react-redux'; import { Link } from 'react-router-dom'; import { bindActionCreators } from 'redux'; import { withTranslation } from 'react-i18next'; +import MenuItem from '../../../../components/Dropdown/MenuItem'; +import TableDropdown from '../../../../components/Dropdown/TableDropdown'; import * as ProjectActions from '../../actions/project'; import * as CollectionsActions from '../../actions/collections'; import * as IdeActions from '../../actions/ide'; import * as ToastActions from '../../actions/toast'; import dates from '../../../../utils/formatDate'; -import DownFilledTriangleIcon from '../../../../images/down-filled-triangle.svg'; - class CollectionListRowBase extends React.Component { - static projectInCollection(project, collection) { - return ( - collection.items.find((item) => item.project.id === project.id) != null - ); - } - constructor(props) { super(props); this.state = { - optionsOpen: false, - isFocused: false, renameOpen: false, renameValue: '' }; this.renameInput = React.createRef(); } - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeAll(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; - - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; - - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); - } - }; - closeAll = () => { this.setState({ - optionsOpen: false, renameOpen: false }); }; handleAddSketches = () => { - this.closeAll(); this.props.onAddSketches(); }; - handleDropdownOpen = () => { - this.closeAll(); - this.openOptions(); - }; - handleCollectionDelete = () => { - this.closeAll(); if ( window.confirm( this.props.t('Common.DeleteConfirmation', { @@ -94,7 +45,6 @@ class CollectionListRowBase extends React.Component { }; handleRenameOpen = () => { - this.closeAll(); this.setState( { renameOpen: true, @@ -132,61 +82,24 @@ class CollectionListRowBase extends React.Component { }; renderActions = () => { - const { optionsOpen } = this.state; const userIsOwner = this.props.user.username === this.props.username; return ( - - - {optionsOpen && ( -
      -
    • - -
    • - {userIsOwner && ( -
    • - -
    • - )} - {userIsOwner && ( -
    • - -
    • - )} -
    + + > + + {this.props.t('CollectionListRow.AddSketch')} + + + {this.props.t('CollectionListRow.Delete')} + + + {this.props.t('CollectionListRow.Rename')} + + ); }; diff --git a/client/modules/IDE/components/SketchList.jsx b/client/modules/IDE/components/SketchList.jsx index af03453e0d..108e00755e 100644 --- a/client/modules/IDE/components/SketchList.jsx +++ b/client/modules/IDE/components/SketchList.jsx @@ -7,6 +7,8 @@ import { Link } from 'react-router-dom'; import { bindActionCreators } from 'redux'; import classNames from 'classnames'; import slugify from 'slugify'; +import MenuItem from '../../../components/Dropdown/MenuItem'; +import TableDropdown from '../../../components/Dropdown/TableDropdown'; import dates from '../../../utils/formatDate'; import * as ProjectActions from '../actions/project'; import * as ProjectsActions from '../actions/projects'; @@ -22,7 +24,6 @@ import getConfig from '../../../utils/getConfig'; import ArrowUpIcon from '../../../images/sort-arrow-up.svg'; import ArrowDownIcon from '../../../images/sort-arrow-down.svg'; -import DownFilledTriangleIcon from '../../../images/down-filled-triangle.svg'; const ROOT_URL = getConfig('API_URL'); @@ -33,47 +34,12 @@ class SketchListRowBase extends React.Component { constructor(props) { super(props); this.state = { - optionsOpen: false, renameOpen: false, - renameValue: props.sketch.name, - isFocused: false + renameValue: props.sketch.name }; this.renameInput = React.createRef(); } - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeAll(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; - - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; - - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); - } - }; - openRename = () => { this.setState( { @@ -90,13 +56,6 @@ class SketchListRowBase extends React.Component { }); }; - closeAll = () => { - this.setState({ - renameOpen: false, - optionsOpen: false - }); - }; - handleRenameChange = (e) => { this.setState({ renameValue: e.target.value @@ -106,13 +65,13 @@ class SketchListRowBase extends React.Component { handleRenameEnter = (e) => { if (e.key === 'Enter') { this.updateName(); - this.closeAll(); + this.closeRename(); } }; handleRenameBlur = () => { this.updateName(); - this.closeAll(); + this.closeRename(); }; updateName = () => { @@ -125,23 +84,6 @@ class SketchListRowBase extends React.Component { } }; - resetSketchName = () => { - this.setState({ - renameValue: this.props.sketch.name, - renameOpen: false - }); - }; - - handleDropdownOpen = () => { - this.closeAll(); - this.openOptions(); - }; - - handleRenameOpen = () => { - this.closeAll(); - this.openRename(); - }; - handleSketchDownload = () => { const { sketch } = this.props; const downloadLink = document.createElement('a'); @@ -153,12 +95,10 @@ class SketchListRowBase extends React.Component { }; handleSketchDuplicate = () => { - this.closeAll(); this.props.cloneProject(this.props.sketch); }; handleSketchShare = () => { - this.closeAll(); this.props.showShareModal( this.props.sketch.id, this.props.sketch.name, @@ -167,7 +107,6 @@ class SketchListRowBase extends React.Component { }; handleSketchDelete = () => { - this.closeAll(); if ( window.confirm( this.props.t('Common.DeleteConfirmation', { @@ -179,102 +118,42 @@ class SketchListRowBase extends React.Component { } }; - renderViewButton = (sketchURL) => ( - - {this.props.t('SketchList.View')} - - ); - renderDropdown = () => { - const { optionsOpen } = this.state; const userIsOwner = this.props.user.username === this.props.username; return ( - - {optionsOpen && ( -
      - {userIsOwner && ( -
    • - -
    • - )} -
    • - -
    • - {this.props.user.authenticated && ( -
    • - -
    • - )} - {this.props.user.authenticated && ( -
    • - -
    • - )} - {/*
    • - -
    • */} - {userIsOwner && ( -
    • - -
    • - )} -
    - )} + + + {this.props.t('SketchList.DropdownRename')} + + + {this.props.t('SketchList.DropdownDownload')} + + + {this.props.t('SketchList.DropdownDuplicate')} + + { + this.props.onAddToCollection(); + }} + > + {this.props.t('SketchList.DropdownAddToCollection')} + + + {/* + + Share + + */} + + {this.props.t('SketchList.DropdownDelete')} + + ); }; diff --git a/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap b/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap index bd7475ebf9..63a4542d36 100644 --- a/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap +++ b/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap @@ -85,15 +85,19 @@ exports[` snapshot testing 1`] = ` - + +
    snapshot testing 1`] = ` - + +
    diff --git a/client/styles/components/_asset-list.scss b/client/styles/components/_asset-list.scss index 6f7c035993..7d8f6065e8 100644 --- a/client/styles/components/_asset-list.scss +++ b/client/styles/components/_asset-list.scss @@ -76,24 +76,3 @@ background-color: getThemifyVariable('background-color'); } } - -.asset-table__dropdown-button { - width:#{25 / $base-font-size}rem; - height:#{25 / $base-font-size}rem; - - @include themify() { - & polygon, & path { - fill: getThemifyVariable('inactive-text-color'); - } - } -} - -.asset-table__action-dialogue { - @extend %dropdown-open-right; - top: 63%; - right: calc(100% - 26px); -} - -.asset-table__action-option { - font-size: #{12 / $base-font-size}rem; -} diff --git a/client/styles/components/_sketch-list.scss b/client/styles/components/_sketch-list.scss index b03381b091..58e17f109b 100644 --- a/client/styles/components/_sketch-list.scss +++ b/client/styles/components/_sketch-list.scss @@ -100,17 +100,6 @@ font-weight: normal; } - -.sketch-list__dropdown-button { - width:#{25 / $base-font-size}rem; - height:#{25 / $base-font-size}rem; - @include themify() { - & polygon, & path { - fill: getThemifyVariable('inactive-text-color'); - } - } -} - .sketches-table__name { display: flex; align-items: center; @@ -120,12 +109,6 @@ width: #{35 / $base-font-size}rem; } -.sketch-list__action-dialogue { - @extend %dropdown-open-right; - top: 63%; - right: calc(100% - 26px); -} - .sketches-table__empty { text-align: center; font-size: #{16 / $base-font-size}rem; From 3980be0037015dd287452fc7ac3e61a24aaed1d1 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Wed, 16 Aug 2023 12:30:27 -0500 Subject: [PATCH 026/254] add setTimeout to close --- client/components/Dropdown/DropdownMenu.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/components/Dropdown/DropdownMenu.jsx b/client/components/Dropdown/DropdownMenu.jsx index ce7e03837e..0e18207f26 100644 --- a/client/components/Dropdown/DropdownMenu.jsx +++ b/client/components/Dropdown/DropdownMenu.jsx @@ -50,7 +50,9 @@ const DropdownMenu = forwardRef( { + setTimeout(close, 0); + }} onBlur={handleBlur} onFocus={handleFocus} > From d18d6fdd6f3453c7e740a418f341e466bd05d7a8 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Mon, 28 Aug 2023 16:09:40 -0500 Subject: [PATCH 027/254] update showToast action syntax --- client/modules/IDE/components/Toast.test.jsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/client/modules/IDE/components/Toast.test.jsx b/client/modules/IDE/components/Toast.test.jsx index fd92d3633c..f02fa42eae 100644 --- a/client/modules/IDE/components/Toast.test.jsx +++ b/client/modules/IDE/components/Toast.test.jsx @@ -6,11 +6,9 @@ import { fireEvent, waitFor } from '../../../test-utils'; -import { setToastText, showToast } from '../actions/toast'; +import { showToast } from '../actions/toast'; import Toast from './Toast'; -// TODO: update action calls after reducer refactor is merged. - describe(`Toast`, () => { it('is hidden by default', () => { reduxRender(); @@ -20,8 +18,7 @@ describe(`Toast`, () => { it('opens when an action is dispatched', async () => { const { store } = reduxRender(); act(() => { - store.dispatch(showToast(1500)); - store.dispatch(setToastText('Toast.SketchSaved')); + store.dispatch(showToast('Toast.SketchSaved')); }); const toast = screen.queryByRole('status'); @@ -32,8 +29,7 @@ describe(`Toast`, () => { it('closes automatically after time', async () => { const { store } = reduxRender(); act(() => { - store.dispatch(showToast(100)); - store.dispatch(setToastText('Toast.SketchSaved')); + store.dispatch(showToast('Toast.SketchSaved', 100)); }); expect(screen.queryByRole('status')).toBeInTheDocument(); From d2bff5b2b8345fe7404ffc99499ffa2ec40dbf93 Mon Sep 17 00:00:00 2001 From: Aviroop Jana Date: Mon, 11 Sep 2023 18:11:31 +0530 Subject: [PATCH 028/254] Moved CollectionListRow to be a functional component --- .../CollectionList/CollectionListRow.jsx | 566 +++++++++--------- 1 file changed, 267 insertions(+), 299 deletions(-) diff --git a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx index 16421f7a6b..5e875a8a2e 100644 --- a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx +++ b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx @@ -1,299 +1,267 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import { connect } from 'react-redux'; -import { Link } from 'react-router-dom'; -import { bindActionCreators } from 'redux'; -import { withTranslation } from 'react-i18next'; -import * as ProjectActions from '../../actions/project'; -import * as CollectionsActions from '../../actions/collections'; -import * as IdeActions from '../../actions/ide'; -import * as ToastActions from '../../actions/toast'; -import dates from '../../../../utils/formatDate'; - -import DownFilledTriangleIcon from '../../../../images/down-filled-triangle.svg'; -import MoreIconSvg from '../../../../images/more.svg'; - -const formatDateCell = (date, mobile = false) => - dates.format(date, { showTime: !mobile }); - -class CollectionListRowBase extends React.Component { - static projectInCollection(project, collection) { - return ( - collection.items.find((item) => item.project.id === project.id) != null - ); - } - - constructor(props) { - super(props); - this.state = { - optionsOpen: false, - isFocused: false, - renameOpen: false, - renameValue: '' - }; - this.renameInput = React.createRef(); - } - - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeAll(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; - - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; - - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); - } - }; - - closeAll = () => { - this.setState({ - optionsOpen: false, - renameOpen: false - }); - }; - - handleAddSketches = () => { - this.closeAll(); - this.props.onAddSketches(); - }; - - handleDropdownOpen = () => { - this.closeAll(); - this.openOptions(); - }; - - handleCollectionDelete = () => { - this.closeAll(); - if ( - window.confirm( - this.props.t('Common.DeleteConfirmation', { - name: this.props.collection.name - }) - ) - ) { - this.props.deleteCollection(this.props.collection.id); - } - }; - - handleRenameOpen = () => { - this.closeAll(); - this.setState( - { - renameOpen: true, - renameValue: this.props.collection.name - }, - () => this.renameInput.current.focus() - ); - }; - - handleRenameChange = (e) => { - this.setState({ - renameValue: e.target.value - }); - }; - - handleRenameEnter = (e) => { - if (e.key === 'Enter') { - this.updateName(); - this.closeAll(); - } - }; - - handleRenameBlur = () => { - this.updateName(); - this.closeAll(); - }; - - updateName = () => { - const isValid = this.state.renameValue.trim().length !== 0; - if (isValid) { - this.props.editCollection(this.props.collection.id, { - name: this.state.renameValue.trim() - }); - } - }; - - renderActions = () => { - const { optionsOpen } = this.state; - const userIsOwner = this.props.user.username === this.props.username; - - return ( - - - {optionsOpen && ( -
      -
    • - -
    • - {userIsOwner && ( -
    • - -
    • - )} - {userIsOwner && ( -
    • - -
    • - )} -
    - )} -
    - ); - }; - - renderCollectionName = () => { - const { collection, username } = this.props; - const { renameOpen, renameValue } = this.state; - - return ( - - - {renameOpen ? '' : collection.name} - - {renameOpen && ( - e.stopPropagation()} - ref={this.renameInput} - /> - )} - - ); - }; - - render() { - const { collection, mobile } = this.props; - - return ( - - - - {this.renderCollectionName()} - - - {formatDateCell(collection.createdAt, mobile)} - {formatDateCell(collection.updatedAt, mobile)} - - {mobile && 'sketches: '} - {(collection.items || []).length} - - {this.renderActions()} - - ); - } -} - -CollectionListRowBase.propTypes = { - collection: PropTypes.shape({ - id: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - owner: PropTypes.shape({ - username: PropTypes.string.isRequired - }).isRequired, - createdAt: PropTypes.string.isRequired, - updatedAt: PropTypes.string.isRequired, - items: PropTypes.arrayOf( - PropTypes.shape({ - project: PropTypes.shape({ - id: PropTypes.string.isRequired - }) - }) - ) - }).isRequired, - username: PropTypes.string.isRequired, - user: PropTypes.shape({ - username: PropTypes.string, - authenticated: PropTypes.bool.isRequired - }).isRequired, - deleteCollection: PropTypes.func.isRequired, - editCollection: PropTypes.func.isRequired, - onAddSketches: PropTypes.func.isRequired, - mobile: PropTypes.bool, - t: PropTypes.func.isRequired -}; - -CollectionListRowBase.defaultProps = { - mobile: false -}; - -function mapDispatchToPropsSketchListRow(dispatch) { - return bindActionCreators( - Object.assign( - {}, - CollectionsActions, - ProjectActions, - IdeActions, - ToastActions - ), - dispatch - ); -} - -export default withTranslation()( - connect(null, mapDispatchToPropsSketchListRow)(CollectionListRowBase) -); +import PropTypes from 'prop-types'; +import React, { useState, useRef } from 'react'; +import { connect } from 'react-redux'; +import { Link } from 'react-router-dom'; +import { bindActionCreators } from 'redux'; +import { withTranslation } from 'react-i18next'; +import * as ProjectActions from '../../actions/project'; +import * as CollectionsActions from '../../actions/collections'; +import * as IdeActions from '../../actions/ide'; +import * as ToastActions from '../../actions/toast'; +import dates from '../../../../utils/formatDate'; + +import DownFilledTriangleIcon from '../../../../images/down-filled-triangle.svg'; +import MoreIconSvg from '../../../../images/more.svg'; + +const formatDateCell = (date, mobile = false) => + dates.format(date, { showTime: !mobile }); + +const CollectionListRowBase = (props) => { + const [optionsOpen, setOptionsOpen] = useState(false); + const [isFocused, setIsFocused] = useState(false); + const [renameOpen, setRenameOpen] = useState(false); + const [renameValue, setRenameValue] = useState(''); + const renameInput = useRef(null); + + const onFocusComponent = () => { + setIsFocused(true); + }; + + const onBlurComponent = () => { + setIsFocused(false); + setTimeout(() => { + if (!isFocused) { + closeAll(); + } + }, 200); + }; + + const openOptions = () => { + setOptionsOpen(true); + }; + + const closeOptions = () => { + setOptionsOpen(false); + }; + + const toggleOptions = () => { + if (optionsOpen) { + closeOptions(); + } else { + openOptions(); + } + }; + + const closeAll = () => { + setOptionsOpen(false); + setRenameOpen(false); + }; + + const handleAddSketches = () => { + closeAll(); + props.onAddSketches(); + }; + + const handleCollectionDelete = () => { + closeAll(); + if ( + window.confirm( + props.t('Common.DeleteConfirmation', { + name: props.collection.name + }) + ) + ) { + props.deleteCollection(props.collection.id); + } + }; + + const handleRenameOpen = () => { + closeAll(); + setRenameOpen(true); + setRenameValue(props.collection.name); + if (renameInput.current) { + renameInput.current.focus(); + } + }; + + const handleRenameChange = (e) => { + setRenameValue(e.target.value); + }; + + const handleRenameEnter = (e) => { + if (e.key === 'Enter') { + updateName(); + closeAll(); + } + }; + + const handleRenameBlur = () => { + updateName(); + closeAll(); + }; + + const updateName = () => { + const isValid = renameValue.trim().length !== 0; + if (isValid) { + props.editCollection(props.collection.id, { + name: renameValue.trim() + }); + } + }; + + const renderActions = () => { + const { mobile } = props; + const userIsOwner = props.user.username === props.username; + + return ( + <> + + {optionsOpen && ( +
      +
    • + +
    • + {userIsOwner && ( +
    • + +
    • + )} + {userIsOwner && ( +
    • + +
    • + )} +
    + )} + + ); + }; + + const renderCollectionName = () => { + const { collection, username } = props; + + return ( + <> + + {renameOpen ? '' : collection.name} + + {renameOpen && ( + e.stopPropagation()} + ref={renameInput} + /> + )} + + ); + }; + + const { collection, mobile } = props; + + return ( + + + {renderCollectionName()} + + {formatDateCell(collection.createdAt, mobile)} + {formatDateCell(collection.updatedAt, mobile)} + + {mobile && 'sketches: '} + {(collection.items || []).length} + + {renderActions()} + + ); +}; + +CollectionListRowBase.propTypes = { + collection: PropTypes.shape({ + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + owner: PropTypes.shape({ + username: PropTypes.string.isRequired + }).isRequired, + createdAt: PropTypes.string.isRequired, + updatedAt: PropTypes.string.isRequired, + items: PropTypes.arrayOf( + PropTypes.shape({ + project: PropTypes.shape({ + id: PropTypes.string.isRequired + }) + }) + ) + }).isRequired, + username: PropTypes.string.isRequired, + user: PropTypes.shape({ + username: PropTypes.string, + authenticated: PropTypes.bool.isRequired + }).isRequired, + deleteCollection: PropTypes.func.isRequired, + editCollection: PropTypes.func.isRequired, + onAddSketches: PropTypes.func.isRequired, + mobile: PropTypes.bool, + t: PropTypes.func.isRequired +}; + +CollectionListRowBase.defaultProps = { + mobile: false +}; + +function mapDispatchToPropsSketchListRow(dispatch) { + return bindActionCreators( + Object.assign( + {}, + CollectionsActions, + ProjectActions, + IdeActions, + ToastActions + ), + dispatch + ); +} + +export default withTranslation()( + connect(null, mapDispatchToPropsSketchListRow)(CollectionListRowBase) +); + From 8999a9cfc01f140681e0aa823628a4b1ba023f3f Mon Sep 17 00:00:00 2001 From: Aviroop Jana Date: Mon, 11 Sep 2023 18:24:52 +0530 Subject: [PATCH 029/254] Moved CollectionListRow to be a functional component --- .../CollectionList/CollectionListRow.jsx | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx index 5e875a8a2e..73ac9ba4c8 100644 --- a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx +++ b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx @@ -23,6 +23,20 @@ const CollectionListRowBase = (props) => { const [renameValue, setRenameValue] = useState(''); const renameInput = useRef(null); + const closeAll = () => { + setOptionsOpen(false); + setRenameOpen(false); + }; + + const updateName = () => { + const isValid = renameValue.trim().length !== 0; + if (isValid) { + props.editCollection(props.collection.id, { + name: renameValue.trim() + }); + } + }; + const onFocusComponent = () => { setIsFocused(true); }; @@ -52,11 +66,6 @@ const CollectionListRowBase = (props) => { } }; - const closeAll = () => { - setOptionsOpen(false); - setRenameOpen(false); - }; - const handleAddSketches = () => { closeAll(); props.onAddSketches(); @@ -100,15 +109,6 @@ const CollectionListRowBase = (props) => { closeAll(); }; - const updateName = () => { - const isValid = renameValue.trim().length !== 0; - if (isValid) { - props.editCollection(props.collection.id, { - name: renameValue.trim() - }); - } - }; - const renderActions = () => { const { mobile } = props; const userIsOwner = props.user.username === props.username; @@ -264,4 +264,3 @@ function mapDispatchToPropsSketchListRow(dispatch) { export default withTranslation()( connect(null, mapDispatchToPropsSketchListRow)(CollectionListRowBase) ); - From ea23d4623b297d4a3aa74278cfd64987d1c9a919 Mon Sep 17 00:00:00 2001 From: luckyklyist Date: Wed, 13 Sep 2023 10:57:15 +0545 Subject: [PATCH 030/254] feat: Remove deprecated node-sass package, migrated to Sass #2392 --- client/styles/abstracts/_placeholders.scss | 30 +- client/styles/base/_base.scss | 14 +- client/styles/components/_about.scss | 42 +- client/styles/components/_account.scss | 12 +- client/styles/components/_api-key.scss | 24 +- client/styles/components/_asset-list.scss | 30 +- client/styles/components/_asset-size.scss | 12 +- .../styles/components/_collection-create.scss | 4 +- client/styles/components/_collection.scss | 38 +- client/styles/components/_console-input.scss | 8 +- client/styles/components/_console.scss | 28 +- client/styles/components/_copyable-input.scss | 18 +- .../styles/components/_dashboard-header.scss | 30 +- client/styles/components/_editable-input.scss | 4 +- client/styles/components/_editor.scss | 86 +-- client/styles/components/_error-modal.scss | 14 +- client/styles/components/_feedback.scss | 22 +- client/styles/components/_form-container.scss | 8 +- client/styles/components/_forms.scss | 36 +- client/styles/components/_hints.scss | 16 +- .../components/_keyboard-shortcuts.scss | 24 +- client/styles/components/_loader.scss | 6 +- client/styles/components/_modal.scss | 18 +- client/styles/components/_nav.scss | 28 +- client/styles/components/_new-password.scss | 6 +- client/styles/components/_overlay.scss | 10 +- .../_p5-contrast-codemirror-theme.scss | 4 +- client/styles/components/_preferences.scss | 63 +- client/styles/components/_preview-frame.scss | 12 +- client/styles/components/_preview-nav.scss | 8 +- client/styles/components/_quick-add.scss | 16 +- client/styles/components/_reset-password.scss | 12 +- client/styles/components/_searchbar.scss | 26 +- client/styles/components/_share.scss | 12 +- client/styles/components/_sidebar.scss | 74 +- client/styles/components/_sketch-list.scss | 50 +- client/styles/components/_tabs.scss | 22 +- client/styles/components/_timer.scss | 6 +- client/styles/components/_toast.scss | 12 +- client/styles/components/_toolbar.scss | 38 +- client/styles/layout/_dashboard.scss | 4 +- client/styles/main.scss | 10 +- package-lock.json | 710 ++++++++++++++++-- package.json | 5 +- 44 files changed, 1140 insertions(+), 512 deletions(-) diff --git a/client/styles/abstracts/_placeholders.scss b/client/styles/abstracts/_placeholders.scss index a6016e122a..65e115a38a 100644 --- a/client/styles/abstracts/_placeholders.scss +++ b/client/styles/abstracts/_placeholders.scss @@ -1,8 +1,10 @@ +@use "sass:math"; + %toolbar-button { @include themify() { display: inline-block; - height: #{44 / $base-font-size}rem; - width: #{44 / $base-font-size}rem; + height: #{math.div(44, $base-font-size)}rem; + width: #{math.div(44, $base-font-size)}rem; text-align: center; border-radius: 100%; cursor: pointer; @@ -81,7 +83,7 @@ cursor: pointer; border: 2px solid getThemifyVariable('button-border-color'); border-radius: 2px; - padding: #{10 / $base-font-size}rem #{30 / $base-font-size}rem; + padding: #{math.div(10, $base-font-size)}rem #{math.div(30, $base-font-size)}rem; & g, & path { fill: getThemifyVariable('button-color'); opacity: 1; @@ -111,8 +113,8 @@ color: getThemifyVariable('primary-text-color'); background-color: getThemifyVariable('preferences-button-background-color'); padding: 0; - margin-bottom: #{28 / $base-font-size}rem; - line-height: #{50 / $base-font-size}rem; + margin-bottom: #{math.div(28, $base-font-size)}rem; + line-height: #{math.div(50, $base-font-size)}rem; & g, & path { fill: getThemifyVariable('modal-button-color'); } @@ -138,12 +140,12 @@ color: getThemifyVariable('heavy-text-color'); } } - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; cursor: pointer; text-align: left; padding: 0; - margin-bottom: #{5 / $base-font-size}rem; - padding-right: #{5 / $base-font-size}rem; + margin-bottom: #{math.div(5, $base-font-size)}rem; + padding-right: #{math.div(5, $base-font-size)}rem; border: 0; list-style-type: none; } @@ -194,19 +196,19 @@ color: getThemifyVariable('primary-text-color'); } text-align: left; - width: #{180 / $base-font-size}rem; + width: #{math.div(180, $base-font-size)}rem; display: flex; position: absolute; flex-direction: column; top: 95%; height: auto; z-index: 9999; - border-radius: #{6 / $base-font-size}rem; + border-radius: #{math.div(6, $base-font-size)}rem; & li:first-child { - border-radius: #{5 / $base-font-size}rem #{5 / $base-font-size}rem 0 0; + border-radius: #{math.div(5, $base-font-size)}rem #{math.div(5, $base-font-size)}rem 0 0; } & li:last-child { - border-radius: 0 0 #{5 / $base-font-size}rem #{5 / $base-font-size}rem; + border-radius: 0 0 #{math.div(5, $base-font-size)}rem #{math.div(5, $base-font-size)}rem; } & li { & button, @@ -216,9 +218,9 @@ } width: 100%; text-align: left; - padding: #{8 / $base-font-size}rem #{16 / $base-font-size}rem; + padding: #{math.div(8, $base-font-size)}rem #{math.div(16, $base-font-size)}rem; } - height: #{35 / $base-font-size}rem; + height: #{math.div(35, $base-font-size)}rem; cursor: pointer; display: flex; align-items: center; diff --git a/client/styles/base/_base.scss b/client/styles/base/_base.scss index 1d4a99f60e..3e283d7ab9 100644 --- a/client/styles/base/_base.scss +++ b/client/styles/base/_base.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + * { box-sizing: border-box; } @@ -65,10 +67,10 @@ button { input, textarea { - padding: #{5 / $base-font-size}rem; + padding: #{math.div(5, $base-font-size)}rem; border: 1px solid; border-radius: 2px; - padding: #{10 / $base-font-size}rem; + padding: #{math.div(10, $base-font-size)}rem; @include themify() { color: getThemifyVariable("input-text-color"); background-color: getThemifyVariable("input-background-color"); @@ -105,23 +107,23 @@ button { } h1 { - font-size: #{21 / $base-font-size}em; + font-size: #{math.div(21, $base-font-size)}em; } h2 { - font-size: #{21 / $base-font-size}em; + font-size: #{math.div(21, $base-font-size)}em; } h3 { font-weight: normal; - font-size: #{16 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; } h4 { font-weight: normal; } h6 { font-weight: normal; - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; } thead { text-align: left; diff --git a/client/styles/components/_about.scss b/client/styles/components/_about.scss index 161ecb1bf8..c21939e6fe 100644 --- a/client/styles/components/_about.scss +++ b/client/styles/components/_about.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .about__logo { @include themify() { & path { @@ -11,11 +13,11 @@ flex-direction: row; justify-content: space-between; flex-wrap: wrap; - padding-top: #{17 / $base-font-size}rem; - padding-right: #{78 / $base-font-size}rem; - padding-bottom: #{20 / $base-font-size}rem; - padding-left: #{20 / $base-font-size}rem; - width: #{720 / $base-font-size}rem; + padding-top: #{math.div(17, $base-font-size)}rem; + padding-right: #{math.div(78, $base-font-size)}rem; + padding-bottom: #{math.div(20, $base-font-size)}rem; + padding-left: #{math.div(20, $base-font-size)}rem; + width: #{math.div(720, $base-font-size)}rem; } .about__content-column { @@ -36,18 +38,18 @@ .about__footer { flex-direction: column; - padding-left: #{20 / $base-font-size}rem; - padding-right: #{20 / $base-font-size}rem; + padding-left: #{math.div(20, $base-font-size)}rem; + padding-right: #{math.div(20, $base-font-size)}rem; } } .about__content-column-title { - font-size: #{21 / $base-font-size}rem; - padding-left: #{17 / $base-font-size}rem; + font-size: #{math.div(21, $base-font-size)}rem; + padding-left: #{math.div(17, $base-font-size)}rem; } .about__content-column-asterisk { - padding-right: #{5 / $base-font-size}rem; + padding-right: #{math.div(5, $base-font-size)}rem; @include themify() { & path { fill: getThemifyVariable('logo-color'); @@ -58,20 +60,20 @@ .about__content-column-list { @include themify() { - padding-top: #{10 / $base-font-size}rem; - font-size: #{16 / $base-font-size}rem; + padding-top: #{math.div(10, $base-font-size)}rem; + font-size: #{math.div(16, $base-font-size)}rem; } } .about__version-info { @include themify() { - padding-top: #{8 / $base-font-size}rem; - font-size: #{16 / $base-font-size}rem; + padding-top: #{math.div(8, $base-font-size)}rem; + font-size: #{math.div(16, $base-font-size)}rem; span { color: getThemifyVariable('logo-color'); } &:first-child { - padding-top: #{30 /$base-font-size}rem; + padding-top: #{math.div(30, $base-font-size)}rem; } } // span { @@ -84,13 +86,13 @@ .about__footer { display: flex; justify-content: space-between; - padding-top: #{18 / $base-font-size}rem; - padding-right: #{20 / $base-font-size}rem; - padding-bottom: #{21 / $base-font-size}rem; - padding-left: #{20 / $base-font-size}rem; + padding-top: #{math.div(18, $base-font-size)}rem; + padding-right: #{math.div(20, $base-font-size)}rem; + padding-bottom: #{math.div(21, $base-font-size)}rem; + padding-left: #{math.div(20, $base-font-size)}rem; width: 100%; } .about__footer-list { - padding-top: #{12 / $base-font-size}rem; + padding-top: #{math.div(12, $base-font-size)}rem; } diff --git a/client/styles/components/_account.scss b/client/styles/components/_account.scss index a70f346067..a304f9f3af 100644 --- a/client/styles/components/_account.scss +++ b/client/styles/components/_account.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .account-settings__container { @include themify() { color: getThemifyVariable('primary-text-color'); @@ -7,18 +9,18 @@ } .account-settings { - max-width: #{700 / $base-font-size}rem; + max-width: #{math.div(700, $base-font-size)}rem; align-self: center; - padding: 0 #{10 / $base-font-size}rem; + padding: 0 #{math.div(10, $base-font-size)}rem; margin: 0 auto; } .account__tabs { - padding-top: #{20 / $base-font-size}rem; + padding-top: #{math.div(20, $base-font-size)}rem; } .account__social-text { - padding-bottom: #{15 / $base-font-size}rem; + padding-bottom: #{math.div(15, $base-font-size)}rem; } @@ -27,5 +29,5 @@ } .account__social-stack > * { - margin-right: #{15 / $base-font-size}rem; + margin-right: #{math.div(15, $base-font-size)}rem; } diff --git a/client/styles/components/_api-key.scss b/client/styles/components/_api-key.scss index f3565d506e..7e4e2af471 100644 --- a/client/styles/components/_api-key.scss +++ b/client/styles/components/_api-key.scss @@ -1,14 +1,16 @@ +@use "sass:math"; + .api-key-form__summary { - padding-top: #{25 / $base-font-size}rem; + padding-top: #{math.div(25, $base-font-size)}rem; } .api-key-form__section { - padding-bottom: #{15 / $base-font-size}rem; + padding-bottom: #{math.div(15, $base-font-size)}rem; } .api-key-form__title { - padding: #{15 / $base-font-size}rem 0; - font-size: #{21 / $base-font-size}rem; + padding: #{math.div(15, $base-font-size)}rem 0; + font-size: #{math.div(21, $base-font-size)}rem; font-weight: bold; } @@ -27,11 +29,11 @@ } th { - padding: #{5 / $base-font-size}rem; + padding: #{math.div(5, $base-font-size)}rem; } td { - padding: #{15 / $base-font-size}rem #{5 / $base-font-size}rem; + padding: #{math.div(15, $base-font-size)}rem #{math.div(5, $base-font-size)}rem; } tbody tr:nth-child(odd) { @@ -46,8 +48,8 @@ } .api-key-list__delete-button { - width:#{20 / $base-font-size}rem; - height:#{20 / $base-font-size}rem; + width:#{math.div(20, $base-font-size)}rem; + height:#{math.div(20, $base-font-size)}rem; text-align: center; @@ -76,11 +78,11 @@ } .api-key-form__new-token__title { - margin-bottom: #{10 / $base-font-size}rem; - font-size: #{18 / $base-font-size}rem; + margin-bottom: #{math.div(10, $base-font-size)}rem; + font-size: #{math.div(18, $base-font-size)}rem; font-weight: bold; } .api-key-form__new-token__info { - padding: #{10 / $base-font-size}rem 0; + padding: #{math.div(10, $base-font-size)}rem 0; } diff --git a/client/styles/components/_asset-list.scss b/client/styles/components/_asset-list.scss index 6f7c035993..7690424571 100644 --- a/client/styles/components/_asset-list.scss +++ b/client/styles/components/_asset-list.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .asset-table-container { overflow-y: auto; max-width: 100%; @@ -11,13 +13,13 @@ border-spacing: 0; position: relative; & .asset-table__dropdown-column { - width: #{60 / $base-font-size}rem; + width: #{math.div(60, $base-font-size)}rem; position: relative; } } .asset-table thead th { - height: #{32 / $base-font-size}rem; + height: #{math.div(32, $base-font-size)}rem; position: sticky; top: 0; @include themify() { @@ -26,13 +28,13 @@ } .asset-table thead th:nth-child(1){ - padding-left: #{12 / $base-font-size}rem; + padding-left: #{math.div(12, $base-font-size)}rem; } .asset-table__row { - margin: #{10 / $base-font-size}rem; - height: #{72 / $base-font-size}rem; - font-size: #{16 / $base-font-size}rem; + margin: #{math.div(10, $base-font-size)}rem; + height: #{math.div(72, $base-font-size)}rem; + font-size: #{math.div(16, $base-font-size)}rem; } .asset-table__row:nth-child(odd) { @@ -42,7 +44,7 @@ } .asset-table__row > th:nth-child(1) { - padding-left: #{12 / $base-font-size}rem; + padding-left: #{math.div(12, $base-font-size)}rem; } .asset-table__row a { @@ -52,7 +54,7 @@ } .asset-table thead { - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; @include themify() { color: getThemifyVariable('inactive-text-color') } @@ -64,12 +66,12 @@ .asset-table__empty { text-align: center; - font-size: #{16 / $base-font-size}rem; - padding: #{42 / $base-font-size}rem 0; + font-size: #{math.div(16, $base-font-size)}rem; + padding: #{math.div(42, $base-font-size)}rem 0; } .asset-table__total { - padding: 0 #{20 / $base-font-size}rem; + padding: 0 #{math.div(20, $base-font-size)}rem; position: sticky; top: 0; @include themify() { @@ -78,8 +80,8 @@ } .asset-table__dropdown-button { - width:#{25 / $base-font-size}rem; - height:#{25 / $base-font-size}rem; + width:#{math.div(25, $base-font-size)}rem; + height:#{math.div(25, $base-font-size)}rem; @include themify() { & polygon, & path { @@ -95,5 +97,5 @@ } .asset-table__action-option { - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; } diff --git a/client/styles/components/_asset-size.scss b/client/styles/components/_asset-size.scss index 2c4b062895..d664415c37 100644 --- a/client/styles/components/_asset-size.scss +++ b/client/styles/components/_asset-size.scss @@ -1,8 +1,10 @@ +@use "sass:math"; + .asset-size { position: relative; flex: 1; - margin-bottom: #{18 / $base-font-size}rem; - font-size: #{14 / $base-font-size}rem; + margin-bottom: #{math.div(18, $base-font-size)}rem; + font-size: #{math.div(14, $base-font-size)}rem; } .asset-size-bar { @@ -12,7 +14,7 @@ width: 200px; height: 20px; - border-radius: #{3 / $base-font-size}rem; + border-radius: #{math.div(3, $base-font-size)}rem; border: 1px solid transparent; overflow: hidden; @@ -37,12 +39,12 @@ .asset-current { position: absolute; - top: #{28 / $base-font-size}rem; + top: #{math.div(28, $base-font-size)}rem; left: 0; } .asset-max { position: absolute; top: 0; - left: #{210 / $base-font-size}rem; + left: #{math.div(210, $base-font-size)}rem; } diff --git a/client/styles/components/_collection-create.scss b/client/styles/components/_collection-create.scss index 63cd4546b1..093b96b84f 100644 --- a/client/styles/components/_collection-create.scss +++ b/client/styles/components/_collection-create.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .collection-create { - padding: #{24 / $base-font-size}rem; + padding: #{math.div(24, $base-font-size)}rem; } diff --git a/client/styles/components/_collection.scss b/client/styles/components/_collection.scss index a616154ba5..c5a977e430 100644 --- a/client/styles/components/_collection.scss +++ b/client/styles/components/_collection.scss @@ -1,5 +1,7 @@ +@use "sass:math"; + .collection-container { - padding: #{24 / $base-font-size}rem #{66 / $base-font-size}rem; + padding: #{math.div(24, $base-font-size)}rem #{math.div(66, $base-font-size)}rem; position: relative; flex: 1; overflow: hidden; @@ -18,10 +20,10 @@ } .collection-metadata { - max-width: #{1012 / $base-font-size}rem; + max-width: #{math.div(1012, $base-font-size)}rem; width: 100%; margin: 0 auto; - margin-bottom: #{24 / $base-font-size}rem; + margin-bottom: #{math.div(24, $base-font-size)}rem; } .collection-metadata__columns { @@ -45,7 +47,7 @@ } .collection-metadata__column--right > * { - margin-left: #{10 / $base-font-size}rem; + margin-left: #{math.div(10, $base-font-size)}rem; } .collection-metadata__name { @@ -53,7 +55,7 @@ } .collection-metadata__name .editable-input__label { - padding: 0.83333rem #{7 / $base-font-size}rem; + padding: 0.83333rem #{math.div(7, $base-font-size)}rem; } .collection-metadata__name, @@ -63,18 +65,18 @@ } .collection-metadata__user { - padding-top: #{8 / $base-font-size}rem; + padding-top: #{math.div(8, $base-font-size)}rem; font-size: 14px; } .collection-metadata--is-owner .collection-metadata__user { - padding-left: #{8 / $base-font-size}rem; + padding-left: #{math.div(8, $base-font-size)}rem; } .collection-metadata__description { - padding-top: #{8 / $base-font-size}rem; + padding-top: #{math.div(8, $base-font-size)}rem; text-align: left; - font-size: #{14 / $base-font-size}rem; + font-size: #{math.div(14, $base-font-size)}rem; } .collection-metadata__description .editable-input__label { @@ -102,8 +104,8 @@ .collection__share-dropdown { @extend %dropdown-open-right; - padding: #{20 / $base-font-size}rem; - width: #{350 / $base-font-size}rem; + padding: #{math.div(20, $base-font-size)}rem; + width: #{math.div(350, $base-font-size)}rem; } .collection-content { @@ -111,7 +113,7 @@ flex-direction: column; flex: 1; overflow: hidden; - max-width: #{1012 / $base-font-size}rem; + max-width: #{math.div(1012, $base-font-size)}rem; margin: 0 auto; width: 100%; @@ -136,18 +138,18 @@ .collection-empty-message { text-align: center; - font-size: #{16 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; } .collection-row__action-column { - width: #{60 / $base-font-size}rem; + width: #{math.div(60, $base-font-size)}rem; position: relative; } .collection-row__remove-button { display: inline-block; - width:#{35 / $base-font-size}rem; - height:#{35 / $base-font-size}rem; + width:#{math.div(35, $base-font-size)}rem; + height:#{math.div(35, $base-font-size)}rem; @include icon(); @include themify() { // icon graphic @@ -161,8 +163,8 @@ } & svg { - width:#{35 / $base-font-size}rem; - height:#{35 / $base-font-size}rem; + width:#{math.div(35, $base-font-size)}rem; + height:#{math.div(35, $base-font-size)}rem; } &:hover, diff --git a/client/styles/components/_console-input.scss b/client/styles/components/_console-input.scss index 84db1f3387..9efe857216 100644 --- a/client/styles/components/_console-input.scss +++ b/client/styles/components/_console-input.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .console__input { width: 100%; display: flex; @@ -23,17 +25,17 @@ display: flex; align-items: center; justify-content: center; - margin-left: #{10 / $base-font-size}rem; + margin-left: #{math.div(10, $base-font-size)}rem; } .console__editor { - margin-left: #{15 / $base-font-size}rem; + margin-left: #{math.div(15, $base-font-size)}rem; flex: 1; & .CodeMirror { height: auto; } & .CodeMirror-lines { - padding-top: #{2 / $base-font-size}rem; + padding-top: #{math.div(2, $base-font-size)}rem; } } diff --git a/client/styles/components/_console.scss b/client/styles/components/_console.scss index d8882df67a..f37eb50d5f 100644 --- a/client/styles/components/_console.scss +++ b/client/styles/components/_console.scss @@ -1,20 +1,22 @@ +@use "sass:math"; + .preview-console { @include themify() { background: getThemifyVariable('console-background-color'); border-color: getThemifyVariable('ide-border-color'); } - border-left: #{1 / $base-font-size}rem solid; - border-right: #{1 / $base-font-size}rem solid; + border-left: math.div(1, $base-font-size)rem solid; + border-right: math.div(1, $base-font-size)rem solid; width: 100%; height: 100%; z-index: 1000; display: flex; flex-direction: column; - & > { - position:relative; - text-align:left; - } + & > * { + position: relative; + text-align: left; + } } .preview-console__header { @@ -22,15 +24,15 @@ background-color: getThemifyVariable('console-header-background-color'); color: getThemifyVariable('console-header-color'); } - min-height: #{30 / $base-font-size}rem; - padding: #{5 / $base-font-size}rem; + min-height: #{math.div(30, $base-font-size)}rem; + padding: #{math.div(5, $base-font-size)}rem; display: flex; justify-content: space-between; align-items: center; } .preview-console__header-title { - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; font-weight: normal; } @@ -47,7 +49,7 @@ } .preview-console__collapse { - padding-top: #{3 / $base-font-size}rem; + padding-top: #{math.div(3, $base-font-size)}rem; @include icon(); @include themify() { & g, @@ -62,7 +64,7 @@ } .preview-console__expand { - padding-top: #{3 / $base-font-size}rem; + padding-top: #{math.div(3, $base-font-size)}rem; @include icon(); @include themify() { & g, @@ -92,7 +94,7 @@ } background: transparent; border: none; - padding-right: #{10 / $base-font-size}rem; + padding-right: #{math.div(10, $base-font-size)}rem; .preview-console--collapsed & { display: none; } @@ -101,5 +103,5 @@ .preview-console__body { display: flex; flex-direction: column; - height: calc(100% - #{30 / $base-font-size}rem); + height: calc(100% - #{math.div(30, $base-font-size)}rem); } diff --git a/client/styles/components/_copyable-input.scss b/client/styles/components/_copyable-input.scss index 6ca78acbca..4db7690f9b 100644 --- a/client/styles/components/_copyable-input.scss +++ b/client/styles/components/_copyable-input.scss @@ -1,10 +1,12 @@ +@use "sass:math"; + .copyable-input__value-container { position: relative; } .copyable-input__value { width: 100%; - font-size: #{16 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; .copyable-input--with-preview & { border-radius: 2px 0 0 2px; } @@ -12,8 +14,8 @@ .copyable-input__label { width: 100%; - font-size: #{12 / $base-font-size}rem; - padding-bottom: #{5 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; + padding-bottom: #{math.div(5, $base-font-size)}rem; @include themify() { color: getThemifyVariable('inactive-text-color'); } @@ -25,7 +27,7 @@ } .copyable-input { - padding-bottom: #{30 / $base-font-size}rem; + padding-bottom: #{math.div(30, $base-font-size)}rem; display: flex; } @@ -39,7 +41,7 @@ color: getThemifyVariable('button-hover-color'); } font-family: Montserrat, sans-serif; - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; } .tooltipped-n::before, @@ -56,10 +58,10 @@ @include themify() { align-self: flex-end; border-radius: 0 2px 2px 0; - padding: #{2 / $base-font-size}rem 0; + padding: #{math.div(2, $base-font-size)}rem 0; } & svg { - height: #{30 / $base-font-size}rem; - width: #{30 / $base-font-size}rem; + height: #{math.div(30, $base-font-size)}rem; + width: #{math.div(30, $base-font-size)}rem; } } diff --git a/client/styles/components/_dashboard-header.scss b/client/styles/components/_dashboard-header.scss index 7f10210d50..0d87354706 100644 --- a/client/styles/components/_dashboard-header.scss +++ b/client/styles/components/_dashboard-header.scss @@ -1,5 +1,7 @@ +@use "sass:math"; + .dashboard-header { - padding: #{24 / $base-font-size}rem #{66 / $base-font-size}rem; + padding: #{math.div(24, $base-font-size)}rem #{math.div(66, $base-font-size)}rem; position: relative; flex: 1; overflow: hidden; @@ -12,16 +14,16 @@ .dashboard-header__nav { display: flex; flex-direction: column; - padding: #{10 / $base-font-size}rem #{16 / $base-font-size}rem; - gap: #{10 / $base-font-size}rem; + padding: #{math.div(10, $base-font-size)}rem #{math.div(16, $base-font-size)}rem; + gap: #{math.div(10, $base-font-size)}rem; .dashboard-header__tabs { border-bottom: none; - padding-top: #{12 / $base-font-size}rem; + padding-top: #{math.div(12, $base-font-size)}rem; } .dashboard-header__tab__title { font-weight: bold; - font-size: #{15 / $base-font-size}rem; + font-size: #{math.div(15, $base-font-size)}rem; @include themify() { color: getThemifyVariable("inactive-text-color"); @@ -63,7 +65,7 @@ } .dashboard-header__header { - max-width: #{1012 / $base-font-size}rem; + max-width: #{math.div(1012, $base-font-size)}rem; margin: 0 auto; width: 100%; } @@ -77,7 +79,7 @@ .dashboard-header__tabs { display: flex; - padding-top: #{24 / $base-font-size}rem; + padding-top: #{math.div(24, $base-font-size)}rem; width: 100%; @include themify() { @@ -88,10 +90,10 @@ .dashboard-header__tab { @include themify() { color: getThemifyVariable("inactive-text-color"); - border-bottom: #{4 / $base-font-size}rem solid transparent; + border-bottom: #{math.div(4, $base-font-size)}rem solid transparent; padding: 0; - margin-right: #{26 / $base-font-size}rem; + margin-right: #{math.div(26, $base-font-size)}rem; &:hover, &:focus, @@ -102,11 +104,11 @@ } @media (max-width: 770px) { - margin-right: #{20 / $base-font-size}rem; + margin-right: #{math.div(20, $base-font-size)}rem; } } - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; } .dashboard-header__tab--selected { @@ -124,16 +126,16 @@ .dashboard-header__tab__title > * { display: inline-block; - padding: 0 #{5 / $base-font-size}rem #{5 / $base-font-size}rem; + padding: 0 #{math.div(5, $base-font-size)}rem #{math.div(5, $base-font-size)}rem; } .dashboard-header__actions { display: flex; align-items: center; - padding: #{24 / $base-font-size}rem 0; + padding: #{math.div(24, $base-font-size)}rem 0; justify-content: space-between; } .dashboard-header__actions > *:not(:first-child) { - margin-left: #{15 / $base-font-size}rem; + margin-left: #{math.div(15, $base-font-size)}rem; } diff --git a/client/styles/components/_editable-input.scss b/client/styles/components/_editable-input.scss index 07e157b613..2c6589d385 100644 --- a/client/styles/components/_editable-input.scss +++ b/client/styles/components/_editable-input.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .editable-input { height: 70%; display: flex; @@ -21,7 +23,7 @@ button.editable-input__label { } } cursor: pointer; - line-height: #{18 / $base-font-size}rem; + line-height: #{math.div(18, $base-font-size)}rem; font-size: unset; font-weight: unset; diff --git a/client/styles/components/_editor.scss b/client/styles/components/_editor.scss index 59446aeeed..56c4e50f09 100644 --- a/client/styles/components/_editor.scss +++ b/client/styles/components/_editor.scss @@ -1,26 +1,28 @@ +@use "sass:math"; + .CodeMirror { font-family: Inconsolata, monospace; height: 100%; } .CodeMirror-linenumbers { - padding-right: #{10 / $base-font-size}rem; + padding-right: #{math.div(10, $base-font-size)}rem; } .CodeMirror-linenumber { - width: #{32 / $base-font-size}rem; - left: #{-3 / $base-font-size}rem !important; + width: #{math.div(32, $base-font-size)}rem; + left: #{math.div(-3, $base-font-size)}rem !important; @include themify() { color: getThemifyVariable("inactive-text-color"); } } .CodeMirror-lines { - padding-top: #{25 / $base-font-size}rem; + padding-top: #{math.div(25, $base-font-size)}rem; } pre.CodeMirror-line { - padding-left: #{5 / $base-font-size}rem; + padding-left: #{math.div(5, $base-font-size)}rem; } .CodeMirror-gutter-wrapper { @@ -33,7 +35,7 @@ pre.CodeMirror-line { .CodeMirror-lint-marker-error, .CodeMirror-lint-marker-multiple { background-image: none; - width: #{49 / $base-font-size}rem; + width: #{math.div(49, $base-font-size)}rem; position: absolute; height: 100%; right: 100%; @@ -55,7 +57,7 @@ pre.CodeMirror-line { .CodeMirror-gutter-elt:not(.CodeMirror-linenumber) { opacity: 0.2; - width: #{49 / $base-font-size}rem !important; + width: #{math.div(49, $base-font-size)}rem !important; height: 100%; left: 49px !important; // background-color: rgb(255, 95, 82); @@ -78,7 +80,7 @@ pre.CodeMirror-line { border-color: getThemifyVariable("ide-border-color"); } // left: 0 !important; - width: #{48 / $base-font-size}rem; + width: #{math.div(48, $base-font-size)}rem; } /* @@ -89,8 +91,8 @@ pre.CodeMirror-line { position: fixed; top: 0; left: 50%; - margin-left: -#{552/2 / $base-font-size}rem; - + margin-left: math.div(552 * 0.5, $base-font-size); + @media (max-width: 770px) { left: 0; right: 0; @@ -103,7 +105,7 @@ pre.CodeMirror-line { width: 580px; font-family: Montserrat, sans-serif; - padding: #{8 / $base-font-size}rem #{10 / $base-font-size}rem #{5 / $base-font-size}rem #{9 / $base-font-size}rem; + padding: #{math.div(8, $base-font-size)}rem #{math.div(10, $base-font-size)}rem #{math.div(5, $base-font-size)}rem #{math.div(9, $base-font-size)}rem; border-radius: 2px; @@ -121,7 +123,7 @@ pre.CodeMirror-line { } .Toggle-replace-btn-div { - height: #{40 / $base-font-size}rem; + height: #{math.div(40, $base-font-size)}rem; padding: 0; } @@ -131,9 +133,9 @@ pre.CodeMirror-line { } .CodeMirror-search-results { - margin: 0 #{20 / $base-font-size}rem; - width: #{75 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + margin: 0 #{math.div(20, $base-font-size)}rem; + width: #{math.div(75, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; } .CodeMirror-find-controls { @@ -156,33 +158,33 @@ pre.CodeMirror-line { } .CodeMirror-replace-controls { display: flex; - margin-left: #{10 / $base-font-size}rem; + margin-left: #{math.div(10, $base-font-size)}rem; } .CodeMirror-replace-options { - width: #{552 / $base-font-size}rem; - height: #{65 / $base-font-size}rem; + width: #{math.div(552, $base-font-size)}rem; + height: #{math.div(65, $base-font-size)}rem; display: flex; justify-content: center; align-items: center; } .CodeMirror-replace-options button { - width: #{200 / $base-font-size}rem; + width: #{math.div(200, $base-font-size)}rem; } .CodeMirror-search-title { display: block; - margin-bottom: #{12 / $base-font-size}rem; + margin-bottom: #{math.div(12, $base-font-size)}rem; - font-size: #{21 / $base-font-size}rem; + font-size: #{math.div(21, $base-font-size)}rem; font-weight: bold; } .CodeMirror-search-field { display: block; width: 100%; - max-width: #{166 / $base-font-size}rem; - margin-bottom: #{4 / $base-font-size}rem; + max-width: #{math.div(166, $base-font-size)}rem; + margin-bottom: #{math.div(4, $base-font-size)}rem; @include themify() { color: getThemifyVariable("input-text-color"); background-color: getThemifyVariable("input-secondary-background-color"); @@ -200,7 +202,7 @@ pre.CodeMirror-line { .CodeMirror-search-count { display: block; - height: #{20 / $base-font-size}rem; + height: #{math.div(20, $base-font-size)}rem; text-align: right; } @@ -213,7 +215,7 @@ pre.CodeMirror-line { display: flex; justify-content: flex-end; align-items: center; - margin-left: #{10 / $base-font-size}rem; + margin-left: #{math.div(10, $base-font-size)}rem; @media (max-width: 579px) { display: none; @@ -225,17 +227,17 @@ pre.CodeMirror-line { .CodeMirror-word-button { @include themify() { // @extend %button; - padding: #{2 / $base-font-size}rem #{7 / $base-font-size}rem; + padding: #{math.div(2, $base-font-size)}rem #{math.div(7, $base-font-size)}rem; border: 2px solid transparent; &:hover { border-color: getThemifyVariable("button-border-color"); } } - width: #{35 / $base-font-size}rem; - height: #{35 / $base-font-size}rem; + width: #{math.div(35, $base-font-size)}rem; + height: #{math.div(35, $base-font-size)}rem; & + & { - margin-left: #{3 / $base-font-size}rem; + margin-left: #{math.div(3, $base-font-size)}rem; } word-break: keep-all; @@ -266,13 +268,13 @@ pre.CodeMirror-line { } .CodeMirror-search-button { - margin-right: #{10 / $base-font-size}rem; + margin-right: #{math.div(10, $base-font-size)}rem; } .CodeMirror-search-match { background: gold; - border-top: #{1 / $base-font-size}rem solid orange; - border-bottom: #{1 / $base-font-size}rem solid orange; + border-top: #{math.div(1, $base-font-size)}rem solid orange; + border-bottom: #{math.div(1, $base-font-size)}rem solid orange; box-sizing: border-box; opacity: 0.5; } @@ -354,7 +356,7 @@ pre.CodeMirror-line { vertical-align: middle; height: 0.85em; line-height: 0.7; - padding: 0 #{5 / $base-font-size}rem; + padding: 0 #{math.div(5, $base-font-size)}rem; font-family: serif; } @@ -369,7 +371,7 @@ pre.CodeMirror-line { } .editor-holder { - height: calc(100% - #{29 / $base-font-size}rem); + height: calc(100% - #{math.div(29, $base-font-size)}rem); width: 100%; position: absolute; @include themify() { @@ -381,23 +383,23 @@ pre.CodeMirror-line { } .editor__header { - height: #{29 / $base-font-size}rem; + height: #{math.div(29, $base-font-size)}rem; } .editor__file-name { @include themify() { color: getThemifyVariable("primary-text-color"); } - height: #{29 / $base-font-size}rem; - padding-top: #{7 / $base-font-size}rem; - padding-left: #{56 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + height: #{math.div(29, $base-font-size)}rem; + padding-top: #{math.div(7, $base-font-size)}rem; + padding-left: #{math.div(56, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; display: flex; justify-content: space-between; } .editor__unsaved-changes { - margin-left: #{2 / $base-font-size}rem; + margin-left: #{math.div(2, $base-font-size)}rem; } /** Inline abbreviation preview */ @@ -413,8 +415,8 @@ pre.CodeMirror-line { } & .CodeMirror { height: auto; - max-width: #{400 / $base-font-size}rem; - max-height: #{300 / $base-font-size}rem; + max-width: #{math.div(400, $base-font-size)}rem; + max-height: #{math.div(300, $base-font-size)}rem; border: none; } } diff --git a/client/styles/components/_error-modal.scss b/client/styles/components/_error-modal.scss index aac87d1b12..c834b68c2a 100644 --- a/client/styles/components/_error-modal.scss +++ b/client/styles/components/_error-modal.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .error-modal { @extend %modal; display: flex; @@ -8,7 +10,7 @@ .error-modal__header { display: flex; justify-content: space-between; - padding: #{20 / $base-font-size}rem; + padding: #{math.div(20, $base-font-size)}rem; } .error-modal__exit-button { @@ -16,11 +18,11 @@ } .error-modal__content { - padding: #{20 / $base-font-size}rem; - padding-top: #{40 / $base-font-size}rem; - padding-bottom: #{60 / $base-font-size}rem; - max-width: #{500 / $base-font-size}rem; + padding: #{math.div(20, $base-font-size)}rem; + padding-top: #{math.div(40, $base-font-size)}rem; + padding-bottom: #{math.div(60, $base-font-size)}rem; + max-width: #{math.div(500, $base-font-size)}rem; & p { - font-size: #{16 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; } } diff --git a/client/styles/components/_feedback.scss b/client/styles/components/_feedback.scss index 8fad23ab38..47039b1dba 100644 --- a/client/styles/components/_feedback.scss +++ b/client/styles/components/_feedback.scss @@ -1,30 +1,32 @@ +@use "sass:math"; + .feedback__content { display: flex; - width: #{650 / $base-font-size}rem; - padding-top: #{17 / $base-font-size}rem; - padding-right: #{20 / $base-font-size}rem; - padding-bottom: #{20 / $base-font-size}rem; - padding-left: #{20 / $base-font-size}rem; + width: #{math.div(650, $base-font-size)}rem; + padding-top: #{math.div(17, $base-font-size)}rem; + padding-right: #{math.div(20, $base-font-size)}rem; + padding-bottom: #{math.div(20, $base-font-size)}rem; + padding-left: #{math.div(20, $base-font-size)}rem; } .feedback__content-pane { flex: 1; & + & { - margin-left: #{20 / $base-font-size}rem; + margin-left: #{math.div(20, $base-font-size)}rem; } } .feedback__content-pane-header { - margin-bottom: #{20 / $base-font-size}rem; + margin-bottom: #{math.div(20, $base-font-size)}rem; } .feedback__content-pane-copy { - margin-bottom: #{20 / $base-font-size}rem; + margin-bottom: #{math.div(20, $base-font-size)}rem; } .feedback__github-logo svg { - width: #{12 / $base-font-size}rem; - height: #{12 / $base-font-size}rem; + width: #{math.div(12, $base-font-size)}rem; + height: #{math.div(12, $base-font-size)}rem; @include themify() { fill: getThemifyVariable('inactive-text-color'); } diff --git a/client/styles/components/_form-container.scss b/client/styles/components/_form-container.scss index 53835c3eed..d8e4f40cf1 100644 --- a/client/styles/components/_form-container.scss +++ b/client/styles/components/_form-container.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .form-container { text-align: center; display: flex; @@ -22,7 +24,7 @@ .form-container__header { width: 100%; - padding: #{15 / $base-font-size}rem #{34 / $base-font-size}rem; + padding: #{math.div(15, $base-font-size)}rem #{math.div(34, $base-font-size)}rem; display: flex; justify-content: space-between; } @@ -57,7 +59,7 @@ } .form-container__divider { - padding: #{20 / $base-font-size}rem 0; + padding: #{math.div(20, $base-font-size)}rem 0; } .form-container__logo-button { @@ -69,5 +71,5 @@ } .form-container__stack > * + * { - margin-top: #{10 / $base-font-size}rem; + margin-top: #{math.div(10, $base-font-size)}rem; } diff --git a/client/styles/components/_forms.scss b/client/styles/components/_forms.scss index d5eca026d8..f6c2b6bfb9 100644 --- a/client/styles/components/_forms.scss +++ b/client/styles/components/_forms.scss @@ -1,8 +1,10 @@ +@use "sass:math"; + .form-error { display: block; - padding-top: #{4 / $base-font-size}rem; - width: #{300 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + padding-top: #{math.div(4, $base-font-size)}rem; + width: #{math.div(300, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; text-align: left; @include themify() { color: getThemifyVariable("error-color"); @@ -10,7 +12,7 @@ } .form > * + * { - margin-top: #{12 / $base-font-size}rem; + margin-top: #{math.div(12, $base-font-size)}rem; } .form--inline { @@ -19,32 +21,32 @@ } .form__cancel-button { - margin-top: #{10 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + margin-top: #{math.div(10, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; } .form__navigation-options { - margin-top: #{16 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + margin-top: #{math.div(16, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; @include themify() { color: getThemifyVariable("form-navigation-options-color"); } @media (max-width: 550px) { text-align: center; - margin: #{12 / $base-font-size}rem; + margin: #{math.div(12, $base-font-size)}rem; } } .form__legend { - font-size: #{21 / $base-font-size}rem; + font-size: #{math.div(21, $base-font-size)}rem; font-weight: bold; } .form__label { - font-size: #{12 / $base-font-size}rem; - margin-top: #{25 / $base-font-size}rem; - margin-bottom: #{7 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; + margin-top: #{math.div(25, $base-font-size)}rem; + margin-bottom: #{math.div(7, $base-font-size)}rem; display: block; @include themify() { color: getThemifyVariable("form-secondary-title-color"); @@ -57,9 +59,9 @@ .form__input { max-width: 90vw; - width: #{360 / $base-font-size}rem; - height: #{40 / $base-font-size}rem; - font-size: #{16 / $base-font-size}rem; + width: #{math.div(360, $base-font-size)}rem; + height: #{math.div(40, $base-font-size)}rem; + font-size: #{math.div(16, $base-font-size)}rem; @include themify() { color: getThemifyVariable("form-input-text-color"); background-color: getThemifyVariable("input-background-color"); @@ -78,7 +80,7 @@ .form__context { text-align: left; - margin-top: #{15 / $base-font-size}rem; + margin-top: #{math.div(15, $base-font-size)}rem; } .form__status { diff --git a/client/styles/components/_hints.scss b/client/styles/components/_hints.scss index 4503a44f24..6c01abb721 100644 --- a/client/styles/components/_hints.scss +++ b/client/styles/components/_hints.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .CodeMirror-hints { position: absolute; z-index: 10; @@ -7,8 +9,8 @@ margin: 0; padding: 0; - box-shadow: 0 0 #{18 / $base-font-size}rem 0 rgba(0, 0, 0, 0.16); - border: #{1 / $base-font-size}rem solid #A6A6A6; + box-shadow: 0 0 #{math.div(18, $base-font-size)}rem 0 rgba(0, 0, 0, 0.16); + border: #{math.div(1, $base-font-size)}rem solid #A6A6A6; font-size: 100%; font-family: Inconsolata, monospace; @@ -24,7 +26,7 @@ .CodeMirror-hint { color: getThemifyVariable('hint-text-color'); - border-bottom: #{1 / $base-font-size}rem solid getThemifyVariable('hint-item-border-bottom-color'); + border-bottom: #{math.div(1, $base-font-size)}rem solid getThemifyVariable('hint-item-border-bottom-color'); } .hint-name { @@ -45,7 +47,7 @@ .hint-type { color: getThemifyVariable('hint-type-text-color'); - margin-right: #{10 / $base-font-size}rem; + margin-right: #{math.div(10, $base-font-size)}rem; } a { @@ -57,8 +59,8 @@ } &.focused-hint-link { - outline: #{3 / $base-font-size}rem solid getThemifyVariable('hint-arrow-focus-outline-color'); - outline-offset: #{-3 / $base-font-size}rem; + outline: #{math.div(3, $base-font-size)}rem solid getThemifyVariable('hint-arrow-focus-outline-color'); + outline-offset: #{math.div(-3, $base-font-size)}rem; } } @@ -158,7 +160,7 @@ top: 0; right: 0; height: 100%; - width: calc(2rem - #{1 / $base-font-size}rem); + width: calc(2rem - #{math.div(1, $base-font-size)}rem); margin: 0; padding-top: 0.4rem; font-size: 1.2rem; diff --git a/client/styles/components/_keyboard-shortcuts.scss b/client/styles/components/_keyboard-shortcuts.scss index 1b621d7b94..4d54a096be 100644 --- a/client/styles/components/_keyboard-shortcuts.scss +++ b/client/styles/components/_keyboard-shortcuts.scss @@ -1,8 +1,10 @@ +@use "sass:math"; + .keyboard-shortcuts { - padding: #{20 / $base-font-size}rem; - margin-right: #{20 / $base-font-size}rem; - padding-bottom: #{40 / $base-font-size}rem; - width: #{450 / $base-font-size}rem; + padding: #{math.div(20, $base-font-size)}rem; + margin-right: #{math.div(20, $base-font-size)}rem; + padding-bottom: #{math.div(40, $base-font-size)}rem; + width: #{math.div(450, $base-font-size)}rem; overflow-y: auto; } @@ -14,7 +16,7 @@ .keyboard-shortcut-item { display: flex; & + & { - margin-top: #{10 / $base-font-size}rem; + margin-top: #{math.div(10, $base-font-size)}rem; } align-items: baseline; } @@ -22,8 +24,8 @@ .keyboard-shortcut__command { font-weight: bold; text-align: right; - margin-right: #{10 / $base-font-size}rem; - padding: #{3 / $base-font-size}rem; + margin-right: #{math.div(10, $base-font-size)}rem; + padding: #{math.div(3, $base-font-size)}rem; @include themify { border: 1px solid getThemifyVariable("button-border-color"); border-radius: 3px; @@ -31,20 +33,20 @@ } .keyboard-shortcuts__title { - padding-bottom: #{10 / $base-font-size}rem; + padding-bottom: #{math.div(10, $base-font-size)}rem; } .keyboard-shortcuts__description { - padding-bottom: #{10 / $base-font-size}rem; + padding-bottom: #{math.div(10, $base-font-size)}rem; } .keyboard-shortcuts__list:not(:last-of-type) { - padding-bottom: #{10 / $base-font-size}rem; + padding-bottom: #{math.div(10, $base-font-size)}rem; } .keyboard-shortcuts__title:not(:first-of-type) { @include themify() { border-top: 1px dashed getThemifyVariable("button-border-color"); - padding-top: #{10 / $base-font-size}rem; + padding-top: #{math.div(10, $base-font-size)}rem; } } diff --git a/client/styles/components/_loader.scss b/client/styles/components/_loader.scss index 31af13942d..b49160ec63 100644 --- a/client/styles/components/_loader.scss +++ b/client/styles/components/_loader.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .loader-container { width: 100%; height: 100%; @@ -11,8 +13,8 @@ .loader { - width: #{80 / $base-font-size }rem; - height: #{80 / $base-font-size}rem; + width: #{math.div(80, $base-font-size) }rem; + height: #{math.div(80, $base-font-size)}rem; position: relative; } diff --git a/client/styles/components/_modal.scss b/client/styles/components/_modal.scss index 752b443462..6d64b9974f 100644 --- a/client/styles/components/_modal.scss +++ b/client/styles/components/_modal.scss @@ -1,6 +1,8 @@ +@use "sass:math"; + .modal { position: absolute; - top: #{60 / $base-font-size}rem; + top: #{math.div(60, $base-font-size)}rem; right: 50%; transform: translate(50%, 0); z-index: 100; @@ -9,9 +11,9 @@ .modal-content { @extend %modal; - min-height: #{150 / $base-font-size}rem; - width: #{500 / $base-font-size}rem; - padding: #{20 / $base-font-size}rem; + min-height: #{math.div(150, $base-font-size)}rem; + width: #{math.div(500, $base-font-size)}rem; + padding: #{math.div(20, $base-font-size)}rem; .modal--reduced & { //min-height: #{150 / $base-font-size}rem; } @@ -19,7 +21,7 @@ .modal-content-folder { @extend .modal-content; - height: #{150 / $base-font-size}rem; + height: #{math.div(150, $base-font-size)}rem; } .modal__exit-button { @@ -29,7 +31,7 @@ .modal__header { display: flex; justify-content: space-between; - margin-bottom: #{20 / $base-font-size}rem; + margin-bottom: #{math.div(20, $base-font-size)}rem; } .new-folder-form__input-wrapper, .new-file-form__input-wrapper { @@ -41,11 +43,11 @@ } .new-file-form__name-input, .new-folder-form__name-input { - margin-right: #{10 / $base-font-size}rem; + margin-right: #{math.div(10, $base-font-size)}rem; flex: 1; } .modal__divider { text-align: center; - margin: #{20 / $base-font-size}rem 0; + margin: #{math.div(20, $base-font-size)}rem 0; } diff --git a/client/styles/components/_nav.scss b/client/styles/components/_nav.scss index 2d3e25844f..0cd1318b04 100644 --- a/client/styles/components/_nav.scss +++ b/client/styles/components/_nav.scss @@ -1,5 +1,7 @@ +@use "sass:math"; + .nav { - height: #{42 / $base-font-size}rem; + height: #{math.div(42, $base-font-size)}rem; display: flex; flex-direction: row; justify-content: space-between; @@ -44,12 +46,12 @@ height: 100%; & button { - padding: #{12 / $base-font-size}rem #{10 / $base-font-size}rem; + padding: #{math.div(12, $base-font-size)}rem #{math.div(10, $base-font-size)}rem; } } .nav__item--no-icon { - padding-left: #{15 / $base-font-size}rem; + padding-left: #{math.div(15, $base-font-size)}rem; } .nav__item-header-triangle polygon, @@ -92,7 +94,7 @@ } .nav__item-header-triangle { - margin-left: #{5 / $base-font-size}rem; + margin-left: #{math.div(5, $base-font-size)}rem; } .nav__dropdown { @@ -102,7 +104,7 @@ } .nav__item-header-triangle { - margin-left: #{5 / $base-font-size}rem; + margin-left: #{math.div(5, $base-font-size)}rem; } .nav__dropdown { @@ -114,17 +116,17 @@ } .nav__items-right { - padding-right: #{20 / $base-font-size}rem; + padding-right: #{math.div(20, $base-font-size)}rem; & .nav__dropdown { - width: #{125 / $base-font-size}rem; + width: #{math.div(125, $base-font-size)}rem; } } .nav__item-spacer { @include themify() { color: map-get($theme-map, 'inactive-text-color'); - margin-left: #{8 / $base-font-size}rem; + margin-left: #{math.div(8, $base-font-size)}rem; } } @@ -135,7 +137,7 @@ } .nav__auth-button { - padding: #{10 / $base-font-size}rem; + padding: #{math.div(10, $base-font-size)}rem; } // .nav__dropdown button { @@ -155,8 +157,8 @@ .nav__item-logo { position: relative; - height: #{42 / $base-font-size}rem; - width: #{56 / $base-font-size}rem; + height: #{math.div(42, $base-font-size)}rem; + width: #{math.div(56, $base-font-size)}rem; & span { position: absolute; @@ -178,7 +180,7 @@ } .nav__keyboard-shortcut { - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; font-family: Inconsololata, monospace; @include themify() { @@ -199,7 +201,7 @@ fill: getThemifyVariable('inactive-text-color'); } } - margin-right: #{5 / $base-font-size}rem; + margin-right: #{math.div(5, $base-font-size)}rem; } .nav__back-link { diff --git a/client/styles/components/_new-password.scss b/client/styles/components/_new-password.scss index fcd3a83931..735e0ff76d 100644 --- a/client/styles/components/_new-password.scss +++ b/client/styles/components/_new-password.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .new-password-form { .new-password--invalid & { display: none; @@ -8,8 +10,8 @@ display: none; .new-password--invalid & { display: block; - margin-top: #{40 / $base-font-size}rem; - margin-bottom: #{80 / $base-font-size}rem; + margin-top: #{math.div(40, $base-font-size)}rem; + margin-bottom: #{math.div(80, $base-font-size)}rem; @include themify() { color: getThemifyVariable('form-navigation-options-color'); } diff --git a/client/styles/components/_overlay.scss b/client/styles/components/_overlay.scss index 089fa4d824..8c6c2da757 100644 --- a/client/styles/components/_overlay.scss +++ b/client/styles/components/_overlay.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .overlay { position: fixed; top: 0; @@ -25,7 +27,7 @@ max-height: 80%; max-width: 80%; position: relative; - padding-bottom: #{25 / $base-font-size}rem; + padding-bottom: #{math.div(25, $base-font-size)}rem; @media (max-width: 650px) { max-width: 100%; @@ -38,7 +40,7 @@ .overlay__header { display: flex; justify-content: space-between; - padding: #{20 / $base-font-size}rem; + padding: #{math.div(20, $base-font-size)}rem; } .overlay__actions { @@ -46,12 +48,12 @@ } .overlay__title { - font-size: #{21 / $base-font-size}rem; + font-size: #{math.div(21, $base-font-size)}rem; } .overlay__close-button { @include icon(); - padding: #{3 / $base-font-size}rem 0 #{3 / $base-font-size}rem #{10 / $base-font-size}rem; + padding: #{math.div(3, $base-font-size)}rem 0 #{math.div(3, $base-font-size)}rem #{math.div(10, $base-font-size)}rem; } /* Fixed height overlay */ diff --git a/client/styles/components/_p5-contrast-codemirror-theme.scss b/client/styles/components/_p5-contrast-codemirror-theme.scss index b5ae00d991..6aae60e051 100644 --- a/client/styles/components/_p5-contrast-codemirror-theme.scss +++ b/client/styles/components/_p5-contrast-codemirror-theme.scss @@ -10,6 +10,8 @@ //light gray: #f4f4f4 //dark gray: #b5b5b5 +@use "sass:math"; + $p5-contrast-black: #1C1C1C; $p5-contrast-gray: #A0A0A0; $p5-contrast-white: #FDFDFD; @@ -143,5 +145,5 @@ $p5-contrast-activeline: #999999; .cm-s-p5-contrast .cm-searching.CodeMirror-selectedtext { // background-color: $medium-dark; - outline: #{1 / $base-font-size}rem solid $p5-contrast-white; + outline: #{math.div(1, $base-font-size)}rem solid $p5-contrast-white; } diff --git a/client/styles/components/_preferences.scss b/client/styles/components/_preferences.scss index 5decad9abe..8b6193f2d5 100644 --- a/client/styles/components/_preferences.scss +++ b/client/styles/components/_preferences.scss @@ -1,16 +1,17 @@ +@use "sass:math"; + .preferences { width: 100%; - width: #{640 / $base-font-size}rem; + width: #{math.div(640, $base-font-size)}rem; max-width: 100%; max-height: 100%; z-index: 9999; - padding: 0 #{20 / $base-font-size}rem #{2 / $base-font-size}rem #{20 / - $base-font-size}rem; + padding: 0 #{math.div(20, $base-font-size)}rem #{math.div(2, $base-font-size)}rem #{math.div(20, $base-font-size)}rem; display: flex; flex-direction: column; outline: none; - height: calc(80vh - #{65 / $base-font-size}rem); - max-height: #{460 / $base-font-size}rem; + height: calc(80vh - #{math.div(65, $base-font-size)}rem); + max-height: #{math.div(460, $base-font-size)}rem; & .react-tabs { max-height: 100%; display: flex; @@ -25,13 +26,13 @@ .preference__plus-button { @include themify() { @extend %preferences-button; - width: #{32 / $base-font-size}rem; - height: #{32 / $base-font-size}rem; - margin-left: #{6 / $base-font-size}rem; - margin-right: #{10 / $base-font-size}rem; - line-height: #{40 / $base-font-size}rem; + width: #{math.div(32, $base-font-size)}rem; + height: #{math.div(32, $base-font-size)}rem; + margin-left: #{math.div(6, $base-font-size)}rem; + margin-right: #{math.div(10, $base-font-size)}rem; + line-height: #{math.div(40, $base-font-size)}rem; & svg { - width: #{10 / $base-font-size}rem; + width: #{math.div(10, $base-font-size)}rem; } } } @@ -39,7 +40,7 @@ .preference { display: flex; flex-wrap: wrap; - padding-bottom: #{12 / $base-font-size}rem; + padding-bottom: #{math.div(12, $base-font-size)}rem; & + & { @include themify() { border-top: 1px dashed getThemifyVariable("button-border-color"); @@ -49,9 +50,9 @@ .preference__title { width: 100%; - font-size: #{16 / $base-font-size}rem; - margin-top: #{13 / $base-font-size}rem; - margin-bottom: #{7 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; + margin-top: #{math.div(13, $base-font-size)}rem; + margin-bottom: #{math.div(7, $base-font-size)}rem; } .preference__subtitle { @@ -59,13 +60,13 @@ color: getThemifyVariable("inactive-text-color"); } width: 100%; - margin-bottom: #{10 / $base-font-size}rem; + margin-bottom: #{math.div(10, $base-font-size)}rem; margin-top: 0; } .preference__value { @include themify() { - border: #{1 / $base-font-size}rem solid + border: #{math.div(1, $base-font-size)}rem solid getThemifyVariable("button-border-color"); // background-color: getThemifyVariable("button-background-color"); color: getThemifyVariable("input-text-color"); @@ -74,11 +75,11 @@ text-align: center; border-radius: 0%; outline: none; - width: #{44 / $base-font-size}rem; - height: #{40 / $base-font-size}rem; - margin: 0 #{20 / $base-font-size}rem; + width: #{math.div(44, $base-font-size)}rem; + height: #{math.div(40, $base-font-size)}rem; + margin: 0 #{math.div(20, $base-font-size)}rem; padding: 0; - font-size: #{16 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; font-family: Inconsolata; } @@ -89,14 +90,14 @@ color: getThemifyVariable("heavy-text-color"); } } - margin: #{-15 / $base-font-size}rem 0 0 #{-5 / $base-font-size}rem; - font-size: #{9 / $base-font-size}rem; - width: #{44 / $base-font-size}rem; + margin: #{math.div(-15, $base-font-size)}rem 0 0 #{math.div(-5, $base-font-size)}rem; + font-size: #{math.div(9, $base-font-size)}rem; + width: #{math.div(44, $base-font-size)}rem; } .react-tabs__tab--selected { @include themify() { - border-bottom: #{4 / $base-font-size}rem solid + border-bottom: #{math.div(4, $base-font-size)}rem solid getThemifyVariable("button-background-hover-color"); } } @@ -112,13 +113,13 @@ color: black; display: flex; align-items: center; - border-bottom: #{4 / $base-font-size}rem solid transparent; + border-bottom: #{math.div(4, $base-font-size)}rem solid transparent; & + & { - margin-left: #{45 / $base-font-size}rem; + margin-left: #{math.div(45, $base-font-size)}rem; } &:hover { @include themify() { - border-bottom: #{4 / $base-font-size}rem solid + border-bottom: #{math.div(4, $base-font-size)}rem solid getThemifyVariable("button-background-hover-color"); } } @@ -137,7 +138,7 @@ input[type="number"]::-webkit-outer-spin-button { .preference__option { @include themify() { @extend %preference-option; - margin-right: #{25 / $base-font-size}rem; + margin-right: #{math.div(25, $base-font-size)}rem; } display: flex; flex-wrap: wrap; @@ -155,7 +156,7 @@ input[type="number"]::-webkit-outer-spin-button { color: getThemifyVariable("button-background-hover-color"); } } - margin-left: #{30 / $base-font-size}rem; + margin-left: #{math.div(30, $base-font-size)}rem; } .preference__options { @@ -176,6 +177,6 @@ input[type="number"]::-webkit-outer-spin-button { } .preference__option.preference__canvas:not(:last-child) { - padding-right: #{14 / $base-font-size}rem; + padding-right: #{math.div(14, $base-font-size)}rem; } diff --git a/client/styles/components/_preview-frame.scss b/client/styles/components/_preview-frame.scss index 9de4ec7d8c..f56a0d9d27 100644 --- a/client/styles/components/_preview-frame.scss +++ b/client/styles/components/_preview-frame.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .preview-frame-holder { display: flex; flex-direction: column; @@ -13,17 +15,17 @@ } .preview-frame__header { - height: #{29 / $base-font-size}rem; + height: #{math.div(29, $base-font-size)}rem; } .preview-frame__title { @include themify() { color: getThemifyVariable('secondary-text-color'); } - height: #{29 / $base-font-size}rem; - padding-top: #{7 / $base-font-size}rem; - padding-left: #{5 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + height: #{math.div(29, $base-font-size)}rem; + padding-top: #{math.div(7, $base-font-size)}rem; + padding-left: #{math.div(5, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; font-weight: normal; } diff --git a/client/styles/components/_preview-nav.scss b/client/styles/components/_preview-nav.scss index 47b39437f4..82cb626cc5 100644 --- a/client/styles/components/_preview-nav.scss +++ b/client/styles/components/_preview-nav.scss @@ -1,7 +1,9 @@ +@use "sass:math"; + .preview-nav__editor-svg { & svg { - width: #{22 / $base-font-size}rem; - height: #{22 / $base-font-size}rem; + width: #{math.div(22, $base-font-size)}rem; + height: #{math.div(22, $base-font-size)}rem; @include themify() { fill: getThemifyVariable('button-nav-inactive-color'); } @@ -15,6 +17,6 @@ .preview-nav { .nav__item { - margin-left: #{5 / $base-font-size}rem; + margin-left: #{math.div(5, $base-font-size)}rem; } } diff --git a/client/styles/components/_quick-add.scss b/client/styles/components/_quick-add.scss index 70a097fa1e..1a47b992c5 100644 --- a/client/styles/components/_quick-add.scss +++ b/client/styles/components/_quick-add.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .quick-add { width: auto; overflow-y: auto; @@ -10,8 +12,8 @@ .quick-add__item { display: flex; align-items: center; - height: #{64 / $base-font-size}rem; - padding-right: #{24 / $base-font-size}rem; + height: #{math.div(64, $base-font-size)}rem; + padding-right: #{math.div(24, $base-font-size)}rem; button, a { @include themify() { @@ -37,9 +39,9 @@ .quick-add__icon { display: inline-block; - margin-right:#{15 / $base-font-size}rem; - width:#{35 / $base-font-size}rem; - height:#{35 / $base-font-size}rem; + margin-right:#{math.div(15, $base-font-size)}rem; + width:#{math.div(35, $base-font-size)}rem; + height:#{math.div(35, $base-font-size)}rem; @include icon(); @include themify() { // icon graphic @@ -53,8 +55,8 @@ } & svg { - width:#{35 / $base-font-size}rem; - height:#{35 / $base-font-size}rem; + width:#{math.div(35, $base-font-size)}rem; + height:#{math.div(35, $base-font-size)}rem; } } } diff --git a/client/styles/components/_reset-password.scss b/client/styles/components/_reset-password.scss index 47109a3af9..de0af012f2 100644 --- a/client/styles/components/_reset-password.scss +++ b/client/styles/components/_reset-password.scss @@ -1,14 +1,16 @@ +@use "sass:math"; + .reset-password__submitted { - width: #{360 / $base-font-size}rem; + width: #{math.div(360, $base-font-size)}rem; display: none; text-align: left; - font-size: #{12 / $base-font-size}rem; - margin-top: #{10 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; + margin-top: #{math.div(10, $base-font-size)}rem; @include themify() { color: getThemifyVariable('form-navigation-options-color'); } - padding-right: #{30 / $base-font-size}rem; - padding-left: #{39 / $base-font-size}rem; + padding-right: #{math.div(30, $base-font-size)}rem; + padding-left: #{math.div(39, $base-font-size)}rem; .reset-password--submitted & { display: block; } diff --git a/client/styles/components/_searchbar.scss b/client/styles/components/_searchbar.scss index 962542d559..78e065ab41 100644 --- a/client/styles/components/_searchbar.scss +++ b/client/styles/components/_searchbar.scss @@ -1,14 +1,16 @@ +@use "sass:math"; + .searchbar { position: relative; display: flex; } .searchbar__input { - width: #{240 / $base-font-size}rem; - height: #{36 / $base-font-size}rem; + width: #{math.div(240, $base-font-size)}rem; + height: #{math.div(36, $base-font-size)}rem; border: solid 0.5px; - padding-left: #{36 / $base-font-size}rem; - padding-right: #{38 / $base-font-size}rem; + padding-left: #{math.div(36, $base-font-size)}rem; + padding-right: #{math.div(38, $base-font-size)}rem; @include themify() { border-color: getThemifyVariable('input-border-color'); background-color: getThemifyVariable('input-background-color'); @@ -17,8 +19,8 @@ div.searchbar__button { background-color: unset; - width: #{31 / $base-font-size}rem; - height: #{36 / $base-font-size}rem; + width: #{math.div(31, $base-font-size)}rem; + height: #{math.div(36, $base-font-size)}rem; position: absolute; display: flex; justify-content: center; @@ -34,10 +36,10 @@ div.searchbar__button { .searchbar__icon { display: inline-block; & svg { - width: #{22 / $base-font-size}rem; - height: #{27 / $base-font-size}rem; + width: #{math.div(22, $base-font-size)}rem; + height: #{math.div(27, $base-font-size)}rem; transform: scaleX(-1); - padding-top: #{3 / $base-font-size}rem; + padding-top: #{math.div(3, $base-font-size)}rem; } & path { @include themify() { @@ -48,13 +50,13 @@ div.searchbar__button { .searchbar__clear-button { font-weight: bold; - font-size: #{10 / $base-font-size}rem; + font-size: #{math.div(10, $base-font-size)}rem; text-align: center; border-radius: 2px; align-self: center; position: absolute; - padding: #{3 / $base-font-size}rem #{4 / $base-font-size}rem; - right: #{7 / $base-font-size}rem; + padding: #{math.div(3, $base-font-size)}rem #{math.div(4, $base-font-size)}rem; + right: #{math.div(7, $base-font-size)}rem; @include themify() { color: getThemifyVariable('primary-text-color'); background-color: getThemifyVariable('search-clear-background-color'); diff --git a/client/styles/components/_share.scss b/client/styles/components/_share.scss index 8004ac5b60..074fa22f2c 100644 --- a/client/styles/components/_share.scss +++ b/client/styles/components/_share.scss @@ -1,13 +1,15 @@ +@use "sass:math"; + .share-modal { - padding: #{20 / $base-font-size}rem; + padding: #{math.div(20, $base-font-size)}rem; padding-top: 0; - width: #{500 / $base-font-size}rem; + width: #{math.div(500, $base-font-size)}rem; max-width: 100%; } .share-modal__project-name { - padding-bottom: #{30 / $base-font-size}rem; - font-size: #{16 / $base-font-size}rem; + padding-bottom: #{math.div(30, $base-font-size)}rem; + font-size: #{math.div(16, $base-font-size)}rem; } .share-modal__header { @@ -19,5 +21,5 @@ width: 100%; display: flex; flex-wrap: wrap; - padding: #{10 / $base-font-size}rem 0; + padding: #{math.div(10, $base-font-size)}rem 0; } \ No newline at end of file diff --git a/client/styles/components/_sidebar.scss b/client/styles/components/_sidebar.scss index 1e398fe875..1f1d5972e6 100644 --- a/client/styles/components/_sidebar.scss +++ b/client/styles/components/_sidebar.scss @@ -1,19 +1,21 @@ +@use "sass:math"; + .sidebar { display: flex; flex-flow: column; } .sidebar__header { - padding: #{8 / $base-font-size}rem #{12 / $base-font-size}rem; + padding: #{math.div(8, $base-font-size)}rem #{math.div(12, $base-font-size)}rem; display: flex; justify-content: space-between; align-items: center; - min-height: #{29 / $base-font-size}rem; + min-height: #{math.div(29, $base-font-size)}rem; position: relative; } .sidebar__title { - font-size: #{16 / $base-font-size}rem; + font-size: #{math.div(16, $base-font-size)}rem; font-weight: 500; display: inline-block; .sidebar--contracted & { @@ -24,13 +26,13 @@ } .sidebar__add { - padding: #{2 / $base-font-size}rem; + padding: #{math.div(2, $base-font-size)}rem; display: flex; align-items: center; justify-content: center; & svg { - width: #{18 / $base-font-size}rem; - height: #{18 / $base-font-size}rem; + width: #{math.div(18, $base-font-size)}rem; + height: #{math.div(18, $base-font-size)}rem; } @include themify() { background-color: getThemifyVariable('ide-border-color'); @@ -54,7 +56,7 @@ .sidebar__root-item { position: relative; overflow-y: auto; - padding-top: #{6 / $base-font-size}rem; + padding-top: #{math.div(6, $base-font-size)}rem; flex: 1 1 auto; @media (min-width: 770px) { @include themify() { @@ -69,11 +71,11 @@ .file-item__children { display: flex; flex-direction: column; - gap: #{4 / $base-font-size}rem; + gap: #{math.div(4, $base-font-size)}rem; } .sidebar__file-item { - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; cursor: pointer; position: relative; @include themify() { @@ -90,7 +92,7 @@ display: flex; align-items: center; > button { - padding-left: #{1 / $base-font-size}rem; + padding-left: #{math.div(1, $base-font-size)}rem; } } @@ -100,15 +102,15 @@ .file-item__spacer { flex-shrink: 0; .sidebar__file-item & { - width: #{19 / $base-font-size}rem; + width: #{math.div(19, $base-font-size)}rem; .sidebar__file-item & { - width: #{39 / $base-font-size}rem; + width: #{math.div(39, $base-font-size)}rem; .sidebar__file-item & { - width: #{59 / $base-font-size}rem; + width: #{math.div(59, $base-font-size)}rem; .sidebar__file-item & { - width: #{79 / $base-font-size}rem; + width: #{math.div(79, $base-font-size)}rem; .sidebar__file-item & { - width: #{99 / $base-font-size}rem; + width: #{math.div(99, $base-font-size)}rem; } } } @@ -133,7 +135,7 @@ overflow-x: hidden; white-space: nowrap; text-overflow: ellipsis; - min-width: #{7 / $base-font-size}rem; + min-width: #{math.div(7, $base-font-size)}rem; white-space: pre; } @@ -141,16 +143,16 @@ display: flex; width: 100%; overflow: hidden; - min-width: #{50 / $base-font-size}rem; + min-width: #{math.div(50, $base-font-size)}rem; white-space: nowrap; text-align: left; } .sidebar__file-item-name { - padding: #{4 / $base-font-size}rem 0; - padding-right: #{25 / $base-font-size}rem; + padding: #{math.div(4, $base-font-size)}rem 0; + padding-right: #{math.div(25, $base-font-size)}rem; font-family: Inconsolata, monospace; - font-size: #{15 / $base-font-size}rem; + font-size: #{math.div(15, $base-font-size)}rem; overflow: hidden; .sidebar__file-item--editing & { display: none; @@ -170,11 +172,11 @@ } .sidebar__file-item-show-options { - width: #{20 / $base-font-size}rem; - height: #{20 / $base-font-size}rem; + width: #{math.div(20, $base-font-size)}rem; + height: #{math.div(20, $base-font-size)}rem; @include icon(); @include themify() { - margin-right: #{5 / $base-font-size}rem; + margin-right: #{math.div(5, $base-font-size)}rem; } display: none; position: absolute; @@ -192,7 +194,7 @@ } } & svg { - width: #{10 / $base-font-size}rem; + width: #{math.div(10, $base-font-size)}rem; } .sidebar__file-item--open > .file-item__content & { display: inline-block; @@ -203,7 +205,7 @@ @extend %dropdown-open-right; display: none; width: 100%; - max-width: #{180 / $base-font-size}rem; + max-width: #{math.div(180, $base-font-size)}rem; .sidebar__file-item--open > .file-item__content & { display: flex; } @@ -213,9 +215,9 @@ display: none; padding: 0; border: 0; - width: calc(100% - #{63 / $base-font-size}rem); + width: calc(100% - #{math.div(63, $base-font-size)}rem); font-family: Inconsolata, monospace; - font-size: #{14 / $base-font-size}rem; + font-size: #{math.div(14, $base-font-size)}rem; .sidebar__file-item--editing & { display: inline-block; } @@ -225,10 +227,10 @@ .sidebar__contract { @include icon(); position: absolute; - top: #{2 / $base-font-size}rem; - left: #{0 / $base-font-size}rem; - height: #{25 / $base-font-size}rem; - width: #{49 / $base-font-size}rem; + top: #{math.div(2, $base-font-size)}rem; + left: #{math.div(0, $base-font-size)}rem; + height: #{math.div(25, $base-font-size)}rem; + width: #{math.div(49, $base-font-size)}rem; border-radius: 2px; display: flex; justify-content: center; @@ -276,20 +278,20 @@ } .sidebar__folder-icon { - padding: #{4 / $base-font-size}rem 0; - margin-right: #{5 / $base-font-size}rem; + padding: #{math.div(4, $base-font-size)}rem 0; + margin-right: #{math.div(5, $base-font-size)}rem; & path { @include themify() { fill: map-get($theme-map, 'primary-text-color'); } } & svg { - width: #{10 / $base-font-size}rem; + width: #{math.div(10, $base-font-size)}rem; } } .sidebar__file-item-icon { - margin-right: #{5 / $base-font-size}rem; + margin-right: #{math.div(5, $base-font-size)}rem; display: flex; align-items: center; & path { @@ -325,7 +327,7 @@ @extend %dropdown-open-right; display: none; width: 100%; - max-width: #{180 / $base-font-size}rem; + max-width: #{math.div(180, $base-font-size)}rem; .sidebar--project-options & { display: flex; } diff --git a/client/styles/components/_sketch-list.scss b/client/styles/components/_sketch-list.scss index 69d41bdca4..b46ffe025a 100644 --- a/client/styles/components/_sketch-list.scss +++ b/client/styles/components/_sketch-list.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + .sketches-table-container { overflow-y: auto; max-width: 100%; @@ -11,7 +13,7 @@ .sketches-table { display: flex; flex-direction: column; - padding: #{16 / $base-font-size}rem; + padding: #{math.div(16, $base-font-size)}rem; height: 100%; overflow-y: auto; @@ -22,16 +24,16 @@ tbody { display: flex; flex-direction: column; - gap: #{12 / $base-font-size}rem; + gap: #{math.div(12, $base-font-size)}rem; .sketches-table__row { margin: 0; position: relative; display: flex; flex-wrap: wrap; - padding: #{15 / $base-font-size}rem; + padding: #{math.div(15, $base-font-size)}rem; height: fit-content; - gap: #{8 / $base-font-size}rem; + gap: #{math.div(8, $base-font-size)}rem; @include themify() { border: 1px solid getThemifyVariable("modal-border-color"); @@ -42,13 +44,13 @@ padding-left: 0; width: 100%; font-weight: bold; - margin-bottom: #{6 / $base-font-size}rem; + margin-bottom: #{math.div(6, $base-font-size)}rem; } > td { padding-left: 0; width: 30%; - font-size: #{14 / $base-font-size}rem; + font-size: #{math.div(14, $base-font-size)}rem; @include themify() { color: getThemifyVariable("modal-border-color"); @@ -60,7 +62,7 @@ top: 0; right: 0; width: auto; - margin: #{8 / $base-font-size}rem; + margin: #{math.div(8, $base-font-size)}rem; .sketch-list__dropdown-button { transform: rotateZ(90deg) translateX(-30%); @@ -79,13 +81,13 @@ max-height: 100%; border-spacing: 0; & .sketch-list__dropdown-column { - width: #{60 / $base-font-size}rem; + width: #{math.div(60, $base-font-size)}rem; position: relative; } } .sketches-table thead th { - height: #{32 / $base-font-size}rem; + height: #{math.div(32, $base-font-size)}rem; position: sticky; top: 0; z-index: 1; @@ -97,10 +99,10 @@ .sketch-list__sort-button { display: flex; align-items: center; - height: #{35 / $base-font-size}rem; + height: #{math.div(35, $base-font-size)}rem; & .isvg { - margin-left: #{8 / $base-font-size}rem; + margin-left: #{math.div(8, $base-font-size)}rem; } & svg { @@ -112,7 +114,7 @@ .sketches-table__header { border-bottom: 2px dashed transparent; - padding: #{3 / $base-font-size}rem 0; + padding: #{math.div(3, $base-font-size)}rem 0; @include themify() { color: getThemifyVariable("inactive-text-color"); } @@ -125,13 +127,13 @@ } .sketches-table thead th:nth-child(1) { - padding-left: #{12 / $base-font-size}rem; + padding-left: #{math.div(12, $base-font-size)}rem; } .sketches-table__row { - margin: #{10 / $base-font-size}rem; - height: #{72 / $base-font-size}rem; - font-size: #{16 / $base-font-size}rem; + margin: #{math.div(10, $base-font-size)}rem; + height: #{math.div(72, $base-font-size)}rem; + font-size: #{math.div(16, $base-font-size)}rem; } .sketches-table__row:nth-child(odd) { @@ -141,11 +143,11 @@ } .sketches-table__row > th:nth-child(1) { - padding-left: #{12 / $base-font-size}rem; + padding-left: #{math.div(12, $base-font-size)}rem; } .sketches-table__row > td { - padding-left: #{8 / $base-font-size}rem; + padding-left: #{math.div(8, $base-font-size)}rem; } .sketches-table__row a { @@ -159,7 +161,7 @@ } .sketches-table thead { - font-size: #{12 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; @include themify() { color: getThemifyVariable("inactive-text-color"); } @@ -170,8 +172,8 @@ } .sketch-list__dropdown-button { - width: #{25 / $base-font-size}rem; - height: #{25 / $base-font-size}rem; + width: #{math.div(25, $base-font-size)}rem; + height: #{math.div(25, $base-font-size)}rem; @include themify() { & polygon, & path { @@ -186,7 +188,7 @@ } .sketches-table__icon-cell { - width: #{35 / $base-font-size}rem; + width: #{math.div(35, $base-font-size)}rem; } .sketch-list__action-dialogue { @@ -197,6 +199,6 @@ .sketches-table__empty { text-align: center; - font-size: #{16 / $base-font-size}rem; - padding: #{42 / $base-font-size}rem 0; + font-size: #{math.div(16, $base-font-size)}rem; + padding: #{math.div(42, $base-font-size)}rem 0; } diff --git a/client/styles/components/_tabs.scss b/client/styles/components/_tabs.scss index 444b7186c0..7f2d953237 100644 --- a/client/styles/components/_tabs.scss +++ b/client/styles/components/_tabs.scss @@ -1,7 +1,9 @@ +@use "sass:math"; + .tabs__titles { display: flex; flex-wrap: wrap; - padding-bottom: #{0.1 / $base-font-size}rem; + padding-bottom: #{math.div(0.1, $base-font-size)}rem; @include themify() { border-bottom: 1px solid getThemifyVariable('button-border-color'); } @@ -19,16 +21,16 @@ cursor: pointer; } } - font-size: #{12 / $base-font-size}rem; - height: #{20 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; + height: #{math.div(20, $base-font-size)}rem; width: 100%; margin: 0; - padding: 0 #{5 /$base-font-size}rem; + padding: 0 #{math.div(5, $base-font-size)}rem; } .react-tabs__tab--selected { @include themify() { - border-bottom: #{4 / $base-font-size}rem solid getThemifyVariable('button-background-hover-color'); + border-bottom: #{math.div(4, $base-font-size)}rem solid getThemifyVariable('button-background-hover-color'); } } @@ -43,9 +45,9 @@ color: black; display: flex; align-items: center; - border-bottom: #{4 / $base-font-size}rem solid transparent; + border-bottom: #{math.div(4, $base-font-size)}rem solid transparent; & + & { - margin-left: #{45 / $base-font-size}rem; + margin-left: #{math.div(45, $base-font-size)}rem; } } @@ -61,9 +63,9 @@ cursor: pointer; } } - font-size: #{12 / $base-font-size}rem; - height: #{20 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; + height: #{math.div(20, $base-font-size)}rem; width: 100%; margin: 0; - padding: 0 #{5 /$base-font-size}rem; + padding: 0 #{math.div(5, $base-font-size)}rem; } diff --git a/client/styles/components/_timer.scss b/client/styles/components/_timer.scss index 1c377e121d..c258bf5bf0 100644 --- a/client/styles/components/_timer.scss +++ b/client/styles/components/_timer.scss @@ -1,9 +1,11 @@ +@use "sass:math"; + .timer__saved-time { @include themify() { color: getThemifyVariable('inactive-text-color'); } - font-size: #{12 / $base-font-size}rem; - padding-right: #{30 / $base-font-size}rem; + font-size: #{math.div(12, $base-font-size)}rem; + padding-right: #{math.div(30, $base-font-size)}rem; &.timer__saved-time--notOwner { display: none; } diff --git a/client/styles/components/_toast.scss b/client/styles/components/_toast.scss index 2b3c0db50f..c52793c5cb 100644 --- a/client/styles/components/_toast.scss +++ b/client/styles/components/_toast.scss @@ -1,13 +1,15 @@ +@use "sass:math"; + .toast { background-color: $toast-background-color; color: $toast-text-color; - padding: #{10 / $base-font-size}rem; + padding: #{math.div(10, $base-font-size)}rem; position: fixed; top: 0; left: 50%; transform: translate(-50%, 0); - min-width: #{375 / $base-font-size}rem; //500px - font-size: #{20 / $base-font-size}rem; + min-width: #{math.div(375, $base-font-size)}rem; //500px + font-size: #{math.div(20, $base-font-size)}rem; display: flex; z-index: 9999; align-items: center; @@ -19,6 +21,6 @@ @include themify() { @extend %icon-toast; } - padding-top: #{10 / $base-font-size}rem; - margin-left: #{40 / $base-font-size}rem; + padding-top: #{math.div(10, $base-font-size)}rem; + margin-left: #{math.div(40, $base-font-size)}rem; } \ No newline at end of file diff --git a/client/styles/components/_toolbar.scss b/client/styles/components/_toolbar.scss index e4b9b86742..1d40c06779 100644 --- a/client/styles/components/_toolbar.scss +++ b/client/styles/components/_toolbar.scss @@ -1,10 +1,12 @@ +@use "sass:math"; + .toolbar__play-button { @include themify() { @extend %toolbar-button; display: flex; justify-content: center; align-items: center; - padding: 0 0 0 #{3 / $base-font-size}rem; + padding: 0 0 0 #{math.div(3, $base-font-size)}rem; &--selected { @extend %toolbar-button--selected; } @@ -21,14 +23,14 @@ } } } - margin-right: #{15 / $base-font-size}rem; + margin-right: #{math.div(15, $base-font-size)}rem; span { - padding-left: #{4 / $base-font-size}rem; + padding-left: #{math.div(4, $base-font-size)}rem; display: flex; align-items: center; justify-content: center; - width: #{20 / $base-font-size}rem; - height: #{20 / $base-font-size}rem; + width: #{math.div(20, $base-font-size)}rem; + height: #{math.div(20, $base-font-size)}rem; } } @@ -42,7 +44,7 @@ display: flex; justify-content: center; align-items: center; - margin-right: #{15 / $base-font-size}rem; + margin-right: #{math.div(15, $base-font-size)}rem; padding: 0; &--selected { @extend %toolbar-button--selected; @@ -52,8 +54,8 @@ display: flex; align-items: center; justify-content: center; - width: #{20 / $base-font-size}rem; - height: #{20 / $base-font-size}rem; + width: #{math.div(20, $base-font-size)}rem; + height: #{math.div(20, $base-font-size)}rem; } } @@ -70,17 +72,17 @@ } margin-left: auto; & span { - padding-left: #{1 / $base-font-size}rem; + padding-left: #{math.div(1, $base-font-size)}rem; display: flex; align-items: center; justify-content: center; - width: #{20 / $base-font-size}rem; - height: #{20 / $base-font-size}rem; + width: #{math.div(20, $base-font-size)}rem; + height: #{math.div(20, $base-font-size)}rem; } } .toolbar__logo { - margin-right: #{30 / $base-font-size}rem; + margin-right: #{math.div(30, $base-font-size)}rem; @include themify() { & g, & path { fill: getThemifyVariable('logo-color'); @@ -89,7 +91,7 @@ } .toolbar { - padding: #{10 / $base-font-size}rem #{20 / $base-font-size}rem; + padding: #{math.div(10, $base-font-size)}rem #{math.div(20, $base-font-size)}rem; display: flex; align-items: center; @include themify() { @@ -98,8 +100,8 @@ } .toolbar__project-name-container { - margin-left: #{10 / $base-font-size}rem; - padding-left: #{10 / $base-font-size}rem; + margin-left: #{math.div(10, $base-font-size)}rem; + padding-left: #{math.div(10, $base-font-size)}rem; display: flex; align-items: center; } @@ -118,7 +120,7 @@ } .toolbar__project-owner { - margin-left: #{5 / $base-font-size}rem; + margin-left: #{math.div(5, $base-font-size)}rem; @include themify() { color: getThemifyVariable('secondary-text-color'); } @@ -128,8 +130,8 @@ @include themify() { color: getThemifyVariable('secondary-text-color'); } - margin-left: #{5 / $base-font-size}rem; - font-size: #{12 / $base-font-size}rem; + margin-left: #{math.div(5, $base-font-size)}rem; + font-size: #{math.div(12, $base-font-size)}rem; } .toolbar__autorefresh { diff --git a/client/styles/layout/_dashboard.scss b/client/styles/layout/_dashboard.scss index 6a5a374fe2..fea65f2809 100644 --- a/client/styles/layout/_dashboard.scss +++ b/client/styles/layout/_dashboard.scss @@ -1,9 +1,11 @@ +@use "sass:math"; + .dashboard-content { display: flex; flex-direction: column; flex: 1; overflow: hidden; - max-width: #{1012 / $base-font-size}rem; + max-width: #{math.div(1012, $base-font-size)}rem; margin: 0 auto; width: 100%; diff --git a/client/styles/main.scss b/client/styles/main.scss index 9018fe6273..dbef1e9920 100644 --- a/client/styles/main.scss +++ b/client/styles/main.scss @@ -6,11 +6,11 @@ @import 'base/reset'; @import 'base/base'; -@import 'node_modules/codemirror/lib/codemirror'; -@import 'node_modules/codemirror/addon/lint/lint'; -@import 'node_modules/codemirror-colorpicker/addon/codemirror-colorpicker'; -@import 'node_modules/dropzone/dist/dropzone'; -@import 'node_modules/primer-tooltips/build/build'; +@import '../../node_modules/codemirror/lib/codemirror'; +@import '../../node_modules/codemirror/addon/lint/lint'; +@import '../../node_modules/codemirror-colorpicker/addon/codemirror-colorpicker'; +@import '../../node_modules/dropzone/dist/dropzone'; +@import '../../node_modules/primer-tooltips/build/build'; @import 'components/p5-light-codemirror-theme'; @import 'components/p5-dark-codemirror-theme'; diff --git a/package-lock.json b/package-lock.json index 7d314d654b..008a8a3f87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -170,7 +170,6 @@ "lint-staged": "^10.5.4", "mini-css-extract-plugin": "^1.6.2", "msw": "^0.35.0", - "node-sass": "^7.0.1", "nodemon": "^2.0.22", "os-browserify": "^0.3.0", "postcss": "^8.4.12", @@ -180,6 +179,7 @@ "react-test-renderer": "^16.14.0", "redux-mock-store": "^1.5.4", "rimraf": "^2.7.1", + "sass": "^1.66.1", "sass-loader": "^12.6.0", "storybook": "^7.0.27", "storybook-addon-theme-playground": "^2.2.0", @@ -3673,7 +3673,9 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@gatsbyjs/webpack-hot-middleware": { "version": "2.25.3", @@ -5653,6 +5655,8 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -5663,6 +5667,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -5675,6 +5681,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5689,13 +5697,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -5709,6 +5721,8 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "optional": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -5721,6 +5735,8 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -15818,7 +15834,9 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/@types/mongodb": { "version": "3.6.20", @@ -16512,6 +16530,8 @@ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.0", "depd": "^1.1.2", @@ -16985,6 +17005,8 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -16994,6 +17016,8 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -17015,6 +17039,8 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8" } @@ -17061,6 +17087,8 @@ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -17230,6 +17258,8 @@ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -17238,7 +17268,9 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/axe-core": { "version": "4.3.1", @@ -17975,6 +18007,8 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -18462,6 +18496,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -18523,7 +18559,9 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/chalk": { "version": "2.4.2", @@ -21076,6 +21114,8 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -21183,6 +21223,8 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21192,6 +21234,8 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -21205,6 +21249,8 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21411,6 +21457,8 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -21691,6 +21739,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -21782,6 +21832,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "optional": true, + "peer": true, "dependencies": { "iconv-lite": "~0.4.13" } @@ -21850,6 +21901,8 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -21870,7 +21923,9 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/error-ex": { "version": "1.3.2", @@ -23792,7 +23847,9 @@ "dev": true, "engines": [ "node >=0.6.0" - ] + ], + "optional": true, + "peer": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -24307,6 +24364,8 @@ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -24476,6 +24535,8 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -24622,6 +24683,8 @@ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "globule": "^1.0.0" }, @@ -24699,6 +24762,8 @@ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24720,6 +24785,8 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -24842,6 +24909,8 @@ "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "~7.1.1", "lodash": "~4.17.10", @@ -24942,6 +25011,8 @@ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -24952,6 +25023,8 @@ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "deprecated": "this library is no longer supported", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -24965,6 +25038,8 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6" } @@ -25471,7 +25546,9 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/http-errors": { "version": "2.0.0", @@ -25515,6 +25592,8 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -25551,6 +25630,8 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -25805,6 +25886,12 @@ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -25929,7 +26016,9 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/inflight": { "version": "1.0.6", @@ -25990,7 +26079,9 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -26227,7 +26318,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/is-nan": { "version": "1.3.2", @@ -26505,7 +26598,9 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -31401,7 +31496,9 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/js-beautify": { "version": "1.14.8", @@ -31508,7 +31605,9 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/jscodeshift": { "version": "0.14.0", @@ -31932,7 +32031,9 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -31948,7 +32049,9 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/json5": { "version": "2.2.3", @@ -31987,6 +32090,8 @@ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -32825,6 +32930,8 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", @@ -32852,6 +32959,8 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -32881,6 +32990,8 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -32890,6 +33001,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -32902,6 +33015,8 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "optional": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -32914,6 +33029,8 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -32929,6 +33046,8 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.1.1" }, @@ -32940,7 +33059,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -32956,6 +33077,8 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" }, @@ -33090,6 +33213,8 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -33116,6 +33241,8 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -33128,6 +33255,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -33140,6 +33269,8 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -33155,6 +33286,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -33170,6 +33303,8 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -33181,13 +33316,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/meow/node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -33364,6 +33503,8 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -33378,6 +33519,8 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33387,6 +33530,8 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -33408,6 +33553,8 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -33420,6 +33567,8 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", @@ -33437,6 +33586,8 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -33449,6 +33600,8 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -33461,6 +33614,8 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -34423,7 +34578,9 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/nanoid": { "version": "3.3.6", @@ -34577,6 +34734,8 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -34601,6 +34760,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -34614,6 +34775,8 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -34633,6 +34796,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -34645,6 +34810,8 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abbrev": "1" }, @@ -34660,6 +34827,8 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -34675,6 +34844,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -34689,6 +34860,8 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -34704,6 +34877,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -34719,6 +34894,8 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -34733,7 +34910,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/node-int64": { "version": "0.4.0", @@ -34758,6 +34937,8 @@ "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "async-foreach": "^0.1.3", "chalk": "^4.1.2", @@ -34787,6 +34968,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -34802,6 +34985,8 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -34818,6 +35003,8 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -34829,13 +35016,17 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/node-sass/node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -34850,6 +35041,8 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -34859,6 +35052,8 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -34868,6 +35063,8 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -34880,6 +35077,8 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -34889,6 +35088,8 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -34901,6 +35102,8 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -35121,6 +35324,8 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -35962,7 +36167,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/picocolors": { "version": "1.0.0", @@ -37669,13 +37876,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -37942,6 +38153,8 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -39081,6 +39294,8 @@ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, + "optional": true, + "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -39112,6 +39327,8 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -39121,6 +39338,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -39135,6 +39354,8 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, + "optional": true, + "peer": true, "bin": { "uuid": "bin/uuid" } @@ -39259,6 +39480,8 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 4" } @@ -39368,11 +39591,30 @@ "node": ">=6" } }, + "node_modules/sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/sass-graph": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "^7.0.0", "lodash": "^4.17.11", @@ -39391,6 +39633,8 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -39400,6 +39644,8 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -39499,6 +39745,8 @@ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "js-base64": "^2.4.3", "source-map": "^0.7.1" @@ -39509,6 +39757,8 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -39937,6 +40187,8 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -39947,6 +40199,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "ip": "^1.1.5", "smart-buffer": "^4.2.0" @@ -39961,6 +40215,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -40078,6 +40334,8 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -40157,6 +40415,8 @@ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.1" } @@ -41254,6 +41514,8 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" } @@ -41272,6 +41534,8 @@ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.2" } @@ -41321,6 +41585,8 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -41332,7 +41598,9 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/type-check": { "version": "0.3.2", @@ -41552,6 +41820,8 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -41561,6 +41831,8 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -41924,6 +42196,8 @@ "engines": [ "node >=0.6.0" ], + "optional": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -42816,6 +43090,8 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -45308,7 +45584,9 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "@gatsbyjs/webpack-hot-middleware": { "version": "2.25.3", @@ -46875,6 +47153,8 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" @@ -46885,6 +47165,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -46894,6 +47176,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -46902,7 +47186,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -46911,6 +47197,8 @@ "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "dev": true, + "optional": true, + "peer": true, "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -46920,13 +47208,17 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "optional": true, + "peer": true, "requires": { "glob": "^7.1.3" } @@ -54210,7 +54502,9 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "@types/mongodb": { "version": "3.6.20", @@ -54814,6 +55108,8 @@ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, + "optional": true, + "peer": true, "requires": { "debug": "^4.1.0", "depd": "^1.1.2", @@ -55162,13 +55458,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, + "optional": true, + "peer": true, "requires": { "safer-buffer": "~2.1.0" } @@ -55189,7 +55489,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "ast-types": { "version": "0.16.1", @@ -55228,7 +55530,9 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "async-limiter": { "version": "1.0.1", @@ -55357,13 +55661,17 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "aws4": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "axe-core": { "version": "4.3.1", @@ -55936,6 +56244,8 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, + "optional": true, + "peer": true, "requires": { "tweetnacl": "^0.14.3" } @@ -56304,6 +56614,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "optional": true, + "peer": true, "requires": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -56342,7 +56654,9 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "chalk": { "version": "2.4.2", @@ -58156,6 +58470,8 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, + "optional": true, + "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -58233,13 +58549,17 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", "dev": true, + "optional": true, + "peer": true, "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -58249,7 +58569,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -58409,7 +58731,9 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "dequal": { "version": "2.0.3", @@ -58653,6 +58977,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, + "optional": true, + "peer": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -58719,6 +59045,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "optional": true, + "peer": true, "requires": { "iconv-lite": "~0.4.13" } @@ -58776,7 +59103,9 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "envinfo": { "version": "7.8.1", @@ -58788,7 +59117,9 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "error-ex": { "version": "1.3.2", @@ -60209,7 +60540,9 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "fast-deep-equal": { "version": "3.1.3", @@ -60606,7 +60939,9 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "fork-ts-checker-webpack-plugin": { "version": "7.3.0", @@ -60725,6 +61060,8 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -60839,6 +61176,8 @@ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, + "optional": true, + "peer": true, "requires": { "globule": "^1.0.0" } @@ -60891,7 +61230,9 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "get-stream": { "version": "6.0.1", @@ -60904,6 +61245,8 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, + "optional": true, + "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -61009,6 +61352,8 @@ "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dev": true, + "optional": true, + "peer": true, "requires": { "glob": "~7.1.1", "lodash": "~4.17.10", @@ -61087,13 +61432,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, + "optional": true, + "peer": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -61103,7 +61452,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "has": { "version": "1.0.3", @@ -61479,7 +61830,9 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "http-errors": { "version": "2.0.0", @@ -61516,6 +61869,8 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, + "optional": true, + "peer": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -61542,6 +61897,8 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dev": true, + "optional": true, + "peer": true, "requires": { "ms": "^2.0.0" } @@ -61724,6 +62081,12 @@ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -61816,7 +62179,9 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "inflight": { "version": "1.0.6", @@ -61871,7 +62236,9 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "ipaddr.js": { "version": "1.9.1", @@ -62029,7 +62396,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "is-nan": { "version": "1.3.2", @@ -62222,7 +62591,9 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -66045,7 +66416,9 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "js-beautify": { "version": "1.14.8", @@ -66125,7 +66498,9 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "jscodeshift": { "version": "0.14.0", @@ -66449,7 +66824,9 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "json-schema-traverse": { "version": "0.4.1", @@ -66465,7 +66842,9 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "json5": { "version": "2.2.3", @@ -66495,6 +66874,8 @@ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, + "optional": true, + "peer": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -67143,6 +67524,8 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "dev": true, + "optional": true, + "peer": true, "requires": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", @@ -67167,6 +67550,8 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", @@ -67192,13 +67577,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -67207,13 +67596,17 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "optional": true, + "peer": true, "requires": { "glob": "^7.1.3" } @@ -67223,6 +67616,8 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "minipass": "^3.1.1" } @@ -67231,7 +67626,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -67248,7 +67645,9 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "map-or-similar": { "version": "1.5.0", @@ -67352,6 +67751,8 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -67372,6 +67773,8 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -67381,6 +67784,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -67390,6 +67795,8 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "optional": true, + "peer": true, "requires": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -67402,6 +67809,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -67410,19 +67819,25 @@ "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -67544,6 +67959,8 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "optional": true, + "peer": true, "requires": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -67554,13 +67971,17 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -67586,6 +68007,8 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "optional": true, + "peer": true, "requires": { "minipass": "^3.0.0" } @@ -67595,6 +68018,8 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", "dev": true, + "optional": true, + "peer": true, "requires": { "encoding": "^0.1.12", "minipass": "^3.1.0", @@ -67607,6 +68032,8 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "optional": true, + "peer": true, "requires": { "minipass": "^3.0.0" } @@ -67616,6 +68043,8 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "optional": true, + "peer": true, "requires": { "minipass": "^3.0.0" } @@ -67625,6 +68054,8 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "optional": true, + "peer": true, "requires": { "minipass": "^3.0.0" } @@ -68425,7 +68856,9 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "nanoid": { "version": "3.3.6", @@ -68554,6 +68987,8 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, + "optional": true, + "peer": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -68572,6 +69007,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", "dev": true, + "optional": true, + "peer": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -68582,6 +69019,8 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, + "optional": true, + "peer": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -68598,6 +69037,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "optional": true, + "peer": true, "requires": { "yallist": "^4.0.0" } @@ -68607,6 +69048,8 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "abbrev": "1" } @@ -68616,6 +69059,8 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, + "optional": true, + "peer": true, "requires": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -68628,6 +69073,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "optional": true, + "peer": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -68639,6 +69086,8 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "optional": true, + "peer": true, "requires": { "glob": "^7.1.3" } @@ -68648,6 +69097,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -68657,6 +69108,8 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "optional": true, + "peer": true, "requires": { "isexe": "^2.0.0" } @@ -68665,7 +69118,9 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -68691,6 +69146,8 @@ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz", "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "async-foreach": "^0.1.3", "chalk": "^4.1.2", @@ -68714,6 +69171,8 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "optional": true, + "peer": true, "requires": { "color-convert": "^2.0.1" } @@ -68723,6 +69182,8 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "optional": true, + "peer": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -68733,6 +69194,8 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "color-name": "~1.1.4" } @@ -68741,13 +69204,17 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "optional": true, + "peer": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -68758,19 +69225,25 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "optional": true, + "peer": true, "requires": { "shebang-regex": "^3.0.0" } @@ -68779,13 +69252,17 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "optional": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -68795,6 +69272,8 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "optional": true, + "peer": true, "requires": { "isexe": "^2.0.0" } @@ -68970,7 +69449,9 @@ "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "object-assign": { "version": "4.1.1", @@ -69601,7 +70082,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "picocolors": { "version": "1.0.0", @@ -70871,13 +71354,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "optional": true, + "peer": true, "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -71081,7 +71568,9 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "ramda": { "version": "0.29.0", @@ -71973,6 +72462,8 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, + "optional": true, + "peer": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -72000,13 +72491,17 @@ "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, + "optional": true, + "peer": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -72016,7 +72511,9 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -72111,7 +72608,9 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "reusify": { "version": "1.0.4", @@ -72190,11 +72689,24 @@ "sparse-bitfield": "^3.0.3" } }, + "sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, "sass-graph": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz", "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "glob": "^7.0.0", "lodash": "^4.17.11", @@ -72206,13 +72718,17 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "yargs": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", "dev": true, + "optional": true, + "peer": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -72273,6 +72789,8 @@ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz", "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "js-base64": "^2.4.3", "source-map": "^0.7.1" @@ -72282,7 +72800,9 @@ "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true } } }, @@ -72641,13 +73161,17 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "socks": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dev": true, + "optional": true, + "peer": true, "requires": { "ip": "^1.1.5", "smart-buffer": "^4.2.0" @@ -72658,6 +73182,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -72758,6 +73284,8 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, + "optional": true, + "peer": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -72825,6 +73353,8 @@ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, + "optional": true, + "peer": true, "requires": { "readable-stream": "^2.0.1" } @@ -73681,7 +74211,9 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "trough": { "version": "1.0.5", @@ -73693,6 +74225,8 @@ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, + "optional": true, + "peer": true, "requires": { "glob": "^7.1.2" } @@ -73733,6 +74267,8 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, + "optional": true, + "peer": true, "requires": { "safe-buffer": "^5.0.1" } @@ -73741,7 +74277,9 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "type-check": { "version": "0.3.2", @@ -73896,6 +74434,8 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, + "optional": true, + "peer": true, "requires": { "unique-slug": "^2.0.0" } @@ -73905,6 +74445,8 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, + "optional": true, + "peer": true, "requires": { "imurmurhash": "^0.1.4" } @@ -74169,6 +74711,8 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, + "optional": true, + "peer": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -74842,7 +75386,9 @@ "version": "21.0.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index 569631aef2..dad49cfb36 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "update-syntax-highlighting": "node ./server/scripts/update-syntax-highlighting.js", "update-p5-hinter": "node ./server/scripts/update-p5-hinter.js", "heroku-postbuild": "touch .env; npm run build", - "storybook:build:css": "node-sass client/styles/main.scss client/styles/storybook.css", + "storybook:build:css": "sass client/styles/main.scss client/styles/storybook.css", + "migrate-sass": "sass-migrator division 'client/styles/**/*.scss'", "storybook": "npm run storybook:build:css && storybook dev -p 6006", "build-storybook": "storybook build" }, @@ -130,7 +131,6 @@ "lint-staged": "^10.5.4", "mini-css-extract-plugin": "^1.6.2", "msw": "^0.35.0", - "node-sass": "^7.0.1", "nodemon": "^2.0.22", "os-browserify": "^0.3.0", "postcss": "^8.4.12", @@ -140,6 +140,7 @@ "react-test-renderer": "^16.14.0", "redux-mock-store": "^1.5.4", "rimraf": "^2.7.1", + "sass": "^1.66.1", "sass-loader": "^12.6.0", "storybook": "^7.0.27", "storybook-addon-theme-playground": "^2.2.0", From f2ed92e1bf5e424d79f51dc01bdb899e5c9baca9 Mon Sep 17 00:00:00 2001 From: luckyklyist Date: Thu, 14 Sep 2023 14:57:29 +0545 Subject: [PATCH 031/254] confusing icons hover issue fix #2255 --- .../IDE/components/QuickAddList/Icons.jsx | 6 ---- client/styles/components/_quick-add.scss | 36 +++++++++---------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/client/modules/IDE/components/QuickAddList/Icons.jsx b/client/modules/IDE/components/QuickAddList/Icons.jsx index 34363bf63f..868d8cb257 100644 --- a/client/modules/IDE/components/QuickAddList/Icons.jsx +++ b/client/modules/IDE/components/QuickAddList/Icons.jsx @@ -20,12 +20,6 @@ const Icons = ({ isAdded }) => { aria-label="Descending" focusable="false" /> - Date: Thu, 14 Sep 2023 15:06:35 +0545 Subject: [PATCH 032/254] lint fix --- client/modules/IDE/components/QuickAddList/Icons.jsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/modules/IDE/components/QuickAddList/Icons.jsx b/client/modules/IDE/components/QuickAddList/Icons.jsx index 868d8cb257..7f25011a55 100644 --- a/client/modules/IDE/components/QuickAddList/Icons.jsx +++ b/client/modules/IDE/components/QuickAddList/Icons.jsx @@ -1,7 +1,5 @@ import React from 'react'; import PropTypes from 'prop-types'; - -import CheckIcon from '../../../../images/check_encircled.svg'; import CloseIcon from '../../../../images/close.svg'; const Icons = ({ isAdded }) => { From 913d582da8482844a172ee1eeac2aa2d0c1ed07b Mon Sep 17 00:00:00 2001 From: luckyklyist Date: Thu, 14 Sep 2023 15:21:30 +0545 Subject: [PATCH 033/254] removed the sass-migrator from the package.json after migration from node-sass --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index dad49cfb36..a0f9606ecd 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "update-p5-hinter": "node ./server/scripts/update-p5-hinter.js", "heroku-postbuild": "touch .env; npm run build", "storybook:build:css": "sass client/styles/main.scss client/styles/storybook.css", - "migrate-sass": "sass-migrator division 'client/styles/**/*.scss'", "storybook": "npm run storybook:build:css && storybook dev -p 6006", "build-storybook": "storybook build" }, From 2ad0c3a2d2f2f15c38217a7f6f42624c4a649140 Mon Sep 17 00:00:00 2001 From: Ankush263 Date: Fri, 15 Sep 2023 16:04:21 +0530 Subject: [PATCH 034/254] Update the S3/AWS client package --- package.json | 1 + server/controllers/aws.controller.js | 289 ++++++++++++--------------- server/migrations/s3UnderUser.js | 170 ++++++++-------- 3 files changed, 221 insertions(+), 239 deletions(-) diff --git a/package.json b/package.json index 569631aef2..0ba3d24808 100644 --- a/package.json +++ b/package.json @@ -155,6 +155,7 @@ }, "dependencies": { "@auth0/s3": "^1.0.0", + "@aws-sdk/client-s3": "^3.412.0", "@babel/core": "^7.14.6", "@babel/register": "^7.14.5", "@emmetio/codemirror-plugin": "^1.2.4", diff --git a/server/controllers/aws.controller.js b/server/controllers/aws.controller.js index 91d3d487be..0ef0fafa4c 100644 --- a/server/controllers/aws.controller.js +++ b/server/controllers/aws.controller.js @@ -1,23 +1,24 @@ import { v4 as uuidv4 } from 'uuid'; import S3Policy from 's3-policy-v4'; -import s3 from '@auth0/s3'; +import { + S3Client, + HeadObjectCommand, + CopyObjectCommand, + ListObjectsCommand, + DeleteObjectsCommand +} from '@aws-sdk/client-s3'; import mongoose from 'mongoose'; import { getProjectsForUserId } from './project.controller'; import { findUserByUsername } from './user.controller'; const { ObjectId } = mongoose.Types; -const client = s3.createClient({ - maxAsyncS3: 20, - s3RetryCount: 3, - s3RetryDelay: 1000, - multipartUploadThreshold: 20971520, // this is the default (20 MB) - multipartUploadSize: 15728640, // this is the default (15 MB) - s3Options: { - accessKeyId: `${process.env.AWS_ACCESS_KEY}`, - secretAccessKey: `${process.env.AWS_SECRET_KEY}`, - region: `${process.env.AWS_REGION}` - } +const s3Client = new S3Client({ + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY, + secretAccessKey: process.env.AWS_SECRET_KEY + }, + region: process.env.AWS_REGION }); const s3Bucket = @@ -39,21 +40,26 @@ export function getObjectKey(url) { return objectKey; } -export function deleteObjectsFromS3(keyList, callback) { - const keys = keyList.map((key) => { return { Key: key }; }); // eslint-disable-line - if (keyList.length > 0) { +export async function deleteObjectsFromS3(keyList, callback) { + const objectsToDelete = keyList.map((key) => ({ Key: key })); + + if (objectsToDelete.length > 0) { const params = { - Bucket: `${process.env.S3_BUCKET}`, - Delete: { - Objects: keys - } + Bucket: process.env.S3_BUCKET, + Delete: { Objects: objectsToDelete } }; - const del = client.deleteObjects(params); - del.on('end', () => { + + try { + await s3Client.send(new DeleteObjectsCommand(params)); if (callback) { callback(); } - }); + } catch (error) { + console.error('Error deleting objects from S3: ', error); + if (callback) { + callback(error); + } + } } else if (callback) { callback(); } @@ -61,12 +67,7 @@ export function deleteObjectsFromS3(keyList, callback) { export function deleteObjectFromS3(req, res) { const { objectKey, userId } = req.params; - let fullObjectKey; - if (userId) { - fullObjectKey = `${userId}/${objectKey}`; - } else { - fullObjectKey = objectKey; - } + const fullObjectKey = userId ? `${userId}/${objectKey}` : objectKey; deleteObjectsFromS3([fullObjectKey], () => { res.json({ success: true }); }); @@ -96,151 +97,127 @@ export function signS3(req, res) { res.json(policy); } -export function copyObjectInS3(url, userId) { - return new Promise((resolve, reject) => { - const objectKey = getObjectKey(url); - const fileExtension = getExtension(objectKey); - const newFilename = uuidv4() + fileExtension; - const headParams = { - Bucket: `${process.env.S3_BUCKET}`, - Key: `${objectKey}` - }; - client.s3.headObject(headParams, (headErr) => { - if (headErr) { - reject( - new Error( - `Object with key ${process.env.S3_BUCKET}/${objectKey} does not exist.` - ) - ); - return; - } - const params = { - Bucket: `${process.env.S3_BUCKET}`, - CopySource: `${process.env.S3_BUCKET}/${objectKey}`, - Key: `${userId}/${newFilename}`, - ACL: 'public-read' - }; - const copy = client.copyObject(params); - copy.on('err', (err) => { - reject(err); - }); - copy.on('end', (data) => { - resolve(`${s3Bucket}${userId}/${newFilename}`); - }); - }); - }); +export async function copyObjectInS3(url, userId) { + const objectKey = getObjectKey(url); + const fileExtension = getExtension(objectKey); + const newFilename = uuidv4() + fileExtension; + const headParams = { + Bucket: process.env.S3_BUCKET, + Key: objectKey + }; + + await s3Client.send(new HeadObjectCommand(headParams)); + + const params = { + Bucket: process.env.S3_BUCKET, + CopySource: `${process.env.S3_BUCKET}/${objectKey}`, + Key: `${userId}/${newFilename}`, + ACL: 'public-read' + }; + + try { + await s3Client.send(new CopyObjectCommand(params)); + return `${s3Bucket}${userId}/${newFilename}`; + } catch (error) { + console.error('Error copying object in S3:', error); + throw error; + } } -export function copyObjectInS3RequestHandler(req, res) { +export async function copyObjectInS3RequestHandler(req, res) { const { url } = req.body; - copyObjectInS3(url, req.user.id).then((newUrl) => { - res.json({ url: newUrl }); - }); + const newUrl = await copyObjectInS3(url, req.user.id); + res.json({ url: newUrl }); } -export function moveObjectToUserInS3(url, userId) { - return new Promise((resolve, reject) => { - const objectKey = getObjectKey(url); - const fileExtension = getExtension(objectKey); - const newFilename = uuidv4() + fileExtension; +export async function moveObjectToUserInS3(url, userId) { + const objectKey = getObjectKey(url); + const fileExtension = getExtension(objectKey); + const newFilename = uuidv4() + fileExtension; + + try { const headParams = { - Bucket: `${process.env.S3_BUCKET}`, - Key: `${objectKey}` + Bucket: process.env.S3_BUCKET, + Key: objectKey }; - client.s3.headObject(headParams, (headErr) => { - if (headErr) { - reject( - new Error( - `Object with key ${process.env.S3_BUCKET}/${objectKey} does not exist.` - ) - ); - return; - } - const params = { - Bucket: `${process.env.S3_BUCKET}`, - CopySource: `${process.env.S3_BUCKET}/${objectKey}`, - Key: `${userId}/${newFilename}`, - ACL: 'public-read' - }; - const move = client.moveObject(params); - move.on('err', (err) => { - reject(err); - }); - move.on('end', (data) => { - resolve(`${s3Bucket}${userId}/${newFilename}`); - }); - }); - }); + await s3Client.send(new HeadObjectCommand(headParams)); + } catch (headErr) { + throw new Error( + `Object with key ${process.env.S3_BUCKET}/${objectKey} does not exist.` + ); + } + + const params = { + Bucket: process.env.S3_BUCKET, + CopySource: `${process.env.S3_BUCKET}/${objectKey}`, + Key: `${userId}/${newFilename}`, + ACL: 'public-read' + }; + + await s3Client.send(new CopyObjectCommand(params)); + return `${s3Bucket}${userId}/${newFilename}`; } -export function listObjectsInS3ForUser(userId) { - let assets = []; - return new Promise((resolve) => { +export async function listObjectsInS3ForUser(userId) { + try { + let assets = []; const params = { - s3Params: { - Bucket: `${process.env.S3_BUCKET}`, - Prefix: `${userId}/` - } + Bucket: process.env.S3_BUCKET, + Prefix: `${userId}/` }; - client - .listObjects(params) - .on('data', (data) => { - assets = assets.concat( - data.Contents.map((object) => ({ - key: object.Key, - size: object.Size - })) - ); - }) - .on('end', () => { - resolve(); - }); - }) - .then(() => getProjectsForUserId(userId)) - .then((projects) => { - const projectAssets = []; - let totalSize = 0; - assets.forEach((asset) => { - const name = asset.key.split('/').pop(); - const foundAsset = { - key: asset.key, - name, - size: asset.size, - url: `${process.env.S3_BUCKET_URL_BASE}${asset.key}` - }; - totalSize += asset.size; - projects.some((project) => { - let found = false; - project.files.some((file) => { - if (!file.url) return false; - if (file.url.includes(asset.key)) { - found = true; - foundAsset.name = file.name; - foundAsset.sketchName = project.name; - foundAsset.sketchId = project.id; - foundAsset.url = file.url; - return true; - } - return false; - }); - return found; + + const data = await s3Client.send(new ListObjectsCommand(params)); + + assets = data.Contents.map((object) => ({ + key: object.Key, + size: object.Size + })); + + const projects = await getProjectsForUserId(userId); + const projectAssets = []; + let totalSize = 0; + + assets.forEach((asset) => { + const name = asset.key.split('/').pop(); + const foundAsset = { + key: asset.key, + name, + size: asset.size, + url: `${process.env.S3_BUCKET_URL_BASE}${asset.key}` + }; + totalSize += asset.size; + + projects.some((project) => { + let found = false; + project.files.some((file) => { + if (!file.url) return false; + if (file.url.includes(asset.key)) { + found = true; + foundAsset.name = file.name; + foundAsset.sketchName = project.name; + foundAsset.sketchId = project.id; + foundAsset.url = file.url; + return true; + } + return false; }); - projectAssets.push(foundAsset); + return found; }); - return Promise.resolve({ assets: projectAssets, totalSize }); - }) - .catch((err) => { - console.log('got an error'); - console.log(err); + projectAssets.push(foundAsset); }); + + return { assets: projectAssets, totalSize }; + } catch (error) { + console.log('Got an error:', error); + throw error; + } } -export function listObjectsInS3ForUserRequestHandler(req, res) { +export async function listObjectsInS3ForUserRequestHandler(req, res) { const { username } = req.user; - findUserByUsername(username, (user) => { + findUserByUsername(username, async (user) => { const userId = user.id; - listObjectsInS3ForUser(userId).then((objects) => { - res.json(objects); - }); + const objects = await listObjectsInS3ForUser(userId); + res.json(objects); }); } diff --git a/server/migrations/s3UnderUser.js b/server/migrations/s3UnderUser.js index 33500f75de..0657b0edc3 100644 --- a/server/migrations/s3UnderUser.js +++ b/server/migrations/s3UnderUser.js @@ -1,96 +1,100 @@ /* eslint-disable */ -import s3 from '@auth0/s3'; +import { + S3Client, + CopyObjectCommand, + HeadObjectCommand +} from '@aws-sdk/client-s3'; import path from 'path'; import mongoose from 'mongoose'; import User from '../models/user'; import Project from '../models/project'; import async from 'async'; -require('dotenv').config({path: path.resolve('.env')}); -mongoose.connect('mongodb://localhost:27017/p5js-web-editor'); -mongoose.connection.on('error', () => { - console.error('MongoDB Connection Error. Please make sure that MongoDB is running.'); - process.exit(1); -}); +import dotenv from 'dotenv'; -let client = s3.createClient({ - maxAsyncS3: 20, - s3RetryCount: 3, - s3RetryDelay: 1000, - multipartUploadThreshold: 20971520, // this is the default (20 MB) - multipartUploadSize: 15728640, // this is the default (15 MB) - s3Options: { - accessKeyId: `${process.env.AWS_ACCESS_KEY}`, - secretAccessKey: `${process.env.AWS_SECRET_KEY}`, - region: `${process.env.AWS_REGION}` - }, -}); +dotenv.config({ path: path.resolve('.env') }); -const CHUNK = 100; -Project.count({}).exec().then((numProjects) => { +async function main() { + mongoose.connect('mongodb://localhost:27017/p5js-web-editor'); + mongoose.connection.on('error', () => { + console.error( + 'MongoDB Connection Error. Please make sure that MongoDB is running.' + ); + process.exit(1); + }); + + const s3Client = new S3Client({ + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY, + secretAccessKey: process.env.AWS_SECRET_KEY + }, + region: process.env.AWS_REGION + }); + + const CHUNK = 100; + const numProjects = await Project.count({}).exec(); console.log(numProjects); let index = 0; - async.whilst( - () => { - return index < numProjects; - }, - (whilstCb) => { - Project.find({}).skip(index).limit(CHUNK).exec((err, projects) => { - async.eachSeries(projects, (project, cb) => { - if (!project.user) { - cb(); + + while (index < numProjects) { + const projects = await Project.find({}).skip(index).limit(CHUNK).exec(); + await async.eachSeries(projects, async (project) => { + if (!project.user) { + return; + } + const userId = project.user.valueOf(); + console.log(project.name); + + await async.eachSeries(project.files, async (file) => { + if ( + file.url && + file.url.includes(process.env.S3_BUCKET) && + !file.url.includes(userId) + ) { + console.log(file.url); + console.log(userId); + const key = file.url.split('/').pop(); + console.log(key); + const sourceKey = `${process.env.S3_BUCKET}/${key}`; + const destinationKey = `${userId}/${key}`; + + const headParams = { + Bucket: process.env.S3_BUCKET, + Key: key + }; + + try { + await s3Client.send(new HeadObjectCommand(headParams)); + } catch (headErr) { + console.log(headErr); return; } - const userId = project.user.valueOf(); - console.log(project.name); - async.eachSeries(project.files, (file, fileCb) => { - if (file.url && file.url.includes(process.env.S3_BUCKET) && !file.url.includes(userId)) { - console.log(file.url); - console.log(userId); - const key = file.url.split('/').pop(); - console.log(key); - const params = { - Bucket: `${process.env.S3_BUCKET}`, - CopySource: `${process.env.S3_BUCKET}/${key}`, - Key: `${userId}/${key}` - }; - try { - client.moveObject(params) - .on('error', (err) => { - console.log(err); - file.url = (process.env.S3_BUCKET_URL_BASE || - `https://s3-${process.env.AWS_REGION}.amazonaws.com/${process.env.S3_BUCKET}`) + `/${userId}/${key}`; - project.save((err, savedProject) => { - console.log(`updated file ${key}`); - fileCb(); - }); - }) - .on('end', () => { - file.url = (process.env.S3_BUCKET_URL_BASE || - `https://s3-${process.env.AWS_REGION}.amazonaws.com/${process.env.S3_BUCKET}`) + `/${userId}/${key}`; - project.save((err, savedProject) => { - console.log(`updated file ${key}`); - fileCb(); - }); - }); - } catch(e) { - console.log(e); - fileCb(); - } - } else { - fileCb(); - } - }, () => { - cb(); - }); - }, () => { - index += CHUNK; - whilstCb(); - }); + + const copyParams = { + Bucket: process.env.S3_BUCKET, + CopySource: sourceKey, + Key: destinationKey + }; + + try { + await s3Client.send(new CopyObjectCommand(copyParams)); + file.url = + (process.env.S3_BUCKET_URL_BASE || + `https://s3-${process.env.AWS_REGION}.amazonaws.com/${process.env.S3_BUCKET}`) + + `/${userId}/${key}`; + project.save((err, savedProject) => { + console.log(`updated file ${key}`); + }); + } catch (e) { + console.log(e); + } + } }); - }, - () => { - console.log('finished processing all documents.'); - process.exit(0); - } - ); -}); + }); + index += CHUNK; + } + + console.log('finished processing all documents.'); + process.exit(0); +} + +main(); From c7bf38ee56acf93b405babd68859a3eab224ffc6 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Mon, 14 Aug 2023 11:59:59 -0500 Subject: [PATCH 035/254] Common dropdown component for table actions. --- client/components/Dropdown.jsx | 3 +- client/components/Dropdown/DropdownMenu.jsx | 83 ++++++++ client/components/Dropdown/MenuItem.jsx | 35 ++++ client/components/Dropdown/TableDropdown.jsx | 20 ++ client/modules/IDE/components/AssetList.jsx | 161 +++++--------- .../CollectionList/CollectionListRow.jsx | 124 ++--------- client/modules/IDE/components/SketchList.jsx | 198 ++++-------------- .../SketchList.unit.test.jsx.snap | 40 ++-- client/styles/components/_asset-list.scss | 21 -- client/styles/components/_sketch-list.scss | 17 -- 10 files changed, 265 insertions(+), 437 deletions(-) create mode 100644 client/components/Dropdown/DropdownMenu.jsx create mode 100644 client/components/Dropdown/MenuItem.jsx create mode 100644 client/components/Dropdown/TableDropdown.jsx diff --git a/client/components/Dropdown.jsx b/client/components/Dropdown.jsx index 9a91d54cd2..369bef51b0 100644 --- a/client/components/Dropdown.jsx +++ b/client/components/Dropdown.jsx @@ -4,7 +4,7 @@ import styled from 'styled-components'; import { remSize, prop } from '../theme'; import IconButton from './mobile/IconButton'; -const DropdownWrapper = styled.ul` +export const DropdownWrapper = styled.ul` background-color: ${prop('Modal.background')}; border: 1px solid ${prop('Modal.border')}; box-shadow: 0 0 18px 0 ${prop('shadowColor')}; @@ -52,6 +52,7 @@ const DropdownWrapper = styled.ul` & button span, & a { padding: ${remSize(8)} ${remSize(16)}; + font-size: ${remSize(12)}; } * { diff --git a/client/components/Dropdown/DropdownMenu.jsx b/client/components/Dropdown/DropdownMenu.jsx new file mode 100644 index 0000000000..ce7e03837e --- /dev/null +++ b/client/components/Dropdown/DropdownMenu.jsx @@ -0,0 +1,83 @@ +import PropTypes from 'prop-types'; +import React, { forwardRef, useCallback, useRef, useState } from 'react'; +import useModalClose from '../../common/useModalClose'; +import DownArrowIcon from '../../images/down-filled-triangle.svg'; +import { DropdownWrapper } from '../Dropdown'; + +// TODO: enable arrow keys to navigate options from list + +const DropdownMenu = forwardRef( + ({ children, 'aria-label': ariaLabel, align, className, classes }, ref) => { + // Note: need to use a ref instead of a state to avoid stale closures. + const focusedRef = useRef(false); + + const [isOpen, setIsOpen] = useState(false); + + const close = useCallback(() => setIsOpen(false), [setIsOpen]); + + const anchorRef = useModalClose(close, ref); + + const toggle = useCallback(() => { + setIsOpen((prevState) => !prevState); + }, [setIsOpen]); + + const handleFocus = () => { + focusedRef.current = true; + }; + + const handleBlur = () => { + focusedRef.current = false; + setTimeout(() => { + if (!focusedRef.current) { + close(); + } + }, 200); + }; + + return ( +
    + + {isOpen && ( + + {children} + + )} +
    + ); + } +); + +DropdownMenu.propTypes = { + children: PropTypes.node, + 'aria-label': PropTypes.string.isRequired, + align: PropTypes.oneOf(['left', 'right']), + className: PropTypes.string, + classes: PropTypes.shape({ + button: PropTypes.string, + list: PropTypes.string + }) +}; + +DropdownMenu.defaultProps = { + children: null, + align: 'right', + className: '', + classes: {} +}; + +export default DropdownMenu; diff --git a/client/components/Dropdown/MenuItem.jsx b/client/components/Dropdown/MenuItem.jsx new file mode 100644 index 0000000000..8b6f6d7247 --- /dev/null +++ b/client/components/Dropdown/MenuItem.jsx @@ -0,0 +1,35 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import ButtonOrLink from '../../common/ButtonOrLink'; + +// TODO: combine with NavMenuItem + +function MenuItem({ hideIf, ...rest }) { + if (hideIf) { + return null; + } + + return ( +
  • + +
  • + ); +} + +MenuItem.propTypes = { + ...ButtonOrLink.propTypes, + onClick: PropTypes.func, + value: PropTypes.string, + /** + * Provides a way to deal with optional items. + */ + hideIf: PropTypes.bool +}; + +MenuItem.defaultProps = { + onClick: null, + value: null, + hideIf: false +}; + +export default MenuItem; diff --git a/client/components/Dropdown/TableDropdown.jsx b/client/components/Dropdown/TableDropdown.jsx new file mode 100644 index 0000000000..da7b6d7342 --- /dev/null +++ b/client/components/Dropdown/TableDropdown.jsx @@ -0,0 +1,20 @@ +import styled from 'styled-components'; +import { prop, remSize } from '../../theme'; +import DropdownMenu from './DropdownMenu'; + +const TableDropdown = styled(DropdownMenu).attrs({ align: 'right' })` + & > button { + width: ${remSize(25)}; + height: ${remSize(25)}; + & polygon, + & path { + fill: ${prop('inactiveTextColor')}; + } + } + & ul { + top: 63%; + right: calc(100% - 26px); + } +`; + +export default TableDropdown; diff --git a/client/modules/IDE/components/AssetList.jsx b/client/modules/IDE/components/AssetList.jsx index 559f60c580..7da5c0e865 100644 --- a/client/modules/IDE/components/AssetList.jsx +++ b/client/modules/IDE/components/AssetList.jsx @@ -1,129 +1,68 @@ import PropTypes from 'prop-types'; import React from 'react'; -import { connect } from 'react-redux'; +import { connect, useDispatch } from 'react-redux'; import { bindActionCreators } from 'redux'; import { Link } from 'react-router-dom'; import { Helmet } from 'react-helmet'; import prettyBytes from 'pretty-bytes'; -import { withTranslation } from 'react-i18next'; +import { useTranslation, withTranslation } from 'react-i18next'; +import MenuItem from '../../../components/Dropdown/MenuItem'; +import TableDropdown from '../../../components/Dropdown/TableDropdown'; import Loader from '../../App/components/loader'; +import { deleteAssetRequest } from '../actions/assets'; import * as AssetActions from '../actions/assets'; -import DownFilledTriangleIcon from '../../../images/down-filled-triangle.svg'; -class AssetListRowBase extends React.Component { - constructor(props) { - super(props); - this.state = { - isFocused: false, - optionsOpen: false - }; - } - - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeOptions(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; +const AssetMenu = ({ item: asset }) => { + const { t } = useTranslation(); - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; + const dispatch = useDispatch(); - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); + const handleAssetDelete = () => { + const { key, name } = asset; + if (window.confirm(t('Common.DeleteConfirmation', { name }))) { + dispatch(deleteAssetRequest(key)); } }; - handleDropdownOpen = () => { - this.closeOptions(); - this.openOptions(); - }; + return ( + + {t('AssetList.Delete')} + + {t('AssetList.OpenNewTab')} + + + ); +}; - handleAssetDelete = () => { - const { key, name } = this.props.asset; - this.closeOptions(); - if (window.confirm(this.props.t('Common.DeleteConfirmation', { name }))) { - this.props.deleteAssetRequest(key); - } - }; +AssetMenu.propTypes = { + item: PropTypes.shape({ + key: PropTypes.string.isRequired, + url: PropTypes.string.isRequired, + name: PropTypes.string.isRequired + }).isRequired +}; - render() { - const { asset, username, t } = this.props; - const { optionsOpen } = this.state; - return ( - - - - {asset.name} - - - {prettyBytes(asset.size)} - - {asset.sketchId && ( - - {asset.sketchName} - - )} - - - - {optionsOpen && ( -
      -
    • - -
    • -
    • - - {t('AssetList.OpenNewTab')} - -
    • -
    - )} - - - ); - } -} +const AssetListRowBase = ({ asset, username }) => ( + + + + {asset.name} + + + {prettyBytes(asset.size)} + + {asset.sketchId && ( + + {asset.sketchName} + + )} + + + + + +); AssetListRowBase.propTypes = { asset: PropTypes.shape({ @@ -134,9 +73,7 @@ AssetListRowBase.propTypes = { name: PropTypes.string.isRequired, size: PropTypes.number.isRequired }).isRequired, - deleteAssetRequest: PropTypes.func.isRequired, - username: PropTypes.string.isRequired, - t: PropTypes.func.isRequired + username: PropTypes.string.isRequired }; function mapStateToPropsAssetListRow(state) { diff --git a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx index 16421f7a6b..1d52163230 100644 --- a/client/modules/IDE/components/CollectionList/CollectionListRow.jsx +++ b/client/modules/IDE/components/CollectionList/CollectionListRow.jsx @@ -4,88 +4,38 @@ import { connect } from 'react-redux'; import { Link } from 'react-router-dom'; import { bindActionCreators } from 'redux'; import { withTranslation } from 'react-i18next'; +import MenuItem from '../../../../components/Dropdown/MenuItem'; +import TableDropdown from '../../../../components/Dropdown/TableDropdown'; import * as ProjectActions from '../../actions/project'; import * as CollectionsActions from '../../actions/collections'; import * as IdeActions from '../../actions/ide'; import * as ToastActions from '../../actions/toast'; import dates from '../../../../utils/formatDate'; -import DownFilledTriangleIcon from '../../../../images/down-filled-triangle.svg'; -import MoreIconSvg from '../../../../images/more.svg'; - const formatDateCell = (date, mobile = false) => dates.format(date, { showTime: !mobile }); class CollectionListRowBase extends React.Component { - static projectInCollection(project, collection) { - return ( - collection.items.find((item) => item.project.id === project.id) != null - ); - } - constructor(props) { super(props); this.state = { - optionsOpen: false, - isFocused: false, renameOpen: false, renameValue: '' }; this.renameInput = React.createRef(); } - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeAll(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; - - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; - - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); - } - }; - closeAll = () => { this.setState({ - optionsOpen: false, renameOpen: false }); }; handleAddSketches = () => { - this.closeAll(); this.props.onAddSketches(); }; - handleDropdownOpen = () => { - this.closeAll(); - this.openOptions(); - }; - handleCollectionDelete = () => { - this.closeAll(); if ( window.confirm( this.props.t('Common.DeleteConfirmation', { @@ -98,7 +48,6 @@ class CollectionListRowBase extends React.Component { }; handleRenameOpen = () => { - this.closeAll(); this.setState( { renameOpen: true, @@ -136,65 +85,24 @@ class CollectionListRowBase extends React.Component { }; renderActions = () => { - const { optionsOpen } = this.state; const userIsOwner = this.props.user.username === this.props.username; return ( - - - {optionsOpen && ( -
      -
    • - -
    • - {userIsOwner && ( -
    • - -
    • - )} - {userIsOwner && ( -
    • - -
    • - )} -
    + + > + + {this.props.t('CollectionListRow.AddSketch')} + + + {this.props.t('CollectionListRow.Delete')} + + + {this.props.t('CollectionListRow.Rename')} + + ); }; diff --git a/client/modules/IDE/components/SketchList.jsx b/client/modules/IDE/components/SketchList.jsx index bce30da1dc..85d3030d61 100644 --- a/client/modules/IDE/components/SketchList.jsx +++ b/client/modules/IDE/components/SketchList.jsx @@ -7,6 +7,8 @@ import { Link } from 'react-router-dom'; import { bindActionCreators } from 'redux'; import classNames from 'classnames'; import slugify from 'slugify'; +import MenuItem from '../../../components/Dropdown/MenuItem'; +import TableDropdown from '../../../components/Dropdown/TableDropdown'; import dates from '../../../utils/formatDate'; import * as ProjectActions from '../actions/project'; import * as ProjectsActions from '../actions/projects'; @@ -22,8 +24,6 @@ import getConfig from '../../../utils/getConfig'; import ArrowUpIcon from '../../../images/sort-arrow-up.svg'; import ArrowDownIcon from '../../../images/sort-arrow-down.svg'; -import DownFilledTriangleIcon from '../../../images/down-filled-triangle.svg'; -import MoreIconSvg from '../../../images/more.svg'; const ROOT_URL = getConfig('API_URL'); @@ -34,47 +34,12 @@ class SketchListRowBase extends React.Component { constructor(props) { super(props); this.state = { - optionsOpen: false, renameOpen: false, - renameValue: props.sketch.name, - isFocused: false + renameValue: props.sketch.name }; this.renameInput = React.createRef(); } - onFocusComponent = () => { - this.setState({ isFocused: true }); - }; - - onBlurComponent = () => { - this.setState({ isFocused: false }); - setTimeout(() => { - if (!this.state.isFocused) { - this.closeAll(); - } - }, 200); - }; - - openOptions = () => { - this.setState({ - optionsOpen: true - }); - }; - - closeOptions = () => { - this.setState({ - optionsOpen: false - }); - }; - - toggleOptions = () => { - if (this.state.optionsOpen) { - this.closeOptions(); - } else { - this.openOptions(); - } - }; - openRename = () => { this.setState( { @@ -91,13 +56,6 @@ class SketchListRowBase extends React.Component { }); }; - closeAll = () => { - this.setState({ - renameOpen: false, - optionsOpen: false - }); - }; - handleRenameChange = (e) => { this.setState({ renameValue: e.target.value @@ -107,13 +65,13 @@ class SketchListRowBase extends React.Component { handleRenameEnter = (e) => { if (e.key === 'Enter') { this.updateName(); - this.closeAll(); + this.closeRename(); } }; handleRenameBlur = () => { this.updateName(); - this.closeAll(); + this.closeRename(); }; updateName = () => { @@ -126,23 +84,6 @@ class SketchListRowBase extends React.Component { } }; - resetSketchName = () => { - this.setState({ - renameValue: this.props.sketch.name, - renameOpen: false - }); - }; - - handleDropdownOpen = () => { - this.closeAll(); - this.openOptions(); - }; - - handleRenameOpen = () => { - this.closeAll(); - this.openRename(); - }; - handleSketchDownload = () => { const { sketch } = this.props; const downloadLink = document.createElement('a'); @@ -154,12 +95,10 @@ class SketchListRowBase extends React.Component { }; handleSketchDuplicate = () => { - this.closeAll(); this.props.cloneProject(this.props.sketch); }; handleSketchShare = () => { - this.closeAll(); this.props.showShareModal( this.props.sketch.id, this.props.sketch.name, @@ -168,7 +107,6 @@ class SketchListRowBase extends React.Component { }; handleSketchDelete = () => { - this.closeAll(); if ( window.confirm( this.props.t('Common.DeleteConfirmation', { @@ -180,106 +118,42 @@ class SketchListRowBase extends React.Component { } }; - renderViewButton = (sketchURL) => ( - - {this.props.t('SketchList.View')} - - ); - renderDropdown = () => { - const { optionsOpen } = this.state; const userIsOwner = this.props.user.username === this.props.username; return ( - - {optionsOpen && ( -
      - {userIsOwner && ( -
    • - -
    • - )} -
    • - -
    • - {this.props.user.authenticated && ( -
    • - -
    • - )} - {this.props.user.authenticated && ( -
    • - -
    • - )} - {/*
    • - -
    • */} - {userIsOwner && ( -
    • - -
    • - )} -
    - )} + + + {this.props.t('SketchList.DropdownRename')} + + + {this.props.t('SketchList.DropdownDownload')} + + + {this.props.t('SketchList.DropdownDuplicate')} + + { + this.props.onAddToCollection(); + }} + > + {this.props.t('SketchList.DropdownAddToCollection')} + + + {/* + + Share + + */} + + {this.props.t('SketchList.DropdownDelete')} + + ); }; diff --git a/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap b/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap index bd7475ebf9..63a4542d36 100644 --- a/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap +++ b/client/modules/IDE/components/__snapshots__/SketchList.unit.test.jsx.snap @@ -85,15 +85,19 @@ exports[` snapshot testing 1`] = ` - + +
    snapshot testing 1`] = ` - + +
    diff --git a/client/styles/components/_asset-list.scss b/client/styles/components/_asset-list.scss index 6f7c035993..7d8f6065e8 100644 --- a/client/styles/components/_asset-list.scss +++ b/client/styles/components/_asset-list.scss @@ -76,24 +76,3 @@ background-color: getThemifyVariable('background-color'); } } - -.asset-table__dropdown-button { - width:#{25 / $base-font-size}rem; - height:#{25 / $base-font-size}rem; - - @include themify() { - & polygon, & path { - fill: getThemifyVariable('inactive-text-color'); - } - } -} - -.asset-table__action-dialogue { - @extend %dropdown-open-right; - top: 63%; - right: calc(100% - 26px); -} - -.asset-table__action-option { - font-size: #{12 / $base-font-size}rem; -} diff --git a/client/styles/components/_sketch-list.scss b/client/styles/components/_sketch-list.scss index 69d41bdca4..315b10712f 100644 --- a/client/styles/components/_sketch-list.scss +++ b/client/styles/components/_sketch-list.scss @@ -169,17 +169,6 @@ font-weight: normal; } -.sketch-list__dropdown-button { - width: #{25 / $base-font-size}rem; - height: #{25 / $base-font-size}rem; - @include themify() { - & polygon, - & path { - fill: getThemifyVariable("inactive-text-color"); - } - } -} - .sketches-table__name { display: flex; align-items: center; @@ -189,12 +178,6 @@ width: #{35 / $base-font-size}rem; } -.sketch-list__action-dialogue { - @extend %dropdown-open-right; - top: 63%; - right: calc(100% - 26px); -} - .sketches-table__empty { text-align: center; font-size: #{16 / $base-font-size}rem; From 4ffbb42af973c902638a0bc50eb756fe6489eadf Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Wed, 16 Aug 2023 12:30:27 -0500 Subject: [PATCH 036/254] add setTimeout to close --- client/components/Dropdown/DropdownMenu.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/components/Dropdown/DropdownMenu.jsx b/client/components/Dropdown/DropdownMenu.jsx index ce7e03837e..0e18207f26 100644 --- a/client/components/Dropdown/DropdownMenu.jsx +++ b/client/components/Dropdown/DropdownMenu.jsx @@ -50,7 +50,9 @@ const DropdownMenu = forwardRef( { + setTimeout(close, 0); + }} onBlur={handleBlur} onFocus={handleFocus} > From c9cca4a0182647fd27b58c2ba0b1cc8180043dc7 Mon Sep 17 00:00:00 2001 From: Linda Paiste Date: Sun, 17 Sep 2023 16:58:59 -0500 Subject: [PATCH 037/254] Apply new responsive styles --- client/components/Dropdown/DropdownMenu.jsx | 19 +++++++++--- client/components/Dropdown/TableDropdown.jsx | 30 ++++++++++++++++++- .../SketchList.unit.test.jsx.snap | 27 +++++++++++++++-- client/styles/components/_sketch-list.scss | 7 +---- 4 files changed, 69 insertions(+), 14 deletions(-) diff --git a/client/components/Dropdown/DropdownMenu.jsx b/client/components/Dropdown/DropdownMenu.jsx index 0e18207f26..da41b30101 100644 --- a/client/components/Dropdown/DropdownMenu.jsx +++ b/client/components/Dropdown/DropdownMenu.jsx @@ -7,7 +7,10 @@ import { DropdownWrapper } from '../Dropdown'; // TODO: enable arrow keys to navigate options from list const DropdownMenu = forwardRef( - ({ children, 'aria-label': ariaLabel, align, className, classes }, ref) => { + ( + { children, anchor, 'aria-label': ariaLabel, align, className, classes }, + ref + ) => { // Note: need to use a ref instead of a state to avoid stale closures. const focusedRef = useRef(false); @@ -44,7 +47,7 @@ const DropdownMenu = forwardRef( onBlur={handleBlur} onFocus={handleFocus} > -