diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6da15d5..8239bf7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,6 +19,8 @@ jobs: node-version: 20 cache: 'npm' - run: npm ci + - run: (cd ./packages/document-core;npm ci) + - run: (cd ./packages/editor-sample;npm ci) - run: npx eslint . - run: npx prettier . --check - run: npx tsc --noEmit diff --git a/.github/workflows/github-pages.yaml b/.github/workflows/github-pages.yaml new file mode 100644 index 0000000..edd3a89 --- /dev/null +++ b/.github/workflows/github-pages.yaml @@ -0,0 +1,40 @@ +name: Deploy static content to Pages +on: + push: + branches: ['main'] + workflow_dispatch: +permissions: + contents: read + pages: write + id-token: write +concurrency: + group: 'pages' + cancel-in-progress: true +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: 20 + cache: 'npm' + - name: Install dependencies and build + working-directory: './packages/editor-sample' + run: | + npm ci + npm run build + - name: Setup Pages + uses: actions/configure-pages@v3 + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: './packages/editor-sample/dist' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/packages/document-core/tsconfig.json b/packages/document-core/tsconfig.json index c447dd3..efac89d 100644 --- a/packages/document-core/tsconfig.json +++ b/packages/document-core/tsconfig.json @@ -5,5 +5,5 @@ "module": "esnext", "outDir": "dist" }, - "exclude": ["node_modules", "dist"] + "exclude": ["dist"] } diff --git a/packages/editor-sample/README.md b/packages/editor-sample/README.md new file mode 100644 index 0000000..37255c7 --- /dev/null +++ b/packages/editor-sample/README.md @@ -0,0 +1 @@ +# @usewaypoint/editor-sample diff --git a/packages/editor-sample/index.html b/packages/editor-sample/index.html new file mode 100644 index 0000000..8cce52a --- /dev/null +++ b/packages/editor-sample/index.html @@ -0,0 +1,34 @@ + + + + + + + + + + Waypoint editor + + + +
+ + + diff --git a/packages/editor-sample/package-lock.json b/packages/editor-sample/package-lock.json new file mode 100644 index 0000000..af0bae5 --- /dev/null +++ b/packages/editor-sample/package-lock.json @@ -0,0 +1,3669 @@ +{ + "name": "@usewaypoint/editor-sample", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@usewaypoint/editor-sample", + "version": "0.0.1", + "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.10", + "@mui/material": "^5.15.10", + "@usewaypoint/document-core": "^0.0.1", + "react": "^18.2.0", + "react-colorful": "^5.6.1", + "react-dom": "^18.2.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.56.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "eslint-plugin-simple-import-sort": "^12.0.0", + "prettier": "^3.2.5", + "typescript": "^5.2.2", + "vite": "^5.1.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", + "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.36.tgz", + "integrity": "sha512-6A8fYiXgjqTO6pgj31Hc8wm1M3rFYCxDRh09dBVk0L0W4cb2lnurRJa3cAyic6hHY+we1S58OdGYRbKmOsDpGQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.10.tgz", + "integrity": "sha512-qPv7B+LeMatYuzRjB3hlZUHqinHx/fX4YFBiaS19oC02A1e9JFuDKDvlyRQQ5oRSbJJt0QlaLTlr0IcauVcJRQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.10.tgz", + "integrity": "sha512-9cF8oUHZKo9oQ7EQ3pxPELaZuZVmphskU4OI6NiJNDVN7zcuvrEsuWjYo1Zh4fLiC39Nrvm30h/B51rcUjvSGA==", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.10.tgz", + "integrity": "sha512-YJJGHjwDOucecjDEV5l9ISTCo+l9YeWrho623UajzoHRYxuKUmwrGVYOW4PKwGvCx9SU9oklZnbbi2Clc5XZHw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.36", + "@mui/core-downloads-tracker": "^5.15.10", + "@mui/system": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.9.tgz", + "integrity": "sha512-/aMJlDOxOTAXyp4F2rIukW1O0anodAMCkv1DfBh/z9vaKHY3bd5fFf42wmP+0GRmwMinC5aWPpNfHXOED1fEtg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.9", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.9.tgz", + "integrity": "sha512-NRKtYkL5PZDH7dEmaLEIiipd3mxNnQSO+Yo8rFNBNptY8wzQnQ+VjayTq39qH7Sast5cwHKYFusUrQyD+SS4Og==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.9.tgz", + "integrity": "sha512-SxkaaZ8jsnIJ77bBXttfG//LUf6nTfOcaOuIgItqfHv60ZCQy/Hu7moaob35kBb+guxVJnoSZ+7vQJrA/E7pKg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.9", + "@mui/styled-engine": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", + "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.9.tgz", + "integrity": "sha512-yDYfr61bCYUz1QtwvpqYy/3687Z8/nS4zv7lv/ih/6ZFGMl1iolEvxRmR84v2lOYxlds+kq1IVYbXxDKh8Z9sg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.10.0.tgz", + "integrity": "sha512-/MeDQmcD96nVoRumKUljsYOLqfv1YFJps+0pTrb2Z9Nl/w5qNUysMaWQsrd1mvAlNT4yza1iVyIu4Q4AgF6V3A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.10.0.tgz", + "integrity": "sha512-lvu0jK97mZDJdpZKDnZI93I0Om8lSDaiPx3OiCk0RXn3E8CMPJNS/wxjAvSJJzhhZpfjXsjLWL8LnS6qET4VNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.10.0.tgz", + "integrity": "sha512-uFpayx8I8tyOvDkD7X6n0PriDRWxcqEjqgtlxnUA/G9oS93ur9aZ8c8BEpzFmsed1TH5WZNG5IONB8IiW90TQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.10.0.tgz", + "integrity": "sha512-nIdCX03qFKoR/MwQegQBK+qZoSpO3LESurVAC6s6jazLA1Mpmgzo3Nj3H1vydXp/JM29bkCiuF7tDuToj4+U9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.10.0.tgz", + "integrity": "sha512-Fz7a+y5sYhYZMQFRkOyCs4PLhICAnxRX/GnWYReaAoruUzuRtcf+Qnw+T0CoAWbHCuz2gBUwmWnUgQ67fb3FYw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.10.0.tgz", + "integrity": "sha512-yPtF9jIix88orwfTi0lJiqINnlWo6p93MtZEoaehZnmCzEmLL0eqjA3eGVeyQhMtxdV+Mlsgfwhh0+M/k1/V7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.10.0.tgz", + "integrity": "sha512-9GW9yA30ib+vfFiwjX+N7PnjTnCMiUffhWj4vkG4ukYv1kJ4T9gHNg8zw+ChsOccM27G9yXrEtMScf1LaCuoWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.10.0.tgz", + "integrity": "sha512-X1ES+V4bMq2ws5fF4zHornxebNxMXye0ZZjUrzOrf7UMx1d6wMQtfcchZ8SqUnQPPHdOyOLW6fTcUiFgHFadRA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.10.0.tgz", + "integrity": "sha512-w/5OpT2EnI/Xvypw4FIhV34jmNqU5PZjZue2l2Y3ty1Ootm3SqhI+AmfhlUYGBTd9JnpneZCDnt3uNOiOBkMyw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.10.0.tgz", + "integrity": "sha512-q/meftEe3QlwQiGYxD9rWwB21DoKQ9Q8wA40of/of6yGHhZuGfZO0c3WYkN9dNlopHlNT3mf5BPsUSxoPuVQaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.10.0.tgz", + "integrity": "sha512-NrR6667wlUfP0BHaEIKgYM/2va+Oj+RjZSASbBMnszM9k+1AmliRjHc3lJIiOehtSSjqYiO7R6KLNrWOX+YNSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.10.0.tgz", + "integrity": "sha512-FV0Tpt84LPYDduIDcXvEC7HKtyXxdvhdAOvOeWMWbQNulxViH2O07QXkT/FffX4FqEI02jEbCJbr+YcuKdyyMg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.10.0.tgz", + "integrity": "sha512-OZoJd+o5TaTSQeFFQ6WjFCiltiYVjIdsXxwu/XZ8qRpsvMQr4UsVrE5UyT9RIvsnuF47DqkJKhhVZ2Q9YW9IpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", + "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.1", + "@swc/core-darwin-x64": "1.4.1", + "@swc/core-linux-arm-gnueabihf": "1.4.1", + "@swc/core-linux-arm64-gnu": "1.4.1", + "@swc/core-linux-arm64-musl": "1.4.1", + "@swc/core-linux-x64-gnu": "1.4.1", + "@swc/core-linux-x64-musl": "1.4.1", + "@swc/core-win32-arm64-msvc": "1.4.1", + "@swc/core-win32-ia32-msvc": "1.4.1", + "@swc/core-win32-x64-msvc": "1.4.1" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", + "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/semver": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@usewaypoint/document-core": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@usewaypoint/document-core/-/document-core-0.0.1.tgz", + "integrity": "sha512-DD6h3ObcDPq3POCi3IbjRUCYBUeqnJIzvrZ2gIRGVV4yd0XCXx6to02FDu33rH8zmsLWtx9NOyfXDlchybfzbw==", + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "zod": "^1 || ^2 || ^3" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.107" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "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" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "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" + } + }, + "node_modules/ansi-styles": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "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" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "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", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", + "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.0.0.tgz", + "integrity": "sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "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" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "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" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/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, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "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" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "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" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.10.0.tgz", + "integrity": "sha512-t2v9G2AKxcQ8yrG+WGxctBes1AomT0M4ND7jTFBCVPXQ/WFTvNSefIrNSmLKhIKBrvN8SG+CZslimJcT3W2u2g==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.10.0", + "@rollup/rollup-android-arm64": "4.10.0", + "@rollup/rollup-darwin-arm64": "4.10.0", + "@rollup/rollup-darwin-x64": "4.10.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.10.0", + "@rollup/rollup-linux-arm64-gnu": "4.10.0", + "@rollup/rollup-linux-arm64-musl": "4.10.0", + "@rollup/rollup-linux-riscv64-gnu": "4.10.0", + "@rollup/rollup-linux-x64-gnu": "4.10.0", + "@rollup/rollup-linux-x64-musl": "4.10.0", + "@rollup/rollup-win32-arm64-msvc": "4.10.0", + "@rollup/rollup-win32-ia32-msvc": "4.10.0", + "@rollup/rollup-win32-x64-msvc": "4.10.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "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" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", + "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.1.tgz", + "integrity": "sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "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" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/packages/editor-sample/package.json b/packages/editor-sample/package.json new file mode 100644 index 0000000..0933c9e --- /dev/null +++ b/packages/editor-sample/package.json @@ -0,0 +1,35 @@ +{ + "name": "@usewaypoint/editor-sample", + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.3", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.15.10", + "@mui/material": "^5.15.10", + "@usewaypoint/document-core": "^0.0.1", + "react": "^18.2.0", + "react-colorful": "^5.6.1", + "react-dom": "^18.2.0", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.56.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "eslint-plugin-simple-import-sort": "^12.0.0", + "prettier": "^3.2.5", + "typescript": "^5.2.2", + "vite": "^5.1.0" + } +} diff --git a/packages/editor-sample/src/App/ShareButton.tsx b/packages/editor-sample/src/App/ShareButton.tsx new file mode 100644 index 0000000..e470d95 --- /dev/null +++ b/packages/editor-sample/src/App/ShareButton.tsx @@ -0,0 +1,38 @@ +import React, { useState } from 'react'; + +import { Button, Snackbar } from '@mui/material'; + +import { useEditorState } from '../documents/editor/EditorContext'; + +export default function ShareButton() { + const [{ document }] = useEditorState(); + const [message, setMessage] = useState(null); + + const onClick = async () => { + const c = JSON.stringify(document); + localStorage.setItem('configuration', c); + location.hash = `#${btoa(c)}`; + if (navigator.clipboard) { + await navigator.clipboard.writeText(location.href.toString()); + setMessage('The configuration URL was copied to your clipboard'); + } else { + setMessage('The URL was updated. You can copy it to share'); + } + }; + + const onClose = () => { + setMessage(null); + }; + + return ( + <> + + + + ); +} diff --git a/packages/editor-sample/src/App/index.tsx b/packages/editor-sample/src/App/index.tsx new file mode 100644 index 0000000..8092f17 --- /dev/null +++ b/packages/editor-sample/src/App/index.tsx @@ -0,0 +1,78 @@ +import React from 'react'; + +import { Box, Grid, Stack, Tab, Tabs } from '@mui/material'; + +import EditorBlock from '../documents/editor/EditorBlock'; +import { useEditorState } from '../documents/editor/EditorContext'; +import ReaderBlock from '../documents/reader/ReaderBlock'; +import { ReaderProvider } from '../documents/reader/ReaderContext'; + +import HtmlPanel from './panels/HtmlPanel'; +import ShareButton from './ShareButton'; +import ConfigurationPanel from './sidebar/ConfigurationPanel'; +import StylesPanel from './sidebar/StylesPanel'; + +export default function App() { + const [{ document, selectedSidebarTab, selectedMainTab }, setEditorState] = useEditorState(); + + const renderCurrentSidebarPanel = () => { + switch (selectedSidebarTab) { + case 'block-configuration': + return ; + case 'styles': + return ; + } + }; + const renderMainPanel = () => { + switch (selectedMainTab) { + case 'editor': + return ; + case 'preview': + return ( + + + + ); + case 'html': + return ; + case 'data': + return ( + +
{JSON.stringify(document, null, '  ')}
+
+ ); + } + }; + + return ( + + + + + setEditorState({ selectedSidebarTab: v })}> + + + + + + {renderCurrentSidebarPanel()} + + + + setEditorState({ selectedMainTab: v })}> + + + + + + + + {renderMainPanel()} + + + ); +} diff --git a/packages/editor-sample/src/App/panels/HtmlPanel.tsx b/packages/editor-sample/src/App/panels/HtmlPanel.tsx new file mode 100644 index 0000000..852d52a --- /dev/null +++ b/packages/editor-sample/src/App/panels/HtmlPanel.tsx @@ -0,0 +1,19 @@ +import * as React from 'react'; +import { renderToStaticMarkup } from 'react-dom/server'; + +import { useEditorState } from '../../documents/editor/EditorContext'; +import ReaderBlock from '../../documents/reader/ReaderBlock'; +import { ReaderProvider } from '../../documents/reader/ReaderContext'; + +export default function HtmlPanel() { + const [{ document }] = useEditorState(); + const string = React.useMemo(() => { + return renderToStaticMarkup( + + + + ); + }, [document]); + + return
{string}
; +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/index.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/index.tsx new file mode 100644 index 0000000..8eb9069 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/index.tsx @@ -0,0 +1,72 @@ +import React from 'react'; + +import { Box, Typography } from '@mui/material'; + +import { TEditorBlock } from '../../../documents/editor/core'; +import { useEditorState } from '../../../documents/editor/EditorContext'; + +import AvatarSidebarPanel from './input-panels/AvatarSidebarPanel'; +import ButtonSidebarPanel from './input-panels/ButtonSidebarPanel'; +import ColumnsContainerSidebarPanel from './input-panels/ColumnsContainerSidebarPanel'; +import ContainerSidebarPanel from './input-panels/ContainerSidebarPanel'; +import DividerSidebarPanel from './input-panels/DividerSidebarPanel'; +import EmailLayoutSidebarPanel from './input-panels/EmailLayoutSidebarPanel'; +import HeadingSidebarPanel from './input-panels/HeadingSidebarPanel'; +import HtmlSidebarPanel from './input-panels/HtmlSidebarPanel'; +import ImageSidebarPanel from './input-panels/ImageSidebarPanel'; +import SpacerSidebarPanel from './input-panels/SpacerSidebarPanel'; +import TextSidebarPanel from './input-panels/TextSidebarPanel'; + +function renderMessage(val: string) { + return ( + + {val} + + ); +} + +export default function ConfigurationPanel() { + const [{ document, selectedBlockId }, setEditorState] = useEditorState(); + + if (!selectedBlockId) { + return renderMessage('No block selected. Click on a block to inspect.'); + } + const block = document[selectedBlockId]; + if (!block) { + return renderMessage(`Block with id ${selectedBlockId} was not found. Click on a block to reset.`); + } + + const setBlock = (conf: TEditorBlock) => + setEditorState({ + document: { ...document, [selectedBlockId]: conf }, + }); + const { data, type } = block; + switch (type) { + case 'Avatar': + return setBlock({ type, data })} />; + case 'Button': + return setBlock({ type, data })} />; + case 'ColumnsContainer': + return ( + setBlock({ type, data })} /> + ); + case 'Container': + return setBlock({ type, data })} />; + case 'Divider': + return setBlock({ type, data })} />; + case 'Heading': + return setBlock({ type, data })} />; + case 'Html': + return setBlock({ type, data })} />; + case 'Image': + return setBlock({ type, data })} />; + case 'EmailLayout': + return setBlock({ type, data })} />; + case 'Spacer': + return setBlock({ type, data })} />; + case 'Text': + return setBlock({ type, data })} />; + default: + return
{JSON.stringify(block, null, '  ')}
; + } +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/AvatarSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/AvatarSidebarPanel.tsx new file mode 100644 index 0000000..691ee40 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/AvatarSidebarPanel.tsx @@ -0,0 +1,88 @@ +import React, { useState } from 'react'; + +import { AspectRatioOutlined } from '@mui/icons-material'; +import { ToggleButton } from '@mui/material'; + +import { AvatarProps, AvatarPropsSchema } from '../../../../documents/blocks/Avatar'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import { NullableColorInput } from './helpers/inputs/ColorInput'; +import RadioGroupInput from './helpers/inputs/RadioGroupInput'; +import SliderInput from './helpers/inputs/SliderInput'; +import TextInput from './helpers/inputs/TextInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type AvatarSidebarPanelProps = { + data: AvatarProps; + setData: (v: AvatarProps) => void; +}; +export default function AvatarSidebarPanel({ data, setData }: AvatarSidebarPanelProps) { + const [, setErrors] = useState(null); + const updateData = (d: unknown) => { + const res = AvatarPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + } + units="px" + step={3} + min={32} + max={256} + defaultValue={data.props.size} + onChange={(size) => { + updateData({ ...data, props: { ...data.props, size } }); + }} + /> + { + updateData({ ...data, props: { ...data.props, shape } }); + }} + > + Circle + Square + Rounded + + { + updateData({ ...data, props: { ...data.props, imageUrl } }); + }} + /> + { + updateData({ ...data, props: { ...data.props, fallbackText } }); + }} + /> + { + updateData({ ...data, props: { ...data.props, fallbackColor } }); + }} + /> + + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ButtonSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ButtonSidebarPanel.tsx new file mode 100644 index 0000000..c0b2a48 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ButtonSidebarPanel.tsx @@ -0,0 +1,88 @@ +import React, { useState } from 'react'; + +import { ToggleButton } from '@mui/material'; + +import { ButtonProps, ButtonPropsSchema } from '../../../../documents/blocks/Button'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import ColorInput from './helpers/inputs/ColorInput'; +import RadioGroupInput from './helpers/inputs/RadioGroupInput'; +import TextInput from './helpers/inputs/TextInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type ButtonSidebarPanelProps = { + data: ButtonProps; + setData: (v: ButtonProps) => void; +}; +export default function ButtonSidebarPanel({ data, setData }: ButtonSidebarPanelProps) { + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = ButtonPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + updateData({ ...data, props: { ...data.props, text } })} + /> + updateData({ ...data, props: { ...data.props, url } })} + /> + updateData({ ...data, props: { ...data.props, fullWidth: v === 'FULL_WIDTH' } })} + > + Full + Auto + + updateData({ ...data, props: { ...data.props, size } })} + > + Xs + Sm + Md + Lg + + updateData({ ...data, props: { ...data.props, buttonStyle } })} + > + Rectangle + Rounded + Pill + + updateData({ ...data, props: { ...data.props, buttonTextColor } })} + secondarySwatch={[]} + /> + updateData({ ...data, props: { ...data.props, buttonBackgroundColor } })} + secondarySwatch={[]} + /> + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ColumnsContainerSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ColumnsContainerSidebarPanel.tsx new file mode 100644 index 0000000..c9537bb --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ColumnsContainerSidebarPanel.tsx @@ -0,0 +1,48 @@ +import React, { useState } from 'react'; + +import { ToggleButton } from '@mui/material'; + +import ColumnsContainerPropsSchema, { + ColumnsContainerProps, +} from '../../../../documents/blocks/ColumnsContainer/ColumnsContainerPropsSchema'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import RadioGroupInput from './helpers/inputs/RadioGroupInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type ColumnsContainerPanelProps = { + data: ColumnsContainerProps; + setData: (v: ColumnsContainerProps) => void; +}; +export default function ColumnsContainerPanel({ data, setData }: ColumnsContainerPanelProps) { + const [, setErrors] = useState(null); + const updateData = (d: unknown) => { + const res = ColumnsContainerPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + { + updateData({ ...data, props: { ...data.props, columnsCount: v === '2' ? 2 : 3 } }); + }} + > + 2 + 3 + + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ContainerSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ContainerSidebarPanel.tsx new file mode 100644 index 0000000..c6777ab --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ContainerSidebarPanel.tsx @@ -0,0 +1,33 @@ +import React, { useState } from 'react'; + +import { ContainerProps, ContainerPropsSchema } from '../../../../documents/blocks/Container'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type ContainerSidebarPanelProps = { + data: ContainerProps; + setData: (v: ContainerProps) => void; +}; + +export default function ContainerSidebarPanel({ data, setData }: ContainerSidebarPanelProps) { + const [, setErrors] = useState(null); + const updateData = (d: unknown) => { + const res = ContainerPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + return ( + + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/DividerSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/DividerSidebarPanel.tsx new file mode 100644 index 0000000..9dd19e5 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/DividerSidebarPanel.tsx @@ -0,0 +1,53 @@ +import React, { useState } from 'react'; + +import { HeightOutlined } from '@mui/icons-material'; + +import { DividerProps, DividerPropsSchema } from '../../../../documents/blocks/Divider'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import ColorInput from './helpers/inputs/ColorInput'; +import SliderInput from './helpers/inputs/SliderInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type DividerSidebarPanelProps = { + data: DividerProps; + setData: (v: DividerProps) => void; +}; +export default function DividerSidebarPanel({ data, setData }: DividerSidebarPanelProps) { + const [, setErrors] = useState(null); + const updateData = (d: unknown) => { + const res = DividerPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + updateData({ ...data, props: { ...data.props, lineColor } })} + secondarySwatch={[]} + /> + } + units="px" + step={1} + min={1} + max={24} + defaultValue={data.props.lineHeight} + onChange={(lineHeight) => updateData({ ...data, props: { ...data.props, lineHeight } })} + /> + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/EmailLayoutSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/EmailLayoutSidebarPanel.tsx new file mode 100644 index 0000000..fe4857d --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/EmailLayoutSidebarPanel.tsx @@ -0,0 +1,55 @@ +import React, { useState } from 'react'; +import { z } from 'zod'; + +import { Divider } from '@mui/material'; + +import { EmailLayoutPropsSchema } from '../../../../documents/blocks/EmailLayout'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import ColorInput from './helpers/inputs/ColorInput'; + +type EmailLayoutSidebarPanelProps = z.infer; + +const SECONDARY_SWATCH: string[] = []; +type EmailLayoutSidebarFieldsProps = { + data: EmailLayoutSidebarPanelProps; + setData: (v: EmailLayoutSidebarPanelProps) => void; +}; +export default function EmailLayoutSidebarFields({ data, setData }: EmailLayoutSidebarFieldsProps) { + const secondarySwatch = SECONDARY_SWATCH; + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = EmailLayoutPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + updateData({ ...data, backdropColor })} + secondarySwatch={secondarySwatch} + /> + updateData({ ...data, canvasColor })} + secondarySwatch={secondarySwatch} + /> + + updateData({ ...data, textColor })} + secondarySwatch={secondarySwatch} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/HeadingSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/HeadingSidebarPanel.tsx new file mode 100644 index 0000000..b227f49 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/HeadingSidebarPanel.tsx @@ -0,0 +1,57 @@ +import React, { useState } from 'react'; + +import { ToggleButton } from '@mui/material'; + +import { HeadingProps, HeadingPropsSchema } from '../../../../documents/blocks/Heading'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import RadioGroupInput from './helpers/inputs/RadioGroupInput'; +import TextInput from './helpers/inputs/TextInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type HeadingSidebarPanelProps = { + data: HeadingProps; + setData: (v: HeadingProps) => void; +}; +export default function HeadingSidebarPanel({ data, setData }: HeadingSidebarPanelProps) { + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = HeadingPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + { + updateData({ ...data, props: { ...data.props, text } }); + }} + /> + { + updateData({ ...data, props: { ...data.props, level } }); + }} + > + H1 + H2 + H3 + + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/HtmlSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/HtmlSidebarPanel.tsx new file mode 100644 index 0000000..6a28c56 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/HtmlSidebarPanel.tsx @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; + +import { HtmlProps, HtmlPropsSchema } from '../../../../documents/blocks/Html'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import TextInput from './helpers/inputs/TextInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type HtmlSidebarPanelProps = { + data: HtmlProps; + setData: (v: HtmlProps) => void; +}; +export default function HtmlSidebarPanel({ data, setData }: HtmlSidebarPanelProps) { + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = HtmlPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + updateData({ ...data, props: { ...data.props, contents } })} + /> + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ImageSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ImageSidebarPanel.tsx new file mode 100644 index 0000000..a2220a3 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/ImageSidebarPanel.tsx @@ -0,0 +1,71 @@ +import React, { useState } from 'react'; + +import { + VerticalAlignBottomOutlined, + VerticalAlignCenterOutlined, + VerticalAlignTopOutlined, +} from '@mui/icons-material'; +import { ToggleButton } from '@mui/material'; + +import { ImageProps, ImagePropsSchema } from '../../../../documents/blocks/Image'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import RadioGroupInput from './helpers/inputs/RadioGroupInput'; +import TextInput from './helpers/inputs/TextInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type ImageSidebarPanelProps = { + data: ImageProps; + setData: (v: ImageProps) => void; +}; +export default function ImageSidebarPanel({ data, setData }: ImageSidebarPanelProps) { + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = ImagePropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + updateData({ ...data, props: { ...data.props, contentAlignment } })} + > + + + + + + + + + + + updateData({ ...data, props: { ...data.props, alt } })} + /> + { + const linkHref = v.trim().length === 0 ? null : v.trim(); + updateData({ ...data, props: { ...data.props, linkHref } }); + }} + /> + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/SpacerSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/SpacerSidebarPanel.tsx new file mode 100644 index 0000000..d8cf45f --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/SpacerSidebarPanel.tsx @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; + +import { HeightOutlined } from '@mui/icons-material'; + +import { SpacerProps, SpacerPropsSchema } from '../../../../documents/blocks/Spacer'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import SliderInput from './helpers/inputs/SliderInput'; + +type SpacerSidebarPanelProps = { + data: SpacerProps; + setData: (v: SpacerProps) => void; +}; +export default function SpacerSidebarPanel({ data, setData }: SpacerSidebarPanelProps) { + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = SpacerPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + } + units="px" + step={4} + min={4} + max={128} + defaultValue={data.props.height} + onChange={(height) => updateData({ ...data, props: { ...data.props, height } })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/TextSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/TextSidebarPanel.tsx new file mode 100644 index 0000000..ee91fc2 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/TextSidebarPanel.tsx @@ -0,0 +1,42 @@ +import React, { useState } from 'react'; + +import { TextProps, TextPropsSchema } from '../../../../documents/blocks/Text'; + +import BaseSidebarPanel from './helpers/BaseSidebarPanel'; +import TextInput from './helpers/inputs/TextInput'; +import MultiStylePropertyPanel from './helpers/style-inputs/MultiStylePropertyPanel'; + +type TextSidebarPanelProps = { + data: TextProps; + setData: (v: TextProps) => void; +}; +export default function TextSidebarPanel({ data, setData }: TextSidebarPanelProps) { + const [, setErrors] = useState(null); + + const updateData = (d: unknown) => { + const res = TextPropsSchema.safeParse(d); + if (res.success) { + setData(res.data); + setErrors(null); + } else { + setErrors(res.error); + } + }; + + return ( + + updateData({ ...data, props: { ...data.props, text } })} + /> + + updateData({ ...data, style })} + /> + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/BaseSidebarPanel.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/BaseSidebarPanel.tsx new file mode 100644 index 0000000..eba8c56 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/BaseSidebarPanel.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +import { Box, Stack, Typography } from '@mui/material'; + +type SidebarPanelProps = { + title: string; + children: React.ReactNode; +}; +export default function BaseSidebarPanel({ title, children }: SidebarPanelProps) { + return ( + + + {title} + + + {children} + + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/BooleanInput.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/BooleanInput.tsx new file mode 100644 index 0000000..cc710a6 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/BooleanInput.tsx @@ -0,0 +1,27 @@ +import React, { useState } from 'react'; + +import { FormControlLabel, Switch } from '@mui/material'; + +type Props = { + label: string; + defaultValue: boolean; + onChange: (value: boolean) => void; +}; + +export default function BooleanInput({ label, defaultValue, onChange }: Props) { + const [value, setValue] = useState(defaultValue); + return ( + { + setValue(checked); + onChange(checked); + }} + /> + } + /> + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/BaseColorInput.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/BaseColorInput.tsx new file mode 100644 index 0000000..edf9484 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/BaseColorInput.tsx @@ -0,0 +1,95 @@ +import React, { useState } from 'react'; + +import { AddOutlined, CloseOutlined } from '@mui/icons-material'; +import { ButtonBase, InputLabel, Menu, Stack } from '@mui/material'; + +import Picker from './Picker'; + +const BUTTON_SX = { + border: '1px solid', + borderColor: 'cadet.400', + width: 32, + height: 32, + borderRadius: '4px', + bgcolor: '#FFFFFF', +}; + +type Props = + | { + nullable: true; + label: string; + onChange: (value: string | null) => void; + defaultValue: string | null; + secondarySwatch: string[]; + } + | { + nullable: false; + label: string; + onChange: (value: string) => void; + defaultValue: string; + secondarySwatch: string[]; + }; +export default function ColorInput({ label, defaultValue, onChange, secondarySwatch, nullable }: Props) { + const [anchorEl, setAnchorEl] = useState(null); + const [value, setValue] = useState(defaultValue); + const handleClickOpen = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + + const renderResetButton = () => { + if (!nullable) { + return null; + } + if (typeof value !== 'string' || value.trim().length === 0) { + return null; + } + return ( + { + setValue(null); + onChange(null); + }} + > + + + ); + }; + + const renderOpenButton = () => { + if (value) { + return ; + } + return ( + + + + ); + }; + + return ( + + {label} + + {renderOpenButton()} + {renderResetButton()} + + setAnchorEl(null)} + MenuListProps={{ + sx: { height: 'auto', padding: 0 }, + }} + > + { + setValue(v); + onChange(v); + }} + secondarySwatch={secondarySwatch} + /> + + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Picker.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Picker.tsx new file mode 100644 index 0000000..5077983 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Picker.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { HexColorInput, HexColorPicker } from 'react-colorful'; + +import { Box, Stack, SxProps, Typography } from '@mui/material'; + +import Swatch from './Swatch'; + +const DEFAULT_PRESET_COLORS = [ + '#24AF7F', + '#3DD8B3', + '#D82922', + '#Ad5626', + '#CFB847', + '#FFCF5A', + '#D86A07', + '#EBA52C', + '#03124A', + '#2458AF', + '#528FD9', + '#000000', + '#191A1A', + '#242424', + '#303031', + '#474849', + '#C9D5D3', + '#C6E5DF', + '#FAF1E7', + '#EEEEEE', + '#FFFFFF', +]; + +const SX: SxProps = { + p: 1, + '.react-colorful__pointer ': { + width: 16, + height: 16, + }, + '.react-colorful__saturation': { + mb: 1, + borderRadius: '4px', + }, + '.react-colorful__last-control': { + borderRadius: '4px', + }, + '.react-colorful__hue-pointer': { + width: '4px', + borderRadius: '4px', + height: 24, + cursor: 'col-resize', + }, + '.react-colorful__saturation-pointer': { + cursor: 'all-scroll', + }, + input: { + padding: 1, + border: '1px solid', + borderColor: 'grey.300', + borderRadius: '4px', + width: '100%', + }, +}; + +type Props = { + value: string; + onChange: (v: string) => void; + secondarySwatch: string[]; +}; +export default function Picker({ value, onChange, secondarySwatch }: Props) { + return ( + + + + + + In template / layout + + + + + + + + ); +} diff --git a/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Swatch.tsx b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Swatch.tsx new file mode 100644 index 0000000..7268ce1 --- /dev/null +++ b/packages/editor-sample/src/App/sidebar/ConfigurationPanel/input-panels/helpers/inputs/ColorInput/Swatch.tsx @@ -0,0 +1,41 @@ +import React from 'react'; + +import { Box, Button, SxProps } from '@mui/material'; + +type Props = { + paletteColors: string[]; + value: string; + onChange: (value: string) => void; +}; + +const TILE_BUTTON: SxProps = { + width: 24, + height: 24, +}; +export default function Swatch({ paletteColors, value, onChange }: Props) { + const renderButton = (colorValue: string) => { + return ( + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/BlocksMenu.tsx b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/BlocksMenu.tsx new file mode 100644 index 0000000..5b64588 --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/BlocksMenu.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +import { Box, Menu } from '@mui/material'; + +import { TEditorBlock } from '../../../../editor/core'; + +import BlockButton from './BlockButton'; +import { BUTTONS } from './buttons'; + +type BlocksMenuProps = { + anchorEl: HTMLElement | null; + setAnchorEl: (v: HTMLElement | null) => void; + onSelect: (block: TEditorBlock) => void; +}; +export default function BlocksMenu({ anchorEl, setAnchorEl, onSelect }: BlocksMenuProps) { + const onClose = () => { + setAnchorEl(null); + }; + + const onClick = (block: TEditorBlock) => { + onSelect(block); + setAnchorEl(null); + }; + + if (anchorEl === null) { + return null; + } + + return ( + + + {BUTTONS.map((k, i) => ( + onClick(k.block())} /> + ))} + + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/DividerButton.tsx b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/DividerButton.tsx new file mode 100644 index 0000000..fc8249c --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/DividerButton.tsx @@ -0,0 +1,64 @@ +import React, { useEffect, useState } from 'react'; + +import { AddOutlined } from '@mui/icons-material'; +import { Fade, IconButton } from '@mui/material'; + +type Props = { + buttonElement: HTMLElement | null; + onClick: () => void; +}; +export default function DividerButton({ buttonElement, onClick }: Props) { + const [visible, setVisible] = useState(false); + + useEffect(() => { + function listener({ clientX, clientY }: MouseEvent) { + if (!buttonElement) { + return; + } + const rect = buttonElement.getBoundingClientRect(); + const rectY = rect.y; + const bottomX = rect.x; + const topX = bottomX + rect.width; + + if (Math.abs(clientY - rectY) < 20) { + if (bottomX < clientX && clientX < topX) { + setVisible(true); + return; + } + } + setVisible(false); + } + window.addEventListener('mousemove', listener); + return () => { + window.removeEventListener('mousemove', listener); + }; + }, [buttonElement, setVisible]); + + return ( + + { + ev.stopPropagation(); + onClick(); + }} + > + + + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/PlaceholderButton.tsx b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/PlaceholderButton.tsx new file mode 100644 index 0000000..e14519a --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/PlaceholderButton.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { AddOutlined } from '@mui/icons-material'; +import { ButtonBase } from '@mui/material'; + +type Props = { + onClick: () => void; +}; +export default function PlaceholderButton({ onClick }: Props) { + return ( + { + ev.stopPropagation(); + onClick(); + }} + sx={{ + display: 'flex', + alignContent: 'center', + justifyContent: 'center', + height: 48, + width: '100%', + bgcolor: 'rgba(0,0,0, 0.05)', + }} + > + + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.tsx b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.tsx new file mode 100644 index 0000000..3992ece --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.tsx @@ -0,0 +1,146 @@ +import React from 'react'; + +import { + AccountCircleOutlined, + Crop32Outlined, + HMobiledataOutlined, + HorizontalRuleOutlined, + HtmlOutlined, + ImageOutlined, + LibraryAddOutlined, + NotesOutlined, + SmartButtonOutlined, + ViewColumnOutlined, +} from '@mui/icons-material'; + +import { TEditorBlock } from '../../../../editor/core'; +import { AvatarPropsSchema } from '../../../Avatar'; +import { ButtonPropsSchema } from '../../../Button'; +import ColumnsContainerPropsSchema from '../../../ColumnsContainer/ColumnsContainerPropsSchema'; +import { ContainerPropsSchema } from '../../../Container'; +import { DividerPropsSchema } from '../../../Divider'; +import { HeadingPropsSchema } from '../../../Heading'; +import { HtmlPropsSchema } from '../../../Html'; +import { ImagePropsSchema } from '../../../Image'; +import { SpacerPropsSchema } from '../../../Spacer'; +import { TextPropsSchema } from '../../../Text'; + +type TButtonProps = { + label: string; + icon: JSX.Element; + block: () => TEditorBlock; +}; +export const BUTTONS: TButtonProps[] = [ + { + label: 'Heading', + icon: , + block: () => ({ + type: 'Heading', + data: HeadingPropsSchema.parse({ + props: { text: 'Hello friend' }, + }), + }), + }, + { + label: 'Text', + icon: , + block: () => ({ + type: 'Text', + data: TextPropsSchema.parse({ + props: { text: 'My new text block' }, + }), + }), + }, + + { + label: 'Button', + icon: , + block: () => ({ + type: 'Button', + data: ButtonPropsSchema.parse({ + props: { + text: 'Button', + url: 'https://www.usewaypoint.com', + }, + }), + }), + }, + { + label: 'Image', + icon: , + block: () => ({ + type: 'Image', + data: ImagePropsSchema.parse({ + props: { + url: 'https://logowik.com/content/uploads/images/street-fighter6886.jpg', + alt: 'Street fighter', + contentAlignment: 'middle', + linkHref: null, + }, + }), + }), + }, + { + label: 'Avatar', + icon: , + block: () => ({ + type: 'Avatar', + data: AvatarPropsSchema.parse({ + props: { + imageUrl: 'https://ui-avatars.com/api/?size=128', + shape: 'circle', + }, + }), + }), + }, + { + label: 'Divider', + icon: , + block: () => ({ + type: 'Divider', + data: DividerPropsSchema.parse({}), + }), + }, + { + label: 'Spacer', + icon: , + block: () => ({ + type: 'Spacer', + data: SpacerPropsSchema.parse({}), + }), + }, + { + label: 'Html', + icon: , + block: () => ({ + type: 'Html', + data: HtmlPropsSchema.parse({ props: { contents: 'Hello world' } }), + }), + }, + { + label: 'Columns', + icon: , + block: () => ({ + type: 'ColumnsContainer', + data: ColumnsContainerPropsSchema.parse({ + props: { + columnsCount: 3, + columns: [{ childrenIds: [] }, { childrenIds: [] }, { childrenIds: [] }], + }, + }), + }), + }, + { + label: 'Container', + icon: , + block: () => ({ + type: 'Container', + data: ContainerPropsSchema.parse({ + props: { childrenIds: [] }, + }), + }), + }, + + // { label: 'ProgressBar', icon: , block: () => ({}) }, + // { label: 'LoopContainer', icon: , block: () => ({}) }, +]; diff --git a/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/index.tsx b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/index.tsx new file mode 100644 index 0000000..69cd8ad --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/index.tsx @@ -0,0 +1,37 @@ +import React, { useState } from 'react'; + +import { TEditorBlock } from '../../../../editor/core'; + +import BlocksMenu from './BlocksMenu'; +import DividerButton from './DividerButton'; +import PlaceholderButton from './PlaceholderButton'; + +type Props = { + placeholder?: boolean; + onSelect: (block: TEditorBlock) => void; +}; +export default function AddBlockButton({ onSelect, placeholder }: Props) { + const [menuAnchorEl, setMenuAnchorEl] = useState(null); + const [buttonElement, setButtonElement] = useState(null); + + const handleButtonClick = () => { + setMenuAnchorEl(buttonElement); + }; + + const renderButton = () => { + if (placeholder) { + return ; + } else { + return ; + } + }; + + return ( + <> +
+ {renderButton()} +
+ + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/index.tsx b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/index.tsx new file mode 100644 index 0000000..fbee88c --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/EditorChildrenIds/index.tsx @@ -0,0 +1,24 @@ +import React, { Fragment } from 'react'; + +import { TEditorBlock } from '../../../editor/core'; +import EditorBlock from '../../../editor/EditorBlock'; + +import AddBlockButton from './AddBlockMenu'; + +type Props = { + childrenIds: string[]; + insertBlock: (block: TEditorBlock, index: number | null) => void; +}; +export default function EditorChildrenIds({ childrenIds, insertBlock }: Props) { + return ( + <> + {childrenIds.map((childId, i) => ( + + insertBlock(block, i)} /> + + + ))} + insertBlock(block, null)} /> + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/TStyle.ts b/packages/editor-sample/src/documents/blocks/helpers/TStyle.ts new file mode 100644 index 0000000..5903d1d --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/TStyle.ts @@ -0,0 +1,13 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export type TStyle = { + backgroundColor?: any; + borderColor?: any; + borderRadius?: any; + color?: any; + fontFamily?: any; + fontSize?: any; + fontWeight?: any; + padding?: any; + textAlign?: any; +}; diff --git a/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/EditorBlockWrapper.tsx b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/EditorBlockWrapper.tsx new file mode 100644 index 0000000..f18b486 --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/EditorBlockWrapper.tsx @@ -0,0 +1,65 @@ +import React, { CSSProperties, useState } from 'react'; + +import { Box } from '@mui/material'; + +import { useCurrentBlockId } from '../../../editor/EditorBlock'; +import { useEditorState } from '../../../editor/EditorContext'; +import { TStyle } from '../TStyle'; + +import ReaderBlockWrapper from './ReaderBlockWrapper'; +import TuneMenu from './TuneMenu'; + +type TEditorBlockWrapperProps = { + style: TStyle; + children: JSX.Element; +}; + +export default function EditorBlockWrapper({ style, children }: TEditorBlockWrapperProps) { + const [{ selectedBlockId }, setEditorState] = useEditorState(); + const [mouseInside, setMouseInside] = useState(false); + const blockId = useCurrentBlockId(); + + let outline: CSSProperties['outline']; + if (selectedBlockId === blockId) { + outline = '2px solid blue'; + } else if (mouseInside) { + outline = '2px dashed blue'; + } + + const renderMenu = () => { + if (selectedBlockId !== blockId) { + return null; + } + return ; + }; + + return ( + { + setMouseInside(true); + ev.stopPropagation(); + }} + onMouseLeave={(ev) => { + setMouseInside(false); + ev.stopPropagation(); + }} + onClick={(ev) => { + setEditorState({ + selectedSidebarTab: 'block-configuration', + selectedBlockId: blockId, + }); + ev.stopPropagation(); + ev.preventDefault(); + }} + > + {renderMenu()} + {children} + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/ReaderBlockWrapper.tsx b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/ReaderBlockWrapper.tsx new file mode 100644 index 0000000..91a4c72 --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/ReaderBlockWrapper.tsx @@ -0,0 +1,26 @@ +import React, { CSSProperties } from 'react'; + +import { TStyle } from '../TStyle'; + +type TReaderBlockWrapperProps = { + style: TStyle; + children: JSX.Element; +}; + +export default function ReaderBlockWrapper({ style, children }: TReaderBlockWrapperProps) { + const { padding, borderColor, ...restStyle } = style; + const cssStyle: CSSProperties = { + ...restStyle, + }; + + if (padding) { + const { top, bottom, left, right } = padding; + cssStyle.padding = `${top}px ${right}px ${bottom}px ${left}px`; + } + + if (borderColor) { + cssStyle.border = `1px solid ${borderColor}`; + } + + return
{children}
; +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/TuneMenu.tsx b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/TuneMenu.tsx new file mode 100644 index 0000000..367fd47 --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/TuneMenu.tsx @@ -0,0 +1,89 @@ +import React, { CSSProperties } from 'react'; + +import { DeleteOutlined } from '@mui/icons-material'; +import { IconButton, Paper, Stack, Tooltip } from '@mui/material'; + +import { TEditorBlock } from '../../../editor/core'; +import { useEditorState } from '../../../editor/EditorContext'; +import { ColumnsContainerProps } from '../../ColumnsContainer/ColumnsContainerPropsSchema'; + +const STYLE: CSSProperties = { + position: 'absolute', + top: 0, + left: -52, + borderRadius: 64, + padding: '8px 4px', +}; + +type Props = { + blockId: string; +}; +export default function TuneMenu({ blockId }: Props) { + const [{ document }, setEditorState] = useEditorState(); + + const handleDeleteClick = () => { + const nDocument: typeof document = { ...document }; + for (const [id, b] of Object.entries(nDocument)) { + const block = b as TEditorBlock; + if (id === blockId) { + continue; + } + switch (block.type) { + case 'EmailLayout': + nDocument[id] = { + ...block, + data: { + ...block.data, + childrenIds: block.data.childrenIds.filter((f) => f !== blockId), + }, + }; + break; + case 'Container': + nDocument[id] = { + ...block, + data: { + ...block.data, + props: { + ...block.data.props, + childrenIds: block.data.props.childrenIds.filter((f) => f !== blockId), + }, + }, + }; + break; + case 'ColumnsContainer': + nDocument[id] = { + ...block, + data: { + ...block.data, + props: { + ...block.data.props, + columns: block.data.props.columns.map((c) => ({ + childrenIds: c.childrenIds.filter((f) => f !== blockId), + })) as ColumnsContainerProps['props']['columns'], + }, + }, + }; + break; + default: + nDocument[id] = block; + } + } + delete nDocument[blockId]; + setEditorState({ + document: nDocument, + selectedBlockId: null, + }); + }; + + return ( + ev.stopPropagation()}> + + + + + + + + + ); +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/index.tsx b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/index.tsx new file mode 100644 index 0000000..1e33bbb --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/block-wrappers/index.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +import { TStyle } from '../TStyle'; + +import EditorBlockWrapper from './EditorBlockWrapper'; +import ReaderBlockWrapper from './ReaderBlockWrapper'; + +type TCommonProps = { + props: Record; + style: TStyle; +}; + +export function addReaderBlockWrapper(ChildComponent: (props: TProps) => React.ReactNode) { + return (props: TProps) => { + return ( + + + + ); + }; +} + +export function addEditorBlockWrapper(ChildComponent: (props: TProps) => React.ReactNode) { + return (props: TProps) => { + return ( + + + + ); + }; +} diff --git a/packages/editor-sample/src/documents/blocks/helpers/fontFamily.ts b/packages/editor-sample/src/documents/blocks/helpers/fontFamily.ts new file mode 100644 index 0000000..38814e5 --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/fontFamily.ts @@ -0,0 +1,61 @@ +export const FONT_FAMILIES = [ + { + key: 'MODERN_SANS', + label: 'Modern sans', + value: '"Helvetica Neue", "Arial Nova", "Nimbus Sans", Arial, sans-serif', + }, + { + key: 'BOOK_SANS', + label: 'Book sans', + value: 'Optima, Candara, "Noto Sans", source-sans-pro, sans-serif', + }, + { + key: 'ORGANIC_SANS', + label: 'Organic sans', + value: 'Seravek, "Gill Sans Nova", Ubuntu, Calibri, "DejaVu Sans", source-sans-pro, sans-serif', + }, + { + key: 'GEOMETRIC_SANS', + label: 'Geometric sans', + value: 'Avenir, "Avenir Next LT Pro", Montserrat, Corbel, "URW Gothic", source-sans-pro, sans-serif', + }, + { + key: 'HEAVY_SANS', + label: 'Heavy sans', + value: + 'Bahnschrift, "DIN Alternate", "Franklin Gothic Medium", "Nimbus Sans Narrow", sans-serif-condensed, sans-serif', + }, + { + key: 'ROUNDED_SANS', + label: 'Rounded sans', + value: + 'ui-rounded, "Hiragino Maru Gothic ProN", Quicksand, Comfortaa, Manjari, "Arial Rounded MT Bold", Calibri, source-sans-pro, sans-serif', + }, + { + key: 'MODERN_SERIF', + label: 'Modern serif', + value: 'Charter, "Bitstream Charter", "Sitka Text", Cambria, serif', + }, + { + key: 'BOOK_SERIF', + label: 'Book serif', + value: '"Iowan Old Style", "Palatino Linotype", "URW Palladio L", P052, serif', + }, + { + key: 'MONOSPACE', + label: 'Monospace', + value: '"Nimbus Mono PS", "Courier New", "Cutive Mono", monospace', + }, +]; + +export const FONT_FAMILY_NAMES = [ + 'MODERN_SANS', + 'BOOK_SANS', + 'ORGANIC_SANS', + 'GEOMETRIC_SANS', + 'HEAVY_SANS', + 'ROUNDED_SANS', + 'MODERN_SERIF', + 'BOOK_SERIF', + 'MONOSPACE', +] as const; diff --git a/packages/editor-sample/src/documents/blocks/helpers/zod.ts b/packages/editor-sample/src/documents/blocks/helpers/zod.ts new file mode 100644 index 0000000..7c975e2 --- /dev/null +++ b/packages/editor-sample/src/documents/blocks/helpers/zod.ts @@ -0,0 +1,28 @@ +import { z } from 'zod'; + +import { FONT_FAMILY_NAMES } from './fontFamily'; + +export function zColor() { + return z.string().regex(/^#[0-9a-fA-F]{6}$/); +} + +export function zFontFamily() { + return z.enum(FONT_FAMILY_NAMES); +} + +export function zFontWeight() { + return z.enum(['bold', 'normal']); +} + +export function zTextAlign() { + return z.enum(['left', 'center', 'right']); +} + +export function zPadding() { + return z.object({ + top: z.number(), + bottom: z.number(), + right: z.number(), + left: z.number(), + }); +} diff --git a/packages/editor-sample/src/documents/editor/EditorBlock.tsx b/packages/editor-sample/src/documents/editor/EditorBlock.tsx new file mode 100644 index 0000000..2471bd4 --- /dev/null +++ b/packages/editor-sample/src/documents/editor/EditorBlock.tsx @@ -0,0 +1,29 @@ +import React, { createContext, useContext } from 'react'; + +import { EditorBlock as CoreEditorBlock } from './core'; +import { useEditorState } from './EditorContext'; + +const EditorBlockContext = createContext(null); +export const useCurrentBlockId = () => useContext(EditorBlockContext)!; + +type EditorBlockProps = { + id: string; +}; + +/** + * + * @param id - Block id + * @returns EditorBlock component that loads data from the EditorDocumentContext + */ +export default function EditorBlock({ id }: EditorBlockProps) { + const [state] = useEditorState(); + const block = state.document[id]; + if (!block) { + throw new Error('Could not find block'); + } + return ( + + + + ); +} diff --git a/packages/editor-sample/src/documents/editor/EditorContext.tsx b/packages/editor-sample/src/documents/editor/EditorContext.tsx new file mode 100644 index 0000000..10e623c --- /dev/null +++ b/packages/editor-sample/src/documents/editor/EditorContext.tsx @@ -0,0 +1,47 @@ +import React, { createContext, useContext, useMemo, useState } from 'react'; + +import { TEditorConfiguration } from './core'; + +type TValue = { + document: TEditorConfiguration; + + selectedBlockId: string | null; + selectedSidebarTab: 'block-configuration' | 'styles'; + selectedMainTab: 'editor' | 'preview' | 'data' | 'html'; +}; +type TEditorContextState = [state: TValue, setState: (v: Partial) => void]; + +const DEFAULT_STATE: TValue = { + document: {}, + selectedBlockId: null, + selectedSidebarTab: 'styles', + selectedMainTab: 'editor', +}; +const EditorContext = createContext([DEFAULT_STATE, () => {}]); + +export function useEditorState() { + return useContext(EditorContext); +} + +type EditorProviderProps = { + defaultValue: TEditorConfiguration; + children: Parameters[0]['children']; +}; +export function EditorProvider({ defaultValue, children }: EditorProviderProps) { + const [state, setState] = useState(() => ({ + document: defaultValue, + selectedBlockId: null, + selectedSidebarTab: 'styles', + selectedMainTab: 'editor', + })); + const value = useMemo( + () => [ + state, + (s: Partial) => { + setState({ ...state, ...s }); + }, + ], + [state, setState] + ); + return {children}; +} diff --git a/packages/editor-sample/src/documents/editor/core.tsx b/packages/editor-sample/src/documents/editor/core.tsx new file mode 100644 index 0000000..0e4ee3f --- /dev/null +++ b/packages/editor-sample/src/documents/editor/core.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { z } from 'zod'; + +import { buildBlockComponent, buildBlockConfigurationSchema } from '@usewaypoint/document-core'; + +import { Avatar, AvatarPropsSchema } from '../blocks/Avatar'; +import { Button, ButtonPropsSchema } from '../blocks/Button'; +import { EditorColumnsContainer } from '../blocks/ColumnsContainer'; +import ColumnsContainerPropsSchema from '../blocks/ColumnsContainer/ColumnsContainerPropsSchema'; +import { ContainerPropsSchema, EditorContainer } from '../blocks/Container'; +import { Divider, DividerPropsSchema } from '../blocks/Divider'; +import { EditorEmailLayout, EmailLayoutProps, EmailLayoutPropsSchema } from '../blocks/EmailLayout'; +import { Heading, HeadingPropsSchema } from '../blocks/Heading'; +import { addEditorBlockWrapper } from '../blocks/helpers/block-wrappers'; +import { Html, HtmlPropsSchema } from '../blocks/Html'; +import { Image, ImagePropsSchema } from '../blocks/Image'; +import { Spacer, SpacerPropsSchema } from '../blocks/Spacer'; +import { Text, TextPropsSchema } from '../blocks/Text'; + +const EDITOR_DICTIONARY = { + Avatar: { + schema: AvatarPropsSchema, + Component: addEditorBlockWrapper(Avatar), + }, + Button: { + schema: ButtonPropsSchema, + Component: addEditorBlockWrapper(Button), + }, + Container: { + schema: ContainerPropsSchema, + Component: addEditorBlockWrapper(EditorContainer), + }, + ColumnsContainer: { + schema: ColumnsContainerPropsSchema, + Component: addEditorBlockWrapper(EditorColumnsContainer), + }, + Divider: { + schema: DividerPropsSchema, + Component: addEditorBlockWrapper(Divider), + }, + Heading: { + schema: HeadingPropsSchema, + Component: addEditorBlockWrapper(Heading), + }, + Html: { + schema: HtmlPropsSchema, + Component: addEditorBlockWrapper(Html), + }, + Image: { + schema: ImagePropsSchema, + Component: addEditorBlockWrapper(Image), + }, + Text: { + schema: TextPropsSchema, + Component: addEditorBlockWrapper(Text), + }, + EmailLayout: { + schema: EmailLayoutPropsSchema, + Component: (p: EmailLayoutProps) => ( +
+ +
+ ), + }, + Spacer: { + schema: SpacerPropsSchema, + Component: addEditorBlockWrapper(Spacer), + }, +}; + +export const EditorBlock = buildBlockComponent(EDITOR_DICTIONARY); +export const EditorBlockSchema = buildBlockConfigurationSchema(EDITOR_DICTIONARY); +export const EditorConfigurationSchema = z.record(z.string(), EditorBlockSchema); + +export type TEditorBlock = z.infer; +export type TEditorConfiguration = Record; diff --git a/packages/editor-sample/src/documents/reader/ReaderBlock.tsx b/packages/editor-sample/src/documents/reader/ReaderBlock.tsx new file mode 100644 index 0000000..494518a --- /dev/null +++ b/packages/editor-sample/src/documents/reader/ReaderBlock.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +import { ReaderBlock as CoreReaderBlock } from './core'; +import { useReaderDocument } from './ReaderContext'; + +type ReaderBlockProps = { + id: string; +}; + +/** + * @param id - Block id + * @returns ReaderBlock component that loads data from the ReaderDocumentContext + */ +export default function ReaderBlock({ id }: ReaderBlockProps) { + const document = useReaderDocument(); + const block = document[id]; + if (!block) { + throw new Error('Could not find block'); + } + return ; +} diff --git a/packages/editor-sample/src/documents/reader/ReaderContext.tsx b/packages/editor-sample/src/documents/reader/ReaderContext.tsx new file mode 100644 index 0000000..6982c8f --- /dev/null +++ b/packages/editor-sample/src/documents/reader/ReaderContext.tsx @@ -0,0 +1,17 @@ +import React, { createContext, useContext } from 'react'; + +import { TReaderDocument } from './core'; + +const ReaderContext = createContext({}); + +export function useReaderDocument() { + return useContext(ReaderContext); +} + +type ReaderProviderProps = { + value: TReaderDocument; + children: Parameters[0]['children']; +}; +export function ReaderProvider({ value, children }: ReaderProviderProps) { + return {children}; +} diff --git a/packages/editor-sample/src/documents/reader/core.tsx b/packages/editor-sample/src/documents/reader/core.tsx new file mode 100644 index 0000000..6a8e4c8 --- /dev/null +++ b/packages/editor-sample/src/documents/reader/core.tsx @@ -0,0 +1,73 @@ +import { z } from 'zod'; + +import { buildBlockComponent, buildBlockConfigurationSchema } from '@usewaypoint/document-core'; + +import { Avatar, AvatarPropsSchema } from '../blocks/Avatar'; +import { Button, ButtonPropsSchema } from '../blocks/Button'; +import { ColumnsContainer } from '../blocks/ColumnsContainer'; +import ColumnsContainerPropsSchema from '../blocks/ColumnsContainer/ColumnsContainerPropsSchema'; +import { Container, ContainerPropsSchema } from '../blocks/Container'; +import { Divider, DividerPropsSchema } from '../blocks/Divider'; +import { EmailLayout, EmailLayoutPropsSchema } from '../blocks/EmailLayout'; +import { Heading, HeadingPropsSchema } from '../blocks/Heading'; +import { addReaderBlockWrapper } from '../blocks/helpers/block-wrappers'; +import { Html, HtmlPropsSchema } from '../blocks/Html'; +import { Image, ImagePropsSchema } from '../blocks/Image'; +import { Spacer, SpacerPropsSchema } from '../blocks/Spacer'; +import { Text, TextPropsSchema } from '../blocks/Text'; + +const READER_DICTIONARY = { + Avatar: { + schema: AvatarPropsSchema, + Component: addReaderBlockWrapper(Avatar), + }, + Button: { + schema: ButtonPropsSchema, + Component: addReaderBlockWrapper(Button), + }, + ColumnsContainer: { + schema: ColumnsContainerPropsSchema, + Component: addReaderBlockWrapper(ColumnsContainer), + }, + Container: { + schema: ContainerPropsSchema, + Component: addReaderBlockWrapper(Container), + }, + Divider: { + schema: DividerPropsSchema, + Component: addReaderBlockWrapper(Divider), + }, + Heading: { + schema: HeadingPropsSchema, + Component: addReaderBlockWrapper(Heading), + }, + Html: { + schema: HtmlPropsSchema, + Component: addReaderBlockWrapper(Html), + }, + Image: { + schema: ImagePropsSchema, + Component: addReaderBlockWrapper(Image), + }, + Text: { + schema: TextPropsSchema, + Component: addReaderBlockWrapper(Text), + }, + EmailLayout: { + schema: EmailLayoutPropsSchema, + Component: EmailLayout, + }, + Spacer: { + schema: SpacerPropsSchema, + Component: addReaderBlockWrapper(Spacer), + }, +}; + +const ReaderBlockSchema = buildBlockConfigurationSchema(READER_DICTIONARY); +const ReaderDocumentSchema = z.record(z.string(), ReaderBlockSchema); + +export const ReaderBlock = buildBlockComponent(READER_DICTIONARY); + +export type TReaderDocument = Record>; + +export default ReaderDocumentSchema; diff --git a/packages/editor-sample/src/favicon/android-chrome-192x192.png b/packages/editor-sample/src/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..bf1422e Binary files /dev/null and b/packages/editor-sample/src/favicon/android-chrome-192x192.png differ diff --git a/packages/editor-sample/src/favicon/android-chrome-512x512.png b/packages/editor-sample/src/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..820e38f Binary files /dev/null and b/packages/editor-sample/src/favicon/android-chrome-512x512.png differ diff --git a/packages/editor-sample/src/favicon/apple-touch-icon.png b/packages/editor-sample/src/favicon/apple-touch-icon.png new file mode 100644 index 0000000..07800e4 Binary files /dev/null and b/packages/editor-sample/src/favicon/apple-touch-icon.png differ diff --git a/packages/editor-sample/src/favicon/favicon-16x16.png b/packages/editor-sample/src/favicon/favicon-16x16.png new file mode 100644 index 0000000..1c98cdd Binary files /dev/null and b/packages/editor-sample/src/favicon/favicon-16x16.png differ diff --git a/packages/editor-sample/src/favicon/favicon-32x32.png b/packages/editor-sample/src/favicon/favicon-32x32.png new file mode 100644 index 0000000..1795a45 Binary files /dev/null and b/packages/editor-sample/src/favicon/favicon-32x32.png differ diff --git a/packages/editor-sample/src/favicon/favicon.ico b/packages/editor-sample/src/favicon/favicon.ico new file mode 100644 index 0000000..276b22c Binary files /dev/null and b/packages/editor-sample/src/favicon/favicon.ico differ diff --git a/packages/editor-sample/src/main.tsx b/packages/editor-sample/src/main.tsx new file mode 100644 index 0000000..8cbb9b1 --- /dev/null +++ b/packages/editor-sample/src/main.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import CssBaseline from '@mui/material/CssBaseline'; +import { ThemeProvider } from '@mui/material/styles'; + +import App from './App'; +import { EditorConfigurationSchema } from './documents/editor/core'; +import { EditorProvider } from './documents/editor/EditorContext'; +import theme from './theme'; + +function getConfiguration() { + if (window.location.hash) { + const encodedString = window.location.hash.slice(1); + const configurationString = atob(encodedString); + try { + return JSON.parse(configurationString); + } catch { + console.error(`Couldn't load configuration from hash.`); + } + } + + const configurationString = localStorage.getItem('configuration'); + if (typeof configurationString === 'string') { + try { + return JSON.parse(configurationString); + } catch { + console.error(`Couldn't load configuration from localStorage.`); + } + } + + return { + root: { + type: 'EmailLayout', + data: { + backdropColor: '#e5e7e5', + canvasColor: '#FFFFFF', + textColor: '#242424', + accentColor: '#0b5499', + fontFamily: 'MODERN_SANS', + childrenIds: [], + }, + }, + }; +} + +const DEFAULT_VALUE = EditorConfigurationSchema.parse(getConfiguration()); + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + + + + +); diff --git a/packages/editor-sample/src/theme.ts b/packages/editor-sample/src/theme.ts new file mode 100644 index 0000000..1d31759 --- /dev/null +++ b/packages/editor-sample/src/theme.ts @@ -0,0 +1,735 @@ +import { alpha, createTheme, darken, lighten } from '@mui/material/styles'; + +const BRAND_NAVY = '#212443'; +const BRAND_BLUE = '#0079CC'; +const BRAND_GREEN = '#1F8466'; +const BRAND_RED = '#E81212'; +const BRAND_YELLOW = '#F6DC9F'; +const BRAND_PURPLE = '#6C0E7C'; +const BRAND_BROWN = '#CC996C'; +const STANDARD_FONT_FAMILY = + '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"'; +const MONOSPACE_FONT_FAMILY = + 'ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", monospace'; + +const CUSTOM_COLORS = { + marketbaseNavy: BRAND_NAVY, + marketbaseBlue: BRAND_BLUE, + marketbaseGreen: BRAND_GREEN, + marketbaseRed: BRAND_RED, + marketbaseYellow: BRAND_YELLOW, + marketbasePurple: BRAND_PURPLE, + marketbaseBrown: BRAND_BROWN, +}; + +const BASE_THEME = createTheme({ + palette: { + background: { + default: '#f2f5f7', + }, + text: { + primary: '#1F1F21', + secondary: '#4F4F4F', + }, + }, + typography: { + fontFamily: STANDARD_FONT_FAMILY, + }, +}); + +const THEME = createTheme(BASE_THEME, { + palette: { + brand: { + navy: CUSTOM_COLORS.marketbaseNavy, + blue: CUSTOM_COLORS.marketbaseBlue, + red: CUSTOM_COLORS.marketbaseRed, + green: CUSTOM_COLORS.marketbaseGreen, + yellow: CUSTOM_COLORS.marketbaseYellow, + purple: CUSTOM_COLORS.marketbasePurple, + brown: CUSTOM_COLORS.marketbaseBrown, + }, + success: { + main: CUSTOM_COLORS.marketbaseGreen, + light: lighten(CUSTOM_COLORS.marketbaseGreen, 0.15), + dark: darken(CUSTOM_COLORS.marketbaseGreen, 0.15), + }, + error: { + main: CUSTOM_COLORS.marketbaseRed, + light: lighten(CUSTOM_COLORS.marketbaseRed, 0.15), + dark: darken(CUSTOM_COLORS.marketbaseRed, 0.15), + }, + cadet: { + 100: '#F9FAFB', + 200: '#F2F5F7', + 300: '#DCE4EA', + 400: '#A8BBCA', + 500: '#6A8BA4', + }, + highlight: { + 100: lighten(CUSTOM_COLORS.marketbaseYellow, 0.8), + 200: lighten(CUSTOM_COLORS.marketbaseYellow, 0.6), + 300: lighten(CUSTOM_COLORS.marketbaseYellow, 0.4), + 400: lighten(CUSTOM_COLORS.marketbaseYellow, 0.2), + 500: CUSTOM_COLORS.marketbaseYellow, + }, + info: { + main: CUSTOM_COLORS.marketbaseBlue, + }, + primary: { + main: CUSTOM_COLORS.marketbaseBlue, + }, + }, + components: { + MuiCssBaseline: { + styleOverrides: ` + address { + font-style: normal; + } + fieldset { + border: none; + padding: 0; + } + pre { + font-family: ${MONOSPACE_FONT_FAMILY} + white-space: pre-wrap; + font-size: 12px; + } + `, + }, + MuiAlert: { + styleOverrides: { + root: { + fontSize: BASE_THEME.typography.pxToRem(14), + }, + action: { + paddingTop: 0, + marginRight: 0, + }, + filledSuccess: { + backgroundColor: CUSTOM_COLORS.marketbaseGreen, + }, + }, + }, + MuiStepLabel: { + styleOverrides: { + label: { + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + }, + }, + MuiDialog: { + defaultProps: { + fullWidth: true, + }, + }, + MuiDialogContent: { + styleOverrides: { + root: { + paddingTop: BASE_THEME.spacing(1), + paddingBottom: BASE_THEME.spacing(2), + }, + }, + }, + MuiDialogTitle: { + defaultProps: { + variant: 'h4', + }, + styleOverrides: { + root: { + paddingTop: BASE_THEME.spacing(3), + paddingBottom: BASE_THEME.spacing(1), + }, + }, + }, + MuiDialogActions: { + styleOverrides: { + root: { + borderTop: '1px solid', + borderTopColor: BASE_THEME.palette.divider, + marginTop: BASE_THEME.spacing(2.5), + padding: `${BASE_THEME.spacing(1.5)} ${BASE_THEME.spacing(3)}`, + }, + }, + }, + MuiTableCell: { + styleOverrides: { + root: { + ...BASE_THEME.typography.body2, + borderColor: BASE_THEME.palette.grey[200], + }, + head: { + ...BASE_THEME.typography.overline, + fontWeight: BASE_THEME.typography.fontWeightMedium, + letterSpacing: '0.075em', + color: BASE_THEME.palette.text.secondary, + }, + }, + }, + MuiTableRow: { + styleOverrides: { + root: { + '&:last-child td': { + borderBottom: 0, + }, + }, + }, + }, + MuiAvatar: { + styleOverrides: { + root: { + textTransform: 'uppercase', + fontSize: BASE_THEME.typography.pxToRem(14), + }, + }, + }, + MuiChip: { + styleOverrides: { + root: { + '&.MuiChip-filledError, &.MuiChip-filledSuccess': { + fill: BASE_THEME.palette.primary.contrastText, + }, + }, + sizeSmall: { + borderRadius: BASE_THEME.spacing(0.5), + fontSize: 12, + }, + iconSmall: { + fontSize: 14, + marginLeft: BASE_THEME.spacing(1), + }, + colorSecondary: { + borderColor: BASE_THEME.palette.grey[400], + color: BASE_THEME.palette.text.secondary, + }, + label: { + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + }, + }, + MuiDataGrid: { + styleOverrides: { + root: { + fontSize: BASE_THEME.typography.pxToRem(14), + border: 'none', + '& .MuiDataGrid-cell:focus-within': { + outline: 'none !important', + }, + }, + iconSeparator: { + display: 'none', + }, + columnHeader: { + outline: 'none !important', + padding: BASE_THEME.spacing(0, 2), + color: BASE_THEME.palette.text.secondary, + ...BASE_THEME.typography.overline, + letterSpacing: '0.05em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + cell: { + padding: BASE_THEME.spacing(0, 2), + '& .MuiChip-root': { + cursor: 'pointer', + }, + }, + row: { + '&:hover': { + backgroundColor: '#F9FAFB', + }, + }, + withBorder: { + borderRight: 'none', + }, + toolbarContainer: { + padding: BASE_THEME.spacing(0, 1), + minHeight: BASE_THEME.spacing(5), + '& .MuiTablePagination-toolbar': { + paddingRight: 0, + minHeight: 0, + }, + '& .MuiTablePagination-displayedRows': { + margin: 0, + [BASE_THEME.breakpoints.only('xs')]: { + display: 'none', + }, + }, + }, + }, + }, + MuiDrawer: { + defaultProps: { + PaperProps: { + elevation: 2, + }, + }, + }, + MuiToolbar: { + defaultProps: { + variant: 'dense', + }, + }, + MuiAppBar: { + defaultProps: { + elevation: 2, + }, + styleOverrides: { + root: { + backgroundColor: BASE_THEME.palette.background.paper, + '& .MuiButton-root': { + height: 36, + }, + }, + colorPrimary: { + backgroundColor: CUSTOM_COLORS.marketbaseNavy, + transition: 'color 0.5s', + '& .MuiDivider-root': { + borderColor: alpha(BASE_THEME.palette.common.white, 0.12), + }, + '& button.MuiButton-textSecondary': { + color: alpha(BASE_THEME.palette.common.white, 0.5), + }, + '& button.MuiButton-textPrimary': { + color: BASE_THEME.palette.common.white, + }, + '& button.MuiButton-textPrimary:hover, & button.MuiButton-textSecondary:hover, & button.MuiButton-textInherit:hover, & button.MuiIconButton-root:hover': + { + color: BASE_THEME.palette.common.white, + backgroundColor: alpha(BASE_THEME.palette.common.white, 0.1), + }, + }, + }, + }, + MuiTooltip: { + styleOverrides: { + tooltip: { + fontSize: BASE_THEME.typography.pxToRem(12), + backgroundColor: alpha(BASE_THEME.palette.text.primary, 0.9), + }, + }, + }, + MuiSlider: { + styleOverrides: { + root: { + height: 1, + }, + track: { + height: 1, + border: 'none', + }, + rail: { + height: 1, + backgroundColor: BASE_THEME.palette.grey[500], + }, + mark: { + backgroundColor: BASE_THEME.palette.grey[500], + }, + markActive: { + height: 0, + }, + thumb: { + height: 16, + width: 16, + cursor: 'col-resize', + '&:hover, &.Mui-active, &.Mui-focusVisible': { + boxShadow: `0 0 0 4px ${alpha(CUSTOM_COLORS.marketbaseBlue, 0.2)}`, + }, + '&:before': { + display: 'none', + }, + }, + }, + }, + MuiPaper: { + defaultProps: { + elevation: 2, + square: true, + }, + }, + MuiList: { + defaultProps: { + dense: true, + }, + }, + MuiSwitch: { + styleOverrides: { + thumb: { + boxShadow: BASE_THEME.shadows[2], + }, + }, + }, + MuiListSubheader: { + styleOverrides: { + root: { + backgroundColor: 'transparent', + textTransform: 'uppercase', + letterSpacing: '0.08rem', + fontSize: BASE_THEME.typography.pxToRem(12), + lineHeight: '32px', + }, + }, + }, + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + focusRipple: true, + }, + styleOverrides: { + root: { + '&.MuiButton-containedSecondary.Mui-disabled': { + backgroundColor: BASE_THEME.palette.grey[100], + }, + }, + }, + }, + MuiMenuItem: { + styleOverrides: { + root: { + fontSize: BASE_THEME.typography.pxToRem(14), + }, + }, + }, + MuiListItemText: { + defaultProps: { + disableTypography: true, + }, + styleOverrides: { + root: { + fontSize: BASE_THEME.typography.pxToRem(14), + }, + }, + }, + MuiButtonGroup: { + defaultProps: { + disableElevation: true, + }, + }, + MuiIconButton: { + styleOverrides: { + edgeStart: { + marginLeft: BASE_THEME.spacing(-1), + }, + colorSecondary: { + color: BASE_THEME.palette.grey[500], + }, + }, + }, + MuiButton: { + defaultProps: { + disableElevation: true, + }, + styleOverrides: { + textPrimary: { + color: BASE_THEME.palette.text.primary, + }, + textSecondary: { + color: BASE_THEME.palette.text.secondary, + }, + outlinedPrimary: { + borderColor: BASE_THEME.palette.grey[300], + color: BASE_THEME.palette.text.primary, + '&:hover, &:active, &:focus': { + borderColor: BASE_THEME.palette.grey[500], + color: BASE_THEME.palette.text.primary, + }, + }, + containedSecondary: { + backgroundColor: BASE_THEME.palette.common.white, + border: `1px solid ${BASE_THEME.palette.grey[300]}`, + color: BASE_THEME.palette.text.primary, + '&:hover, &:active, &:focus': { + backgroundColor: BASE_THEME.palette.common.white, + borderColor: BASE_THEME.palette.grey[500], + color: BASE_THEME.palette.text.primary, + }, + }, + }, + }, + MuiToggleButton: { + styleOverrides: { + root: { + paddingLeft: BASE_THEME.spacing(1.5), + paddingRight: BASE_THEME.spacing(1.5), + }, + }, + }, + MuiLink: { + defaultProps: { + underline: 'none', + }, + }, + MuiFormLabel: { + styleOverrides: { + root: { + fontSize: BASE_THEME.typography.pxToRem(14), + }, + }, + }, + MuiFormHelperText: { + styleOverrides: { + root: { + '&.Mui-disabled': { + color: BASE_THEME.palette.text.secondary, + }, + }, + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + '&:not(.Mui-disabled, .Mui-error):before': { + borderBottom: `1px solid ${BASE_THEME.palette.grey[400]}`, + }, + '&:hover:not(.Mui-disabled, .Mui-error):before': { + borderBottom: `1px solid ${BASE_THEME.palette.grey[500]} !important`, + }, + '&:after': { + borderBottom: `1px solid ${BASE_THEME.palette.text.primary} !important`, + }, + '&.MuiOutlinedInput-root:not(.Mui-error)': { + '& fieldset': { + borderColor: BASE_THEME.palette.grey[300], + transition: 'border-color 0.2s', + }, + }, + '&.MuiOutlinedInput-root:not(.Mui-disabled, .Mui-error)': { + '&:hover fieldset': { + borderColor: BASE_THEME.palette.grey[400], + }, + '&.Mui-focused fieldset': { + borderColor: BASE_THEME.palette.text.secondary, + borderWidth: 1, + }, + }, + }, + input: { + fontSize: BASE_THEME.typography.pxToRem(14), + '&.Mui-disabled': { + WebkitTextFillColor: 'inherit', + color: BASE_THEME.palette.text.secondary, + }, + }, + inputSizeSmall: {}, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + notchedOutline: { + '& legend': { + fontSize: '0.85em', + maxWidth: '100%', + }, + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: { + '& .MuiTypography-root': { + fontSize: BASE_THEME.typography.pxToRem(14), + color: BASE_THEME.palette.text.secondary, + }, + }, + }, + }, + MuiInputLabel: { + defaultProps: { + shrink: true, + }, + styleOverrides: { + shrink: { + transform: 'scale(0.85)', + fontWeight: BASE_THEME.typography.fontWeightMedium, + '&.Mui-focused': { + color: BASE_THEME.palette.text.primary, + }, + '&.MuiInputLabel-standard': { + transform: 'translate(0, -4px) scale(0.85)', + color: '#4F4F4F', + }, + '&.MuiInputLabel-outlined': { + transform: 'translate(15px, -8px) scale(0.85)', + }, + }, + }, + }, + MuiTimelineConnector: { + styleOverrides: { + root: { + width: 1, + }, + }, + }, + MuiTimelineDot: { + styleOverrides: { + root: { + borderWidth: 1, + }, + }, + }, + MuiTimelineContent: { + styleOverrides: { + root: { + paddingTop: 0, + paddingBottom: 0, + }, + }, + }, + MuiTabs: { + defaultProps: { + variant: 'scrollable', + }, + styleOverrides: { + indicator: { + height: 1, + backgroundColor: BASE_THEME.palette.text.primary, + }, + }, + }, + MuiTab: { + styleOverrides: { + root: { + textTransform: 'none', + minWidth: BASE_THEME.spacing(2), + paddingLeft: BASE_THEME.spacing(1.5), + paddingRight: BASE_THEME.spacing(1.5), + fontSize: BASE_THEME.typography.pxToRem(14), + fontFamily: BASE_THEME.typography.fontFamily, + lineHeight: 1.5, + fontWeight: BASE_THEME.typography.fontWeightMedium, + transition: 'color 0.2s', + '&.Mui-selected': { + color: BASE_THEME.palette.text.primary, + }, + '&:hover': { + color: BASE_THEME.palette.text.primary, + }, + }, + }, + }, + MuiCard: { + styleOverrides: { + root: { + borderRadius: 0, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + title: { + fontSize: BASE_THEME.typography.pxToRem(18), + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + }, + }, + MuiCircularProgress: { + defaultProps: { + disableShrink: true, + }, + styleOverrides: { + root: { + animationDuration: '700ms', + }, + }, + }, + MuiTypography: { + styleOverrides: { + gutterBottom: { + marginBottom: BASE_THEME.spacing(1), + }, + }, + }, + }, + typography: { + fontFamily: BASE_THEME.typography.fontFamily, + h1: { + fontFamily: BASE_THEME.typography.fontFamily, + fontSize: BASE_THEME.typography.pxToRem(40), + lineHeight: 1.2, + letterSpacing: '-0.02em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + h2: { + fontFamily: BASE_THEME.typography.fontFamily, + fontSize: BASE_THEME.typography.pxToRem(32), + lineHeight: 1.2, + letterSpacing: '-0.02em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + h3: { + fontFamily: BASE_THEME.typography.fontFamily, + fontSize: BASE_THEME.typography.pxToRem(24), + lineHeight: 1.5, + letterSpacing: '-0.01em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + h4: { + fontFamily: BASE_THEME.typography.fontFamily, + fontSize: BASE_THEME.typography.pxToRem(20), + lineHeight: 1.5, + letterSpacing: '-0.01em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + h5: { + fontFamily: BASE_THEME.typography.fontFamily, + fontSize: BASE_THEME.typography.pxToRem(18), + lineHeight: 1.5, + letterSpacing: '-0.01em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + h6: { + fontFamily: BASE_THEME.typography.fontFamily, + fontSize: BASE_THEME.typography.pxToRem(16), + lineHeight: 1.5, + letterSpacing: '-0.005em', + fontWeight: BASE_THEME.typography.fontWeightMedium, + }, + body1: { + fontSize: BASE_THEME.typography.pxToRem(14), + }, + body2: { + fontSize: BASE_THEME.typography.pxToRem(12), + }, + overline: { + fontWeight: BASE_THEME.typography.fontWeightMedium, + letterSpacing: '0.05em', + }, + button: { + textTransform: 'none', + fontWeight: BASE_THEME.typography.fontWeightMedium, + lineHeight: 1.5, + }, + caption: { + letterSpacing: 0, + lineHeight: 1.5, + }, + }, + shadows: [ + 'none', + '0px 4px 15px rgba(33, 36, 67, 0.04), 0px 0px 2px rgba(33, 36, 67, 0.04), 0px 0px 1px rgba(33, 36, 67, 0.04)', + '0px 10px 20px rgba(33, 36, 67, 0.04), 0px 2px 6px rgba(33, 36, 67, 0.04), 0px 0px 1px rgba(33, 36, 67, 0.04)', + '0px 16px 24px rgba(33, 36, 67, 0.05), 0px 2px 6px rgba(33, 36, 67, 0.05), 0px 0px 1px rgba(33, 36, 67, 0.05)', + '0px 24px 32px rgba(33, 36, 67, 0.06), 0px 16px 24px rgba(33, 36, 67, 0.06), 0px 4px 8px rgba(33, 36, 67, 0.06), 0px 0px 1px rgba(33, 36, 67, 0.06)', + '0px 3px 5px -1px rgba(58, 53, 65, 0.2), 0px 5px 8px 0px rgba(58, 53, 65, 0.14), 0px 1px 14px 0px rgba(58, 53, 65, 0.12)', + '0px 2px 10px 0px rgba(58, 53, 65, 0.1)', + '0px 4px 5px -2px rgba(58, 53, 65, 0.2), 0px 7px 10px 1px rgba(58, 53, 65, 0.14), 0px 2px 16px 1px rgba(58, 53, 65, 0.12)', + '0px 5px 5px -3px rgba(58, 53, 65, 0.2), 0px 8px 10px 1px rgba(58, 53, 65, 0.14), 0px 3px 14px 2px rgba(58, 53, 65, 0.12)', + '0px 5px 6px -3px rgba(58, 53, 65, 0.2), 0px 9px 12px 1px rgba(58, 53, 65, 0.14), 0px 3px 16px 2px rgba(58, 53, 65, 0.12)', + '0px 6px 6px -3px rgba(58, 53, 65, 0.2), 0px 10px 14px 1px rgba(58, 53, 65, 0.14), 0px 4px 18px 3px rgba(58, 53, 65, 0.12)', + '0px 6px 7px -4px rgba(58, 53, 65, 0.2), 0px 11px 15px 1px rgba(58, 53, 65, 0.14), 0px 4px 20px 3px rgba(58, 53, 65, 0.12)', + '0px 7px 8px -4px rgba(58, 53, 65, 0.2), 0px 12px 17px 2px rgba(58, 53, 65, 0.14), 0px 5px 22px 4px rgba(58, 53, 65, 0.12)', + '0px 7px 8px -4px rgba(58, 53, 65, 0.2), 0px 13px 19px 2px rgba(58, 53, 65, 0.14), 0px 5px 24px 4px rgba(58, 53, 65, 0.12)', + '0px 7px 9px -4px rgba(58, 53, 65, 0.2), 0px 14px 21px 2px rgba(58, 53, 65, 0.14), 0px 5px 26px 4px rgba(58, 53, 65, 0.12)', + '0px 8px 9px -5px rgba(58, 53, 65, 0.2), 0px 15px 22px 2px rgba(58, 53, 65, 0.14), 0px 6px 28px 5px rgba(58, 53, 65, 0.12)', + '0px 8px 10px -5px rgba(58, 53, 65, 0.2), 0px 16px 24px 2px rgba(58, 53, 65, 0.14), 0px 6px 30px 5px rgba(58, 53, 65, 0.12)', + '0px 8px 11px -5px rgba(58, 53, 65, 0.2), 0px 17px 26px 2px rgba(58, 53, 65, 0.14), 0px 6px 32px 5px rgba(58, 53, 65, 0.12)', + '0px 9px 11px -5px rgba(58, 53, 65, 0.2), 0px 18px 28px 2px rgba(58, 53, 65, 0.14), 0px 7px 34px 6px rgba(58, 53, 65, 0.12)', + '0px 9px 12px -6px rgba(58, 53, 65, 0.2), 0px 19px 29px 2px rgba(58, 53, 65, 0.14), 0px 7px 36px 6px rgba(58, 53, 65, 0.12)', + '0px 10px 13px -6px rgba(58, 53, 65, 0.2), 0px 20px 31px 3px rgba(58, 53, 65, 0.14), 0px 8px 38px 7px rgba(58, 53, 65, 0.12)', + '0px 10px 13px -6px rgba(58, 53, 65, 0.2), 0px 21px 33px 3px rgba(58, 53, 65, 0.14), 0px 8px 40px 7px rgba(58, 53, 65, 0.12)', + '0px 10px 14px -6px rgba(58, 53, 65, 0.2), 0px 22px 35px 3px rgba(58, 53, 65, 0.14), 0px 8px 42px 7px rgba(58, 53, 65, 0.12)', + '0px 11px 14px -7px rgba(58, 53, 65, 0.2), 0px 23px 36px 3px rgba(58, 53, 65, 0.14), 0px 9px 44px 8px rgba(58, 53, 65, 0.12)', + '0px 11px 15px -7px rgba(58, 53, 65, 0.2), 0px 24px 38px 3px rgba(58, 53, 65, 0.14), 0px 9px 46px 8px rgba(58, 53, 65, 0.12)', + ], +}); + +export default THEME; diff --git a/packages/editor-sample/src/vite-env.d.ts b/packages/editor-sample/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/packages/editor-sample/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/editor-sample/tsconfig.json b/packages/editor-sample/tsconfig.json new file mode 100644 index 0000000..efac89d --- /dev/null +++ b/packages/editor-sample/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "target": "es2015", + "module": "esnext", + "outDir": "dist" + }, + "exclude": ["dist"] +} diff --git a/packages/editor-sample/vite.config.ts b/packages/editor-sample/vite.config.ts new file mode 100644 index 0000000..ca976ea --- /dev/null +++ b/packages/editor-sample/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite'; + +import react from '@vitejs/plugin-react-swc'; + +export default defineConfig({ + plugins: [react()], + base: '/editor-sample/', +}); diff --git a/tsconfig.json b/tsconfig.json index f2ad8c5..888fe2b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,11 +8,14 @@ "strict": true, "sourceMap": true, "esModuleInterop": true, + + "skipLibCheck": true, "declarationMap": true, "declaration": true, "noUnusedLocals": true, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true }, - "exclude": ["node_modules", "dist"] + "exclude": ["dist"] }