diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..6f3a2913 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5501 +} \ No newline at end of file diff --git a/3D-Portfolio/.gitignore b/3D-Portfolio/.gitignore new file mode 100644 index 00000000..54f07af5 --- /dev/null +++ b/3D-Portfolio/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/3D-Portfolio/README.md b/3D-Portfolio/README.md new file mode 100644 index 00000000..f768e33f --- /dev/null +++ b/3D-Portfolio/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/3D-Portfolio/index.html b/3D-Portfolio/index.html new file mode 100644 index 00000000..23036947 --- /dev/null +++ b/3D-Portfolio/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + Web Dev Freelancer + + +
+ + + \ No newline at end of file diff --git a/3D-Portfolio/package-lock.json b/3D-Portfolio/package-lock.json new file mode 100644 index 00000000..526aee2c --- /dev/null +++ b/3D-Portfolio/package-lock.json @@ -0,0 +1,7879 @@ +{ + "name": "my-portfolio", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "my-portfolio", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "@babel/preset-env": "^7.22.15", + "@babel/preset-react": "^7.22.15", + "@emailjs/browser": "^3.10.0", + "@react-three/drei": "^9.57.0", + "@react-three/fiber": "^8.11.7", + "babel-loader": "^9.1.3", + "framer-motion": "^10.0.2", + "gltfpack": "^0.18.0", + "maath": "^0.5.2", + "minimatch": "^9.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-intersection-observer": "^9.5.2", + "react-js-loader": "^0.1.2", + "react-loader": "^2.4.7", + "react-router-dom": "^6.8.2", + "react-tilt": "^0.1.4", + "react-vertical-timeline-component": "^3.6.0", + "three": "^0.150.1" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "autoprefixer": "^10.4.13", + "css-loader": "^6.8.1", + "file-loader": "^6.2.0", + "mini-css-extract-plugin": "^2.7.6", + "path": "^0.12.7", + "postcss": "^8.4.21", + "style-loader": "^3.3.3", + "tailwindcss": "^3.2.7", + "url-loader": "^4.1.1", + "vite": "^4.1.0", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.15", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", + "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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-module-transforms": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", + "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", + "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", + "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", + "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", + "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.15.tgz", + "integrity": "sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.15", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", + "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emailjs/browser": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@emailjs/browser/-/browser-3.11.0.tgz", + "integrity": "sha512-RkY3FKZ3fPdK++OeF46mRTFpmmQWCHUVHZH209P3NE4D5sg2Atg7S2wa3gw5062Gl4clt4Wn5SyC4WhlVZC5pA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.2.tgz", + "integrity": "sha512-d8Q9uRK89ZRWmED2JLI9/blpJcfdbh0iEUuMo8TgkMzNfQBY1/GC0FEJWrairTwHkxIf6Oud1vFBP+aHicWqJA==" + }, + "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/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, + "node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, + "node_modules/@react-three/drei": { + "version": "9.82.0", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.82.0.tgz", + "integrity": "sha512-3CUCfuyXgug47UyM9wv9Zug6Ly4RzvGcM9//w2sFXHQXrR/oxlAD+uD8Pvqt/jsszPUtj4pfLJCucC+FtyigIw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.2", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "lodash.clamp": "^4.0.3", + "lodash.omit": "^4.5.0", + "lodash.pick": "^4.4.0", + "maath": "^0.6.0", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "react-merge-refs": "^1.1.0", + "stats-gl": "^1.0.4", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.6.0", + "three-stdlib": "^2.25.1", + "troika-three-text": "^0.47.2", + "utility-types": "^3.10.0", + "zustand": "^3.5.13" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/maath": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.6.0.tgz", + "integrity": "sha512-dSb2xQuP7vDnaYqfoKzlApeRcR2xtN8/f7WV/TMAkBC8552TwTLtOO0JTcSygkYMjNDPoo6V01jTw/aPi4JrMw==", + "peerDependencies": { + "@types/three": ">=0.144.0", + "three": ">=0.144.0" + } + }, + "node_modules/@react-three/fiber": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.14.1.tgz", + "integrity": "sha512-Ky/FiCyJiyaI8bd+vckzgkHgKDSQDOcSSUVFOHCuCO9XOLb7Ebs6lof2hPpFa1HkaeE5ZIbTWIprvN0QqdPF0w==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "base64-js": "^1.5.1", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "18.6.4", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz", + "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==", + "peer": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/draco3d": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.2.tgz", + "integrity": "sha512-goh23EGr6CLV6aKPwN1p8kBD/7tT5V/bLpToSbarKrwVejqNrspVrv8DhliteYkkhZYrlq/fwKZRRUzH4XN88w==" + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.1", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", + "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", + "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==", + "peer": true + }, + "node_modules/@types/three": { + "version": "0.155.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.155.1.tgz", + "integrity": "sha512-uNUwnz/wWRxahjIqTtDYQ1qdE1R1py21obxfuILkT+kKrjocMwRLQQA1l8nMxfQU7VXb7CXu04ucMo8OqZt4ZA==", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~18.6.4", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.6.9", + "lil-gui": "~0.17.0", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.4.tgz", + "integrity": "sha512-41gfGLTtqXZhcmoDlLDHqMJDuwAMwhHwXf9Q2job3TUBsvkNfPNI/3IWVEtLH4tyY1ElWtfwIaoNeqeEX238/Q==" + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@use-gesture/core": { + "version": "10.2.27", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz", + "integrity": "sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA==" + }, + "node_modules/@use-gesture/react": { + "version": "10.2.27", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.27.tgz", + "integrity": "sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w==", + "dependencies": { + "@use-gesture/core": "10.2.27" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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==", + "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/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/camera-controls": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.7.2.tgz", + "integrity": "sha512-6+gaZFK3LYbWaXC94EN0BYLlvpo9xfUqwp59vsU3nV7WXIU05q4wyP5TOgyG1tqTHReuBofb20vKfZNBNjMtzw==", + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001527", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", + "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/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/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "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/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", + "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "dependencies": { + "browserslist": "^4.21.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "dependencies": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "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/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/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/css-loader/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/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/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-gpu": { + "version": "5.0.37", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.37.tgz", + "integrity": "sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw==", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/draco3d": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.6.tgz", + "integrity": "sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.508", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", + "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "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/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/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==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/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/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/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/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", + "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "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-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "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": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, + "node_modules/gltfpack": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/gltfpack/-/gltfpack-0.18.0.tgz", + "integrity": "sha512-EgMFTbd+N1uhOqn0XN+97aQHVOTM7gdoZRx8EB4LssT2OXxkN92pVQ+6FxRcELIySkOH+AO60qDHTZgD3HI1CQ==", + "bin": { + "gltfpack": "cli.js" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/its-fine": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.1.1.tgz", + "integrity": "sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.4", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.4.tgz", + "integrity": "sha512-Xd55E2aLI9Q/ikDQEmfRzIwYJs4oO0h9ZHA3FZDakzt1WR6JMZcpqtCZlF97I72KVjoY4rHXU5TfvkRDOyr/rg==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ktx-parse": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.4.5.tgz", + "integrity": "sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg==" + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/lil-gui": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz", + "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==", + "peer": true + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.clamp": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash.clamp/-/lodash.clamp-4.0.3.tgz", + "integrity": "sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "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": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maath": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.5.3.tgz", + "integrity": "sha512-ut63A4zTd9abtpi+sOHW1fPWPtAFrjK0E17eAthx1k93W/T2cWLKV5oaswyotJVDvvW1EXSdokAqhK5KOu0Qdw==", + "peerDependencies": { + "@types/three": ">=0.144.0", + "three": ">=0.144.0" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "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/meshline": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.1.6.tgz", + "integrity": "sha512-8JZJOdaL5oz3PI/upG8JvP/5FfzYUOhrkJ8np/WKvXzl0/PZ2V9pqTvCIjSKv+w9ccg2xb+yyBhXAwt6ier3ug==", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "peer": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mmd-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mmd-parser/-/mmd-parser-1.0.4.tgz", + "integrity": "sha512-Qi0VCU46t2IwfGv5KF0+D/t9cizcDug7qnNoy9Ggk7aucp0tssV8IwTMkBlDbm+VqAf3cdQHTCARKSsuS2MYFg==" + }, + "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==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opentype.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz", + "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==", + "dependencies": { + "string.prototype.codepointat": "^0.2.1", + "tiny-inflate": "^1.0.3" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dev": true, + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "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-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "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/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "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/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.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-dom/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/react-intersection-observer": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.2.tgz", + "integrity": "sha512-EmoV66/yvksJcGa1rdW0nDNc4I1RifDWkT50gXSFnPLYQ4xUptuDD4V7k+Rj1OgVAlww628KLGcxPXFlOkkU/Q==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "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/react-js-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/react-js-loader/-/react-js-loader-0.1.2.tgz", + "integrity": "sha512-n5zAG/Br/VhoTvSiSVig0XcSmB/NxOYAAeH3DPKGSo5pAcJuxXnB4cmS1yeq5GuW/zUBpFcfBglyfxQqY2Kxbw==" + }, + "node_modules/react-loader": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/react-loader/-/react-loader-2.4.7.tgz", + "integrity": "sha512-pNW5xoSt0Q7HdmQh/EaIeeFbG0Ii74y6Le8gPdDyWyEFNgCiY1NcreQxMioQGjQ4Jo4EenQGKN/qMbxW+dpZkQ==", + "dependencies": { + "create-react-class": "^15.5.2", + "prop-types": "^15.5.8", + "spin.js": "2.x" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0", + "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/react-merge-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz", + "integrity": "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "dependencies": { + "@remix-run/router": "1.8.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "dependencies": { + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-tilt": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/react-tilt/-/react-tilt-0.1.4.tgz", + "integrity": "sha512-bVeRumg+RIn6QN8S92UmubGqX/BG6/QeQISBeAcrS/70dpo/jVj+sjikIawDl5wTuPdubFH8zH0EMulWIctsnw==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0-beta || ^16.0.0", + "react-dom": "^15.0.0 || ^16.0.0-beta || ^16.0.0" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", + "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", + "dependencies": { + "debounce": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + } + }, + "node_modules/react-vertical-timeline-component": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/react-vertical-timeline-component/-/react-vertical-timeline-component-3.6.0.tgz", + "integrity": "sha512-l9zulqjIGlRuaQeplGzV4r/tG2RYBpYt84Il8w4IxnJze2cDIGI04MKo3F7f1sHT0Sih1ohEFts8UV23AJS15Q==", + "hasInstallScript": true, + "dependencies": { + "classnames": "^2.2.6", + "prop-types": "^15.7.2", + "react-intersection-observer": "^8.26.2" + } + }, + "node_modules/react-vertical-timeline-component/node_modules/react-intersection-observer": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz", + "integrity": "sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "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": "3.29.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.0.tgz", + "integrity": "sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "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/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spin.js": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/spin.js/-/spin.js-2.3.2.tgz", + "integrity": "sha512-ryhCvKCRa6J5Fxa7Y+fnhE2a+e05JwfW5dxO82zPd0uDM9o+qp8p74BJUurjiqCqmDsWNvGOAxfqdD317XIedg==" + }, + "node_modules/stats-gl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-1.0.5.tgz", + "integrity": "sha512-XimMxvwnf1Qf5KwebhcoA34kcX+fWEkIl0QjNkCbu4IpoyDMMsOajExn7FIq5w569k45+LhmsuRlGSrsvmGdNw==" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/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==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/three": { + "version": "0.150.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.150.1.tgz", + "integrity": "sha512-5C1MqKUWaHYo13BX0Q64qcdwImgnnjSOFgBscOzAo8MYCzEtqfQqorEKMcajnA3FHy1yVlIe9AmaMQ0OQracNA==" + }, + "node_modules/three-mesh-bvh": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.6.6.tgz", + "integrity": "sha512-EQykIpm7gDZQVhkoiOb/vfXPlfuagVRYmviNulbMsjFwXISJGmXrj1ktPncnGBFqWO3g2fX7GRwc9wLhLyX3MQ==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.25.1.tgz", + "integrity": "sha512-cFlxaTJjlSM10NGoUVEoQkMRpSOftuAh3OCpSKiLTsUfA7/HuhpoBJy3StiOor/LZm5M+onegqsbr5UBCCYYjQ==", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "ktx-parse": "^0.4.5", + "mmd-parser": "^1.0.4", + "opentype.js": "^1.3.3", + "potpack": "^1.0.1", + "zstddec": "^0.0.2" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, + "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/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/troika-three-text": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.47.2.tgz", + "integrity": "sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.47.2", + "troika-worker-utils": "^0.47.2", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.47.2.tgz", + "integrity": "sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.47.2", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz", + "integrity": "sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/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/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/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/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/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==" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "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/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zstddec": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.0.2.tgz", + "integrity": "sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA==" + }, + "node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + } + } +} diff --git a/3D-Portfolio/package.json b/3D-Portfolio/package.json new file mode 100644 index 00000000..8626e346 --- /dev/null +++ b/3D-Portfolio/package.json @@ -0,0 +1,51 @@ +{ + "name": "my-portfolio", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "preview": "vite preview", + "build": "vite build" + }, + "dependencies": { + "@babel/preset-env": "^7.22.15", + "@babel/preset-react": "^7.22.15", + "@emailjs/browser": "^3.10.0", + "@react-three/drei": "^9.57.0", + "@react-three/fiber": "^8.11.7", + "babel-loader": "^9.1.3", + "framer-motion": "^10.0.2", + "gltfpack": "^0.18.0", + "maath": "^0.5.2", + "minimatch": "^9.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-intersection-observer": "^9.5.2", + "react-js-loader": "^0.1.2", + "react-loader": "^2.4.7", + "react-router-dom": "^6.8.2", + "react-tilt": "^0.1.4", + "react-vertical-timeline-component": "^3.6.0", + "three": "^0.150.1" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "autoprefixer": "^10.4.13", + "css-loader": "^6.8.1", + "file-loader": "^6.2.0", + "mini-css-extract-plugin": "^2.7.6", + "path": "^0.12.7", + "postcss": "^8.4.21", + "style-loader": "^3.3.3", + "tailwindcss": "^3.2.7", + "url-loader": "^4.1.1", + "vite": "^4.1.0" + }, + "description": "This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.", + "main": "vite.config.js", + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/3D-Portfolio/postcss.config.cjs b/3D-Portfolio/postcss.config.cjs new file mode 100644 index 00000000..ca0c0cda --- /dev/null +++ b/3D-Portfolio/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/3D-Portfolio/public/desktop_pc/license.txt b/3D-Portfolio/public/desktop_pc/license.txt new file mode 100644 index 00000000..adcd5373 --- /dev/null +++ b/3D-Portfolio/public/desktop_pc/license.txt @@ -0,0 +1,11 @@ +Model Information: +* title: VortexSeries Mechanical Keyboard GT-8 / NJ80 +* source: https://sketchfab.com/3d-models/vortexseries-mechanical-keyboard-gt-8-nj80-02d16e9dae72419aa24ec6788318f92b +* author: Rendy K (https://sketchfab.com/RendyK) + +Model License: +* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) +* requirements: Author must be credited. Commercial use is allowed. + +If you use this 3D model in your project be sure to copy paste this credit wherever you share it: +This work is based on "VortexSeries Mechanical Keyboard GT-8 / NJ80" (https://sketchfab.com/3d-models/vortexseries-mechanical-keyboard-gt-8-nj80-02d16e9dae72419aa24ec6788318f92b) by Rendy K (https://sketchfab.com/RendyK) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) \ No newline at end of file diff --git a/3D-Portfolio/public/desktop_pc/scene.bin b/3D-Portfolio/public/desktop_pc/scene.bin new file mode 100644 index 00000000..e78c5525 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/scene.bin differ diff --git a/3D-Portfolio/public/desktop_pc/scene.gltf b/3D-Portfolio/public/desktop_pc/scene.gltf new file mode 100644 index 00000000..9dc00682 --- /dev/null +++ b/3D-Portfolio/public/desktop_pc/scene.gltf @@ -0,0 +1,2605 @@ +{ + "accessors": [ + { + "bufferView": 2, + "componentType": 5126, + "count": 578, + "max": [ + 3.314732789993286, + 0.25409090518951416, + 0.5700109601020813 + ], + "min": [ + -3.3147354125976563, + -0.24113129079341888, + -0.46082383394241333 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 6936, + "componentType": 5126, + "count": 578, + "max": [ + 0.9572898745536804, + 0.9993235468864441, + 0.9936415553092957 + ], + "min": [ + -0.9572945833206177, + -1.0, + -0.9947202205657959 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 578, + "max": [ + 1.0, + 0.5697305798530579 + ], + "min": [ + -5.960464477539063e-08, + 0.41423773765563965 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "componentType": 5125, + "count": 2508, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 13872, + "componentType": 5126, + "count": 9669, + "max": [ + 6.8289594650268555, + 0.42617106437683105, + -3.7568466663360596 + ], + "min": [ + -6.31794548034668, + -0.12221003323793411, + -4.838677883148193 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 129900, + "componentType": 5126, + "count": 9669, + "max": [ + 0.9510154128074646, + 0.999893844127655, + 0.9809688925743103 + ], + "min": [ + -0.9510157704353333, + -1.0, + -0.9999641180038452 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 4624, + "componentType": 5126, + "count": 9669, + "max": [ + 0.9706205129623413, + 0.9745751023292542 + ], + "min": [ + 0.07246680557727814, + 0.1072811484336853 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 10032, + "componentType": 5125, + "count": 29916, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 245928, + "componentType": 5126, + "count": 800, + "max": [ + 8.904779434204102, + 0.42617103457450867, + -3.7568466663360596 + ], + "min": [ + 6.850550174713135, + -0.12220999598503113, + -4.838677883148193 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 255528, + "componentType": 5126, + "count": 800, + "max": [ + 0.9510175585746765, + 0.999893844127655, + 0.9809685945510864 + ], + "min": [ + -0.9510145783424377, + -1.0, + -0.9999640583992004 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 81976, + "componentType": 5126, + "count": 800, + "max": [ + 0.7173054218292236, + 0.43136370182037354 + ], + "min": [ + -0.0349278599023819, + 0.10617437958717346 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 129696, + "componentType": 5125, + "count": 2493, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 265128, + "componentType": 5126, + "count": 28631, + "max": [ + 7.446814060211182, + 0.409955233335495, + -1.0327636003494263 + ], + "min": [ + -7.139498710632324, + 0.19776508212089539, + -4.470358848571777 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 608700, + "componentType": 5126, + "count": 28631, + "max": [ + 0.1077999621629715, + 0.9999869465827942, + 0.14011509716510773 + ], + "min": [ + -0.10786908119916916, + -0.9999871253967285, + -0.13439802825450897 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 88376, + "componentType": 5126, + "count": 28631, + "max": [ + 0.0, + 0.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 139668, + "componentType": 5125, + "count": 44421, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 952272, + "componentType": 5126, + "count": 20406, + "max": [ + 5.232174873352051, + 0.34938088059425354, + -1.59352707862854 + ], + "min": [ + -5.746069431304932, + -0.16563007235527039, + -3.725332736968994 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1197144, + "componentType": 5126, + "count": 20406, + "max": [ + 0.9510156512260437, + 0.9999852776527405, + 0.9943988919258118 + ], + "min": [ + -0.9510163068771362, + -1.0, + -0.9999639391899109 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 317424, + "componentType": 5126, + "count": 20406, + "max": [ + 0.9749108552932739, + 0.9798508286476135 + ], + "min": [ + 0.061869680881500244, + 0.09000403434038162 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 317352, + "componentType": 5125, + "count": 39888, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1442016, + "componentType": 5126, + "count": 5590, + "max": [ + 8.912280082702637, + 0.2763323187828064, + -0.5244002342224121 + ], + "min": [ + 2.7947134971618652, + -0.17631053924560547, + -3.725332736968994 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1509096, + "componentType": 5126, + "count": 5590, + "max": [ + 0.9510162472724915, + 0.999821126461029, + 0.9972322583198547 + ], + "min": [ + -0.9510161876678467, + -1.0, + -0.9999640583992004 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 480672, + "componentType": 5126, + "count": 5590, + "max": [ + 0.7743707299232483, + 0.995391309261322 + ], + "min": [ + 0.1483011543750763, + 0.1072826012969017 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 476904, + "componentType": 5125, + "count": 9972, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1576176, + "componentType": 5126, + "count": 7929, + "max": [ + -3.361710786819458, + 0.42617106437683105, + 0.5688083171844482 + ], + "min": [ + -7.413741111755371, + -0.1906489133834839, + -4.838678359985352 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1671324, + "componentType": 5126, + "count": 7929, + "max": [ + 0.951015830039978, + 0.9999848008155823, + 0.9972319006919861 + ], + "min": [ + -0.9510183930397034, + -1.0, + -0.9999640583992004 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 525392, + "componentType": 5126, + "count": 7929, + "max": [ + 0.7521225810050964, + 1.0192813873291016 + ], + "min": [ + -0.04996110126376152, + 0.017851516604423523 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 516792, + "componentType": 5125, + "count": 14958, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 1766472, + "componentType": 5126, + "count": 19044, + "max": [ + 6.566323280334473, + 0.2591899335384369, + -1.0327637195587158 + ], + "min": [ + -7.086985111236572, + 0.19962885975837708, + -3.4860048294067383 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 1995000, + "componentType": 5126, + "count": 19044, + "max": [ + 1.0, + 0.9998636841773987, + 0.9284766912460327 + ], + "min": [ + -1.0, + -0.9998638033866882, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 588824, + "componentType": 5126, + "count": 19044, + "max": [ + 0.0, + 0.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 576624, + "componentType": 5125, + "count": 28782, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2223528, + "componentType": 5126, + "count": 18923, + "max": [ + 7.424006462097168, + 0.34938085079193115, + -0.5244013071060181 + ], + "min": [ + -4.955251693725586, + -0.17631061375141144, + -3.7253329753875732 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2450604, + "componentType": 5126, + "count": 18923, + "max": [ + 0.9510156512260437, + 0.9999852180480957, + 0.9972317814826965 + ], + "min": [ + -0.951018750667572, + -1.0, + -0.9999640583992004 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 741176, + "componentType": 5126, + "count": 18923, + "max": [ + 0.9764209985733032, + 0.9983566999435425 + ], + "min": [ + 0.07174521684646606, + 0.0016232728958129883 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 691752, + "componentType": 5125, + "count": 34902, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2677680, + "componentType": 5126, + "count": 6389, + "max": [ + 8.916518211364746, + 0.34938091039657593, + 0.5717475414276123 + ], + "min": [ + 3.3505029678344727, + -0.19064897298812866, + -2.624361991882324 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2754348, + "componentType": 5126, + "count": 6389, + "max": [ + 0.9510158896446228, + 0.9999848008155823, + 0.9972317218780518 + ], + "min": [ + -0.9510158896446228, + -1.0, + -0.9999639391899109 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 892560, + "componentType": 5126, + "count": 6389, + "max": [ + 0.7420401573181152, + 0.5960012078285217 + ], + "min": [ + 0.02666482888162136, + 0.014918252825737 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 831360, + "componentType": 5125, + "count": 9972, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2831016, + "componentType": 5126, + "count": 3977, + "max": [ + 10.303564071655273, + 0.4339733421802521, + -1.1869676113128662 + ], + "min": [ + 9.217704772949219, + -0.13832244277000427, + -4.838961601257324 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 2878740, + "componentType": 5126, + "count": 3977, + "max": [ + 0.9510170817375183, + 0.9999852776527405, + 0.9943985939025879 + ], + "min": [ + -0.9510152339935303, + -1.0, + -0.9999924302101135 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 943672, + "componentType": 5126, + "count": 3977, + "max": [ + 0.8857619762420654, + 0.715499222278595 + ], + "min": [ + 0.13578949868679047, + -0.08148699998855591 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 871248, + "componentType": 5125, + "count": 7479, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 2926464, + "componentType": 5126, + "count": 6282, + "max": [ + 10.033008575439453, + 0.2752056121826172, + 0.5717482566833496 + ], + "min": [ + 6.682326316833496, + -0.19064900279045105, + -1.5450948476791382 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3001848, + "componentType": 5126, + "count": 6282, + "max": [ + 0.9510186910629272, + 0.9993188381195068, + 0.9972319006919861 + ], + "min": [ + -0.9510171413421631, + -1.0, + -0.9999639391899109 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 975488, + "componentType": 5126, + "count": 6282, + "max": [ + 1.0037016868591309, + 1.0402591228485107 + ], + "min": [ + 0.13831420242786407, + 0.08128711581230164 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 901164, + "componentType": 5125, + "count": 9972, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3077232, + "componentType": 5126, + "count": 757, + "max": [ + -6.330199241638184, + 0.5331908464431763, + -5.24614953994751 + ], + "min": [ + -7.412030220031738, + -0.029263684526085854, + -6.327867031097412 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3086316, + "componentType": 5126, + "count": 757, + "max": [ + 0.9510153532028198, + 0.9999303221702576, + 0.9780441522598267 + ], + "min": [ + -0.9510140419006348, + -0.9998946189880371, + -0.9997348189353943 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1025744, + "componentType": 5126, + "count": 757, + "max": [ + 0.30926603078842163, + 0.9961056709289551 + ], + "min": [ + 0.05424198508262634, + 0.0520254522562027 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 941052, + "componentType": 5125, + "count": 2493, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3095400, + "componentType": 5126, + "count": 3020, + "max": [ + -1.0566444396972656, + 0.5331907868385315, + -5.246150016784668 + ], + "min": [ + -5.446776390075684, + -0.029263824224472046, + -6.327867031097412 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3131640, + "componentType": 5126, + "count": 3020, + "max": [ + 0.9510157704353333, + 0.9999303817749023, + 0.9780461192131042 + ], + "min": [ + -0.9510163068771362, + -0.9998946189880371, + -0.9997351765632629 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1031800, + "componentType": 5126, + "count": 3020, + "max": [ + 0.48522621393203735, + 1.0385801792144775 + ], + "min": [ + 0.02432902343571186, + 0.0520254522562027 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 951024, + "componentType": 5125, + "count": 9972, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3167880, + "componentType": 5126, + "count": 3017, + "max": [ + 3.791862964630127, + 0.5331907868385315, + -5.246150016784668 + ], + "min": [ + -0.5896724462509155, + -0.029263824224472046, + -6.327867031097412 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3204084, + "componentType": 5126, + "count": 3017, + "max": [ + 0.9510151147842407, + 0.9999303817749023, + 0.9780461192131042 + ], + "min": [ + -0.951014518737793, + -0.9998946189880371, + -0.9997351169586182 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1055960, + "componentType": 5126, + "count": 3017, + "max": [ + 0.8308765888214111, + 1.0385801792144775 + ], + "min": [ + 0.024706987664103508, + 0.0520254522562027 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 990912, + "componentType": 5125, + "count": 9972, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3240288, + "componentType": 5126, + "count": 3016, + "max": [ + 8.581907272338867, + 0.5331907868385315, + -5.246150016784668 + ], + "min": [ + 4.195292949676514, + -0.029263824224472046, + -6.327867031097412 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3276480, + "componentType": 5126, + "count": 3016, + "max": [ + 0.9510151743888855, + 0.9999303817749023, + 0.978046178817749 + ], + "min": [ + -0.9510168433189392, + -0.9998946189880371, + -0.9997353553771973 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1080096, + "componentType": 5126, + "count": 3016, + "max": [ + 0.5868067741394043, + 0.8543574213981628 + ], + "min": [ + 0.05424198508262634, + 0.0520254522562027 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1030800, + "componentType": 5125, + "count": 9972, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3312672, + "componentType": 5126, + "count": 1518, + "max": [ + -4.997016906738281, + 0.27520543336868286, + -0.5244013071060181 + ], + "min": [ + -7.398374557495117, + -0.17631061375141144, + -1.5552358627319336 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3330888, + "componentType": 5126, + "count": 1518, + "max": [ + 0.9510155320167542, + 0.9993160367012024, + 0.9972317814826965 + ], + "min": [ + -0.951015293598175, + -1.0, + -0.9999640583992004 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1104224, + "componentType": 5126, + "count": 1518, + "max": [ + 0.6667309999465942, + 0.5445188879966736 + ], + "min": [ + -0.008028216660022736, + 0.05764149874448776 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1070688, + "componentType": 5125, + "count": 2493, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3349104, + "componentType": 5126, + "count": 1517, + "max": [ + 7.753782749176025, + 0.27520543336868286, + -0.5244013071060181 + ], + "min": [ + 6.129483222961426, + -0.17631061375141144, + -1.5552358627319336 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3367308, + "componentType": 5126, + "count": 1517, + "max": [ + 0.9510155320167542, + 0.999314546585083, + 0.9972319006919861 + ], + "min": [ + -0.9510143995285034, + -1.0, + -0.9999640583992004 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1116368, + "componentType": 5126, + "count": 1517, + "max": [ + 0.5882932543754578, + 0.5286601185798645 + ], + "min": [ + 0.0008697285084053874, + 0.06476349383592606 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1080660, + "componentType": 5125, + "count": 2493, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3385512, + "componentType": 5126, + "count": 176, + "max": [ + 0.023557504639029503, + 0.0028520538471639156, + 0.04074802249670029 + ], + "min": [ + -0.5126439929008484, + -0.003244487103074789, + -0.0007449534023180604 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3387624, + "componentType": 5126, + "count": 176, + "max": [ + 1.0, + 0.9999896287918091, + 0.9955055713653564 + ], + "min": [ + -1.0, + -0.9998917579650879, + -0.9999998807907104 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1128504, + "componentType": 5126, + "count": 176, + "max": [ + 1.0463021993637085, + 0.27893298864364624 + ], + "min": [ + 0.025923481211066246, + -0.721066951751709 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1090632, + "componentType": 5125, + "count": 264, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3389736, + "componentType": 5126, + "count": 665, + "max": [ + 0.01772039383649826, + 0.008716768585145473, + 0.01772039383649826 + ], + "min": [ + -0.01772039383649826, + -0.009088646620512009, + -0.01772039383649826 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3397716, + "componentType": 5126, + "count": 665, + "max": [ + 1.0, + 0.9843374490737915, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1129912, + "componentType": 5126, + "count": 665, + "max": [ + 0.9960711002349854, + 0.9960711002349854 + ], + "min": [ + 0.003928929567337036, + 0.003928929567337036 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1091688, + "componentType": 5125, + "count": 2676, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3405696, + "componentType": 5126, + "count": 4441, + "max": [ + 0.48635801672935486, + 0.003503945888951421, + 0.12958310544490814 + ], + "min": [ + -0.12092001736164093, + -0.03890405222773552, + -0.12432989478111267 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3458988, + "componentType": 5126, + "count": 4441, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1135232, + "componentType": 5126, + "count": 4441, + "max": [ + 1.3584036827087402, + 0.2727590799331665 + ], + "min": [ + -0.29921284317970276, + -0.544081449508667 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1102392, + "componentType": 5125, + "count": 10224, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3512280, + "componentType": 5126, + "count": 648, + "max": [ + 0.29700565338134766, + 0.030674653127789497, + 0.12605726718902588 + ], + "min": [ + -0.29700684547424316, + -0.007561414036899805, + -0.11328945308923721 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3520056, + "componentType": 5126, + "count": 648, + "max": [ + 1.0, + 0.9988421201705933, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1170760, + "componentType": 5126, + "count": 648, + "max": [ + 1.1323575973510742, + 1.2519409656524658 + ], + "min": [ + -0.14220550656318665, + 0.29184019565582275 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1143288, + "componentType": 5125, + "count": 2244, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3527832, + "componentType": 5126, + "count": 152, + "max": [ + 0.4880346655845642, + 4.513919338933192e-05, + 0.006273873150348663 + ], + "min": [ + -0.022679124027490616, + -0.004067440051585436, + -0.00626830430701375 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3529656, + "componentType": 5126, + "count": 152, + "max": [ + 0.9808868169784546, + 0.9999740719795227, + 0.980799674987793 + ], + "min": [ + -0.9808784127235413, + -0.9684997200965881, + -0.9808008074760437 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1175944, + "componentType": 5126, + "count": 152, + "max": [ + 1.8467029333114624, + 1.1084541082382202 + ], + "min": [ + 0.8467902541160583, + 0.10846807807683945 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1152264, + "componentType": 5125, + "count": 456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3531480, + "componentType": 5126, + "count": 288, + "max": [ + 0.5751093626022339, + 0.005652297288179398, + 0.018104420974850655 + ], + "min": [ + -0.009958788752555847, + -0.001809518551453948, + -0.018168892711400986 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3534936, + "componentType": 5126, + "count": 288, + "max": [ + 0.9808132648468018, + 0.999883770942688, + 0.9807247519493103 + ], + "min": [ + -0.9808131456375122, + -0.9692389965057373, + -0.9808412790298462 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1177160, + "componentType": 5126, + "count": 288, + "max": [ + 2.3031301498413086, + 2.777141571044922 + ], + "min": [ + -2.5208053588867188, + -1.5345827341079712 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1154088, + "componentType": 5125, + "count": 456, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 3538392, + "componentType": 5126, + "count": 64, + "max": [ + 0.2970058023929596, + 0.005764566361904144, + 0.11967309564352036 + ], + "min": [ + -0.2970058023929596, + -0.009588323533535004, + -0.11985741555690765 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 3539160, + "componentType": 5126, + "count": 64, + "max": [ + 0.991468071937561, + 0.9988421201705933, + 0.9902775883674622 + ], + "min": [ + -0.9914696216583252, + -0.9988420605659485, + -0.9902731776237488 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 1179464, + "componentType": 5126, + "count": 64, + "max": [ + 0.9999935030937195, + 0.671120285987854 + ], + "min": [ + -4.893680397799471e-06, + 0.2681887745857239 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 1155912, + "componentType": 5125, + "count": 180, + "type": "SCALAR" + } + ], + "asset": { + "extras": { + "author": "Rendy K (https://sketchfab.com/RendyK)", + "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)", + "source": "https://sketchfab.com/3d-models/vortexseries-mechanical-keyboard-gt-8-nj80-02d16e9dae72419aa24ec6788318f92b", + "title": "VortexSeries Mechanical Keyboard GT-8 / NJ80" + }, + "generator": "Sketchfab-15.36.0", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 1156632, + "name": "floatBufferViews", + "target": 34963 + }, + { + "buffer": 0, + "byteLength": 1179976, + "byteOffset": 1156632, + "byteStride": 8, + "name": "floatBufferViews", + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 3539928, + "byteOffset": 2336608, + "byteStride": 12, + "name": "floatBufferViews", + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 5876536, + "uri": "scene.bin" + } + ], + "extensionsUsed": [ + "KHR_materials_specular" + ], + "images": [ + { + "uri": "textures/Space_baseColor.png" + }, + { + "uri": "textures/White_Keys_2_baseColor.png" + }, + { + "uri": "textures/Material_baseColor.png" + }, + { + "uri": "textures/White_Keys_1_baseColor.png" + }, + { + "uri": "textures/White_Keys_7_baseColor.png" + }, + { + "uri": "textures/Black_Keys_1_baseColor.png" + }, + { + "uri": "textures/White_Keys_3_baseColor.png" + }, + { + "uri": "textures/Black_Keys_5_baseColor.png" + }, + { + "uri": "textures/Black_keys_4_baseColor.png" + }, + { + "uri": "textures/Black_Keys_3_baseColor.png" + }, + { + "uri": "textures/material_baseColor.png" + }, + { + "uri": "textures/White_Keys_4_baseColor.png" + }, + { + "uri": "textures/Black_Keys_2_baseColor.png" + }, + { + "uri": "textures/White_Keys_5_baseColor.png" + }, + { + "uri": "textures/Material.003_baseColor.png" + }, + { + "uri": "textures/Material.001_baseColor.png" + }, + { + "uri": "textures/Polycarbonate_Case_baseColor.png" + } + ], + "materials": [ + { + "doubleSided": true, + "name": "Space", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "White_Keys_2", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 1 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Material", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 2 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Shift_Arrow", + "pbrMetallicRoughness": { + "metallicFactor": 0.0, + "roughnessFactor": 0.636364 + } + }, + { + "doubleSided": true, + "name": "White_Keys_1", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 3 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "White_Keys_7", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 4 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Black_Keys_1", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 5 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Arrow.001", + "pbrMetallicRoughness": { + "metallicFactor": 0.0, + "roughnessFactor": 0.636364 + } + }, + { + "doubleSided": true, + "name": "White_Keys_3", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 6 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Black_Keys_5", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 7 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Black_keys_4", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 8 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Black_Keys_3", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 9 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "material", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 10 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "White_Keys_4", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 11 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Black_Keys_2", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 12 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "White_Keys_5", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 13 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Material.003", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 14 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "name": "Material.001", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 15 + }, + "metallicFactor": 0.0, + "roughnessFactor": 0.5 + } + }, + { + "doubleSided": true, + "extensions": { + "KHR_materials_specular": { + "specularColorFactor": [ + 1.0, + 1.0, + 1.0 + ], + "specularFactor": 0.693335446355646 + } + }, + "name": "Polycarbonate_Case", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 16 + }, + "metallicFactor": 0.5226682595604101 + } + }, + { + "doubleSided": true, + "name": "Alumunium_Knob", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.390854, + 0.422084, + 0.447973, + 1.0 + ], + "metallicFactor": 0.2544769660250393, + "roughnessFactor": 0.253846 + } + }, + { + "doubleSided": true, + "name": "Plate_Metal", + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.00822703, + 0.0086616, + 0.00901722, + 1.0 + ], + "metallicFactor": 0.697436, + "roughnessFactor": 0.253846 + } + } + ], + "meshes": [ + { + "name": "Object_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 0, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0, + "mode": 4 + } + ] + }, + { + "name": "Object_1", + "primitives": [ + { + "attributes": { + "NORMAL": 5, + "POSITION": 4, + "TEXCOORD_0": 6 + }, + "indices": 7, + "material": 1, + "mode": 4 + } + ] + }, + { + "name": "Object_2", + "primitives": [ + { + "attributes": { + "NORMAL": 9, + "POSITION": 8, + "TEXCOORD_0": 10 + }, + "indices": 11, + "material": 2, + "mode": 4 + } + ] + }, + { + "name": "Object_3", + "primitives": [ + { + "attributes": { + "NORMAL": 13, + "POSITION": 12, + "TEXCOORD_0": 14 + }, + "indices": 15, + "material": 3, + "mode": 4 + } + ] + }, + { + "name": "Object_4", + "primitives": [ + { + "attributes": { + "NORMAL": 17, + "POSITION": 16, + "TEXCOORD_0": 18 + }, + "indices": 19, + "material": 4, + "mode": 4 + } + ] + }, + { + "name": "Object_5", + "primitives": [ + { + "attributes": { + "NORMAL": 21, + "POSITION": 20, + "TEXCOORD_0": 22 + }, + "indices": 23, + "material": 5, + "mode": 4 + } + ] + }, + { + "name": "Object_6", + "primitives": [ + { + "attributes": { + "NORMAL": 25, + "POSITION": 24, + "TEXCOORD_0": 26 + }, + "indices": 27, + "material": 6, + "mode": 4 + } + ] + }, + { + "name": "Object_7", + "primitives": [ + { + "attributes": { + "NORMAL": 29, + "POSITION": 28, + "TEXCOORD_0": 30 + }, + "indices": 31, + "material": 7, + "mode": 4 + } + ] + }, + { + "name": "Object_8", + "primitives": [ + { + "attributes": { + "NORMAL": 33, + "POSITION": 32, + "TEXCOORD_0": 34 + }, + "indices": 35, + "material": 8, + "mode": 4 + } + ] + }, + { + "name": "Object_9", + "primitives": [ + { + "attributes": { + "NORMAL": 37, + "POSITION": 36, + "TEXCOORD_0": 38 + }, + "indices": 39, + "material": 9, + "mode": 4 + } + ] + }, + { + "name": "Object_10", + "primitives": [ + { + "attributes": { + "NORMAL": 41, + "POSITION": 40, + "TEXCOORD_0": 42 + }, + "indices": 43, + "material": 10, + "mode": 4 + } + ] + }, + { + "name": "Object_11", + "primitives": [ + { + "attributes": { + "NORMAL": 45, + "POSITION": 44, + "TEXCOORD_0": 46 + }, + "indices": 47, + "material": 11, + "mode": 4 + } + ] + }, + { + "name": "Object_12", + "primitives": [ + { + "attributes": { + "NORMAL": 49, + "POSITION": 48, + "TEXCOORD_0": 50 + }, + "indices": 51, + "material": 12, + "mode": 4 + } + ] + }, + { + "name": "Object_13", + "primitives": [ + { + "attributes": { + "NORMAL": 53, + "POSITION": 52, + "TEXCOORD_0": 54 + }, + "indices": 55, + "material": 13, + "mode": 4 + } + ] + }, + { + "name": "Object_14", + "primitives": [ + { + "attributes": { + "NORMAL": 57, + "POSITION": 56, + "TEXCOORD_0": 58 + }, + "indices": 59, + "material": 14, + "mode": 4 + } + ] + }, + { + "name": "Object_15", + "primitives": [ + { + "attributes": { + "NORMAL": 61, + "POSITION": 60, + "TEXCOORD_0": 62 + }, + "indices": 63, + "material": 15, + "mode": 4 + } + ] + }, + { + "name": "Object_16", + "primitives": [ + { + "attributes": { + "NORMAL": 65, + "POSITION": 64, + "TEXCOORD_0": 66 + }, + "indices": 67, + "material": 16, + "mode": 4 + } + ] + }, + { + "name": "Object_17", + "primitives": [ + { + "attributes": { + "NORMAL": 69, + "POSITION": 68, + "TEXCOORD_0": 70 + }, + "indices": 71, + "material": 17, + "mode": 4 + } + ] + }, + { + "name": "Object_18", + "primitives": [ + { + "attributes": { + "NORMAL": 73, + "POSITION": 72, + "TEXCOORD_0": 74 + }, + "indices": 75, + "material": 18, + "mode": 4 + } + ] + }, + { + "name": "Object_19", + "primitives": [ + { + "attributes": { + "NORMAL": 77, + "POSITION": 76, + "TEXCOORD_0": 78 + }, + "indices": 79, + "material": 19, + "mode": 4 + } + ] + }, + { + "name": "Object_20", + "primitives": [ + { + "attributes": { + "NORMAL": 81, + "POSITION": 80, + "TEXCOORD_0": 82 + }, + "indices": 83, + "material": 18, + "mode": 4 + } + ] + }, + { + "name": "Object_21", + "primitives": [ + { + "attributes": { + "NORMAL": 85, + "POSITION": 84, + "TEXCOORD_0": 86 + }, + "indices": 87, + "material": 18, + "mode": 4 + } + ] + }, + { + "name": "Object_22", + "primitives": [ + { + "attributes": { + "NORMAL": 89, + "POSITION": 88, + "TEXCOORD_0": 90 + }, + "indices": 91, + "material": 18, + "mode": 4 + } + ] + }, + { + "name": "Object_23", + "primitives": [ + { + "attributes": { + "NORMAL": 93, + "POSITION": 92, + "TEXCOORD_0": 94 + }, + "indices": 95, + "material": 18, + "mode": 4 + } + ] + }, + { + "name": "Object_24", + "primitives": [ + { + "attributes": { + "NORMAL": 97, + "POSITION": 96, + "TEXCOORD_0": 98 + }, + "indices": 99, + "material": 20, + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.220446049250313e-16, + -1.0, + 0.0, + 0.0, + 1.0, + 2.220446049250313e-16, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "Sketchfab_model" + }, + { + "children": [ + 2 + ], + "name": "root" + }, + { + "children": [ + 3 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.220446049250313e-16, + 1.0, + 0.0, + 0.0, + -1.0, + 2.220446049250313e-16, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "GLTF_SceneRootNode" + }, + { + "children": [ + 4, + 23, + 25, + 27, + 29, + 31, + 33, + 35 + ], + "matrix": [ + 0.3175949156284332, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07486328083429128, + 0.0017827321746192505, + 0.0, + 0.0, + -0.003255747157655175, + 0.1367204324121436, + 0.0, + -0.017840776592493057, + 0.07415158301591873, + 0.11037786304950714, + 1.0 + ], + "name": "Empty.003_10" + }, + { + "children": [ + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22 + ], + "matrix": [ + 0.1036105677485466, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4394257068634033, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24061404168605804, + 0.0, + -0.14257362484931946, + -0.5672442317008972, + 0.7180967926979065, + 1.0 + ], + "name": "Cube.125_2" + }, + { + "mesh": 0, + "name": "Object_5" + }, + { + "mesh": 1, + "name": "Object_6" + }, + { + "mesh": 2, + "name": "Object_7" + }, + { + "mesh": 3, + "name": "Object_8" + }, + { + "mesh": 4, + "name": "Object_9" + }, + { + "mesh": 5, + "name": "Object_10" + }, + { + "mesh": 6, + "name": "Object_11" + }, + { + "mesh": 7, + "name": "Object_12" + }, + { + "mesh": 8, + "name": "Object_13" + }, + { + "mesh": 9, + "name": "Object_14" + }, + { + "mesh": 10, + "name": "Object_15" + }, + { + "mesh": 11, + "name": "Object_16" + }, + { + "mesh": 12, + "name": "Object_17" + }, + { + "mesh": 13, + "name": "Object_18" + }, + { + "mesh": 14, + "name": "Object_19" + }, + { + "mesh": 15, + "name": "Object_20" + }, + { + "mesh": 16, + "name": "Object_21" + }, + { + "mesh": 17, + "name": "Object_22" + }, + { + "children": [ + 24 + ], + "matrix": [ + 3.1486642360687256, + 0.0, + -0.0, + 0.0, + 0.0, + 13.34592017299112, + -0.3771031069045982, + 0.0, + 0.0, + 0.20666595038324886, + 7.314040181026553, + 0.0, + 0.7784076929092407, + -1.0161064863204956, + -0.7854675650596619, + 1.0 + ], + "name": "Cube.230_3" + }, + { + "mesh": 18, + "name": "Object_24" + }, + { + "children": [ + 26 + ], + "matrix": [ + 3.115574598312378, + 0.0, + 0.0, + 0.0, + 0.0, + 13.449093770323197, + 0.7923323156830137, + 0.0, + 0.0, + -0.42673970417415397, + 7.2435039987114065, + 0.0, + 0.85433030128479, + -0.382805734872818, + -0.6688618063926697, + 1.0 + ], + "name": "Cylinder_4" + }, + { + "mesh": 19, + "name": "Object_26" + }, + { + "children": [ + 28 + ], + "matrix": [ + 3.1486642360687256, + 0.0, + 0.0, + 0.0, + 0.0, + 13.338368947635237, + 0.5259862393132665, + 0.0, + 0.0, + -0.2884939467432671, + 7.315854319392785, + 0.0, + -0.5713521242141724, + -0.579516589641571, + 0.0135728120803833, + 1.0 + ], + "name": "Plane.002_5" + }, + { + "mesh": 20, + "name": "Object_28" + }, + { + "children": [ + 30 + ], + "matrix": [ + 3.1486652863655125, + -0.0014236324410541663, + -0.0006063071779150372, + 0.0, + 0.006024525697166673, + 13.353635825681492, + -0.06837167608698011, + 0.0, + 0.0014249622120645928, + 0.037438328338282756, + 7.31218562840508, + 0.0, + 0.008474759757518768, + -0.949815034866333, + -0.009531378746032715, + 1.0 + ], + "name": "Plane.005_6" + }, + { + "mesh": 21, + "name": "Object_30" + }, + { + "children": [ + 32 + ], + "matrix": [ + 3.1486652863655125, + -0.001423632440492895, + -0.0006063071792423394, + 0.0, + 0.006024524408864098, + 13.353632964823685, + -0.06837163656551111, + 0.0, + 0.0014249620231508032, + 0.03743830983558312, + 7.312184674813017, + 0.0, + -0.7241035103797913, + -1.0077370405197144, + 0.7945848107337952, + 1.0 + ], + "name": "Plane.006_7" + }, + { + "mesh": 22, + "name": "Object_32" + }, + { + "children": [ + 34 + ], + "matrix": [ + 3.1486650528095077, + -0.0014008919467393963, + -0.0006334177595760206, + 0.0, + 0.00598162617943449, + 13.3515305277289, + 0.20537112395189705, + 0.0, + 0.0014210502071213744, + -0.11248328193116179, + 7.312690525683075, + 0.0, + -0.881301999092102, + -1.0500962734222412, + -0.6240882873535156, + 1.0 + ], + "name": "Plane.010_8" + }, + { + "mesh": 23, + "name": "Object_34" + }, + { + "children": [ + 36 + ], + "matrix": [ + 3.148665286276371, + -0.0014277525588221548, + -0.0005970106429151336, + 0.0, + 0.006000971000708457, + 13.349617574530031, + -0.2762121235316249, + 0.0, + 0.0014552408544483437, + 0.15131310599358988, + 7.3131505093245535, + 0.0, + 0.009596683084964752, + -0.5952113270759583, + 0.03861570358276367, + 1.0 + ], + "name": "Plane.012_9" + }, + { + "mesh": 24, + "name": "Object_36" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + }, + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 33071, + "wrapT": 33071 + } + ], + "scene": 0, + "scenes": [ + { + "name": "Sketchfab_Scene", + "nodes": [ + 0 + ] + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + }, + { + "sampler": 0, + "source": 1 + }, + { + "sampler": 0, + "source": 2 + }, + { + "sampler": 0, + "source": 3 + }, + { + "sampler": 0, + "source": 4 + }, + { + "sampler": 0, + "source": 5 + }, + { + "sampler": 0, + "source": 6 + }, + { + "sampler": 0, + "source": 7 + }, + { + "sampler": 0, + "source": 8 + }, + { + "sampler": 0, + "source": 9 + }, + { + "sampler": 0, + "source": 10 + }, + { + "sampler": 0, + "source": 11 + }, + { + "sampler": 0, + "source": 12 + }, + { + "sampler": 0, + "source": 13 + }, + { + "sampler": 0, + "source": 14 + }, + { + "sampler": 0, + "source": 15 + }, + { + "sampler": 1, + "source": 16 + } + ] +} diff --git a/3D-Portfolio/public/desktop_pc/textures/Black_Keys_1_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_1_baseColor.png new file mode 100644 index 00000000..f7640928 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_1_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Black_Keys_2_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_2_baseColor.png new file mode 100644 index 00000000..a82a9eef Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_2_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Black_Keys_3_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_3_baseColor.png new file mode 100644 index 00000000..b10b1fce Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_3_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Black_Keys_5_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_5_baseColor.png new file mode 100644 index 00000000..d98f2fd7 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Black_Keys_5_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Black_keys_4_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Black_keys_4_baseColor.png new file mode 100644 index 00000000..c734744c Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Black_keys_4_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Material.001_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Material.001_baseColor.png new file mode 100644 index 00000000..f7b1e4d3 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Material.001_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Material.003_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Material.003_baseColor.png new file mode 100644 index 00000000..1ac6de63 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Material.003_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Polycarbonate_Case_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Polycarbonate_Case_baseColor.png new file mode 100644 index 00000000..644942aa Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Polycarbonate_Case_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/Space_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/Space_baseColor.png new file mode 100644 index 00000000..4d8a6083 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/Space_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/White_Keys_1_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/White_Keys_1_baseColor.png new file mode 100644 index 00000000..d93ec931 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/White_Keys_1_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/White_Keys_2_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/White_Keys_2_baseColor.png new file mode 100644 index 00000000..7f1923f8 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/White_Keys_2_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/White_Keys_3_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/White_Keys_3_baseColor.png new file mode 100644 index 00000000..72a44b65 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/White_Keys_3_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/White_Keys_4_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/White_Keys_4_baseColor.png new file mode 100644 index 00000000..e4f2840c Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/White_Keys_4_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/White_Keys_5_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/White_Keys_5_baseColor.png new file mode 100644 index 00000000..5625210b Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/White_Keys_5_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/White_Keys_7_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/White_Keys_7_baseColor.png new file mode 100644 index 00000000..887cab06 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/White_Keys_7_baseColor.png differ diff --git a/3D-Portfolio/public/desktop_pc/textures/material_baseColor.png b/3D-Portfolio/public/desktop_pc/textures/material_baseColor.png new file mode 100644 index 00000000..85dd3419 Binary files /dev/null and b/3D-Portfolio/public/desktop_pc/textures/material_baseColor.png differ diff --git a/3D-Portfolio/public/logo.ico b/3D-Portfolio/public/logo.ico new file mode 100644 index 00000000..8f759d3a Binary files /dev/null and b/3D-Portfolio/public/logo.ico differ diff --git a/3D-Portfolio/public/planet/license.txt b/3D-Portfolio/public/planet/license.txt new file mode 100644 index 00000000..08f651a4 --- /dev/null +++ b/3D-Portfolio/public/planet/license.txt @@ -0,0 +1,11 @@ +Model Information: +* title: Stylized planet +* source: https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70 +* author: cmzw (https://sketchfab.com/cmzw) + +Model License: +* license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) +* requirements: Author must be credited. Commercial use is allowed. + +If you use this 3D model in your project be sure to copy paste this credit wherever you share it: +This work is based on "Stylized planet" (https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70) by cmzw (https://sketchfab.com/cmzw) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) \ No newline at end of file diff --git a/3D-Portfolio/public/planet/scene.bin b/3D-Portfolio/public/planet/scene.bin new file mode 100644 index 00000000..ea53ab9c Binary files /dev/null and b/3D-Portfolio/public/planet/scene.bin differ diff --git a/3D-Portfolio/public/planet/scene.gltf b/3D-Portfolio/public/planet/scene.gltf new file mode 100644 index 00000000..5b021478 --- /dev/null +++ b/3D-Portfolio/public/planet/scene.gltf @@ -0,0 +1,536 @@ +{ + "accessors": [ + { + "bufferView": 2, + "componentType": 5126, + "count": 26495, + "max": [ + 0.8758764863014221, + 0.8545469045639038, + 0.8728971481323242 + ], + "min": [ + -0.8763356804847717, + -0.8634992837905884, + -0.8758782148361206 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 317940, + "componentType": 5126, + "count": 26495, + "max": [ + 1.0, + 0.9999911785125732, + 0.9991646409034729 + ], + "min": [ + -1.0, + -0.9999968409538269, + -0.9999611377716064 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 26495, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "componentType": 5125, + "count": 103014, + "type": "SCALAR" + }, + { + "bufferView": 2, + "byteOffset": 635880, + "componentType": 5126, + "count": 6596, + "max": [ + 0.6551179885864258, + 0.6613333821296692, + 0.6618664860725403 + ], + "min": [ + -0.6606217622756958, + -0.6490849852561951, + -0.6526646018028259 + ], + "type": "VEC3" + }, + { + "bufferView": 2, + "byteOffset": 715032, + "componentType": 5126, + "count": 6596, + "max": [ + 0.999987006187439, + 0.9998384118080139, + 0.9999796748161316 + ], + "min": [ + -0.9995425939559937, + -0.999676525592804, + -0.9994800686836243 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 211960, + "componentType": 5126, + "count": 6596, + "max": [ + 1.0, + 1.0 + ], + "min": [ + 0.0, + 0.0 + ], + "type": "VEC2" + }, + { + "bufferView": 0, + "byteOffset": 412056, + "componentType": 5125, + "count": 39042, + "type": "SCALAR" + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 451, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "componentType": 5126, + "count": 451, + "max": [ + 0.20017318427562714, + 0.979751706123352, + 0.2001722753047943, + 0.9797602891921997 + ], + "min": [ + -0.018710684031248093, + -0.9797568917274475, + -0.1991616040468216, + 0.0026621678844094276 + ], + "type": "VEC4" + }, + { + "bufferView": 3, + "byteOffset": 1804, + "componentType": 5126, + "count": 125, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 4, + "componentType": 5126, + "count": 125, + "max": [ + 1.0000001192092896, + 1.0, + 1.0000001192092896 + ], + "min": [ + 0.9999998807907104, + 1.0, + 0.9999998807907104 + ], + "type": "VEC3" + }, + { + "bufferView": 3, + "byteOffset": 2304, + "componentType": 5126, + "count": 451, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 5, + "byteOffset": 7216, + "componentType": 5126, + "count": 451, + "max": [ + 0.20017318427562714, + 0.979751706123352, + 0.2001722753047943, + 0.9797602891921997 + ], + "min": [ + -0.018710684031248093, + -0.9797568917274475, + -0.1991616040468216, + 0.0026621678844094276 + ], + "type": "VEC4" + }, + { + "bufferView": 3, + "byteOffset": 4108, + "componentType": 5126, + "count": 125, + "max": [ + 15.0 + ], + "min": [ + 0.0 + ], + "type": "SCALAR" + }, + { + "bufferView": 4, + "byteOffset": 1500, + "componentType": 5126, + "count": 125, + "max": [ + 1.0000001192092896, + 1.0, + 1.0000001192092896 + ], + "min": [ + 0.9999998807907104, + 1.0, + 0.9999998807907104 + ], + "type": "VEC3" + } + ], + "animations": [ + { + "channels": [ + { + "sampler": 0, + "target": { + "node": 3, + "path": "rotation" + } + }, + { + "sampler": 1, + "target": { + "node": 3, + "path": "scale" + } + }, + { + "sampler": 2, + "target": { + "node": 5, + "path": "rotation" + } + }, + { + "sampler": 3, + "target": { + "node": 5, + "path": "scale" + } + } + ], + "name": "Animation", + "samplers": [ + { + "input": 8, + "interpolation": "LINEAR", + "output": 9 + }, + { + "input": 10, + "interpolation": "LINEAR", + "output": 11 + }, + { + "input": 12, + "interpolation": "LINEAR", + "output": 13 + }, + { + "input": 14, + "interpolation": "LINEAR", + "output": 15 + } + ] + } + ], + "asset": { + "extras": { + "author": "cmzw (https://sketchfab.com/cmzw)", + "license": "CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/)", + "source": "https://sketchfab.com/3d-models/stylized-planet-789725db86f547fc9163b00f302c3e70", + "title": "Stylized planet" + }, + "generator": "Sketchfab-14.10.0", + "version": "2.0" + }, + "bufferViews": [ + { + "buffer": 0, + "byteLength": 568224, + "name": "floatBufferViews", + "target": 34963 + }, + { + "buffer": 0, + "byteLength": 264728, + "byteOffset": 568224, + "byteStride": 8, + "name": "floatBufferViews", + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 794184, + "byteOffset": 832952, + "byteStride": 12, + "name": "floatBufferViews", + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 4608, + "byteOffset": 1627136, + "name": "floatBufferViews" + }, + { + "buffer": 0, + "byteLength": 3000, + "byteOffset": 1631744, + "byteStride": 12, + "name": "floatBufferViews" + }, + { + "buffer": 0, + "byteLength": 14432, + "byteOffset": 1634744, + "byteStride": 16, + "name": "floatBufferViews" + } + ], + "buffers": [ + { + "byteLength": 1649176, + "uri": "scene.bin" + } + ], + "extensionsUsed": [ + "KHR_materials_unlit" + ], + "images": [ + { + "uri": "textures/Clouds_baseColor.png" + }, + { + "uri": "textures/Planet_baseColor.png" + } + ], + "materials": [ + { + "doubleSided": true, + "emissiveTexture": { + "index": 0 + }, + "extensions": { + "KHR_materials_unlit": {} + }, + "name": "Clouds", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 0 + }, + "metallicFactor": 0.0 + } + }, + { + "emissiveFactor": [ + 0.23391156271636818, + 0.23391156271636818, + 0.23391156271636818 + ], + "emissiveTexture": { + "index": 1 + }, + "extensions": { + "KHR_materials_unlit": {} + }, + "name": "Planet", + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 1 + }, + "metallicFactor": 0.0 + } + } + ], + "meshes": [ + { + "name": "Object_0", + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 0, + "TEXCOORD_0": 2 + }, + "indices": 3, + "material": 0, + "mode": 4 + } + ] + }, + { + "name": "Object_1", + "primitives": [ + { + "attributes": { + "NORMAL": 5, + "POSITION": 4, + "TEXCOORD_0": 6 + }, + "indices": 7, + "material": 1, + "mode": 4 + } + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 0.9979661703109741, + 0.06371438503265381, + 0.001990502001717701, + 0.0, + 0.0, + 0.031225780025124772, + -0.9995123744010925, + 0.0, + -0.06374546885490417, + 0.9974795579910278, + 0.031162271276116593, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "Sketchfab_model" + }, + { + "children": [ + 2 + ], + "name": "root" + }, + { + "children": [ + 3, + 5 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.220446049250313e-16, + 1.0, + 0.0, + 0.0, + -1.0, + 2.220446049250313e-16, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "GLTF_SceneRootNode" + }, + { + "children": [ + 4 + ], + "name": "Clouds_1" + }, + { + "mesh": 0, + "name": "Object_4" + }, + { + "children": [ + 6 + ], + "name": "Planet_2" + }, + { + "mesh": 1, + "name": "Object_6" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + } + ], + "scene": 0, + "scenes": [ + { + "name": "Sketchfab_Scene", + "nodes": [ + 0 + ] + } + ], + "textures": [ + { + "sampler": 0, + "source": 0 + }, + { + "sampler": 0, + "source": 1 + } + ] +} diff --git a/3D-Portfolio/public/planet/textures/Clouds_baseColor.png b/3D-Portfolio/public/planet/textures/Clouds_baseColor.png new file mode 100644 index 00000000..314be79c Binary files /dev/null and b/3D-Portfolio/public/planet/textures/Clouds_baseColor.png differ diff --git a/3D-Portfolio/public/planet/textures/Planet_baseColor.png b/3D-Portfolio/public/planet/textures/Planet_baseColor.png new file mode 100644 index 00000000..1f69ec6b Binary files /dev/null and b/3D-Portfolio/public/planet/textures/Planet_baseColor.png differ diff --git a/3D-Portfolio/src/App.jsx b/3D-Portfolio/src/App.jsx new file mode 100644 index 00000000..89ece8fe --- /dev/null +++ b/3D-Portfolio/src/App.jsx @@ -0,0 +1,25 @@ +import { BrowserRouter } from "react-router-dom"; +import { Hero, Navbar, StarsCanvas, About, Experience, Works, Feedbacks, Contact } from "./components"; + +const App = () => { + return ( + +
+
+ + +
+ + + + +
+ + +
+
+
+ ); +} + +export default App; diff --git a/3D-Portfolio/src/assets/backend.png b/3D-Portfolio/src/assets/backend.png new file mode 100644 index 00000000..b2edd572 Binary files /dev/null and b/3D-Portfolio/src/assets/backend.png differ diff --git a/3D-Portfolio/src/assets/call.png b/3D-Portfolio/src/assets/call.png new file mode 100644 index 00000000..de432580 Binary files /dev/null and b/3D-Portfolio/src/assets/call.png differ diff --git a/3D-Portfolio/src/assets/cars07.png b/3D-Portfolio/src/assets/cars07.png new file mode 100644 index 00000000..34ecaa77 Binary files /dev/null and b/3D-Portfolio/src/assets/cars07.png differ diff --git a/3D-Portfolio/src/assets/close.svg b/3D-Portfolio/src/assets/close.svg new file mode 100644 index 00000000..81e97e01 --- /dev/null +++ b/3D-Portfolio/src/assets/close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/3D-Portfolio/src/assets/company/meta.png b/3D-Portfolio/src/assets/company/meta.png new file mode 100644 index 00000000..05ff96c3 Binary files /dev/null and b/3D-Portfolio/src/assets/company/meta.png differ diff --git a/3D-Portfolio/src/assets/company/shopify.png b/3D-Portfolio/src/assets/company/shopify.png new file mode 100644 index 00000000..4be48bc0 Binary files /dev/null and b/3D-Portfolio/src/assets/company/shopify.png differ diff --git a/3D-Portfolio/src/assets/company/starbucks.png b/3D-Portfolio/src/assets/company/starbucks.png new file mode 100644 index 00000000..ddbd7587 Binary files /dev/null and b/3D-Portfolio/src/assets/company/starbucks.png differ diff --git a/3D-Portfolio/src/assets/company/tesla.png b/3D-Portfolio/src/assets/company/tesla.png new file mode 100644 index 00000000..5d057a7e Binary files /dev/null and b/3D-Portfolio/src/assets/company/tesla.png differ diff --git a/3D-Portfolio/src/assets/creator.png b/3D-Portfolio/src/assets/creator.png new file mode 100644 index 00000000..3c49549c Binary files /dev/null and b/3D-Portfolio/src/assets/creator.png differ diff --git a/3D-Portfolio/src/assets/github.png b/3D-Portfolio/src/assets/github.png new file mode 100644 index 00000000..81029919 Binary files /dev/null and b/3D-Portfolio/src/assets/github.png differ diff --git a/3D-Portfolio/src/assets/herobg.png b/3D-Portfolio/src/assets/herobg.png new file mode 100644 index 00000000..06515c43 Binary files /dev/null and b/3D-Portfolio/src/assets/herobg.png differ diff --git a/3D-Portfolio/src/assets/hygeia.png b/3D-Portfolio/src/assets/hygeia.png new file mode 100644 index 00000000..1b6b37be Binary files /dev/null and b/3D-Portfolio/src/assets/hygeia.png differ diff --git a/3D-Portfolio/src/assets/index.js b/3D-Portfolio/src/assets/index.js new file mode 100644 index 00000000..5a1bef2a --- /dev/null +++ b/3D-Portfolio/src/assets/index.js @@ -0,0 +1,67 @@ +import logo from "./logo.svg"; +import backend from "./backend.png"; +import creator from "./creator.png"; +import mobile from "./mobile.png"; +import web from "./web.png"; +import github from "./github.png"; +import menu from "./menu.svg"; +import close from "./close.svg"; + +import css from "./tech/css.png"; +import docker from "./tech/docker.png"; +import figma from "./tech/figma.png"; +import git from "./tech/git.png"; +import html from "./tech/html.png"; +import javascript from "./tech/javascript.png"; +import mongodb from "./tech/mongodb.png"; +import nodejs from "./tech/nodejs.png"; +import reactjs from "./tech/reactjs.png"; +import redux from "./tech/redux.png"; +import tailwind from "./tech/tailwind.png"; +import typescript from "./tech/typescript.png"; +import threejs from "./tech/threejs.svg"; + +import meta from "./company/meta.png"; +import shopify from "./company/shopify.png"; +import starbucks from "./company/starbucks.png"; +import tesla from "./company/tesla.png"; + +import jobit from "./jobit.png"; +import tripguide from "./tripguide.png"; + +import hygeia from "./hygeia.png"; +import cars07 from "./cars07.png"; +import call from "./call.png"; + +export { + logo, + backend, + creator, + mobile, + web, + github, + menu, + close, + css, + docker, + figma, + git, + html, + javascript, + mongodb, + nodejs, + reactjs, + redux, + tailwind, + typescript, + threejs, + meta, + shopify, + starbucks, + tesla, + jobit, + tripguide, + hygeia, + cars07, + call +}; diff --git a/3D-Portfolio/src/assets/jobit.png b/3D-Portfolio/src/assets/jobit.png new file mode 100644 index 00000000..6ccce607 Binary files /dev/null and b/3D-Portfolio/src/assets/jobit.png differ diff --git a/3D-Portfolio/src/assets/logo.svg b/3D-Portfolio/src/assets/logo.svg new file mode 100644 index 00000000..8f759d3a Binary files /dev/null and b/3D-Portfolio/src/assets/logo.svg differ diff --git a/3D-Portfolio/src/assets/menu.svg b/3D-Portfolio/src/assets/menu.svg new file mode 100644 index 00000000..318d5ef8 --- /dev/null +++ b/3D-Portfolio/src/assets/menu.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/3D-Portfolio/src/assets/mobile.png b/3D-Portfolio/src/assets/mobile.png new file mode 100644 index 00000000..c3d041c8 Binary files /dev/null and b/3D-Portfolio/src/assets/mobile.png differ diff --git a/3D-Portfolio/src/assets/tech/css.png b/3D-Portfolio/src/assets/tech/css.png new file mode 100644 index 00000000..d16bfdb8 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/css.png differ diff --git a/3D-Portfolio/src/assets/tech/docker.png b/3D-Portfolio/src/assets/tech/docker.png new file mode 100644 index 00000000..3f642072 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/docker.png differ diff --git a/3D-Portfolio/src/assets/tech/figma.png b/3D-Portfolio/src/assets/tech/figma.png new file mode 100644 index 00000000..de58fe9e Binary files /dev/null and b/3D-Portfolio/src/assets/tech/figma.png differ diff --git a/3D-Portfolio/src/assets/tech/git.png b/3D-Portfolio/src/assets/tech/git.png new file mode 100644 index 00000000..7c5de096 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/git.png differ diff --git a/3D-Portfolio/src/assets/tech/html.png b/3D-Portfolio/src/assets/tech/html.png new file mode 100644 index 00000000..eb3d902b Binary files /dev/null and b/3D-Portfolio/src/assets/tech/html.png differ diff --git a/3D-Portfolio/src/assets/tech/javascript.png b/3D-Portfolio/src/assets/tech/javascript.png new file mode 100644 index 00000000..0e50fb6b Binary files /dev/null and b/3D-Portfolio/src/assets/tech/javascript.png differ diff --git a/3D-Portfolio/src/assets/tech/mongodb.png b/3D-Portfolio/src/assets/tech/mongodb.png new file mode 100644 index 00000000..e4644e2b Binary files /dev/null and b/3D-Portfolio/src/assets/tech/mongodb.png differ diff --git a/3D-Portfolio/src/assets/tech/nodejs.png b/3D-Portfolio/src/assets/tech/nodejs.png new file mode 100644 index 00000000..c6ace598 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/nodejs.png differ diff --git a/3D-Portfolio/src/assets/tech/reactjs.png b/3D-Portfolio/src/assets/tech/reactjs.png new file mode 100644 index 00000000..cfa6f163 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/reactjs.png differ diff --git a/3D-Portfolio/src/assets/tech/redux.png b/3D-Portfolio/src/assets/tech/redux.png new file mode 100644 index 00000000..3e80df69 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/redux.png differ diff --git a/3D-Portfolio/src/assets/tech/tailwind.png b/3D-Portfolio/src/assets/tech/tailwind.png new file mode 100644 index 00000000..ec1f2080 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/tailwind.png differ diff --git a/3D-Portfolio/src/assets/tech/threejs.svg b/3D-Portfolio/src/assets/tech/threejs.svg new file mode 100644 index 00000000..b6a8dc82 --- /dev/null +++ b/3D-Portfolio/src/assets/tech/threejs.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/3D-Portfolio/src/assets/tech/typescript.png b/3D-Portfolio/src/assets/tech/typescript.png new file mode 100644 index 00000000..c1b98797 Binary files /dev/null and b/3D-Portfolio/src/assets/tech/typescript.png differ diff --git a/3D-Portfolio/src/assets/tripguide.png b/3D-Portfolio/src/assets/tripguide.png new file mode 100644 index 00000000..92bf6047 Binary files /dev/null and b/3D-Portfolio/src/assets/tripguide.png differ diff --git a/3D-Portfolio/src/assets/web.png b/3D-Portfolio/src/assets/web.png new file mode 100644 index 00000000..c29cbd0d Binary files /dev/null and b/3D-Portfolio/src/assets/web.png differ diff --git a/3D-Portfolio/src/components/About.jsx b/3D-Portfolio/src/components/About.jsx new file mode 100644 index 00000000..27e4f272 --- /dev/null +++ b/3D-Portfolio/src/components/About.jsx @@ -0,0 +1,66 @@ +import React from "react"; +import Tilt from "react-tilt"; +import { motion } from "framer-motion"; + +import { styles } from "../styles"; +import { services } from "../constants"; +import { SectionWrapper } from "../hoc"; +import { fadeIn, textVariant } from "../utils/motion"; + +const ServiceCard = ({ index, title, icon }) => ( + + +
+ web-development + +

+ {title} +

+
+
+
+); + +const About = () => { + return ( + <> + +

Introduction

+

Overview.

+
+ + + I'm a skilled software developer with experience in TypeScript and + JavaScript, and expertise in frameworks like React, Node.js, and + Three.js. I'm a quick learner and collaborate closely with clients to + create efficient, scalable, and user-friendly solutions that solve + real-world problems. Let's work together to bring your ideas to life! + + +
+ {services.map((service, index) => ( + + ))} +
+ + ); +}; + +export default SectionWrapper(About, "about"); diff --git a/3D-Portfolio/src/components/Contact.jsx b/3D-Portfolio/src/components/Contact.jsx new file mode 100644 index 00000000..b58c9d90 --- /dev/null +++ b/3D-Portfolio/src/components/Contact.jsx @@ -0,0 +1,138 @@ +import React, { useRef, useState } from "react"; +import { motion } from "framer-motion"; +import emailjs from "@emailjs/browser"; + +import { styles } from "../styles"; +import { EarthCanvas } from "./canvas"; +import { SectionWrapper } from "../hoc"; +import { slideIn } from "../utils/motion"; + +const Contact = () => { + const formRef = useRef(); + const [form, setForm] = useState({ + name: "", + email: "", + message: "", + }); + + const [loading, setLoading] = useState(false); + + const handleChange = (e) => { + const { target } = e; + const { name, value } = target; + + setForm({ + ...form, + [name]: value, + }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + setLoading(true); + + emailjs + .send( + import.meta.env.VITE_APP_EMAILJS_SERVICE_ID, + import.meta.env.VITE_APP_EMAILJS_TEMPLATE_ID, + { + from_name: form.name, + to_name: "Web Dev Freelancer", + from_email: form.email, + to_email: "unknownbot411@gmail.com", + message: form.message, + }, + import.meta.env.VITE_APP_EMAILJS_PUBLIC_KEY + ) + .then( + () => { + setLoading(false); + alert("Thank you. I will get back to you as soon as possible."); + + setForm({ + name: "", + email: "", + message: "", + }); + }, + (error) => { + setLoading(false); + console.error(error); + + alert("Ahh, something went wrong. Please try again."); + } + ); + }; + + return ( + <> +
+ +

Get in touch

+

Contact.

+ +
+ + +
+
+ + +
+ + + + + + \ No newline at end of file diff --git a/Blog-Website/views/includes/head.ejs b/Blog-Website/views/includes/head.ejs new file mode 100644 index 00000000..511b0037 --- /dev/null +++ b/Blog-Website/views/includes/head.ejs @@ -0,0 +1,11 @@ + + + + + <%= title %> + + + + + \ No newline at end of file diff --git a/Blog-Website/views/includes/header.ejs b/Blog-Website/views/includes/header.ejs new file mode 100644 index 00000000..52c21a31 --- /dev/null +++ b/Blog-Website/views/includes/header.ejs @@ -0,0 +1,15 @@ +
+ + +
\ No newline at end of file diff --git a/Blog-Website/views/includes/post-item.ejs b/Blog-Website/views/includes/post-item.ejs new file mode 100644 index 00000000..bc68dd37 --- /dev/null +++ b/Blog-Website/views/includes/post-item.ejs @@ -0,0 +1,13 @@ +
+

<%= post.title %>

+

By <%= post.author.name %>

+

<%= post.summary %>

+
+
+ +
+ + Edit Post + View Post +
+
\ No newline at end of file diff --git a/Blog-Website/views/post-detail.ejs b/Blog-Website/views/post-detail.ejs new file mode 100644 index 00000000..f6738636 --- /dev/null +++ b/Blog-Website/views/post-detail.ejs @@ -0,0 +1,24 @@ + + + + + <%- include('includes/head', { title: 'Post title' }) %> + + + + + <%- include('includes/header') %> +
+

<%= post.title %>

+
+
<%= post.author.name %>
+ +
+
+
+

<%= post.body %>

+
+
+ + + \ No newline at end of file diff --git a/Blog-Website/views/posts-list.ejs b/Blog-Website/views/posts-list.ejs new file mode 100644 index 00000000..0441ba75 --- /dev/null +++ b/Blog-Website/views/posts-list.ejs @@ -0,0 +1,23 @@ + + + + <%- include('includes/head', { title: 'All Posts' }) %> + + + + + <%- include('includes/header') %> +
+

All Posts

+ +
    + <% for(let post of posts){ %> +
  1. + <%- include('includes/post-item',{post:post}) %> +
  2. + <% } %> +
+ +
+ + diff --git a/Blog-Website/views/update-post.ejs b/Blog-Website/views/update-post.ejs new file mode 100644 index 00000000..cebf6c85 --- /dev/null +++ b/Blog-Website/views/update-post.ejs @@ -0,0 +1,31 @@ + + + + + <%- include('includes/head', { title: 'Update post' }) %> + + + + + <%- include('includes/header') %> +
+

Update post

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + + \ No newline at end of file diff --git a/Blogger-Website-main/blogers website/LICENSE b/Blogger-Website-main/blogers website/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/Blogger-Website-main/blogers website/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Blogger-Website-main/blogers website/blog.html b/Blogger-Website-main/blogers website/blog.html new file mode 100644 index 00000000..31a1d529 --- /dev/null +++ b/Blogger-Website-main/blogers website/blog.html @@ -0,0 +1,141 @@ + + + + + + + + I - blog + + + + + + + +
+

here us a oaragraoh fir the convence of dump right shit

+
+
+ +
+
+

The heaven for bloggers

+

i-blog is a website which lets you to upload your blogs and your blogs can make an imagineable reach for + your blogs

+

In my former life as a tech podcaster, I used to switch phones, smartwatches, and tablets with my co-host + for the entire month of January. He was an Android guy and I was all Apple all the time. This was always + an entertaining experiment (to us anyway) and made for many good discussions that you can still watch on + YouTube if you‘ve got some extra time on your hands.

+
+
+ i-blog +
+
+
+
+
+
+ +

Featured Articles

+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+ +
Author name
+ 07-june | 10 min read +
+ +
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+ section 3078 + +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ + + + \ No newline at end of file diff --git a/Blogger-Website-main/blogers website/contact.css b/Blogger-Website-main/blogers website/contact.css new file mode 100644 index 00000000..aa6747cc --- /dev/null +++ b/Blogger-Website-main/blogers website/contact.css @@ -0,0 +1,89 @@ +@import url("https://fonts.googleapis.com/css2?family=Baloo+Bhai+2:wght@400;500&display=swap"); +* { + padding: 0px; + margin: 0px; +} +.navigation { + height: 20vh; + /* background-color: red; */ + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 21px; +} +.left { + display: flex; + font-size: 32px; + font-family: "Baloo Bhai 2", cursive; +} +.left ul { + margin: 0px 84px; + display: flex; + align-items: center; +} +.left ul li { + list-style: none; + margin: 0 2vw; + font-family: "Baloo Bhai 2", cursive; +} +.left ul li a { + font-size: 4vh; + text-decoration: none; + color: black; +} +.left ul li a:hover { + color: rgb(94, 93, 92); +} +.para1 { + font-size: 2rem; + margin-top: -3px; + margin-bottom: 17px; +} +.contact-content { + font-family: "Baloo Bhai 2", cursive; + margin-top: 7px; + + /* background-image: url(../img/man-hands-typing-an-article-on-a-vintage-typewriter-vector.jpg); + opacity: 0.15; */ + height: 80vh; + /* background-color: rgb(198, 198, 226); */ + /* display: flex; */ + position: relative; +} +.contact-content::after { + width: 100%; + height: inherit; + position: absolute; + top: 0px; + content: ""; + background-image: url(../img/man-hands-typing-an-article-on-a-vintage-typewriter-vector.jpg); + opacity: 0.35; + z-index: -1; +} +.form-box { + height: 7.5vh; +} +.form-box input { + height: 4vh; + width: 34vw; +} +.form-box textarea { + height: 24vh; + width: 34vw; +} +.btn-btn-primary { + margin-top: 20vh; + cursor: pointer; +} + +.contact-footer { + display: flex; + justify-content: center; + align-items: center; + height: 10vh; + background-color: beige; +} +.contact-footer p { + padding-right: 7px; + margin-bottom: 0px; +} diff --git a/Blogger-Website-main/blogers website/contact.html b/Blogger-Website-main/blogers website/contact.html new file mode 100644 index 00000000..c8028373 --- /dev/null +++ b/Blogger-Website-main/blogers website/contact.html @@ -0,0 +1,61 @@ + + + + + + + + Contact Form + + + + + + + + +
+
+

Contact Us

+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/Blogger-Website-main/blogers website/css/style.css b/Blogger-Website-main/blogers website/css/style.css new file mode 100644 index 00000000..cbb835fe --- /dev/null +++ b/Blogger-Website-main/blogers website/css/style.css @@ -0,0 +1,63 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + text-decoration: none; +} +.navbar{ + position: fixed; + width: 100%; + z-index: 999; + padding: 30px 0; + transition: all 0.3s ease; + background-color:black ; +} +.navbar.sticky{ + padding: 15px 0; + background: crimson; +} +.navbar .logo a{ + color: #fff; + font-size: 35px; + font-weight: 600; +} +.navbar .logo a span{ + color: crimson; + transition: all 0.3s ease; +} + +.navbar .left{ + display: flex; + align-items: center; + justify-content: space-between; +} +.navbar .menu li{ + list-style: none; + display: inline-block; +} +.navbar .menu li a{ + display: block; + color: #f7f4f4; + font-size: 18px; + font-weight: 500; + margin-left: 25px; + transition: color 0.3s ease; +} +.navbar .menu li a:hover{ + color: crimson; +} +.navbar.sticky .menu li a:hover{ + color: #f8f3f3; +} +/* menu btn styling */ +.menu-btn{ + color: #f7f4f4; + font-size: 23px; + cursor: pointer; + display: none; +} +.left{ + max-width: 1300px; + padding: 0 80px; + margin: auto; +} \ No newline at end of file diff --git a/Blogger-Website-main/blogers website/img/Author_Singgle-01_generated.jpg b/Blogger-Website-main/blogers website/img/Author_Singgle-01_generated.jpg new file mode 100644 index 00000000..75a1e09d Binary files /dev/null and b/Blogger-Website-main/blogers website/img/Author_Singgle-01_generated.jpg differ diff --git a/Blogger-Website-main/blogers website/img/concept top angle view desktop laptop smartphone tablet newspaper office stuff horizontal copy space.jpg b/Blogger-Website-main/blogers website/img/concept top angle view desktop laptop smartphone tablet newspaper office stuff horizontal copy space.jpg new file mode 100644 index 00000000..ea26b492 Binary files /dev/null and b/Blogger-Website-main/blogers website/img/concept top angle view desktop laptop smartphone tablet newspaper office stuff horizontal copy space.jpg differ diff --git a/Blogger-Website-main/blogers website/img/man-hands-typing-an-article-on-a-vintage-typewriter-vector.jpg b/Blogger-Website-main/blogers website/img/man-hands-typing-an-article-on-a-vintage-typewriter-vector.jpg new file mode 100644 index 00000000..a3463636 Binary files /dev/null and b/Blogger-Website-main/blogers website/img/man-hands-typing-an-article-on-a-vintage-typewriter-vector.jpg differ diff --git a/Blogger-Website-main/blogers website/responsive.css b/Blogger-Website-main/blogers website/responsive.css new file mode 100644 index 00000000..97d4a704 --- /dev/null +++ b/Blogger-Website-main/blogers website/responsive.css @@ -0,0 +1,35 @@ +@media screen and (max-width: 1220px) { + .navigation { + flex-direction: column; + } + .left { + flex-direction: column; + text-align: center; + } + .content-right { + display: none; + } + .content { + height: 100%; + } + .home-article { + align-items: center; + flex-direction: column; + } + .home-article-img { + text-align: center; + justify-content: center; + } + .form-box input { + width: 50vw; + } + .form-box textarea { + width: 50vw; + } + .para1 { + margin-top: 3vh; + } + .forms-input { + width: 50%; + } +} diff --git a/Blogger-Website-main/blogers website/search.html b/Blogger-Website-main/blogers website/search.html new file mode 100644 index 00000000..2e72d4d7 --- /dev/null +++ b/Blogger-Website-main/blogers website/search.html @@ -0,0 +1,119 @@ + + + + + + + + I - blog + + + + + + + +
+
+
+
+ +

Search Results for Django (0.03 seconds)

+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+ +
Author name
+ 07-june | 10 min read +
+ +
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ article +
+ +

Lorem ipsum dolor sit amet consectetur adipisicing elit.

+
+
Author name
+ 07-june | 10 min read +
+
+
+ + + + \ No newline at end of file diff --git a/Bootstrap Portfolio/Images/Coding Bench 2.jpg b/Bootstrap Portfolio/Images/Coding Bench 2.jpg new file mode 100644 index 00000000..acf32310 Binary files /dev/null and b/Bootstrap Portfolio/Images/Coding Bench 2.jpg differ diff --git a/Bootstrap Portfolio/Images/Coding Bench.jpg b/Bootstrap Portfolio/Images/Coding Bench.jpg new file mode 100644 index 00000000..57e9e56f Binary files /dev/null and b/Bootstrap Portfolio/Images/Coding Bench.jpg differ diff --git a/Bootstrap Portfolio/Images/Contact Me.jfif b/Bootstrap Portfolio/Images/Contact Me.jfif new file mode 100644 index 00000000..c8b1f47b Binary files /dev/null and b/Bootstrap Portfolio/Images/Contact Me.jfif differ diff --git a/Bootstrap Portfolio/Images/Designer.jpg b/Bootstrap Portfolio/Images/Designer.jpg new file mode 100644 index 00000000..5a08f1cc Binary files /dev/null and b/Bootstrap Portfolio/Images/Designer.jpg differ diff --git a/Bootstrap Portfolio/Images/Filmmaker.png b/Bootstrap Portfolio/Images/Filmmaker.png new file mode 100644 index 00000000..64e12683 Binary files /dev/null and b/Bootstrap Portfolio/Images/Filmmaker.png differ diff --git a/Bootstrap Portfolio/Images/Photographer.jpg b/Bootstrap Portfolio/Images/Photographer.jpg new file mode 100644 index 00000000..ef574a1a Binary files /dev/null and b/Bootstrap Portfolio/Images/Photographer.jpg differ diff --git a/Bootstrap Portfolio/Images/Profile-Photo.jpg b/Bootstrap Portfolio/Images/Profile-Photo.jpg new file mode 100644 index 00000000..67a5f606 Binary files /dev/null and b/Bootstrap Portfolio/Images/Profile-Photo.jpg differ diff --git a/Bootstrap Portfolio/Images/Signature.jpg b/Bootstrap Portfolio/Images/Signature.jpg new file mode 100644 index 00000000..fd32e87f Binary files /dev/null and b/Bootstrap Portfolio/Images/Signature.jpg differ diff --git a/Bootstrap Portfolio/Images/icons8-portfolio-48.png b/Bootstrap Portfolio/Images/icons8-portfolio-48.png new file mode 100644 index 00000000..8c33b425 Binary files /dev/null and b/Bootstrap Portfolio/Images/icons8-portfolio-48.png differ diff --git a/Bootstrap Portfolio/README.md b/Bootstrap Portfolio/README.md new file mode 100644 index 00000000..07ee2f27 --- /dev/null +++ b/Bootstrap Portfolio/README.md @@ -0,0 +1,57 @@ +# myPortfolioSite +This is my personal Portfolio site desinged by me. + +## Table of Contents + +- [Getting Started](#getting-started) +- [Projects](#projects) +- [Contributing](#contributing) +- [License](#license) + +## Getting Started + +To get started with this repository, follow these steps: + +1. Clone the repository to your local machine using the following command: + + ```bash + git clone {{repository-url}} + ``` + +2. Explore the repository and its contents to find the simple JavaScript projects that have been uploaded. + +3. Each project will have its own directory containing the necessary files and instructions to run the project. + +4. Follow the instructions provided in the project's `README.md` file to set up and run the project on your local machine. + +## Contributing + +Contributions to this repository are welcome! If you have a simple JavaScript project that you would like to share, please follow these steps: + +1. Fork the repository and clone it to your local machine. + +2. Create a new branch for your contribution: + + ```bash + git checkout -b {{branch-name}} + ``` + +3. Add your project to the repository. Make sure to include all the necessary files and instructions to run the project. + +4. Commit your changes with descriptive commit messages. + +5. Push your changes to your forked repository: + + ```bash + git push origin {{branch-name}} + ``` + +6. Open a pull request on the main repository and provide a detailed description of your project. + +Your project will be reviewed, and once approved, it will be merged into the main repository. + +## License + +This repository is licensed under the [MIT License](LICENSE). Feel free to use the code and resources for personal or commercial purposes. + + diff --git a/Bootstrap Portfolio/index.html b/Bootstrap Portfolio/index.html new file mode 100644 index 00000000..d0465650 --- /dev/null +++ b/Bootstrap Portfolio/index.html @@ -0,0 +1,171 @@ + + + + + + + + Sohail + + + + + + + + + + + + + +
+
+
+
+

I'm

+

Sohail

+
A Programmer Cum Photographer
+
+
+ Coding Bench +
+
+
+
+ + +
+
+ +

Hello

+
+

I am a versatile creative professional, weaving the digital realm with my + skills. A + programmer and coder by nature, I find solace in crafting intricate websites and designs. My lens + captures not just moments but stories as a photographer and cinematographer, adding depth to my + creative narrative.

+
+
+
+ + +
+
+
+

My Skills

+
+
+
+ Designer Image +
+
+

Design & Development

+

+ I'm a boundary-pushing designer and developer, seamlessly blending creativity and code. With a + knack + for crafting captivating aesthetics, I breathe life into a wide spectrum of design + possibilities. +

+
+
+
+
+ Photographer Image +
+
+

Photographer

+

+ Beyond design and code, my lens tells compelling stories. A seasoned photographer, I capture + emotions and moments, infusing my work with a cinematic touch that leaves an indelible + impression. +

+
+
+
+
+ Cinematographer Image +
+
+

Cinematographer

+

+ As a skilled cinematographer, I transform visions into dynamic realities. Through lens and + motion, I + create immersive narratives, orchestrating light, angles, and motion to evoke powerful emotions + and + convey unforgettable tales. +

+
+
+
+
+ + +
+
+ contact me image +

Get In Touch

+

+ Feel free to reach out to me through the provided contact details. Whether you have questions, ideas, or + just want to connect, I'm here to listen and engage in meaningful conversations. Let's connect and + explore together. +

+ +
+
+ + +
+ +
+ + diff --git a/Bootstrap Portfolio/style.css b/Bootstrap Portfolio/style.css new file mode 100644 index 00000000..2d073619 --- /dev/null +++ b/Bootstrap Portfolio/style.css @@ -0,0 +1,43 @@ +.intro-div{ + width: 100%; + background-color: #A4CF5B; +} +.first-text{ + letter-spacing: 2px; + font-family: 'Domine', serif; + font-size: 25px; +} + +.Sohail-text{ + font-family: 'Caveat', cursive; + letter-spacing: 5px; + font-size: 50px; +} + +.intro-line{ + letter-spacing: 3px; + color: #3B3935; +} +.rounded-image{ + border-radius: 50%; +} + +.hero-color{ + background-color: #F3FDE8; +} + +.brown-text{ + letter-spacing: 2px; + font-family: 'Domine', serif; + color: #D39149; +} +.sarif-text{ + font-family: 'Domine', serif; +} +.green-text{ + color: #809F46; + font-family: 'Caveat'; +} +.footer-bg{ + background-color: black; +} \ No newline at end of file diff --git a/Chess/Output (1).png b/Chess/Output (1).png new file mode 100644 index 00000000..c3d8a29d Binary files /dev/null and b/Chess/Output (1).png differ diff --git a/Chess/Output (2).png b/Chess/Output (2).png new file mode 100644 index 00000000..f809b9e3 Binary files /dev/null and b/Chess/Output (2).png differ diff --git a/Chess/chess.py b/Chess/chess.py new file mode 100644 index 00000000..6845f869 --- /dev/null +++ b/Chess/chess.py @@ -0,0 +1,230 @@ +# Game of chess in python programming language + + +import itertools +WHITE = "white" +BLACK = "black" + +class Game: + #ive decided since the number of pieces is capped but the type of pieces is not (pawn transformations), I've already coded much of the modularity to support just using a dictionary of pieces + def __init__(self): + self.playersturn = BLACK + self.message = "this is where prompts will go" + self.gameboard = {} + self.placePieces() + print("chess program. enter moves in algebraic notation separated by space") + self.main() + + + def placePieces(self): + + for i in range(0,8): + self.gameboard[(i,1)] = Pawn(WHITE,uniDict[WHITE][Pawn],1) + self.gameboard[(i,6)] = Pawn(BLACK,uniDict[BLACK][Pawn],-1) + + placers = [Rook,Knight,Bishop,Queen,King,Bishop,Knight,Rook] + + for i in range(0,8): + self.gameboard[(i,0)] = placers[i](WHITE,uniDict[WHITE][placers[i]]) + self.gameboard[((7-i),7)] = placers[i](BLACK,uniDict[BLACK][placers[i]]) + placers.reverse() + + + def main(self): + + while True: + self.printBoard() + print(self.message) + self.message = "" + startpos,endpos = self.parseInput() + try: + target = self.gameboard[startpos] + except: + self.message = "could not find piece; index probably out of range" + target = None + + if target: + print("found "+str(target)) + if target.Color != self.playersturn: + self.message = "you aren't allowed to move that piece this turn" + continue + if target.isValid(startpos,endpos,target.Color,self.gameboard): + self.message = "that is a valid move" + self.gameboard[endpos] = self.gameboard[startpos] + del self.gameboard[startpos] + self.isCheck() + if self.playersturn == BLACK: + self.playersturn = WHITE + else : self.playersturn = BLACK + else : + self.message = "invalid move" + str(target.availableMoves(startpos[0],startpos[1],self.gameboard)) + print(target.availableMoves(startpos[0],startpos[1],self.gameboard)) + else : self.message = "there is no piece in that space" + + def isCheck(self): + #ascertain where the kings are, check all pieces of opposing color against those kings, then if either get hit, check if its checkmate + king = King + kingDict = {} + pieceDict = {BLACK : [], WHITE : []} + for position,piece in self.gameboard.items(): + if type(piece) == King: + kingDict[piece.Color] = position + print(piece) + pieceDict[piece.Color].append((piece,position)) + #white + if self.canSeeKing(kingDict[WHITE],pieceDict[BLACK]): + self.message = "White player is in check" + if self.canSeeKing(kingDict[BLACK],pieceDict[WHITE]): + self.message = "Black player is in check" + + + def canSeeKing(self,kingpos,piecelist): + #checks if any pieces in piece list (which is an array of (piece,position) tuples) can see the king in kingpos + for piece,position in piecelist: + if piece.isValid(position,kingpos,piece.Color,self.gameboard): + return True + + def parseInput(self): + try: + a,b = input().split() + a = ((ord(a[0])-97), int(a[1])-1) + b = (ord(b[0])-97, int(b[1])-1) + print(a,b) + return (a,b) + except: + print("error decoding input. please try again") + return((-1,-1),(-1,-1)) + + """def validateInput(self, *kargs): + for arg in kargs: + if type(arg[0]) is not type(1) or type(arg[1]) is not type(1): + return False + return True""" + + def printBoard(self): + print(" 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |") + for i in range(0,8): + print("-"*32) + print(chr(i+97),end="|") + for j in range(0,8): + item = self.gameboard.get((i,j)," ") + print(str(item)+' |', end = " ") + print() + print("-"*32) + + + + """game class. contains the following members and methods: + two arrays of pieces for each player + 8x8 piece array with references to these pieces + a parse function, which turns the input from the user into a list of two tuples denoting start and end points + a checkmateExists function which checks if either players are in checkmate + a checkExists function which checks if either players are in check (woah, I just got that nonsequitur) + a main loop, which takes input, runs it through the parser, asks the piece if the move is valid, and moves the piece if it is. if the move conflicts with another piece, that piece is removed. ischeck(mate) is run, and if there is a checkmate, the game prints a message as to who wins + """ + +class Piece: + + def __init__(self,color,name): + self.name = name + self.position = None + self.Color = color + def isValid(self,startpos,endpos,Color,gameboard): + if endpos in self.availableMoves(startpos[0],startpos[1],gameboard, Color = Color): + return True + return False + def __repr__(self): + return self.name + + def __str__(self): + return self.name + + def availableMoves(self,x,y,gameboard): + print("ERROR: no movement for base class") + + def AdNauseum(self,x,y,gameboard, Color, intervals): + """repeats the given interval until another piece is run into. + if that piece is not of the same color, that square is added and + then the list is returned""" + answers = [] + for xint,yint in intervals: + xtemp,ytemp = x+xint,y+yint + while self.isInBounds(xtemp,ytemp): + #print(str((xtemp,ytemp))+"is in bounds") + + target = gameboard.get((xtemp,ytemp),None) + if target is None: answers.append((xtemp,ytemp)) + elif target.Color != Color: + answers.append((xtemp,ytemp)) + break + else: + break + + xtemp,ytemp = xtemp + xint,ytemp + yint + return answers + + def isInBounds(self,x,y): + "checks if a position is on the board" + if x >= 0 and x < 8 and y >= 0 and y < 8: + return True + return False + + def noConflict(self,gameboard,initialColor,x,y): + "checks if a single position poses no conflict to the rules of chess" + if self.isInBounds(x,y) and (((x,y) not in gameboard) or gameboard[(x,y)].Color != initialColor) : return True + return False + + +chessCardinals = [(1,0),(0,1),(-1,0),(0,-1)] +chessDiagonals = [(1,1),(-1,1),(1,-1),(-1,-1)] + +def knightList(x,y,int1,int2): + """sepcifically for the rook, permutes the values needed around a position for noConflict tests""" + return [(x+int1,y+int2),(x-int1,y+int2),(x+int1,y-int2),(x-int1,y-int2),(x+int2,y+int1),(x-int2,y+int1),(x+int2,y-int1),(x-int2,y-int1)] +def kingList(x,y): + return [(x+1,y),(x+1,y+1),(x+1,y-1),(x,y+1),(x,y-1),(x-1,y),(x-1,y+1),(x-1,y-1)] + + + +class Knight(Piece): + def availableMoves(self,x,y,gameboard, Color = None): + if Color is None : Color = self.Color + return [(xx,yy) for xx,yy in knightList(x,y,2,1) if self.noConflict(gameboard, Color, xx, yy)] + +class Rook(Piece): + def availableMoves(self,x,y,gameboard ,Color = None): + if Color is None : Color = self.Color + return self.AdNauseum(x, y, gameboard, Color, chessCardinals) + +class Bishop(Piece): + def availableMoves(self,x,y,gameboard, Color = None): + if Color is None : Color = self.Color + return self.AdNauseum(x, y, gameboard, Color, chessDiagonals) + +class Queen(Piece): + def availableMoves(self,x,y,gameboard, Color = None): + if Color is None : Color = self.Color + return self.AdNauseum(x, y, gameboard, Color, chessCardinals+chessDiagonals) + +class King(Piece): + def availableMoves(self,x,y,gameboard, Color = None): + if Color is None : Color = self.Color + return [(xx,yy) for xx,yy in kingList(x,y) if self.noConflict(gameboard, Color, xx, yy)] + +class Pawn(Piece): + def __init__(self,color,name,direction): + self.name = name + self.Color = color + #of course, the smallest piece is the hardest to code. direction should be either 1 or -1, should be -1 if the pawn is traveling "backwards" + self.direction = direction + def availableMoves(self,x,y,gameboard, Color = None): + if Color is None : Color = self.Color + answers = [] + if (x+1,y+self.direction) in gameboard and self.noConflict(gameboard, Color, x+1, y+self.direction) : answers.append((x+1,y+self.direction)) + if (x-1,y+self.direction) in gameboard and self.noConflict(gameboard, Color, x-1, y+self.direction) : answers.append((x-1,y+self.direction)) + if (x,y+self.direction) not in gameboard and Color == self.Color : answers.append((x,y+self.direction))# the condition after the and is to make sure the non-capturing movement (the only fucking one in the game) is not used in the calculation of checkmate + return answers + +uniDict = {WHITE : {Pawn : "♙", Rook : "♖", Knight : "♘", Bishop : "♗", King : "♔", Queen : "♕" }, BLACK : {Pawn : "♟", Rook : "♜", Knight : "♞", Bishop : "♝", King : "♚", Queen : "♛" }} + +Game() diff --git a/City Finder/index.html b/City Finder/index.html new file mode 100644 index 00000000..53d16121 --- /dev/null +++ b/City Finder/index.html @@ -0,0 +1,92 @@ + + + + + + + Skypeia + + + + + +
+
+ +
+
+ +
+
+

Map +

+ + +
+
+
+
+
+ + + + + +
+
+ + + + + diff --git a/City Finder/script.js b/City Finder/script.js new file mode 100644 index 00000000..2e1bcbcc --- /dev/null +++ b/City Finder/script.js @@ -0,0 +1,64 @@ +const selectElement = (element) => document.querySelector(element); + +selectElement('.mobile-menu').addEventListener('click', () => { + selectElement('header').classList.toggle('active'); +}); + +// ... (previous code) + +document.addEventListener("DOMContentLoaded", function () { + const uttarakhandCenter = [21.146633, 79.088860]; + const map = L.map('map').setView(uttarakhandCenter, 8); + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(map); + + + + const dehradunCoordinates = [21.146633, 79.088860]; + const redIcon = L.icon({ + iconUrl: 'pin.png', // Replace with the actual path to your red pointer PNG + iconSize: [32, 32], + iconAnchor: [16, 32], + popupAnchor: [0, -32] + }); + L.marker(dehradunCoordinates, { icon: redIcon }).addTo(map) + .bindPopup('Dehradun, India') + .openPopup(); + + + + const dehradunCoordinates4 = [2.146633, 9.088860]; + L.marker(dehradunCoordinates4).addTo(map) + .bindPopup('Nagpur, India') + .openPopup(); + + const rishikeshCoordinates = [18.516726, 73.856255]; + L.marker(rishikeshCoordinates).addTo(map) + .bindPopup('Pune, India') + .openPopup(); + + const rishikeshCoordinates2 = [22.719568, 75.857727]; + L.marker(rishikeshCoordinates2).addTo(map) + .bindPopup('Indore, India') + .openPopup(); + + const rishikeshCoordinates3 = [33.738045, 73.084488]; + L.marker(rishikeshCoordinates3).addTo(map) + .bindPopup('Indore, India') + .openPopup(); + + // Add event listener for form submission + document.getElementById('location-form').addEventListener('submit', function (e) { + e.preventDefault(); + + const selectedStation = document.getElementById('station').value; + + if (selectedStation === 'Mussoorie') { + const mussoorieCoordinates = [30.4591, 78.0667]; + map.setView(mussoorieCoordinates, 12); + } + }); +}); + + \ No newline at end of file diff --git a/City Finder/style.css b/City Finder/style.css new file mode 100644 index 00000000..f3b7d0d0 --- /dev/null +++ b/City Finder/style.css @@ -0,0 +1,51 @@ +/* styles.css */ +body { + font-family: Arial, sans-serif; + background-color: #f2f2f2; + margin: 0; + padding: 0; +} +header { + background-color: #333; + color: #fff; + padding: 10px; + text-align: center; +} +.container { + max-width: 800px; + margin: 20px auto; + padding: 20px; + background-color: #fff; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + text-align: center; + /* Improved readability with margin and padding grouped */ + /* margin: 20px auto; */ + /* padding: 20px; */ +} +label { + display: block; + margin-bottom: 10px; +} +input[type="text"] { + width: 100%; + padding: 8px; + margin-bottom: 10px; + border: 1px solid #ccc; + border-radius: 4px; +} +button { + background-color: #333; + color: #fff; + border: none; + padding: 10px 20px; + cursor: pointer; + transition: background-color 0.3s; +} +button:hover { + background-color: #555; +} +#map { + width: 100%; + height: 400px; + margin-top: 20px; +} diff --git a/City Finder/styles.css b/City Finder/styles.css new file mode 100644 index 00000000..ba7f2f8d --- /dev/null +++ b/City Finder/styles.css @@ -0,0 +1,291 @@ +*, +*::before, +*::after{ + margin: 0; + padding: 0; +} + +html{ + font-size: 10px; + font-family:'Raleway',Sans-serif; +} + +a{ + display: block; + text-decoration: none; +} + +.container{ + max-width: 98rem; + margin: 0 auto; + padding: 0 2.2rem; +} + +body { + font-family: Arial, sans-serif; + padding: 0; + background-image: url('Starry Sky.jpg'); + background-size: cover; + background-repeat: no-repeat; + background-attachment: fixed; +} + +h3{ + color: #fff; +} + +header{ + position: fixed; + top: 0; + z-index: 1400; + height: 4.4rem; + width: 100%; + border-bottom: 3px solid rgb(255, 255, 255); + background-color: rgba(0,0,0,.8); + backdrop-filter: blur(0.5rem); +} + +.title{ + border-bottom: 3px solid rgb(255, 255, 255); + width: 108px; +} + +.nav-list{ + list-style: none; + display: flex; + align-items: center; + justify-content: space-between; + margin: 0 -1rem; +} + +.nav-list-mobile{ + display: none; +} + +.nav-link{ + font-size: 1.4rem; + color: #fff; + padding: 0 1rem; +} + +.nav-link:hover{ + color: rgb(51, 255, 0); +} + +.nav-link-home{ + width: 1.6rem; + height: 4.4rem; + background: url(orange\ circle.png) center no-repeat; +} + +.nav-link-insta{ + width: 1.6rem; + height: 4.4rem; + background: url(instagram-logo.svg.svg) center no-repeat; +} + +.nav-link-twitter{ + width: 1.6rem; + height: 4.4rem; + background: url(Twitter-logo.svg.svg) center no-repeat; +} + +@media screen and (max-width:767px){ + header{ + height: 4.8rem; + transition: background .36s cubic-bezier(0.32, 0.08, 0.24, 1); + height: .56s cubic-bezier(0.32, 0.08, 0.24, 1); + } + + header .container{ + padding: 0; + } + + .nav-list{ + margin-top: 0; + } + + .nav-list-mobile{ + display: flex; + } + + .nav-item{ + width: 4.8rem; + height: 4.8rem; + display: flex; + justify-content: center; + } + + .nav-item-hidden{ + display: none; + } + + .mobile-menu{ + position: relative; + z-index: 1500; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + } + + .line{ + position: absolute; + width: 1.7rem; + height: 1px; + background-color: #fff; + transition: margin-top .3192s cubic-bezier(0.04, 0.04, 0.12, 0.96); + } + + .line-top{ + margin-top: 10px; + margin-left: 15px; + } + + .line-middle{ + margin-left: 15px; + } + + .line-bottom{ + margin-top: -1rem; + margin-left: 15px; + } + + .active .line-top{ + margin-top: 0; + transform: rotate(45deg); + transition: transform .3192s .1s cubic-bezier(0.04, 0.04, 0.12, 0.96); + } + + .active .line-bottom{ + margin-top: 0; + transform: rotate(-45deg); + transition: transform .3192s .1s cubic-bezier(0.04, 0.04, 0.12, 0.96); + } + + .active .line-middle{ + display: none; + } + + header.active{ + height: 100%; + background-color: #000; + transition: 0.5s; + } + + .nav-link-home{ + width: 1.8rem; + height: 4.8rem; + position: relative; + z-index: 1500; + } + + .nav-link-insta{ + width: 1.6rem; + height: 4.8rem; + transition: opacity 3s; + } + + .nav{ + position: relative; + } + + .nav-link{ + font-size: 1.7rem; + padding: 0; + margin: auto 0; + } + + .nav-list-larger{ + position: fixed; + top: 0; + left: 0; + width: 0; + height: 0; + display: block; + padding: 10.5rem 5rem; + z-index: 1000; + box-sizing: border-box; + opacity: 0; + visibility: hidden; + transition: opacity .3s; + } + + .active .nav-list-larger{ + width: 100%; + height: 100vh; + opacity: 1; + visibility: visible; + } + + .active .nav-link-insta{ + opacity: 1; + transition: opacity .3s; + } + + .nav-list-larger .nav-item{ + width: 100%; + justify-content: flex-start; + border-bottom: 2px dotted rgb(53, 1, 40); + } + + .nav-list-larger .nth-item:nth-child(6){ + border-bottom: none; + } + + .active .nav-list-larger .nav-item{ + animation: fadeIn 1s ease-in; + } + + @keyframes fadeIn { + from{ + opacity: 0; + } + to{ + opacity: 1; + } + } + + +} + +.Heading{ + margin: 0 auto; + max-width: 1300px; + padding: 100px 20px; + padding-top: 65px; +} + +.title{ + margin-bottom: 25px; +} + +.title h3{ + position: relative; + font-size: 30px; + font-weight: 700; +} + + + + +header { + text-align: center; + color: white; +} + +.map-container { + width: calc(100% - 40px); + height: 650px; + margin: 20px; + border-radius: 20px; + overflow: hidden; +} + +#map { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/ClockProject/Clock.html b/ClockProject/Clock.html new file mode 100644 index 00000000..2f952105 --- /dev/null +++ b/ClockProject/Clock.html @@ -0,0 +1,348 @@ + + + + + + MyClock + + + + + + +
+ + :: + AM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/DRUM-KIT/README.md b/DRUM-KIT/README.md new file mode 100644 index 00000000..d76c97fe --- /dev/null +++ b/DRUM-KIT/README.md @@ -0,0 +1 @@ +# DRUM-KIT \ No newline at end of file diff --git a/DRUM-KIT/a.js b/DRUM-KIT/a.js new file mode 100644 index 00000000..4e262199 --- /dev/null +++ b/DRUM-KIT/a.js @@ -0,0 +1,3 @@ +var a=5; +var b=5; +console.log(a+b); \ No newline at end of file diff --git a/DRUM-KIT/images/crash.png b/DRUM-KIT/images/crash.png new file mode 100644 index 00000000..a992fa0f Binary files /dev/null and b/DRUM-KIT/images/crash.png differ diff --git a/DRUM-KIT/images/kick.png b/DRUM-KIT/images/kick.png new file mode 100644 index 00000000..b64877e7 Binary files /dev/null and b/DRUM-KIT/images/kick.png differ diff --git a/DRUM-KIT/images/snare.png b/DRUM-KIT/images/snare.png new file mode 100644 index 00000000..1e089bac Binary files /dev/null and b/DRUM-KIT/images/snare.png differ diff --git a/DRUM-KIT/images/tom1.png b/DRUM-KIT/images/tom1.png new file mode 100644 index 00000000..855b2111 Binary files /dev/null and b/DRUM-KIT/images/tom1.png differ diff --git a/DRUM-KIT/images/tom2.png b/DRUM-KIT/images/tom2.png new file mode 100644 index 00000000..3e9f3636 Binary files /dev/null and b/DRUM-KIT/images/tom2.png differ diff --git a/DRUM-KIT/images/tom3.png b/DRUM-KIT/images/tom3.png new file mode 100644 index 00000000..762cbf85 Binary files /dev/null and b/DRUM-KIT/images/tom3.png differ diff --git a/DRUM-KIT/images/tom4.png b/DRUM-KIT/images/tom4.png new file mode 100644 index 00000000..e79c49e1 Binary files /dev/null and b/DRUM-KIT/images/tom4.png differ diff --git a/DRUM-KIT/index.html b/DRUM-KIT/index.html new file mode 100644 index 00000000..40faafb1 --- /dev/null +++ b/DRUM-KIT/index.html @@ -0,0 +1,30 @@ + + + + + + Drum Kit + + + + + +

Drum 🥁 Kit

+
+ + + + + + + +
+ + + + + + + diff --git a/DRUM-KIT/index.js b/DRUM-KIT/index.js new file mode 100644 index 00000000..fedab372 --- /dev/null +++ b/DRUM-KIT/index.js @@ -0,0 +1,81 @@ +var numberOfDrumButtons = document.querySelectorAll(".drum").length; + +for (var i = 0; i < numberOfDrumButtons; i++) { + + document.querySelectorAll(".drum")[i].addEventListener("click", function() { + + var buttonInnerHTML = this.innerHTML; + + makeSound(buttonInnerHTML); + + buttonAnimation(buttonInnerHTML); + + }); + +} + +document.addEventListener("keypress", function(event) { + + makeSound(event.key); + + buttonAnimation(event.key); + +}); + + +function makeSound(key) { + + switch (key) { + case "w": + var tom1 = new Audio("sounds/tom-1.mp3"); + tom1.play(); + break; + + case "a": + var tom2 = new Audio("sounds/tom-2.mp3"); + tom2.play(); + break; + + case "s": + var tom3 = new Audio('sounds/tom-3.mp3'); + tom3.play(); + break; + + case "d": + var tom4 = new Audio('sounds/tom-4.mp3'); + tom4.play(); + break; + + case "j": + var snare = new Audio('sounds/snare.mp3'); + snare.play(); + break; + + case "k": + var crash = new Audio('sounds/crash.mp3'); + crash.play(); + break; + + case "l": + var kick = new Audio('sounds/kick-bass.mp3'); + kick.play(); + break; + + + default: console.log(key); + + } +} + + +function buttonAnimation(currentKey) { + + var activeButton = document.querySelector("." + currentKey); + + activeButton.classList.add("pressed"); + + setTimeout(function() { + activeButton.classList.remove("pressed"); + }, 100); + +} diff --git a/DRUM-KIT/sounds/crash.mp3 b/DRUM-KIT/sounds/crash.mp3 new file mode 100644 index 00000000..d5680626 Binary files /dev/null and b/DRUM-KIT/sounds/crash.mp3 differ diff --git a/DRUM-KIT/sounds/kick-bass.mp3 b/DRUM-KIT/sounds/kick-bass.mp3 new file mode 100644 index 00000000..faf06c6c Binary files /dev/null and b/DRUM-KIT/sounds/kick-bass.mp3 differ diff --git a/DRUM-KIT/sounds/snare.mp3 b/DRUM-KIT/sounds/snare.mp3 new file mode 100644 index 00000000..e7cf5b84 Binary files /dev/null and b/DRUM-KIT/sounds/snare.mp3 differ diff --git a/DRUM-KIT/sounds/tom-1.mp3 b/DRUM-KIT/sounds/tom-1.mp3 new file mode 100644 index 00000000..7dc3003d Binary files /dev/null and b/DRUM-KIT/sounds/tom-1.mp3 differ diff --git a/DRUM-KIT/sounds/tom-2.mp3 b/DRUM-KIT/sounds/tom-2.mp3 new file mode 100644 index 00000000..f3c04855 Binary files /dev/null and b/DRUM-KIT/sounds/tom-2.mp3 differ diff --git a/DRUM-KIT/sounds/tom-3.mp3 b/DRUM-KIT/sounds/tom-3.mp3 new file mode 100644 index 00000000..38060330 Binary files /dev/null and b/DRUM-KIT/sounds/tom-3.mp3 differ diff --git a/DRUM-KIT/sounds/tom-4.mp3 b/DRUM-KIT/sounds/tom-4.mp3 new file mode 100644 index 00000000..58b04beb Binary files /dev/null and b/DRUM-KIT/sounds/tom-4.mp3 differ diff --git a/DRUM-KIT/styles.css b/DRUM-KIT/styles.css new file mode 100644 index 00000000..dde8be92 --- /dev/null +++ b/DRUM-KIT/styles.css @@ -0,0 +1,76 @@ +body { + text-align: center; + background-color: #283149; +} + +h1 { + font-size: 5rem; + color: #DBEDF3; + font-family: "Arvo", cursive; + text-shadow: 3px 0 #DA0463; + +} + +footer { + color: #DBEDF3; + font-family: sans-serif; +} + +.w { + background-image: url("images/tom1.png"); +} + +.a { + background-image: url("images/tom2.png"); +} + +.s { + background-image: url("images/tom3.png"); +} + +.d { + background-image: url("images/tom4.png"); +} + +.j { + background-image: url("images/snare.png"); +} + +.k { + background-image: url("images/crash.png"); +} + +.l { + background-image: url("images/kick.png"); +} + +.set { + margin: 10% auto; +} + +.pressed { + box-shadow: 0 3px 4px 0 #DBEDF3; + opacity: 0.5; +} + +.red { + color: red; +} + +.drum { + outline: none; + border: 10px solid #404B69; + font-size: 5rem; + font-family: 'Arvo', cursive; + line-height: 2; + font-weight: 900; + color: #DA0463; + text-shadow: 3px 0 #DBEDF3; + border-radius: 15px; + display: inline-block; + width: 150px; + height: 150px; + text-align: center; + margin: 10px; + background-color: white; +} diff --git a/E-commerce/img/cloud.png b/E-commerce/img/cloud.png new file mode 100644 index 00000000..a1a58a3a Binary files /dev/null and b/E-commerce/img/cloud.png differ diff --git a/E-commerce/index.html b/E-commerce/index.html new file mode 100644 index 00000000..b498f826 --- /dev/null +++ b/E-commerce/index.html @@ -0,0 +1,58 @@ + + + + + + + My Unique E-Commerce Website + + + +
+

Welcome to My Unique E-Commerce Store

+

Discover Amazing Products

+
+
+
+ Product 1 +

Product 1

+

Description of Product 1.

+

Price: ₹600

+ +
+
+ Product 1 +

Product 2

+

Description of Product 2.

+

Price: ₹300

+ +
+
+ Product 1 +

Product 3

+

Description of Product 3.

+

Price: ₹400

+ +
+
+ Product 1 +

Product 4

+

Description of Product 4.

+

Price: ₹500

+ +
+ +
+
+

Your Cart

+ +

Total: $0.00

+
+ + + + diff --git a/E-commerce/script.js b/E-commerce/script.js new file mode 100644 index 00000000..1847ee20 --- /dev/null +++ b/E-commerce/script.js @@ -0,0 +1,44 @@ +// JavaScript for the shopping cart functionality + +const cartItems = document.getElementById("cart-items"); +const cartTotal = document.getElementById("cart-total"); +const addToCartButtons = document.querySelectorAll(".add-to-cart"); + +let cart = []; +let total = 0; + +addToCartButtons.forEach((button) => { + button.addEventListener("click", () => { + const productName = button.getAttribute("data-product"); + const productPrice = parseFloat(button.getAttribute("data-price")); + const productImage = button.getAttribute("data-image"); + + cart.push({ name: productName, price: productPrice, image: productImage }); + total += productPrice; + + updateCart(); + }); +}); + +function updateCart() { + cartItems.innerHTML = ""; + cart.forEach((item, index) => { + const listItem = document.createElement("li"); + listItem.innerHTML = `${item.name} ${item.name} - $${item.price.toFixed(2)} `; + cartItems.appendChild(listItem); + }); + + cartTotal.innerText = total.toFixed(2); + + // Attach click event listeners to delete buttons + const deleteButtons = document.querySelectorAll(".delete-item"); + deleteButtons.forEach((deleteButton) => { + deleteButton.addEventListener("click", () => { + const index = parseInt(deleteButton.getAttribute("data-index"), 10); + const deletedItemPrice = cart[index].price; + cart.splice(index, 1); + total -= deletedItemPrice; + updateCart(); + }); + }); +} diff --git a/E-commerce/styles.css b/E-commerce/styles.css new file mode 100644 index 00000000..fa353dd7 --- /dev/null +++ b/E-commerce/styles.css @@ -0,0 +1,112 @@ +/* General Styles */ +body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + background-color: #f6f6f6; +} + +header { + background-color: #866c9c; + color: #fff; + text-align: center; + padding: 20px; + font-size: 24px; +} + +header p { + font-size: 18px; +} + +/* Product Listings */ +.product-list { + display: flex; + justify-content: space-around; + flex-wrap: wrap; + padding: 20px; +} + +.product { + background-color: #fff; + border: 1px solid #e2e2e2; + border-radius: 5px; + padding: 20px; + margin: 10px; + width: 300px; + text-align: center; + box-shadow: 0px 0px 10px #888888; +} + +.product img { + max-width: 100%; + border-radius: 5px; +} + +button.add-to-cart { + background-color: #00a86b; + color: #fff; + border: none; + padding: 10px 20px; + border-radius: 5px; + cursor: pointer; + font-size: 16px; +} + +button.add-to-cart:hover { + background-color: #007f52; +} + +/* Shopping Cart */ +.cart { + background-color: #fff; + border: 1px solid #e2e2e2; + border-radius: 5px; + padding: 20px; + margin: 20px; + text-align: center; + box-shadow: 0px 0px 10px #888888; +} + +.cart h2 { + font-size: 24px; + margin-bottom: 10px; +} + +#cart-items { + list-style-type: none; + padding: 0; +} + +#cart-items li { + font-size: 16px; + margin: 5px 0; + display: flex; + align-items: center; + position: relative; +} + +#cart-total { + font-size: 18px; + font-weight: bold; +} +#cart-items img { + max-width: 50px; /* Adjust the desired width */ + max-height: 50px; /* Adjust the desired height */ +} + +#cart-items img { + max-width: 50px; /* Adjust the desired width */ + max-height: 50px; /* Adjust the desired height */ + position: relative; + padding-right: 25px; + padding-left: 610px; +} + +#cart-items li button { + margin-left: 10px; +} + +footer { + background-color: #866c9c; + color: #fff; + text-align: center; + padding: 10px; +} \ No newline at end of file diff --git a/Emoji/JS-Game b/Emoji/JS-Game new file mode 160000 index 00000000..7f303c4a --- /dev/null +++ b/Emoji/JS-Game @@ -0,0 +1 @@ +Subproject commit 7f303c4aa1d5230df2fb66b827c108446f5f7c79 diff --git a/Eng_Dictionary/README.md b/Eng_Dictionary/README.md new file mode 100644 index 00000000..9a9c2a9c --- /dev/null +++ b/Eng_Dictionary/README.md @@ -0,0 +1,14 @@ +# Eng_Dictionary +An interactive dictionary UI which provides meanings, synonyms and pronounces the word. + +## features : +* provides meaning, pronunciation and synonyms along with examples. +* a pronunciation button which tells how to pronunce the word. +* clicking on synonym provides the meaning of that word. + +## limitations: +* only one meaning is provided. +* API used has a lot of missing informations. + +## ScreenShort: +![Screenshot (219)](https://github.com/replyre/Eng_Dictionary/assets/121796450/74219858-7bcd-48fa-9b67-dc56a4daedd8) diff --git a/Eng_Dictionary/dictionary.png b/Eng_Dictionary/dictionary.png new file mode 100644 index 00000000..41d5fa56 Binary files /dev/null and b/Eng_Dictionary/dictionary.png differ diff --git a/Eng_Dictionary/index.html b/Eng_Dictionary/index.html new file mode 100644 index 00000000..fc415d6c --- /dev/null +++ b/Eng_Dictionary/index.html @@ -0,0 +1,65 @@ + + + + + + English Dictionary + + + + + + + +
+
English Dictionary
+ +

Type the word and press enter

+ +
+ + + diff --git a/Eng_Dictionary/script.js b/Eng_Dictionary/script.js new file mode 100644 index 00000000..dc94fd84 --- /dev/null +++ b/Eng_Dictionary/script.js @@ -0,0 +1,91 @@ +const wrapper = document.querySelector(".wrapper"); +const searchInput = wrapper.querySelector("input"); +const infoText = wrapper.querySelector(".info-text"); +const synonyms = wrapper.querySelector(".synonyms .list"); +const volumeIcon = wrapper.querySelector(".word i"); +const removeIcon = wrapper.querySelector(".search span"); +let audio; + +function data(result, word) { + wrapper.classList.remove("active"); + wrapper.offsetWidth; + if (result.title) { + infoText.innerHTML = `Can't find the meaning of ${word}. Please search another word.`; + } else { + wrapper.classList.add("active"); + document.querySelector(".word p").innerText = result[0].word; + phonetics = ""; + if (result[0].phonetics[0] !== undefined) + phonetics = result[0].phonetics[0].text; + document.querySelector( + ".word span" + ).innerText = `${result[0].meanings[0].partOfSpeech} ${phonetics}`; + document.querySelector(".meaning span").innerText = + result[0].meanings[0].definitions[0].definition.split(";")[0]; + document.querySelector(".example span").innerText = + result[0].meanings[0].definitions[0].example || "Not Available"; + + audio = new Audio(result[0].phonetics[0].audio); + if (result[0].meanings[0].synonyms.length === 0) { + synonyms.parentElement.style.display = "none"; + } else synonyms.parentElement.style.display = "block"; + + synonyms.innerHTML = ""; + for (let i = 0; i < 5; i++) { + let tag = `${result[0].meanings[0].synonyms[i] || ""}`; + + synonyms.insertAdjacentHTML("beforeend", tag); + } + } +} + +function fetchAPI(word) { + wrapper.classList.remove("active"); + infoText.style.cssText = " padding: 12px; color:black"; + infoText.innerHTML = `Searching the meaning of ${word}`; + let url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; + + fetch(url) + .then((res) => res.json()) + .catch((error) => { + infoText.style.color = "red"; + infoText.innerHTML = "Something went wrong.
Error: " + error.message; + }) + .then((result) => data(result, word)); +} + +searchInput.addEventListener("keyup", (e) => { + if (e.key === "Enter" && e.target.value) { + fetchAPI(e.target.value); + } +}); + +volumeIcon.addEventListener("click", () => { + if (audio.attributes[1].nodeValue.length === 0) { + no_audio1 = new Audio( + "https://api.dictionaryapi.dev/media/pronunciations/en/not-us.mp3" + ); + no_audio2 = new Audio( + "https://api.dictionaryapi.dev/media/pronunciations/en/available-us.mp3" + ); + no_audio1.play(); + setTimeout(() => { + no_audio2.play(); + }, 150); + } else audio.play(); +}); + +function search(word) { + searchInput.value = word; + fetchAPI(word); +} + +removeIcon.addEventListener("click", () => { + searchInput.value = ""; + searchInput.focus(); + wrapper.classList.remove("active"); + infoText.innerHTML = "Type the word and press enter"; + infoText.style.cssText = " padding: 0px; color:#9a9a9a"; +}); diff --git a/Eng_Dictionary/styles.css b/Eng_Dictionary/styles.css new file mode 100644 index 00000000..db138622 --- /dev/null +++ b/Eng_Dictionary/styles.css @@ -0,0 +1,167 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200&display=swap"); + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: "Poppins", sans-serif; + font-weight: bold; +} + +body { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + background-image: linear-gradient(to top left, lightblue, cyan, lightblue); +} + +.wrapper { + width: 420px; + background-color: rgba(255, 255, 255, 0.7); + border-radius: 20px; + padding: 28px 28px 45px; +} + +.wrapper header { + font-size: 28px; + font-weight: 500; + font-family: monospace; + text-align: center; +} + +.wrapper .search { + position: relative; + margin: 35px 0 18px; +} + +.search input { + height: 53px; + width: 100%; + font-size: 16px; + outline: none; + padding: 0 42px; + border: 1px solid #999; + border-radius: 5px; +} +.search input:focus { + padding: 0 41px; + border: 2px solid black; +} + +.search input::placeholder { + color: #b8b8b8; +} +.search :where(i, span) { + position: absolute; + top: 50%; + color: #999; + transform: translateY(-50%); +} + +.search i { + left: 18px; + font-size: 16px; + pointer-events: none; +} +.search input:focus ~ i { + color: rgb(35, 182, 231); +} +.search span { + right: 15px; + font-size: 1; + cursor: pointer; + display: none; +} + +.search input:valid ~ span { + display: block; +} + +.wrapper .info-text { + position: relative; + font-size: 12px; + color: #9a9a9a; + top: -15px; + left: 15px; +} +.wrapper.active .info-text { + display: none; +} +.info-text span { + font-weight: bold; +} + +.wrapper ul li { + display: flex; + margin-bottom: 14px; + padding-bottom: 17px; + border-bottom: 1px solid #ccc; + align-items: center; + justify-content: space-between; +} + +.wrapper ul { + height: 0; + opacity: 0; + overflow: hidden; + transition: all 0.2s ease; +} + +.wrapper.active ul { + height: fit-content; + opacity: 1; +} +ul li:last-child { + margin: 0px; + padding: 0px; + border-bottom: 0px; +} +ul .word p { + font-size: 22px; + font-weight: bold; +} + +ul .word span { + font-size: 12px; + color: #6f6e6e; + font-style: italic; +} + +ul .word i { + cursor: pointer; + font-size: 15px; + color: #999; +} + +.content li .details { + padding-left: 10px; + border-radius: 4px 0 0 4px; + border-left: 3px solid rgb(35, 182, 231); +} + +.content li .details p { + font-size: 17px; + font-weight: bolder; +} +.content li .details span { + font-size: 15px; + font-weight: 500; +} + +.content li .details span { + display: block; + max-height: 45px; + overflow: scroll; +} + +.synonyms .details .list { + display: flex; + flex-wrap: wrap; + gap: 5px; + text-decoration: underline; +} + +.synonyms .details .list span { + cursor: pointer; +} diff --git a/ExpenseTrackerApp/YoungSerif-Regular.ttf b/ExpenseTrackerApp/YoungSerif-Regular.ttf new file mode 100644 index 00000000..f454fbed Binary files /dev/null and b/ExpenseTrackerApp/YoungSerif-Regular.ttf differ diff --git a/ExpenseTrackerApp/favicon.ico b/ExpenseTrackerApp/favicon.ico new file mode 100644 index 00000000..08a19a25 Binary files /dev/null and b/ExpenseTrackerApp/favicon.ico differ diff --git a/ExpenseTrackerApp/index.html b/ExpenseTrackerApp/index.html new file mode 100644 index 00000000..d6ab0db1 --- /dev/null +++ b/ExpenseTrackerApp/index.html @@ -0,0 +1,53 @@ + + + + + + + + + Expense Tracker App + + +

Expense Tracker App

+
+ + + + + + + +
+
+

Expenses List

+ + + + + + + + + + + + + + + + + + + + +
CategoryAmountDateDelete
Total:
+
+ + + \ No newline at end of file diff --git a/ExpenseTrackerApp/script.js b/ExpenseTrackerApp/script.js new file mode 100644 index 00000000..c0e33759 --- /dev/null +++ b/ExpenseTrackerApp/script.js @@ -0,0 +1,84 @@ +let expenses = []; +let totalAmount = 0; + +const categorySelect = document.getElementById('category-select'); +const amountInput = document.getElementById('amount-input'); +const dateInput = document.getElementById('date-input'); +const addBtn = document.getElementById('add-btn'); +const expensesTableBody = document.getElementById('expnese-table-body'); +const totalAmountCell = document.getElementById('total-amount'); + +addBtn.addEventListener('click', function() { + const category = categorySelect.value; + const amount = Number(amountInput.value); + const date = dateInput.value; + + if (category === '') { + alert('Please select a category'); + return; + } + if (isNaN(amount) || amount <=0 ) { + alert('Please enter a valid amount') + return; + } + if(date === '') { + alert('Please select a date') + return; + } + expenses.push({category, amount, date}); + + totalAmount += amount; + totalAmountCell.textContent = totalAmount; + + const newRow = expensesTableBody.insertRow(); + + const categoryCell = newRow.insertCell(); + const amountCell = newRow.insertCell(); + const dateCell = newRow.insertCell(); + const deleteCell = newRow.insertCell(); + const deleteBtn = document.createElement('button'); + + deleteBtn.textContent = 'Delete'; + deleteBtn.classList.add('delete-btn'); + deleteBtn.addEventListener('click', function() { + expenses.splice(expenses.indexOf(expense), 1); + + totalAmount -= expense.amount; + totalAmountCell.textContent = totalAmount; + + expensesTableBody.removeChild(newRow); + }); + + const expense = expenses[expenses.length - 1]; + categoryCell.textContent = expense.category; + amountCell.textContent = expense.amount; + dateCell.textContent = expense.date; + deleteCell.appendChild(deleteBtn); + +}); + +for (const expense of expenses) { + totalAmount += expense.amount; + totalAmountCell.textContent = totalAmount; + + const newRow = expensesTableBody.inserRow(); + const categoryCell = newRow.insertCell(); + const amountCell = newRow.insertCell(); + const dateCell = newRow.insertCell(); + const deleteCell = newRow.insertCell(); + const deleteBtn = document.createElement('button'); + deleteBtn.textContent = 'Delete'; + deleteBtn.classList.add('delete-btn'); + deleteBtn.addEventListener('click', function() { + expenses.splice(expenses.indexOf(expense), 1); + + totalAmount -= expense.amount; + totalAmountCell.textContent = totalAmount; + + expensesTableBody.removeChild(newRow); + }); + categoryCell.textContent = expense.category; + amountCell.textContent = expense.amount; + dateCell.textContent = expense.date; + deleteCell.appendChild(deleteBtn); +} \ No newline at end of file diff --git a/ExpenseTrackerApp/style.css b/ExpenseTrackerApp/style.css new file mode 100644 index 00000000..38b0452f --- /dev/null +++ b/ExpenseTrackerApp/style.css @@ -0,0 +1,110 @@ +body, h1, h2, p, ul, li, table, th, td { + margin: 0; + padding: 0; + list-style: none; +} + +body { + font-family: Arial, sans-serif; + background-color: #caedf2; + margin: 0; + padding: 0; +} + +/* Header Styles */ +h1 { + background-color: #007BFF; + color: #fff; + text-align: center; + padding: 20px 0; +} + +/* Input Section Styles */ +.input-section { + background-color: #fff; + border-radius: 5px; + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1); + padding: 20px; + margin: 20px auto; + max-width: 600px; + text-align: center; +} + +.input-section label { + display: block; + margin-bottom: 10px; +} + +#category-select, +#amount-input, +#date-input, +#add-btn { + width: 100%; + padding: 10px; + margin-bottom: 20px; + border: 1px solid #ccc; + border-radius: 5px; +} + +#category-select { + background-color: #f0f0f0; +} + +#add-btn { + background-color: #007BFF; + color: #fff; + cursor: pointer; + transition: background-color 0.3s ease; +} + +#add-btn:hover { + background-color: #0056b3; +} + +/* Expenses List Styles */ +.expenses-list { + background-color: #fff; + border-radius: 5px; + box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1); + padding: 20px; + margin: 20px auto; + max-width: 600px; +} + +.expenses-list h2 { + background-color: #007BFF; + color: #fff; + padding: 10px 0; + text-align: center; + margin-bottom: 20px; +} + +table { + width: 100%; + border-collapse: collapse; +} + +table th, +table td { + padding: 12px; + text-align: center; + border-bottom: 1px solid #ddd; +} + +table th { + background-color: #007BFF; + color: #fff; +} + +#total-amount { + font-weight: bold; + font-size: 1.2em; +} + +/* Responsive Styles */ +@media screen and (max-width: 768px) { + .input-section, .expenses-list { + width: 90%; + margin: 20px auto; + } +} diff --git a/GoogleAuthFirebase/index.html b/GoogleAuthFirebase/index.html new file mode 100644 index 00000000..19a4bc1c --- /dev/null +++ b/GoogleAuthFirebase/index.html @@ -0,0 +1,91 @@ + + + + + + Document + + + + + +
+

you have sign in as With the email

+ +
+ + + + + + diff --git a/GoogleAuthFirebase/script.js b/GoogleAuthFirebase/script.js new file mode 100644 index 00000000..8471fa38 --- /dev/null +++ b/GoogleAuthFirebase/script.js @@ -0,0 +1,24 @@ +// function onSignIn(googleUser) { +// var profile = googleUser.getBasicProfile(); +// $("#name").text(profile.getName()); +// $("#email").text(profile.getEmail()); +// $("#image").attr('src',profile.getImageUrl()); +// $(".data").css("display","block"); +// $(".g-signin2").css("display","block"); +// } + + +// function signin() { +// let oauth2Endpoint = "https://accounts.com/o/oauth2/v2/auth" + +// let form = document.createElement('form') +// form.setAttribute('methode', 'GET') +// form.setAttribute('action',oauth2Endpoint) + +// let params ={ +// "client_id":"", +// "redirect_uri":"", +// "response_type":"token", +// "scope": + +// }; diff --git a/GoogleAuthFirebase/style1.css b/GoogleAuthFirebase/style1.css new file mode 100644 index 00000000..2da0ab1b --- /dev/null +++ b/GoogleAuthFirebase/style1.css @@ -0,0 +1,10 @@ +.data{ + display: none; +} +.g-signin2{ + position: absolute; + top: 50%; + left: 50%; + margin-top: -50%; + margin-left: -50%; +} \ No newline at end of file diff --git a/Hangman Game/README.md b/Hangman Game/README.md new file mode 100644 index 00000000..5f028543 --- /dev/null +++ b/Hangman Game/README.md @@ -0,0 +1,23 @@ +# Hangman Game + +Hangman Game is a classic word-guessing game where players attempt to guess a hidden word by suggesting letters within a limited number of attempts. The game is both entertaining and challenging, making it a popular choice for honing vocabulary and problem-solving skills. + +## How to Play + +1. A secret word is chosen, and its letters are represented by underscores (_). +2. The player guesses one letter at a time. +3. If the guessed letter is in the secret word, all instances of that letter are revealed. +4. If the guessed letter is not in the secret word, a part of the "hangman" figure is drawn. +5. The player wins by guessing the entire word before the hangman is completely drawn. +6. The player loses if the hangman figure is fully drawn before the word is guessed. + +## Features + +- Simple and intuitive gameplay. +- Interactive interface for guessing letters. +- Visual representation of the hangman's progress. +- Randomly selected words for replayability. +- Limited attempts to add challenge. + +Enjoy the challenge of word guessing in the Hangman Game! Test your linguistic skills and have fun trying to outsmart the game. + diff --git a/Hangman Game/images/hangman-0.svg b/Hangman Game/images/hangman-0.svg new file mode 100644 index 00000000..1e7cd8b3 --- /dev/null +++ b/Hangman Game/images/hangman-0.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Hangman Game/images/hangman-1.svg b/Hangman Game/images/hangman-1.svg new file mode 100644 index 00000000..e5496350 --- /dev/null +++ b/Hangman Game/images/hangman-1.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Hangman Game/images/hangman-2.svg b/Hangman Game/images/hangman-2.svg new file mode 100644 index 00000000..a0a3a653 --- /dev/null +++ b/Hangman Game/images/hangman-2.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Hangman Game/images/hangman-3.svg b/Hangman Game/images/hangman-3.svg new file mode 100644 index 00000000..c605f933 --- /dev/null +++ b/Hangman Game/images/hangman-3.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Hangman Game/images/hangman-4.svg b/Hangman Game/images/hangman-4.svg new file mode 100644 index 00000000..e23445a5 --- /dev/null +++ b/Hangman Game/images/hangman-4.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Hangman Game/images/hangman-5.svg b/Hangman Game/images/hangman-5.svg new file mode 100644 index 00000000..2a60dd56 --- /dev/null +++ b/Hangman Game/images/hangman-5.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Hangman Game/images/hangman-6.svg b/Hangman Game/images/hangman-6.svg new file mode 100644 index 00000000..c8a6a740 --- /dev/null +++ b/Hangman Game/images/hangman-6.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Hangman Game/images/lost.gif b/Hangman Game/images/lost.gif new file mode 100644 index 00000000..3ea3e4f6 Binary files /dev/null and b/Hangman Game/images/lost.gif differ diff --git a/Hangman Game/images/victory.gif b/Hangman Game/images/victory.gif new file mode 100644 index 00000000..b460d31b Binary files /dev/null and b/Hangman Game/images/victory.gif differ diff --git a/Hangman Game/index.html b/Hangman Game/index.html new file mode 100644 index 00000000..b9c6fc09 --- /dev/null +++ b/Hangman Game/index.html @@ -0,0 +1,47 @@ + + + + + + + + + + + Hangman + + + +
+
+ gif +

Game Over!

+

The correct word was: RAINBOW

+ +
+
+ + +
+
+ hangman image +

Hangman Game

+
+ +
+
    +

    + Hint: + Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ut, nam. +

    + +

    Incorrect guesses: 0/6

    +
    + +
    + + + + + + diff --git a/Hangman Game/scripts/script.js b/Hangman Game/scripts/script.js new file mode 100644 index 00000000..9a08b7c7 --- /dev/null +++ b/Hangman Game/scripts/script.js @@ -0,0 +1,80 @@ + + +const wordDisplay=document.querySelector(".word-display"); +const guessesText=document.querySelector(".guesses-text b"); +const keyboardDiv=document.querySelector(".keyboard"); +const hmanImage=document.querySelector(".hman-box img"); +const gameModal= document.querySelector(".game-modal"); +const playAgainBtn= gameModal.querySelector("button"); + +let currentWord, correctLetters, wrongGuessCount; +const maxGuesses=6; +const resetGame=()=>{ + correctLetters=[]; + wrongGuessCount=0; + hmanImage.src=`images/hangman-0.svg` ; + guessesText.innerText=`${wrongGuessCount}/ ${maxGuesses}`; + wordDisplay.innerHTML=currentWord.split("").map(()=>`
  • `).join(""); + keyboardDiv.querySelectorAll("button").forEach(btn=>btn.disabled= false); + gameModal.classList.remove("show"); +} + + +const getRandom=() =>{ + const {word,hint}=wordList[Math.floor(Math.random()* wordList.length)]; + currentWord=word; + console.log(word,hint); + document.querySelector(".hint-text b").innerText = hint; + resetGame(); + +} + +const gameOver= (isVictory) => +{ + setTimeout(()=>{ + const modalText= isVictory? `You found the word:` : `The correct word was:` ; + gameModal.querySelector("img").src= `images/${isVictory ? 'victory' : 'lost'}.gif` ; + gameModal.querySelector("h4").innerText= `${isVictory ? 'Congrats!' : 'Game Over!'}` ; + gameModal.querySelector("p").innerHTML= `${modalText} ${currentWord}` ; + gameModal.classList.add("show"); + },300); +} + + +const initGame=(button, clickedLetter)=>{ + console.log(button, clickedLetter); + if(currentWord.includes(clickedLetter)){ + [...currentWord].forEach((letter,index)=> { + if(letter===clickedLetter){ + correctLetters.push(letter); + wordDisplay.querySelectorAll("li")[index].innerText=letter; + wordDisplay.querySelectorAll("li")[index].classList.add("guessed"); + } + }) + + } + else{ + wrongGuessCount++; + hmanImage.src=`images/hangman-${wrongGuessCount}.svg` ; + } + + + button.disabled=true; + guessesText.innerText=`${wrongGuessCount}/ ${maxGuesses}`; + + if(wrongGuessCount===maxGuesses) return gameOver(false); + if(correctLetters.length=== currentWord.length) return gameOver(true); +} + + + + +for(let i=97;i<=122;i++){ + const button=document.createElement("button"); + button.innerText=String.fromCharCode(i); + keyboardDiv.appendChild(button); + button.addEventListener("click", e=> initGame(e.target, String.fromCharCode(i))); +} + +getRandom(); +playAgainBtn.addEventListener("click", getRandom); diff --git a/Hangman Game/scripts/words.js b/Hangman Game/scripts/words.js new file mode 100644 index 00000000..a3bedbcb --- /dev/null +++ b/Hangman Game/scripts/words.js @@ -0,0 +1,73 @@ +const wordList=[ + {word:"Shimmer" , + hint:"To shine with a flickering, wavering light."}, + {word:"Glisten", + hint:"To sparkle or shine with a soft, radiant light."}, + {word:"Resilient", + hint:"Capable of recovering quickly from difficulties."}, + {word:"Enigma", + hint:"A mysterious or puzzling person, thing, or situation."}, + {word:"Paradox", + hint:"A statement or situation that appears contradictory but may reveal a truth."}, + {word:"Aesthetic", + hint:"Concerned with beauty and artistic appreciation."}, + {word:"Candid", + hint:"Open, honest, and straightforward."}, + {word:"Deft", + hint:"Skillful and quick in one's movements or actions."}, + {word:"Lethargic", + hint:"Sluggish and lacking energy or enthusiasm."}, + {word:"Melancholy", + hint:"A feeling of deep sadness or sorrow."}, + {word:"Amiable", + hint:"Having a friendly and pleasant manner."}, + {word:"Prolific", + hint:"Producing many works, results, or offspring."}, + {word:"Viable", + hint:"Capable of working successfully; feasible."}, + {word:"Cognizant", + hint:"Fully aware or knowledgeable about something."}, + {word:"Benevolent", + hint:"Kind and generous in intention or purpose."}, + {word:"Divergent", + hint:"Tending to be different or develop in different directions."}, + {word:"Nuance", + hint:"A subtle difference or distinction in meaning or expression."}, + {word:"Inherent", + hint:" Existing as a natural and essential quality."}, + {word:"Esoteric", + hint:"Intended for or understood by a small, specific group."}, + {word:"Apathy", + hint:"Lack of interest, enthusiasm, or concern."}, + {word:"Eloquent", + hint:"Fluent and persuasive in speech or writing."}, + {word:"Resonate", + hint:" Evoke a strong feeling or connection."}, + {word:"Enigma", + hint:"A puzzling or mysterious person or situation."}, + {word:"Pragmatic", + hint:"Dealing with things in a practical and realistic way."}, + {word:"Vehement", + hint:"Showing strong and intense feeling or passion."}, + {word:"Tenacious", + hint:"Persistent and determined in pursuit of a goal."}, + {word:"Pensive", + hint:"Deeply thoughtful, often with a hint of sadness."}, + {word:"Fervent", + hint:"Displaying intense passion or enthusiasm."}, + {word:"Euphoria", + hint:"A state of intense happiness and excitement."}, + {word:"Alacrity", + hint:"Brisk and cheerful readiness to do something."}, + {word:"Disparate ", + hint:"Distinctly different in nature, kind, or quality."}, + {word:"Aplomb", + hint:"Self-confidence and composure, especially in challenging situations."}, + {word:"Malaise", + hint:"A general feeling of discomfort, illness, or unease."}, + {word:"Acumen", + hint:"The ability to make good judgments and quick decisions."}, + {word:"Pristine", + hint:"In its original condition; unspoiled or untouched."} + +] diff --git a/Hangman Game/style.css b/Hangman Game/style.css new file mode 100644 index 00000000..f10e136d --- /dev/null +++ b/Hangman Game/style.css @@ -0,0 +1,198 @@ + + + @import url('https://fonts.googleapis.com/css2?family=Zilla+Slab:wght@300&display=swap'); + + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Zilla Slab', serif; +} + + + +body{ + display:flex; + align-items: center; + padding: 0 10px; + justify-content: center; + min-height: 100vh; + background: #64485c; + +} + +.container{ + width: 850px; + background: white; + display: flex; + gap: 25px; + align-items: flex-end; + padding: 60px 40px; + border-radius: 10px; + +} +.hman-box img{ + width: 410px; + height: 200px; +} + +.heading{ + font-size: 1.45rem; + margin-top: 20px; + text-align:center; + text-transform: uppercase; + +} + +.word-display{ + display: flex; + gap: 10px; + list-style: none; + align-items: center; + justify-content: center; +} + +.word-display .letter{ +width: 28px; +font-size: 2rem; +font-weight: 600; +text-align: center; +text-transform: uppercase; +margin-bottom: 40px; +border-bottom: 3px solid black; +} + + +.word-display .letter.guessed{ + border-color: transparent; + margin: -40px 0 35px; +} + +.game-box h4{ + text-align: center; + font-size: 1.1rem; + font-weight: 500; + margin-bottom: 15px; + +} + +.game-box h4 b{ + font-weight: 600; +} + +.game-box .keyboard{ + display: flex; + gap: 5px; + margin-top: 40px; + flex-wrap: wrap; + justify-content: center; +} + + + +:where(.game-modal, .keyboard) button{ + color: white; + font-size: 1.1rem; + font-weight: 600; + cursor: pointer; + outline: none; + border: none; + background-color: #915F6D ; + border-radius: 4px; + text-transform: uppercase; +} + +.game-box .guesses-text b{ +color: red; +} + +.keyboard button{ + + padding: 7px; + width: calc(100% /9-5 px); +} + +.keyboard button[disabled]{ + opacity: 0.6; + pointer-events: none; +} + +:where(.game-modal, .keyboard) button:hover{ + background: #953553; +} + +.game-modal{ + position: fixed; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0; + padding: 0 10px ; + pointer-events: none; + z-index: 999; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0,0,0,0.6); + transition: opacity 0.4s ease; + +} + + +.game-modal.show{ + opacity: 1; + pointer-events: auto; + + +} + +.game-modal .content{ + background: white; + max-width: 420px; + width: 100%; + text-align: center; + border-radius: 10px; + padding: 30px; +} + +.game-modal img{ + max-width: 130px; +} + +.game-modal h4{ + font-size: 1.53rem; + +} +.game-modal p{ + font-size: 1.15rem; + margin: 15px 0px 30px; + font-weight: 500; + +} + +.game-modal p b{ + color:purple; + font-weight: 600; + +} + +.game-modal button{ + padding: 12px 23px; +} + +@media(max-width:782px){ +.container{ + flex-direction: column; + padding: 30px 15px; + align-items: center; +} +.hman-box img{ + max-width: 200px; +} +.hman-box h1{ + display: none; +} + +} diff --git a/JS-Game b/JS-Game new file mode 160000 index 00000000..7f303c4a --- /dev/null +++ b/JS-Game @@ -0,0 +1 @@ +Subproject commit 7f303c4aa1d5230df2fb66b827c108446f5f7c79 diff --git a/Javascript Quiz App/style.css b/Javascript Quiz App/style.css index e40391a6..bd7fe08b 100644 --- a/Javascript Quiz App/style.css +++ b/Javascript Quiz App/style.css @@ -49,4 +49,28 @@ body{ background-color: blue; color: brown; -} \ No newline at end of file +} + +@media all and (max-width: 700px) { + + #quesBox { + font-size: 16px; + font-weight: bold; + } + .row > label { + font-size: 12px; + } + + #box { + width: 70%; + height : 350px; + } +} + +@media all and (max-width: 350px) { + + #box { + width: 80%; + height : 400px; + } +} diff --git a/MarioMatching/01.jpg b/MarioMatching/01.jpg new file mode 100644 index 00000000..51c56edd Binary files /dev/null and b/MarioMatching/01.jpg differ diff --git a/MarioMatching/02.jpg b/MarioMatching/02.jpg new file mode 100644 index 00000000..db8ce9cc Binary files /dev/null and b/MarioMatching/02.jpg differ diff --git a/MarioMatching/03.jpg b/MarioMatching/03.jpg new file mode 100644 index 00000000..97cd791c Binary files /dev/null and b/MarioMatching/03.jpg differ diff --git a/MarioMatching/index.html b/MarioMatching/index.html new file mode 100644 index 00000000..ec5268b2 --- /dev/null +++ b/MarioMatching/index.html @@ -0,0 +1,65 @@ + + + + + + + + + + Mario Matching Game + + +

    Mario Matching Game

    +
    + + + +
    + + + + \ No newline at end of file diff --git a/MarioMatching/style.css b/MarioMatching/style.css new file mode 100644 index 00000000..05d8c6f0 --- /dev/null +++ b/MarioMatching/style.css @@ -0,0 +1,97 @@ +*{ + padding: 0; + margin: 0; + box-sizing: border-box; + font-family: 'Poppins', sans-serif; +} + +body{ + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + flex-direction: column; +} + +h2{ + margin-bottom: 30px; + font-size: 2.5em; +} + +.box{ + position: relative; + width: 600px; + height: 200px; + display: flex; + border: 2px solid #555; + justify-content: center; + align-items: center; + flex-direction: column; +} + +.box label{ + position: relative; + width: 100%; + height: 33.3%; + border: 2px solid #555; + border-bottom: none; +} + +.box label input{ + appearance: none; + z-index: 10; + position: relative; +} + +.box label i{ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-size: 600px; +} + +.box label:nth-child(1) i{ + background-image: url(01.jpg); + animation: animate 0.4s steps(3) infinite; +} + +.box label:nth-child(2) i{ + background-image: url(02.jpg); + animation: animate 0.5s steps(3) infinite; +} + +.box label:nth-child(3) i{ + background-image: url(03.jpg); + animation: animate 0.7s steps(3)infinite; +} + +@keyframes animate +{ + 0%{ + background-position: 0px; + } + 100%{ + background-position: 600px; + } +} + +.box label input:checked ~ i{ + animation-play-state: paused; +} + +.reset +{ + margin-top: 40px; + border: none; + font-size: 1.25em; + padding: 10px 25px; + background: #333; + color: #fff; +} + +.reset:active{ + background: #d63c3c; + transform: scale(.95); +} diff --git a/Meme-Generator/index.html b/Meme-Generator/index.html new file mode 100644 index 00000000..1817bb46 --- /dev/null +++ b/Meme-Generator/index.html @@ -0,0 +1,21 @@ + + + + + + + Random MEME Generator + + + +
    + +

    Loading...

    + + +
    +
    + + + + \ No newline at end of file diff --git a/Meme-Generator/script.js b/Meme-Generator/script.js new file mode 100644 index 00000000..325a476b --- /dev/null +++ b/Meme-Generator/script.js @@ -0,0 +1,24 @@ +const generateMemeBtn = document.querySelector( + ".meme-generator .generate-meme-btn" + ); + const memeImage = document.querySelector(".meme-generator img"); + const memeTitle = document.querySelector(".meme-generator .meme-title"); + const memeAuthor = document.querySelector(".meme-generator .meme-author"); + + const updateDetails = (url, title, author) => { + memeImage.setAttribute("src", url); + memeTitle.innerHTML = title; + memeAuthor.innerHTML = `Meme by: ${author}`; + }; + + const generateMeme = () => { + fetch("https://meme-api.com/gimme/wholesomememes") + .then((response) => response.json()) + .then((data) => { + updateDetails(data.url, data.title, data.author); + }); + }; + + generateMemeBtn.addEventListener("click", generateMeme); + + generateMeme(); \ No newline at end of file diff --git a/Meme-Generator/style.css b/Meme-Generator/style.css new file mode 100644 index 00000000..77368a46 --- /dev/null +++ b/Meme-Generator/style.css @@ -0,0 +1,41 @@ +.meme-generator { + font-family: "Roboto", sans-serif; + text-align: center; + background-color: black; + color: white; + border-radius: 20px; +} + +.meme-generator img { + height: 430px; + object-fit: cover; +} + +.meme-generator .generate-meme-btn { + padding: 8px 20px; + border: none; + border-left: 5px solid white; + border-right: 5px solid white; + border-top: 5px solid white; + border-bottom: 5px solid white; + margin: 20px 0; + font-size: 20px; + color: #ffffff; + background: #800000; + cursor: pointer; + transition: all 2sec ease; + border-radius: 20px; +} + +.memegenerator .generate-meme-btn:hover { + padding: 40px 36px; + border-left: 8px solid #222; + border-right: 8px solid #222; + letter-spacing: 3px; +} + +.meme-generator .meme-author { + margin: 20px; + font-family: Roboto, sans-serif; + color: white; +} \ No newline at end of file diff --git a/MouseHoverAnimation/MouseHoverGlow.css b/MouseHoverAnimation/MouseHoverGlow.css new file mode 100644 index 00000000..18faffa0 --- /dev/null +++ b/MouseHoverAnimation/MouseHoverGlow.css @@ -0,0 +1,61 @@ +*{ + padding: 0; + margin: 0; + box-sizing: border-box; +} + +.container{ + position: relative; + width: 100%; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background-color: #001300; + overflow: hidden; + flex-wrap: wrap; + animation: animate 5s linear infinite; +} + +@keyframes animate{ + 0%{ + filter:hue-rotate(0deg) + } + 100%{ + filter: hue-rotate(360deg); + } +} + +.container span{ + position: relative; + display: block; + width: 40px; + height: 40px; + /* background-color: #F00; */ +} + +.container span::before +{ + content: " "; + position: absolute; + top: 0; + left: 0; + width: 200%; + height: 200%; + background: #00ff0a; + border-radius: 50%; + transform: scale(0); + transition : 2s; + box-shadow: 0 0 10px #00ff0a, + 0 0 20px #00ff0a, + 0 0 40px #00ff0a, + 0 0 6cqh #00ff0a, + 0 0 60px #00ff0a, + 0 0 80px #00ff0a; +} + +.container span:hover::before +{ + transform: scale(1); + transition: 0s; +} \ No newline at end of file diff --git a/MouseHoverAnimation/MouseHoverGlow.html b/MouseHoverAnimation/MouseHoverGlow.html new file mode 100644 index 00000000..223f3d00 --- /dev/null +++ b/MouseHoverAnimation/MouseHoverGlow.html @@ -0,0 +1,1552 @@ + + + + + + Mouse hover animation + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/MouseHoverAnimation/mouseHoverGlow.gif b/MouseHoverAnimation/mouseHoverGlow.gif new file mode 100644 index 00000000..78a64cc3 Binary files /dev/null and b/MouseHoverAnimation/mouseHoverGlow.gif differ diff --git a/Music-player/demo.JPG b/Music-player/demo.JPG new file mode 100644 index 00000000..7fd51713 Binary files /dev/null and b/Music-player/demo.JPG differ diff --git a/Music-player/images/Capital Cities - Safe And Sound.jpg b/Music-player/images/Capital Cities - Safe And Sound.jpg new file mode 100644 index 00000000..a391b118 Binary files /dev/null and b/Music-player/images/Capital Cities - Safe And Sound.jpg differ diff --git a/Music-player/images/Legends Never Die _ Avengers - Endgame.jpg b/Music-player/images/Legends Never Die _ Avengers - Endgame.jpg new file mode 100644 index 00000000..5610f09a Binary files /dev/null and b/Music-player/images/Legends Never Die _ Avengers - Endgame.jpg differ diff --git a/Music-player/images/Middle Of The Night.jpg b/Music-player/images/Middle Of The Night.jpg new file mode 100644 index 00000000..dbb47901 Binary files /dev/null and b/Music-player/images/Middle Of The Night.jpg differ diff --git a/Music-player/images/RITA ORA - Poison.jpg b/Music-player/images/RITA ORA - Poison.jpg new file mode 100644 index 00000000..fff13797 Binary files /dev/null and b/Music-player/images/RITA ORA - Poison.jpg differ diff --git a/Music-player/images/TheFatRat - Monody.jpg b/Music-player/images/TheFatRat - Monody.jpg new file mode 100644 index 00000000..aa4ed87d Binary files /dev/null and b/Music-player/images/TheFatRat - Monody.jpg differ diff --git a/Music-player/images/Thing Of Beauty.jpg b/Music-player/images/Thing Of Beauty.jpg new file mode 100644 index 00000000..832c35b3 Binary files /dev/null and b/Music-player/images/Thing Of Beauty.jpg differ diff --git a/Music-player/images/Walk The Moon - Lost In The Wild.jpg b/Music-player/images/Walk The Moon - Lost In The Wild.jpg new file mode 100644 index 00000000..e495ef2a Binary files /dev/null and b/Music-player/images/Walk The Moon - Lost In The Wild.jpg differ diff --git a/Music-player/images/grandson - Blood _ Water.jpg b/Music-player/images/grandson - Blood _ Water.jpg new file mode 100644 index 00000000..24ac2cd3 Binary files /dev/null and b/Music-player/images/grandson - Blood _ Water.jpg differ diff --git a/Music-player/index.html b/Music-player/index.html new file mode 100644 index 00000000..368fe5ae --- /dev/null +++ b/Music-player/index.html @@ -0,0 +1,45 @@ + + + + + + + + + Music Player + + + +

    Music Player

    + +
    +
    +

    +
    +
    +
    +
    + + + +
    + music-cover +
    + +
    + + + diff --git a/Music-player/music/Capital Cities - Safe And Sound.mp3 b/Music-player/music/Capital Cities - Safe And Sound.mp3 new file mode 100644 index 00000000..a42227e5 Binary files /dev/null and b/Music-player/music/Capital Cities - Safe And Sound.mp3 differ diff --git a/Music-player/music/Legends Never Die _ Avengers - Endgame.mp3 b/Music-player/music/Legends Never Die _ Avengers - Endgame.mp3 new file mode 100644 index 00000000..15f0ac6d Binary files /dev/null and b/Music-player/music/Legends Never Die _ Avengers - Endgame.mp3 differ diff --git a/Music-player/music/Middle Of The Night.mp3 b/Music-player/music/Middle Of The Night.mp3 new file mode 100644 index 00000000..06acb87c Binary files /dev/null and b/Music-player/music/Middle Of The Night.mp3 differ diff --git a/Music-player/music/RITA ORA - Poison.mp3 b/Music-player/music/RITA ORA - Poison.mp3 new file mode 100644 index 00000000..1c52c9eb Binary files /dev/null and b/Music-player/music/RITA ORA - Poison.mp3 differ diff --git a/Music-player/music/TheFatRat - Monody.mp3 b/Music-player/music/TheFatRat - Monody.mp3 new file mode 100644 index 00000000..79f89404 Binary files /dev/null and b/Music-player/music/TheFatRat - Monody.mp3 differ diff --git a/Music-player/music/Thing Of Beauty.mp3 b/Music-player/music/Thing Of Beauty.mp3 new file mode 100644 index 00000000..31412124 Binary files /dev/null and b/Music-player/music/Thing Of Beauty.mp3 differ diff --git a/Music-player/music/Walk The Moon - Lost In The Wild.mp3 b/Music-player/music/Walk The Moon - Lost In The Wild.mp3 new file mode 100644 index 00000000..d114475d Binary files /dev/null and b/Music-player/music/Walk The Moon - Lost In The Wild.mp3 differ diff --git a/Music-player/music/grandson - Blood _ Water.mp3 b/Music-player/music/grandson - Blood _ Water.mp3 new file mode 100644 index 00000000..80fa5c24 Binary files /dev/null and b/Music-player/music/grandson - Blood _ Water.mp3 differ diff --git a/Music-player/readme.md b/Music-player/readme.md new file mode 100644 index 00000000..421cca4d --- /dev/null +++ b/Music-player/readme.md @@ -0,0 +1,10 @@ +## Music Player + +Create beautiful UI to play music stored in the "music folder" using the HTML5 audio API + +## Project Specifications + +- Create UI for music player including spinning image and song detail popup +- Add play and pause functionality +- Switch songs +- Progress bar diff --git a/Music-player/script.js b/Music-player/script.js new file mode 100644 index 00000000..fd29dc4c --- /dev/null +++ b/Music-player/script.js @@ -0,0 +1,178 @@ +const musicContainer = document.getElementById('music-container'); +const playBtn = document.getElementById('play'); +const prevBtn = document.getElementById('prev'); +const nextBtn = document.getElementById('next'); + +const audio = document.getElementById('audio'); +const progress = document.getElementById('progress'); +const progressContainer = document.getElementById('progress-container'); +const title = document.getElementById('title'); +const cover = document.getElementById('cover'); +const currTime = document.querySelector('#currTime'); +const durTime = document.querySelector('#durTime'); + +// Song titles +const songs = ['grandson - Blood _ Water','RITA ORA - Poison','Walk The Moon - Lost In The Wild','Thing Of Beauty','TheFatRat - Monody','Capital Cities - Safe And Sound','Legends Never Die _ Avengers - Endgame','Middle Of The Night']; + +// Keep track of song +let songIndex = 2; + +// Initially load song details into DOM +loadSong(songs[songIndex]); + +// Update song details +function loadSong(song) { + title.innerText = song; + audio.src = `music/${song}.mp3`; + cover.src = `images/${song}.jpg`; +} + +// Play song +function playSong() { + musicContainer.classList.add('play'); + playBtn.querySelector('i.fas').classList.remove('fa-play'); + playBtn.querySelector('i.fas').classList.add('fa-pause'); + + audio.play(); +} + +// Pause song +function pauseSong() { + musicContainer.classList.remove('play'); + playBtn.querySelector('i.fas').classList.add('fa-play'); + playBtn.querySelector('i.fas').classList.remove('fa-pause'); + + audio.pause(); +} + +// Previous song +function prevSong() { + songIndex--; + + if (songIndex < 0) { + songIndex = songs.length - 1; + } + + loadSong(songs[songIndex]); + + playSong(); +} + +// Next song +function nextSong() { + songIndex++; + + if (songIndex > songs.length - 1) { + songIndex = 0; + } + + loadSong(songs[songIndex]); + + playSong(); +} + +// Update progress bar +function updateProgress(e) { + const { duration, currentTime } = e.srcElement; + const progressPercent = (currentTime / duration) * 100; + progress.style.width = `${progressPercent}%`; +} + +// Set progress bar +function setProgress(e) { + const width = this.clientWidth; + const clickX = e.offsetX; + const duration = audio.duration; + + audio.currentTime = (clickX / width) * duration; +} + +//get duration & currentTime for Time of song +function DurTime (e) { + const {duration,currentTime} = e.srcElement; + var sec; + var sec_d; + + // define minutes currentTime + let min = (currentTime==null)? 0: + Math.floor(currentTime/60); + min = min <10 ? '0'+min:min; + + // define seconds currentTime + function get_sec (x) { + if(Math.floor(x) >= 60){ + + for (var i = 1; i<=60; i++){ + if(Math.floor(x)>=(60*i) && Math.floor(x)<(60*(i+1))) { + sec = Math.floor(x) - (60*i); + sec = sec <10 ? '0'+sec:sec; + } + } + }else{ + sec = Math.floor(x); + sec = sec <10 ? '0'+sec:sec; + } + } + + get_sec (currentTime,sec); + + // change currentTime DOM + currTime.innerHTML = min +':'+ sec; + + // define minutes duration + let min_d = (isNaN(duration) === true)? '0': + Math.floor(duration/60); + min_d = min_d <10 ? '0'+min_d:min_d; + + + function get_sec_d (x) { + if(Math.floor(x) >= 60){ + + for (var i = 1; i<=60; i++){ + if(Math.floor(x)>=(60*i) && Math.floor(x)<(60*(i+1))) { + sec_d = Math.floor(x) - (60*i); + sec_d = sec_d <10 ? '0'+sec_d:sec_d; + } + } + }else{ + sec_d = (isNaN(duration) === true)? '0': + Math.floor(x); + sec_d = sec_d <10 ? '0'+sec_d:sec_d; + } + } + + // define seconds duration + + get_sec_d (duration); + + // change duration DOM + durTime.innerHTML = min_d +':'+ sec_d; + +}; + +// Event listeners +playBtn.addEventListener('click', () => { + const isPlaying = musicContainer.classList.contains('play'); + + if (isPlaying) { + pauseSong(); + } else { + playSong(); + } +}); + +// Change song +prevBtn.addEventListener('click', prevSong); +nextBtn.addEventListener('click', nextSong); + +// Time/song update +audio.addEventListener('timeupdate', updateProgress); + +// Click on progress bar +progressContainer.addEventListener('click', setProgress); + +// Song ends +audio.addEventListener('ended', nextSong); + +// Time of song +audio.addEventListener('timeupdate',DurTime); diff --git a/Music-player/style.css b/Music-player/style.css new file mode 100644 index 00000000..abc5ee52 --- /dev/null +++ b/Music-player/style.css @@ -0,0 +1,160 @@ +@import url('https://fonts.googleapis.com/css?family=Lato&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Lobster&display=swap'); + +* { + box-sizing: border-box; +} + +body { + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-family: 'Lobster'; + font-size: 30px; + color: white; + text-shadow: 0 0 10px white, 0 0 40px #ff00de; + margin: 0; + background: linear-gradient(-45deg, black, #000066, #660066,#23a6d5); + background-size: 400% 400%; + animation: gradient 15s ease infinite; +} + +@keyframes gradient { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +.music-container { + background-color: #1a000d; + border-radius: 15px; + box-shadow: 0 0 7px white, 0 0 30px #0074e3; + display: flex; + padding: 20px 30px; + position: relative; + margin: 100px 0; + z-index: 10; +} + +.img-container { + position: relative; + width: 110px; +} + +.img-container::after { + content: ''; + background-color: #fff; + border-radius: 50%; + position: absolute; + bottom: 100%; + left: 50%; + width: 20px; + height: 20px; + transform: translate(-50%, 50%); +} + +.img-container img { + border-radius: 50%; + object-fit: cover; + height: 110px; + width: inherit; + position: absolute; + bottom: 0; + left: 0; + animation: rotate 3s linear infinite; + + animation-play-state: paused; +} + +.music-container.play .img-container img { + animation-play-state: running; +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +.navigation { + display: flex; + align-items: center; + justify-content: center; + z-index: 1; +} + +.action-btn { + background-color: #1a000d; + border: 0; + color: #dfdbdf; + font-size: 20px; + cursor: pointer; + padding: 10px; + margin: 0 20px; +} + +.action-btn.action-btn-big { + color: #cdc2d0; + font-size: 30px; +} + +.action-btn:focus { + outline: 0; +} + +.music-info { + background-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 0 7px white, 0 0 30px #0074e3; + font-family: 'Lato', cursive; + color: black; + text-shadow: none; + font-size: 17px; + border-radius: 15px 15px 0 0; + position: absolute; + top: -1px; + left: 20px; + width: calc(100% - 40px); + padding: 10px 10px 10px 150px; + opacity: 0; + transform: translateY(0%); + transition: transform 0.3s ease-in, opacity 0.3s ease-in; + z-index: 0; +} + +.music-container.play .music-info { + opacity: 1; + transform: translateY(-100%); +} + +.music-info h4 { + margin: 0; +} + +.progress-container { + background: #fff; + border-radius: 5px; + cursor: pointer; + margin: 10px 0; + height: 4px; + width: 100%; +} + +.progress { + background-color: #fe8daa; + border-radius: 5px; + height: 100%; + width: 0%; + transition: width 0.1s linear; +} diff --git a/Myntra Customize/css/styles.css b/Myntra Customize/css/styles.css index d8a315eb..313b27a9 100644 --- a/Myntra Customize/css/styles.css +++ b/Myntra Customize/css/styles.css @@ -30,6 +30,7 @@ p{ #title{ text-align: left; + margin-top: 132px; } /* Sections */ @@ -44,14 +45,13 @@ p{ } /* Navigation Bar */ - +nav { + background-color: black !important; +} .logo{ width: 100px; -} - -.navbar{ - padding-bottom: 4.5rem; + height: 100px; } .navbar-brand{ @@ -64,11 +64,59 @@ p{ padding: 0 18px; } +.nav-item.aboutDropdown { + margin-top: 7px; +} + .nav-link{ - font-family: Monserrat-Light; - font-size: 1.2rem; + font-family: inherit; + font-size: 1rem; + color: white; +} + +.navbar .nav-item .nav-link:hover, .navbar a:hover, .dropdown:hover .dropbtn, button.navbar-toggler{ + background-color: white; + color: black; +} + +.navbar .nav-item .nav-link.active { + background-color: #E72744 !important; } +/*Dropdown in navigation*/ +.dropdown .dropbtn { + font-family: inherit; + font-size: 1rem; + border: none; + outline: none; + color: white; + background-color: inherit; + margin: 0; +} + +.dropdown-content { + display: none; + position: absolute; + background-color: #f9f9f9; + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1; +} + +.dropdown-content a { + float: none; + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + text-align: left; +} + +.dropdown:hover .dropdown-content { + display: block; +} + + /* Download Buttons */ .download-button{ @@ -140,7 +188,7 @@ p{ /* Pricing Section */ #pricing{ - padding: 100px; + padding: 70px; } .pricing-column{ @@ -167,4 +215,43 @@ p{ position: static; transform: rotate(0); } +} + +/* Footer Social Media Button Modification */ +#footer{ + cursor: pointer; +} + +.fa-twitter:hover{ + color: #1DA1F2; +} + +.fa-facebook-f:hover{ + + color: blue; + +} + +.fa-instagram:hover{ + color: #E4405F; +} + + +/* Apple Button Modification */ +.apple-btn:hover{ + + background-color: transparent; + color: black; + +} + +.Cashback-btn:hover{ + + background-color: transparent; + color: black; + +} +.Cashback-btn{ + color: white; + background-color: black; } \ No newline at end of file diff --git a/Myntra Customize/index.html b/Myntra Customize/index.html index c99b8f05..fd009080 100644 --- a/Myntra Customize/index.html +++ b/Myntra Customize/index.html @@ -19,89 +19,92 @@ + +
    - - - - - - -
    -

    Customize Your Clothing

    A customer friendly service.
    - - + +
    -
    iphone-mockup
    -
    - -
    -

    Customer's Choice

    Undoubtedly the most important thing

    -

    Encouraging Creative Minds

    This can also add on to their new source of income

    -

    Employment

    -

    The company will require more labour to physically implement the design, hence increasing the employment ratio +

    The company will require more labour to physically implement the design, hence increasing the employment + ratio

    - -
    -
    -
    -
    -
    -

    A Plan for Every Customer's Needs

    @@ -165,7 +166,7 @@

    50% off

    Free customization

    Recomendations

    Free Delivery

    - +
    @@ -179,8 +180,8 @@

    Scratch Cards

    Cashback

    For next discount on customization

    Movie Coupons

    -

    For next orders on Myntra<

    - +

    For next orders on Myntra

    + @@ -196,7 +197,7 @@

    Unlimited Benefits

    Recommendations from designers

    Free tool for customization

    Gift vounchers on every order

    - + @@ -206,32 +207,42 @@

    Unlimited Benefits

    -
    -

    Download MyntraCustomize and enjoy Customizing.

    - - - - - - + +
    + + + + + + + + \ No newline at end of file diff --git a/Myntra Customize/js/script.js b/Myntra Customize/js/script.js new file mode 100644 index 00000000..39a9d72b --- /dev/null +++ b/Myntra Customize/js/script.js @@ -0,0 +1,19 @@ +$(document).ready(function() { + document.querySelectorAll(".nav-link").forEach((link) => { + if (link.hash === window.location.hash) { + link.classList.add("active"); + link.setAttribute("aria-current", "page"); + } + }); + + $(".navbar li a").on('click', function(event) { + $(".navbar li a").removeClass("active"); + $(this).addClass("active"); + if(this.hash) { + sectionTop = $(this.hash).offset().top - 132; + $('html, body').animate({ + scrollTop: sectionTop + }, 500); + } + }); +}); \ No newline at end of file diff --git "a/Netflix UI Clone/Writing Read Me/Netflix \342\200\224 Mozilla Firefox 25-07-2023 03_56_43 PM.png" "b/Netflix UI Clone/Writing Read Me/Netflix \342\200\224 Mozilla Firefox 25-07-2023 03_56_43 PM.png" new file mode 100644 index 00000000..610409a9 Binary files /dev/null and "b/Netflix UI Clone/Writing Read Me/Netflix \342\200\224 Mozilla Firefox 25-07-2023 03_56_43 PM.png" differ diff --git "a/Netflix UI Clone/Writing Read Me/Netflix \342\200\224 Mozilla Firefox 25-07-2023 03_57_01 PM.png" "b/Netflix UI Clone/Writing Read Me/Netflix \342\200\224 Mozilla Firefox 25-07-2023 03_57_01 PM.png" new file mode 100644 index 00000000..807be6f1 Binary files /dev/null and "b/Netflix UI Clone/Writing Read Me/Netflix \342\200\224 Mozilla Firefox 25-07-2023 03_57_01 PM.png" differ diff --git a/Netflix UI Clone/images/down-icon.png b/Netflix UI Clone/images/down-icon.png new file mode 100644 index 00000000..0d5804ad Binary files /dev/null and b/Netflix UI Clone/images/down-icon.png differ diff --git a/Netflix UI Clone/images/feature-1.png b/Netflix UI Clone/images/feature-1.png new file mode 100644 index 00000000..4d89ba37 Binary files /dev/null and b/Netflix UI Clone/images/feature-1.png differ diff --git a/Netflix UI Clone/images/feature-2.png b/Netflix UI Clone/images/feature-2.png new file mode 100644 index 00000000..b7ffbd24 Binary files /dev/null and b/Netflix UI Clone/images/feature-2.png differ diff --git a/Netflix UI Clone/images/feature-3.png b/Netflix UI Clone/images/feature-3.png new file mode 100644 index 00000000..4f24feba Binary files /dev/null and b/Netflix UI Clone/images/feature-3.png differ diff --git a/Netflix UI Clone/images/feature-4.png b/Netflix UI Clone/images/feature-4.png new file mode 100644 index 00000000..392b7162 Binary files /dev/null and b/Netflix UI Clone/images/feature-4.png differ diff --git a/Netflix UI Clone/images/header-image.png b/Netflix UI Clone/images/header-image.png new file mode 100644 index 00000000..1867b6d3 Binary files /dev/null and b/Netflix UI Clone/images/header-image.png differ diff --git a/Netflix UI Clone/images/logo.png b/Netflix UI Clone/images/logo.png new file mode 100644 index 00000000..973a3dc1 Binary files /dev/null and b/Netflix UI Clone/images/logo.png differ diff --git a/Netflix UI Clone/images/w.png b/Netflix UI Clone/images/w.png new file mode 100644 index 00000000..0ff07b0d Binary files /dev/null and b/Netflix UI Clone/images/w.png differ diff --git a/Netflix UI Clone/index.html b/Netflix UI Clone/index.html new file mode 100644 index 00000000..a01dc89e --- /dev/null +++ b/Netflix UI Clone/index.html @@ -0,0 +1,219 @@ + + + + + + + Netflix + + + + + +
    + +
    +

    Unlimited movies, TV shows and more

    +

    Watch anywhere. Cancel anytime.

    +

    Ready to watch? Enter your email to create or restart your membership.

    + +
    +
    +
    +
    +
    +
    +

    Enjoy on your TV

    +

    + Watch on smart TVs, PlayStation, Xbox, Chromecast, Apple TV, Blu-ray players and more. +

    +
    +
    + F1 +
    +
    +
    +
    +
    +
    +
    +

    Download your shows to watch offline

    +

    + Save your favourites easily and always have something to watch. +

    +
    +
    + F1 +
    +
    +
    +
    +
    +
    +
    +

    Watch everywhere

    +

    + Stream unlimited movies and TV shows on your phone, tablet, laptop, and TV. +

    +
    +
    + F1 +
    +
    +
    +
    +
    +
    +
    +

    Create profiles for kids

    +

    + Send children on adventures with their favourite characters in a space made just for them—free with + your membership. +

    +
    +
    + F1 +
    +
    +
    +
    +
    +

    Frequently Asked Questions

    + + Ready to watch? Enter your email to create or restart your membership. +
    + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/Netflix UI Clone/style.css b/Netflix UI Clone/style.css new file mode 100644 index 00000000..852a04a7 --- /dev/null +++ b/Netflix UI Clone/style.css @@ -0,0 +1,326 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;900&display=swap'); + +*{ + margin: 0; + padding: 0; + /* font-family: 'Netflix Sans','Helvetica Neue','Segoe UI',Roboto,Ubuntu,sans-serif; */ + font-family: 'Roboto', sans-serif; + box-sizing: border-box; +} +body{ + color: #fff; + background-color: #000; +} +.header{ + width: 100%; + height: 100vh; + background-image: linear-gradient(rgba(0,0,0,0.7), rgba(0,0,0,0.7)), url(images/header-image.png); + background-position: center; + background-size: cover; + padding: 10px 8%; +} + +nav{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; +} +.Logo{ + width: 150px; + cursor: pointer; +} +nav button{ + border: 0; + outline: 0; + background-color: #db0001; + padding: 7px 20px; + color: #fff; + font-size: 15px; + border-radius: 5px; + font-weight: bold; + margin-left: 10px; + cursor: pointer; +} + +.langs-btn{ + /* display: inline-flex; */ + color: #fff; + align-items: center; + justify-content: center; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.281); + border: 0.2px solid gray; + padding: 7px 10px; +} +.langs-btn .lang-icon{ + width: 10px; +} + +.head-content{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + margin-top: 70px; + max-width: 100%; +} +.head-content h1{ + font-size: 3rem; + line-height: 70px; + font-weight: 900; + max-width: 1000px; +} +.head-content h3{ + font-size: 1.5rem; + font-weight: 300; + margin-bottom: 20px; +} +.head-content p{ + font-size: 1.25rem; +} +.email-sign{ + background-color: transparent; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + margin-top: 30px; + /* max-width: 400px; */ + /* overflow: hidden;/ */ +} + +.email-sign input{ + /* flex:1; */ + border: 0; + outline: 0; + background-color: rgba(3, 3, 3, 0.185); + color: #fff; + border: .5px solid gray; + padding: 20px; + font-size: 15px; + width: 55%; + border-radius: 5px; + /* font-weight: bold; */ +} +.email-sign button{ + border: 0; + font-weight: 500; + outline: 0; + background: #db0001; + color: #fff; + font-size: 1.5rem; + border-radius: 5px; + cursor: pointer; + padding: 15px 30px; + +} + +/* features/ */ +.features{ + padding: 10px 8%; + font-size: 22px; +} +.row{ + display: flex; + width: 100%; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + padding: 50px 0; +} +.text-col, .img-col{ + flex-basis: 50%; + margin-bottom: 20px; +} + +.img-col img{ + display: block; + width: 90%; + margin: auto; +} +hr{ + height: 7px; + border: none; + background-color: rgb(53, 53, 53); +} +.features h2{ + font-size: 50px; + font-weight: 600; + margin-bottom: 20px; +} + +.rev{ + flex-direction: row-reverse; +} + +.faq{ + padding: 10px 12%; + text-align: center; + font-size: 25px; + margin: 40px 0 -5px 0; +} + +.faq h2{ + font-size: 50px; + margin-bottom: 30px; +} + +.accordian{ + margin: 60px auto; + width: 100%; + max-width: 750px; +} + +ul li{ + list-style: none; +} + +ul li label{ + display: flex; + align-items: center; + padding: 20px; + font-size: 26px; + font-weight: 500; + background-color: #363636; + margin-bottom: 2px; + cursor: pointer; + position: relative; +} +label:hover{ + background-color: #4b4b4b; + transition: 0.3s ease-in-out; +} + +label::after{ + content: '+'; + font-size: 34px; + position: absolute; + right: 20px; + transition: 0.3s ease-in-out; +} +input[type="radio"]{ + display: none; +} +.content{ + background-color: #363636; + text-align: left; + padding: 0 20px; + max-height: 0; + overflow: hidden; + transition: max-height 0.5s, padding 0.5s; + /* font-size: 20px; */ +} + +.freq-hr{ + height: 5px; + border: none; + background-color: black; +} + +.faq input[type="radio"]:checked + label + .content{ + max-height: 600px; + padding: 30px; +} +.faq input[type="radio"]:checked + label::after{ + transform: rotate(135deg); +} +/* .faq input[type="radio"]:checked + label + label::after{ + /* transform: rotate(135deg); */ +ul{ + margin-bottom: 40px; +} +.faq .email-sign{ + max-width: 600px; + margin: 20px auto 60px; +} + + +.footer{ + margin: 50px 0; + padding: 15px 10% 10px; + /* border-top: 6px solid #333; */ + color: #9b9b9b; +} + +.footer .row{ + padding: 30px 0; +} +.footer h2{ + font-size: 18px; + font-weight: 400; +} + +.footer .col{ + flex-basis: 25%; + /* margin-bottom: 10px; */ + flex-grow: 1; +} +.footer .col a{ + display: block; + margin-bottom: 10px; + color: #9b9b9b; +} + +.copy{ + color: #9b9b9b; + margin-top: 20px; +} + +/* -------media queries -------- */ +@media only screen and (max-width : 862px){ + .Logo{ + width: 100px; + } + nav button{ + padding: 5px 10px; + } + .head-content h1{ + font-size: 2rem; + line-height: 40px; + /* font-weight: 900; */ + margin-top: 10px; + max-width: 900px; + } + .email-sign{ + flex-direction: column; + gap: 30px; + } + .email-sign button{ + padding: 10px; + font-size: 22px; + } + .email-sign input{ + padding: 12px; + width: 20rem; + } + .head-content{ + margin-top: 16px; + } + .head-content h3,.head-content p{ + margin-top: 10px; + font-size: 20px; + } + .features .row{ + flex-direction: column; + } + .features p{ + font-size: 20px; + } + .features h2{ + font-size: 41px; + } + ul li label { + font-size: 18px; + } + .faq { + font-size: 17px; + } + label::after{ + font-size: 19px; + } + nav button{ + font-size: 12px; + } +} \ No newline at end of file diff --git a/Notes App/index.html b/Notes App/index.html new file mode 100644 index 00000000..ce1ae434 --- /dev/null +++ b/Notes App/index.html @@ -0,0 +1,46 @@ + + + + + + Notes App in JavaScript | CodingNepal + + + + + + + +
    +
  • +
    +

    Add new note

    +
  • +
    + + + + diff --git a/Notes App/script.js b/Notes App/script.js new file mode 100644 index 00000000..c5687715 --- /dev/null +++ b/Notes App/script.js @@ -0,0 +1,105 @@ +const addBox = document.querySelector(".add-box"), +popupBox = document.querySelector(".popup-box"), +popupTitle = popupBox.querySelector("header p"), +closeIcon = popupBox.querySelector("header i"), +titleTag = popupBox.querySelector("input"), +descTag = popupBox.querySelector("textarea"), +addBtn = popupBox.querySelector("button"); + +const months = ["January", "February", "March", "April", "May", "June", "July", + "August", "September", "October", "November", "December"]; +const notes = JSON.parse(localStorage.getItem("notes") || "[]"); +let isUpdate = false, updateId; + +addBox.addEventListener("click", () => { + popupTitle.innerText = "Add a new Note"; + addBtn.innerText = "Add Note"; + popupBox.classList.add("show"); + document.querySelector("body").style.overflow = "hidden"; + if(window.innerWidth > 660) titleTag.focus(); +}); + +closeIcon.addEventListener("click", () => { + isUpdate = false; + titleTag.value = descTag.value = ""; + popupBox.classList.remove("show"); + document.querySelector("body").style.overflow = "auto"; +}); + +function showNotes() { + if(!notes) return; + document.querySelectorAll(".note").forEach(li => li.remove()); + notes.forEach((note, id) => { + let filterDesc = note.description.replaceAll("\n", '
    '); + let liTag = `
  • +
    +

    ${note.title}

    + ${filterDesc} +
    +
    + ${note.date} +
    + + +
    +
    +
  • `; + addBox.insertAdjacentHTML("afterend", liTag); + }); +} +showNotes(); + +function showMenu(elem) { + elem.parentElement.classList.add("show"); + document.addEventListener("click", e => { + if(e.target.tagName != "I" || e.target != elem) { + elem.parentElement.classList.remove("show"); + } + }); +} + +function deleteNote(noteId) { + let confirmDel = confirm("Are you sure you want to delete this note?"); + if(!confirmDel) return; + notes.splice(noteId, 1); + localStorage.setItem("notes", JSON.stringify(notes)); + showNotes(); +} + +function updateNote(noteId, title, filterDesc) { + let description = filterDesc.replaceAll('
    ', '\r\n'); + updateId = noteId; + isUpdate = true; + addBox.click(); + titleTag.value = title; + descTag.value = description; + popupTitle.innerText = "Update a Note"; + addBtn.innerText = "Update Note"; +} + +addBtn.addEventListener("click", e => { + e.preventDefault(); + let title = titleTag.value.trim(), + description = descTag.value.trim(); + + if(title || description) { + let currentDate = new Date(), + month = months[currentDate.getMonth()], + day = currentDate.getDate(), + year = currentDate.getFullYear(); + + let noteInfo = {title, description, date: `${month} ${day}, ${year}`} + if(!isUpdate) { + notes.push(noteInfo); + } else { + isUpdate = false; + notes[updateId] = noteInfo; + } + localStorage.setItem("notes", JSON.stringify(notes)); + showNotes(); + closeIcon.click(); + } +}); \ No newline at end of file diff --git a/Notes App/style.css b/Notes App/style.css new file mode 100644 index 00000000..1778b770 --- /dev/null +++ b/Notes App/style.css @@ -0,0 +1,254 @@ +/* Import Google Font - Poppins */ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap"); + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: "Poppins", sans-serif; +} + +body { + background: #88abff; +} +::selection { + color: #fff; + background: #618cf8; +} +.wrapper { + margin: 50px; + display: grid; + gap: 25px; + grid-template-columns: repeat(auto-fill, 265px); +} +.wrapper li { + height: 250px; + list-style: none; + border-radius: 5px; + padding: 15px 20px 20px; + background: #fff; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05); +} +.add-box, +.icon, +.bottom-content, +.popup, +header, +.settings .menu li { + display: flex; + align-items: center; + justify-content: space-between; +} +.add-box { + cursor: pointer; + flex-direction: column; + justify-content: center; +} +.add-box .icon { + height: 78px; + width: 78px; + color: #88abff; + font-size: 40px; + border-radius: 50%; + justify-content: center; + border: 2px dashed #88abff; +} +.add-box p { + color: #88abff; + font-weight: 500; + margin-top: 20px; +} +.note { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.note .details { + max-height: 165px; + overflow-y: auto; +} +.note .details::-webkit-scrollbar, +.popup textarea::-webkit-scrollbar { + width: 0; +} +.note .details:hover::-webkit-scrollbar, +.popup textarea:hover::-webkit-scrollbar { + width: 5px; +} +.note .details:hover::-webkit-scrollbar-track, +.popup textarea:hover::-webkit-scrollbar-track { + background: #f1f1f1; + border-radius: 25px; +} +.note .details:hover::-webkit-scrollbar-thumb, +.popup textarea:hover::-webkit-scrollbar-thumb { + background: #e6e6e6; + border-radius: 25px; +} +.note p { + font-size: 22px; + font-weight: 500; +} +.note span { + display: block; + color: #575757; + font-size: 16px; + margin-top: 5px; +} +.note .bottom-content { + padding-top: 10px; + border-top: 1px solid #ccc; +} +.bottom-content span { + color: #6d6d6d; + font-size: 14px; +} +.bottom-content .settings { + position: relative; +} +.bottom-content .settings i { + color: #6d6d6d; + cursor: pointer; + font-size: 15px; +} +.settings .menu { + z-index: 1; + bottom: 0; + right: -5px; + padding: 5px 0; + background: #fff; + position: absolute; + border-radius: 4px; + transform: scale(0); + transform-origin: bottom right; + box-shadow: 0 0 6px rgba(0, 0, 0, 0.15); + transition: transform 0.2s ease; +} +.settings.show .menu { + transform: scale(1); +} +.settings .menu li { + height: 25px; + font-size: 16px; + margin-bottom: 2px; + padding: 17px 15px; + cursor: pointer; + box-shadow: none; + border-radius: 0; + justify-content: flex-start; +} +.menu li:last-child { + margin-bottom: 0; +} +.menu li:hover { + background: #f5f5f5; +} +.menu li i { + padding-right: 8px; +} + +.popup-box { + position: fixed; + top: 0; + left: 0; + z-index: 2; + height: 100%; + width: 100%; + background: rgba(0, 0, 0, 0.4); +} +.popup-box .popup { + position: absolute; + top: 50%; + left: 50%; + z-index: 3; + width: 100%; + max-width: 400px; + justify-content: center; + transform: translate(-50%, -50%) scale(0.95); +} +.popup-box, +.popup { + opacity: 0; + pointer-events: none; + transition: all 0.25s ease; +} +.popup-box.show, +.popup-box.show .popup { + opacity: 1; + pointer-events: auto; +} +.popup-box.show .popup { + transform: translate(-50%, -50%) scale(1); +} +.popup .content { + border-radius: 5px; + background: #fff; + width: calc(100% - 15px); + box-shadow: 0 0 15px rgba(0, 0, 0, 0.1); +} +.content header { + padding: 15px 25px; + border-bottom: 1px solid #ccc; +} +.content header p { + font-size: 20px; + font-weight: 500; +} +.content header i { + color: #8b8989; + cursor: pointer; + font-size: 23px; +} +.content form { + margin: 15px 25px 35px; +} +.content form .row { + margin-bottom: 20px; +} +form .row label { + font-size: 18px; + display: block; + margin-bottom: 6px; +} +form :where(input, textarea) { + height: 50px; + width: 100%; + outline: none; + font-size: 17px; + padding: 0 15px; + border-radius: 4px; + border: 1px solid #999; +} +form :where(input, textarea):focus { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.11); +} +form .row textarea { + height: 150px; + resize: none; + padding: 8px 15px; +} +form button { + width: 100%; + height: 50px; + color: #fff; + outline: none; + border: none; + cursor: pointer; + font-size: 17px; + border-radius: 4px; + background: #6a93f8; +} + +@media (max-width: 660px) { + .wrapper { + margin: 15px; + gap: 15px; + grid-template-columns: repeat(auto-fill, 100%); + } + .popup-box .popup { + max-width: calc(100% - 15px); + } + .bottom-content .settings i { + font-size: 17px; + } +} diff --git a/Password Generator/index.html b/Password Generator/index.html new file mode 100644 index 00000000..b9b8e9db --- /dev/null +++ b/Password Generator/index.html @@ -0,0 +1,68 @@ + + + + + + password generator + + + + + + +
    + + + + +
    +
    +
    +

    Generate a Strong Brand New PassWord to Secure Your Digital World

    +
    +
    +

    Generated password: 👇

    +
    +

    +
    +
    + + +
    +

    Password Copied

    +
    + +
    +
    + + +

    12

    +
    +
    + + + + +
    +
    + + + + +
    +
    +
    +
    +
    +
    +

    Made with 💛 by pabitra0011

    +
    + + + \ No newline at end of file diff --git a/Password Generator/main.js b/Password Generator/main.js new file mode 100644 index 00000000..4acdcdaa --- /dev/null +++ b/Password Generator/main.js @@ -0,0 +1,62 @@ + +const passwordContainer = document.querySelector(".password h2"); +const generateBtn = document.querySelector(".generate-btn") +const copyBtn = document.querySelector(".copy-btn") +const checkNumber = document.getElementById("number") +const checkSymbol = document.getElementById("symbol") +const checkUpper = document.getElementById("uppercase") +const checkLower = document.getElementById("lowercase") + +const lengthValue = document.getElementById("rangevalue") +const lengthBtn = document.getElementById("length") + +const coiped = document.querySelector(".copy-text-alert") + +let length = 12 +lengthBtn.addEventListener("input", () => { + lengthValue.innerText = lengthBtn.value; + length = lengthValue.innerText +}) +checkLower.checked = true; + +const createNewPassword = (len) => { + let res = '' + let chars = ''; + + if (checkNumber.checked) { + chars += '0123456729850589' + } + if (checkSymbol.checked) { + chars += '!@#$%^&*?/.,=+-_' + } + if (checkUpper.checked) { + chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + } + if (checkLower.checked) { + chars += 'abcdefghijklmnopqrstuvwxyz' + } + + let c = 0; + while (c < len) { + res += chars.charAt(Math.floor(Math.random() * chars.length)) + c++; + } + + return res; +} + +generateBtn.addEventListener("click", () => { + passwordContainer.textContent = createNewPassword(length) +}) + +copyBtn.addEventListener("click", () => { + const txt = passwordContainer.textContent; + navigator.clipboard.writeText(txt); + + coiped.style.display = "block" + setTimeout(function () { + coiped.style.display = "none" + }, 1000); + +}) + diff --git a/Password Generator/style.css b/Password Generator/style.css new file mode 100644 index 00000000..dcee946a --- /dev/null +++ b/Password Generator/style.css @@ -0,0 +1,177 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; +} +a{ + text-decoration: none; +} +li{ + list-style: none; +} + +header{ + background-color: rgb(8, 32, 110); + display: flex; + justify-content: space-between; + flex-wrap: wrap; + padding: 1.5rem; +} +.logo{ + font-size: 2.5rem; + color: red; +} + .navlist ul{ + display: flex; +} +.navlist ul li{ + margin: 0 0.5rem; +} + .navlist ul li a{ + font-size: 1.5rem; + color: rgb(253, 165, 165); +} +.navlist ul li a:hover{ + text-decoration: underline; +} +.header-right{ + display: flex; + gap: 2rem; +} +.password-section{ + background-color: #063e5e; + border-radius: 0% 0 0 0; +} +.password-section-container{ + max-width: 70vw; + margin: auto; + padding: 5rem 0; +} +.password-section-container h1{ + color: white; + text-align: center; +} +.password-generator-container{ + padding: 5rem 0; +} +.password-container h2{ + color: rgb(255, 199, 57); +} +.password{ + background-color: white; + padding: 1rem ; + border-radius: 15px; + text-align: center; + margin: 0.5rem 0; +} +.password h2{ + letter-spacing: 4px; + color: rgb(0, 47, 255); + word-wrap: break-word; +} +.generator-btns{ + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + padding: 1rem 0; +} +.generate-btn{ + background: linear-gradient(40deg,rgb(7, 234, 241),rgb(214, 7, 255)); + font-size: 1.5rem; + padding: 0.4rem 0.3rem; + border-radius: 20px; + border: none; +} +.generate-btn:hover{ + cursor: pointer; + background: linear-gradient(40deg,rgb(214, 7, 255),rgb(7, 234, 241)); +} +.copy-btn{ + font-size: 1.3rem; + padding: 0.2rem 0.4rem; + border: none; + border-top-left-radius: 10px; + border-bottom-right-radius: 10px; +} +.copy-btn:hover{ + background: linear-gradient(40deg,rgb(214, 7, 255),rgb(7, 234, 241)); + cursor: pointer; +} +.copy-text-alert{ + color: rgb(15, 218, 245); + font-size: 1.8rem; + text-align: center; + display: none; +} +.show-copy-alert{ + display: block; +} + +.customization-section{ + border: 1px solid red; + border-radius: 20px; + padding: 1rem; + margin: 2rem 0; + text-align: center; + color: white; +} +.length-section{ + font-size: 1.5rem; + +} +.num { + padding: 1rem 0; + font-size: 1.4rem; +} + label{ + padding-right: 1rem; + padding-left: 0.5rem; +} +.symbol{ + font-size: 1.4rem; +} + input[type=checkbox]{ + transform: scale(1.7); +} +input[type=checkbox]:hover{ + cursor: pointer; +} +#length{ + height: 10px; + border-radius: 5px; + background: #ff6767; + outline: none; + opacity: 0.7; + -webkit-transition: .2s; + transition: opacity .2s; +} +#length:hover{ + opacity: 1; +} +.pro > p{ + font-size: 1.2rem; + display: flex; + justify-content: center; + padding: 2rem 0; +} +.pro a{ + font-weight: bold; + background-color: rgb(181, 240, 248); + border-radius: 10px; + padding:0.2rem 0.4rem; +} +.pro a:hover{ + background-color: rgb(250, 204, 204); + transition: 1s; +} + + @media (max-width:600px) { + + .password-section-container{ + max-width: 90vw; + } + + + + } \ No newline at end of file diff --git a/Portfolio_02/about.html b/Portfolio_02/about.html new file mode 100644 index 00000000..b6d4ef6d --- /dev/null +++ b/Portfolio_02/about.html @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + About Page + + + + + + + + + + + + +
    + + + + + + +
    + + +
    + +
    + + +
    +
    +
    + my bio data image +
    + +
    +

    My Bio Data

    +

    Lorem ipsum, dolor sit amet consectetur adipisicing elit. Et voluptas assumenda quam blanditiis + exercitationem doloribus saepe reprehenderit. Minima, illum voluptates.

    +
    +

    Lorem ipsum, dolor sit amet consectetur adipisicing elit. Perferendis, mollitia!

    +
    +
    +

    Java

    +
    + 85% +
    +
    +
    +

    C++

    +
    + 80% +
    +
    +
    +

    HTML

    +
    + 75% +
    +
    +
    +

    CSS

    +
    + 65% +
    +
    +
    +

    JavaScript

    +
    + 50% +
    +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/Portfolio_02/contact.html b/Portfolio_02/contact.html new file mode 100644 index 00000000..4057e8c8 --- /dev/null +++ b/Portfolio_02/contact.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + Contact Page + + + + + + + + + + + + +
    + + + + + + +
    + + +
    + +
    + + + +
    +
    +

    Contact Us

    +
    + + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + +
    + + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/Portfolio_02/css/hh.html b/Portfolio_02/css/hh.html new file mode 100644 index 00000000..74484f66 --- /dev/null +++ b/Portfolio_02/css/hh.html @@ -0,0 +1,53 @@ + + + + + + + + +

    Animated Button

    + + + + + diff --git a/Portfolio_02/css/style.css b/Portfolio_02/css/style.css new file mode 100644 index 00000000..bb563377 --- /dev/null +++ b/Portfolio_02/css/style.css @@ -0,0 +1,1102 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,500;0,600;0,800;1,700&family=Work+Sans:wght@400;500&display=swap'); + + + +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Work Sans', sans-serif; +} + +:root{ + --heading:rgb(0 10 45); + --para:#777777; + --para-tint:#e4e4e4; + --white:#fff; + --black:#212529; + --helper:#8490ff; + --helper-tint:#f3f4ff; + --bg:rgb(249 249 255); + --gradient:linear-gradient(0deg , rgb(132 144 255)0% , rgb(98 189 252 )100%); + + --gradientSupport: -webkit-linear-gradient( + 0deg, + rgb(132 144 255)0% , + rgb(98 189 252 )100% + ); + --shadow:0px 0px 20px 0px rgb(132 144 255 / 20%); /* shadow of language */ + --shadoeSupport: 0px 20px 20px 0px rgb(132 144 255 / 30%); + + + --navbar-bottom : rgb(219, 200, 200); + + --edu-color:gray; + +} + +html{ + font-size: 62.5%; + /* 1rem=10px */ + overflow-x: hidden; +} + +body{ + overflow-x: hidden; +} + +h1,h2,h3,h4{ + font-family: "Arvo", cursive; +} +h1{ + color: var(--heading); + font-size: 6rem; + font-weight: 600; +} + +h3{ + font-size: 1.8rem; + font-weight: 400; +} + +p{ + color: var(--para); + line-height: 1.6; + font-size: 1.7rem; +} + +a{ + text-decoration: none; +} + +li{ + list-style: none; +} + +/* ============================================================== +Header Section start +============================================================= */ + +.header{ + padding: 0 4.8rem; + height: 10rem; + background-color: var(--bg); + + border-bottom:2px solid var(--navbar-bottom); + + /* for navbar items manipulation */ + display: flex; + justify-content: space-between; + align-items: center; +} + +.header .logo{ + height: 8rem; + cursor: pointer; +} + +/* to display lists in horizontal --- apply css on parent class */ + +.navbar-lists{ + display: flex; + gap: 4.8rem; +} + +.navbar-link:link, +.navbar-link:visited{ + display: inline-block; + text-decoration: none; + font-size: 1.8rem; + font-weight: 500; + text-transform: uppercase; + color: var(--black); + transition: color 0.3s linear; /* //after hover change color in 0.3sec */ + +} + + +.navbar-link:hover, +.navbar-link:active{ + color: var(--helper); + +} + + +/* responsive header */ + +.mobile-navbar-btn{ + display: none; + background-color: transparent ; + cursor: pointer; + border: none; +} + +.mobile-nav-icon[name="close-outline"]{ + display: none; +} + + +/* sticky Navbar */ +.sticky .header { + position: fixed; + top: 0; + left: 0; + width: 100%; + background-color: rgba(255, 255, 255, 1); + box-shadow: 0 0 2rem 0 rgba(0, 0, 0, 0.1); + z-index: 9999; + padding-top: 0; + padding-bottom: 0; +} + +.sticky .section-hero{ + margin-top: 10rem; +} + + + +/* ============================================================== +Reusable css code +============================================================= */ + +.section{ + padding: 9rem 0; +} + +.container { + max-width: 140rem; + margin: 0 auto; +} + + +.grid{ + display: grid; + gap:9rem; +} + +.grid-three-column{ + grid-template-columns: repeat(3,1fr); + /* grid-template-columns: 1fr 1fr 1fr; */ +} + +.grid-four-column{ + grid-template-columns: repeat(4,1fr); + /* grid-template-columns: 1fr 1fr 1fr 1fr; */ +} + +.grid-two-column{ + grid-template-columns: repeat(2,1fr); + /* grid-template-columns: 1fr 1fr; */ +} + + + +.btn{ + background: var(--gradientSupport); + padding: 1.6rem 3.2rem; + border: none; + border-radius: 10px; + color: var(--helper-tint); + display: inline-block; + text-transform: uppercase; + font-size: 1.8rem; + font-weight: 500; + cursor: pointer; + transition: all 0.3s ease; + -webkit-transition: all 0.3s ease 0s ; + -moz-transition: all 0.3s ease 0s ; + -o-transition: all 0.3s ease 0s ; +} + +.btn:hover, +.btn:active{ + box-shadow: var(--shadoeSupport); + +} + +.common-heading{ + font-size: 4.0rem; + font-weight: 600; + margin-bottom: 6rem; + text-transform: capitalize; + position: relative; +} + +.common-heading::before{ + content: ""; + position: absolute; + top: 110%; + left: 0; + width: 1.5rem; + height: 1.5rem; + background: var(--helper); + border-radius: 50%; + +} + +.common-heading::after{ + + content: ""; + position: absolute; + top: 118%; + left: 1.5rem; + min-width: 20rem; + height: 0.3rem; + background-color: var(--helper); + +} + +/* ============================================================== +Hero Section +============================================================= */ + + + +.section-hero{ + background : var(--bg); +} + +.section-hero-data { + display: flex; + flex-direction: column; + justify-content: center; + /* align-items: flex-start; */ +} + + + + + +/* .section-hero-data{margin-left: 10rem;} */ + + + + +.hero-top-data{ + text-transform: capitalize; + font-weight: 500; + font-size: 3rem; + color: var(--helper); + +} + +.hero-heading{ + text-transform: uppercase; + font-weight: 700; + font-size: 4.5rem; +} + +.hero-para{ + margin-top: 1.5rem; + margin-bottom: 5rem; + max-width: 60rem; +} + +.section-hero-image{ + display: flex; + justify-content: center; + align-items: center; +} + +.hero-img{ + max-width: 80%; + box-shadow: 0px 0px 20px 5px rgb(99, 91, 91); + border-radius: 200px; +} + + +/* ============================================================== +Bio Section +============================================================= */ + + + +.edu{ + font-size: 1.4rem; + color: var(--edu-color); +} + +.bio-image{ + display: flex; + justify-content: center; + align-items: center; + /* filter: drop-shadow(5px 5px 10px rgb(164, 91, 177)); */ + /* margin-left: 7rem; */ +} + +.bio-image img{ + width: 100%; + /* box-shadow: -2rem -2rem 0 0 var(--helper) ; */ + display: inline-block; +} + +/* .bio-data{ + width: 88%; +} */ + +.bio-data-stats{ + display: flex; + padding: 6.4rem 0; + flex-direction: column ; + gap: 3rem; +} + +.bio-stats h3{ + margin-bottom: 1rem; +} + +.bio-progress-bar{ + width: 90%; + height: 0.8rem; + background-color: var(--para-tint); + border-radius: 10rem; + position: relative; + box-shadow: var(--shadow); +} + +.bio-progress-bar::before{ + content: ""; + position: absolute; + top: 0; + left: 0; + width: 85%; + height: inherit; + background: var(--gradientSupport); + border-radius: 10rem; + +} + +.bio-progress-bar-2::before{ + width: 80%; +} +.bio-progress-bar-3::before{ + width: 75%; +} +.bio-progress-bar-4::before{ + width: 65%; +} +.bio-progress-bar-5::before{ + width: 50%; +} + +.bio-progress-bar span{ + position: absolute; + top: 1.8rem; + width: 4rem; + height: 2rem; + background: var(--helper); + color: var(--white); + display: flex; + justify-content: center; + align-items: center; + border: none; + outline: 0; + +} + +.bio-progress-bar span{ + left: 81%; +} +.bio-progress-bar-2 span{ + left: 76%; +} + +.bio-progress-bar-3 span{ + left: 71%; +} + +.bio-progress-bar-4 span{ + left: 61%; +} + +.bio-progress-bar-5 span{ + left: 46%; +} + +/* to create the caret ^ */ + +.bio-progress-bar span::after{ + content: ""; + position: absolute; + width: 0; + height: 0; + border: 0.8rem solid var(--helper); + border-color: transparent; + border-bottom-color: var(--helper); + top: -1.6rem; +} + + +/* ============================================================== +portfolio section +============================================================= */ + + .section-portfolio{ + background: var(--bg); + transition: all 0.7s linear; +} + +.section-portfolio p{ + max-width: 60rem; +} + +.p-btns{ + display: flex; + justify-content: center; + align-items: center; + gap: 3.2rem; + margin-top: 6.4rem; + +} + + .portfolio-images{ + gap:3.2rem; + margin-top: 6.4rem; + } + + .portfolio-images img{ + width: 100%; + border-radius: 10px; + position: relative; + overflow: hidden; + } + + .img-overlay{ + position: relative; + overflow:hidden ; + } + + .img-overlay .overlay{ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background : var(--gradientSupport); + opacity: 0; + + display: flex; + justify-content: center; + align-items: center; + + transform: translateY(100%); + + transition: all 0.4s linear; + border-radius: 10px; + + + } + + .img-overlay:hover > .overlay{ + + transform: translateY(0); + opacity: 0.8; + cursor: pointer; + + } + + .img-overlay .common-heading{ + margin: 0; + color: var(--white); + text-decoration: none; + font-size: 2.8rem; + } + + + + .p-btn-active{ + transform: translateY(-1rem) ; + } + + .p-image-not-active{ + display: none; + } + + + .gitcode{ + display: flex; + flex-direction: column; + align-items: center; + } + + + + .gitcode1{ + background: white; + padding: 1rem 2rem; + border: none; + border-radius: 15px; + color: var(--helper-tint); + display: inline-block; + text-transform: uppercase; + font-size: 1.8rem; + font-weight: 500; + cursor: pointer; + } + +.gitcode1:hover, +.gitcode1:active{ + background-color: rgb(120, 183, 120); + +} + + +/* ============================================================== +Work data section +============================================================= */ + +.section-work-data{ + background: var(--gradientSupport); + text-align: center; + transition: all 0.7s linear; + color: var(--white); + +} + +.counter-numbers{ + font-size: 4.8rem; + +} + +.section-work-data h2{ + font-size: 3rem; +} + +.section-work-data p{ + color: var(--white); + text-transform: capitalize; +} + +/* ============================================================== +Skill section +============================================================= */ + +.section-skill{ + transition: all 0.7s linear; +} + +.section-skill p{ + max-width: 60rem; +} + +.section-skill .grid{ + margin-top: 1rem; + row-gap: 10rem; +} + +.skill-box{ + text-align: center; + box-shadow: var(--shadow); + border-radius: 5px; + padding: 2rem 2rem; + transition: all 0.2s linear; +} + +.skill-box:hover, +.skill-box:active{ + transform: translateY(-3rem); +} + +.skill-img{ + width: 5rem; + height: 5rem; + background-color: rgba(144,172,209,0.2) ; + display: inline-block; + +} + +.skill-box h3{ + margin-top: 2rem; + margin-bottom: 0.5rem; +} + +/* ============================================================== + freelancing section +============================================================= */ + +.section-freelancing{ + background-image: url("../images/folio/3.jpg"); + background-repeat: no-repeat; + background-size: 100%; + background-attachment: fixed; + position: relative; + transition: all 0.7s linear ; + text-align: center; +} + +.section-freelancing .overlay{ + position: absolute; + top:0; + left:0; + width: 100%; + height: 100%; + background-color: var(--helper); + background-color: #3e64ff; + opacity: 0.7; +} + +.section-freelancing .container{ + position: relative; +} + +.section-freelancing h2{ + font-size: 5.4rem; +} + +.section-freelancing span{ + color: #a0f669; +} + +.section-freelancing h2, .section-freelancing p{ + color: var(--white); + margin-bottom: 1.8rem; +} + + +/* ============================================================== + Contact Section +============================================================= */ + +.section-contact-main{ + max-width: 70rem; + margin: 0 auto; + margin-top: 9rem; + transition: all 0.3s linear; + +} + +.section-contact-main .grid{ + gap: 3.2rem ; +} + +.section-contact-main form{ + display: flex; + flex-direction: column; + gap: 3.2rem; +} + +.section-contact-main input, +.section-contact-main textarea{ + padding: 1.5rem 2rem; + border: 0.1rem solid #c9c9c9; + border-radius: 5px; + font-size: 1.6rem; + font-family: "work sans"; + width: 100%; +} + +.section-contact-main input[type="submit"]{ + max-width: 30%; + border:none; +} + + +/* ============================================================== + Footer Section +============================================================= */ + +.section-footer{ + transition: all 0.7s linear; + + background: linear-gradient(300deg ,#6d0493,#433c89 ,rgb(0 10 45)); + background-size: 180% 180%; + animation: gradient-animation 6s ease infinite; +} + + +@keyframes gradient-animation { + 0%{ + background-position: 0% 50%; + } + 50%{ + background-position: 100% 50%; + } + 100%{ + background-position: 0% 50%; + } +} + + + + + + + + +.section-footer h3{ + color: var(--white); + margin-bottom: 4rem; + +} + +.f-about{ + color: #adadad; +} + +.f-link ul, +.f-services ul, +.f-address address{ + display: flex; + flex-direction: column; + gap: 1.8rem; + justify-content: center; +} + +.f-link li, +.f-link a, +.f-services li, +.f-services a{ + font-size: 1.8rem; + color: #adadad; + text-transform: capitalize; +} + +.f-link span, +.f-services span, +.f-address span{ + margin-right: 1rem; +} + +.f-address p, +.f-address p a { + font-style: normal; + color: #adadad; +} + +.f-social-icons{ + margin: 5rem 0; + text-align: center; + color: #adadad; +} + +.f-social-icons .icons{ + width: 4rem; + height: 4rem; + background-color: rgba(144,172,209,0.2) ; + display: inline-block; + padding: 1.4rem 1.8rem; + position: relative; + color: var(--white ); + + animation: water-wave 3s linear infinite; +} + +@keyframes water-wave { + 0% { + border-radius: 56% 44% 70% 30% / 30% 54% 46% 70%; + } + 50% { + border-radius: 3% 97% 15% 85% / 72% 0% 100% 28%; + + } + 100% { + border-radius: 56% 44% 70% 30% / 30% 54% 46% 70%; + } + } + + .f-credis p{ + text-align: center; + color: #adadad; + } + + .section-footer a:hover, + .section-footer a:active { + color: var(--white); + + } + + /* ============================================================== + scroll section start +============================================================= */ + +.scrollTop-style{ + position: fixed; + right: 2%; + bottom: 5%; + /* z-index: 1; */ +} + +.scroll-top{ + width: 4rem; + height: 4rem; + background: var(--helper); + display: inline-block; + padding: 1.4rem 1.8rem; + position: relative; + color: var(--white); + animation: water-wave 3s linear infinite; + cursor: pointer; + +} + + + /* ============================================================== + media queries +============================================================= */ + + /* 1em = 16px */ + + /* for 1500 px */ + +@media(max-width:95em){ /* 1500px*/ + + .container{ + max-width: 130rem; + padding: 0 3.2rem; + } + + .navbar-lists{ + gap: 3.2rem; + } + +} + +/* target 1200px = 75em*/ + +@media(max-width:75em){ + html{ + font-size: 56.25%; + } + + .container{ + max-width: 110rem; + } + + .grid{ + gap: 4.8rem; + } +} + + +@media(max-width:980px){ + + html{ + font-size: 50%; + } + + .header{ + position: relative; + } + + /* .header .logo{ + + height: 10rem; + } */ + + .mobile-navbar-btn{ + display: block; + z-index: 9999; + border: 3px solid var(--black); + color: var(--black); + } + + .mobile-nav-icon{ + width: 5rem; + height: 5rem; + color: var(--black); + } + + .header .logo{ + width: 40%; + } + + .navbar{ + width: 100%; + height: 100vh; + position: absolute; + top: 0; + left: 0; + background: var(--gradient); + + display: flex; + justify-content: center; + align-items: center; + + transform: translateX(100%); + transition: all 0.5s linear; + + visibility: hidden; + opacity: 0; + pointer-events: none; + z-index: 9999; + } + + .navbar-lists{ + flex-direction: column; + align-items: center; + } + + .navbar .navbar-lists .navbar-link:link, + .navbar .navbar-lists .navbar-link:visited{ + color: var(--black); + font-size: 3.2rem; + } + + .active .navbar{ + transform: translateX(0%); + + visibility: visible; + opacity: 1; + pointer-events:auto; + /* z-index: 9999; */ + } + + .active .mobile-navbar-btn .mobile-nav-icon[name="menu-outline"]{ + display: none; + } + + .active .mobile-navbar-btn .mobile-nav-icon[name="close-outline"]{ + display: block; + width: 5rem; + height: 5rem; + } + + .hero-section h1{ + line-height: 1.05; + } + + .section-skill .grid{ + gap: 6rem; + } + + .section-skill .grid-four-column{ /*Make 3 columns*/ + grid-template-columns: repeat(3,1fr); + + } + + .section-footer .grid-four-column{ /*Make 2 columns*/ + grid-template-columns: 1fr 1fr; + } +} + +@media(max-width:50em){ + .container{ + max-width: 71rem; + } + + + + .section-hero .grid-two-column{ /*Make 1 columns*/ + grid-template-columns: 1fr; + } + .section-hero-data{ + align-items: center; + } + .hero-para{ + text-align: center ; + } + .section-hero img{ + width: 70%; + + } + + /* .biodata */ + + .section-biodata .grid-two-column{ + grid-template-columns: 1fr; + } + + .section-biodata .bio-image{ + grid-row-start: 2; + grid-row-end: 3; + /* grid-row: 2/3; */ + margin-top: 3.2rem; + } + + .section-biodata .bio-image img{ + width: 50%; + } + + /* porstfolio section */ + .section-portfolio .grid-three-column{ + grid-template-columns: 1fr 1fr; + } + + /* work data */ + .section-work-data .grid-four-column{ + grid-template-columns: 1fr 1fr; + } + +} + +/* below 560 px */ + +@media(max-width:35em){ /*560px*/ + /* .container{ + max-width: 48rem; + } */ + + .header{ + padding: 0 3.2rem; + } + + .header .logo{ + width: 50%; + } + + .hero-top-data{ + font-size: 2.5rem; + } + + .hero-heading{ + display: flex; + text-align: center; + font-size: 3.5rem; + } + + /* pordtfolio */ + + .p-btns{ + gap: 2.8rem; + } + + .btn{ + padding: 1rem 2rem; + } + + /* skill-section */ + .section-skill .grid-four-column{ + grid-template-columns: 1fr 1fr; + } + .skill-box{ + padding: 1rem 2rem; + } + + /* freelancer */ + .section-freelancing h2{ + font-size: 3rem; + } + + /* contact form */ + .contact-container .grid-two-column{ + grid-template-columns: 1fr; + } + .contact-container{ + padding: 0 4rem; + } + .contact-container .btn{ + font-size: 1.2rem; + display: flex; + justify-content: center; + align-items: center; + } + + /* Footer for mobilr */ + + .section-footer .f-about, + .section-footer.f-address{ + grid-column: 1/-1; + } + + .mobile-nav-icon{ + width: 3rem; + height: 3rem; + } + .active .mobile-navbar-btn .mobile-nav-icon[name="close-outline"]{ + width: 3rem; + height: 3rem; + } +} + + + \ No newline at end of file diff --git a/Portfolio_02/images/C_Logo.png b/Portfolio_02/images/C_Logo.png new file mode 100644 index 00000000..dc7dbd7b Binary files /dev/null and b/Portfolio_02/images/C_Logo.png differ diff --git a/Portfolio_02/images/bootstrap.png b/Portfolio_02/images/bootstrap.png new file mode 100644 index 00000000..dbd6d153 Binary files /dev/null and b/Portfolio_02/images/bootstrap.png differ diff --git a/Portfolio_02/images/c-.png b/Portfolio_02/images/c-.png new file mode 100644 index 00000000..59e7c2c7 Binary files /dev/null and b/Portfolio_02/images/c-.png differ diff --git a/Portfolio_02/images/cb.svg b/Portfolio_02/images/cb.svg new file mode 100644 index 00000000..39c84db8 Binary files /dev/null and b/Portfolio_02/images/cb.svg differ diff --git a/Portfolio_02/images/css-3.png b/Portfolio_02/images/css-3.png new file mode 100644 index 00000000..c4fde121 Binary files /dev/null and b/Portfolio_02/images/css-3.png differ diff --git a/Portfolio_02/images/database.png b/Portfolio_02/images/database.png new file mode 100644 index 00000000..7202eb1a Binary files /dev/null and b/Portfolio_02/images/database.png differ diff --git a/Portfolio_02/images/favicon.ico b/Portfolio_02/images/favicon.ico new file mode 100644 index 00000000..07c0b064 Binary files /dev/null and b/Portfolio_02/images/favicon.ico differ diff --git a/Portfolio_02/images/folio/1.jpg b/Portfolio_02/images/folio/1.jpg new file mode 100644 index 00000000..850443a7 Binary files /dev/null and b/Portfolio_02/images/folio/1.jpg differ diff --git a/Portfolio_02/images/folio/2.jpg b/Portfolio_02/images/folio/2.jpg new file mode 100644 index 00000000..ee18193b Binary files /dev/null and b/Portfolio_02/images/folio/2.jpg differ diff --git a/Portfolio_02/images/folio/3.jpg b/Portfolio_02/images/folio/3.jpg new file mode 100644 index 00000000..bbffc772 Binary files /dev/null and b/Portfolio_02/images/folio/3.jpg differ diff --git a/Portfolio_02/images/folio/4.jpg b/Portfolio_02/images/folio/4.jpg new file mode 100644 index 00000000..b3416a6d Binary files /dev/null and b/Portfolio_02/images/folio/4.jpg differ diff --git a/Portfolio_02/images/folio/5.jpg b/Portfolio_02/images/folio/5.jpg new file mode 100644 index 00000000..fb195002 Binary files /dev/null and b/Portfolio_02/images/folio/5.jpg differ diff --git a/Portfolio_02/images/folio/6.jpg b/Portfolio_02/images/folio/6.jpg new file mode 100644 index 00000000..2f18a659 Binary files /dev/null and b/Portfolio_02/images/folio/6.jpg differ diff --git a/Portfolio_02/images/folio/7.jpg b/Portfolio_02/images/folio/7.jpg new file mode 100644 index 00000000..f13e9e10 Binary files /dev/null and b/Portfolio_02/images/folio/7.jpg differ diff --git a/Portfolio_02/images/folio/8.jpg b/Portfolio_02/images/folio/8.jpg new file mode 100644 index 00000000..7027208c Binary files /dev/null and b/Portfolio_02/images/folio/8.jpg differ diff --git a/Portfolio_02/images/folio/9.jpg b/Portfolio_02/images/folio/9.jpg new file mode 100644 index 00000000..835c6beb Binary files /dev/null and b/Portfolio_02/images/folio/9.jpg differ diff --git a/Portfolio_02/images/hero1.jpg b/Portfolio_02/images/hero1.jpg new file mode 100644 index 00000000..88d4a086 Binary files /dev/null and b/Portfolio_02/images/hero1.jpg differ diff --git a/Portfolio_02/images/html.png b/Portfolio_02/images/html.png new file mode 100644 index 00000000..74a479e3 Binary files /dev/null and b/Portfolio_02/images/html.png differ diff --git a/Portfolio_02/images/img1-modified.png b/Portfolio_02/images/img1-modified.png new file mode 100644 index 00000000..761b06b1 Binary files /dev/null and b/Portfolio_02/images/img1-modified.png differ diff --git a/Portfolio_02/images/java.png b/Portfolio_02/images/java.png new file mode 100644 index 00000000..b9425ad0 Binary files /dev/null and b/Portfolio_02/images/java.png differ diff --git a/Portfolio_02/images/js.png b/Portfolio_02/images/js.png new file mode 100644 index 00000000..9f148627 Binary files /dev/null and b/Portfolio_02/images/js.png differ diff --git a/Portfolio_02/images/k.jpg b/Portfolio_02/images/k.jpg new file mode 100644 index 00000000..f7c6a955 Binary files /dev/null and b/Portfolio_02/images/k.jpg differ diff --git a/Portfolio_02/images/logo1.png b/Portfolio_02/images/logo1.png new file mode 100644 index 00000000..2ebc6fbe Binary files /dev/null and b/Portfolio_02/images/logo1.png differ diff --git a/Portfolio_02/images/nodejs.png b/Portfolio_02/images/nodejs.png new file mode 100644 index 00000000..a75270ee Binary files /dev/null and b/Portfolio_02/images/nodejs.png differ diff --git a/Portfolio_02/images/python.png b/Portfolio_02/images/python.png new file mode 100644 index 00000000..85d0a907 Binary files /dev/null and b/Portfolio_02/images/python.png differ diff --git a/Portfolio_02/images/react.png b/Portfolio_02/images/react.png new file mode 100644 index 00000000..18c35330 Binary files /dev/null and b/Portfolio_02/images/react.png differ diff --git a/Portfolio_02/index.html b/Portfolio_02/index.html new file mode 100644 index 00000000..568abd29 --- /dev/null +++ b/Portfolio_02/index.html @@ -0,0 +1,470 @@ + + + + + + + + + + + + + + + + + Kedarnath Rothe💙💙 + + + + + + + + + + + + + + + +
    + + + + + + +
    + + +
    + +
    + + + + +
    +
    +
    +
    +

    this is me

    +

    kedar rothe

    +

    + Hi, I'm Kedarnath Frontend Developer Based In Pune, Maharashtra +

    +
    + Hire Me +
    +
    + +
    + hero image +
    +
    +
    +
    + + +
    +
    +
    + + + + my bio data image +
    + +
    +

    QUALIFICATION

    +
    +
    +

    B.Tech in Information Technology

    +
    Vishwakarma Institute of Information Technology, Pune
    +
    2021 - 2025
    +
    9.31 CGOA
    +
    +
    +

    12th Class

    +
    SSGM college, Kopargaon

    +
    2020-2021
    +
    88.89%
    +
    +
    + +
    + +
    +
    +

    Java

    +
    + 85% +
    +
    +
    +

    C++

    +
    + 80% +
    +
    +
    +

    HTML

    +
    + 75% +
    +
    +
    +

    CSS

    +
    + 65% +
    +
    +
    +

    JavaScript

    +
    + 50% +
    +
    + + +
    + +
    +
    +
    + + + +
    +
    +

    Latest Works

    +

    Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum quos, officia ipsum deserunt incidunt + velit eligendi expedita sunt!

    +
    +
    +
    Frontend
    +
    Fullstack
    +
    DSA
    +
    + +
    +
    + my works +
    + + +
    +
    +
    + my works +
    + Projrct 2 +
    +
    +
    + my works +
    + Projrct 3 +
    +
    +
    + my works +
    + Projrct 4 +
    +
    +
    + my works +
    + Projrct 5 +
    +
    +
    + +
    + + + + +
    +
    +

    Skills

    +

    My favorite skills

    +
    + +
    +
    + c +

    C Programming

    +

    Intermidiate

    +
    + +
    + c +

    C++ Programming

    +

    Intermidiate

    +
    + +
    + c +

    Java Programming

    +

    Advance

    +
    + +
    + c +

    Python Programming

    +

    Intermidiate

    +
    + +
    + c +

    HTML

    +

    Intermidiate

    +
    + +
    + c +

    CSS

    +

    Intermidiate

    +
    + +
    + c +

    JavaScript

    +

    Intermidiate

    +
    + +
    + c +

    Bootstrap

    +

    Intermidiate

    +
    + +
    + c +

    React

    +

    Intermidiate

    +
    + +
    + c +

    Nodejs

    +

    Intermidiate

    +
    + +
    + c +

    MySQL

    +

    Intermidiate

    +
    +
    +
    + + + +
    +
    +
    +

    I am available for freelancing

    +

    Lorem ipsum dolor sit amet consectetur adipisicing elit. Debitis, esse atque commodi aut dignissimos + ipsa.

    + HIRE ME +
    +
    + + + + +
    +
    +

    Contact Us

    +
    + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + +
    + + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Portfolio_02/index.js b/Portfolio_02/index.js new file mode 100644 index 00000000..bb45ce63 --- /dev/null +++ b/Portfolio_02/index.js @@ -0,0 +1,97 @@ + +// ================================================== +// Creating a responsive navbar +// ================================================== + +const mobile_nav = document.querySelector(".mobile-navbar-btn"); +const headerElem = document.querySelector(".header"); + +mobile_nav.addEventListener("click", () => { + + headerElem.classList.toggle("active"); + +}); + +// ======================================== +// sticky navigation +// ======================================== + +const heroSection = document.querySelector(".section-hero"); + +const observer = new IntersectionObserver( + (entries) => { + const ent = entries[0]; + console.log(ent); + !ent.isIntersecting + ? document.body.classList.add("sticky") + : document.body.classList.remove("sticky"); + }, + { + // viewport + root: null, + threshold: 0, + // rootMargin: "-100px", + } +); + +observer.observe(heroSection); + + +// ================================================== +// Creating a portfolio tabbed CompositionEvent +// ================================================== + +const p_btns = document.querySelector(".p-btns"); +const p_btn = document.querySelectorAll(".p-btn"); +const p_img_elem = document.querySelectorAll(".img-overlay"); + +p_btns.addEventListener("click", (e) => { + const p_btn_clicked = e.target; + console.log(p_btn_clicked); + + p_btn.forEach((curElem) => curElem.classList.remove("p-btn-active")); + + p_btn_clicked.classList.add("p-btn-active"); + + //to find number in data attributes + + const btn_num = p_btn_clicked.dataset.btnNum; + console.log(btn_num); + + const img_active = document.querySelectorAll(`.p-btn--${btn_num}`) + + p_img_elem.forEach((curElem) => curElem.classList.add("p-image-not-active")); + + img_active.forEach((curElem) => + curElem.classList.remove("p-image-not-active") + ); + + +}); + + +// ================================================== +// Scroll to top button section +// ================================================== + +//without HTML + +// const heroSection = document.querySelector(".section-hero"); + +const footerElem = document.querySelector(".section-footer"); + +const scroollElement = document.createElement("div"); +scroollElement.classList.add("scrollTop-style"); + +scroollElement.innerHTML = ``; + +footerElem.after(scroollElement); + +const scrollTop = () => { + heroSection.scrollIntoView({ behavior: "smooth" }); +}; + +scroollElement.addEventListener("click", scrollTop); + + + diff --git a/Portfolio_02/service.html b/Portfolio_02/service.html new file mode 100644 index 00000000..8a3d8fc5 --- /dev/null +++ b/Portfolio_02/service.html @@ -0,0 +1,248 @@ + + + + + + + + + + + + + Skill page Page + + + + + + + + + + + + +
    + + + + + + +
    + + +
    + +
    + + + +
    +
    +

    Skills

    +

    My favorite skills

    +
    + +
    +
    + c +

    C Programming

    +

    Intermidiate

    +
    + +
    + c +

    C++ Programming

    +

    Intermidiate

    +
    + +
    + c +

    Java Programming

    +

    Advance

    +
    + +
    + c +

    Python Programming

    +

    Intermidiate

    +
    + +
    + c +

    HTML

    +

    Intermidiate

    +
    + +
    + c +

    CSS

    +

    Intermidiate

    +
    + +
    + c +

    JavaScript

    +

    Intermidiate

    +
    + +
    + c +

    Bootstrap

    +

    Intermidiate

    +
    + +
    + c +

    React

    +

    Intermidiate

    +
    + +
    + c +

    Nodejs

    +

    Intermidiate

    +
    + +
    + c +

    MySQL

    +

    Intermidiate

    +
    +
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/QR_Code_Generator_1/index.html b/QR_Code_Generator_1/index.html new file mode 100644 index 00000000..64c7a08f --- /dev/null +++ b/QR_Code_Generator_1/index.html @@ -0,0 +1,27 @@ + + + + + + QR Code Generator in JavaScript | CodingNepal + + + + +
    +
    +

    QR Code Generator

    + Enter text to create QR code +
    +
    + + +
    +
    + qr-code +
    +
    + + + + \ No newline at end of file diff --git a/QR_Code_Generator_1/script.js b/QR_Code_Generator_1/script.js new file mode 100644 index 00000000..9a7648f2 --- /dev/null +++ b/QR_Code_Generator_1/script.js @@ -0,0 +1,28 @@ +const wrapper = document.querySelector(".wrapper"); +const qrInput = wrapper.querySelector(".form input"); +const generateBtn = wrapper.querySelector(".form button"); +const qrImg = wrapper.querySelector(".qr-code img"); +let preValue; + +generateBtn.addEventListener("click", () => { + const qrValue = qrInput.value.trim(); + + if (!qrValue || preValue === qrValue) return; + + preValue = qrValue; + + generateBtn.innerText = "Generating QR Code..."; + qrImg.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${qrValue}`; + + qrImg.addEventListener("load", () => { + wrapper.classList.add("active"); + generateBtn.innerText = "Generate QR Code"; + }); +}); + +qrInput.addEventListener("keyup", () => { + if (!qrInput.value.trim()) { + wrapper.classList.remove("active"); + preValue = ""; + } +}); diff --git a/QR_Code_Generator_1/style.css b/QR_Code_Generator_1/style.css new file mode 100644 index 00000000..99bfc71e --- /dev/null +++ b/QR_Code_Generator_1/style.css @@ -0,0 +1,126 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Poppins', sans-serif; +} + +body { + display: flex; + padding: 0 10px; + min-height: 100vh; + justify-content: center; + align-items: center; + background:-webkit-linear-gradient( + -90deg, + rgb(32, 144, 172)-50% , + rgb(26, 182, 184)50% , + rgb(38, 8, 77)100% + ); + +} + +.wrapper { + height: 265px; + max-width: 410px; + background: transparent; + border-radius: 7px; + padding: 20px 25px 0; + transition: height 0.2s ease; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + border: 1px solid rgb(119, 193, 191); +} + +.wrapper.active { + height: 530px; +} + +header hl { + font-size: 21px; + font-weight: 500; +} + +header pl { + margin-top: 5px; + color: #575757; + font-size: 16px; +} + +.wrapper .form { + margin: 20px 0 25px; +} + +.form :where(input, button) { + width: 100%; + height: 55px; + border: none; + outline: none; + border-radius: 5px; + transition: 0.1s ease; +} + +.form input { + font-size: 18px; + padding: 0 17px; + border: 1px solid #999; +} + +.form input:focus { + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.13); +} + +.form input::placeholder { + color: #bab1b1; +} + +.form button { + color: #fff; + cursor: pointer; + margin-top: 20px; + font-size: 17px; + background: #5972c5; +} + +.qr-code { + opacity: 0; + display: flex; + padding: 33px 0; + border-radius: 5px; + align-items: center; + pointer-events: none; + justify-content: center; + border: 1px solid #ccc; +} + +.wrapper.active .qr-code { + opacity: 1; + pointer-events: auto; + transition: opacity 0.5s 0.05s ease; +} + +.qr-code img { + width: 170px; +} + +@media (max-width: 430px) { + .wrapper { + height: 255px; + padding: 16px 20px; + } + + .wrapper.active { + height: 510px; + } + + header p { + color: #696969; + } + + .form :where(input, button) { + height: 52px; + } + + .qr-code img { + width: 160px; + } +} \ No newline at end of file diff --git a/Qr_Code_Generator/download.svg b/Qr_Code_Generator/download.svg new file mode 100644 index 00000000..9b092f76 --- /dev/null +++ b/Qr_Code_Generator/download.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Qr_Code_Generator/index.html b/Qr_Code_Generator/index.html new file mode 100644 index 00000000..aa31ace4 --- /dev/null +++ b/Qr_Code_Generator/index.html @@ -0,0 +1,49 @@ + + + + + + + + + Qr-Code-Generator + + + + +
    +
    + + + +
    + +
    +
    + + Download + + + +
    +
    + + + + + + \ No newline at end of file diff --git a/Qr_Code_Generator/script.js b/Qr_Code_Generator/script.js new file mode 100644 index 00000000..b50c2fcd --- /dev/null +++ b/Qr_Code_Generator/script.js @@ -0,0 +1,88 @@ +const download = document.querySelector(".download"); +const dark = document.querySelector(".dark"); +const light = document.querySelector(".light"); +const qrContainer = document.querySelector("#qr-code"); +const qrText = document.querySelector(".qr-text"); +const shareBtn = document.querySelector(".share-btn"); +const sizes = document.querySelector(".sizes"); + +dark.addEventListener("input", handleDarkColor); +light.addEventListener("input", handleLightColor); +qrText.addEventListener("input", handleQRText); +sizes.addEventListener("change", handleSize); +shareBtn.addEventListener("click", handleShare); + +const defaultUrl = "https://dalalsoham.github.io/PORTFOLIO-SOHAM_DALAL.github.io/"; +let colorLight = "#fff", + colorDark = "#000", + text = defaultUrl, + size = 300; + +function handleDarkColor(e) { + colorDark = e.target.value; + generateQRCode(); +} + +function handleLightColor(e) { + colorLight = e.target.value; + generateQRCode(); +} + +function handleQRText(e) { + const value = e.target.value; + text = value; + if (!value) { + text = defaultUrl; + } + generateQRCode(); +} + +async function generateQRCode() { + qrContainer.innerHTML = ""; + new QRCode("qr-code", { + text, + height: size, + width: size, + colorLight, + colorDark, + }); + download.href = await resolveDataUrl(); +} + +async function handleShare() { + setTimeout(async () => { + try { + const base64url = await resolveDataUrl(); + const blob = await (await fetch(base64url)).blob(); + const file = new File([blob], "QRCode.png", { + type: blob.type, + }); + await navigator.share({ + files: [file], + title: text, + }); + } catch (error) { + alert("Your browser doesn't support sharing."); + } + }, 100); +} + +function handleSize(e) { + size = e.target.value; + generateQRCode(); +} + +function resolveDataUrl() { + return new Promise((resolve, reject) => { + setTimeout(() => { + const img = document.querySelector("#qr-code img"); + if (img.currentSrc) { + resolve(img.currentSrc); + return; + } + const canvas = document.querySelector("canvas"); + resolve(canvas.toDataURL()); + }, 50); + }); +} +generateQRCode(); \ No newline at end of file diff --git a/Qr_Code_Generator/share.svg b/Qr_Code_Generator/share.svg new file mode 100644 index 00000000..325935b7 --- /dev/null +++ b/Qr_Code_Generator/share.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + sosmed + + + + + + sosmed + + + + \ No newline at end of file diff --git a/Qr_Code_Generator/style.css b/Qr_Code_Generator/style.css new file mode 100644 index 00000000..166afa21 --- /dev/null +++ b/Qr_Code_Generator/style.css @@ -0,0 +1,140 @@ +*{ + box-sizing: border-box; +} + +body{ + background: #1c1e26; + font-family: sans-serif; + max-width: 500px; + height: 100vh; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; + color: #fff; +} + +input[type="color"]{ + border: none; + width: 32.5%; + height: 40px; + border-radius: 3px; +} + +input[type="color"]::-webkit-color-swatch-wrapper{ + padding: 0; +} + +input[type="color"]::-webkit-color-swatch{ + border: none; +} + +a{ + text-decoration: none; +} + +.qr-text{ + padding: 1rem; + display: block; + background: #181b29; + border: 1px solid #414866; + border-radius: 4px; + width: 100%; + margin: 0.5rem 0 1rem 0; + color: #fff; + outline: none; +} + +.qr-text::placeholder{ + color: #8b92b7; + font-weight: 500; +} + +#qr-code{ + height: 500px; + width: 500px; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #414866; +} + +#qr-code img, #qr-code canvas{ + max-width: 100% !important; + max-height: 100% !important; +} + +.row{ + display: flex; + align-items: center; + justify-content: space-between; +} + +.sizes{ + width: 32.5%; + height: 40px; + color: #fff; + background: #181b29; + border: 1px solid #414866; + border-radius: 4px; + outline: none; +} + +.btn{ + color: #fff; + max-width: 200px; + padding: 14px; + background: rgb(106, 43, 255); + border-radius: 4px; + border: none; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + font-size: 1.1rem; + font-weight: 500; + flex: 1; +} + +.btn img{ + width: 20px; + margin-left: 10px; +} + +.share-btn{ + margin-left: 0.7rem; +} + +.action-container{ + display: flex; + margin: 1rem 0; +} + + +@media (max-width: 512px){ + body{ + max-width: 100%; + padding: 10px; + } + #qr-code{ + width: 95vw; + height: 95vw; + } + #qr-code img, #qr-code canvas{ + max-width: 95vw !important; + max-height: 95vw !important; + } + .btn{ + min-width: unset; + } +} + +@media (max-width: 350px){ + .action-container{ + flex-direction: column; + } + .share-btn{ + margin-left: 0; + margin-top: 0.7rem; + } +} \ No newline at end of file diff --git a/Quiz/Quiz.css b/Quiz/Quiz.css new file mode 100644 index 00000000..c07e49e6 --- /dev/null +++ b/Quiz/Quiz.css @@ -0,0 +1,45 @@ +*{ + padding: 0; + margin: 0; +} +body { + background-color: darkslategray; +} +div { + margin-left: 10vw; + margin-right: 10vw; + border-radius: 15px; + position: relative; + top: 40vh; + text-align: center; + font-size: 350%; + color: rgb(255, 253, 253); + background-color: lightsalmon; +} + +div button{ + margin: 3vh; + height: 10vh; + width: 15vw; + background-color: rgb(145, 47, 47); + font-size: 65%; + color: rgb(233, 226, 226); + border: none; + border-radius: 10px; +} +div input::-webkit-inner-spin-button, +div input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} +div input{ + position: relative; + padding: 0; + top: -0.3ch; + text-align: center; + height: 6vh; + border-radius: 10px; + border: none; + font-size: 52%; + outline: none; +} diff --git a/Quiz/Quiz.html b/Quiz/Quiz.html new file mode 100644 index 00000000..642eee01 --- /dev/null +++ b/Quiz/Quiz.html @@ -0,0 +1,14 @@ + + + + + + Document + + + +
    +
    + + + \ No newline at end of file diff --git a/Quiz/Quiz.js b/Quiz/Quiz.js new file mode 100644 index 00000000..33ca8a1d --- /dev/null +++ b/Quiz/Quiz.js @@ -0,0 +1,67 @@ +const take = document.querySelector(".takeQuiz"); + +take.innerHTML = "" + +let num1 = ""; +let num2 = ""; +let sing = ""; +function quiz() { + num1 = randomNum(); + num2 = randomNum(); + sing = randomSing(); + let answer = ""; + if (sing == 1) { + answer = num1 + num2; + take.innerHTML = ` +

    ${num1} + ${num2} = ??

    + + + ` + } else if (sing == 2) { + answer = num1 - num2; + take.innerHTML = ` +

    ${num1} - ${num2} = ??

    + + + ` + } else if (sing == 3) { + answer = num1 * num2; + take.innerHTML = ` +

    ${num1} * ${num2} = ??

    + + + ` + } else { + answer = num1 / num2; + take.innerHTML = ` +

    ${num1} / ${num2} = ??

    + + + ` + } +} +function submit(val, target) { + if (target.value == val) { + take.innerHTML = ` +

    Your answer is correct

    + + ` + } else { + take.innerHTML = ` +

    Your answer is wrong

    + + ` + } +} + +function retake() { + quiz(); +} +function randomSing() { + return Math.floor(Math.random() * 4) + 1; +} +function randomNum() { + + let ref = Math.floor(Math.random() * 100) + 1; + return ref; +} diff --git a/README.md b/README.md index 52ac4b5e..919ad186 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,73 @@ -# [Ultimate-Web-Development-Resources](https://github.com/DHANUSHXENO/Ultimate-Web-Development-Resources) +# [Ultimate-Web-Development-Resources](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources) A collection of Web Developement Resources at one place -![Ultimate-Web-Development-Resources by Dhanush N](https://github.com/DHANUSHXENO/Ultimate-Web-Development-Resources/blob/main/cover.png) +![Ultimate-Web-Development-Resources by Dhanush N](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/blob/main/cover.png) ## Contributing -Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Development-Resources/blob/main/CONTRIBUTING.md), [CODE-OF-CONDUCT](https://github.com/DHANUSHXENO/Ultimate-Web-Development-Resources/blob/main/CODE-OF-CONDUCT.md) for details before you contribute. +Please see [CONTRIBUTING](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/blob/main/CONTRIBUTING.md), [CODE-OF-CONDUCT](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/blob/main/CODE-OF-CONDUCT.md) for details before you contribute. + +## Steps of contribution + +Contributions to this repository are welcome! please follow these steps: + +1. Fork the repository and clone it to your local machine. + +2. Create a new branch for your contribution: + + ```bash + git checkout -b {{branch-name}} + ``` + +3. Add your project to the repository. Make sure to include all the necessary files and instructions to run the project. + +4. Commit your changes with descriptive commit messages. + +5. Push your changes to your forked repository: + + ```bash + git push origin {{branch-name}} + ``` + +6. Open a pull request on the main repository and provide a detailed description of your project. + +Your project will be reviewed, and once approved, it will be merged into the main repository. ## Table of Contents -- [Web Development Roadmaps](#web-development-roadmaps) -- [Web design softwares](#web-design-softwares) -- [Prototyping tools for UI/UX](#prototyping-tools-for-uiux) -- [Free Hosting](#free-hosting) -- [Websites to learn](#websites-to-learn) -- [Websites for code challenges](#websites-for-code-challenges) -- [Web Images or Photos](#web-images-or-photos) -- [Web Color Palettes](#web-color-palettes) -- [Chrome Extensions For Web Developers](#chrome-extensions-for-web-developers) -- [Chart Visualizations](#chart-visualizations) -- [Web Illustrations](#web-illustrations) -- [Web fonts](#web-fonts) -- [Website Optimization Tools](#website-optimization-tools) -- [Interview Preparation](#interview-preparation) -- [Free Website Templates For Inspiration](#free-website-templates-for-inspiration) -- [Website Copier](#website-copier) -- [Bio Links](#Bio-Links) -- [Github Student Developer Pack Resources](#Github-Student-Developer-Pack-Resources) -- [Website for Project Management and Notes](#website-for-project-management-and-notes) -- [User Authentication](#user-authentication) -- [Animations and Graphics](#animations-and-graphics) -- [Awesome CSS generators](#awesome-css-generators) -- [Free YouTube resources](#free-youtube-resources) -- [HTML Learning Resources](#HTML-Learning-Resources) -- [CSS Learning Resources](#CSS-Learning-Resources) -- [JS Learning Resources](#JS-Learning-Resources) -- [Code Playgrounds](#code-playgrounds) -- [Top React Component Libraries](#Top-React-Component-Libraries) -- [Top JavaScript Libraries](#Top-JavaScript-Libraries) -- [Top JavaScript Frameworks](#Top-JavaScript-Frameworks) +- [Ultimate-Web-Development-Resources](#ultimate-web-development-resources) + - [Web Development Roadmaps](#web-development-roadmaps) + - [Web design softwares](#web-design-softwares) + - [Prototyping tools for UI/UX](#prototyping-tools-for-uiux) + - [Free Hosting](#free-hosting) + - [Websites to learn](#websites-to-learn) + - [Websites for code challenges](#websites-for-code-challenges) + - [Web Images or Photos](#web-images-or-photos) + - [Web Color Palettes](#web-color-palettes) + - [Chrome Extensions For Web Developers](#chrome-extensions-for-web-developers) + - [Chart Visualizations](#chart-visualizations) + - [Web Illustrations](#web-illustrations) + - [Web fonts](#web-fonts) + - [Website Optimization Tools](#website-optimization-tools) + - [Interview Preparation](#interview-preparation) + - [Free Website Templates For Inspiration](#free-website-templates-for-inspiration) + - [Website Copier](#website-copier) + - [Bio Links](#bio-links) + - [Github Student Developer Pack Resources](#github-student-developer-pack-resources) + - [Website for Project Management and Notes](#website-for-project-management-and-notes) + - [User Authentication](#user-authentication) + - [Animations and Graphics](#animations-and-graphics) + - [Awesome CSS generators](#awesome-css-generators) + - [Free YouTube resources](#free-youtube-resources) + - [Code Playgrounds](#code-playgrounds) + - [HTML Learning Resources](#html-learning-resources) + - [CSS Learning Resources](#css-learning-resources) + - [JS Learning Resources](#js-learning-resources) + - [Top React Component Libraries](#top-react-component-libraries) + - [Top JavaScript Libraries](#top-javascript-libraries) + - [Top JavaScript Frameworks](#top-javascript-frameworks) + - [List Of Projects](#list-of-projects) ## Web Development Roadmaps @@ -57,6 +85,7 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Zeplin](https://zeplin.io/) - [Figma](https://www.figma.com/design/?utm_source=google&utm_medium=cpc&utm_campaign=17873985255&utm_term=design%20software&utm_content=613237509572&gclid=Cj0KCQjwkt6aBhDKARIsAAyeLJ2tS_qfB9w63_uwByAElTGIXk3qtPAajqy-1XXZRc_sjn-xXjlw4WYaArnaEALw_wcB) + ## Prototyping tools for UI/UX - [Figma](https://www.figma.com/) @@ -66,6 +95,8 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Webflow](https://webflow.com/) - [Penpot](https://penpot.app/) - [Balsamiq Wireframing](https://balsamiq.com/) +- [Axure RP](https://www.axure.com/) +- [Origami Studio](https://origami.design/) ## Free Hosting @@ -82,6 +113,7 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [InfinityFree](https://www.infinityfree.net/) - [Deta](https://deta.sh) - [Railway](https://railway.app) +- [Supabase](https://supabase.com) ## Websites to learn @@ -124,6 +156,7 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Frontend Mento](https://www.frontendmentor.io/challenges) - [GeeksforGeeks](https://www.geeksforgeeks.org) - [KodeKloud](https://kodekloud.com/kodekloud-engineer/) +- [Frontend Practice](https://www.frontendpractice.com/) ## Web Images or Photos @@ -143,6 +176,8 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Paletton](http://paletton.com) - [Color Hex](http://color-hex.com) - [MyColor](http://mycolor.space) +- [UIColorPicker](https://uicolorpicker.com/) +- [Realtime Colors](https://www.realtimecolors.com) ## Chrome Extensions For Web Developers @@ -158,6 +193,10 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Page load time](https://chrome.google.com/webstore/detail/page-load-time/fploionmjgeclbkemipmkogoaohcdbig) - [ColorPick Eyedropper](https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg) - [WhatRuns](https://chrome.google.com/webstore/detail/whatruns/cmkdbmfndkfgebldhnkbfhlneefdaaip) +- [ColorZilla](https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp) +- [daily.dev](https://chrome.google.com/webstore/detail/dailydev-the-homepage-dev/jlmpjdjjbgclbocgajdjefcidcncaied) +- [LT Debug](https://chrome.google.com/webstore/detail/lt-debug/kofahhnmgobkidipanhejacffiigppcd) +- [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) ## Chart Visualizations @@ -190,6 +229,9 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [ShapeFest](https://www.shapefest.com/) - [Graphic Burger](https://graphicburger.com/) - [Illustrations Kit](https://illustrationkit.com/) +- [UI Illustrations](https://yashikabhargava.github.io/WebX/public/content/ui-illustrations.html) +- [Humaaans](https://www.humaaans.com/) +- [UI Store](https://www.uistore.design/) ## Web fonts @@ -198,6 +240,7 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Fontspace](https://www.fontspace.com/) - [1001fonts](http://1001fonts.com/) - [fontawesome](https://fontawesome.com/) +- [Font Bundles](https://fontbundles.net/) ## Website Optimization Tools @@ -208,6 +251,9 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Optimizeimages](https://www.optimizeimages.com) - [JSON validator and formatter](https://jsonlint.com) - [DebugBear Speed Test](https://www.debugbear.com/test/website-speed) +- [TinyPNG](https://tinypng.com) +- [JPEG Optimizer](https://jpeg-optimizer.com) +- [CloudConvert](https://cloudconvert.com) ## Interview Preparation @@ -216,6 +262,7 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [React Interview Questions](https://github.com/sudheerj/reactjs-interview-questions) - [Interview Cake](https://www.interviewcake.com) - [Google Interview Warmup](https://grow.google/certificates/interview-warmup/) +- [JS Challenger Interview Handbook](https://jscodechallenges.vercel.app/) ## Free Website Templates For Inspiration @@ -236,11 +283,21 @@ Please see [CONTRIBUTING](https://github.com/DHANUSHXENO/Ultimate-Web-Developmen - [Httrack](https://www.httrack.com/) - [Cyotek WebCopy](https://www.cyotek.com/cyotek-webcopy) +## Let's pick a framework/library for you +- [React-Tutorial](https://www.youtube.com/watch?v=bMknfKXIFA8) +- [React-Docs](https://reactjs.org/) +- [Vue JS-Tutorial](https://www.youtube.com/watch?v=FXpIoQ_rT_c) +- [Vue JS-Docs](https://vuejs.org/tutorial/#step-1) +- [Angular-Tutorial](https://www.youtube.com/watch?v=k5E2AVpwsko) +- [Angular-Docs](https://angular.io/docs) + ## Bio Links - [Linktree](https://linktr.ee/) - [HeyLink](https://heylink.me/) - [BioLink](https://bio.link/) +- [BioDrop](https://www.biodrop.io/) + ## Github Student Developer Pack Resources @@ -261,6 +318,8 @@ More information about the pack can be found here [Github Student Developer Pack - [Firebase](https://firebase.google.com/) - [Clerk](https://clerk.dev/) - [Next Auth](https://next-auth.js.org) +- [Appwrite](https://appwrite.io/) +- [Okta](https://developer.okta.com/docs/reference/api/authn/) ## Animations and Graphics @@ -272,7 +331,6 @@ More information about the pack can be found here [Github Student Developer Pack - [Buttons CSS generator](https://markodenic.com/tools/buttons-generator/) - [Fancy Buttons generator](https://getcssscan.com/css-buttons-examples?ref=beautifulboxshadow-bottom) - [Shapes CSS generator](https://getcssscan.com/css-shapes?ref=beautifulbuttons-bottom/) - - [Neumorphism/Soft UI generator](https://neumorphism.io/#e0e0e0) - [CSS Grid Generator](https://cssgrid-generator.netlify.app/) - [Get Waves](https://getwaves.io/) @@ -299,36 +357,45 @@ More information about the pack can be found here [Github Student Developer Pack - [Wed dev Simplified](https://www.youtube.com/c/WebDevSimplified/featured) - [Thapa Technical](https://www.youtube.com/c/ThapaTechnical) - [Coder Coder](https://www.youtube.com/c/TheCoderCoder) +- [Coder's Gyan](https://www.youtube.com/@CodersGyan) +- [JavaScript Mastery](https://www.youtube.com/@javascriptmastery/featured) +- [developedbyed](https://www.youtube.com/@developedbyed) +- [Apna College](https://www.youtube.com/@ApnaCollegeOfficial) +- [AsmrProg](https://www.youtube.com/@AsmrProg) +- [Akshay Saini](https://www.youtube.com/@akshaymarch7) +- [Codevolution](https://www.youtube.com/@Codevolution) +- [Kevin Powell](https://www.youtube.com/@KevinPowell) +- [codedamn](https://www.youtube.com/@codedamn) +- [Chai aur Code](https://www.youtube.com/@chaiaurcode) +- [developedbyed](https://www.youtube.com/@developedbyed) +- [Hitesh Choudhary](https://www.youtube.com/@HiteshChoudharydotcom) +- [Clever Programmer](https://www.youtube.com/@CleverProgrammer) +- [Sonny Sangha](https://www.youtube.com/@SonnySangha) ## HTML Learning Resources - -- [Resources 1](https://www.youtube.com/watch?v=kUMe1FH4CHE) -- [Resources 2](https://join.codecademy.com/learn/learn-html/) -- [Resources 3](https://www.w3schools.com/html/) -- [Resources 4](https://www.tutorialspoint.com/html/index.htm) -- [Resources 5](https://www.youtube.com/watch?v=pQN-pnXPaVg) -- [Resources 6](https://www.youtube.com/watch?v=UB1O30fR-EE) -- [Resources 7](https://www.youtube.com/watch?v=PlxWf493en4) +- [Learn HTML – Full Tutorial for Beginners(Freecodecamp)](https://www.youtube.com/watch?v=kUMe1FH4CHE) +- [Learn HTML - Codecademy](https://join.codecademy.com/learn/learn-html/) +- [HTML Tutorial - W3schools](https://www.w3schools.com/html/) +- [HTML Tutorial - Tutorialspoint](https://www.tutorialspoint.com/html/index.htm) +- [HTML Full Course - Build a Website Tutorial(Freecodecamp)](https://www.youtube.com/watch?v=pQN-pnXPaVg) +- [HTML Crash Course For Absolute Beginners - Traversy Media](https://www.youtube.com/watch?v=UB1O30fR-EE) +- [HTML Tutorial - How to Make a Super Simple Website(Freecodecamp)](https://www.youtube.com/watch?v=PlxWf493en4) ## CSS Learning Resources - -- [Resources 1](https://web.dev/learn/css/) -- [Resources 2](https://www.codecademy.com/learn/learn-css) -- [Resources 3](https://www.w3schools.com/css/) -- [Resources 4](https://www.youtube.com/watch?v=1Rs2ND1ryYc) -- [Resources 5](https://www.youtube.com/kepowob) -- [Resources 6](https://www.youtube.com/playlist?list=PLZlA0Gpn_vH9D0J0Mtp6lIiD_8046k3si) -- [Resources 7](https://www.simplilearn.com/tutorials/css-tutorial) +- [Learn CSS - web.dev](https://web.dev/learn/css/) +- [Learn CSS - Codecademy](https://www.codecademy.com/learn/learn-css) +- [CSS Tutorial - W3schools](https://www.w3schools.com/css/) +- [CSS Tutorial - Zero to Hero (Complete Course)(Freecodecamp)](https://www.youtube.com/watch?v=1Rs2ND1ryYc) +- [CSS tips and tricks - Kevin Powell](https://www.youtube.com/kepowob) +- [Introduction to CSS - Web Dev Simplified](https://www.youtube.com/playlist?list=PLZlA0Gpn_vH9D0J0Mtp6lIiD_8046k3si) ## JS Learning Resources - -- [Resources 1](https://www.youtube.com/watch?v=PkZNo7MFNFg) -- [Resources 2](https://www.youtube.com/watch?v=W6NZfCO5SIk) -- [Resources 3](https://www.youtube.com/watch?v=jS4aFq5-91M) -- [Resources 4](https://www.w3schools.com/js/) -- [Resources 5](https://join.codecademy.com/learn/introduction-to-javascript/) -- [Resources 6](https://www.freecodecamp.org/news/learn-javascript-free-js-courses-for-beginners/) - +- [Learn JavaScript - Full Course for Beginners (YouTube - FreeCodeCamp)](https://www.youtube.com/watch?v=PkZNo7MFNFg) +- [JavaScript Tutorial for Beginners: Learn JavaScript in 1 Hour (YouTube - Programming With Mosh)](https://www.youtube.com/watch?v=W6NZfCO5SIk) +- [JavaScript Programming - Full Course (YouTube - FreeCodeCamp)](https://www.youtube.com/watch?v=jS4aFq5-91M) +- [JavaScript Tutorial (W3Schools - Documentation)](https://www.w3schools.com/js/) +- [Learn JavaScript - (CodeAcademy - Course)](https://join.codecademy.com/learn/introduction-to-javascript/) +- [Learn JavaScript: Free JS Courses for Beginners (FreeCodeCamp - Documentation)](https://www.freecodecamp.org/news/learn-javascript-free-js-courses-for-beginners/) ## Code Playgrounds @@ -354,6 +421,7 @@ More information about the pack can be found here [Github Student Developer Pack - [ThemeUI](https://theme-ui.com/) ## Top JavaScript Libraries + - [jQuery](https://jquery.com/) - [React.js](https://reactjs.org/) - [D3.js](https://d3js.org/) @@ -366,21 +434,86 @@ More information about the pack can be found here [Github Student Developer Pack - [face-api.js](https://github.com/justadudewhohacks/face-api.js/) ## Top JavaScript Frameworks + - [AngularJS](https://angularjs.org/) - [Bootstrap](https://getbootstrap.com/) - [Vue.js](https://vuejs.org/) - [Ember.js](https://emberjs.com/) -- [Node.js](https://nodejs.org/en/) - [Next.js](https://nextjs.org/) - [Gatsby](https://www.gatsbyjs.com/) -- [ExpressJS](https://expressjs.com/) + + + +## Top JavaScript Runtime + +- [Node.js](https://nodejs.org/en/) +- [Bun](https://bun.sh/) +- [Deno](https://deno.com/) + +## Top JavaScript Frameworks Backend + +- [Express.js](https://expressjs.com/) +- [Hapi.js](https://hapi.dev/) - [Meteor.js](https://www.meteor.com/) +- [Koa.js](https://koajs.com/) +- [Nest.js](https://nestjs.com/) + +## List Of Projects + +| Project Name | GitHub Link | +| -------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| 3D Portfolio | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/3D-Portfolio) | +| Blog Website | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Blog-Website) | +| Bloggers Website | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Blogger-Website-main/blogers%20%20website) | +| Calculator | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/calculator) | +| Chess | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Chess) | +| City Finder | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/City%20Finder) | +| Clock Project | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/ClockProject) | +| DRUM KIT | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/DRUM-KIT) | +| Dice Challenge | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Dice-Challenge) | +| Disney Character Game | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/disney-character-game) | +| Emoji | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Emoji) | +| Expense Tracker App | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/ExpenseTrackerApp) | +| Guess My Number | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/guess%20my%20number) | +| Hangman Game | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Hangman%20Game) | +| Javascript Quiz App | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Javascript%20Quiz%20App) | +| Lang | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/lang) | +| MarioMatching | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/MarioMatching) | +| Memory Cards | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/memorycards) | +| Meme Generator | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Meme-Generator) | +| MERN Blog App | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/mern-blog-app) | +| Myntra Customize | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Myntra%20Customize) | +| Netflix UI Clone | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Netflix%20UI%20Clone) | +| Notes App | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Notes%20App) | +| Password Generator | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Password%20Generator) | +| Portfolio | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/portfolio) | +| Portfolio_02 | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Portfolio_02) | +| QR Code Generator | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Qr_Code_Generator) | +| Random Background Generator | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Random-Background-Generator) | +| Recipe Finder | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Recipe-Finder) | +| Task Management App | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/task-management-app) | +| Table Tennis Scorekeeper | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Table%20Tennis%20scorekeeper) | +| Temperature Converter | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/tempreture-converter) | +| TicTacToe Game | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/TicTacToe%20Game) | +| TO DO List | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/to-do-list) | +| URL Shortener | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/url-shortner) | +| Weather App | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/WeatherApp) | +| Wix Template | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/WixTemplate) | +| Bootstrap Portfolio | [GitHub](https://github.com/DhanushNehru/Ultimate-Web-Development-Resources/tree/main/Bootstrap%20Portfolio) | + +Please note that the links provided are the GitHub repository URLs for each project. + +## Web For Testing and Check The Security Score + +- [Security Headers](https://securityheaders.com/) +- [SSL Labs ](https://www.ssllabs.com/) + ## Tutorial in Other Languages - [Indonesian](./lang/indonesian.md) -Hey, I'm Dhanush N, a Full Stack Developer who likes to contribute to Open Source. You can connect with me and follow my work via [Twitter](https://twitter.com/Dhanush_Nehru) +Hey, I'm Dhanush N, a Full Stack Developer who likes to contribute to Open Source. You can connect with me and follow my work via [X / (Twitter)](https://twitter.com/Dhanush_Nehru) / [Instagram](https://www.instagram.com/dhanush_nehru/) / [Youtube](https://www.youtube.com/@dhanushnehru?sub_confirmation=1) Searching for a job ? This may help you [Ultimate Tech Job List](https://github.com/DhanushNehru/Ultimate-Tech-Jobs) @@ -388,7 +521,6 @@ Searching for a job ? This may help you Want to start learning Node Js ? Dont miss to check this out [Ultimate NodeJs Resources](https://github.com/DhanushNehru/Ultimate-NodeJs-Resources) - If you liked this repository support it by starring ⭐ Thank You for being here :) diff --git a/Random-Background-Generator/color generator.PNG b/Random-Background-Generator/color generator.PNG new file mode 100644 index 00000000..3207ee60 Binary files /dev/null and b/Random-Background-Generator/color generator.PNG differ diff --git a/Random-Background-Generator/index.html b/Random-Background-Generator/index.html new file mode 100644 index 00000000..c330a991 --- /dev/null +++ b/Random-Background-Generator/index.html @@ -0,0 +1,98 @@ + + + + + + Customizable Gradient Background Generator + + + +

    Customizable Gradient Background Generator

    +
    + + +
    + + + + + +
    +
    + + + \ No newline at end of file diff --git a/Recipe-Finder/README.md b/Recipe-Finder/README.md new file mode 100644 index 00000000..b1c0ee88 --- /dev/null +++ b/Recipe-Finder/README.md @@ -0,0 +1,7 @@ + +# Recipe Finder +Created exclusively with `HTML`, `CSS` and `JavaScript`. + +## Screenshot + +![Tourest Desktop Demo](./Screenshot.png "Desktop Demo") \ No newline at end of file diff --git a/Recipe-Finder/Screenshot.png b/Recipe-Finder/Screenshot.png new file mode 100644 index 00000000..e1fae8d0 Binary files /dev/null and b/Recipe-Finder/Screenshot.png differ diff --git a/Recipe-Finder/index.html b/Recipe-Finder/index.html new file mode 100644 index 00000000..e9747868 --- /dev/null +++ b/Recipe-Finder/index.html @@ -0,0 +1,98 @@ + + + + Kitchen Craze + + + + + + +
    +
    +
    Search Your Recipes
    + +
    +
    +
    Filters
    +
    +
    Sort
    + +
    +
    +
    Not Selected
    + +
    +
    +
    Not Selected
    + +
    + +
    +
    +
    +
    + +
    + + + + diff --git a/Recipe-Finder/package.json b/Recipe-Finder/package.json new file mode 100644 index 00000000..8cc13d99 --- /dev/null +++ b/Recipe-Finder/package.json @@ -0,0 +1,16 @@ +{ + "name": "recipe-finder", + "version": "1.0.0", + "description": "", + "main": "index.html", + "scripts": { + "start": "parcel index.html --open", + "build": "parcel build index.html" + }, + "dependencies": {}, + "devDependencies": { + "@babel/core": "7.2.0", + "parcel-bundler": "^1.6.1" + }, + "keywords": [] + } \ No newline at end of file diff --git a/Recipe-Finder/src/rough.js b/Recipe-Finder/src/rough.js new file mode 100644 index 00000000..94c55e29 --- /dev/null +++ b/Recipe-Finder/src/rough.js @@ -0,0 +1,6 @@ +let a = []; +const change = () => { + a = [1, 2, 3]; +}; +change(); +console.log(a); diff --git a/Recipe-Finder/src/script.js b/Recipe-Finder/src/script.js new file mode 100644 index 00000000..b8ed3cfc --- /dev/null +++ b/Recipe-Finder/src/script.js @@ -0,0 +1,264 @@ +let recipesOriginal = []; +let sortedRecipes = []; +let sortedFilteredRecipes = []; +const searchText = document.querySelector("#searchInput"); +const searchBtn = document.querySelector("#searchBtn"); +const sortSelect = document.querySelector("#sortSelect"); +const recipesDiv = document.querySelector("#recipes"); +const loadMoreBtn = document.querySelector("#loadMoreBtn"); +const sortDiv = document.querySelector("#sort"); +const rangeUpdateBtn = document.querySelector("#rangeUpdateBtn"); + +let offset = 0; + +const createElement = ( + tagName, + properties, + styleProperties, + textContent, + parent +) => { + const element = document.createElement(tagName); + if (properties) { + Object.keys(properties).forEach((property) => { + element.setAttribute(property, properties[property]); + }); + } + if (styleProperties) { + Object.keys(styleProperties).forEach((styleProperty) => { + element.style.styleProperty = properties[styleProperty]; + }); + } + if (textContent) element.textContent = textContent; + if (parent) parent.appendChild(element); + return element; +}; + +const makeBtnFetchingDisabled = (loadMoreBtn) => { + loadMoreBtn.textContent = "Fetching..."; + loadMoreBtn.disabled = true; +}; + +const makeBtnMoreEnabled = (loadMoreBtn) => { + loadMoreBtn.textContent = "More"; + loadMoreBtn.disabled = false; +}; +const makeBtnProcessingDisabledVisible = (loadMoreBtn) => { + loadMoreBtn.textContent = "Processing"; + loadMoreBtn.style.visibility = "visible"; + loadMoreBtn.disabled = true; +}; +const alterBtnVisibility = (loadMoreBtn) => { + if (loadMoreBtn.style.visibility === "visible") { + loadMoreBtn.style.visibility = "hidden"; + } else { + loadMoreBtn.style.visibility = "visible"; + } +}; + +const makeUpdatesAfterDisplay = (recipes) => { + if (recipes.length < 5) { + alterBtnVisibility(loadMoreBtn); + } else { + makeBtnMoreEnabled(loadMoreBtn); + } + offset += recipes.length; +}; + +const displayRecipes = (recipes) => { + const newList = recipes.slice(offset, offset + 5); + if (newList.length <= 0) { + alert(`No more recipes are there to show for ${searchText.value}`); + alterBtnVisibility(loadMoreBtn); + return; + } + newList.forEach((recipe) => { + const itemBox = createElement("div", { class: "itemBox" }); + createElement( + "img", + { class: "itemImage", src: recipe.image }, + null, + null, + itemBox + ); + const titleDiv = createElement( + "div", + { class: "titleDiv" }, + null, + null, + itemBox + ); + createElement("div", { class: "titleText" }, null, recipe.title, titleDiv); + createElement( + "button", + { class: "titleBtn" }, + null, + "View recipe", + titleDiv + ); + createElement( + "p", + { class: "extraInfo" }, + null, + `Vegetarian : ${recipe.vegetarian ? "Yes" : "No"}`, + itemBox + ); + createElement( + "p", + { class: "extraInfo" }, + null, + `Likes : ${recipe.aggregateLikes}`, + itemBox + ); + createElement( + "p", + { class: "extraInfo" }, + null, + `Health Score : ${recipe.healthScore}`, + itemBox + ); + createElement( + "p", + { class: "extraInfo" }, + null, + `Price per serving : ${recipe.pricePerServing}`, + itemBox + ); + createElement( + "p", + { class: "extraInfo" }, + null, + `Minutes to prepare : ${recipe.readyInMinutes}`, + itemBox + ); + createElement( + "p", + { class: "extraInfo" }, + null, + `Servings : ${recipe.servings}`, + itemBox + ); + recipesDiv.appendChild(itemBox); + }); + makeUpdatesAfterDisplay(newList); +}; + +const handleErrorOnFetch = (e) => { + alert(`Some error occured : ${e}`); +}; + +const getMinMaxValue = () => { + let minValue = document.querySelector("#minValueInput").value; + let maxValue = document.querySelector("#maxValueInput").value; + if (minValue === "") minValue = 0; + if (maxValue === "") maxValue = 1000000000; + return [minValue, maxValue]; +}; + +const filterRecipes = (sortedRecipes) => { + const [minVal, maxVal] = getMinMaxValue(); + sortedFilteredRecipes = sortedRecipes.filter((recipe) => { + return ( + recipe[sortSelect.value] >= minVal && recipe[sortSelect.value] <= maxVal + ); + }); +}; +const sortCriteriaFunction = (val1, val2) => { + return ( + parseFloat(val1[sortSelect.value]) - parseFloat(val2[sortSelect.value]) + ); +}; + +const sortAndFilterRecipes = () => { + if (sortSelect.value !== "none") { + sortedRecipes = [...recipesOriginal].sort(sortCriteriaFunction); + } else { + sortedRecipes = [...recipesOriginal]; + } + filterRecipes(sortedRecipes); +}; + +const fetchRecipes = () => { + const url = `https://api.spoonacular.com/recipes/complexSearch?query=${searchText.value}&addRecipeInformation=true&number=100&apiKey=4e5eb585ad3f450b84233ec844a378be`; + fetch(url) + .then((response) => { + return response.json(); + }) + .then((jsonResponce) => { + if (jsonResponce.results.length > 0) { + recipesOriginal = jsonResponce.results; + displayRecipes(recipesOriginal); + sortDiv.style.visibility = "visible"; + sortAndFilterRecipes(recipesOriginal); + } else { + throw new Error("No recipe found on your search"); + } + }) + .catch((e) => { + handleErrorOnFetch(e); + }); +}; + +const resetValues = () => { + recipesOriginal = []; + offset = 0; + sortDiv.style.visibility = "hidden"; + recipesDiv.querySelectorAll("*").forEach((node) => node.remove()); +}; + +const changeTheText = (event) => { + const minValueText = document.querySelector("#minValueText"); + const maxValueText = document.querySelector("#maxValueText"); + if (event.target.value === "none") { + minValueText.textContent = "Not Selected"; + maxValueText.textContent = "Not Selected"; + } else { + minValueText.textContent = + event.target.options[event.target.selectedIndex].textContent; + maxValueText.textContent = + event.target.options[event.target.selectedIndex].textContent; + } +}; + +const initForSortAndUpdate = () => { + recipesDiv.querySelectorAll("*").forEach((node) => node.remove()); + makeBtnProcessingDisabledVisible(loadMoreBtn); + offset = 0; +}; + +searchBtn.addEventListener("click", () => { + // console.log(searchText.value.trim().length); + if (searchText.value.trim().length > 0) { + resetValues(); + makeBtnFetchingDisabled(loadMoreBtn); + alterBtnVisibility(loadMoreBtn); + fetchRecipes(); + } +}); +loadMoreBtn.addEventListener("click", () => { + makeBtnFetchingDisabled(loadMoreBtn); + if (sortSelect.value !== "none") { + displayRecipes(sortedFilteredRecipes); + } else { + displayRecipes(recipesOriginal); + } +}); + +sortSelect.addEventListener("change", (event) => { + initForSortAndUpdate(); + changeTheText(event); + if (sortSelect.value !== "none") { + sortAndFilterRecipes(); + displayRecipes(sortedFilteredRecipes); + } else { + displayRecipes(recipesOriginal); + } +}); + +rangeUpdateBtn.addEventListener("click", () => { + if (sortSelect.value !== "none") { + initForSortAndUpdate(); + filterRecipes(sortedRecipes); + displayRecipes(sortedFilteredRecipes); + } +}); diff --git a/Recipe-Finder/src/styles.css b/Recipe-Finder/src/styles.css new file mode 100644 index 00000000..e21fd7aa --- /dev/null +++ b/Recipe-Finder/src/styles.css @@ -0,0 +1,208 @@ +body { + font-family: sans-serif; + background-color: rgb(9, 9, 9); + } + .mTB10 { + margin: 10px 0px; + } + .mLR10 { + margin: 0px 10px; + } + * { + box-sizing: border-box; + margin: 0px; + padding: 0px; + } +.headerName span{ + color: rgb(234, 35, 35); +} +#navigationBar { + position: fixed; + background: rgb(50, 50, 50); + box-shadow:0px 1px 10px 5px #444; + height:auto; + text-align:center; + width:100%; +} +#navigationBar > ul > li { + display:inline; +} +#navigationBar > ul > li > a +{ + color:#fff; + display:inline-block; + height:60px; + line-height:60px; + margin:2px; + padding:0px 15px; + text-decoration:none; + transition: color 0.3s ease-in; +} +#navigationBar > ul > li > a:hover { + color:grey; +} + .greenBtn { + padding: 8px; + background-color: #3e8e41; + color: white; + font-weight: bold; + border-radius: 4px; + border: none; + } + .header { + height: 300px; + width: 100%; + background-color: rgb(50, 50, 50); + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; + } + .nameAndSearch { + width: 100%; + display: flex; + align-items: center; + justify-content: space-evenly; + } + .headerName { + color: white; + font-size: 50px; + font-weight: bold; + } + .search { + display: flex; + align-items: stretche; + } + .searchInput { + padding: 12px; + width: 400px; + border-radius: 4px; + border: none; + } + .searchBtn { + background-color: #3e8e41; + border: none; + border-radius: 4px; + margin: 0px 10px; + padding: 8px; + color: white; + font-weight: bold; + } + .searchBtn:hover { + cursor: pointer; + background-color: rgb(13, 87, 13); + } + .sort { + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + visibility: hidden; + } + + .sortBy { + display: flex; + align-items: center; + } + .sortByText { + color: white; + margin: 0px 10px; + margin-left: 30px; + font-weight: bold; + } + .sortSelect { + padding: 4px 20px; + border: none; + border-radius: 4px; + } + .sortSelect option { + padding: 4px; + background-color: white; + color: black; + } + .valueRange { + display: flex; + align-items: center; + } + .valueText { + color: white; + margin-left: 30px; + } + .valueInput { + margin-left: 10px; + padding: 8px; + border-radius: 4px; + border: none; + } + .recipes { + padding: 40px; + display: flex; + flex-wrap: wrap; + align-items: stretch; + justify-content: space-evenly; + margin: 20px 0px; + } + + .itemBox { + margin: 10px 5px; + width: 30%; + background-color: rgb(80, 80, 80); + border-radius: 8px; + padding: 40px; + display: flex; + flex-direction: column; + align-items: flex-start; + + } + .itemImage { + width: 100%; + height: 300px; + object-fit: cover; + border-radius: 8px; + } + .titleDiv { + width: 100%; + display: flex; + justify-content: space-between; + align-items: flex-start; + padding: 12px 0px; + } + .titleText { + font-size: 20px; + color: white; + font-weight: bold; + } + .titleBtn { + margin-left: 10px; + width: 150px; + padding: 4px 10px; + background-color: #3e8e41; + color: white; + border-radius: 16px; + border: none; + } + .extraInfo { + width: 100%; + padding: 4px 10px; + text-align: left; + color: white; + } + .loadmore { + padding: 5px; + text-align: center; + } + .greenBtnHover{ + padding: 10px; + } + .greenBtnHover:hover { + cursor: pointer; + background-color: rgb(13, 87, 13); + } + footer{ + color: white; + margin-top: 100px; + padding: 40px; + text-align: center; + background-color: rgb(9, 9, 9); + } \ No newline at end of file diff --git a/Scannable QR CODE Generator/index.html b/Scannable QR CODE Generator/index.html new file mode 100644 index 00000000..207b1933 --- /dev/null +++ b/Scannable QR CODE Generator/index.html @@ -0,0 +1,42 @@ + + + + + + QR Gernator + + + +
    +

    QR CODE GERNATOR

    +

    Enter Your URL Or Text

    +
    + +
    +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/Scannable QR CODE Generator/style.css b/Scannable QR CODE Generator/style.css new file mode 100644 index 00000000..fceee798 --- /dev/null +++ b/Scannable QR CODE Generator/style.css @@ -0,0 +1,98 @@ +:root{ + --primary: #11998e; + --secondary:#fffcdc; + --tertiary:#38ef7d; +} +body{ + + margin: opx; + padding: opx; + box-sizing: border-box; + font-family: Arial, sans-serif; + display: flex; + justify-content: center; + align-items: center; + padding: 10px; + background: linear-gradient(100deg,var(--primary),var(--tertiary)); +} +.container{ + margin-top: 150px; + background-color:white; + width: 700px; + padding: 10px; + border-radius: 5px; + box-shadow: 5px 10px 18px #888888; + justify-content: center; + align-items: center; + +} +h1{ + margin-left: 10px; + text-align: center; + align-items: center; + font-weight: 700; +} +p{ + color: black bold; + font-size: 20px; + font-weight: 400px; + margin-left: 10px; + margin-bottom: 10px; + margin-bottom: 5px; +} +input { + width: 80%; + padding: 10px; + margin-left: 10px; + box-sizing: border-box; + border: 1px solid #5f9341; + color: rgb(0, 0, 0); + font-size: 20px; +} + +button { + background:blue; + margin-left: 10px; + color: white; + padding: 10px 20px; + border: 1px solid #5f9341; + font-weight: bold; + align-items: center; + font-weight: 400px; +} +.error{ + animation:shake 0.1s linear 10; +} +@keyframes shake{ + 0%{ + transform: translate(0); + } + 25%{ + transform: translate(-2px); + } + 50%{ + transform: translate(0); + } + 75%{ + transform: translate(2px); + } +} +#imgbox{ + margin-left: 10px; + width: 200px; + border-radius: 5px; + max-height: 0; + overflow: hidden; + transition: max-height 1s; +} +img{ + margin-top: 20px 20px; + margin-left: 100px; + width: 50%; + padding: 10px; +} +#imgbox.show-img{ + max-height: 300px; + margin: 10px auto; + border: 1px solid #d1d1d1; +} \ No newline at end of file diff --git a/TicTacToe Game/index.html b/TicTacToe Game/index.html new file mode 100644 index 00000000..e2489eee --- /dev/null +++ b/TicTacToe Game/index.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + +
    +

    TIC TAC TOE

    +

    + Game starts by just Tap on + box

    First Player starts as + Player X And Second Player as + Player 0 +

    +

    +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    +


    + + +

    +

    +
    + + + diff --git a/TicTacToe Game/logic.js b/TicTacToe Game/logic.js new file mode 100644 index 00000000..2cdc9ba1 --- /dev/null +++ b/TicTacToe Game/logic.js @@ -0,0 +1,426 @@ +// Function called whenever user tab on any box +function myfunc() { + + // Setting DOM to all boxes or input field + var b1, b2, b3, b4, b5, b6, b7, b8, b9; + b1 = document.getElementById("b1").value; + b2 = document.getElementById("b2").value; + b3 = document.getElementById("b3").value; + b4 = document.getElementById("b4").value; + b5 = document.getElementById("b5").value; + b6 = document.getElementById("b6").value; + b7 = document.getElementById("b7").value; + b8 = document.getElementById("b8").value; + b9 = document.getElementById("b9").value; + + var b1btn, b2btn, b3btn, b4btn, b5btn, + b6btn, b7btn, b8btn, b9btn; + + b1btn = document.getElementById("b1"); + b2btn = document.getElementById("b2"); + b3btn = document.getElementById("b3"); + b4btn = document.getElementById("b4"); + b5btn = document.getElementById("b5"); + b6btn = document.getElementById("b6"); + b7btn = document.getElementById("b7"); + b8btn = document.getElementById("b8"); + b9btn = document.getElementById("b9"); + + // Checking if Player X won or not and after + // that disabled all the other fields + if ((b1 == 'x' || b1 == 'X') && (b2 == 'x' || + b2 == 'X') && (b3 == 'x' || b3 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b2btn.style.color = "red"; + b3btn.style.color = "red"; + } + else if ((b1 == 'x' || b1 == 'X') && (b4 == 'x' || + b4 == 'X') && (b7 == 'x' || b7 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b2btn.disabled = true; + b3btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b4btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b7 == 'x' || b7 == 'X') && (b8 == 'x' || + b8 == 'X') && (b9 == 'x' || b9 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + + b7btn.style.color = "red"; + b8btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == 'x' || b3 == 'X') && (b6 == 'x' || + b6 == 'X') && (b9 == 'x' || b9 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + + b3btn.style.color = "red"; + b6btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b1 == 'x' || b1 == 'X') && (b5 == 'x' || + b5 == 'X') && (b9 == 'x' || b9 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + + b1btn.style.color = "red"; + b5btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == 'x' || b3 == 'X') && (b5 == 'x' || + b5 == 'X') && (b7 == 'x' || b7 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b3btn.style.color = "red"; + b5btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b2 == 'x' || b2 == 'X') && (b5 == 'x' || + b5 == 'X') && (b8 == 'x' || b8 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b9btn.disabled = true; + + b2btn.style.color = "red"; + b5btn.style.color = "red"; + b8btn.style.color = "red"; + } + else if ((b4 == 'x' || b4 == 'X') && (b5 == 'x' || + b5 == 'X') && (b6 == 'x' || b6 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b4btn.style.color = "red"; + b5btn.style.color = "red"; + b6btn.style.color = "red"; + } + + // Checking of Player X finish + // Checking for Player 0 starts, Is player 0 won or + // not and after that disabled all the other fields + else if ((b1 == '0' || b1 == '0') && (b2 == '0' || + b2 == '0') && (b3 == '0' || b3 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b2btn.style.color = "red"; + b3btn.style.color = "red"; + } + else if ((b1 == '0' || b1 == '0') && (b4 == '0' || + b4 == '0') && (b7 == '0' || b7 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b2btn.disabled = true; + b3btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b4btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b7 == '0' || b7 == '0') && (b8 == '0' || + b8 == '0') && (b9 == '0' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + + b7btn.style.color = "red"; + b8btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == '0' || b3 == '0') && (b6 == '0' || + b6 == '0') && (b9 == '0' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b3btn.style.color = "red"; + b6btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b1 == '0' || b1 == '0') && (b5 == '0' || + b5 == '0') && (b9 == '0' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + + b1btn.style.color = "red"; + b5btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == '0' || b3 == '0') && (b5 == '0' || + b5 == '0') && (b7 == '0' || b7 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b3btn.style.color = "red"; + b5btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b2 == '0' || b2 == '0') && (b5 == '0' || + b5 == '0') && (b8 == '0' || b8 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b9btn.disabled = true; + + b2btn.style.color = "red"; + b5btn.style.color = "red"; + b8btn.style.color = "red"; + } + else if ((b4 == '0' || b4 == '0') && (b5 == '0' || + b5 == '0') && (b6 == '0' || b6 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b4btn.style.color = "red"; + b5btn.style.color = "red"; + b6btn.style.color = "red"; + } + + // Checking of Player 0 finish + // Here, Checking about Tie + else if ((b1 == 'X' || b1 == '0') && (b2 == 'X' + || b2 == '0') && (b3 == 'X' || b3 == '0') && + (b4 == 'X' || b4 == '0') && (b5 == 'X' || + b5 == '0') && (b6 == 'X' || b6 == '0') && + (b7 == 'X' || b7 == '0') && (b8 == 'X' || + b8 == '0') && (b9 == 'X' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Match Tie"; + } + else { + + // Here, Printing Result + if (flag == 1) { + document.getElementById('print') + .innerHTML = "Player X Turn"; + } + else { + document.getElementById('print') + .innerHTML = "Player 0 Turn"; + } + } +} + +// Function to reset game +function myfunc_2() { + location.reload(); + b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = ''; +} + +// Here onwards, functions check turn of the player +// and put accordingly value X or 0 +flag = 1; +function myfunc_3() { + if (flag == 1) { + document.getElementById("b1").value = "X"; + document.getElementById("b1").disabled = true; + flag = 0; + } + else { + document.getElementById("b1").value = "0"; + document.getElementById("b1").disabled = true; + flag = 1; + } +} + +function myfunc_4() { + if (flag == 1) { + document.getElementById("b2").value = "X"; + document.getElementById("b2").disabled = true; + flag = 0; + } + else { + document.getElementById("b2").value = "0"; + document.getElementById("b2").disabled = true; + flag = 1; + } +} + +function myfunc_5() { + if (flag == 1) { + document.getElementById("b3").value = "X"; + document.getElementById("b3").disabled = true; + flag = 0; + } + else { + document.getElementById("b3").value = "0"; + document.getElementById("b3").disabled = true; + flag = 1; + } +} + +function myfunc_6() { + if (flag == 1) { + document.getElementById("b4").value = "X"; + document.getElementById("b4").disabled = true; + flag = 0; + } + else { + document.getElementById("b4").value = "0"; + document.getElementById("b4").disabled = true; + flag = 1; + } +} + +function myfunc_7() { + if (flag == 1) { + document.getElementById("b5").value = "X"; + document.getElementById("b5").disabled = true; + flag = 0; + } + else { + document.getElementById("b5").value = "0"; + document.getElementById("b5").disabled = true; + flag = 1; + } +} + +function myfunc_8() { + if (flag == 1) { + document.getElementById("b6").value = "X"; + document.getElementById("b6").disabled = true; + flag = 0; + } + else { + document.getElementById("b6").value = "0"; + document.getElementById("b6").disabled = true; + flag = 1; + } +} + +function myfunc_9() { + if (flag == 1) { + document.getElementById("b7").value = "X"; + document.getElementById("b7").disabled = true; + flag = 0; + } + else { + document.getElementById("b7").value = "0"; + document.getElementById("b7").disabled = true; + flag = 1; + } +} + +function myfunc_10() { + if (flag == 1) { + document.getElementById("b8").value = "X"; + document.getElementById("b8").disabled = true; + flag = 0; + } + else { + document.getElementById("b8").value = "0"; + document.getElementById("b8").disabled = true; + flag = 1; + } +} + +function myfunc_11() { + if (flag == 1) { + document.getElementById("b9").value = "X"; + document.getElementById("b9").disabled = true; + flag = 0; + } + else { + document.getElementById("b9").value = "0"; + document.getElementById("b9").disabled = true; + flag = 1; + } +} diff --git a/TicTacToe Game/style.css b/TicTacToe Game/style.css new file mode 100644 index 00000000..8be46a27 --- /dev/null +++ b/TicTacToe Game/style.css @@ -0,0 +1,113 @@ +h1 { + color: orangered; + margin-bottom: -5px; +} +p { + margin-bottom: -10px; +} +.ui { + display: flex; + flex-direction: column; + align-items: center; +} +.row { + display: flex; +} +.cell { + border: none; + width: 80px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + font-size: 24px; + text-align: center; + cursor: pointer; +} +.cell:active { + outline: none; +} +/* 3*3 Grid */ +#b1{ + border-bottom: 1px solid gray; + border-right: 1px solid gray; +} + +#b2 { + border-bottom: 1px solid gray; + border-right: 1px solid gray; + border-left: 1px solid gray; +} + +#b3 { + border-bottom: 1px solid gray; + border-left: 1px solid gray; +} + +#b4 { + border-top: 1px solid gray; + border-bottom: 1px solid gray; + border-right: 1px solid gray; +} + +#b5 { + border: 1px solid gray; +} + +#b6 { + border-top: 1px solid gray; + border-bottom: 1px solid gray; + border-left: 1px solid gray; +} + +#b7 { + border-top: 1px solid gray; + border-right: 1px solid gray; +} + +#b8 { + border-top: 1px solid gray; + border-right: 1px solid gray; + border-left: 1px solid gray; +} + +#b9 { + border-top: 1px solid gray; + border-left: 1px solid gray; +} +/* Reset Button */ +#but { + box-sizing: border-box; + width: 95px; + height: 40px; + border: 1px solid dodgerblue; + margin-left: auto; + border-radius: 8px; + font-family: Verdana, + Geneva, Tahoma, sans-serif; + + background-color: whitesmoke; + color: dodgerblue; + font-size: 20px; + cursor: pointer; +} + +/* Player turn space */ +#print { + font-family: Verdana, + Geneva, Tahoma, sans-serif; + color: dodgerblue; + font-size: 20px; +} + +/* Main Container */ +#main { + text-align: center; +} + +/* Game Instruction Text */ +#ins { + font-family: Verdana,Geneva, + Tahoma, sans-serif; + color: dodgerblue; +} diff --git a/Typing Progress Bar/index.html b/Typing Progress Bar/index.html new file mode 100644 index 00000000..389e55f1 --- /dev/null +++ b/Typing Progress Bar/index.html @@ -0,0 +1,20 @@ + + + + + + Typing Progress Bar + + + +

    Typing Progress Bar

    +
    +
    +
    +
    +

    Type this text:

    + +
    + + + \ No newline at end of file diff --git a/Typing Progress Bar/script.js b/Typing Progress Bar/script.js new file mode 100644 index 00000000..d2fb6dfb --- /dev/null +++ b/Typing Progress Bar/script.js @@ -0,0 +1,30 @@ +const wordDisplay = document.getElementById('word-display'); +const wordInput = document.getElementById('word-input'); +const progressBar = document.getElementById('progress-bar'); +const wordsToType = "The quick brown fox jumps over the lazy dog"; +const wordsArray = wordsToType.split(' '); +let currentWordIndex = 0; + +function updateProgressBar() { + const percentage = (currentWordIndex / wordsArray.length) * 100; + progressBar.style.width = percentage + '%'; +} + +wordDisplay.textContent = wordsToType; + +wordInput.addEventListener('input', function () { + const inputText = wordInput.value; + const expectedWord = wordsArray[currentWordIndex]; + + if (inputText === expectedWord) { + currentWordIndex++; + wordInput.value = ''; + updateProgressBar(); + + if (currentWordIndex === wordsArray.length) { + alert('Congratulations! You typed all the words correctly.'); + } else { + wordDisplay.textContent = wordsArray[currentWordIndex]; + } + } +}); \ No newline at end of file diff --git a/Typing Progress Bar/styles.css b/Typing Progress Bar/styles.css new file mode 100644 index 00000000..90729235 --- /dev/null +++ b/Typing Progress Bar/styles.css @@ -0,0 +1,32 @@ +body { + font-family: Arial, sans-serif; + text-align: center; +} + +#progress-container { + width: 80%; + margin: 0 auto; + padding: 20px; +} + +#progress-bar { + width: 0; + height: 30px; + background-color: #007BFF; + transition: width 0.3s ease; +} + +#word-container { + margin-top: 20px; +} + +#word-display { + font-size: 24px; + font-weight: bold; +} + +#word-input { + font-size: 24px; + border: 1px solid #ccc; + padding: 5px; +} \ No newline at end of file diff --git a/WeatherApp/assets/clear sky.gif b/WeatherApp/assets/clear sky.gif new file mode 100644 index 00000000..0e9d3b9e Binary files /dev/null and b/WeatherApp/assets/clear sky.gif differ diff --git a/WeatherApp/assets/cloud img.png b/WeatherApp/assets/cloud img.png new file mode 100644 index 00000000..43413deb Binary files /dev/null and b/WeatherApp/assets/cloud img.png differ diff --git a/WeatherApp/assets/cur background.jpg b/WeatherApp/assets/cur background.jpg new file mode 100644 index 00000000..5e8c8b27 Binary files /dev/null and b/WeatherApp/assets/cur background.jpg differ diff --git a/WeatherApp/assets/defult background of current card.jpeg b/WeatherApp/assets/defult background of current card.jpeg new file mode 100644 index 00000000..c1ef1529 Binary files /dev/null and b/WeatherApp/assets/defult background of current card.jpeg differ diff --git a/WeatherApp/assets/light rain.gif b/WeatherApp/assets/light rain.gif new file mode 100644 index 00000000..3a9a75b5 Binary files /dev/null and b/WeatherApp/assets/light rain.gif differ diff --git a/WeatherApp/assets/rain.webp b/WeatherApp/assets/rain.webp new file mode 100644 index 00000000..9d1bcf7b Binary files /dev/null and b/WeatherApp/assets/rain.webp differ diff --git a/WeatherApp/assets/scrated sky.gif b/WeatherApp/assets/scrated sky.gif new file mode 100644 index 00000000..48d87b94 Binary files /dev/null and b/WeatherApp/assets/scrated sky.gif differ diff --git a/WeatherApp/assets/strome colude.gif b/WeatherApp/assets/strome colude.gif new file mode 100644 index 00000000..6d17535d Binary files /dev/null and b/WeatherApp/assets/strome colude.gif differ diff --git a/WeatherApp/css/cdn.jsdelivr.net_npm_swiper@10.2.0_swiper-bundle.min.css b/WeatherApp/css/cdn.jsdelivr.net_npm_swiper@10.2.0_swiper-bundle.min.css new file mode 100644 index 00000000..9008db6e --- /dev/null +++ b/WeatherApp/css/cdn.jsdelivr.net_npm_swiper@10.2.0_swiper-bundle.min.css @@ -0,0 +1 @@ +@font-face{font-family:swiper-icons;src:url('data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA');font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff}:host{position:relative;display:block;margin-left:auto;margin-right:auto;z-index:1}.swiper{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;overflow:clip;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function,initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-ios .swiper-slide,.swiper-wrapper{transform:translate3d(0px,0,0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.swiper-autoheight,.swiper-autoheight .swiper-slide{height:auto}.swiper-autoheight .swiper-wrapper{align-items:flex-start;transition-property:transform,height}.swiper-backface-hidden .swiper-slide{transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.swiper-3d .swiper-cube-shadow,.swiper-3d .swiper-slide{transform-style:preserve-3d}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.swiper-css-mode>.swiper-wrapper::-webkit-scrollbar{display:none}.swiper-css-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:start start}.swiper-css-mode.swiper-horizontal>.swiper-wrapper{scroll-snap-type:x mandatory}.swiper-css-mode.swiper-vertical>.swiper-wrapper{scroll-snap-type:y mandatory}.swiper-css-mode.swiper-free-mode>.swiper-wrapper{scroll-snap-type:none}.swiper-css-mode.swiper-free-mode>.swiper-wrapper>.swiper-slide{scroll-snap-align:none}.swiper-css-mode.swiper-centered>.swiper-wrapper::before{content:'';flex-shrink:0;order:9999}.swiper-css-mode.swiper-centered>.swiper-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper>.swiper-slide:first-child{margin-inline-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-horizontal>.swiper-wrapper::before{height:100%;min-height:1px;width:var(--swiper-centered-offset-after)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper>.swiper-slide:first-child{margin-block-start:var(--swiper-centered-offset-before)}.swiper-css-mode.swiper-centered.swiper-vertical>.swiper-wrapper::before{width:100%;min-width:1px;height:var(--swiper-centered-offset-after)}.swiper-3d .swiper-slide-shadow,.swiper-3d .swiper-slide-shadow-bottom,.swiper-3d .swiper-slide-shadow-left,.swiper-3d .swiper-slide-shadow-right,.swiper-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-3d .swiper-slide-shadow{background:rgba(0,0,0,.15)}.swiper-3d .swiper-slide-shadow-left{background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-right{background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-top{background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-3d .swiper-slide-shadow-bottom{background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;transform-origin:50%;box-sizing:border-box;border:4px solid var(--swiper-preloader-color,var(--swiper-theme-color));border-radius:50%;border-top-color:transparent}.swiper-watch-progress .swiper-slide-visible .swiper-lazy-preloader,.swiper:not(.swiper-watch-progress) .swiper-lazy-preloader{animation:swiper-preloader-spin 1s infinite linear}.swiper-lazy-preloader-white{--swiper-preloader-color:#fff}.swiper-lazy-preloader-black{--swiper-preloader-color:#000}@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.swiper-virtual .swiper-slide{-webkit-backface-visibility:hidden;transform:translateZ(0)}.swiper-virtual.swiper-css-mode .swiper-wrapper::after{content:'';position:absolute;left:0;top:0;pointer-events:none}.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after{height:1px;width:var(--swiper-virtual-size)}.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after{width:1px;height:var(--swiper-virtual-size)}:root{--swiper-navigation-size:44px}.swiper-button-next,.swiper-button-prev{position:absolute;top:var(--swiper-navigation-top-offset,50%);width:calc(var(--swiper-navigation-size)/ 44 * 27);height:var(--swiper-navigation-size);margin-top:calc(0px - (var(--swiper-navigation-size)/ 2));z-index:10;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--swiper-navigation-color,var(--swiper-theme-color))}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-next.swiper-button-hidden,.swiper-button-prev.swiper-button-hidden{opacity:0;cursor:auto;pointer-events:none}.swiper-navigation-disabled .swiper-button-next,.swiper-navigation-disabled .swiper-button-prev{display:none!important}.swiper-button-next svg,.swiper-button-prev svg{width:100%;height:100%;object-fit:contain;transform-origin:center}.swiper-rtl .swiper-button-next svg,.swiper-rtl .swiper-button-prev svg{transform:rotate(180deg)}.swiper-button-prev,.swiper-rtl .swiper-button-next{left:var(--swiper-navigation-sides-offset,10px);right:auto}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-lock{display:none}.swiper-button-next:after,.swiper-button-prev:after{font-family:swiper-icons;font-size:var(--swiper-navigation-size);text-transform:none!important;letter-spacing:0;font-variant:initial;line-height:1}.swiper-button-prev:after,.swiper-rtl .swiper-button-next:after{content:'prev'}.swiper-button-next,.swiper-rtl .swiper-button-prev{right:var(--swiper-navigation-sides-offset,10px);left:auto}.swiper-button-next:after,.swiper-rtl .swiper-button-prev:after{content:'next'}.swiper-pagination{position:absolute;text-align:center;transition:.3s opacity;transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-pagination-disabled>.swiper-pagination,.swiper-pagination.swiper-pagination-disabled{display:none!important}.swiper-horizontal>.swiper-pagination-bullets,.swiper-pagination-bullets.swiper-pagination-horizontal,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:var(--swiper-pagination-bottom,8px);top:var(--swiper-pagination-top,auto);left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{transform:scale(.33)}.swiper-pagination-bullet{width:var(--swiper-pagination-bullet-width,var(--swiper-pagination-bullet-size,8px));height:var(--swiper-pagination-bullet-height,var(--swiper-pagination-bullet-size,8px));display:inline-block;border-radius:var(--swiper-pagination-bullet-border-radius,50%);background:var(--swiper-pagination-bullet-inactive-color,#000);opacity:var(--swiper-pagination-bullet-inactive-opacity, .2)}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet:only-child{display:none!important}.swiper-pagination-bullet-active{opacity:var(--swiper-pagination-bullet-opacity, 1);background:var(--swiper-pagination-color,var(--swiper-theme-color))}.swiper-pagination-vertical.swiper-pagination-bullets,.swiper-vertical>.swiper-pagination-bullets{right:var(--swiper-pagination-right,8px);left:var(--swiper-pagination-left,auto);top:50%;transform:translate3d(0px,-50%,0)}.swiper-pagination-vertical.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:var(--swiper-pagination-bullet-vertical-gap,6px) 0;display:block}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;transform:translateY(-50%);width:8px}.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;transition:.2s transform,.2s top}.swiper-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 var(--swiper-pagination-bullet-horizontal-gap,4px)}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;transform:translateX(-50%);white-space:nowrap}.swiper-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet,.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s left}.swiper-horizontal.swiper-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{transition:.2s transform,.2s right}.swiper-pagination-fraction{color:var(--swiper-pagination-fraction-color,inherit)}.swiper-pagination-progressbar{background:var(--swiper-pagination-progressbar-bg-color,rgba(0,0,0,.25));position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--swiper-pagination-color,var(--swiper-theme-color));position:absolute;left:0;top:0;width:100%;height:100%;transform:scale(0);transform-origin:left top}.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{transform-origin:right top}.swiper-horizontal>.swiper-pagination-progressbar,.swiper-pagination-progressbar.swiper-pagination-horizontal,.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite,.swiper-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:var(--swiper-pagination-progressbar-size,4px);left:0;top:0}.swiper-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite,.swiper-pagination-progressbar.swiper-pagination-vertical,.swiper-vertical>.swiper-pagination-progressbar{width:var(--swiper-pagination-progressbar-size,4px);height:100%;left:0;top:0}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:var(--swiper-scrollbar-border-radius,10px);position:relative;-ms-touch-action:none;background:var(--swiper-scrollbar-bg-color,rgba(0,0,0,.1))}.swiper-scrollbar-disabled>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-disabled{display:none!important}.swiper-horizontal>.swiper-scrollbar,.swiper-scrollbar.swiper-scrollbar-horizontal{position:absolute;left:var(--swiper-scrollbar-sides-offset,1%);bottom:var(--swiper-scrollbar-bottom,4px);top:var(--swiper-scrollbar-top,auto);z-index:50;height:var(--swiper-scrollbar-size,4px);width:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar.swiper-scrollbar-vertical,.swiper-vertical>.swiper-scrollbar{position:absolute;left:var(--swiper-scrollbar-left,auto);right:var(--swiper-scrollbar-right,4px);top:var(--swiper-scrollbar-sides-offset,1%);z-index:50;width:var(--swiper-scrollbar-size,4px);height:calc(100% - 2 * var(--swiper-scrollbar-sides-offset,1%))}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:var(--swiper-scrollbar-drag-bg-color,rgba(0,0,0,.5));border-radius:var(--swiper-scrollbar-border-radius,10px);left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:flex;justify-content:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-slide-zoomed{cursor:move;touch-action:none}.swiper .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-free-mode>.swiper-wrapper{transition-timing-function:ease-out;margin:0 auto}.swiper-grid>.swiper-wrapper{flex-wrap:wrap}.swiper-grid-column>.swiper-wrapper{flex-wrap:wrap;flex-direction:column}.swiper-fade.swiper-free-mode .swiper-slide{transition-timing-function:ease-out}.swiper-fade .swiper-slide{pointer-events:none;transition-property:opacity}.swiper-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-fade .swiper-slide-active{pointer-events:auto}.swiper-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube{overflow:visible}.swiper-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;transform-origin:0 0;width:100%;height:100%}.swiper-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-cube.swiper-rtl .swiper-slide{transform-origin:100% 0}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-cube .swiper-slide-active,.swiper-cube .swiper-slide-next,.swiper-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0px;width:100%;height:100%;opacity:.6;z-index:0}.swiper-cube .swiper-cube-shadow:before{content:'';background:#000;position:absolute;left:0;top:0;bottom:0;right:0;filter:blur(50px)}.swiper-cube .swiper-slide-next+.swiper-slide{pointer-events:auto;visibility:visible}.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-bottom,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-left,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-right,.swiper-cube .swiper-slide-shadow-cube.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-flip{overflow:visible}.swiper-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-flip .swiper-slide-active,.swiper-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-bottom,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-left,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-right,.swiper-flip .swiper-slide-shadow-flip.swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-creative .swiper-slide{-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;transition-property:transform,opacity,height}.swiper-cards{overflow:visible}.swiper-cards .swiper-slide{transform-origin:center bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden} \ No newline at end of file diff --git a/WeatherApp/css/style.css b/WeatherApp/css/style.css new file mode 100644 index 00000000..b84edda8 --- /dev/null +++ b/WeatherApp/css/style.css @@ -0,0 +1,516 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; +} +a{ + text-decoration: none; +} +li{ + list-style: none; +} + html{ + scroll-behavior: smooth; + } +header{ + background-color: rgb(8, 45, 124); + display: flex; + justify-content: space-around; + padding: 1rem 0; + color: white; +} + +nav ul{ + display: flex; + flex-wrap: wrap; + gap: 2rem; +} +nav ul li{ + list-style-type: none; + padding: 0.5rem; + border-radius: 20px; +} +nav ul li a{ + text-decoration: none; + font-size: 1.3rem; + color: white; +} +.humberg-menu i{ + color: rgb(9, 50, 235); + font-size: 2rem; + cursor: pointer; + display: none; +} +.menu-content{ + display: none; + position: absolute; + top: 4.5rem; + background-color: rgb(21, 6, 105); + width:100%; + height: 0; + overflow: hidden; + transition: height 1s cubic-bezier(0.175,0.88,0.32,1.275) ; +} +.menu-content.open{ + height: 100vh; +} +.menu-content li{ + border: 1px solid rgb(197, 197, 197); + padding: 0.6rem 1rem; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 0.8rem; + border-radius: 10px; +} +.menu-content li:hover{ + background-color: blueviolet; +} +.menu-content li a{ + font-size: 1.3rem; + color: white; +} + +@media (max-width:600px) { + .humberg-menu i{ + display: block; + color: white; + } + nav ul{ + display: none; + } + .menu-content{ + display: block; + } + +} +.input-section{ + background-color: rgb(4, 74, 114); + padding: 2rem 0; + +} +.input-section label{ + font-size: 1.7rem; + display: block; + text-align: center; + color: rgb(122, 151, 245); +} +.input-section .input-location{ + cursor: pointer; +} + .input-section input:focus{ + outline: none; + } +.input-section button{ + font-size: 1.5rem; + display: block; + border: none; + background-color: rgb(5, 143, 109); + border-radius: 10px; + padding: 0.4rem 1.2rem; + margin: auto; + color: white; +} +.input-section button:hover{ + background-color: rgb(49, 99, 110); +} + +.input-section .separator{ + height: 1px; + width: 20vw; + background-color: rgb(177, 175, 175); + margin: 0.8rem auto; + display: flex; + justify-content: center; + align-items: center; +} +.input-section .separator::before{ + content: "or"; + color: rgb(134, 134, 134); + padding: 0 0.3rem; + font-size: 1.4rem; + background-color: rgb(4, 74, 114); +} + .search-bar{ + display: flex; + justify-content: center; + align-items: center; + border: 1px solid rgb(187, 187, 245); + border-radius: 10px; + max-width: 40%; + margin: auto; + padding: 0 0.2rem; + background-color: white; + } + .search-bar i{ + font-size: 1.6rem; + padding: 0.5rem 0.7rem; + cursor: pointer; + background-color: rgb(209, 171, 240); + border-radius: 50%; + } + .search-bar i:hover{ + background-color: rgb(99, 99, 245); + } + .search-bar input{ + width: 100%; + border: none; + border-radius: 20px; + font-size: 1.2rem; + } + @media (max-width:600px) { + .search-bar{ + max-width: 80%; + } + .input-section button{ + font-size: 1.1rem; + } + } +.current-weather-section{ + background-color: rgb(38, 112, 175); + padding: 2rem 0; +} +.current-weather-card{ + background: url(assets/defult\ background\ of\ current\ card.jpeg); + background-size: cover; + background-repeat: no-repeat; + border: 1px soid rgb(223, 14, 14); + max-width: 500px; + margin: auto; + padding: 2rem; + border-radius: 10px; + box-shadow: 10px 10px 13px rgb(40, 3, 65); +} +.cityinfo{ + display: flex; + justify-content: space-between; + color: white; +} +.cityinfo .city-name{ + font-size: 3rem; +} +.cityinfo .city-time{ + font-size: 1.5rem; +} +.city-temp{ + display: flex; + justify-content: center; + align-items: center; + padding: 2rem 0; + color: white; +} +.city-temp .temp-value{ + font-size: 3rem; +} +.current-weather-img{ + width: 100px; +} +.desc p{ + color: rgb(30, 255, 0); + font-size: 1.7rem; + margin-top: -3rem; + text-align: center; +} +.other-details p{ + color: rgb(255, 215, 215); + font-size: 1.3rem; + border-top: 1px solid rgb(141, 140, 140); +} +.other-details h1{ + padding-bottom: 0.5rem; + color: white; +} +.firstline-details{ + display: flex; + justify-content: space-between; + padding: 2rem 0; +} +.lastline-details{ + display: flex; + justify-content: space-between; +} +.humidity{ + border: 1px solid rgb(146, 144, 144); + padding: 0.5rem; + border-radius: 18px; +} +.windspeed{ + border: 1px solid rgb(146, 144, 144); + padding: 0.5rem; + border-radius: 18px; +} +.feellikes{ + border: 1px solid rgb(146, 144, 144); + padding: 0.5rem; + border-radius: 18px; +} +.pressure{ + border: 1px solid rgb(146, 144, 144); + padding: 0.5rem; + border-radius: 18px; +} +.hourly-heading{ + color: rgb(204, 208, 212); + text-align: center; + padding-bottom: 0.5rem; + margin-bottom: 1rem; + border-bottom: 1px solid white; +} +.hourly-des{ + color: rgb(63, 238, 215); + margin: -1.2rem 0 0 0; + font-size: 1.4rem; + text-shadow: 1px 11px 2px rgb(0, 0, 0); + animation: moveText 4s linear infinite; +} +@keyframes moveText { + 0%{ + transform: translateX(0); + } + 50%{ + transform: translateY(77%); + color: rgb(223, 220, 220); + text-shadow: 1px -9px 2px rgb(0, 0, 0); + } +} +.container{ + max-width: 80vw; + padding: 5rem 0; + margin: auto; + } + + .hourly-card{ + width: 300px; + background: rgb(2, 0, 36); + background: linear-gradient(90deg, rgba(2, 0, 36, 1) 0%, rgba(255, 142, 142, 1) 0%, rgba(0, 212, 255, 1) 100%); + margin-top: 2rem; + } + .swiper-slide { + max-width: 30vw; + width: fit-content; + text-align: center; + font-size: 18px; + display: flex; + justify-content: center; + align-items: center; + border: 1px solid rgb(163, 163, 163); + border-radius: 20px; + color: white; + } + .hourly-card .current-time{ + padding: 0.4rem 0; + border-bottom: 1px solid rgb(80, 80, 80); + } +.hourly-card .hourly-desc{ + color: rgb(231, 235, 28); + font-size: 1.2rem; + padding: 0.4rem 0; +} +.hourly-humidity{ + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; +} +.hourly-windspeed{ + display: flex; + justify-content: center; + align-items: center; + gap: 0.8rem; + padding-bottom: 0.8rem; +} +.hourly-humidity p{ + color:cyan; +} +.hourly-windspeed p{ + color: cyan; +} +.swiper-slide #defaultImg{ + padding:0.5rem; +} +.hourly-img{ + width: 100px; +} +@media (max-width:600px) { + .container{ + max-width: 100vw; + } + .swiper-slide{ + max-width: 80vw; + } + .hourly-des{ + animation: none; + text-align: center; + font-size: 1rem; + } + } +#defaultImg{ + width: 50px; +} +.weakly-card-date{ + color: white; +} +.weakly-weather-section{ +background-image: linear-gradient(109.6deg, rgba(156, 252, 248, 1) 11.2%, rgba(110, 123, 251, 1) 91.1%); + padding: 2rem 0; +} +.weakly-weather-section h1{ + color: red; + text-align: center; + padding: 1rem 0 ; + text-decoration: underline 0.2rem rgb(223, 20, 230); + +} +#weakly-weather-container{ + gap: 2rem; + padding: 1.5rem 0; +} +.weakly-weather-card{ + animation: animateWeaklyCard 3s infinite linear; + border-radius: 20px; + width: 250px; + padding: 1rem 0.5rem; + box-shadow: 5px 9px 10px rgb(35, 2, 61); + background-image: linear-gradient(90deg, rgb(38, 112, 175), #acf5f1, rgb(38, 112, 175), #acf5f1); + background-size: 300% 100%; + transition: 1s; +} +@keyframes animateWeaklyCard { + 0%{ + background-position: 0 0; + } + 100%{ + background-position: 100% 0; + } +} +.weakly-weather-card:hover{ + box-shadow: none; + transition: all 1s ease-in-out; +} +.weakly-card-time{ + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + color: rgb(145, 20, 218); + border-bottom: 1px solid rgb(175, 173, 173); +} +.weakly-card-temp{ + text-align: center; + display: flex; + justify-content: center; + align-items: center; + gap: 0.4rem; +} +.weakly-temp{ + font-size: 2rem; + color: red; + margin-left: -1rem; +} +.weakly-card-desc{ + color: rgb(229, 233, 30); + text-align: center; + font-size: 1.3rem; + padding-bottom: 1rem; +} +.weakly-card-others{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.3rem 0.3rem; +} +.weakly-card-others p{ + color: rgb(252, 250, 250); + border-top: 1px solid rgb(164, 164, 223); + padding-bottom: 0.5rem; + font-size: 1.3rem; +} +.weakly-card-img{ + width: 100px; +} +.weakly-card-others h2{ + color: rgb(44, 44, 230); + font-size: 1.8rem; + font-style: italic; +} + footer{ + background-color: rgb(5, 5, 92); + padding: 2rem 0; + } + .footer-container{ + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + color: white; + padding: 2rem 0; + } + .footer-container a{ + text-decoration: none; + color: rgb(235, 156, 156); + font-size: 1.2rem; + } + .footer-container a:hover{ + color: red; + } + .footer-container ul li{ + padding: 0.5rem 0; + } + .company h2{ + border-bottom: 1px solid red; + margin: 1rem 0; + } + .reference h2{ + border-bottom: 1px solid red; + margin: 1rem 0; + } + .support h2{ + border-bottom: 1px solid red; + margin: 1rem 0; + } + .mobile{ + display: flex; + gap: 0.3rem; + } + .mail{ + display: flex; + gap: 0.3rem; + } + .support i{ + font-size: 1.5rem; + } + .mail p{ + font-size: 1.2rem; + } + .getApp h2{ + border-bottom: 1px solid red; + margin: 1rem 0; + } + .cpy{ + color: red; + text-align: center; + padding: 0.2rem 0; + } + .update-msg{ + background: -webkit-linear-gradient(180deg,#e60404, #25c440,blue); + -webkit-text-fill-color: transparent; + text-align: center; + color: rgb(66, 167, 235); + animation: colorChange 2s ease-in-out infinite; + } + @keyframes colorChange { + 0%{ + background: -webkit-linear-gradient(180deg, #f8f3f3, #25c440, rgb(240, 23, 229)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + 50%{ +background: -webkit-linear-gradient(180deg, #e60404, #1ef3cf, rgb(205, 17, 230)); +-webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + 100%{ +background: -webkit-linear-gradient(180deg, #c4e604, #25c440, blue); +-webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + } \ No newline at end of file diff --git a/WeatherApp/index.html b/WeatherApp/index.html new file mode 100644 index 00000000..470fd422 --- /dev/null +++ b/WeatherApp/index.html @@ -0,0 +1,114 @@ + + + + + + weatherapp + + + + + + +
    +

    HelloWeather

    + +
    + +
    + +
    +
    + + +
    + + +
    +
    + +
    + +
    +
    +

    Today's highlight

    +

    "Today's weather update will be provided every 3 hours, keeping you informed throughout the day." +

    +
    +
    +
    +
    +
    +
    +
    +
    +

    5 Days Weather Forecast

    +
    +
    +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/WeatherApp/js/cdn.jsdelivr.net_npm_swiper@10.2.0_swiper-bundle.min.js b/WeatherApp/js/cdn.jsdelivr.net_npm_swiper@10.2.0_swiper-bundle.min.js new file mode 100644 index 00000000..e13f7f92 --- /dev/null +++ b/WeatherApp/js/cdn.jsdelivr.net_npm_swiper@10.2.0_swiper-bundle.min.js @@ -0,0 +1,3 @@ + +var Swiper = function () { "use strict"; function e(e) { return null !== e && "object" == typeof e && "constructor" in e && e.constructor === Object } function t(s, a) { void 0 === s && (s = {}), void 0 === a && (a = {}), Object.keys(a).forEach((i => { void 0 === s[i] ? s[i] = a[i] : e(a[i]) && e(s[i]) && Object.keys(a[i]).length > 0 && t(s[i], a[i]) })) } const s = { body: {}, addEventListener() { }, removeEventListener() { }, activeElement: { blur() { }, nodeName: "" }, querySelector: () => null, querySelectorAll: () => [], getElementById: () => null, createEvent: () => ({ initEvent() { } }), createElement: () => ({ children: [], childNodes: [], style: {}, setAttribute() { }, getElementsByTagName: () => [] }), createElementNS: () => ({}), importNode: () => null, location: { hash: "", host: "", hostname: "", href: "", origin: "", pathname: "", protocol: "", search: "" } }; function a() { const e = "undefined" != typeof document ? document : {}; return t(e, s), e } const i = { document: s, navigator: { userAgent: "" }, location: { hash: "", host: "", hostname: "", href: "", origin: "", pathname: "", protocol: "", search: "" }, history: { replaceState() { }, pushState() { }, go() { }, back() { } }, CustomEvent: function () { return this }, addEventListener() { }, removeEventListener() { }, getComputedStyle: () => ({ getPropertyValue: () => "" }), Image() { }, Date() { }, screen: {}, setTimeout() { }, clearTimeout() { }, matchMedia: () => ({}), requestAnimationFrame: e => "undefined" == typeof setTimeout ? (e(), null) : setTimeout(e, 0), cancelAnimationFrame(e) { "undefined" != typeof setTimeout && clearTimeout(e) } }; function r() { const e = "undefined" != typeof window ? window : {}; return t(e, i), e } function n(e, t) { return void 0 === t && (t = 0), setTimeout(e, t) } function l() { return Date.now() } function o(e, t) { void 0 === t && (t = "x"); const s = r(); let a, i, n; const l = function (e) { const t = r(); let s; return t.getComputedStyle && (s = t.getComputedStyle(e, null)), !s && e.currentStyle && (s = e.currentStyle), s || (s = e.style), s }(e); return s.WebKitCSSMatrix ? (i = l.transform || l.webkitTransform, i.split(",").length > 6 && (i = i.split(", ").map((e => e.replace(",", "."))).join(", ")), n = new s.WebKitCSSMatrix("none" === i ? "" : i)) : (n = l.MozTransform || l.OTransform || l.MsTransform || l.msTransform || l.transform || l.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,"), a = n.toString().split(",")), "x" === t && (i = s.WebKitCSSMatrix ? n.m41 : 16 === a.length ? parseFloat(a[12]) : parseFloat(a[4])), "y" === t && (i = s.WebKitCSSMatrix ? n.m42 : 16 === a.length ? parseFloat(a[13]) : parseFloat(a[5])), i || 0 } function d(e) { return "object" == typeof e && null !== e && e.constructor && "Object" === Object.prototype.toString.call(e).slice(8, -1) } function c() { const e = Object(arguments.length <= 0 ? void 0 : arguments[0]), t = ["__proto__", "constructor", "prototype"]; for (let a = 1; a < arguments.length; a += 1) { const i = a < 0 || arguments.length <= a ? void 0 : arguments[a]; if (null != i && (s = i, !("undefined" != typeof window && void 0 !== window.HTMLElement ? s instanceof HTMLElement : s && (1 === s.nodeType || 11 === s.nodeType)))) { const s = Object.keys(Object(i)).filter((e => t.indexOf(e) < 0)); for (let t = 0, a = s.length; t < a; t += 1) { const a = s[t], r = Object.getOwnPropertyDescriptor(i, a); void 0 !== r && r.enumerable && (d(e[a]) && d(i[a]) ? i[a].__swiper__ ? e[a] = i[a] : c(e[a], i[a]) : !d(e[a]) && d(i[a]) ? (e[a] = {}, i[a].__swiper__ ? e[a] = i[a] : c(e[a], i[a])) : e[a] = i[a]) } } } var s; return e } function p(e, t, s) { e.style.setProperty(t, s) } function u(e) { let { swiper: t, targetPosition: s, side: a } = e; const i = r(), n = -t.translate; let l, o = null; const d = t.params.speed; t.wrapperEl.style.scrollSnapType = "none", i.cancelAnimationFrame(t.cssModeFrameID); const c = s > n ? "next" : "prev", p = (e, t) => "next" === c && e >= t || "prev" === c && e <= t, u = () => { l = (new Date).getTime(), null === o && (o = l); const e = Math.max(Math.min((l - o) / d, 1), 0), r = .5 - Math.cos(e * Math.PI) / 2; let c = n + r * (s - n); if (p(c, s) && (c = s), t.wrapperEl.scrollTo({ [a]: c }), p(c, s)) return t.wrapperEl.style.overflow = "hidden", t.wrapperEl.style.scrollSnapType = "", setTimeout((() => { t.wrapperEl.style.overflow = "", t.wrapperEl.scrollTo({ [a]: c }) })), void i.cancelAnimationFrame(t.cssModeFrameID); t.cssModeFrameID = i.requestAnimationFrame(u) }; u() } function m(e) { return e.querySelector(".swiper-slide-transform") || e.shadowRoot && e.shadowRoot.querySelector(".swiper-slide-transform") || e } function h(e, t) { return void 0 === t && (t = ""), [...e.children].filter((e => e.matches(t))) } function f(e, t) { void 0 === t && (t = []); const s = document.createElement(e); return s.classList.add(...Array.isArray(t) ? t : [t]), s } function g(e) { const t = r(), s = a(), i = e.getBoundingClientRect(), n = s.body, l = e.clientTop || n.clientTop || 0, o = e.clientLeft || n.clientLeft || 0, d = e === t ? t.scrollY : e.scrollTop, c = e === t ? t.scrollX : e.scrollLeft; return { top: i.top + d - l, left: i.left + c - o } } function v(e, t) { return r().getComputedStyle(e, null).getPropertyValue(t) } function w(e) { let t, s = e; if (s) { for (t = 0; null !== (s = s.previousSibling);)1 === s.nodeType && (t += 1); return t } } function b(e, t) { const s = []; let a = e.parentElement; for (; a;)t ? a.matches(t) && s.push(a) : s.push(a), a = a.parentElement; return s } function y(e, t) { t && e.addEventListener("transitionend", (function s(a) { a.target === e && (t.call(e, a), e.removeEventListener("transitionend", s)) })) } function E(e, t, s) { const a = r(); return s ? e["width" === t ? "offsetWidth" : "offsetHeight"] + parseFloat(a.getComputedStyle(e, null).getPropertyValue("width" === t ? "margin-right" : "margin-top")) + parseFloat(a.getComputedStyle(e, null).getPropertyValue("width" === t ? "margin-left" : "margin-bottom")) : e.offsetWidth } let x, S, T; function M() { return x || (x = function () { const e = r(), t = a(); return { smoothScroll: t.documentElement && t.documentElement.style && "scrollBehavior" in t.documentElement.style, touch: !!("ontouchstart" in e || e.DocumentTouch && t instanceof e.DocumentTouch) } }()), x } function C(e) { return void 0 === e && (e = {}), S || (S = function (e) { let { userAgent: t } = void 0 === e ? {} : e; const s = M(), a = r(), i = a.navigator.platform, n = t || a.navigator.userAgent, l = { ios: !1, android: !1 }, o = a.screen.width, d = a.screen.height, c = n.match(/(Android);?[\s\/]+([\d.]+)?/); let p = n.match(/(iPad).*OS\s([\d_]+)/); const u = n.match(/(iPod)(.*OS\s([\d_]+))?/), m = !p && n.match(/(iPhone\sOS|iOS)\s([\d_]+)/), h = "Win32" === i; let f = "MacIntel" === i; return !p && f && s.touch && ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"].indexOf(`${o}x${d}`) >= 0 && (p = n.match(/(Version)\/([\d.]+)/), p || (p = [0, 1, "13_0_0"]), f = !1), c && !h && (l.os = "android", l.android = !0), (p || m || u) && (l.os = "ios", l.ios = !0), l }(e)), S } function P() { return T || (T = function () { const e = r(); let t = !1; function s() { const t = e.navigator.userAgent.toLowerCase(); return t.indexOf("safari") >= 0 && t.indexOf("chrome") < 0 && t.indexOf("android") < 0 } if (s()) { const s = String(e.navigator.userAgent); if (s.includes("Version/")) { const [e, a] = s.split("Version/")[1].split(" ")[0].split(".").map((e => Number(e))); t = e < 16 || 16 === e && a < 2 } } return { isSafari: t || s(), needPerspectiveFix: t, isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(e.navigator.userAgent) } }()), T } var L = { on(e, t, s) { const a = this; if (!a.eventsListeners || a.destroyed) return a; if ("function" != typeof t) return a; const i = s ? "unshift" : "push"; return e.split(" ").forEach((e => { a.eventsListeners[e] || (a.eventsListeners[e] = []), a.eventsListeners[e][i](t) })), a }, once(e, t, s) { const a = this; if (!a.eventsListeners || a.destroyed) return a; if ("function" != typeof t) return a; function i() { a.off(e, i), i.__emitterProxy && delete i.__emitterProxy; for (var s = arguments.length, r = new Array(s), n = 0; n < s; n++)r[n] = arguments[n]; t.apply(a, r) } return i.__emitterProxy = t, a.on(e, i, s) }, onAny(e, t) { const s = this; if (!s.eventsListeners || s.destroyed) return s; if ("function" != typeof e) return s; const a = t ? "unshift" : "push"; return s.eventsAnyListeners.indexOf(e) < 0 && s.eventsAnyListeners[a](e), s }, offAny(e) { const t = this; if (!t.eventsListeners || t.destroyed) return t; if (!t.eventsAnyListeners) return t; const s = t.eventsAnyListeners.indexOf(e); return s >= 0 && t.eventsAnyListeners.splice(s, 1), t }, off(e, t) { const s = this; return !s.eventsListeners || s.destroyed ? s : s.eventsListeners ? (e.split(" ").forEach((e => { void 0 === t ? s.eventsListeners[e] = [] : s.eventsListeners[e] && s.eventsListeners[e].forEach(((a, i) => { (a === t || a.__emitterProxy && a.__emitterProxy === t) && s.eventsListeners[e].splice(i, 1) })) })), s) : s }, emit() { const e = this; if (!e.eventsListeners || e.destroyed) return e; if (!e.eventsListeners) return e; let t, s, a; for (var i = arguments.length, r = new Array(i), n = 0; n < i; n++)r[n] = arguments[n]; "string" == typeof r[0] || Array.isArray(r[0]) ? (t = r[0], s = r.slice(1, r.length), a = e) : (t = r[0].events, s = r[0].data, a = r[0].context || e), s.unshift(a); return (Array.isArray(t) ? t : t.split(" ")).forEach((t => { e.eventsAnyListeners && e.eventsAnyListeners.length && e.eventsAnyListeners.forEach((e => { e.apply(a, [t, ...s]) })), e.eventsListeners && e.eventsListeners[t] && e.eventsListeners[t].forEach((e => { e.apply(a, s) })) })), e } }; const z = (e, t) => { if (!e || e.destroyed || !e.params) return; const s = t.closest(e.isElement ? "swiper-slide" : `.${e.params.slideClass}`); if (s) { let t = s.querySelector(`.${e.params.lazyPreloaderClass}`); !t && e.isElement && (t = s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`)), t && t.remove() } }, A = (e, t) => { if (!e.slides[t]) return; const s = e.slides[t].querySelector('[loading="lazy"]'); s && s.removeAttribute("loading") }, $ = e => { if (!e || e.destroyed || !e.params) return; let t = e.params.lazyPreloadPrevNext; const s = e.slides.length; if (!s || !t || t < 0) return; t = Math.min(t, s); const a = "auto" === e.params.slidesPerView ? e.slidesPerViewDynamic() : Math.ceil(e.params.slidesPerView), i = e.activeIndex; if (e.params.grid && e.params.grid.rows > 1) { const s = i, r = [s - t]; return r.push(...Array.from({ length: t }).map(((e, t) => s + a + t))), void e.slides.forEach(((t, s) => { r.includes(t.column) && A(e, s) })) } const r = i + a - 1; if (e.params.rewind || e.params.loop) for (let a = i - t; a <= r + t; a += 1) { const t = (a % s + s) % s; (t < i || t > r) && A(e, t) } else for (let a = Math.max(i - t, 0); a <= Math.min(r + t, s - 1); a += 1)a !== i && (a > r || a < i) && A(e, a) }; var I = { updateSize: function () { const e = this; let t, s; const a = e.el; t = void 0 !== e.params.width && null !== e.params.width ? e.params.width : a.clientWidth, s = void 0 !== e.params.height && null !== e.params.height ? e.params.height : a.clientHeight, 0 === t && e.isHorizontal() || 0 === s && e.isVertical() || (t = t - parseInt(v(a, "padding-left") || 0, 10) - parseInt(v(a, "padding-right") || 0, 10), s = s - parseInt(v(a, "padding-top") || 0, 10) - parseInt(v(a, "padding-bottom") || 0, 10), Number.isNaN(t) && (t = 0), Number.isNaN(s) && (s = 0), Object.assign(e, { width: t, height: s, size: e.isHorizontal() ? t : s })) }, updateSlides: function () { const e = this; function t(t) { return e.isHorizontal() ? t : { width: "height", "margin-top": "margin-left", "margin-bottom ": "margin-right", "margin-left": "margin-top", "margin-right": "margin-bottom", "padding-left": "padding-top", "padding-right": "padding-bottom", marginRight: "marginBottom" }[t] } function s(e, s) { return parseFloat(e.getPropertyValue(t(s)) || 0) } const a = e.params, { wrapperEl: i, slidesEl: r, size: n, rtlTranslate: l, wrongRTL: o } = e, d = e.virtual && a.virtual.enabled, c = d ? e.virtual.slides.length : e.slides.length, u = h(r, `.${e.params.slideClass}, swiper-slide`), m = d ? e.virtual.slides.length : u.length; let f = []; const g = [], w = []; let b = a.slidesOffsetBefore; "function" == typeof b && (b = a.slidesOffsetBefore.call(e)); let y = a.slidesOffsetAfter; "function" == typeof y && (y = a.slidesOffsetAfter.call(e)); const x = e.snapGrid.length, S = e.slidesGrid.length; let T = a.spaceBetween, M = -b, C = 0, P = 0; if (void 0 === n) return; "string" == typeof T && T.indexOf("%") >= 0 ? T = parseFloat(T.replace("%", "")) / 100 * n : "string" == typeof T && (T = parseFloat(T)), e.virtualSize = -T, u.forEach((e => { l ? e.style.marginLeft = "" : e.style.marginRight = "", e.style.marginBottom = "", e.style.marginTop = "" })), a.centeredSlides && a.cssMode && (p(i, "--swiper-centered-offset-before", ""), p(i, "--swiper-centered-offset-after", "")); const L = a.grid && a.grid.rows > 1 && e.grid; let z; L && e.grid.initSlides(m); const A = "auto" === a.slidesPerView && a.breakpoints && Object.keys(a.breakpoints).filter((e => void 0 !== a.breakpoints[e].slidesPerView)).length > 0; for (let i = 0; i < m; i += 1) { let r; if (z = 0, u[i] && (r = u[i]), L && e.grid.updateSlide(i, r, m, t), !u[i] || "none" !== v(r, "display")) { if ("auto" === a.slidesPerView) { A && (u[i].style[t("width")] = ""); const n = getComputedStyle(r), l = r.style.transform, o = r.style.webkitTransform; if (l && (r.style.transform = "none"), o && (r.style.webkitTransform = "none"), a.roundLengths) z = e.isHorizontal() ? E(r, "width", !0) : E(r, "height", !0); else { const e = s(n, "width"), t = s(n, "padding-left"), a = s(n, "padding-right"), i = s(n, "margin-left"), l = s(n, "margin-right"), o = n.getPropertyValue("box-sizing"); if (o && "border-box" === o) z = e + i + l; else { const { clientWidth: s, offsetWidth: n } = r; z = e + t + a + i + l + (n - s) } } l && (r.style.transform = l), o && (r.style.webkitTransform = o), a.roundLengths && (z = Math.floor(z)) } else z = (n - (a.slidesPerView - 1) * T) / a.slidesPerView, a.roundLengths && (z = Math.floor(z)), u[i] && (u[i].style[t("width")] = `${z}px`); u[i] && (u[i].swiperSlideSize = z), w.push(z), a.centeredSlides ? (M = M + z / 2 + C / 2 + T, 0 === C && 0 !== i && (M = M - n / 2 - T), 0 === i && (M = M - n / 2 - T), Math.abs(M) < .001 && (M = 0), a.roundLengths && (M = Math.floor(M)), P % a.slidesPerGroup == 0 && f.push(M), g.push(M)) : (a.roundLengths && (M = Math.floor(M)), (P - Math.min(e.params.slidesPerGroupSkip, P)) % e.params.slidesPerGroup == 0 && f.push(M), g.push(M), M = M + z + T), e.virtualSize += z + T, C = z, P += 1 } } if (e.virtualSize = Math.max(e.virtualSize, n) + y, l && o && ("slide" === a.effect || "coverflow" === a.effect) && (i.style.width = `${e.virtualSize + T}px`), a.setWrapperSize && (i.style[t("width")] = `${e.virtualSize + T}px`), L && e.grid.updateWrapperSize(z, f, t), !a.centeredSlides) { const t = []; for (let s = 0; s < f.length; s += 1) { let i = f[s]; a.roundLengths && (i = Math.floor(i)), f[s] <= e.virtualSize - n && t.push(i) } f = t, Math.floor(e.virtualSize - n) - Math.floor(f[f.length - 1]) > 1 && f.push(e.virtualSize - n) } if (d && a.loop) { const t = w[0] + T; if (a.slidesPerGroup > 1) { const s = Math.ceil((e.virtual.slidesBefore + e.virtual.slidesAfter) / a.slidesPerGroup), i = t * a.slidesPerGroup; for (let e = 0; e < s; e += 1)f.push(f[f.length - 1] + i) } for (let s = 0; s < e.virtual.slidesBefore + e.virtual.slidesAfter; s += 1)1 === a.slidesPerGroup && f.push(f[f.length - 1] + t), g.push(g[g.length - 1] + t), e.virtualSize += t } if (0 === f.length && (f = [0]), 0 !== T) { const s = e.isHorizontal() && l ? "marginLeft" : t("marginRight"); u.filter(((e, t) => !(a.cssMode && !a.loop) || t !== u.length - 1)).forEach((e => { e.style[s] = `${T}px` })) } if (a.centeredSlides && a.centeredSlidesBounds) { let e = 0; w.forEach((t => { e += t + (T || 0) })), e -= T; const t = e - n; f = f.map((e => e <= 0 ? -b : e > t ? t + y : e)) } if (a.centerInsufficientSlides) { let e = 0; if (w.forEach((t => { e += t + (T || 0) })), e -= T, e < n) { const t = (n - e) / 2; f.forEach(((e, s) => { f[s] = e - t })), g.forEach(((e, s) => { g[s] = e + t })) } } if (Object.assign(e, { slides: u, snapGrid: f, slidesGrid: g, slidesSizesGrid: w }), a.centeredSlides && a.cssMode && !a.centeredSlidesBounds) { p(i, "--swiper-centered-offset-before", -f[0] + "px"), p(i, "--swiper-centered-offset-after", e.size / 2 - w[w.length - 1] / 2 + "px"); const t = -e.snapGrid[0], s = -e.slidesGrid[0]; e.snapGrid = e.snapGrid.map((e => e + t)), e.slidesGrid = e.slidesGrid.map((e => e + s)) } if (m !== c && e.emit("slidesLengthChange"), f.length !== x && (e.params.watchOverflow && e.checkOverflow(), e.emit("snapGridLengthChange")), g.length !== S && e.emit("slidesGridLengthChange"), a.watchSlidesProgress && e.updateSlidesOffset(), !(d || a.cssMode || "slide" !== a.effect && "fade" !== a.effect)) { const t = `${a.containerModifierClass}backface-hidden`, s = e.el.classList.contains(t); m <= a.maxBackfaceHiddenSlides ? s || e.el.classList.add(t) : s && e.el.classList.remove(t) } }, updateAutoHeight: function (e) { const t = this, s = [], a = t.virtual && t.params.virtual.enabled; let i, r = 0; "number" == typeof e ? t.setTransition(e) : !0 === e && t.setTransition(t.params.speed); const n = e => a ? t.slides[t.getSlideIndexByData(e)] : t.slides[e]; if ("auto" !== t.params.slidesPerView && t.params.slidesPerView > 1) if (t.params.centeredSlides) (t.visibleSlides || []).forEach((e => { s.push(e) })); else for (i = 0; i < Math.ceil(t.params.slidesPerView); i += 1) { const e = t.activeIndex + i; if (e > t.slides.length && !a) break; s.push(n(e)) } else s.push(n(t.activeIndex)); for (i = 0; i < s.length; i += 1)if (void 0 !== s[i]) { const e = s[i].offsetHeight; r = e > r ? e : r } (r || 0 === r) && (t.wrapperEl.style.height = `${r}px`) }, updateSlidesOffset: function () { const e = this, t = e.slides, s = e.isElement ? e.isHorizontal() ? e.wrapperEl.offsetLeft : e.wrapperEl.offsetTop : 0; for (let a = 0; a < t.length; a += 1)t[a].swiperSlideOffset = (e.isHorizontal() ? t[a].offsetLeft : t[a].offsetTop) - s - e.cssOverflowAdjustment() }, updateSlidesProgress: function (e) { void 0 === e && (e = this && this.translate || 0); const t = this, s = t.params, { slides: a, rtlTranslate: i, snapGrid: r } = t; if (0 === a.length) return; void 0 === a[0].swiperSlideOffset && t.updateSlidesOffset(); let n = -e; i && (n = e), a.forEach((e => { e.classList.remove(s.slideVisibleClass) })), t.visibleSlidesIndexes = [], t.visibleSlides = []; let l = s.spaceBetween; "string" == typeof l && l.indexOf("%") >= 0 ? l = parseFloat(l.replace("%", "")) / 100 * t.size : "string" == typeof l && (l = parseFloat(l)); for (let e = 0; e < a.length; e += 1) { const o = a[e]; let d = o.swiperSlideOffset; s.cssMode && s.centeredSlides && (d -= a[0].swiperSlideOffset); const c = (n + (s.centeredSlides ? t.minTranslate() : 0) - d) / (o.swiperSlideSize + l), p = (n - r[0] + (s.centeredSlides ? t.minTranslate() : 0) - d) / (o.swiperSlideSize + l), u = -(n - d), m = u + t.slidesSizesGrid[e]; (u >= 0 && u < t.size - 1 || m > 1 && m <= t.size || u <= 0 && m >= t.size) && (t.visibleSlides.push(o), t.visibleSlidesIndexes.push(e), a[e].classList.add(s.slideVisibleClass)), o.progress = i ? -c : c, o.originalProgress = i ? -p : p } }, updateProgress: function (e) { const t = this; if (void 0 === e) { const s = t.rtlTranslate ? -1 : 1; e = t && t.translate && t.translate * s || 0 } const s = t.params, a = t.maxTranslate() - t.minTranslate(); let { progress: i, isBeginning: r, isEnd: n, progressLoop: l } = t; const o = r, d = n; if (0 === a) i = 0, r = !0, n = !0; else { i = (e - t.minTranslate()) / a; const s = Math.abs(e - t.minTranslate()) < 1, l = Math.abs(e - t.maxTranslate()) < 1; r = s || i <= 0, n = l || i >= 1, s && (i = 0), l && (i = 1) } if (s.loop) { const s = t.getSlideIndexByData(0), a = t.getSlideIndexByData(t.slides.length - 1), i = t.slidesGrid[s], r = t.slidesGrid[a], n = t.slidesGrid[t.slidesGrid.length - 1], o = Math.abs(e); l = o >= i ? (o - i) / n : (o + n - r) / n, l > 1 && (l -= 1) } Object.assign(t, { progress: i, progressLoop: l, isBeginning: r, isEnd: n }), (s.watchSlidesProgress || s.centeredSlides && s.autoHeight) && t.updateSlidesProgress(e), r && !o && t.emit("reachBeginning toEdge"), n && !d && t.emit("reachEnd toEdge"), (o && !r || d && !n) && t.emit("fromEdge"), t.emit("progress", i) }, updateSlidesClasses: function () { const e = this, { slides: t, params: s, slidesEl: a, activeIndex: i } = e, r = e.virtual && s.virtual.enabled, n = e => h(a, `.${s.slideClass}${e}, swiper-slide${e}`)[0]; let l; if (t.forEach((e => { e.classList.remove(s.slideActiveClass, s.slideNextClass, s.slidePrevClass) })), r) if (s.loop) { let t = i - e.virtual.slidesBefore; t < 0 && (t = e.virtual.slides.length + t), t >= e.virtual.slides.length && (t -= e.virtual.slides.length), l = n(`[data-swiper-slide-index="${t}"]`) } else l = n(`[data-swiper-slide-index="${i}"]`); else l = t[i]; if (l) { l.classList.add(s.slideActiveClass); let e = function (e, t) { const s = []; for (; e.nextElementSibling;) { const a = e.nextElementSibling; t ? a.matches(t) && s.push(a) : s.push(a), e = a } return s }(l, `.${s.slideClass}, swiper-slide`)[0]; s.loop && !e && (e = t[0]), e && e.classList.add(s.slideNextClass); let a = function (e, t) { const s = []; for (; e.previousElementSibling;) { const a = e.previousElementSibling; t ? a.matches(t) && s.push(a) : s.push(a), e = a } return s }(l, `.${s.slideClass}, swiper-slide`)[0]; s.loop && 0 === !a && (a = t[t.length - 1]), a && a.classList.add(s.slidePrevClass) } e.emitSlidesClasses() }, updateActiveIndex: function (e) { const t = this, s = t.rtlTranslate ? t.translate : -t.translate, { snapGrid: a, params: i, activeIndex: r, realIndex: n, snapIndex: l } = t; let o, d = e; const c = e => { let s = e - t.virtual.slidesBefore; return s < 0 && (s = t.virtual.slides.length + s), s >= t.virtual.slides.length && (s -= t.virtual.slides.length), s }; if (void 0 === d && (d = function (e) { const { slidesGrid: t, params: s } = e, a = e.rtlTranslate ? e.translate : -e.translate; let i; for (let e = 0; e < t.length; e += 1)void 0 !== t[e + 1] ? a >= t[e] && a < t[e + 1] - (t[e + 1] - t[e]) / 2 ? i = e : a >= t[e] && a < t[e + 1] && (i = e + 1) : a >= t[e] && (i = e); return s.normalizeSlideIndex && (i < 0 || void 0 === i) && (i = 0), i }(t)), a.indexOf(s) >= 0) o = a.indexOf(s); else { const e = Math.min(i.slidesPerGroupSkip, d); o = e + Math.floor((d - e) / i.slidesPerGroup) } if (o >= a.length && (o = a.length - 1), d === r) return o !== l && (t.snapIndex = o, t.emit("snapIndexChange")), void (t.params.loop && t.virtual && t.params.virtual.enabled && (t.realIndex = c(d))); let p; p = t.virtual && i.virtual.enabled && i.loop ? c(d) : t.slides[d] ? parseInt(t.slides[d].getAttribute("data-swiper-slide-index") || d, 10) : d, Object.assign(t, { previousSnapIndex: l, snapIndex: o, previousRealIndex: n, realIndex: p, previousIndex: r, activeIndex: d }), t.initialized && $(t), t.emit("activeIndexChange"), t.emit("snapIndexChange"), n !== p && t.emit("realIndexChange"), (t.initialized || t.params.runCallbacksOnInit) && t.emit("slideChange") }, updateClickedSlide: function (e) { const t = this, s = t.params, a = e.closest(`.${s.slideClass}, swiper-slide`); let i, r = !1; if (a) for (let e = 0; e < t.slides.length; e += 1)if (t.slides[e] === a) { r = !0, i = e; break } if (!a || !r) return t.clickedSlide = void 0, void (t.clickedIndex = void 0); t.clickedSlide = a, t.virtual && t.params.virtual.enabled ? t.clickedIndex = parseInt(a.getAttribute("data-swiper-slide-index"), 10) : t.clickedIndex = i, s.slideToClickedSlide && void 0 !== t.clickedIndex && t.clickedIndex !== t.activeIndex && t.slideToClickedSlide() } }; var k = { getTranslate: function (e) { void 0 === e && (e = this.isHorizontal() ? "x" : "y"); const { params: t, rtlTranslate: s, translate: a, wrapperEl: i } = this; if (t.virtualTranslate) return s ? -a : a; if (t.cssMode) return a; let r = o(i, e); return r += this.cssOverflowAdjustment(), s && (r = -r), r || 0 }, setTranslate: function (e, t) { const s = this, { rtlTranslate: a, params: i, wrapperEl: r, progress: n } = s; let l, o = 0, d = 0; s.isHorizontal() ? o = a ? -e : e : d = e, i.roundLengths && (o = Math.floor(o), d = Math.floor(d)), s.previousTranslate = s.translate, s.translate = s.isHorizontal() ? o : d, i.cssMode ? r[s.isHorizontal() ? "scrollLeft" : "scrollTop"] = s.isHorizontal() ? -o : -d : i.virtualTranslate || (s.isHorizontal() ? o -= s.cssOverflowAdjustment() : d -= s.cssOverflowAdjustment(), r.style.transform = `translate3d(${o}px, ${d}px, 0px)`); const c = s.maxTranslate() - s.minTranslate(); l = 0 === c ? 0 : (e - s.minTranslate()) / c, l !== n && s.updateProgress(e), s.emit("setTranslate", s.translate, t) }, minTranslate: function () { return -this.snapGrid[0] }, maxTranslate: function () { return -this.snapGrid[this.snapGrid.length - 1] }, translateTo: function (e, t, s, a, i) { void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), void 0 === a && (a = !0); const r = this, { params: n, wrapperEl: l } = r; if (r.animating && n.preventInteractionOnTransition) return !1; const o = r.minTranslate(), d = r.maxTranslate(); let c; if (c = a && e > o ? o : a && e < d ? d : e, r.updateProgress(c), n.cssMode) { const e = r.isHorizontal(); if (0 === t) l[e ? "scrollLeft" : "scrollTop"] = -c; else { if (!r.support.smoothScroll) return u({ swiper: r, targetPosition: -c, side: e ? "left" : "top" }), !0; l.scrollTo({ [e ? "left" : "top"]: -c, behavior: "smooth" }) } return !0 } return 0 === t ? (r.setTransition(0), r.setTranslate(c), s && (r.emit("beforeTransitionStart", t, i), r.emit("transitionEnd"))) : (r.setTransition(t), r.setTranslate(c), s && (r.emit("beforeTransitionStart", t, i), r.emit("transitionStart")), r.animating || (r.animating = !0, r.onTranslateToWrapperTransitionEnd || (r.onTranslateToWrapperTransitionEnd = function (e) { r && !r.destroyed && e.target === this && (r.wrapperEl.removeEventListener("transitionend", r.onTranslateToWrapperTransitionEnd), r.onTranslateToWrapperTransitionEnd = null, delete r.onTranslateToWrapperTransitionEnd, s && r.emit("transitionEnd")) }), r.wrapperEl.addEventListener("transitionend", r.onTranslateToWrapperTransitionEnd))), !0 } }; function O(e) { let { swiper: t, runCallbacks: s, direction: a, step: i } = e; const { activeIndex: r, previousIndex: n } = t; let l = a; if (l || (l = r > n ? "next" : r < n ? "prev" : "reset"), t.emit(`transition${i}`), s && r !== n) { if ("reset" === l) return void t.emit(`slideResetTransition${i}`); t.emit(`slideChangeTransition${i}`), "next" === l ? t.emit(`slideNextTransition${i}`) : t.emit(`slidePrevTransition${i}`) } } var D = { slideTo: function (e, t, s, a, i) { void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), "string" == typeof e && (e = parseInt(e, 10)); const r = this; let n = e; n < 0 && (n = 0); const { params: l, snapGrid: o, slidesGrid: d, previousIndex: c, activeIndex: p, rtlTranslate: m, wrapperEl: h, enabled: f } = r; if (r.animating && l.preventInteractionOnTransition || !f && !a && !i) return !1; const g = Math.min(r.params.slidesPerGroupSkip, n); let v = g + Math.floor((n - g) / r.params.slidesPerGroup); v >= o.length && (v = o.length - 1); const w = -o[v]; if (l.normalizeSlideIndex) for (let e = 0; e < d.length; e += 1) { const t = -Math.floor(100 * w), s = Math.floor(100 * d[e]), a = Math.floor(100 * d[e + 1]); void 0 !== d[e + 1] ? t >= s && t < a - (a - s) / 2 ? n = e : t >= s && t < a && (n = e + 1) : t >= s && (n = e) } if (r.initialized && n !== p) { if (!r.allowSlideNext && (m ? w > r.translate && w > r.minTranslate() : w < r.translate && w < r.minTranslate())) return !1; if (!r.allowSlidePrev && w > r.translate && w > r.maxTranslate() && (p || 0) !== n) return !1 } let b; if (n !== (c || 0) && s && r.emit("beforeSlideChangeStart"), r.updateProgress(w), b = n > p ? "next" : n < p ? "prev" : "reset", m && -w === r.translate || !m && w === r.translate) return r.updateActiveIndex(n), l.autoHeight && r.updateAutoHeight(), r.updateSlidesClasses(), "slide" !== l.effect && r.setTranslate(w), "reset" !== b && (r.transitionStart(s, b), r.transitionEnd(s, b)), !1; if (l.cssMode) { const e = r.isHorizontal(), s = m ? w : -w; if (0 === t) { const t = r.virtual && r.params.virtual.enabled; t && (r.wrapperEl.style.scrollSnapType = "none", r._immediateVirtual = !0), t && !r._cssModeVirtualInitialSet && r.params.initialSlide > 0 ? (r._cssModeVirtualInitialSet = !0, requestAnimationFrame((() => { h[e ? "scrollLeft" : "scrollTop"] = s }))) : h[e ? "scrollLeft" : "scrollTop"] = s, t && requestAnimationFrame((() => { r.wrapperEl.style.scrollSnapType = "", r._immediateVirtual = !1 })) } else { if (!r.support.smoothScroll) return u({ swiper: r, targetPosition: s, side: e ? "left" : "top" }), !0; h.scrollTo({ [e ? "left" : "top"]: s, behavior: "smooth" }) } return !0 } return r.setTransition(t), r.setTranslate(w), r.updateActiveIndex(n), r.updateSlidesClasses(), r.emit("beforeTransitionStart", t, a), r.transitionStart(s, b), 0 === t ? r.transitionEnd(s, b) : r.animating || (r.animating = !0, r.onSlideToWrapperTransitionEnd || (r.onSlideToWrapperTransitionEnd = function (e) { r && !r.destroyed && e.target === this && (r.wrapperEl.removeEventListener("transitionend", r.onSlideToWrapperTransitionEnd), r.onSlideToWrapperTransitionEnd = null, delete r.onSlideToWrapperTransitionEnd, r.transitionEnd(s, b)) }), r.wrapperEl.addEventListener("transitionend", r.onSlideToWrapperTransitionEnd)), !0 }, slideToLoop: function (e, t, s, a) { if (void 0 === e && (e = 0), void 0 === t && (t = this.params.speed), void 0 === s && (s = !0), "string" == typeof e) { e = parseInt(e, 10) } const i = this; let r = e; return i.params.loop && (i.virtual && i.params.virtual.enabled ? r += i.virtual.slidesBefore : r = i.getSlideIndexByData(r)), i.slideTo(r, t, s, a) }, slideNext: function (e, t, s) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); const a = this, { enabled: i, params: r, animating: n } = a; if (!i) return a; let l = r.slidesPerGroup; "auto" === r.slidesPerView && 1 === r.slidesPerGroup && r.slidesPerGroupAuto && (l = Math.max(a.slidesPerViewDynamic("current", !0), 1)); const o = a.activeIndex < r.slidesPerGroupSkip ? 1 : l, d = a.virtual && r.virtual.enabled; if (r.loop) { if (n && !d && r.loopPreventsSliding) return !1; a.loopFix({ direction: "next" }), a._clientLeft = a.wrapperEl.clientLeft } return r.rewind && a.isEnd ? a.slideTo(0, e, t, s) : a.slideTo(a.activeIndex + o, e, t, s) }, slidePrev: function (e, t, s) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0); const a = this, { params: i, snapGrid: r, slidesGrid: n, rtlTranslate: l, enabled: o, animating: d } = a; if (!o) return a; const c = a.virtual && i.virtual.enabled; if (i.loop) { if (d && !c && i.loopPreventsSliding) return !1; a.loopFix({ direction: "prev" }), a._clientLeft = a.wrapperEl.clientLeft } function p(e) { return e < 0 ? -Math.floor(Math.abs(e)) : Math.floor(e) } const u = p(l ? a.translate : -a.translate), m = r.map((e => p(e))); let h = r[m.indexOf(u) - 1]; if (void 0 === h && i.cssMode) { let e; r.forEach(((t, s) => { u >= t && (e = s) })), void 0 !== e && (h = r[e > 0 ? e - 1 : e]) } let f = 0; if (void 0 !== h && (f = n.indexOf(h), f < 0 && (f = a.activeIndex - 1), "auto" === i.slidesPerView && 1 === i.slidesPerGroup && i.slidesPerGroupAuto && (f = f - a.slidesPerViewDynamic("previous", !0) + 1, f = Math.max(f, 0))), i.rewind && a.isBeginning) { const i = a.params.virtual && a.params.virtual.enabled && a.virtual ? a.virtual.slides.length - 1 : a.slides.length - 1; return a.slideTo(i, e, t, s) } return a.slideTo(f, e, t, s) }, slideReset: function (e, t, s) { return void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), this.slideTo(this.activeIndex, e, t, s) }, slideToClosest: function (e, t, s, a) { void 0 === e && (e = this.params.speed), void 0 === t && (t = !0), void 0 === a && (a = .5); const i = this; let r = i.activeIndex; const n = Math.min(i.params.slidesPerGroupSkip, r), l = n + Math.floor((r - n) / i.params.slidesPerGroup), o = i.rtlTranslate ? i.translate : -i.translate; if (o >= i.snapGrid[l]) { const e = i.snapGrid[l]; o - e > (i.snapGrid[l + 1] - e) * a && (r += i.params.slidesPerGroup) } else { const e = i.snapGrid[l - 1]; o - e <= (i.snapGrid[l] - e) * a && (r -= i.params.slidesPerGroup) } return r = Math.max(r, 0), r = Math.min(r, i.slidesGrid.length - 1), i.slideTo(r, e, t, s) }, slideToClickedSlide: function () { const e = this, { params: t, slidesEl: s } = e, a = "auto" === t.slidesPerView ? e.slidesPerViewDynamic() : t.slidesPerView; let i, r = e.clickedIndex; const l = e.isElement ? "swiper-slide" : `.${t.slideClass}`; if (t.loop) { if (e.animating) return; i = parseInt(e.clickedSlide.getAttribute("data-swiper-slide-index"), 10), t.centeredSlides ? r < e.loopedSlides - a / 2 || r > e.slides.length - e.loopedSlides + a / 2 ? (e.loopFix(), r = e.getSlideIndex(h(s, `${l}[data-swiper-slide-index="${i}"]`)[0]), n((() => { e.slideTo(r) }))) : e.slideTo(r) : r > e.slides.length - a ? (e.loopFix(), r = e.getSlideIndex(h(s, `${l}[data-swiper-slide-index="${i}"]`)[0]), n((() => { e.slideTo(r) }))) : e.slideTo(r) } else e.slideTo(r) } }; var G = { loopCreate: function (e) { const t = this, { params: s, slidesEl: a } = t; if (!s.loop || t.virtual && t.params.virtual.enabled) return; h(a, `.${s.slideClass}, swiper-slide`).forEach(((e, t) => { e.setAttribute("data-swiper-slide-index", t) })), t.loopFix({ slideRealIndex: e, direction: s.centeredSlides ? void 0 : "next" }) }, loopFix: function (e) { let { slideRealIndex: t, slideTo: s = !0, direction: a, setTranslate: i, activeSlideIndex: r, byController: n, byMousewheel: l } = void 0 === e ? {} : e; const o = this; if (!o.params.loop) return; o.emit("beforeLoopFix"); const { slides: d, allowSlidePrev: c, allowSlideNext: p, slidesEl: u, params: m } = o; if (o.allowSlidePrev = !0, o.allowSlideNext = !0, o.virtual && m.virtual.enabled) return s && (m.centeredSlides || 0 !== o.snapIndex ? m.centeredSlides && o.snapIndex < m.slidesPerView ? o.slideTo(o.virtual.slides.length + o.snapIndex, 0, !1, !0) : o.snapIndex === o.snapGrid.length - 1 && o.slideTo(o.virtual.slidesBefore, 0, !1, !0) : o.slideTo(o.virtual.slides.length, 0, !1, !0)), o.allowSlidePrev = c, o.allowSlideNext = p, void o.emit("loopFix"); const h = "auto" === m.slidesPerView ? o.slidesPerViewDynamic() : Math.ceil(parseFloat(m.slidesPerView, 10)); let f = m.loopedSlides || h; f % m.slidesPerGroup != 0 && (f += m.slidesPerGroup - f % m.slidesPerGroup), o.loopedSlides = f; const g = [], v = []; let w = o.activeIndex; void 0 === r ? r = o.getSlideIndex(o.slides.filter((e => e.classList.contains(m.slideActiveClass)))[0]) : w = r; const b = "next" === a || !a, y = "prev" === a || !a; let E = 0, x = 0; if (r < f) { E = Math.max(f - r, m.slidesPerGroup); for (let e = 0; e < f - r; e += 1) { const t = e - Math.floor(e / d.length) * d.length; g.push(d.length - t - 1) } } else if (r > o.slides.length - 2 * f) { x = Math.max(r - (o.slides.length - 2 * f), m.slidesPerGroup); for (let e = 0; e < x; e += 1) { const t = e - Math.floor(e / d.length) * d.length; v.push(t) } } if (y && g.forEach((e => { o.slides[e].swiperLoopMoveDOM = !0, u.prepend(o.slides[e]), o.slides[e].swiperLoopMoveDOM = !1 })), b && v.forEach((e => { o.slides[e].swiperLoopMoveDOM = !0, u.append(o.slides[e]), o.slides[e].swiperLoopMoveDOM = !1 })), o.recalcSlides(), "auto" === m.slidesPerView && o.updateSlides(), m.watchSlidesProgress && o.updateSlidesOffset(), s) if (g.length > 0 && y) if (void 0 === t) { const e = o.slidesGrid[w], t = o.slidesGrid[w + E] - e; l ? o.setTranslate(o.translate - t) : (o.slideTo(w + E, 0, !1, !0), i && (o.touches[o.isHorizontal() ? "startX" : "startY"] += t, o.touchEventsData.currentTranslate = o.translate)) } else i && (o.slideToLoop(t, 0, !1, !0), o.touchEventsData.currentTranslate = o.translate); else if (v.length > 0 && b) if (void 0 === t) { const e = o.slidesGrid[w], t = o.slidesGrid[w - x] - e; l ? o.setTranslate(o.translate - t) : (o.slideTo(w - x, 0, !1, !0), i && (o.touches[o.isHorizontal() ? "startX" : "startY"] += t, o.touchEventsData.currentTranslate = o.translate)) } else o.slideToLoop(t, 0, !1, !0); if (o.allowSlidePrev = c, o.allowSlideNext = p, o.controller && o.controller.control && !n) { const e = { slideRealIndex: t, direction: a, setTranslate: i, activeSlideIndex: r, byController: !0 }; Array.isArray(o.controller.control) ? o.controller.control.forEach((t => { !t.destroyed && t.params.loop && t.loopFix({ ...e, slideTo: t.params.slidesPerView === m.slidesPerView && s }) })) : o.controller.control instanceof o.constructor && o.controller.control.params.loop && o.controller.control.loopFix({ ...e, slideTo: o.controller.control.params.slidesPerView === m.slidesPerView && s }) } o.emit("loopFix") }, loopDestroy: function () { const e = this, { params: t, slidesEl: s } = e; if (!t.loop || e.virtual && e.params.virtual.enabled) return; e.recalcSlides(); const a = []; e.slides.forEach((e => { const t = void 0 === e.swiperSlideIndex ? 1 * e.getAttribute("data-swiper-slide-index") : e.swiperSlideIndex; a[t] = e })), e.slides.forEach((e => { e.removeAttribute("data-swiper-slide-index") })), a.forEach((e => { s.append(e) })), e.recalcSlides(), e.slideTo(e.realIndex, 0) } }; function H(e) { const t = this, s = a(), i = r(), n = t.touchEventsData; n.evCache.push(e); const { params: o, touches: d, enabled: c } = t; if (!c) return; if (!o.simulateTouch && "mouse" === e.pointerType) return; if (t.animating && o.preventInteractionOnTransition) return; !t.animating && o.cssMode && o.loop && t.loopFix(); let p = e; p.originalEvent && (p = p.originalEvent); let u = p.target; if ("wrapper" === o.touchEventsTarget && !t.wrapperEl.contains(u)) return; if ("which" in p && 3 === p.which) return; if ("button" in p && p.button > 0) return; if (n.isTouched && n.isMoved) return; const m = !!o.noSwipingClass && "" !== o.noSwipingClass, h = e.composedPath ? e.composedPath() : e.path; m && p.target && p.target.shadowRoot && h && (u = h[0]); const f = o.noSwipingSelector ? o.noSwipingSelector : `.${o.noSwipingClass}`, g = !(!p.target || !p.target.shadowRoot); if (o.noSwiping && (g ? function (e, t) { return void 0 === t && (t = this), function t(s) { if (!s || s === a() || s === r()) return null; s.assignedSlot && (s = s.assignedSlot); const i = s.closest(e); return i || s.getRootNode ? i || t(s.getRootNode().host) : null }(t) }(f, u) : u.closest(f))) return void (t.allowClick = !0); if (o.swipeHandler && !u.closest(o.swipeHandler)) return; d.currentX = p.pageX, d.currentY = p.pageY; const v = d.currentX, w = d.currentY, b = o.edgeSwipeDetection || o.iOSEdgeSwipeDetection, y = o.edgeSwipeThreshold || o.iOSEdgeSwipeThreshold; if (b && (v <= y || v >= i.innerWidth - y)) { if ("prevent" !== b) return; e.preventDefault() } Object.assign(n, { isTouched: !0, isMoved: !1, allowTouchCallbacks: !0, isScrolling: void 0, startMoving: void 0 }), d.startX = v, d.startY = w, n.touchStartTime = l(), t.allowClick = !0, t.updateSize(), t.swipeDirection = void 0, o.threshold > 0 && (n.allowThresholdMove = !1); let E = !0; u.matches(n.focusableElements) && (E = !1, "SELECT" === u.nodeName && (n.isTouched = !1)), s.activeElement && s.activeElement.matches(n.focusableElements) && s.activeElement !== u && s.activeElement.blur(); const x = E && t.allowTouchMove && o.touchStartPreventDefault; !o.touchStartForcePreventDefault && !x || u.isContentEditable || p.preventDefault(), o.freeMode && o.freeMode.enabled && t.freeMode && t.animating && !o.cssMode && t.freeMode.onTouchStart(), t.emit("touchStart", p) } function X(e) { const t = a(), s = this, i = s.touchEventsData, { params: r, touches: n, rtlTranslate: o, enabled: d } = s; if (!d) return; if (!r.simulateTouch && "mouse" === e.pointerType) return; let c = e; if (c.originalEvent && (c = c.originalEvent), !i.isTouched) return void (i.startMoving && i.isScrolling && s.emit("touchMoveOpposite", c)); const p = i.evCache.findIndex((e => e.pointerId === c.pointerId)); p >= 0 && (i.evCache[p] = c); const u = i.evCache.length > 1 ? i.evCache[0] : c, m = u.pageX, h = u.pageY; if (c.preventedByNestedSwiper) return n.startX = m, void (n.startY = h); if (!s.allowTouchMove) return c.target.matches(i.focusableElements) || (s.allowClick = !1), void (i.isTouched && (Object.assign(n, { startX: m, startY: h, prevX: s.touches.currentX, prevY: s.touches.currentY, currentX: m, currentY: h }), i.touchStartTime = l())); if (r.touchReleaseOnEdges && !r.loop) if (s.isVertical()) { if (h < n.startY && s.translate <= s.maxTranslate() || h > n.startY && s.translate >= s.minTranslate()) return i.isTouched = !1, void (i.isMoved = !1) } else if (m < n.startX && s.translate <= s.maxTranslate() || m > n.startX && s.translate >= s.minTranslate()) return; if (t.activeElement && c.target === t.activeElement && c.target.matches(i.focusableElements)) return i.isMoved = !0, void (s.allowClick = !1); if (i.allowTouchCallbacks && s.emit("touchMove", c), c.targetTouches && c.targetTouches.length > 1) return; n.currentX = m, n.currentY = h; const f = n.currentX - n.startX, g = n.currentY - n.startY; if (s.params.threshold && Math.sqrt(f ** 2 + g ** 2) < s.params.threshold) return; if (void 0 === i.isScrolling) { let e; s.isHorizontal() && n.currentY === n.startY || s.isVertical() && n.currentX === n.startX ? i.isScrolling = !1 : f * f + g * g >= 25 && (e = 180 * Math.atan2(Math.abs(g), Math.abs(f)) / Math.PI, i.isScrolling = s.isHorizontal() ? e > r.touchAngle : 90 - e > r.touchAngle) } if (i.isScrolling && s.emit("touchMoveOpposite", c), void 0 === i.startMoving && (n.currentX === n.startX && n.currentY === n.startY || (i.startMoving = !0)), i.isScrolling || s.zoom && s.params.zoom && s.params.zoom.enabled && i.evCache.length > 1) return void (i.isTouched = !1); if (!i.startMoving) return; s.allowClick = !1, !r.cssMode && c.cancelable && c.preventDefault(), r.touchMoveStopPropagation && !r.nested && c.stopPropagation(); let v = s.isHorizontal() ? f : g, w = s.isHorizontal() ? n.currentX - n.previousX : n.currentY - n.previousY; r.oneWayMovement && (v = Math.abs(v) * (o ? 1 : -1), w = Math.abs(w) * (o ? 1 : -1)), n.diff = v, v *= r.touchRatio, o && (v = -v, w = -w); const b = s.touchesDirection; s.swipeDirection = v > 0 ? "prev" : "next", s.touchesDirection = w > 0 ? "prev" : "next"; const y = s.params.loop && !r.cssMode; if (!i.isMoved) { if (y && s.loopFix({ direction: s.swipeDirection }), i.startTranslate = s.getTranslate(), s.setTransition(0), s.animating) { const e = new window.CustomEvent("transitionend", { bubbles: !0, cancelable: !0 }); s.wrapperEl.dispatchEvent(e) } i.allowMomentumBounce = !1, !r.grabCursor || !0 !== s.allowSlideNext && !0 !== s.allowSlidePrev || s.setGrabCursor(!0), s.emit("sliderFirstMove", c) } let E; i.isMoved && b !== s.touchesDirection && y && Math.abs(v) >= 1 && (s.loopFix({ direction: s.swipeDirection, setTranslate: !0 }), E = !0), s.emit("sliderMove", c), i.isMoved = !0, i.currentTranslate = v + i.startTranslate; let x = !0, S = r.resistanceRatio; if (r.touchReleaseOnEdges && (S = 0), v > 0 ? (y && !E && i.currentTranslate > (r.centeredSlides ? s.minTranslate() - s.size / 2 : s.minTranslate()) && s.loopFix({ direction: "prev", setTranslate: !0, activeSlideIndex: 0 }), i.currentTranslate > s.minTranslate() && (x = !1, r.resistance && (i.currentTranslate = s.minTranslate() - 1 + (-s.minTranslate() + i.startTranslate + v) ** S))) : v < 0 && (y && !E && i.currentTranslate < (r.centeredSlides ? s.maxTranslate() + s.size / 2 : s.maxTranslate()) && s.loopFix({ direction: "next", setTranslate: !0, activeSlideIndex: s.slides.length - ("auto" === r.slidesPerView ? s.slidesPerViewDynamic() : Math.ceil(parseFloat(r.slidesPerView, 10))) }), i.currentTranslate < s.maxTranslate() && (x = !1, r.resistance && (i.currentTranslate = s.maxTranslate() + 1 - (s.maxTranslate() - i.startTranslate - v) ** S))), x && (c.preventedByNestedSwiper = !0), !s.allowSlideNext && "next" === s.swipeDirection && i.currentTranslate < i.startTranslate && (i.currentTranslate = i.startTranslate), !s.allowSlidePrev && "prev" === s.swipeDirection && i.currentTranslate > i.startTranslate && (i.currentTranslate = i.startTranslate), s.allowSlidePrev || s.allowSlideNext || (i.currentTranslate = i.startTranslate), r.threshold > 0) { if (!(Math.abs(v) > r.threshold || i.allowThresholdMove)) return void (i.currentTranslate = i.startTranslate); if (!i.allowThresholdMove) return i.allowThresholdMove = !0, n.startX = n.currentX, n.startY = n.currentY, i.currentTranslate = i.startTranslate, void (n.diff = s.isHorizontal() ? n.currentX - n.startX : n.currentY - n.startY) } r.followFinger && !r.cssMode && ((r.freeMode && r.freeMode.enabled && s.freeMode || r.watchSlidesProgress) && (s.updateActiveIndex(), s.updateSlidesClasses()), r.freeMode && r.freeMode.enabled && s.freeMode && s.freeMode.onTouchMove(), s.updateProgress(i.currentTranslate), s.setTranslate(i.currentTranslate)) } function Y(e) { const t = this, s = t.touchEventsData, a = s.evCache.findIndex((t => t.pointerId === e.pointerId)); if (a >= 0 && s.evCache.splice(a, 1), ["pointercancel", "pointerout", "pointerleave", "contextmenu"].includes(e.type)) { if (!(["pointercancel", "contextmenu"].includes(e.type) && (t.browser.isSafari || t.browser.isWebView))) return } const { params: i, touches: r, rtlTranslate: o, slidesGrid: d, enabled: c } = t; if (!c) return; if (!i.simulateTouch && "mouse" === e.pointerType) return; let p = e; if (p.originalEvent && (p = p.originalEvent), s.allowTouchCallbacks && t.emit("touchEnd", p), s.allowTouchCallbacks = !1, !s.isTouched) return s.isMoved && i.grabCursor && t.setGrabCursor(!1), s.isMoved = !1, void (s.startMoving = !1); i.grabCursor && s.isMoved && s.isTouched && (!0 === t.allowSlideNext || !0 === t.allowSlidePrev) && t.setGrabCursor(!1); const u = l(), m = u - s.touchStartTime; if (t.allowClick) { const e = p.path || p.composedPath && p.composedPath(); t.updateClickedSlide(e && e[0] || p.target), t.emit("tap click", p), m < 300 && u - s.lastClickTime < 300 && t.emit("doubleTap doubleClick", p) } if (s.lastClickTime = l(), n((() => { t.destroyed || (t.allowClick = !0) })), !s.isTouched || !s.isMoved || !t.swipeDirection || 0 === r.diff || s.currentTranslate === s.startTranslate) return s.isTouched = !1, s.isMoved = !1, void (s.startMoving = !1); let h; if (s.isTouched = !1, s.isMoved = !1, s.startMoving = !1, h = i.followFinger ? o ? t.translate : -t.translate : -s.currentTranslate, i.cssMode) return; if (i.freeMode && i.freeMode.enabled) return void t.freeMode.onTouchEnd({ currentPos: h }); let f = 0, g = t.slidesSizesGrid[0]; for (let e = 0; e < d.length; e += e < i.slidesPerGroupSkip ? 1 : i.slidesPerGroup) { const t = e < i.slidesPerGroupSkip - 1 ? 1 : i.slidesPerGroup; void 0 !== d[e + t] ? h >= d[e] && h < d[e + t] && (f = e, g = d[e + t] - d[e]) : h >= d[e] && (f = e, g = d[d.length - 1] - d[d.length - 2]) } let v = null, w = null; i.rewind && (t.isBeginning ? w = i.virtual && i.virtual.enabled && t.virtual ? t.virtual.slides.length - 1 : t.slides.length - 1 : t.isEnd && (v = 0)); const b = (h - d[f]) / g, y = f < i.slidesPerGroupSkip - 1 ? 1 : i.slidesPerGroup; if (m > i.longSwipesMs) { if (!i.longSwipes) return void t.slideTo(t.activeIndex); "next" === t.swipeDirection && (b >= i.longSwipesRatio ? t.slideTo(i.rewind && t.isEnd ? v : f + y) : t.slideTo(f)), "prev" === t.swipeDirection && (b > 1 - i.longSwipesRatio ? t.slideTo(f + y) : null !== w && b < 0 && Math.abs(b) > i.longSwipesRatio ? t.slideTo(w) : t.slideTo(f)) } else { if (!i.shortSwipes) return void t.slideTo(t.activeIndex); t.navigation && (p.target === t.navigation.nextEl || p.target === t.navigation.prevEl) ? p.target === t.navigation.nextEl ? t.slideTo(f + y) : t.slideTo(f) : ("next" === t.swipeDirection && t.slideTo(null !== v ? v : f + y), "prev" === t.swipeDirection && t.slideTo(null !== w ? w : f)) } } function N() { const e = this, { params: t, el: s } = e; if (s && 0 === s.offsetWidth) return; t.breakpoints && e.setBreakpoint(); const { allowSlideNext: a, allowSlidePrev: i, snapGrid: r } = e, n = e.virtual && e.params.virtual.enabled; e.allowSlideNext = !0, e.allowSlidePrev = !0, e.updateSize(), e.updateSlides(), e.updateSlidesClasses(); const l = n && t.loop; !("auto" === t.slidesPerView || t.slidesPerView > 1) || !e.isEnd || e.isBeginning || e.params.centeredSlides || l ? e.params.loop && !n ? e.slideToLoop(e.realIndex, 0, !1, !0) : e.slideTo(e.activeIndex, 0, !1, !0) : e.slideTo(e.slides.length - 1, 0, !1, !0), e.autoplay && e.autoplay.running && e.autoplay.paused && (clearTimeout(e.autoplay.resizeTimeout), e.autoplay.resizeTimeout = setTimeout((() => { e.autoplay && e.autoplay.running && e.autoplay.paused && e.autoplay.resume() }), 500)), e.allowSlidePrev = i, e.allowSlideNext = a, e.params.watchOverflow && r !== e.snapGrid && e.checkOverflow() } function B(e) { const t = this; t.enabled && (t.allowClick || (t.params.preventClicks && e.preventDefault(), t.params.preventClicksPropagation && t.animating && (e.stopPropagation(), e.stopImmediatePropagation()))) } function R() { const e = this, { wrapperEl: t, rtlTranslate: s, enabled: a } = e; if (!a) return; let i; e.previousTranslate = e.translate, e.isHorizontal() ? e.translate = -t.scrollLeft : e.translate = -t.scrollTop, 0 === e.translate && (e.translate = 0), e.updateActiveIndex(), e.updateSlidesClasses(); const r = e.maxTranslate() - e.minTranslate(); i = 0 === r ? 0 : (e.translate - e.minTranslate()) / r, i !== e.progress && e.updateProgress(s ? -e.translate : e.translate), e.emit("setTranslate", e.translate, !1) } function q(e) { const t = this; z(t, e.target), t.params.cssMode || "auto" !== t.params.slidesPerView && !t.params.autoHeight || t.update() } let V = !1; function F() { } const _ = (e, t) => { const s = a(), { params: i, el: r, wrapperEl: n, device: l } = e, o = !!i.nested, d = "on" === t ? "addEventListener" : "removeEventListener", c = t; r[d]("pointerdown", e.onTouchStart, { passive: !1 }), s[d]("pointermove", e.onTouchMove, { passive: !1, capture: o }), s[d]("pointerup", e.onTouchEnd, { passive: !0 }), s[d]("pointercancel", e.onTouchEnd, { passive: !0 }), s[d]("pointerout", e.onTouchEnd, { passive: !0 }), s[d]("pointerleave", e.onTouchEnd, { passive: !0 }), s[d]("contextmenu", e.onTouchEnd, { passive: !0 }), (i.preventClicks || i.preventClicksPropagation) && r[d]("click", e.onClick, !0), i.cssMode && n[d]("scroll", e.onScroll), i.updateOnWindowResize ? e[c](l.ios || l.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", N, !0) : e[c]("observerUpdate", N, !0), r[d]("load", e.onLoad, { capture: !0 }) }; const j = (e, t) => e.grid && t.grid && t.grid.rows > 1; var W = { init: !0, direction: "horizontal", oneWayMovement: !1, touchEventsTarget: "wrapper", initialSlide: 0, speed: 300, cssMode: !1, updateOnWindowResize: !0, resizeObserver: !0, nested: !1, createElements: !1, enabled: !0, focusableElements: "input, select, option, textarea, button, video, label", width: null, height: null, preventInteractionOnTransition: !1, userAgent: null, url: null, edgeSwipeDetection: !1, edgeSwipeThreshold: 20, autoHeight: !1, setWrapperSize: !1, virtualTranslate: !1, effect: "slide", breakpoints: void 0, breakpointsBase: "window", spaceBetween: 0, slidesPerView: 1, slidesPerGroup: 1, slidesPerGroupSkip: 0, slidesPerGroupAuto: !1, centeredSlides: !1, centeredSlidesBounds: !1, slidesOffsetBefore: 0, slidesOffsetAfter: 0, normalizeSlideIndex: !0, centerInsufficientSlides: !1, watchOverflow: !0, roundLengths: !1, touchRatio: 1, touchAngle: 45, simulateTouch: !0, shortSwipes: !0, longSwipes: !0, longSwipesRatio: .5, longSwipesMs: 300, followFinger: !0, allowTouchMove: !0, threshold: 5, touchMoveStopPropagation: !1, touchStartPreventDefault: !0, touchStartForcePreventDefault: !1, touchReleaseOnEdges: !1, uniqueNavElements: !0, resistance: !0, resistanceRatio: .85, watchSlidesProgress: !1, grabCursor: !1, preventClicks: !0, preventClicksPropagation: !0, slideToClickedSlide: !1, loop: !1, loopedSlides: null, loopPreventsSliding: !0, rewind: !1, allowSlidePrev: !0, allowSlideNext: !0, swipeHandler: null, noSwiping: !0, noSwipingClass: "swiper-no-swiping", noSwipingSelector: null, passiveListeners: !0, maxBackfaceHiddenSlides: 10, containerModifierClass: "swiper-", slideClass: "swiper-slide", slideActiveClass: "swiper-slide-active", slideVisibleClass: "swiper-slide-visible", slideNextClass: "swiper-slide-next", slidePrevClass: "swiper-slide-prev", wrapperClass: "swiper-wrapper", lazyPreloaderClass: "swiper-lazy-preloader", lazyPreloadPrevNext: 0, runCallbacksOnInit: !0, _emitClasses: !1 }; function U(e, t) { return function (s) { void 0 === s && (s = {}); const a = Object.keys(s)[0], i = s[a]; "object" == typeof i && null !== i ? (["navigation", "pagination", "scrollbar"].indexOf(a) >= 0 && !0 === e[a] && (e[a] = { auto: !0 }), a in e && "enabled" in i ? (!0 === e[a] && (e[a] = { enabled: !0 }), "object" != typeof e[a] || "enabled" in e[a] || (e[a].enabled = !0), e[a] || (e[a] = { enabled: !1 }), c(t, s)) : c(t, s)) : c(t, s) } } const K = { eventsEmitter: L, update: I, translate: k, transition: { setTransition: function (e, t) { const s = this; s.params.cssMode || (s.wrapperEl.style.transitionDuration = `${e}ms`, s.wrapperEl.style.transitionDelay = 0 === e ? "0ms" : ""), s.emit("setTransition", e, t) }, transitionStart: function (e, t) { void 0 === e && (e = !0); const s = this, { params: a } = s; a.cssMode || (a.autoHeight && s.updateAutoHeight(), O({ swiper: s, runCallbacks: e, direction: t, step: "Start" })) }, transitionEnd: function (e, t) { void 0 === e && (e = !0); const s = this, { params: a } = s; s.animating = !1, a.cssMode || (s.setTransition(0), O({ swiper: s, runCallbacks: e, direction: t, step: "End" })) } }, slide: D, loop: G, grabCursor: { setGrabCursor: function (e) { const t = this; if (!t.params.simulateTouch || t.params.watchOverflow && t.isLocked || t.params.cssMode) return; const s = "container" === t.params.touchEventsTarget ? t.el : t.wrapperEl; t.isElement && (t.__preventObserver__ = !0), s.style.cursor = "move", s.style.cursor = e ? "grabbing" : "grab", t.isElement && requestAnimationFrame((() => { t.__preventObserver__ = !1 })) }, unsetGrabCursor: function () { const e = this; e.params.watchOverflow && e.isLocked || e.params.cssMode || (e.isElement && (e.__preventObserver__ = !0), e["container" === e.params.touchEventsTarget ? "el" : "wrapperEl"].style.cursor = "", e.isElement && requestAnimationFrame((() => { e.__preventObserver__ = !1 }))) } }, events: { attachEvents: function () { const e = this, t = a(), { params: s } = e; e.onTouchStart = H.bind(e), e.onTouchMove = X.bind(e), e.onTouchEnd = Y.bind(e), s.cssMode && (e.onScroll = R.bind(e)), e.onClick = B.bind(e), e.onLoad = q.bind(e), V || (t.addEventListener("touchstart", F), V = !0), _(e, "on") }, detachEvents: function () { _(this, "off") } }, breakpoints: { setBreakpoint: function () { const e = this, { realIndex: t, initialized: s, params: a, el: i } = e, r = a.breakpoints; if (!r || r && 0 === Object.keys(r).length) return; const n = e.getBreakpoint(r, e.params.breakpointsBase, e.el); if (!n || e.currentBreakpoint === n) return; const l = (n in r ? r[n] : void 0) || e.originalParams, o = j(e, a), d = j(e, l), p = a.enabled; o && !d ? (i.classList.remove(`${a.containerModifierClass}grid`, `${a.containerModifierClass}grid-column`), e.emitContainerClasses()) : !o && d && (i.classList.add(`${a.containerModifierClass}grid`), (l.grid.fill && "column" === l.grid.fill || !l.grid.fill && "column" === a.grid.fill) && i.classList.add(`${a.containerModifierClass}grid-column`), e.emitContainerClasses()), ["navigation", "pagination", "scrollbar"].forEach((t => { if (void 0 === l[t]) return; const s = a[t] && a[t].enabled, i = l[t] && l[t].enabled; s && !i && e[t].disable(), !s && i && e[t].enable() })); const u = l.direction && l.direction !== a.direction, m = a.loop && (l.slidesPerView !== a.slidesPerView || u); u && s && e.changeDirection(), c(e.params, l); const h = e.params.enabled; Object.assign(e, { allowTouchMove: e.params.allowTouchMove, allowSlideNext: e.params.allowSlideNext, allowSlidePrev: e.params.allowSlidePrev }), p && !h ? e.disable() : !p && h && e.enable(), e.currentBreakpoint = n, e.emit("_beforeBreakpoint", l), m && s && (e.loopDestroy(), e.loopCreate(t), e.updateSlides()), e.emit("breakpoint", l) }, getBreakpoint: function (e, t, s) { if (void 0 === t && (t = "window"), !e || "container" === t && !s) return; let a = !1; const i = r(), n = "window" === t ? i.innerHeight : s.clientHeight, l = Object.keys(e).map((e => { if ("string" == typeof e && 0 === e.indexOf("@")) { const t = parseFloat(e.substr(1)); return { value: n * t, point: e } } return { value: e, point: e } })); l.sort(((e, t) => parseInt(e.value, 10) - parseInt(t.value, 10))); for (let e = 0; e < l.length; e += 1) { const { point: r, value: n } = l[e]; "window" === t ? i.matchMedia(`(min-width: ${n}px)`).matches && (a = r) : n <= s.clientWidth && (a = r) } return a || "max" } }, checkOverflow: { checkOverflow: function () { const e = this, { isLocked: t, params: s } = e, { slidesOffsetBefore: a } = s; if (a) { const t = e.slides.length - 1, s = e.slidesGrid[t] + e.slidesSizesGrid[t] + 2 * a; e.isLocked = e.size > s } else e.isLocked = 1 === e.snapGrid.length; !0 === s.allowSlideNext && (e.allowSlideNext = !e.isLocked), !0 === s.allowSlidePrev && (e.allowSlidePrev = !e.isLocked), t && t !== e.isLocked && (e.isEnd = !1), t !== e.isLocked && e.emit(e.isLocked ? "lock" : "unlock") } }, classes: { addClasses: function () { const e = this, { classNames: t, params: s, rtl: a, el: i, device: r } = e, n = function (e, t) { const s = []; return e.forEach((e => { "object" == typeof e ? Object.keys(e).forEach((a => { e[a] && s.push(t + a) })) : "string" == typeof e && s.push(t + e) })), s }(["initialized", s.direction, { "free-mode": e.params.freeMode && s.freeMode.enabled }, { autoheight: s.autoHeight }, { rtl: a }, { grid: s.grid && s.grid.rows > 1 }, { "grid-column": s.grid && s.grid.rows > 1 && "column" === s.grid.fill }, { android: r.android }, { ios: r.ios }, { "css-mode": s.cssMode }, { centered: s.cssMode && s.centeredSlides }, { "watch-progress": s.watchSlidesProgress }], s.containerModifierClass); t.push(...n), i.classList.add(...t), e.emitContainerClasses() }, removeClasses: function () { const { el: e, classNames: t } = this; e.classList.remove(...t), this.emitContainerClasses() } } }, Z = {}; class Q { constructor() { let e, t; for (var s = arguments.length, i = new Array(s), r = 0; r < s; r++)i[r] = arguments[r]; 1 === i.length && i[0].constructor && "Object" === Object.prototype.toString.call(i[0]).slice(8, -1) ? t = i[0] : [e, t] = i, t || (t = {}), t = c({}, t), e && !t.el && (t.el = e); const n = a(); if (t.el && "string" == typeof t.el && n.querySelectorAll(t.el).length > 1) { const e = []; return n.querySelectorAll(t.el).forEach((s => { const a = c({}, t, { el: s }); e.push(new Q(a)) })), e } const l = this; l.__swiper__ = !0, l.support = M(), l.device = C({ userAgent: t.userAgent }), l.browser = P(), l.eventsListeners = {}, l.eventsAnyListeners = [], l.modules = [...l.__modules__], t.modules && Array.isArray(t.modules) && l.modules.push(...t.modules); const o = {}; l.modules.forEach((e => { e({ params: t, swiper: l, extendParams: U(t, o), on: l.on.bind(l), once: l.once.bind(l), off: l.off.bind(l), emit: l.emit.bind(l) }) })); const d = c({}, W, o); return l.params = c({}, d, Z, t), l.originalParams = c({}, l.params), l.passedParams = c({}, t), l.params && l.params.on && Object.keys(l.params.on).forEach((e => { l.on(e, l.params.on[e]) })), l.params && l.params.onAny && l.onAny(l.params.onAny), Object.assign(l, { enabled: l.params.enabled, el: e, classNames: [], slides: [], slidesGrid: [], snapGrid: [], slidesSizesGrid: [], isHorizontal: () => "horizontal" === l.params.direction, isVertical: () => "vertical" === l.params.direction, activeIndex: 0, realIndex: 0, isBeginning: !0, isEnd: !1, translate: 0, previousTranslate: 0, progress: 0, velocity: 0, animating: !1, cssOverflowAdjustment() { return Math.trunc(this.translate / 2 ** 23) * 2 ** 23 }, allowSlideNext: l.params.allowSlideNext, allowSlidePrev: l.params.allowSlidePrev, touchEventsData: { isTouched: void 0, isMoved: void 0, allowTouchCallbacks: void 0, touchStartTime: void 0, isScrolling: void 0, currentTranslate: void 0, startTranslate: void 0, allowThresholdMove: void 0, focusableElements: l.params.focusableElements, lastClickTime: 0, clickTimeout: void 0, velocities: [], allowMomentumBounce: void 0, startMoving: void 0, evCache: [] }, allowClick: !0, allowTouchMove: l.params.allowTouchMove, touches: { startX: 0, startY: 0, currentX: 0, currentY: 0, diff: 0 }, imagesToLoad: [], imagesLoaded: 0 }), l.emit("_swiper"), l.params.init && l.init(), l } getSlideIndex(e) { const { slidesEl: t, params: s } = this, a = w(h(t, `.${s.slideClass}, swiper-slide`)[0]); return w(e) - a } getSlideIndexByData(e) { return this.getSlideIndex(this.slides.filter((t => 1 * t.getAttribute("data-swiper-slide-index") === e))[0]) } recalcSlides() { const { slidesEl: e, params: t } = this; this.slides = h(e, `.${t.slideClass}, swiper-slide`) } enable() { const e = this; e.enabled || (e.enabled = !0, e.params.grabCursor && e.setGrabCursor(), e.emit("enable")) } disable() { const e = this; e.enabled && (e.enabled = !1, e.params.grabCursor && e.unsetGrabCursor(), e.emit("disable")) } setProgress(e, t) { const s = this; e = Math.min(Math.max(e, 0), 1); const a = s.minTranslate(), i = (s.maxTranslate() - a) * e + a; s.translateTo(i, void 0 === t ? 0 : t), s.updateActiveIndex(), s.updateSlidesClasses() } emitContainerClasses() { const e = this; if (!e.params._emitClasses || !e.el) return; const t = e.el.className.split(" ").filter((t => 0 === t.indexOf("swiper") || 0 === t.indexOf(e.params.containerModifierClass))); e.emit("_containerClasses", t.join(" ")) } getSlideClasses(e) { const t = this; return t.destroyed ? "" : e.className.split(" ").filter((e => 0 === e.indexOf("swiper-slide") || 0 === e.indexOf(t.params.slideClass))).join(" ") } emitSlidesClasses() { const e = this; if (!e.params._emitClasses || !e.el) return; const t = []; e.slides.forEach((s => { const a = e.getSlideClasses(s); t.push({ slideEl: s, classNames: a }), e.emit("_slideClass", s, a) })), e.emit("_slideClasses", t) } slidesPerViewDynamic(e, t) { void 0 === e && (e = "current"), void 0 === t && (t = !1); const { params: s, slides: a, slidesGrid: i, slidesSizesGrid: r, size: n, activeIndex: l } = this; let o = 1; if (s.centeredSlides) { let e, t = a[l] ? a[l].swiperSlideSize : 0; for (let s = l + 1; s < a.length; s += 1)a[s] && !e && (t += a[s].swiperSlideSize, o += 1, t > n && (e = !0)); for (let s = l - 1; s >= 0; s -= 1)a[s] && !e && (t += a[s].swiperSlideSize, o += 1, t > n && (e = !0)) } else if ("current" === e) for (let e = l + 1; e < a.length; e += 1) { (t ? i[e] + r[e] - i[l] < n : i[e] - i[l] < n) && (o += 1) } else for (let e = l - 1; e >= 0; e -= 1) { i[l] - i[e] < n && (o += 1) } return o } update() { const e = this; if (!e || e.destroyed) return; const { snapGrid: t, params: s } = e; function a() { const t = e.rtlTranslate ? -1 * e.translate : e.translate, s = Math.min(Math.max(t, e.maxTranslate()), e.minTranslate()); e.setTranslate(s), e.updateActiveIndex(), e.updateSlidesClasses() } let i; if (s.breakpoints && e.setBreakpoint(), [...e.el.querySelectorAll('[loading="lazy"]')].forEach((t => { t.complete && z(e, t) })), e.updateSize(), e.updateSlides(), e.updateProgress(), e.updateSlidesClasses(), s.freeMode && s.freeMode.enabled && !s.cssMode) a(), s.autoHeight && e.updateAutoHeight(); else { if (("auto" === s.slidesPerView || s.slidesPerView > 1) && e.isEnd && !s.centeredSlides) { const t = e.virtual && s.virtual.enabled ? e.virtual.slides : e.slides; i = e.slideTo(t.length - 1, 0, !1, !0) } else i = e.slideTo(e.activeIndex, 0, !1, !0); i || a() } s.watchOverflow && t !== e.snapGrid && e.checkOverflow(), e.emit("update") } changeDirection(e, t) { void 0 === t && (t = !0); const s = this, a = s.params.direction; return e || (e = "horizontal" === a ? "vertical" : "horizontal"), e === a || "horizontal" !== e && "vertical" !== e || (s.el.classList.remove(`${s.params.containerModifierClass}${a}`), s.el.classList.add(`${s.params.containerModifierClass}${e}`), s.emitContainerClasses(), s.params.direction = e, s.slides.forEach((t => { "vertical" === e ? t.style.width = "" : t.style.height = "" })), s.emit("changeDirection"), t && s.update()), s } changeLanguageDirection(e) { const t = this; t.rtl && "rtl" === e || !t.rtl && "ltr" === e || (t.rtl = "rtl" === e, t.rtlTranslate = "horizontal" === t.params.direction && t.rtl, t.rtl ? (t.el.classList.add(`${t.params.containerModifierClass}rtl`), t.el.dir = "rtl") : (t.el.classList.remove(`${t.params.containerModifierClass}rtl`), t.el.dir = "ltr"), t.update()) } mount(e) { const t = this; if (t.mounted) return !0; let s = e || t.params.el; if ("string" == typeof s && (s = document.querySelector(s)), !s) return !1; s.swiper = t, s.parentNode && s.parentNode.host && "SWIPER-CONTAINER" === s.parentNode.host.nodeName && (t.isElement = !0); const a = () => `.${(t.params.wrapperClass || "").trim().split(" ").join(".")}`; let i = (() => { if (s && s.shadowRoot && s.shadowRoot.querySelector) { return s.shadowRoot.querySelector(a()) } return h(s, a())[0] })(); return !i && t.params.createElements && (i = f("div", t.params.wrapperClass), s.append(i), h(s, `.${t.params.slideClass}`).forEach((e => { i.append(e) }))), Object.assign(t, { el: s, wrapperEl: i, slidesEl: t.isElement && !s.parentNode.host.slideSlots ? s.parentNode.host : i, hostEl: t.isElement ? s.parentNode.host : s, mounted: !0, rtl: "rtl" === s.dir.toLowerCase() || "rtl" === v(s, "direction"), rtlTranslate: "horizontal" === t.params.direction && ("rtl" === s.dir.toLowerCase() || "rtl" === v(s, "direction")), wrongRTL: "-webkit-box" === v(i, "display") }), !0 } init(e) { const t = this; if (t.initialized) return t; if (!1 === t.mount(e)) return t; t.emit("beforeInit"), t.params.breakpoints && t.setBreakpoint(), t.addClasses(), t.updateSize(), t.updateSlides(), t.params.watchOverflow && t.checkOverflow(), t.params.grabCursor && t.enabled && t.setGrabCursor(), t.params.loop && t.virtual && t.params.virtual.enabled ? t.slideTo(t.params.initialSlide + t.virtual.slidesBefore, 0, t.params.runCallbacksOnInit, !1, !0) : t.slideTo(t.params.initialSlide, 0, t.params.runCallbacksOnInit, !1, !0), t.params.loop && t.loopCreate(), t.attachEvents(); const s = [...t.el.querySelectorAll('[loading="lazy"]')]; return t.isElement && s.push(...t.hostEl.querySelectorAll('[loading="lazy"]')), s.forEach((e => { e.complete ? z(t, e) : e.addEventListener("load", (e => { z(t, e.target) })) })), $(t), t.initialized = !0, $(t), t.emit("init"), t.emit("afterInit"), t } destroy(e, t) { void 0 === e && (e = !0), void 0 === t && (t = !0); const s = this, { params: a, el: i, wrapperEl: r, slides: n } = s; return void 0 === s.params || s.destroyed || (s.emit("beforeDestroy"), s.initialized = !1, s.detachEvents(), a.loop && s.loopDestroy(), t && (s.removeClasses(), i.removeAttribute("style"), r.removeAttribute("style"), n && n.length && n.forEach((e => { e.classList.remove(a.slideVisibleClass, a.slideActiveClass, a.slideNextClass, a.slidePrevClass), e.removeAttribute("style"), e.removeAttribute("data-swiper-slide-index") }))), s.emit("destroy"), Object.keys(s.eventsListeners).forEach((e => { s.off(e) })), !1 !== e && (s.el.swiper = null, function (e) { const t = e; Object.keys(t).forEach((e => { try { t[e] = null } catch (e) { } try { delete t[e] } catch (e) { } })) }(s)), s.destroyed = !0), null } static extendDefaults(e) { c(Z, e) } static get extendedDefaults() { return Z } static get defaults() { return W } static installModule(e) { Q.prototype.__modules__ || (Q.prototype.__modules__ = []); const t = Q.prototype.__modules__; "function" == typeof e && t.indexOf(e) < 0 && t.push(e) } static use(e) { return Array.isArray(e) ? (e.forEach((e => Q.installModule(e))), Q) : (Q.installModule(e), Q) } } function J(e, t, s, a) { return e.params.createElements && Object.keys(a).forEach((i => { if (!s[i] && !0 === s.auto) { let r = h(e.el, `.${a[i]}`)[0]; r || (r = f("div", a[i]), r.className = a[i], e.el.append(r)), s[i] = r, t[i] = r } })), s } function ee(e) { return void 0 === e && (e = ""), `.${e.trim().replace(/([\.:!+\/])/g, "\\$1").replace(/ /g, ".")}` } function te(e) { const t = this, { params: s, slidesEl: a } = t; s.loop && t.loopDestroy(); const i = e => { if ("string" == typeof e) { const t = document.createElement("div"); t.innerHTML = e, a.append(t.children[0]), t.innerHTML = "" } else a.append(e) }; if ("object" == typeof e && "length" in e) for (let t = 0; t < e.length; t += 1)e[t] && i(e[t]); else i(e); t.recalcSlides(), s.loop && t.loopCreate(), s.observer && !t.isElement || t.update() } function se(e) { const t = this, { params: s, activeIndex: a, slidesEl: i } = t; s.loop && t.loopDestroy(); let r = a + 1; const n = e => { if ("string" == typeof e) { const t = document.createElement("div"); t.innerHTML = e, i.prepend(t.children[0]), t.innerHTML = "" } else i.prepend(e) }; if ("object" == typeof e && "length" in e) { for (let t = 0; t < e.length; t += 1)e[t] && n(e[t]); r = a + e.length } else n(e); t.recalcSlides(), s.loop && t.loopCreate(), s.observer && !t.isElement || t.update(), t.slideTo(r, 0, !1) } function ae(e, t) { const s = this, { params: a, activeIndex: i, slidesEl: r } = s; let n = i; a.loop && (n -= s.loopedSlides, s.loopDestroy(), s.recalcSlides()); const l = s.slides.length; if (e <= 0) return void s.prependSlide(t); if (e >= l) return void s.appendSlide(t); let o = n > e ? n + 1 : n; const d = []; for (let t = l - 1; t >= e; t -= 1) { const e = s.slides[t]; e.remove(), d.unshift(e) } if ("object" == typeof t && "length" in t) { for (let e = 0; e < t.length; e += 1)t[e] && r.append(t[e]); o = n > e ? n + t.length : n } else r.append(t); for (let e = 0; e < d.length; e += 1)r.append(d[e]); s.recalcSlides(), a.loop && s.loopCreate(), a.observer && !s.isElement || s.update(), a.loop ? s.slideTo(o + s.loopedSlides, 0, !1) : s.slideTo(o, 0, !1) } function ie(e) { const t = this, { params: s, activeIndex: a } = t; let i = a; s.loop && (i -= t.loopedSlides, t.loopDestroy()); let r, n = i; if ("object" == typeof e && "length" in e) { for (let s = 0; s < e.length; s += 1)r = e[s], t.slides[r] && t.slides[r].remove(), r < n && (n -= 1); n = Math.max(n, 0) } else r = e, t.slides[r] && t.slides[r].remove(), r < n && (n -= 1), n = Math.max(n, 0); t.recalcSlides(), s.loop && t.loopCreate(), s.observer && !t.isElement || t.update(), s.loop ? t.slideTo(n + t.loopedSlides, 0, !1) : t.slideTo(n, 0, !1) } function re() { const e = this, t = []; for (let s = 0; s < e.slides.length; s += 1)t.push(s); e.removeSlide(t) } function ne(e) { const { effect: t, swiper: s, on: a, setTranslate: i, setTransition: r, overwriteParams: n, perspective: l, recreateShadows: o, getEffectParams: d } = e; let c; a("beforeInit", (() => { if (s.params.effect !== t) return; s.classNames.push(`${s.params.containerModifierClass}${t}`), l && l() && s.classNames.push(`${s.params.containerModifierClass}3d`); const e = n ? n() : {}; Object.assign(s.params, e), Object.assign(s.originalParams, e) })), a("setTranslate", (() => { s.params.effect === t && i() })), a("setTransition", ((e, a) => { s.params.effect === t && r(a) })), a("transitionEnd", (() => { if (s.params.effect === t && o) { if (!d || !d().slideShadows) return; s.slides.forEach((e => { e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((e => e.remove())) })), o() } })), a("virtualUpdate", (() => { s.params.effect === t && (s.slides.length || (c = !0), requestAnimationFrame((() => { c && s.slides && s.slides.length && (i(), c = !1) }))) })) } function le(e, t) { const s = m(t); return s !== t && (s.style.backfaceVisibility = "hidden", s.style["-webkit-backface-visibility"] = "hidden"), s } function oe(e) { let { swiper: t, duration: s, transformElements: a, allSlides: i } = e; const { activeIndex: r } = t; if (t.params.virtualTranslate && 0 !== s) { let e, s = !1; e = i ? a : a.filter((e => { const s = e.classList.contains("swiper-slide-transform") ? (e => { if (!e.parentElement) return t.slides.filter((t => t.shadowRoot && t.shadowRoot === e.parentNode))[0]; return e.parentElement })(e) : e; return t.getSlideIndex(s) === r })), e.forEach((e => { y(e, (() => { if (s) return; if (!t || t.destroyed) return; s = !0, t.animating = !1; const e = new window.CustomEvent("transitionend", { bubbles: !0, cancelable: !0 }); t.wrapperEl.dispatchEvent(e) })) })) } } function de(e, t, s) { const a = `swiper-slide-shadow${s ? `-${s}` : ""}${e ? ` swiper-slide-shadow-${e}` : ""}`, i = m(t); let r = i.querySelector(`.${a.split(" ").join(".")}`); return r || (r = f("div", a.split(" ")), i.append(r)), r } Object.keys(K).forEach((e => { Object.keys(K[e]).forEach((t => { Q.prototype[t] = K[e][t] })) })), Q.use([function (e) { let { swiper: t, on: s, emit: a } = e; const i = r(); let n = null, l = null; const o = () => { t && !t.destroyed && t.initialized && (a("beforeResize"), a("resize")) }, d = () => { t && !t.destroyed && t.initialized && a("orientationchange") }; s("init", (() => { t.params.resizeObserver && void 0 !== i.ResizeObserver ? t && !t.destroyed && t.initialized && (n = new ResizeObserver((e => { l = i.requestAnimationFrame((() => { const { width: s, height: a } = t; let i = s, r = a; e.forEach((e => { let { contentBoxSize: s, contentRect: a, target: n } = e; n && n !== t.el || (i = a ? a.width : (s[0] || s).inlineSize, r = a ? a.height : (s[0] || s).blockSize) })), i === s && r === a || o() })) })), n.observe(t.el)) : (i.addEventListener("resize", o), i.addEventListener("orientationchange", d)) })), s("destroy", (() => { l && i.cancelAnimationFrame(l), n && n.unobserve && t.el && (n.unobserve(t.el), n = null), i.removeEventListener("resize", o), i.removeEventListener("orientationchange", d) })) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = [], l = r(), o = function (e, s) { void 0 === s && (s = {}); const a = new (l.MutationObserver || l.WebkitMutationObserver)((e => { if (t.__preventObserver__) return; if (1 === e.length) return void i("observerUpdate", e[0]); const s = function () { i("observerUpdate", e[0]) }; l.requestAnimationFrame ? l.requestAnimationFrame(s) : l.setTimeout(s, 0) })); a.observe(e, { attributes: void 0 === s.attributes || s.attributes, childList: void 0 === s.childList || s.childList, characterData: void 0 === s.characterData || s.characterData }), n.push(a) }; s({ observer: !1, observeParents: !1, observeSlideChildren: !1 }), a("init", (() => { if (t.params.observer) { if (t.params.observeParents) { const e = b(t.hostEl); for (let t = 0; t < e.length; t += 1)o(e[t]) } o(t.hostEl, { childList: t.params.observeSlideChildren }), o(t.wrapperEl, { attributes: !1 }) } })), a("destroy", (() => { n.forEach((e => { e.disconnect() })), n.splice(0, n.length) })) }]); const ce = [function (e) { let t, { swiper: s, extendParams: i, on: r, emit: n } = e; i({ virtual: { enabled: !1, slides: [], cache: !0, renderSlide: null, renderExternal: null, renderExternalUpdate: !0, addSlidesBefore: 0, addSlidesAfter: 0 } }); const l = a(); s.virtual = { cache: {}, from: void 0, to: void 0, slides: [], offset: 0, slidesGrid: [] }; const o = l.createElement("div"); function d(e, t) { const a = s.params.virtual; if (a.cache && s.virtual.cache[t]) return s.virtual.cache[t]; let i; return a.renderSlide ? (i = a.renderSlide.call(s, e, t), "string" == typeof i && (o.innerHTML = i, i = o.children[0])) : i = s.isElement ? f("swiper-slide") : f("div", s.params.slideClass), i.setAttribute("data-swiper-slide-index", t), a.renderSlide || (i.innerHTML = e), a.cache && (s.virtual.cache[t] = i), i } function c(e) { const { slidesPerView: t, slidesPerGroup: a, centeredSlides: i, loop: r } = s.params, { addSlidesBefore: l, addSlidesAfter: o } = s.params.virtual, { from: c, to: p, slides: u, slidesGrid: m, offset: f } = s.virtual; s.params.cssMode || s.updateActiveIndex(); const g = s.activeIndex || 0; let v, w, b; v = s.rtlTranslate ? "right" : s.isHorizontal() ? "left" : "top", i ? (w = Math.floor(t / 2) + a + o, b = Math.floor(t / 2) + a + l) : (w = t + (a - 1) + o, b = (r ? t : a) + l); let y = g - b, E = g + w; r || (y = Math.max(y, 0), E = Math.min(E, u.length - 1)); let x = (s.slidesGrid[y] || 0) - (s.slidesGrid[0] || 0); function S() { s.updateSlides(), s.updateProgress(), s.updateSlidesClasses(), n("virtualUpdate") } if (r && g >= b ? (y -= b, i || (x += s.slidesGrid[0])) : r && g < b && (y = -b, i && (x += s.slidesGrid[0])), Object.assign(s.virtual, { from: y, to: E, offset: x, slidesGrid: s.slidesGrid, slidesBefore: b, slidesAfter: w }), c === y && p === E && !e) return s.slidesGrid !== m && x !== f && s.slides.forEach((e => { e.style[v] = x - Math.abs(s.cssOverflowAdjustment()) + "px" })), s.updateProgress(), void n("virtualUpdate"); if (s.params.virtual.renderExternal) return s.params.virtual.renderExternal.call(s, { offset: x, from: y, to: E, slides: function () { const e = []; for (let t = y; t <= E; t += 1)e.push(u[t]); return e }() }), void (s.params.virtual.renderExternalUpdate ? S() : n("virtualUpdate")); const T = [], M = [], C = e => { let t = e; return e < 0 ? t = u.length + e : t >= u.length && (t -= u.length), t }; if (e) s.slidesEl.querySelectorAll(`.${s.params.slideClass}, swiper-slide`).forEach((e => { e.remove() })); else for (let e = c; e <= p; e += 1)if (e < y || e > E) { const t = C(e); s.slidesEl.querySelectorAll(`.${s.params.slideClass}[data-swiper-slide-index="${t}"], swiper-slide[data-swiper-slide-index="${t}"]`).forEach((e => { e.remove() })) } const P = r ? -u.length : 0, L = r ? 2 * u.length : u.length; for (let t = P; t < L; t += 1)if (t >= y && t <= E) { const s = C(t); void 0 === p || e ? M.push(s) : (t > p && M.push(s), t < c && T.push(s)) } if (M.forEach((e => { s.slidesEl.append(d(u[e], e)) })), r) for (let e = T.length - 1; e >= 0; e -= 1) { const t = T[e]; s.slidesEl.prepend(d(u[t], t)) } else T.sort(((e, t) => t - e)), T.forEach((e => { s.slidesEl.prepend(d(u[e], e)) })); h(s.slidesEl, ".swiper-slide, swiper-slide").forEach((e => { e.style[v] = x - Math.abs(s.cssOverflowAdjustment()) + "px" })), S() } r("beforeInit", (() => { if (!s.params.virtual.enabled) return; let e; if (void 0 === s.passedParams.virtual.slides) { const t = [...s.slidesEl.children].filter((e => e.matches(`.${s.params.slideClass}, swiper-slide`))); t && t.length && (s.virtual.slides = [...t], e = !0, t.forEach(((e, t) => { e.setAttribute("data-swiper-slide-index", t), s.virtual.cache[t] = e, e.remove() }))) } e || (s.virtual.slides = s.params.virtual.slides), s.classNames.push(`${s.params.containerModifierClass}virtual`), s.params.watchSlidesProgress = !0, s.originalParams.watchSlidesProgress = !0, s.params.initialSlide || c() })), r("setTranslate", (() => { s.params.virtual.enabled && (s.params.cssMode && !s._immediateVirtual ? (clearTimeout(t), t = setTimeout((() => { c() }), 100)) : c()) })), r("init update resize", (() => { s.params.virtual.enabled && s.params.cssMode && p(s.wrapperEl, "--swiper-virtual-size", `${s.virtualSize}px`) })), Object.assign(s.virtual, { appendSlide: function (e) { if ("object" == typeof e && "length" in e) for (let t = 0; t < e.length; t += 1)e[t] && s.virtual.slides.push(e[t]); else s.virtual.slides.push(e); c(!0) }, prependSlide: function (e) { const t = s.activeIndex; let a = t + 1, i = 1; if (Array.isArray(e)) { for (let t = 0; t < e.length; t += 1)e[t] && s.virtual.slides.unshift(e[t]); a = t + e.length, i = e.length } else s.virtual.slides.unshift(e); if (s.params.virtual.cache) { const e = s.virtual.cache, t = {}; Object.keys(e).forEach((s => { const a = e[s], r = a.getAttribute("data-swiper-slide-index"); r && a.setAttribute("data-swiper-slide-index", parseInt(r, 10) + i), t[parseInt(s, 10) + i] = a })), s.virtual.cache = t } c(!0), s.slideTo(a, 0) }, removeSlide: function (e) { if (null == e) return; let t = s.activeIndex; if (Array.isArray(e)) for (let a = e.length - 1; a >= 0; a -= 1)s.virtual.slides.splice(e[a], 1), s.params.virtual.cache && delete s.virtual.cache[e[a]], e[a] < t && (t -= 1), t = Math.max(t, 0); else s.virtual.slides.splice(e, 1), s.params.virtual.cache && delete s.virtual.cache[e], e < t && (t -= 1), t = Math.max(t, 0); c(!0), s.slideTo(t, 0) }, removeAllSlides: function () { s.virtual.slides = [], s.params.virtual.cache && (s.virtual.cache = {}), c(!0), s.slideTo(0, 0) }, update: c }) }, function (e) { let { swiper: t, extendParams: s, on: i, emit: n } = e; const l = a(), o = r(); function d(e) { if (!t.enabled) return; const { rtlTranslate: s } = t; let a = e; a.originalEvent && (a = a.originalEvent); const i = a.keyCode || a.charCode, r = t.params.keyboard.pageUpDown, d = r && 33 === i, c = r && 34 === i, p = 37 === i, u = 39 === i, m = 38 === i, h = 40 === i; if (!t.allowSlideNext && (t.isHorizontal() && u || t.isVertical() && h || c)) return !1; if (!t.allowSlidePrev && (t.isHorizontal() && p || t.isVertical() && m || d)) return !1; if (!(a.shiftKey || a.altKey || a.ctrlKey || a.metaKey || l.activeElement && l.activeElement.nodeName && ("input" === l.activeElement.nodeName.toLowerCase() || "textarea" === l.activeElement.nodeName.toLowerCase()))) { if (t.params.keyboard.onlyInViewport && (d || c || p || u || m || h)) { let e = !1; if (b(t.el, `.${t.params.slideClass}, swiper-slide`).length > 0 && 0 === b(t.el, `.${t.params.slideActiveClass}`).length) return; const a = t.el, i = a.clientWidth, r = a.clientHeight, n = o.innerWidth, l = o.innerHeight, d = g(a); s && (d.left -= a.scrollLeft); const c = [[d.left, d.top], [d.left + i, d.top], [d.left, d.top + r], [d.left + i, d.top + r]]; for (let t = 0; t < c.length; t += 1) { const s = c[t]; if (s[0] >= 0 && s[0] <= n && s[1] >= 0 && s[1] <= l) { if (0 === s[0] && 0 === s[1]) continue; e = !0 } } if (!e) return } t.isHorizontal() ? ((d || c || p || u) && (a.preventDefault ? a.preventDefault() : a.returnValue = !1), ((c || u) && !s || (d || p) && s) && t.slideNext(), ((d || p) && !s || (c || u) && s) && t.slidePrev()) : ((d || c || m || h) && (a.preventDefault ? a.preventDefault() : a.returnValue = !1), (c || h) && t.slideNext(), (d || m) && t.slidePrev()), n("keyPress", i) } } function c() { t.keyboard.enabled || (l.addEventListener("keydown", d), t.keyboard.enabled = !0) } function p() { t.keyboard.enabled && (l.removeEventListener("keydown", d), t.keyboard.enabled = !1) } t.keyboard = { enabled: !1 }, s({ keyboard: { enabled: !1, onlyInViewport: !0, pageUpDown: !0 } }), i("init", (() => { t.params.keyboard.enabled && c() })), i("destroy", (() => { t.keyboard.enabled && p() })), Object.assign(t.keyboard, { enable: c, disable: p }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const o = r(); let d; s({ mousewheel: { enabled: !1, releaseOnEdges: !1, invert: !1, forceToAxis: !1, sensitivity: 1, eventsTarget: "container", thresholdDelta: null, thresholdTime: null, noMousewheelClass: "swiper-no-mousewheel" } }), t.mousewheel = { enabled: !1 }; let c, p = l(); const u = []; function m() { t.enabled && (t.mouseEntered = !0) } function h() { t.enabled && (t.mouseEntered = !1) } function f(e) { return !(t.params.mousewheel.thresholdDelta && e.delta < t.params.mousewheel.thresholdDelta) && (!(t.params.mousewheel.thresholdTime && l() - p < t.params.mousewheel.thresholdTime) && (e.delta >= 6 && l() - p < 60 || (e.direction < 0 ? t.isEnd && !t.params.loop || t.animating || (t.slideNext(), i("scroll", e.raw)) : t.isBeginning && !t.params.loop || t.animating || (t.slidePrev(), i("scroll", e.raw)), p = (new o.Date).getTime(), !1))) } function g(e) { let s = e, a = !0; if (!t.enabled) return; if (e.target.closest(`.${t.params.mousewheel.noMousewheelClass}`)) return; const r = t.params.mousewheel; t.params.cssMode && s.preventDefault(); let o = t.el; "container" !== t.params.mousewheel.eventsTarget && (o = document.querySelector(t.params.mousewheel.eventsTarget)); const p = o && o.contains(s.target); if (!t.mouseEntered && !p && !r.releaseOnEdges) return !0; s.originalEvent && (s = s.originalEvent); let m = 0; const h = t.rtlTranslate ? -1 : 1, g = function (e) { let t = 0, s = 0, a = 0, i = 0; return "detail" in e && (s = e.detail), "wheelDelta" in e && (s = -e.wheelDelta / 120), "wheelDeltaY" in e && (s = -e.wheelDeltaY / 120), "wheelDeltaX" in e && (t = -e.wheelDeltaX / 120), "axis" in e && e.axis === e.HORIZONTAL_AXIS && (t = s, s = 0), a = 10 * t, i = 10 * s, "deltaY" in e && (i = e.deltaY), "deltaX" in e && (a = e.deltaX), e.shiftKey && !a && (a = i, i = 0), (a || i) && e.deltaMode && (1 === e.deltaMode ? (a *= 40, i *= 40) : (a *= 800, i *= 800)), a && !t && (t = a < 1 ? -1 : 1), i && !s && (s = i < 1 ? -1 : 1), { spinX: t, spinY: s, pixelX: a, pixelY: i } }(s); if (r.forceToAxis) if (t.isHorizontal()) { if (!(Math.abs(g.pixelX) > Math.abs(g.pixelY))) return !0; m = -g.pixelX * h } else { if (!(Math.abs(g.pixelY) > Math.abs(g.pixelX))) return !0; m = -g.pixelY } else m = Math.abs(g.pixelX) > Math.abs(g.pixelY) ? -g.pixelX * h : -g.pixelY; if (0 === m) return !0; r.invert && (m = -m); let v = t.getTranslate() + m * r.sensitivity; if (v >= t.minTranslate() && (v = t.minTranslate()), v <= t.maxTranslate() && (v = t.maxTranslate()), a = !!t.params.loop || !(v === t.minTranslate() || v === t.maxTranslate()), a && t.params.nested && s.stopPropagation(), t.params.freeMode && t.params.freeMode.enabled) { const e = { time: l(), delta: Math.abs(m), direction: Math.sign(m) }, a = c && e.time < c.time + 500 && e.delta <= c.delta && e.direction === c.direction; if (!a) { c = void 0; let l = t.getTranslate() + m * r.sensitivity; const o = t.isBeginning, p = t.isEnd; if (l >= t.minTranslate() && (l = t.minTranslate()), l <= t.maxTranslate() && (l = t.maxTranslate()), t.setTransition(0), t.setTranslate(l), t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses(), (!o && t.isBeginning || !p && t.isEnd) && t.updateSlidesClasses(), t.params.loop && t.loopFix({ direction: e.direction < 0 ? "next" : "prev", byMousewheel: !0 }), t.params.freeMode.sticky) { clearTimeout(d), d = void 0, u.length >= 15 && u.shift(); const s = u.length ? u[u.length - 1] : void 0, a = u[0]; if (u.push(e), s && (e.delta > s.delta || e.direction !== s.direction)) u.splice(0); else if (u.length >= 15 && e.time - a.time < 500 && a.delta - e.delta >= 1 && e.delta <= 6) { const s = m > 0 ? .8 : .2; c = e, u.splice(0), d = n((() => { t.slideToClosest(t.params.speed, !0, void 0, s) }), 0) } d || (d = n((() => { c = e, u.splice(0), t.slideToClosest(t.params.speed, !0, void 0, .5) }), 500)) } if (a || i("scroll", s), t.params.autoplay && t.params.autoplayDisableOnInteraction && t.autoplay.stop(), r.releaseOnEdges && (l === t.minTranslate() || l === t.maxTranslate())) return !0 } } else { const s = { time: l(), delta: Math.abs(m), direction: Math.sign(m), raw: e }; u.length >= 2 && u.shift(); const a = u.length ? u[u.length - 1] : void 0; if (u.push(s), a ? (s.direction !== a.direction || s.delta > a.delta || s.time > a.time + 150) && f(s) : f(s), function (e) { const s = t.params.mousewheel; if (e.direction < 0) { if (t.isEnd && !t.params.loop && s.releaseOnEdges) return !0 } else if (t.isBeginning && !t.params.loop && s.releaseOnEdges) return !0; return !1 }(s)) return !0 } return s.preventDefault ? s.preventDefault() : s.returnValue = !1, !1 } function v(e) { let s = t.el; "container" !== t.params.mousewheel.eventsTarget && (s = document.querySelector(t.params.mousewheel.eventsTarget)), s[e]("mouseenter", m), s[e]("mouseleave", h), s[e]("wheel", g) } function w() { return t.params.cssMode ? (t.wrapperEl.removeEventListener("wheel", g), !0) : !t.mousewheel.enabled && (v("addEventListener"), t.mousewheel.enabled = !0, !0) } function b() { return t.params.cssMode ? (t.wrapperEl.addEventListener(event, g), !0) : !!t.mousewheel.enabled && (v("removeEventListener"), t.mousewheel.enabled = !1, !0) } a("init", (() => { !t.params.mousewheel.enabled && t.params.cssMode && b(), t.params.mousewheel.enabled && w() })), a("destroy", (() => { t.params.cssMode && w(), t.mousewheel.enabled && b() })), Object.assign(t.mousewheel, { enable: w, disable: b }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; s({ navigation: { nextEl: null, prevEl: null, hideOnClick: !1, disabledClass: "swiper-button-disabled", hiddenClass: "swiper-button-hidden", lockClass: "swiper-button-lock", navigationDisabledClass: "swiper-navigation-disabled" } }), t.navigation = { nextEl: null, prevEl: null }; const r = e => (Array.isArray(e) ? e : [e]).filter((e => !!e)); function n(e) { let s; return e && "string" == typeof e && t.isElement && (s = t.el.querySelector(e), s) ? s : (e && ("string" == typeof e && (s = [...document.querySelectorAll(e)]), t.params.uniqueNavElements && "string" == typeof e && s.length > 1 && 1 === t.el.querySelectorAll(e).length && (s = t.el.querySelector(e))), e && !s ? e : s) } function l(e, s) { const a = t.params.navigation; (e = r(e)).forEach((e => { e && (e.classList[s ? "add" : "remove"](...a.disabledClass.split(" ")), "BUTTON" === e.tagName && (e.disabled = s), t.params.watchOverflow && t.enabled && e.classList[t.isLocked ? "add" : "remove"](a.lockClass)) })) } function o() { const { nextEl: e, prevEl: s } = t.navigation; if (t.params.loop) return l(s, !1), void l(e, !1); l(s, t.isBeginning && !t.params.rewind), l(e, t.isEnd && !t.params.rewind) } function d(e) { e.preventDefault(), (!t.isBeginning || t.params.loop || t.params.rewind) && (t.slidePrev(), i("navigationPrev")) } function c(e) { e.preventDefault(), (!t.isEnd || t.params.loop || t.params.rewind) && (t.slideNext(), i("navigationNext")) } function p() { const e = t.params.navigation; if (t.params.navigation = J(t, t.originalParams.navigation, t.params.navigation, { nextEl: "swiper-button-next", prevEl: "swiper-button-prev" }), !e.nextEl && !e.prevEl) return; let s = n(e.nextEl), a = n(e.prevEl); Object.assign(t.navigation, { nextEl: s, prevEl: a }), s = r(s), a = r(a); const i = (s, a) => { s && s.addEventListener("click", "next" === a ? c : d), !t.enabled && s && s.classList.add(...e.lockClass.split(" ")) }; s.forEach((e => i(e, "next"))), a.forEach((e => i(e, "prev"))) } function u() { let { nextEl: e, prevEl: s } = t.navigation; e = r(e), s = r(s); const a = (e, s) => { e.removeEventListener("click", "next" === s ? c : d), e.classList.remove(...t.params.navigation.disabledClass.split(" ")) }; e.forEach((e => a(e, "next"))), s.forEach((e => a(e, "prev"))) } a("init", (() => { !1 === t.params.navigation.enabled ? m() : (p(), o()) })), a("toEdge fromEdge lock unlock", (() => { o() })), a("destroy", (() => { u() })), a("enable disable", (() => { let { nextEl: e, prevEl: s } = t.navigation; e = r(e), s = r(s), [...e, ...s].filter((e => !!e)).forEach((e => e.classList[t.enabled ? "remove" : "add"](t.params.navigation.lockClass))) })), a("click", ((e, s) => { let { nextEl: a, prevEl: n } = t.navigation; a = r(a), n = r(n); const l = s.target; if (t.params.navigation.hideOnClick && !n.includes(l) && !a.includes(l)) { if (t.pagination && t.params.pagination && t.params.pagination.clickable && (t.pagination.el === l || t.pagination.el.contains(l))) return; let e; a.length ? e = a[0].classList.contains(t.params.navigation.hiddenClass) : n.length && (e = n[0].classList.contains(t.params.navigation.hiddenClass)), i(!0 === e ? "navigationShow" : "navigationHide"), [...a, ...n].filter((e => !!e)).forEach((e => e.classList.toggle(t.params.navigation.hiddenClass))) } })); const m = () => { t.el.classList.add(...t.params.navigation.navigationDisabledClass.split(" ")), u() }; Object.assign(t.navigation, { enable: () => { t.el.classList.remove(...t.params.navigation.navigationDisabledClass.split(" ")), p(), o() }, disable: m, update: o, init: p, destroy: u }) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const r = "swiper-pagination"; let n; s({ pagination: { el: null, bulletElement: "span", clickable: !1, hideOnClick: !1, renderBullet: null, renderProgressbar: null, renderFraction: null, renderCustom: null, progressbarOpposite: !1, type: "bullets", dynamicBullets: !1, dynamicMainBullets: 1, formatFractionCurrent: e => e, formatFractionTotal: e => e, bulletClass: `${r}-bullet`, bulletActiveClass: `${r}-bullet-active`, modifierClass: `${r}-`, currentClass: `${r}-current`, totalClass: `${r}-total`, hiddenClass: `${r}-hidden`, progressbarFillClass: `${r}-progressbar-fill`, progressbarOppositeClass: `${r}-progressbar-opposite`, clickableClass: `${r}-clickable`, lockClass: `${r}-lock`, horizontalClass: `${r}-horizontal`, verticalClass: `${r}-vertical`, paginationDisabledClass: `${r}-disabled` } }), t.pagination = { el: null, bullets: [] }; let l = 0; const o = e => (Array.isArray(e) ? e : [e]).filter((e => !!e)); function d() { return !t.params.pagination.el || !t.pagination.el || Array.isArray(t.pagination.el) && 0 === t.pagination.el.length } function c(e, s) { const { bulletActiveClass: a } = t.params.pagination; e && (e = e[("prev" === s ? "previous" : "next") + "ElementSibling"]) && (e.classList.add(`${a}-${s}`), (e = e[("prev" === s ? "previous" : "next") + "ElementSibling"]) && e.classList.add(`${a}-${s}-${s}`)) } function p(e) { const s = e.target.closest(ee(t.params.pagination.bulletClass)); if (!s) return; e.preventDefault(); const a = w(s) * t.params.slidesPerGroup; if (t.params.loop) { if (t.realIndex === a) return; const e = t.realIndex, s = t.getSlideIndexByData(a), i = t.getSlideIndexByData(t.realIndex); if (s > t.slides.length - t.loopedSlides) { const a = t.activeIndex; t.loopFix({ direction: s > i ? "next" : "prev", activeSlideIndex: s, slideTo: !1 }); a === t.activeIndex && t.slideToLoop(e, 0, !1, !0) } t.slideToLoop(a) } else t.slideTo(a) } function u() { const e = t.rtl, s = t.params.pagination; if (d()) return; let a, r, p = t.pagination.el; p = o(p); const u = t.virtual && t.params.virtual.enabled ? t.virtual.slides.length : t.slides.length, m = t.params.loop ? Math.ceil(u / t.params.slidesPerGroup) : t.snapGrid.length; if (t.params.loop ? (r = t.previousRealIndex || 0, a = t.params.slidesPerGroup > 1 ? Math.floor(t.realIndex / t.params.slidesPerGroup) : t.realIndex) : void 0 !== t.snapIndex ? (a = t.snapIndex, r = t.previousSnapIndex) : (r = t.previousIndex || 0, a = t.activeIndex || 0), "bullets" === s.type && t.pagination.bullets && t.pagination.bullets.length > 0) { const i = t.pagination.bullets; let o, d, u; if (s.dynamicBullets && (n = E(i[0], t.isHorizontal() ? "width" : "height", !0), p.forEach((e => { e.style[t.isHorizontal() ? "width" : "height"] = n * (s.dynamicMainBullets + 4) + "px" })), s.dynamicMainBullets > 1 && void 0 !== r && (l += a - (r || 0), l > s.dynamicMainBullets - 1 ? l = s.dynamicMainBullets - 1 : l < 0 && (l = 0)), o = Math.max(a - l, 0), d = o + (Math.min(i.length, s.dynamicMainBullets) - 1), u = (d + o) / 2), i.forEach((e => { const t = [...["", "-next", "-next-next", "-prev", "-prev-prev", "-main"].map((e => `${s.bulletActiveClass}${e}`))].map((e => "string" == typeof e && e.includes(" ") ? e.split(" ") : e)).flat(); e.classList.remove(...t) })), p.length > 1) i.forEach((e => { const i = w(e); i === a ? e.classList.add(...s.bulletActiveClass.split(" ")) : t.isElement && e.setAttribute("part", "bullet"), s.dynamicBullets && (i >= o && i <= d && e.classList.add(...`${s.bulletActiveClass}-main`.split(" ")), i === o && c(e, "prev"), i === d && c(e, "next")) })); else { const e = i[a]; if (e && e.classList.add(...s.bulletActiveClass.split(" ")), t.isElement && i.forEach(((e, t) => { e.setAttribute("part", t === a ? "bullet-active" : "bullet") })), s.dynamicBullets) { const e = i[o], t = i[d]; for (let e = o; e <= d; e += 1)i[e] && i[e].classList.add(...`${s.bulletActiveClass}-main`.split(" ")); c(e, "prev"), c(t, "next") } } if (s.dynamicBullets) { const a = Math.min(i.length, s.dynamicMainBullets + 4), r = (n * a - n) / 2 - u * n, l = e ? "right" : "left"; i.forEach((e => { e.style[t.isHorizontal() ? l : "top"] = `${r}px` })) } } p.forEach(((e, r) => { if ("fraction" === s.type && (e.querySelectorAll(ee(s.currentClass)).forEach((e => { e.textContent = s.formatFractionCurrent(a + 1) })), e.querySelectorAll(ee(s.totalClass)).forEach((e => { e.textContent = s.formatFractionTotal(m) }))), "progressbar" === s.type) { let i; i = s.progressbarOpposite ? t.isHorizontal() ? "vertical" : "horizontal" : t.isHorizontal() ? "horizontal" : "vertical"; const r = (a + 1) / m; let n = 1, l = 1; "horizontal" === i ? n = r : l = r, e.querySelectorAll(ee(s.progressbarFillClass)).forEach((e => { e.style.transform = `translate3d(0,0,0) scaleX(${n}) scaleY(${l})`, e.style.transitionDuration = `${t.params.speed}ms` })) } "custom" === s.type && s.renderCustom ? (e.innerHTML = s.renderCustom(t, a + 1, m), 0 === r && i("paginationRender", e)) : (0 === r && i("paginationRender", e), i("paginationUpdate", e)), t.params.watchOverflow && t.enabled && e.classList[t.isLocked ? "add" : "remove"](s.lockClass) })) } function m() { const e = t.params.pagination; if (d()) return; const s = t.virtual && t.params.virtual.enabled ? t.virtual.slides.length : t.slides.length; let a = t.pagination.el; a = o(a); let r = ""; if ("bullets" === e.type) { let a = t.params.loop ? Math.ceil(s / t.params.slidesPerGroup) : t.snapGrid.length; t.params.freeMode && t.params.freeMode.enabled && a > s && (a = s); for (let s = 0; s < a; s += 1)e.renderBullet ? r += e.renderBullet.call(t, s, e.bulletClass) : r += `<${e.bulletElement} ${t.isElement ? 'part="bullet"' : ""} class="${e.bulletClass}">` } "fraction" === e.type && (r = e.renderFraction ? e.renderFraction.call(t, e.currentClass, e.totalClass) : ` / `), "progressbar" === e.type && (r = e.renderProgressbar ? e.renderProgressbar.call(t, e.progressbarFillClass) : ``), t.pagination.bullets = [], a.forEach((s => { "custom" !== e.type && (s.innerHTML = r || ""), "bullets" === e.type && t.pagination.bullets.push(...s.querySelectorAll(ee(e.bulletClass))) })), "custom" !== e.type && i("paginationRender", a[0]) } function h() { t.params.pagination = J(t, t.originalParams.pagination, t.params.pagination, { el: "swiper-pagination" }); const e = t.params.pagination; if (!e.el) return; let s; "string" == typeof e.el && t.isElement && (s = t.el.querySelector(e.el)), s || "string" != typeof e.el || (s = [...document.querySelectorAll(e.el)]), s || (s = e.el), s && 0 !== s.length && (t.params.uniqueNavElements && "string" == typeof e.el && Array.isArray(s) && s.length > 1 && (s = [...t.el.querySelectorAll(e.el)], s.length > 1 && (s = s.filter((e => b(e, ".swiper")[0] === t.el))[0])), Array.isArray(s) && 1 === s.length && (s = s[0]), Object.assign(t.pagination, { el: s }), s = o(s), s.forEach((s => { "bullets" === e.type && e.clickable && s.classList.add(...(e.clickableClass || "").split(" ")), s.classList.add(e.modifierClass + e.type), s.classList.add(t.isHorizontal() ? e.horizontalClass : e.verticalClass), "bullets" === e.type && e.dynamicBullets && (s.classList.add(`${e.modifierClass}${e.type}-dynamic`), l = 0, e.dynamicMainBullets < 1 && (e.dynamicMainBullets = 1)), "progressbar" === e.type && e.progressbarOpposite && s.classList.add(e.progressbarOppositeClass), e.clickable && s.addEventListener("click", p), t.enabled || s.classList.add(e.lockClass) }))) } function f() { const e = t.params.pagination; if (d()) return; let s = t.pagination.el; s && (s = o(s), s.forEach((s => { s.classList.remove(e.hiddenClass), s.classList.remove(e.modifierClass + e.type), s.classList.remove(t.isHorizontal() ? e.horizontalClass : e.verticalClass), e.clickable && (s.classList.remove(...(e.clickableClass || "").split(" ")), s.removeEventListener("click", p)) }))), t.pagination.bullets && t.pagination.bullets.forEach((t => t.classList.remove(...e.bulletActiveClass.split(" ")))) } a("changeDirection", (() => { if (!t.pagination || !t.pagination.el) return; const e = t.params.pagination; let { el: s } = t.pagination; s = o(s), s.forEach((s => { s.classList.remove(e.horizontalClass, e.verticalClass), s.classList.add(t.isHorizontal() ? e.horizontalClass : e.verticalClass) })) })), a("init", (() => { !1 === t.params.pagination.enabled ? g() : (h(), m(), u()) })), a("activeIndexChange", (() => { void 0 === t.snapIndex && u() })), a("snapIndexChange", (() => { u() })), a("snapGridLengthChange", (() => { m(), u() })), a("destroy", (() => { f() })), a("enable disable", (() => { let { el: e } = t.pagination; e && (e = o(e), e.forEach((e => e.classList[t.enabled ? "remove" : "add"](t.params.pagination.lockClass)))) })), a("lock unlock", (() => { u() })), a("click", ((e, s) => { const a = s.target, r = o(t.pagination.el); if (t.params.pagination.el && t.params.pagination.hideOnClick && r && r.length > 0 && !a.classList.contains(t.params.pagination.bulletClass)) { if (t.navigation && (t.navigation.nextEl && a === t.navigation.nextEl || t.navigation.prevEl && a === t.navigation.prevEl)) return; const e = r[0].classList.contains(t.params.pagination.hiddenClass); i(!0 === e ? "paginationShow" : "paginationHide"), r.forEach((e => e.classList.toggle(t.params.pagination.hiddenClass))) } })); const g = () => { t.el.classList.add(t.params.pagination.paginationDisabledClass); let { el: e } = t.pagination; e && (e = o(e), e.forEach((e => e.classList.add(t.params.pagination.paginationDisabledClass)))), f() }; Object.assign(t.pagination, { enable: () => { t.el.classList.remove(t.params.pagination.paginationDisabledClass); let { el: e } = t.pagination; e && (e = o(e), e.forEach((e => e.classList.remove(t.params.pagination.paginationDisabledClass)))), h(), m(), u() }, disable: g, render: m, update: u, init: h, destroy: f }) }, function (e) { let { swiper: t, extendParams: s, on: i, emit: r } = e; const l = a(); let o, d, c, p, u = !1, m = null, h = null; function v() { if (!t.params.scrollbar.el || !t.scrollbar.el) return; const { scrollbar: e, rtlTranslate: s } = t, { dragEl: a, el: i } = e, r = t.params.scrollbar, n = t.params.loop ? t.progressLoop : t.progress; let l = d, o = (c - d) * n; s ? (o = -o, o > 0 ? (l = d - o, o = 0) : -o + d > c && (l = c + o)) : o < 0 ? (l = d + o, o = 0) : o + d > c && (l = c - o), t.isHorizontal() ? (a.style.transform = `translate3d(${o}px, 0, 0)`, a.style.width = `${l}px`) : (a.style.transform = `translate3d(0px, ${o}px, 0)`, a.style.height = `${l}px`), r.hide && (clearTimeout(m), i.style.opacity = 1, m = setTimeout((() => { i.style.opacity = 0, i.style.transitionDuration = "400ms" }), 1e3)) } function w() { if (!t.params.scrollbar.el || !t.scrollbar.el) return; const { scrollbar: e } = t, { dragEl: s, el: a } = e; s.style.width = "", s.style.height = "", c = t.isHorizontal() ? a.offsetWidth : a.offsetHeight, p = t.size / (t.virtualSize + t.params.slidesOffsetBefore - (t.params.centeredSlides ? t.snapGrid[0] : 0)), d = "auto" === t.params.scrollbar.dragSize ? c * p : parseInt(t.params.scrollbar.dragSize, 10), t.isHorizontal() ? s.style.width = `${d}px` : s.style.height = `${d}px`, a.style.display = p >= 1 ? "none" : "", t.params.scrollbar.hide && (a.style.opacity = 0), t.params.watchOverflow && t.enabled && e.el.classList[t.isLocked ? "add" : "remove"](t.params.scrollbar.lockClass) } function b(e) { return t.isHorizontal() ? e.clientX : e.clientY } function y(e) { const { scrollbar: s, rtlTranslate: a } = t, { el: i } = s; let r; r = (b(e) - g(i)[t.isHorizontal() ? "left" : "top"] - (null !== o ? o : d / 2)) / (c - d), r = Math.max(Math.min(r, 1), 0), a && (r = 1 - r); const n = t.minTranslate() + (t.maxTranslate() - t.minTranslate()) * r; t.updateProgress(n), t.setTranslate(n), t.updateActiveIndex(), t.updateSlidesClasses() } function E(e) { const s = t.params.scrollbar, { scrollbar: a, wrapperEl: i } = t, { el: n, dragEl: l } = a; u = !0, o = e.target === l ? b(e) - e.target.getBoundingClientRect()[t.isHorizontal() ? "left" : "top"] : null, e.preventDefault(), e.stopPropagation(), i.style.transitionDuration = "100ms", l.style.transitionDuration = "100ms", y(e), clearTimeout(h), n.style.transitionDuration = "0ms", s.hide && (n.style.opacity = 1), t.params.cssMode && (t.wrapperEl.style["scroll-snap-type"] = "none"), r("scrollbarDragStart", e) } function x(e) { const { scrollbar: s, wrapperEl: a } = t, { el: i, dragEl: n } = s; u && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, y(e), a.style.transitionDuration = "0ms", i.style.transitionDuration = "0ms", n.style.transitionDuration = "0ms", r("scrollbarDragMove", e)) } function S(e) { const s = t.params.scrollbar, { scrollbar: a, wrapperEl: i } = t, { el: l } = a; u && (u = !1, t.params.cssMode && (t.wrapperEl.style["scroll-snap-type"] = "", i.style.transitionDuration = ""), s.hide && (clearTimeout(h), h = n((() => { l.style.opacity = 0, l.style.transitionDuration = "400ms" }), 1e3)), r("scrollbarDragEnd", e), s.snapOnRelease && t.slideToClosest()) } function T(e) { const { scrollbar: s, params: a } = t, i = s.el; if (!i) return; const r = i, n = !!a.passiveListeners && { passive: !1, capture: !1 }, o = !!a.passiveListeners && { passive: !0, capture: !1 }; if (!r) return; const d = "on" === e ? "addEventListener" : "removeEventListener"; r[d]("pointerdown", E, n), l[d]("pointermove", x, n), l[d]("pointerup", S, o) } function M() { const { scrollbar: e, el: s } = t; t.params.scrollbar = J(t, t.originalParams.scrollbar, t.params.scrollbar, { el: "swiper-scrollbar" }); const a = t.params.scrollbar; if (!a.el) return; let i, r; "string" == typeof a.el && t.isElement && (i = t.el.querySelector(a.el)), i || "string" != typeof a.el ? i || (i = a.el) : i = l.querySelectorAll(a.el), t.params.uniqueNavElements && "string" == typeof a.el && i.length > 1 && 1 === s.querySelectorAll(a.el).length && (i = s.querySelector(a.el)), i.length > 0 && (i = i[0]), i.classList.add(t.isHorizontal() ? a.horizontalClass : a.verticalClass), i && (r = i.querySelector(`.${t.params.scrollbar.dragClass}`), r || (r = f("div", t.params.scrollbar.dragClass), i.append(r))), Object.assign(e, { el: i, dragEl: r }), a.draggable && t.params.scrollbar.el && t.scrollbar.el && T("on"), i && i.classList[t.enabled ? "remove" : "add"](t.params.scrollbar.lockClass) } function C() { const e = t.params.scrollbar, s = t.scrollbar.el; s && s.classList.remove(t.isHorizontal() ? e.horizontalClass : e.verticalClass), t.params.scrollbar.el && t.scrollbar.el && T("off") } s({ scrollbar: { el: null, dragSize: "auto", hide: !1, draggable: !1, snapOnRelease: !0, lockClass: "swiper-scrollbar-lock", dragClass: "swiper-scrollbar-drag", scrollbarDisabledClass: "swiper-scrollbar-disabled", horizontalClass: "swiper-scrollbar-horizontal", verticalClass: "swiper-scrollbar-vertical" } }), t.scrollbar = { el: null, dragEl: null }, i("init", (() => { !1 === t.params.scrollbar.enabled ? P() : (M(), w(), v()) })), i("update resize observerUpdate lock unlock", (() => { w() })), i("setTranslate", (() => { v() })), i("setTransition", ((e, s) => { !function (e) { t.params.scrollbar.el && t.scrollbar.el && (t.scrollbar.dragEl.style.transitionDuration = `${e}ms`) }(s) })), i("enable disable", (() => { const { el: e } = t.scrollbar; e && e.classList[t.enabled ? "remove" : "add"](t.params.scrollbar.lockClass) })), i("destroy", (() => { C() })); const P = () => { t.el.classList.add(t.params.scrollbar.scrollbarDisabledClass), t.scrollbar.el && t.scrollbar.el.classList.add(t.params.scrollbar.scrollbarDisabledClass), C() }; Object.assign(t.scrollbar, { enable: () => { t.el.classList.remove(t.params.scrollbar.scrollbarDisabledClass), t.scrollbar.el && t.scrollbar.el.classList.remove(t.params.scrollbar.scrollbarDisabledClass), M(), w(), v() }, disable: P, updateSize: w, setTranslate: v, init: M, destroy: C }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ parallax: { enabled: !1 } }); const i = "[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]", r = (e, s) => { const { rtl: a } = t, i = a ? -1 : 1, r = e.getAttribute("data-swiper-parallax") || "0"; let n = e.getAttribute("data-swiper-parallax-x"), l = e.getAttribute("data-swiper-parallax-y"); const o = e.getAttribute("data-swiper-parallax-scale"), d = e.getAttribute("data-swiper-parallax-opacity"), c = e.getAttribute("data-swiper-parallax-rotate"); if (n || l ? (n = n || "0", l = l || "0") : t.isHorizontal() ? (n = r, l = "0") : (l = r, n = "0"), n = n.indexOf("%") >= 0 ? parseInt(n, 10) * s * i + "%" : n * s * i + "px", l = l.indexOf("%") >= 0 ? parseInt(l, 10) * s + "%" : l * s + "px", null != d) { const t = d - (d - 1) * (1 - Math.abs(s)); e.style.opacity = t } let p = `translate3d(${n}, ${l}, 0px)`; if (null != o) { p += ` scale(${o - (o - 1) * (1 - Math.abs(s))})` } if (c && null != c) { p += ` rotate(${c * s * -1}deg)` } e.style.transform = p }, n = () => { const { el: e, slides: s, progress: a, snapGrid: n, isElement: l } = t, o = h(e, i); t.isElement && o.push(...h(t.hostEl, i)), o.forEach((e => { r(e, a) })), s.forEach(((e, s) => { let l = e.progress; t.params.slidesPerGroup > 1 && "auto" !== t.params.slidesPerView && (l += Math.ceil(s / 2) - a * (n.length - 1)), l = Math.min(Math.max(l, -1), 1), e.querySelectorAll(`${i}, [data-swiper-parallax-rotate]`).forEach((e => { r(e, l) })) })) }; a("beforeInit", (() => { t.params.parallax.enabled && (t.params.watchSlidesProgress = !0, t.originalParams.watchSlidesProgress = !0) })), a("init", (() => { t.params.parallax.enabled && n() })), a("setTranslate", (() => { t.params.parallax.enabled && n() })), a("setTransition", ((e, s) => { t.params.parallax.enabled && function (e) { void 0 === e && (e = t.params.speed); const { el: s, hostEl: a } = t, r = [...s.querySelectorAll(i)]; t.isElement && r.push(...a.querySelectorAll(i)), r.forEach((t => { let s = parseInt(t.getAttribute("data-swiper-parallax-duration"), 10) || e; 0 === e && (s = 0), t.style.transitionDuration = `${s}ms` })) }(s) })) }, function (e) { let { swiper: t, extendParams: s, on: a, emit: i } = e; const n = r(); s({ zoom: { enabled: !1, maxRatio: 3, minRatio: 1, toggle: !0, containerClass: "swiper-zoom-container", zoomedSlideClass: "swiper-slide-zoomed" } }), t.zoom = { enabled: !1 }; let l, d, c = 1, p = !1; const u = [], m = { originX: 0, originY: 0, slideEl: void 0, slideWidth: void 0, slideHeight: void 0, imageEl: void 0, imageWrapEl: void 0, maxRatio: 3 }, f = { isTouched: void 0, isMoved: void 0, currentX: void 0, currentY: void 0, minX: void 0, minY: void 0, maxX: void 0, maxY: void 0, width: void 0, height: void 0, startX: void 0, startY: void 0, touchesStart: {}, touchesCurrent: {} }, v = { x: void 0, y: void 0, prevPositionX: void 0, prevPositionY: void 0, prevTime: void 0 }; let w = 1; function y() { if (u.length < 2) return 1; const e = u[0].pageX, t = u[0].pageY, s = u[1].pageX, a = u[1].pageY; return Math.sqrt((s - e) ** 2 + (a - t) ** 2) } function E(e) { const s = t.isElement ? "swiper-slide" : `.${t.params.slideClass}`; return !!e.target.matches(s) || t.slides.filter((t => t.contains(e.target))).length > 0 } function x(e) { if ("mouse" === e.pointerType && u.splice(0, u.length), !E(e)) return; const s = t.params.zoom; if (l = !1, d = !1, u.push(e), !(u.length < 2)) { if (l = !0, m.scaleStart = y(), !m.slideEl) { m.slideEl = e.target.closest(`.${t.params.slideClass}, swiper-slide`), m.slideEl || (m.slideEl = t.slides[t.activeIndex]); let a = m.slideEl.querySelector(`.${s.containerClass}`); if (a && (a = a.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]), m.imageEl = a, m.imageWrapEl = a ? b(m.imageEl, `.${s.containerClass}`)[0] : void 0, !m.imageWrapEl) return void (m.imageEl = void 0); m.maxRatio = m.imageWrapEl.getAttribute("data-swiper-zoom") || s.maxRatio } if (m.imageEl) { const [e, t] = function () { if (u.length < 2) return { x: null, y: null }; const e = m.imageEl.getBoundingClientRect(); return [(u[0].pageX + (u[1].pageX - u[0].pageX) / 2 - e.x) / c, (u[0].pageY + (u[1].pageY - u[0].pageY) / 2 - e.y) / c] }(); m.originX = e, m.originY = t, m.imageEl.style.transitionDuration = "0ms" } p = !0 } } function S(e) { if (!E(e)) return; const s = t.params.zoom, a = t.zoom, i = u.findIndex((t => t.pointerId === e.pointerId)); i >= 0 && (u[i] = e), u.length < 2 || (d = !0, m.scaleMove = y(), m.imageEl && (a.scale = m.scaleMove / m.scaleStart * c, a.scale > m.maxRatio && (a.scale = m.maxRatio - 1 + (a.scale - m.maxRatio + 1) ** .5), a.scale < s.minRatio && (a.scale = s.minRatio + 1 - (s.minRatio - a.scale + 1) ** .5), m.imageEl.style.transform = `translate3d(0,0,0) scale(${a.scale})`)) } function T(e) { if (!E(e)) return; if ("mouse" === e.pointerType && "pointerout" === e.type) return; const s = t.params.zoom, a = t.zoom, i = u.findIndex((t => t.pointerId === e.pointerId)); i >= 0 && u.splice(i, 1), l && d && (l = !1, d = !1, m.imageEl && (a.scale = Math.max(Math.min(a.scale, m.maxRatio), s.minRatio), m.imageEl.style.transitionDuration = `${t.params.speed}ms`, m.imageEl.style.transform = `translate3d(0,0,0) scale(${a.scale})`, c = a.scale, p = !1, a.scale > 1 && m.slideEl ? m.slideEl.classList.add(`${s.zoomedSlideClass}`) : a.scale <= 1 && m.slideEl && m.slideEl.classList.remove(`${s.zoomedSlideClass}`), 1 === a.scale && (m.originX = 0, m.originY = 0, m.slideEl = void 0))) } function M(e) { if (!E(e) || !function (e) { const s = `.${t.params.zoom.containerClass}`; return !!e.target.matches(s) || [...t.hostEl.querySelectorAll(s)].filter((t => t.contains(e.target))).length > 0 }(e)) return; const s = t.zoom; if (!m.imageEl) return; if (!f.isTouched || !m.slideEl) return; f.isMoved || (f.width = m.imageEl.offsetWidth, f.height = m.imageEl.offsetHeight, f.startX = o(m.imageWrapEl, "x") || 0, f.startY = o(m.imageWrapEl, "y") || 0, m.slideWidth = m.slideEl.offsetWidth, m.slideHeight = m.slideEl.offsetHeight, m.imageWrapEl.style.transitionDuration = "0ms"); const a = f.width * s.scale, i = f.height * s.scale; if (a < m.slideWidth && i < m.slideHeight) return; f.minX = Math.min(m.slideWidth / 2 - a / 2, 0), f.maxX = -f.minX, f.minY = Math.min(m.slideHeight / 2 - i / 2, 0), f.maxY = -f.minY, f.touchesCurrent.x = u.length > 0 ? u[0].pageX : e.pageX, f.touchesCurrent.y = u.length > 0 ? u[0].pageY : e.pageY; if (Math.max(Math.abs(f.touchesCurrent.x - f.touchesStart.x), Math.abs(f.touchesCurrent.y - f.touchesStart.y)) > 5 && (t.allowClick = !1), !f.isMoved && !p) { if (t.isHorizontal() && (Math.floor(f.minX) === Math.floor(f.startX) && f.touchesCurrent.x < f.touchesStart.x || Math.floor(f.maxX) === Math.floor(f.startX) && f.touchesCurrent.x > f.touchesStart.x)) return void (f.isTouched = !1); if (!t.isHorizontal() && (Math.floor(f.minY) === Math.floor(f.startY) && f.touchesCurrent.y < f.touchesStart.y || Math.floor(f.maxY) === Math.floor(f.startY) && f.touchesCurrent.y > f.touchesStart.y)) return void (f.isTouched = !1) } e.cancelable && e.preventDefault(), e.stopPropagation(), f.isMoved = !0; const r = (s.scale - c) / (m.maxRatio - t.params.zoom.minRatio), { originX: n, originY: l } = m; f.currentX = f.touchesCurrent.x - f.touchesStart.x + f.startX + r * (f.width - 2 * n), f.currentY = f.touchesCurrent.y - f.touchesStart.y + f.startY + r * (f.height - 2 * l), f.currentX < f.minX && (f.currentX = f.minX + 1 - (f.minX - f.currentX + 1) ** .8), f.currentX > f.maxX && (f.currentX = f.maxX - 1 + (f.currentX - f.maxX + 1) ** .8), f.currentY < f.minY && (f.currentY = f.minY + 1 - (f.minY - f.currentY + 1) ** .8), f.currentY > f.maxY && (f.currentY = f.maxY - 1 + (f.currentY - f.maxY + 1) ** .8), v.prevPositionX || (v.prevPositionX = f.touchesCurrent.x), v.prevPositionY || (v.prevPositionY = f.touchesCurrent.y), v.prevTime || (v.prevTime = Date.now()), v.x = (f.touchesCurrent.x - v.prevPositionX) / (Date.now() - v.prevTime) / 2, v.y = (f.touchesCurrent.y - v.prevPositionY) / (Date.now() - v.prevTime) / 2, Math.abs(f.touchesCurrent.x - v.prevPositionX) < 2 && (v.x = 0), Math.abs(f.touchesCurrent.y - v.prevPositionY) < 2 && (v.y = 0), v.prevPositionX = f.touchesCurrent.x, v.prevPositionY = f.touchesCurrent.y, v.prevTime = Date.now(), m.imageWrapEl.style.transform = `translate3d(${f.currentX}px, ${f.currentY}px,0)` } function C() { const e = t.zoom; m.slideEl && t.activeIndex !== t.slides.indexOf(m.slideEl) && (m.imageEl && (m.imageEl.style.transform = "translate3d(0,0,0) scale(1)"), m.imageWrapEl && (m.imageWrapEl.style.transform = "translate3d(0,0,0)"), m.slideEl.classList.remove(`${t.params.zoom.zoomedSlideClass}`), e.scale = 1, c = 1, m.slideEl = void 0, m.imageEl = void 0, m.imageWrapEl = void 0, m.originX = 0, m.originY = 0) } function P(e) { const s = t.zoom, a = t.params.zoom; if (!m.slideEl) { e && e.target && (m.slideEl = e.target.closest(`.${t.params.slideClass}, swiper-slide`)), m.slideEl || (t.params.virtual && t.params.virtual.enabled && t.virtual ? m.slideEl = h(t.slidesEl, `.${t.params.slideActiveClass}`)[0] : m.slideEl = t.slides[t.activeIndex]); let s = m.slideEl.querySelector(`.${a.containerClass}`); s && (s = s.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]), m.imageEl = s, m.imageWrapEl = s ? b(m.imageEl, `.${a.containerClass}`)[0] : void 0 } if (!m.imageEl || !m.imageWrapEl) return; let i, r, l, o, d, p, u, v, w, y, E, x, S, T, M, C, P, L; t.params.cssMode && (t.wrapperEl.style.overflow = "hidden", t.wrapperEl.style.touchAction = "none"), m.slideEl.classList.add(`${a.zoomedSlideClass}`), void 0 === f.touchesStart.x && e ? (i = e.pageX, r = e.pageY) : (i = f.touchesStart.x, r = f.touchesStart.y); const z = "number" == typeof e ? e : null; 1 === c && z && (i = void 0, r = void 0), s.scale = z || m.imageWrapEl.getAttribute("data-swiper-zoom") || a.maxRatio, c = z || m.imageWrapEl.getAttribute("data-swiper-zoom") || a.maxRatio, !e || 1 === c && z ? (u = 0, v = 0) : (P = m.slideEl.offsetWidth, L = m.slideEl.offsetHeight, l = g(m.slideEl).left + n.scrollX, o = g(m.slideEl).top + n.scrollY, d = l + P / 2 - i, p = o + L / 2 - r, w = m.imageEl.offsetWidth, y = m.imageEl.offsetHeight, E = w * s.scale, x = y * s.scale, S = Math.min(P / 2 - E / 2, 0), T = Math.min(L / 2 - x / 2, 0), M = -S, C = -T, u = d * s.scale, v = p * s.scale, u < S && (u = S), u > M && (u = M), v < T && (v = T), v > C && (v = C)), z && 1 === s.scale && (m.originX = 0, m.originY = 0), m.imageWrapEl.style.transitionDuration = "300ms", m.imageWrapEl.style.transform = `translate3d(${u}px, ${v}px,0)`, m.imageEl.style.transitionDuration = "300ms", m.imageEl.style.transform = `translate3d(0,0,0) scale(${s.scale})` } function L() { const e = t.zoom, s = t.params.zoom; if (!m.slideEl) { t.params.virtual && t.params.virtual.enabled && t.virtual ? m.slideEl = h(t.slidesEl, `.${t.params.slideActiveClass}`)[0] : m.slideEl = t.slides[t.activeIndex]; let e = m.slideEl.querySelector(`.${s.containerClass}`); e && (e = e.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]), m.imageEl = e, m.imageWrapEl = e ? b(m.imageEl, `.${s.containerClass}`)[0] : void 0 } m.imageEl && m.imageWrapEl && (t.params.cssMode && (t.wrapperEl.style.overflow = "", t.wrapperEl.style.touchAction = ""), e.scale = 1, c = 1, m.imageWrapEl.style.transitionDuration = "300ms", m.imageWrapEl.style.transform = "translate3d(0,0,0)", m.imageEl.style.transitionDuration = "300ms", m.imageEl.style.transform = "translate3d(0,0,0) scale(1)", m.slideEl.classList.remove(`${s.zoomedSlideClass}`), m.slideEl = void 0, m.originX = 0, m.originY = 0) } function z(e) { const s = t.zoom; s.scale && 1 !== s.scale ? L() : P(e) } function A() { return { passiveListener: !!t.params.passiveListeners && { passive: !0, capture: !1 }, activeListenerWithCapture: !t.params.passiveListeners || { passive: !1, capture: !0 } } } function $() { const e = t.zoom; if (e.enabled) return; e.enabled = !0; const { passiveListener: s, activeListenerWithCapture: a } = A(); t.wrapperEl.addEventListener("pointerdown", x, s), t.wrapperEl.addEventListener("pointermove", S, a), ["pointerup", "pointercancel", "pointerout"].forEach((e => { t.wrapperEl.addEventListener(e, T, s) })), t.wrapperEl.addEventListener("pointermove", M, a) } function I() { const e = t.zoom; if (!e.enabled) return; e.enabled = !1; const { passiveListener: s, activeListenerWithCapture: a } = A(); t.wrapperEl.removeEventListener("pointerdown", x, s), t.wrapperEl.removeEventListener("pointermove", S, a), ["pointerup", "pointercancel", "pointerout"].forEach((e => { t.wrapperEl.removeEventListener(e, T, s) })), t.wrapperEl.removeEventListener("pointermove", M, a) } Object.defineProperty(t.zoom, "scale", { get: () => w, set(e) { if (w !== e) { const t = m.imageEl, s = m.slideEl; i("zoomChange", e, t, s) } w = e } }), a("init", (() => { t.params.zoom.enabled && $() })), a("destroy", (() => { I() })), a("touchStart", ((e, s) => { t.zoom.enabled && function (e) { const s = t.device; if (!m.imageEl) return; if (f.isTouched) return; s.android && e.cancelable && e.preventDefault(), f.isTouched = !0; const a = u.length > 0 ? u[0] : e; f.touchesStart.x = a.pageX, f.touchesStart.y = a.pageY }(s) })), a("touchEnd", ((e, s) => { t.zoom.enabled && function () { const e = t.zoom; if (!m.imageEl) return; if (!f.isTouched || !f.isMoved) return f.isTouched = !1, void (f.isMoved = !1); f.isTouched = !1, f.isMoved = !1; let s = 300, a = 300; const i = v.x * s, r = f.currentX + i, n = v.y * a, l = f.currentY + n; 0 !== v.x && (s = Math.abs((r - f.currentX) / v.x)), 0 !== v.y && (a = Math.abs((l - f.currentY) / v.y)); const o = Math.max(s, a); f.currentX = r, f.currentY = l; const d = f.width * e.scale, c = f.height * e.scale; f.minX = Math.min(m.slideWidth / 2 - d / 2, 0), f.maxX = -f.minX, f.minY = Math.min(m.slideHeight / 2 - c / 2, 0), f.maxY = -f.minY, f.currentX = Math.max(Math.min(f.currentX, f.maxX), f.minX), f.currentY = Math.max(Math.min(f.currentY, f.maxY), f.minY), m.imageWrapEl.style.transitionDuration = `${o}ms`, m.imageWrapEl.style.transform = `translate3d(${f.currentX}px, ${f.currentY}px,0)` }() })), a("doubleTap", ((e, s) => { !t.animating && t.params.zoom.enabled && t.zoom.enabled && t.params.zoom.toggle && z(s) })), a("transitionEnd", (() => { t.zoom.enabled && t.params.zoom.enabled && C() })), a("slideChange", (() => { t.zoom.enabled && t.params.zoom.enabled && t.params.cssMode && C() })), Object.assign(t.zoom, { enable: $, disable: I, in: P, out: L, toggle: z }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; function i(e, t) { const s = function () { let e, t, s; return (a, i) => { for (t = -1, e = a.length; e - t > 1;)s = e + t >> 1, a[s] <= i ? t = s : e = s; return e } }(); let a, i; return this.x = e, this.y = t, this.lastIndex = e.length - 1, this.interpolate = function (e) { return e ? (i = s(this.x, e), a = i - 1, (e - this.x[a]) * (this.y[i] - this.y[a]) / (this.x[i] - this.x[a]) + this.y[a]) : 0 }, this } function r() { t.controller.control && t.controller.spline && (t.controller.spline = void 0, delete t.controller.spline) } s({ controller: { control: void 0, inverse: !1, by: "slide" } }), t.controller = { control: void 0 }, a("beforeInit", (() => { if ("undefined" != typeof window && ("string" == typeof t.params.controller.control || t.params.controller.control instanceof HTMLElement)) { const e = document.querySelector(t.params.controller.control); if (e && e.swiper) t.controller.control = e.swiper; else if (e) { const s = a => { t.controller.control = a.detail[0], t.update(), e.removeEventListener("init", s) }; e.addEventListener("init", s) } } else t.controller.control = t.params.controller.control })), a("update", (() => { r() })), a("resize", (() => { r() })), a("observerUpdate", (() => { r() })), a("setTranslate", ((e, s, a) => { t.controller.control && !t.controller.control.destroyed && t.controller.setTranslate(s, a) })), a("setTransition", ((e, s, a) => { t.controller.control && !t.controller.control.destroyed && t.controller.setTransition(s, a) })), Object.assign(t.controller, { setTranslate: function (e, s) { const a = t.controller.control; let r, n; const l = t.constructor; function o(e) { if (e.destroyed) return; const s = t.rtlTranslate ? -t.translate : t.translate; "slide" === t.params.controller.by && (!function (e) { t.controller.spline = t.params.loop ? new i(t.slidesGrid, e.slidesGrid) : new i(t.snapGrid, e.snapGrid) }(e), n = -t.controller.spline.interpolate(-s)), n && "container" !== t.params.controller.by || (r = (e.maxTranslate() - e.minTranslate()) / (t.maxTranslate() - t.minTranslate()), !Number.isNaN(r) && Number.isFinite(r) || (r = 1), n = (s - t.minTranslate()) * r + e.minTranslate()), t.params.controller.inverse && (n = e.maxTranslate() - n), e.updateProgress(n), e.setTranslate(n, t), e.updateActiveIndex(), e.updateSlidesClasses() } if (Array.isArray(a)) for (let e = 0; e < a.length; e += 1)a[e] !== s && a[e] instanceof l && o(a[e]); else a instanceof l && s !== a && o(a) }, setTransition: function (e, s) { const a = t.constructor, i = t.controller.control; let r; function l(s) { s.destroyed || (s.setTransition(e, t), 0 !== e && (s.transitionStart(), s.params.autoHeight && n((() => { s.updateAutoHeight() })), y(s.wrapperEl, (() => { i && s.transitionEnd() })))) } if (Array.isArray(i)) for (r = 0; r < i.length; r += 1)i[r] !== s && i[r] instanceof a && l(i[r]); else i instanceof a && s !== i && l(i) } }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ a11y: { enabled: !0, notificationClass: "swiper-notification", prevSlideMessage: "Previous slide", nextSlideMessage: "Next slide", firstSlideMessage: "This is the first slide", lastSlideMessage: "This is the last slide", paginationBulletMessage: "Go to slide {{index}}", slideLabelMessage: "{{index}} / {{slidesLength}}", containerMessage: null, containerRoleDescriptionMessage: null, itemRoleDescriptionMessage: null, slideRole: "group", id: null } }), t.a11y = { clicked: !1 }; let i = null; function r(e) { const t = i; 0 !== t.length && (t.innerHTML = "", t.innerHTML = e) } const n = e => (Array.isArray(e) ? e : [e]).filter((e => !!e)); function l(e) { (e = n(e)).forEach((e => { e.setAttribute("tabIndex", "0") })) } function o(e) { (e = n(e)).forEach((e => { e.setAttribute("tabIndex", "-1") })) } function d(e, t) { (e = n(e)).forEach((e => { e.setAttribute("role", t) })) } function c(e, t) { (e = n(e)).forEach((e => { e.setAttribute("aria-roledescription", t) })) } function p(e, t) { (e = n(e)).forEach((e => { e.setAttribute("aria-label", t) })) } function u(e) { (e = n(e)).forEach((e => { e.setAttribute("aria-disabled", !0) })) } function m(e) { (e = n(e)).forEach((e => { e.setAttribute("aria-disabled", !1) })) } function h(e) { if (13 !== e.keyCode && 32 !== e.keyCode) return; const s = t.params.a11y, a = e.target; t.pagination && t.pagination.el && (a === t.pagination.el || t.pagination.el.contains(e.target)) && !e.target.matches(ee(t.params.pagination.bulletClass)) || (t.navigation && t.navigation.nextEl && a === t.navigation.nextEl && (t.isEnd && !t.params.loop || t.slideNext(), t.isEnd ? r(s.lastSlideMessage) : r(s.nextSlideMessage)), t.navigation && t.navigation.prevEl && a === t.navigation.prevEl && (t.isBeginning && !t.params.loop || t.slidePrev(), t.isBeginning ? r(s.firstSlideMessage) : r(s.prevSlideMessage)), t.pagination && a.matches(ee(t.params.pagination.bulletClass)) && a.click()) } function g() { return t.pagination && t.pagination.bullets && t.pagination.bullets.length } function v() { return g() && t.params.pagination.clickable } const b = (e, t, s) => { l(e), "BUTTON" !== e.tagName && (d(e, "button"), e.addEventListener("keydown", h)), p(e, s), function (e, t) { (e = n(e)).forEach((e => { e.setAttribute("aria-controls", t) })) }(e, t) }, y = () => { t.a11y.clicked = !0 }, E = () => { requestAnimationFrame((() => { requestAnimationFrame((() => { t.destroyed || (t.a11y.clicked = !1) })) })) }, x = e => { if (t.a11y.clicked) return; const s = e.target.closest(`.${t.params.slideClass}, swiper-slide`); if (!s || !t.slides.includes(s)) return; const a = t.slides.indexOf(s) === t.activeIndex, i = t.params.watchSlidesProgress && t.visibleSlides && t.visibleSlides.includes(s); a || i || e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents || (t.isHorizontal() ? t.el.scrollLeft = 0 : t.el.scrollTop = 0, t.slideTo(t.slides.indexOf(s), 0)) }, S = () => { const e = t.params.a11y; e.itemRoleDescriptionMessage && c(t.slides, e.itemRoleDescriptionMessage), e.slideRole && d(t.slides, e.slideRole); const s = t.slides.length; e.slideLabelMessage && t.slides.forEach(((a, i) => { const r = t.params.loop ? parseInt(a.getAttribute("data-swiper-slide-index"), 10) : i; p(a, e.slideLabelMessage.replace(/\{\{index\}\}/, r + 1).replace(/\{\{slidesLength\}\}/, s)) })) }, T = () => { const e = t.params.a11y; t.el.append(i); const s = t.el; e.containerRoleDescriptionMessage && c(s, e.containerRoleDescriptionMessage), e.containerMessage && p(s, e.containerMessage); const a = t.wrapperEl, r = e.id || a.getAttribute("id") || `swiper-wrapper-${l = 16, void 0 === l && (l = 16), "x".repeat(l).replace(/x/g, (() => Math.round(16 * Math.random()).toString(16)))}`; var l; const o = t.params.autoplay && t.params.autoplay.enabled ? "off" : "polite"; var d; d = r, n(a).forEach((e => { e.setAttribute("id", d) })), function (e, t) { (e = n(e)).forEach((e => { e.setAttribute("aria-live", t) })) }(a, o), S(); let { nextEl: u, prevEl: m } = t.navigation ? t.navigation : {}; if (u = n(u), m = n(m), u && u.forEach((t => b(t, r, e.nextSlideMessage))), m && m.forEach((t => b(t, r, e.prevSlideMessage))), v()) { (Array.isArray(t.pagination.el) ? t.pagination.el : [t.pagination.el]).forEach((e => { e.addEventListener("keydown", h) })) } t.el.addEventListener("focus", x, !0), t.el.addEventListener("pointerdown", y, !0), t.el.addEventListener("pointerup", E, !0) }; a("beforeInit", (() => { i = f("span", t.params.a11y.notificationClass), i.setAttribute("aria-live", "assertive"), i.setAttribute("aria-atomic", "true") })), a("afterInit", (() => { t.params.a11y.enabled && T() })), a("slidesLengthChange snapGridLengthChange slidesGridLengthChange", (() => { t.params.a11y.enabled && S() })), a("fromEdge toEdge afterInit lock unlock", (() => { t.params.a11y.enabled && function () { if (t.params.loop || t.params.rewind || !t.navigation) return; const { nextEl: e, prevEl: s } = t.navigation; s && (t.isBeginning ? (u(s), o(s)) : (m(s), l(s))), e && (t.isEnd ? (u(e), o(e)) : (m(e), l(e))) }() })), a("paginationUpdate", (() => { t.params.a11y.enabled && function () { const e = t.params.a11y; g() && t.pagination.bullets.forEach((s => { t.params.pagination.clickable && (l(s), t.params.pagination.renderBullet || (d(s, "button"), p(s, e.paginationBulletMessage.replace(/\{\{index\}\}/, w(s) + 1)))), s.matches(ee(t.params.pagination.bulletActiveClass)) ? s.setAttribute("aria-current", "true") : s.removeAttribute("aria-current") })) }() })), a("destroy", (() => { t.params.a11y.enabled && function () { i && i.remove(); let { nextEl: e, prevEl: s } = t.navigation ? t.navigation : {}; e = n(e), s = n(s), e && e.forEach((e => e.removeEventListener("keydown", h))), s && s.forEach((e => e.removeEventListener("keydown", h))), v() && (Array.isArray(t.pagination.el) ? t.pagination.el : [t.pagination.el]).forEach((e => { e.removeEventListener("keydown", h) })); t.el.removeEventListener("focus", x, !0), t.el.removeEventListener("pointerdown", y, !0), t.el.removeEventListener("pointerup", E, !0) }() })) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ history: { enabled: !1, root: "", replaceState: !1, key: "slides", keepQuery: !1 } }); let i = !1, n = {}; const l = e => e.toString().replace(/\s+/g, "-").replace(/[^\w-]+/g, "").replace(/--+/g, "-").replace(/^-+/, "").replace(/-+$/, ""), o = e => { const t = r(); let s; s = e ? new URL(e) : t.location; const a = s.pathname.slice(1).split("/").filter((e => "" !== e)), i = a.length; return { key: a[i - 2], value: a[i - 1] } }, d = (e, s) => { const a = r(); if (!i || !t.params.history.enabled) return; let n; n = t.params.url ? new URL(t.params.url) : a.location; const o = t.slides[s]; let d = l(o.getAttribute("data-history")); if (t.params.history.root.length > 0) { let s = t.params.history.root; "/" === s[s.length - 1] && (s = s.slice(0, s.length - 1)), d = `${s}/${e ? `${e}/` : ""}${d}` } else n.pathname.includes(e) || (d = `${e ? `${e}/` : ""}${d}`); t.params.history.keepQuery && (d += n.search); const c = a.history.state; c && c.value === d || (t.params.history.replaceState ? a.history.replaceState({ value: d }, null, d) : a.history.pushState({ value: d }, null, d)) }, c = (e, s, a) => { if (s) for (let i = 0, r = t.slides.length; i < r; i += 1) { const r = t.slides[i]; if (l(r.getAttribute("data-history")) === s) { const s = t.getSlideIndex(r); t.slideTo(s, e, a) } } else t.slideTo(0, e, a) }, p = () => { n = o(t.params.url), c(t.params.speed, n.value, !1) }; a("init", (() => { t.params.history.enabled && (() => { const e = r(); if (t.params.history) { if (!e.history || !e.history.pushState) return t.params.history.enabled = !1, void (t.params.hashNavigation.enabled = !0); i = !0, n = o(t.params.url), n.key || n.value ? (c(0, n.value, t.params.runCallbacksOnInit), t.params.history.replaceState || e.addEventListener("popstate", p)) : t.params.history.replaceState || e.addEventListener("popstate", p) } })() })), a("destroy", (() => { t.params.history.enabled && (() => { const e = r(); t.params.history.replaceState || e.removeEventListener("popstate", p) })() })), a("transitionEnd _freeModeNoMomentumRelease", (() => { i && d(t.params.history.key, t.activeIndex) })), a("slideChange", (() => { i && t.params.cssMode && d(t.params.history.key, t.activeIndex) })) }, function (e) { let { swiper: t, extendParams: s, emit: i, on: n } = e, l = !1; const o = a(), d = r(); s({ hashNavigation: { enabled: !1, replaceState: !1, watchState: !1, getSlideIndex(e, s) { if (t.virtual && t.params.virtual.enabled) { const e = t.slides.filter((e => e.getAttribute("data-hash") === s))[0]; if (!e) return 0; return parseInt(e.getAttribute("data-swiper-slide-index"), 10) } return t.getSlideIndex(h(t.slidesEl, `.${t.params.slideClass}[data-hash="${s}"], swiper-slide[data-hash="${s}"]`)[0]) } } }); const c = () => { i("hashChange"); const e = o.location.hash.replace("#", ""), s = t.virtual && t.params.virtual.enabled ? t.slidesEl.querySelector(`[data-swiper-slide-index="${t.activeIndex}"]`) : t.slides[t.activeIndex]; if (e !== (s ? s.getAttribute("data-hash") : "")) { const s = t.params.hashNavigation.getSlideIndex(t, e); if (void 0 === s || Number.isNaN(s)) return; t.slideTo(s) } }, p = () => { if (!l || !t.params.hashNavigation.enabled) return; const e = t.virtual && t.params.virtual.enabled ? t.slidesEl.querySelector(`[data-swiper-slide-index="${t.activeIndex}"]`) : t.slides[t.activeIndex], s = e ? e.getAttribute("data-hash") || e.getAttribute("data-history") : ""; t.params.hashNavigation.replaceState && d.history && d.history.replaceState ? (d.history.replaceState(null, null, `#${s}` || ""), i("hashSet")) : (o.location.hash = s || "", i("hashSet")) }; n("init", (() => { t.params.hashNavigation.enabled && (() => { if (!t.params.hashNavigation.enabled || t.params.history && t.params.history.enabled) return; l = !0; const e = o.location.hash.replace("#", ""); if (e) { const s = 0, a = t.params.hashNavigation.getSlideIndex(t, e); t.slideTo(a || 0, s, t.params.runCallbacksOnInit, !0) } t.params.hashNavigation.watchState && d.addEventListener("hashchange", c) })() })), n("destroy", (() => { t.params.hashNavigation.enabled && t.params.hashNavigation.watchState && d.removeEventListener("hashchange", c) })), n("transitionEnd _freeModeNoMomentumRelease", (() => { l && p() })), n("slideChange", (() => { l && t.params.cssMode && p() })) }, function (e) { let t, s, { swiper: i, extendParams: r, on: n, emit: l, params: o } = e; i.autoplay = { running: !1, paused: !1, timeLeft: 0 }, r({ autoplay: { enabled: !1, delay: 3e3, waitForTransition: !0, disableOnInteraction: !0, stopOnLastSlide: !1, reverseDirection: !1, pauseOnMouseEnter: !1 } }); let d, c, p, u, m, h, f, g = o && o.autoplay ? o.autoplay.delay : 3e3, v = o && o.autoplay ? o.autoplay.delay : 3e3, w = (new Date).getTime; function b(e) { i && !i.destroyed && i.wrapperEl && e.target === i.wrapperEl && (i.wrapperEl.removeEventListener("transitionend", b), M()) } const y = () => { if (i.destroyed || !i.autoplay.running) return; i.autoplay.paused ? c = !0 : c && (v = d, c = !1); const e = i.autoplay.paused ? d : w + v - (new Date).getTime(); i.autoplay.timeLeft = e, l("autoplayTimeLeft", e, e / g), s = requestAnimationFrame((() => { y() })) }, E = e => { if (i.destroyed || !i.autoplay.running) return; cancelAnimationFrame(s), y(); let a = void 0 === e ? i.params.autoplay.delay : e; g = i.params.autoplay.delay, v = i.params.autoplay.delay; const r = (() => { let e; if (e = i.virtual && i.params.virtual.enabled ? i.slides.filter((e => e.classList.contains("swiper-slide-active")))[0] : i.slides[i.activeIndex], !e) return; return parseInt(e.getAttribute("data-swiper-autoplay"), 10) })(); !Number.isNaN(r) && r > 0 && void 0 === e && (a = r, g = r, v = r), d = a; const n = i.params.speed, o = () => { i && !i.destroyed && (i.params.autoplay.reverseDirection ? !i.isBeginning || i.params.loop || i.params.rewind ? (i.slidePrev(n, !0, !0), l("autoplay")) : i.params.autoplay.stopOnLastSlide || (i.slideTo(i.slides.length - 1, n, !0, !0), l("autoplay")) : !i.isEnd || i.params.loop || i.params.rewind ? (i.slideNext(n, !0, !0), l("autoplay")) : i.params.autoplay.stopOnLastSlide || (i.slideTo(0, n, !0, !0), l("autoplay")), i.params.cssMode && (w = (new Date).getTime(), requestAnimationFrame((() => { E() })))) }; return a > 0 ? (clearTimeout(t), t = setTimeout((() => { o() }), a)) : requestAnimationFrame((() => { o() })), a }, x = () => { i.autoplay.running = !0, E(), l("autoplayStart") }, S = () => { i.autoplay.running = !1, clearTimeout(t), cancelAnimationFrame(s), l("autoplayStop") }, T = (e, s) => { if (i.destroyed || !i.autoplay.running) return; clearTimeout(t), e || (f = !0); const a = () => { l("autoplayPause"), i.params.autoplay.waitForTransition ? i.wrapperEl.addEventListener("transitionend", b) : M() }; if (i.autoplay.paused = !0, s) return h && (d = i.params.autoplay.delay), h = !1, void a(); const r = d || i.params.autoplay.delay; d = r - ((new Date).getTime() - w), i.isEnd && d < 0 && !i.params.loop || (d < 0 && (d = 0), a()) }, M = () => { i.isEnd && d < 0 && !i.params.loop || i.destroyed || !i.autoplay.running || (w = (new Date).getTime(), f ? (f = !1, E(d)) : E(), i.autoplay.paused = !1, l("autoplayResume")) }, C = () => { if (i.destroyed || !i.autoplay.running) return; const e = a(); "hidden" === e.visibilityState && (f = !0, T(!0)), "visible" === e.visibilityState && M() }, P = e => { "mouse" === e.pointerType && (f = !0, i.animating || i.autoplay.paused || T(!0)) }, L = e => { "mouse" === e.pointerType && i.autoplay.paused && M() }; n("init", (() => { i.params.autoplay.enabled && (i.params.autoplay.pauseOnMouseEnter && (i.el.addEventListener("pointerenter", P), i.el.addEventListener("pointerleave", L)), a().addEventListener("visibilitychange", C), w = (new Date).getTime(), x()) })), n("destroy", (() => { i.el.removeEventListener("pointerenter", P), i.el.removeEventListener("pointerleave", L), a().removeEventListener("visibilitychange", C), i.autoplay.running && S() })), n("beforeTransitionStart", ((e, t, s) => { !i.destroyed && i.autoplay.running && (s || !i.params.autoplay.disableOnInteraction ? T(!0, !0) : S()) })), n("sliderFirstMove", (() => { !i.destroyed && i.autoplay.running && (i.params.autoplay.disableOnInteraction ? S() : (p = !0, u = !1, f = !1, m = setTimeout((() => { f = !0, u = !0, T(!0) }), 200))) })), n("touchEnd", (() => { if (!i.destroyed && i.autoplay.running && p) { if (clearTimeout(m), clearTimeout(t), i.params.autoplay.disableOnInteraction) return u = !1, void (p = !1); u && i.params.cssMode && M(), u = !1, p = !1 } })), n("slideChange", (() => { !i.destroyed && i.autoplay.running && (h = !0) })), Object.assign(i.autoplay, { start: x, stop: S, pause: T, resume: M }) }, function (e) { let { swiper: t, extendParams: s, on: i } = e; s({ thumbs: { swiper: null, multipleActiveThumbs: !0, autoScrollOffset: 0, slideThumbActiveClass: "swiper-slide-thumb-active", thumbsContainerClass: "swiper-thumbs" } }); let r = !1, n = !1; function l() { const e = t.thumbs.swiper; if (!e || e.destroyed) return; const s = e.clickedIndex, a = e.clickedSlide; if (a && a.classList.contains(t.params.thumbs.slideThumbActiveClass)) return; if (null == s) return; let i; i = e.params.loop ? parseInt(e.clickedSlide.getAttribute("data-swiper-slide-index"), 10) : s, t.params.loop ? t.slideToLoop(i) : t.slideTo(i) } function o() { const { thumbs: e } = t.params; if (r) return !1; r = !0; const s = t.constructor; if (e.swiper instanceof s) t.thumbs.swiper = e.swiper, Object.assign(t.thumbs.swiper.originalParams, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), Object.assign(t.thumbs.swiper.params, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), t.thumbs.swiper.update(); else if (d(e.swiper)) { const a = Object.assign({}, e.swiper); Object.assign(a, { watchSlidesProgress: !0, slideToClickedSlide: !1 }), t.thumbs.swiper = new s(a), n = !0 } return t.thumbs.swiper.el.classList.add(t.params.thumbs.thumbsContainerClass), t.thumbs.swiper.on("tap", l), !0 } function c(e) { const s = t.thumbs.swiper; if (!s || s.destroyed) return; const a = "auto" === s.params.slidesPerView ? s.slidesPerViewDynamic() : s.params.slidesPerView; let i = 1; const r = t.params.thumbs.slideThumbActiveClass; if (t.params.slidesPerView > 1 && !t.params.centeredSlides && (i = t.params.slidesPerView), t.params.thumbs.multipleActiveThumbs || (i = 1), i = Math.floor(i), s.slides.forEach((e => e.classList.remove(r))), s.params.loop || s.params.virtual && s.params.virtual.enabled) for (let e = 0; e < i; e += 1)h(s.slidesEl, `[data-swiper-slide-index="${t.realIndex + e}"]`).forEach((e => { e.classList.add(r) })); else for (let e = 0; e < i; e += 1)s.slides[t.realIndex + e] && s.slides[t.realIndex + e].classList.add(r); const n = t.params.thumbs.autoScrollOffset, l = n && !s.params.loop; if (t.realIndex !== s.realIndex || l) { const i = s.activeIndex; let r, o; if (s.params.loop) { const e = s.slides.filter((e => e.getAttribute("data-swiper-slide-index") === `${t.realIndex}`))[0]; r = s.slides.indexOf(e), o = t.activeIndex > t.previousIndex ? "next" : "prev" } else r = t.realIndex, o = r > t.previousIndex ? "next" : "prev"; l && (r += "next" === o ? n : -1 * n), s.visibleSlidesIndexes && s.visibleSlidesIndexes.indexOf(r) < 0 && (s.params.centeredSlides ? r = r > i ? r - Math.floor(a / 2) + 1 : r + Math.floor(a / 2) - 1 : r > i && s.params.slidesPerGroup, s.slideTo(r, e ? 0 : void 0)) } } t.thumbs = { swiper: null }, i("beforeInit", (() => { const { thumbs: e } = t.params; if (e && e.swiper) if ("string" == typeof e.swiper || e.swiper instanceof HTMLElement) { const s = a(), i = () => { const a = "string" == typeof e.swiper ? s.querySelector(e.swiper) : e.swiper; if (a && a.swiper) e.swiper = a.swiper, o(), c(!0); else if (a) { const s = i => { e.swiper = i.detail[0], a.removeEventListener("init", s), o(), c(!0), e.swiper.update(), t.update() }; a.addEventListener("init", s) } return a }, r = () => { if (t.destroyed) return; i() || requestAnimationFrame(r) }; requestAnimationFrame(r) } else o(), c(!0) })), i("slideChange update resize observerUpdate", (() => { c() })), i("setTransition", ((e, s) => { const a = t.thumbs.swiper; a && !a.destroyed && a.setTransition(s) })), i("beforeDestroy", (() => { const e = t.thumbs.swiper; e && !e.destroyed && n && e.destroy() })), Object.assign(t.thumbs, { init: o, update: c }) }, function (e) { let { swiper: t, extendParams: s, emit: a, once: i } = e; s({ freeMode: { enabled: !1, momentum: !0, momentumRatio: 1, momentumBounce: !0, momentumBounceRatio: 1, momentumVelocityRatio: 1, sticky: !1, minimumVelocity: .02 } }), Object.assign(t, { freeMode: { onTouchStart: function () { if (t.params.cssMode) return; const e = t.getTranslate(); t.setTranslate(e), t.setTransition(0), t.touchEventsData.velocities.length = 0, t.freeMode.onTouchEnd({ currentPos: t.rtl ? t.translate : -t.translate }) }, onTouchMove: function () { if (t.params.cssMode) return; const { touchEventsData: e, touches: s } = t; 0 === e.velocities.length && e.velocities.push({ position: s[t.isHorizontal() ? "startX" : "startY"], time: e.touchStartTime }), e.velocities.push({ position: s[t.isHorizontal() ? "currentX" : "currentY"], time: l() }) }, onTouchEnd: function (e) { let { currentPos: s } = e; if (t.params.cssMode) return; const { params: r, wrapperEl: n, rtlTranslate: o, snapGrid: d, touchEventsData: c } = t, p = l() - c.touchStartTime; if (s < -t.minTranslate()) t.slideTo(t.activeIndex); else if (s > -t.maxTranslate()) t.slides.length < d.length ? t.slideTo(d.length - 1) : t.slideTo(t.slides.length - 1); else { if (r.freeMode.momentum) { if (c.velocities.length > 1) { const e = c.velocities.pop(), s = c.velocities.pop(), a = e.position - s.position, i = e.time - s.time; t.velocity = a / i, t.velocity /= 2, Math.abs(t.velocity) < r.freeMode.minimumVelocity && (t.velocity = 0), (i > 150 || l() - e.time > 300) && (t.velocity = 0) } else t.velocity = 0; t.velocity *= r.freeMode.momentumVelocityRatio, c.velocities.length = 0; let e = 1e3 * r.freeMode.momentumRatio; const s = t.velocity * e; let p = t.translate + s; o && (p = -p); let u, m = !1; const h = 20 * Math.abs(t.velocity) * r.freeMode.momentumBounceRatio; let f; if (p < t.maxTranslate()) r.freeMode.momentumBounce ? (p + t.maxTranslate() < -h && (p = t.maxTranslate() - h), u = t.maxTranslate(), m = !0, c.allowMomentumBounce = !0) : p = t.maxTranslate(), r.loop && r.centeredSlides && (f = !0); else if (p > t.minTranslate()) r.freeMode.momentumBounce ? (p - t.minTranslate() > h && (p = t.minTranslate() + h), u = t.minTranslate(), m = !0, c.allowMomentumBounce = !0) : p = t.minTranslate(), r.loop && r.centeredSlides && (f = !0); else if (r.freeMode.sticky) { let e; for (let t = 0; t < d.length; t += 1)if (d[t] > -p) { e = t; break } p = Math.abs(d[e] - p) < Math.abs(d[e - 1] - p) || "next" === t.swipeDirection ? d[e] : d[e - 1], p = -p } if (f && i("transitionEnd", (() => { t.loopFix() })), 0 !== t.velocity) { if (e = o ? Math.abs((-p - t.translate) / t.velocity) : Math.abs((p - t.translate) / t.velocity), r.freeMode.sticky) { const s = Math.abs((o ? -p : p) - t.translate), a = t.slidesSizesGrid[t.activeIndex]; e = s < a ? r.speed : s < 2 * a ? 1.5 * r.speed : 2.5 * r.speed } } else if (r.freeMode.sticky) return void t.slideToClosest(); r.freeMode.momentumBounce && m ? (t.updateProgress(u), t.setTransition(e), t.setTranslate(p), t.transitionStart(!0, t.swipeDirection), t.animating = !0, y(n, (() => { t && !t.destroyed && c.allowMomentumBounce && (a("momentumBounce"), t.setTransition(r.speed), setTimeout((() => { t.setTranslate(u), y(n, (() => { t && !t.destroyed && t.transitionEnd() })) }), 0)) }))) : t.velocity ? (a("_freeModeNoMomentumRelease"), t.updateProgress(p), t.setTransition(e), t.setTranslate(p), t.transitionStart(!0, t.swipeDirection), t.animating || (t.animating = !0, y(n, (() => { t && !t.destroyed && t.transitionEnd() })))) : t.updateProgress(p), t.updateActiveIndex(), t.updateSlidesClasses() } else { if (r.freeMode.sticky) return void t.slideToClosest(); r.freeMode && a("_freeModeNoMomentumRelease") } (!r.freeMode.momentum || p >= r.longSwipesMs) && (t.updateProgress(), t.updateActiveIndex(), t.updateSlidesClasses()) } } } }) }, function (e) { let t, s, a, { swiper: i, extendParams: r } = e; r({ grid: { rows: 1, fill: "column" } }); const n = () => { let e = i.params.spaceBetween; return "string" == typeof e && e.indexOf("%") >= 0 ? e = parseFloat(e.replace("%", "")) / 100 * i.size : "string" == typeof e && (e = parseFloat(e)), e }; i.grid = { initSlides: e => { const { slidesPerView: r } = i.params, { rows: n, fill: l } = i.params.grid; a = Math.floor(e / n), t = Math.floor(e / n) === e / n ? e : Math.ceil(e / n) * n, "auto" !== r && "row" === l && (t = Math.max(t, r * n)), s = t / n }, updateSlide: (e, r, l, o) => { const { slidesPerGroup: d } = i.params, c = n(), { rows: p, fill: u } = i.params.grid; let m, h, f; if ("row" === u && d > 1) { const s = Math.floor(e / (d * p)), a = e - p * d * s, i = 0 === s ? d : Math.min(Math.ceil((l - s * p * d) / p), d); f = Math.floor(a / i), h = a - f * i + s * d, m = h + f * t / p, r.style.order = m } else "column" === u ? (h = Math.floor(e / p), f = e - h * p, (h > a || h === a && f === p - 1) && (f += 1, f >= p && (f = 0, h += 1))) : (f = Math.floor(e / s), h = e - f * s); r.row = f, r.column = h, r.style[o("margin-top")] = 0 !== f ? c && `${c}px` : "" }, updateWrapperSize: (e, s, a) => { const { centeredSlides: r, roundLengths: l } = i.params, o = n(), { rows: d } = i.params.grid; if (i.virtualSize = (e + o) * t, i.virtualSize = Math.ceil(i.virtualSize / d) - o, i.wrapperEl.style[a("width")] = `${i.virtualSize + o}px`, r) { const e = []; for (let t = 0; t < s.length; t += 1) { let a = s[t]; l && (a = Math.floor(a)), s[t] < i.virtualSize + s[0] && e.push(a) } s.splice(0, s.length), s.push(...e) } } } }, function (e) { let { swiper: t } = e; Object.assign(t, { appendSlide: te.bind(t), prependSlide: se.bind(t), addSlide: ae.bind(t), removeSlide: ie.bind(t), removeAllSlides: re.bind(t) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ fadeEffect: { crossFade: !1 } }), ne({ effect: "fade", swiper: t, on: a, setTranslate: () => { const { slides: e } = t; t.params.fadeEffect; for (let s = 0; s < e.length; s += 1) { const e = t.slides[s]; let a = -e.swiperSlideOffset; t.params.virtualTranslate || (a -= t.translate); let i = 0; t.isHorizontal() || (i = a, a = 0); const r = t.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(e.progress), 0) : 1 + Math.min(Math.max(e.progress, -1), 0), n = le(0, e); n.style.opacity = r, n.style.transform = `translate3d(${a}px, ${i}px, 0px)` } }, setTransition: e => { const s = t.slides.map((e => m(e))); s.forEach((t => { t.style.transitionDuration = `${e}ms` })), oe({ swiper: t, duration: e, transformElements: s, allSlides: !0 }) }, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ cubeEffect: { slideShadows: !0, shadow: !0, shadowOffset: 20, shadowScale: .94 } }); const i = (e, t, s) => { let a = s ? e.querySelector(".swiper-slide-shadow-left") : e.querySelector(".swiper-slide-shadow-top"), i = s ? e.querySelector(".swiper-slide-shadow-right") : e.querySelector(".swiper-slide-shadow-bottom"); a || (a = f("div", ("swiper-slide-shadow-cube swiper-slide-shadow-" + (s ? "left" : "top")).split(" ")), e.append(a)), i || (i = f("div", ("swiper-slide-shadow-cube swiper-slide-shadow-" + (s ? "right" : "bottom")).split(" ")), e.append(i)), a && (a.style.opacity = Math.max(-t, 0)), i && (i.style.opacity = Math.max(t, 0)) }; ne({ effect: "cube", swiper: t, on: a, setTranslate: () => { const { el: e, wrapperEl: s, slides: a, width: r, height: n, rtlTranslate: l, size: o, browser: d } = t, c = t.params.cubeEffect, p = t.isHorizontal(), u = t.virtual && t.params.virtual.enabled; let m, h = 0; c.shadow && (p ? (m = t.wrapperEl.querySelector(".swiper-cube-shadow"), m || (m = f("div", "swiper-cube-shadow"), t.wrapperEl.append(m)), m.style.height = `${r}px`) : (m = e.querySelector(".swiper-cube-shadow"), m || (m = f("div", "swiper-cube-shadow"), e.append(m)))); for (let e = 0; e < a.length; e += 1) { const t = a[e]; let s = e; u && (s = parseInt(t.getAttribute("data-swiper-slide-index"), 10)); let r = 90 * s, n = Math.floor(r / 360); l && (r = -r, n = Math.floor(-r / 360)); const d = Math.max(Math.min(t.progress, 1), -1); let m = 0, f = 0, g = 0; s % 4 == 0 ? (m = 4 * -n * o, g = 0) : (s - 1) % 4 == 0 ? (m = 0, g = 4 * -n * o) : (s - 2) % 4 == 0 ? (m = o + 4 * n * o, g = o) : (s - 3) % 4 == 0 && (m = -o, g = 3 * o + 4 * o * n), l && (m = -m), p || (f = m, m = 0); const v = `rotateX(${p ? 0 : -r}deg) rotateY(${p ? r : 0}deg) translate3d(${m}px, ${f}px, ${g}px)`; d <= 1 && d > -1 && (h = 90 * s + 90 * d, l && (h = 90 * -s - 90 * d)), t.style.transform = v, c.slideShadows && i(t, d, p) } if (s.style.transformOrigin = `50% 50% -${o / 2}px`, s.style["-webkit-transform-origin"] = `50% 50% -${o / 2}px`, c.shadow) if (p) m.style.transform = `translate3d(0px, ${r / 2 + c.shadowOffset}px, ${-r / 2}px) rotateX(90deg) rotateZ(0deg) scale(${c.shadowScale})`; else { const e = Math.abs(h) - 90 * Math.floor(Math.abs(h) / 90), t = 1.5 - (Math.sin(2 * e * Math.PI / 360) / 2 + Math.cos(2 * e * Math.PI / 360) / 2), s = c.shadowScale, a = c.shadowScale / t, i = c.shadowOffset; m.style.transform = `scale3d(${s}, 1, ${a}) translate3d(0px, ${n / 2 + i}px, ${-n / 2 / a}px) rotateX(-90deg)` } const g = (d.isSafari || d.isWebView) && d.needPerspectiveFix ? -o / 2 : 0; s.style.transform = `translate3d(0px,0,${g}px) rotateX(${t.isHorizontal() ? 0 : h}deg) rotateY(${t.isHorizontal() ? -h : 0}deg)`, s.style.setProperty("--swiper-cube-translate-z", `${g}px`) }, setTransition: e => { const { el: s, slides: a } = t; if (a.forEach((t => { t.style.transitionDuration = `${e}ms`, t.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((t => { t.style.transitionDuration = `${e}ms` })) })), t.params.cubeEffect.shadow && !t.isHorizontal()) { const t = s.querySelector(".swiper-cube-shadow"); t && (t.style.transitionDuration = `${e}ms`) } }, recreateShadows: () => { const e = t.isHorizontal(); t.slides.forEach((t => { const s = Math.max(Math.min(t.progress, 1), -1); i(t, s, e) })) }, getEffectParams: () => t.params.cubeEffect, perspective: () => !0, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, resistanceRatio: 0, spaceBetween: 0, centeredSlides: !1, virtualTranslate: !0 }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ flipEffect: { slideShadows: !0, limitRotation: !0 } }); const i = (e, s) => { let a = t.isHorizontal() ? e.querySelector(".swiper-slide-shadow-left") : e.querySelector(".swiper-slide-shadow-top"), i = t.isHorizontal() ? e.querySelector(".swiper-slide-shadow-right") : e.querySelector(".swiper-slide-shadow-bottom"); a || (a = de("flip", e, t.isHorizontal() ? "left" : "top")), i || (i = de("flip", e, t.isHorizontal() ? "right" : "bottom")), a && (a.style.opacity = Math.max(-s, 0)), i && (i.style.opacity = Math.max(s, 0)) }; ne({ effect: "flip", swiper: t, on: a, setTranslate: () => { const { slides: e, rtlTranslate: s } = t, a = t.params.flipEffect; for (let r = 0; r < e.length; r += 1) { const n = e[r]; let l = n.progress; t.params.flipEffect.limitRotation && (l = Math.max(Math.min(n.progress, 1), -1)); const o = n.swiperSlideOffset; let d = -180 * l, c = 0, p = t.params.cssMode ? -o - t.translate : -o, u = 0; t.isHorizontal() ? s && (d = -d) : (u = p, p = 0, c = -d, d = 0), n.style.zIndex = -Math.abs(Math.round(l)) + e.length, a.slideShadows && i(n, l); const m = `translate3d(${p}px, ${u}px, 0px) rotateX(${c}deg) rotateY(${d}deg)`; le(0, n).style.transform = m } }, setTransition: e => { const s = t.slides.map((e => m(e))); s.forEach((t => { t.style.transitionDuration = `${e}ms`, t.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((t => { t.style.transitionDuration = `${e}ms` })) })), oe({ swiper: t, duration: e, transformElements: s }) }, recreateShadows: () => { t.params.flipEffect, t.slides.forEach((e => { let s = e.progress; t.params.flipEffect.limitRotation && (s = Math.max(Math.min(e.progress, 1), -1)), i(e, s) })) }, getEffectParams: () => t.params.flipEffect, perspective: () => !0, overwriteParams: () => ({ slidesPerView: 1, slidesPerGroup: 1, watchSlidesProgress: !0, spaceBetween: 0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ coverflowEffect: { rotate: 50, stretch: 0, depth: 100, scale: 1, modifier: 1, slideShadows: !0 } }), ne({ effect: "coverflow", swiper: t, on: a, setTranslate: () => { const { width: e, height: s, slides: a, slidesSizesGrid: i } = t, r = t.params.coverflowEffect, n = t.isHorizontal(), l = t.translate, o = n ? e / 2 - l : s / 2 - l, d = n ? r.rotate : -r.rotate, c = r.depth; for (let e = 0, t = a.length; e < t; e += 1) { const t = a[e], s = i[e], l = (o - t.swiperSlideOffset - s / 2) / s, p = "function" == typeof r.modifier ? r.modifier(l) : l * r.modifier; let u = n ? d * p : 0, m = n ? 0 : d * p, h = -c * Math.abs(p), f = r.stretch; "string" == typeof f && -1 !== f.indexOf("%") && (f = parseFloat(r.stretch) / 100 * s); let g = n ? 0 : f * p, v = n ? f * p : 0, w = 1 - (1 - r.scale) * Math.abs(p); Math.abs(v) < .001 && (v = 0), Math.abs(g) < .001 && (g = 0), Math.abs(h) < .001 && (h = 0), Math.abs(u) < .001 && (u = 0), Math.abs(m) < .001 && (m = 0), Math.abs(w) < .001 && (w = 0); const b = `translate3d(${v}px,${g}px,${h}px) rotateX(${m}deg) rotateY(${u}deg) scale(${w})`; if (le(0, t).style.transform = b, t.style.zIndex = 1 - Math.abs(Math.round(p)), r.slideShadows) { let e = n ? t.querySelector(".swiper-slide-shadow-left") : t.querySelector(".swiper-slide-shadow-top"), s = n ? t.querySelector(".swiper-slide-shadow-right") : t.querySelector(".swiper-slide-shadow-bottom"); e || (e = de("coverflow", t, n ? "left" : "top")), s || (s = de("coverflow", t, n ? "right" : "bottom")), e && (e.style.opacity = p > 0 ? p : 0), s && (s.style.opacity = -p > 0 ? -p : 0) } } }, setTransition: e => { t.slides.map((e => m(e))).forEach((t => { t.style.transitionDuration = `${e}ms`, t.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach((t => { t.style.transitionDuration = `${e}ms` })) })) }, perspective: () => !0, overwriteParams: () => ({ watchSlidesProgress: !0 }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ creativeEffect: { limitProgress: 1, shadowPerProgress: !1, progressMultiplier: 1, perspective: !0, prev: { translate: [0, 0, 0], rotate: [0, 0, 0], opacity: 1, scale: 1 }, next: { translate: [0, 0, 0], rotate: [0, 0, 0], opacity: 1, scale: 1 } } }); const i = e => "string" == typeof e ? e : `${e}px`; ne({ effect: "creative", swiper: t, on: a, setTranslate: () => { const { slides: e, wrapperEl: s, slidesSizesGrid: a } = t, r = t.params.creativeEffect, { progressMultiplier: n } = r, l = t.params.centeredSlides; if (l) { const e = a[0] / 2 - t.params.slidesOffsetBefore || 0; s.style.transform = `translateX(calc(50% - ${e}px))` } for (let s = 0; s < e.length; s += 1) { const a = e[s], o = a.progress, d = Math.min(Math.max(a.progress, -r.limitProgress), r.limitProgress); let c = d; l || (c = Math.min(Math.max(a.originalProgress, -r.limitProgress), r.limitProgress)); const p = a.swiperSlideOffset, u = [t.params.cssMode ? -p - t.translate : -p, 0, 0], m = [0, 0, 0]; let h = !1; t.isHorizontal() || (u[1] = u[0], u[0] = 0); let f = { translate: [0, 0, 0], rotate: [0, 0, 0], scale: 1, opacity: 1 }; d < 0 ? (f = r.next, h = !0) : d > 0 && (f = r.prev, h = !0), u.forEach(((e, t) => { u[t] = `calc(${e}px + (${i(f.translate[t])} * ${Math.abs(d * n)}))` })), m.forEach(((e, t) => { m[t] = f.rotate[t] * Math.abs(d * n) })), a.style.zIndex = -Math.abs(Math.round(o)) + e.length; const g = u.join(", "), v = `rotateX(${m[0]}deg) rotateY(${m[1]}deg) rotateZ(${m[2]}deg)`, w = c < 0 ? `scale(${1 + (1 - f.scale) * c * n})` : `scale(${1 - (1 - f.scale) * c * n})`, b = c < 0 ? 1 + (1 - f.opacity) * c * n : 1 - (1 - f.opacity) * c * n, y = `translate3d(${g}) ${v} ${w}`; if (h && f.shadow || !h) { let e = a.querySelector(".swiper-slide-shadow"); if (!e && f.shadow && (e = de("creative", a)), e) { const t = r.shadowPerProgress ? d * (1 / r.limitProgress) : d; e.style.opacity = Math.min(Math.max(Math.abs(t), 0), 1) } } const E = le(0, a); E.style.transform = y, E.style.opacity = b, f.origin && (E.style.transformOrigin = f.origin) } }, setTransition: e => { const s = t.slides.map((e => m(e))); s.forEach((t => { t.style.transitionDuration = `${e}ms`, t.querySelectorAll(".swiper-slide-shadow").forEach((t => { t.style.transitionDuration = `${e}ms` })) })), oe({ swiper: t, duration: e, transformElements: s, allSlides: !0 }) }, perspective: () => t.params.creativeEffect.perspective, overwriteParams: () => ({ watchSlidesProgress: !0, virtualTranslate: !t.params.cssMode }) }) }, function (e) { let { swiper: t, extendParams: s, on: a } = e; s({ cardsEffect: { slideShadows: !0, rotate: !0, perSlideRotate: 2, perSlideOffset: 8 } }), ne({ effect: "cards", swiper: t, on: a, setTranslate: () => { const { slides: e, activeIndex: s, rtlTranslate: a } = t, i = t.params.cardsEffect, { startTranslate: r, isTouched: n } = t.touchEventsData, l = a ? -t.translate : t.translate; for (let o = 0; o < e.length; o += 1) { const d = e[o], c = d.progress, p = Math.min(Math.max(c, -4), 4); let u = d.swiperSlideOffset; t.params.centeredSlides && !t.params.cssMode && (t.wrapperEl.style.transform = `translateX(${t.minTranslate()}px)`), t.params.centeredSlides && t.params.cssMode && (u -= e[0].swiperSlideOffset); let m = t.params.cssMode ? -u - t.translate : -u, h = 0; const f = -100 * Math.abs(p); let g = 1, v = -i.perSlideRotate * p, w = i.perSlideOffset - .75 * Math.abs(p); const b = t.virtual && t.params.virtual.enabled ? t.virtual.from + o : o, y = (b === s || b === s - 1) && p > 0 && p < 1 && (n || t.params.cssMode) && l < r, E = (b === s || b === s + 1) && p < 0 && p > -1 && (n || t.params.cssMode) && l > r; if (y || E) { const e = (1 - Math.abs((Math.abs(p) - .5) / .5)) ** .5; v += -28 * p * e, g += -.5 * e, w += 96 * e, h = -25 * e * Math.abs(p) + "%" } if (m = p < 0 ? `calc(${m}px ${a ? "-" : "+"} (${w * Math.abs(p)}%))` : p > 0 ? `calc(${m}px ${a ? "-" : "+"} (-${w * Math.abs(p)}%))` : `${m}px`, !t.isHorizontal()) { const e = h; h = m, m = e } const x = p < 0 ? "" + (1 + (1 - g) * p) : "" + (1 - (1 - g) * p), S = `\n translate3d(${m}, ${h}, ${f}px)\n rotateZ(${i.rotate ? a ? -v : v : 0}deg)\n scale(${x})\n `; if (i.slideShadows) { let e = d.querySelector(".swiper-slide-shadow"); e || (e = de("cards", d)), e && (e.style.opacity = Math.min(Math.max((Math.abs(p) - .5) / .5, 0), 1)) } d.style.zIndex = -Math.abs(Math.round(c)) + e.length; le(0, d).style.transform = S } }, setTransition: e => { const s = t.slides.map((e => m(e))); s.forEach((t => { t.style.transitionDuration = `${e}ms`, t.querySelectorAll(".swiper-slide-shadow").forEach((t => { t.style.transitionDuration = `${e}ms` })) })), oe({ swiper: t, duration: e, transformElements: s }) }, perspective: () => !0, overwriteParams: () => ({ watchSlidesProgress: !0, virtualTranslate: !t.params.cssMode }) }) }]; return Q.use(ce), Q }(); +//# sourceMappingURL=swiper-bundle.min.js.map \ No newline at end of file diff --git a/WeatherApp/js/weather.js b/WeatherApp/js/weather.js new file mode 100644 index 00000000..33eed47a --- /dev/null +++ b/WeatherApp/js/weather.js @@ -0,0 +1,231 @@ + +const menuIcon = document.querySelector(".humberg-menu i") +const menuContent = document.querySelector(".menu-content") + +menuIcon.addEventListener("click", () => { + menuContent.classList.toggle("open") + menuIcon.classList.toggle("uil-times") +}) +var swiper = new Swiper(".mySwiper", { + slidesPerView: 4, + spaceBetween: 10, + centeredSlides: true, + fade: 'true', + spaceBetween: 30, + grabCursor: true, + + pagination: { + el: ".swiper-pagination", + clickable: true, + dynamicBullets: true, + }, + + breakpoints: { + 0: { + slidesPerView: 1, + }, + 520: { + slidesPerView: 2, + }, + 950: { + slidesPerView: 3, + }, + 1200: { + slidesPerView: 4, + } + }, +}); +const API_KEY = "28c2b467e5bc6dee079a32184988da3c" +const searchBtn = document.querySelector(".city-submit") +const input = document.querySelector(".input-city") +const inputLocation = document.querySelector(".input-location") +const currentWeatherCard = document.querySelector(".current-weather-card"); +const weaklyWeatherCards = document.getElementById("weakly-weather-container") +const hourlyCards = document.getElementById("hourly-section"); +const swiperSlidCard = document.querySelector(".swiper-slide"); + +const createCurrentweatherCard = (dailyforecast, city) => { + const cloudStatus = dailyforecast.weather[0].description; + if (cloudStatus == "light rain") { + currentWeatherCard.style.backgroundImage = "url('assets/light rain.gif')"; + } else if (cloudStatus == "moderate rain") { + currentWeatherCard.style.backgroundImage = "url('assets/rain.webp')"; + } else if (cloudStatus == "scattered clouds" || cloudStatus == "broken clouds" || cloudStatus == "overcast clouds") { + currentWeatherCard.style.backgroundImage = "url('assets/scrated sky.gif')"; + } else if (cloudStatus == "clear sky") { + currentWeatherCard.style.backgroundImage = "url('assets/clear sky.gif')"; + } + + return `
    +

    ${city}

    +

    ${dailyforecast.dt_txt.split(" ")[0]}

    +
    +
    + +

    ${(dailyforecast.main.temp - 273.15).toFixed(2)} °C

    +
    +

    ${dailyforecast.weather[0].description}

    +
    +
    +
    +

    ${dailyforecast.main.humidity} %

    +

    humidity

    +
    +
    +

    ${dailyforecast.wind.speed} km/h

    +

    Wind speed

    +
    +
    +
    +
    +

    ${(dailyforecast.main.feels_like - 273.15).toFixed(2)} °C

    +

    Feels like

    +
    +
    +

    ${dailyforecast.main.pressure}

    +

    pressure

    +
    +
    +
    `; + +} + +const createWeaklyweatherCard = (dailyforecast) => { + const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] + const d = new Date(dailyforecast.dt_txt.split(" ")[0]) + const dayName = d.toString().split(' ')[0]; + + return `
    +
    +

    ${dayName}

    +
    +
    + +

    ${(dailyforecast.main.temp - 273.15).toFixed(2)} °C

    +
    +

    ${dailyforecast.weather[0].description}

    +
    +
    +

    ${dailyforecast.main.humidity} %

    +

    Humidity

    +

    ${dailyforecast.wind.speed} km/h

    +

    Wind speed

    +
    +
    +

    ${(dailyforecast.main.feels_like - 273.15).toFixed(2)} °C

    +

    Feels like

    +

    ${dailyforecast.main.pressure}

    +

    Pressure

    +
    +
    +
    `; +} + +const getCurrentTime = () => { + const now = new Date(); + const hours = now.getHours().toString().padStart(2, '0'); + const minutes = now.getMinutes().toString().padStart(2, '0'); + const currentTime = `${hours}:${minutes}`; + return currentTime; +} +const createHourlyForecastcards = (hourforecast, index) => { + const currentTime = getCurrentTime(); + let curtime = hourforecast.dt_txt.split(" ")[1].slice(0, 5) + let cc = currentTime.substring(0, 2); + let n = Number(cc); + console.log(curtime, n, cc) + + return `
    +

    ${curtime}

    + +

    ${(hourforecast.main.temp - 273.15).toFixed(2)} °C

    +

    ${hourforecast.weather[0].description}

    +
    +

    Humidity:

    +

    ${hourforecast.main.humidity} %

    +
    +
    +

    Wind Speed:

    +

    ${hourforecast.wind.speed} km/h

    +
    +
    `; +} +const getWeatherDetails = (name, lat, lon) => { + const weatherurl = `https://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lon}&appid=${API_KEY}` + + fetch(weatherurl).then(res => res.json()).then(data => { + const weaklyforecast = []; + const filteredforecast = data.list.filter(forecast => { + const forday = new Date(forecast.dt_txt).getDate(); + if (!weaklyforecast.includes(forday)) { + return weaklyforecast.push(forday); + } + }); + + currentWeatherCard.innerHTML = " " + weaklyWeatherCards.innerHTML = " " + const city = name; + filteredforecast.forEach((dailyforecast, index, city) => { + if (index == 0) { + currentWeatherCard.innerHTML = createCurrentweatherCard(dailyforecast, name) + } else { + weaklyWeatherCards.innerHTML += createWeaklyweatherCard(dailyforecast) + } + }) + const todaysforecast = []; + const todaysfilteredforecast = data.list.filter(forecast => { + const today = new Date(forecast.dt_txt).getDate(); + const curday = new Date().getDate() + if (curday == today) { + return todaysforecast.push(forecast); + } + }) + hourlyCards.innerHTML = "" + if (hourlyCards.length == 0) { + hourlyCards.innerHTML = "Hourly Forecast are update at 00:00, that will show 3hr gap weather forcast for current day." + } + todaysfilteredforecast.forEach((hourforecast, index) => { + hourlyCards.innerHTML += createHourlyForecastcards(hourforecast, index) + }) + + }).catch(() => { + alert("An error occurs while Weather details ") + }) + +} +const getCityCoordinate = () => { + const cityName = input.value + const geoUrl = `https://api.openweathermap.org/geo/1.0/direct?q=${cityName}&limit=1&appid=28c2b467e5bc6dee079a32184988da3c` + + fetch(geoUrl).then(res => res.json()).then(data => { + const { name, lat, lon } = data[0]; + + getWeatherDetails(name, lat, lon) + + }).catch(() => { + alert("An error occurs while featching the coordinates!") + }) + +} +const getuserCoordinates = () => { + navigator.geolocation.getCurrentPosition( + position => { + const { latitude, longitude } = position.coords + const ReverseGeocoding = `https://api.openweathermap.org/geo/1.0/reverse?lat=${latitude}&lon=${longitude}&limit=1&appid=${API_KEY}` + fetch(ReverseGeocoding).then(res => res.json()).then(data => { + const usercityName = data[0].name + getWeatherDetails(usercityName, latitude, longitude); + }) + }, + error => { + if (error.code === error.PERMISSION_DENIED) { + alert("please reset location permisition ..") + } + console.log(error) + } + ); +} + +searchBtn.addEventListener("click", getCityCoordinate); +inputLocation.addEventListener("click", getuserCoordinates); +window.addEventListener("load", getuserCoordinates); diff --git a/WixTemplate/1.png b/WixTemplate/1.png new file mode 100644 index 00000000..35224eaf Binary files /dev/null and b/WixTemplate/1.png differ diff --git a/WixTemplate/2.png b/WixTemplate/2.png new file mode 100644 index 00000000..c8aded8e Binary files /dev/null and b/WixTemplate/2.png differ diff --git a/WixTemplate/3.png b/WixTemplate/3.png new file mode 100644 index 00000000..454d1981 Binary files /dev/null and b/WixTemplate/3.png differ diff --git a/WixTemplate/4.png b/WixTemplate/4.png new file mode 100644 index 00000000..dca056b9 Binary files /dev/null and b/WixTemplate/4.png differ diff --git a/WixTemplate/5.png b/WixTemplate/5.png new file mode 100644 index 00000000..0d14cfc7 Binary files /dev/null and b/WixTemplate/5.png differ diff --git a/WixTemplate/footer_style.css b/WixTemplate/footer_style.css new file mode 100644 index 00000000..55edc481 --- /dev/null +++ b/WixTemplate/footer_style.css @@ -0,0 +1,79 @@ +.footer { + display: flex; + justify-content: center; + align-items:self-start; + background-color: #FFB81C; + color: black; + padding: 20px; + margin: 0; + min-height: 225px; +} + +.footer-column { + flex: 1; + padding: 0 30px; +} + +.footer-heading { + font-weight: bold; + margin-bottom: 10px; +} + +.footer-link { + color: black; + text-decoration: none; + display: block; + margin-bottom: 5px; +} +.logo{ + height: 50px; + width: 50px; + display: block; +} +.flex{ + display: flex; + align-items:center; + justify-content: center; +} +.f_left{ + margin-right:10px; +} +.f_right{ + display: flex; + flex-direction: column; + gap:2px; + justify-content: space-around; + align-items: start; +} +.f_right > p{ + margin: 0; + display: block; +} +.f_right > h3{ + margin-bottom: 0; + display: block; +} +.svg-icons{ + height: 25px; + width: 25px; + display: block; +} +#linkedin_svg{ + height: 24px; + width: 24px; +} +.svg-flex{ + display: flex; + flex-direction: row; + gap:20px; + padding: 2px; + align-items: center; +} +@media only screen and (max-width: 768px) { +.footer{ + flex-direction: column; +} +.f_left>svg{ + margin-top: 10px; +} +} \ No newline at end of file diff --git a/WixTemplate/index.html b/WixTemplate/index.html new file mode 100644 index 00000000..53fa32e4 --- /dev/null +++ b/WixTemplate/index.html @@ -0,0 +1,892 @@ + + + + + + + WeDu + + + + + + + + + + + + + + + + +
    +
    +

    Communicate. Collaborate. Create.

    +

    WeDu provides an effective and powerfulway to manage your projects

    +
    + +
    + +
    +
    + + + lock + +

    Speed & Security

    +
    +
    + + + view_in_ar + +

    Flexibility & Scalability

    +
    +
    + + + groups + +

    Better Collaboration

    +
    +
    +
    +
    + +
    +
    + +
    +
    + + + +
    +
    +
    +

    With the Right Software, Great Things Can Happen

    +
    +
    +

    I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or + double click me to add your own content and make changes to the font. Feel free to drag and drop me + anywhere you like on your page. I’m a great place for you to tell a story and let your users know a + little more about you.

    +
    +
    + +
    + +
    +
    +

    What We Offer

    +

    I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double + click me to add your own content and make changes to the font.

    +
    +
    +
    + +

    Workflows That Work

    +

    I'm a paragraph. Click here to add your own text and edit me. I’m a great place for you to tell a + story and let your users know a little more about you.

    +
    +
    + +

    All-In-One Solution

    +

    I'm a paragraph. Click here to add your own text and edit me. I’m a great place for you to tell a + story and let your users know a little more about you.

    +
    +
    + +

    Comprehensive Customer Support

    +

    I'm a paragraph. Click here to add your own text and edit me. I’m a great place for you to tell a + story and let your users know a little more about you.

    +
    +
    + +

    Smart Automation Tools

    +

    I'm a paragraph. Click here to add your own text and edit me. I’m a great place for you to tell a + story and let your users know a little more about you.

    +
    +
    +
    + +
    + +
    + WeDu Team Building +
    +
    +
    +

    Built for Creatives,

    +

    by Creatives

    +
    +

    I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double + click me to add your own content and make changes to the font. I’m a great place for you to tell a story + and let your users know a little more about you.

    + + +
    +
    + + build + +

    All-In-One Toolkit

    +
    +
    + + description + +

    Integrated File Sharing

    +
    +
    + + brush + +

    Total Design Freedom

    +
    +
    +
    +
    + +
    +
    + + + +
    +
    +
    +

    Trusted Among Industry Leaders

    +

    I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or + double click me to add your own content and make changes to the font.

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Get Ready to Maximize Your Productivity

    With Our Workflow Solutions

    +
    + +
    + +
    + +
    +
    + +
    + + + + + + + \ No newline at end of file diff --git a/WixTemplate/nav_style.css b/WixTemplate/nav_style.css new file mode 100644 index 00000000..736e9d55 --- /dev/null +++ b/WixTemplate/nav_style.css @@ -0,0 +1,207 @@ +.navbar input[type="checkbox"], +.navbar .hamburger-lines{ + display: none; +} + +.nav-container{ + max-width: 1200px; + width: 100%; + margin: auto; + padding: 20px; +} + +.navbar{ + /* box-shadow: 0px 5px 10px 0px #aaa; */ + /* position: fixed; */ + width: 100%; + background: #FFB81C; + color: #000; + /* opacity: 0.85; */ + /* z-index: 100; */ + font-family: 'Space Grotesk', sans-serif; +} + +.navbar-container{ + display: flex; + justify-content: space-between; + height: 64px; + align-items: center; +} + +.menu-items{ + order: 2; + display: flex; +} +/* .logo{ + order: 1; + font-size: 2.3rem; +} */ + +.menu-items li{ + list-style: none; + margin-left: 1.5rem; + font-size: 1.1rem; +} + +.navbar a{ + color: black; + text-decoration: none; + font-weight: 500; + transition: color 0.3s ease-in-out; +} + +.navbar a:hover{ + color: rgb(84, 83, 83); +} + + +.nav_logo{ + height: 50px; + width: 50px; + display: block; +} +.nav_flex{ + display: flex; + align-items:center; + justify-content: center; +} +.nav_f_left{ + margin-right:10px; + display: none; +} +.nav_f_right{ + display: flex; + flex-direction: column; + /* gap:2px; */ + /* justify-content: space-around; */ + /* align-items: start; */ +} +.nav_f_right > p{ + margin: 0; + display: block; +} +.nav_f_right > h3{ + margin-bottom: 0; + display: block; + margin-top: 0; +} + + + +@media (max-width: 768px){ + .navbar{ + opacity: 0.95; + } + + .navbar-container input[type="checkbox"], + .navbar-container .hamburger-lines{ + display: block; + } + + .navbar-container{ + display: block; + position: relative; + height: 50px; + } + + .navbar-container input[type="checkbox"]{ + position: absolute; + display: block; + height: 32px; + width: 30px; + top: 20px; + left: 20px; + z-index: 5; + opacity: 0; + cursor: pointer; + } + + .navbar-container .hamburger-lines{ + display: block; + height: 28px; + width: 35px; + position: absolute; + top: 26px; + left: 20px; + z-index: 2; + display: flex; + flex-direction: column; + justify-content: space-between; + } + + .navbar-container .hamburger-lines .line{ + display: block; + height: 4px; + width: 100%; + border-radius: 10px; + background: #333; + } + + .navbar-container .hamburger-lines .line1{ + transform-origin: 0% 0%; + transition: transform 0.3s ease-in-out; + } + + .navbar-container .hamburger-lines .line2{ + transition: transform 0.2s ease-in-out; + } + + .navbar-container .hamburger-lines .line3{ + transform-origin: 0% 100%; + transition: transform 0.3s ease-in-out; + } + + .navbar .menu-items{ + padding-top: 100px; + background: #fff; + height: 100vh; + max-width: 300px; + transform: translate(-150%); + display: flex; + flex-direction: column; + margin-left: -40px; + padding-left: 40px; + transition: transform 0.5s ease-in-out; + box-shadow: 5px 0px 10px 0px #aaa; + overflow: scroll; + } + + .navbar .menu-items li{ + margin-bottom: 1.8rem; + font-size: 1.1rem; + font-weight: 500; + } + + /* .logo{ + position: absolute; + top: 10px; + right: 15px; + font-size: 2.5rem; + } */ + + .navbar-container input[type="checkbox"]:checked ~ .menu-items{ + transform: translateX(0); + } + + .navbar-container input[type="checkbox"]:checked ~ .hamburger-lines .line1{ + transform: rotate(45deg); + } + + .navbar-container input[type="checkbox"]:checked ~ .hamburger-lines .line2{ + transform: scaleY(0); + } + + .navbar-container input[type="checkbox"]:checked ~ .hamburger-lines .line3{ + transform: rotate(-45deg); + } + +} + +@media (max-width: 500px){ + .navbar-container input[type="checkbox"]:checked ~ .logo{ + display: none; + } +} +@media only screen and (max-width: 600px) { + +} \ No newline at end of file diff --git a/WixTemplate/p1.png b/WixTemplate/p1.png new file mode 100644 index 00000000..cf40b7d7 Binary files /dev/null and b/WixTemplate/p1.png differ diff --git a/WixTemplate/p2.png b/WixTemplate/p2.png new file mode 100644 index 00000000..dfc20c63 Binary files /dev/null and b/WixTemplate/p2.png differ diff --git a/WixTemplate/p4.png b/WixTemplate/p4.png new file mode 100644 index 00000000..5abe5b27 Binary files /dev/null and b/WixTemplate/p4.png differ diff --git a/WixTemplate/style.css b/WixTemplate/style.css new file mode 100644 index 00000000..0a7a91ff --- /dev/null +++ b/WixTemplate/style.css @@ -0,0 +1,456 @@ +body { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Space Grotesk', sans-serif; +} + +.container1 { + display: flex; + padding-bottom: 0vh !important; + padding: 5vh 10vw; + text-align: center; + justify-content: center; + gap: 20px; + /* border: 2px solid black; */ +} + +.container1 h2 { + font-size: 50px; + text-align: start; + margin: 0; +} + +.container1 p { + font-size: 20px; + text-align: start; +} + +.container1 button { + justify-self: start; + display: block; + width: 125px; + padding: 10px; + font-size: 15px; + font-weight: 700; + background-color: black; + border-radius: 5px; + color: white; + /* height: 100px; */ +} + +.LeftBox { + display: flex; + flex-direction: column; + gap: 25px; + text-align: center; + justify-content: center; +} + +.RightBox { + width: 60%; + overflow: hidden; +} + +.RightBox>svg { + height: auto; + width: 100%; +} + +.boxes { + display: flex; + text-align: center; + gap: 20px; +} + +.smallboxes { + display: flex; + flex-direction: row; + gap: 20px; + text-align: center; + justify-content: center; + bottom: 10px; +} + +.smallboxes>p { + font-size: 14px; +} + +.my-icons { + background-color: black; + max-width: 35px; + max-height: 30px; + border-radius: 5px; + color: white; + width: 100%; + /* display: block !important; */ + margin-top: 12px; + margin-bottom: 12px; + text-align: center; + vertical-align: middle; + padding: 4px; + padding-top: 7px; +} + +.wave-header { + min-height: 10vh; + width: 100%; + /* background: yellow; */ + position: relative; + /* display: flex; + justify-content: center; + align-items: center; */ + z-index: -1; + margin: 0; +} + +/* .wave-header > svg{ + position: absolute; + top: 0; + left: 0; +} */ +.wave-content { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8vh 10vw; + padding-top: 0; + z-index: 2; + background-color: #FFB81C; + gap: 80px; + margin-top: -10px; +} + +.container2 { + display: flex; + flex-direction: column; + margin-top: -130px; +} + +.container2>.wave-content>.Left { + min-width: 25vw; + padding: 2vw; + font-size: 25px; + text-align: start; +} + +.container2>.wave-content>.Right { + min-width: 30%; + padding: 2vw; + /* background-color: red; */ + font-size: 16px; + text-align: start; +} + +.container3 { + padding: 8vh 12vw; + display: flex; + flex-direction: column; + gap: 50px; +} + +.cards { + display: flex; + justify-content: center; + align-items: start; + position: relative; + gap: 20px; + padding: 20px; +} + +.card-item { + display: flex; + flex-direction: column; + align-items: start; + gap: 10px; + /* justify-content: sp; */ + padding: 30px; +} + +.card-item>img { + width: 227px; + height: 301px; + border: 2px solid black; + border-radius: 10px; +} + +.card-item>h3 { + font-size: 22px; + text-align: start; + width: 85%; +} + +.upperbox>h2 { + font-size: 38px; +} + +.upperbox>p { + font-size: 16px; + width: 50%; +} + +.container4 { + display: flex; + padding: 8vh 10vw; + text-align: center; + justify-content: space-around; + /* gap: 12vw; */ +} + +.container4>.left { + max-width: 45%; + overflow: hidden; + /* padding: 20px; */ +} + +.container4>.left>img { + width: 100%; +} + +.container4>.right { + max-width: 50%; + text-align: start; + padding: 20px; + display: flex; + flex-direction: column; + align-items: start; + justify-content: center; + gap: 20px; +} + +.container4>.right>.heading>h2 { + font-size: 36px; + margin: 0; + gap: 0; +} + +.container4>.right>.boxes>.smallboxes { + gap: 10px; + /* align-items:baseline; */ +} + +.container4>.right>.boxes>.smallboxes>p { + text-align: left; +} + +.wave-content2 { + display: flex; + flex-direction: column; + gap: 50px; +} + +.wave-header2 { + min-height: 10vh; + width: 100%; + /* background: yellow; */ + position: relative; + /* display: flex; + justify-content: center; + align-items: center; */ + z-index: -1; + margin: 0; +} + +.wave-content2 { + padding: 8vh 10vw; + padding-top: 0; + background-color: #f1b7f0; + /* gap: 1000px; */ + margin-top: -60px; +} + +.my-heading { + font-size: 36px; +} + +.wave-content2>div>p { + width: 40%; + font-size: 16px; + line-height: 28px; +} + +.partners { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + justify-content: space-around; +} + +.partners>img { + width: 100%; + height: 100%; + display: block; + margin: 0 auto; +} + +.partners>.partner { + display: flex; + width: 120px; + height: 120px; + padding: 10px; + justify-content: center; + flex-direction: column; +} + +.container6 { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding-top: 10vw; + padding-left: 10vw; + padding-right: 10vw; + gap: 50px; +} + +.container6>.team_svg>svg { + height: 534px; + width: 900px; + margin-top: -30px; +} + +.container6>.container6_heading>h3 { + font-size: 2.1rem; + /* width: 50%; */ + text-align: center; + display: flex; + flex-direction: column; + gap: 10px; + display: block; + margin: 0; + letter-spacing: .2rem; +} + +.container6 button { + justify-self: start; + display: block; + width: 125px; + padding: 8px; + font-size: 17px; + font-weight: 700; + background-color: black; + border-radius: 5px; + color: white; + letter-spacing: 1px; +} + +.ybox { + background-color: #FFB81C; + margin-top: -45px; + height: 100px; +} + +@media only screen and (max-width: 600px) { + body { + width: 100vw; + /* overflow: hidden; */ + } + + .container1 { + width: 90vw; + display: flex; + flex-direction: column; + padding: 20px; + gap: 0px; + } + + .container1 p { + margin: 0; + } + + .container1 h2 { + font-size: 35px; + } + + .boxes { + display: none; + } + + .smallboxes { + align-items: center; + } + + .RightBox { + width: 95%; + } + + .container2 { + margin-top: -96px; + } + + .container3 { + padding: 10px; + gap: 10px + } + + .container3 .cards { + flex-direction: column; + padding: 0px; + } + + .card-item { + gap: 18px; + } + + .card-item h3 { + margin: 0; + } + + .card-item p { + margin: 0; + } + + .upperbox { + display: flex; + flex-direction: column; + /* align-items: center; */ + /* justify-content: center; */ + } + + .upperbox>h2 { + margin-left: 30px; + } + + .upperbox>p { + margin-left: 30px; + width: 80%; + } + + .container4 { + display: flex; + flex-direction: column; + } + + .container4>.left { + max-width: 95%; + } + + .container4>.right { + max-width: 95%; + } + + .wave-content2 { + margin-top: -12px; + } + + .wave-content { + flex-direction: column; + gap: 2px; + } + + + + .container6>.container6_heading>h3 { + font-size: 1.3rem; + } + + .container6>.team_svg>svg { + height: 238px; + width: 350px; + } + + .container2>.wave-content>.Left>h2 { + margin: 0; + } +} \ No newline at end of file diff --git a/WixTemplate/team.png b/WixTemplate/team.png new file mode 100644 index 00000000..1becc55e Binary files /dev/null and b/WixTemplate/team.png differ diff --git a/calculator/index.html b/calculator/index.html new file mode 100644 index 00000000..3b2585a9 --- /dev/null +++ b/calculator/index.html @@ -0,0 +1,38 @@ + + + + + + + vivekBoii Calculator + + +
    +
    +
    +
    +
    AC
    +
    DE
    +
    .
    +
    /
    +
    7
    +
    8
    +
    9
    +
    *
    +
    4
    +
    5
    +
    6
    +
    -
    +
    1
    +
    2
    +
    3
    +
    +
    +
    00
    +
    0
    +
    =
    +
    +
    +
    + + + \ No newline at end of file diff --git a/calculator/script.js b/calculator/script.js new file mode 100644 index 00000000..0cea9b82 --- /dev/null +++ b/calculator/script.js @@ -0,0 +1,101 @@ +const ac=document.querySelector(".ac"); +const de=document.querySelector(".de"); +const point=document.querySelector(".point"); +const nine=document.querySelector(".nine"); +const eight=document.querySelector(".eight"); +const seven=document.querySelector(".seven"); +const six=document.querySelector(".six"); +const five=document.querySelector(".five"); +const four=document.querySelector(".four"); +const three=document.querySelector(".three"); +const two=document.querySelector(".two"); +const one=document.querySelector(".one"); +const dzero=document.querySelector(".dzero"); +const zero=document.querySelector(".zero"); +const slash=document.querySelector(".slash"); +const mul=document.querySelector(".mul"); +const sub=document.querySelector(".sub"); +const add=document.querySelector(".add"); +const equal=document.querySelector(".equal"); +const display=document.querySelector('.display'); + +var calc=""; + +ac.addEventListener("click",()=>{ + calc=""; + display.innerHTML=calc; +}) +de.addEventListener("click",()=>{ + calc=calc.slice(0,-1); + display.innerHTML=calc; +}) +nine.addEventListener("click",()=>{ + calc=calc+"9"; + display.innerHTML=calc; +}) +eight.addEventListener("click",()=>{ + calc=calc+"8"; + display.innerHTML=calc; +}) +seven.addEventListener("click",()=>{ + calc=calc+"7"; + display.innerHTML=calc; +}) +six.addEventListener("click",()=>{ + calc=calc+"6"; +}) +five.addEventListener("click",()=>{ + calc=calc+"5"; + display.innerHTML=calc; +}) +four.addEventListener("click",()=>{ + calc=calc+"4"; + display.innerHTML=calc; +}) +three.addEventListener("click",()=>{ + calc=calc+"3"; + display.innerHTML=calc; +}) +two.addEventListener("click",()=>{ + calc=calc+"2"; + display.innerHTML=calc; +}) +one.addEventListener("click",()=>{ + calc=calc+"1"; + display.innerHTML=calc; +}) +zero.addEventListener("click",()=>{ + calc=calc+"0"; + display.innerHTML=calc; +}) +dzero.addEventListener("click",()=>{ + calc=calc+"00"; + display.innerHTML=calc; +}) +slash.addEventListener("click",()=>{ + calc=calc+"/"; + display.innerHTML=calc; +}) +mul.addEventListener("click",()=>{ + calc=calc+"*"; + display.innerHTML=calc; +}) +sub.addEventListener("click",()=>{ + calc=calc+"-"; + display.innerHTML=calc; +}) +add.addEventListener("click",()=>{ + calc=calc+"+"; + display.innerHTML=calc; +}) +point.addEventListener("click",()=>{ + calc=calc+"."; + display.innerHTML=calc; +}) +equal.addEventListener("click",()=>{ + calc=eval(calc); + display.innerHTML=calc; +}) + + + diff --git a/calculator/style.css b/calculator/style.css new file mode 100644 index 00000000..469cbfbf --- /dev/null +++ b/calculator/style.css @@ -0,0 +1,59 @@ +*{ + padding: 0; + margin:0; + box-sizing: 0; +} + +.container{ + width: 100vw; + height: 100vh; + background-color: gray; + display: flex; + justify-content: center; + align-items: center; +} + +.calContainer{ + background-color: #6499E9; + height: 600px; + width: 480px; + border-radius: 10px; + box-shadow: rgba(0, 0, 0, 0.4) 0px 30px 90px; + display: grid; + grid-template-rows: .25fr .75fr; +} + +.display{ + display: flex; + align-items: end; + justify-content: flex-end; + border: solid; + margin: 10px; + padding: 10px; + font-size: 50px; + overflow: hidden; +} + +.buttons{ + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: 10px; + padding: 10px; +} +.buttons div{ + background-color: #2070e8; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + font-size: 25px; + user-select: none; +} + +.buttons .equal{ + grid-column: 3/-1; +} + + + + diff --git a/guess my number/.prettierrc b/guess my number/.prettierrc new file mode 100644 index 00000000..b4f8e6a6 --- /dev/null +++ b/guess my number/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "arrowParens": "avoid" +} diff --git a/guess my number/index.html b/guess my number/index.html new file mode 100644 index 00000000..5194c52a --- /dev/null +++ b/guess my number/index.html @@ -0,0 +1,40 @@ + + + + + + + + Guess My Number! + + + + + + +
    +

    Guess My Number!

    +

    (Between 1 and 20)

    + +
    ?
    +
    +
    +
    + + +
    +
    +

    Start guessing...

    +

    💯 Score: 20

    +

    + 🥇 Highscore: 0 +

    +
    +
    + + + diff --git a/guess my number/los.wav b/guess my number/los.wav new file mode 100644 index 00000000..3bcc98b0 Binary files /dev/null and b/guess my number/los.wav differ diff --git a/guess my number/script.js b/guess my number/script.js new file mode 100644 index 00000000..0874530a --- /dev/null +++ b/guess my number/script.js @@ -0,0 +1,75 @@ +'use strict'; +const secretnumber = Math.trunc(Math.random()*20)+1; +let score =20; +let highscore =0; + + +function playSound() { + var audio = document.getElementById("myAudio"); + audio.play(); + } + + function playsadSound() { + var audio = document.getElementById("mysadAudio"); + audio.play(); + } + + +document.querySelector('.check').addEventListener('click',function(){ + const guess = Number(document.querySelector('.guess').value); + + if(!guess){ + document.querySelector('.message').textContent='😒 No number!'; + } + else if(guess===secretnumber) +{ + + document.querySelector('.number').textContent=secretnumber; + document.querySelector('.message').textContent='Correct number'; + document.querySelector('body').style.backgroundColor='#60b347'; + document.querySelector('.number').style.width='30rem'; + playSound(); + + if(score>highscore) + { + highscore=score; + document.querySelector('.highscore').textContent=highscore; + } +} +else if (guess>secretnumber) +{ + if(score>0) + { +document.querySelector('.message').textContent='too high!'; +score=score-1; +document.querySelector('.score').textContent=score; +} +else{ + document.querySelector('.message').textContent='you lost the game!'; + playsadSound(); + document.querySelector('body').style.backgroundColor='#FF0000'; +} +} +else if(guess0) + { + document.querySelector('.message').textContent='too low!'; + score--; + document.querySelector('.score').textContent=score; +} +else{ + playsadSound(); + document.querySelector('.message').textContent='you lost the game!'; + document.querySelector('.number').textContent='😢'; +} +} +}); +document.querySelector('.again').addEventListener('click',function(){ + document.querySelector('.score').value='20'; + document.querySelector('.score').textContent='20'; + document.querySelector('.message').textContent='start guessing'; + document.querySelector('body').style.backgroundColor='black'; + document.querySelector('.number').style.width='15rem'; + document.querySelector('.number').textContent='?'; + document.querySelector('.guess').value=null; +}); \ No newline at end of file diff --git a/guess my number/sound.mp3 b/guess my number/sound.mp3 new file mode 100644 index 00000000..064decd5 Binary files /dev/null and b/guess my number/sound.mp3 differ diff --git a/guess my number/style.css b/guess my number/style.css new file mode 100644 index 00000000..dfed55a3 --- /dev/null +++ b/guess my number/style.css @@ -0,0 +1,119 @@ +@import url('https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap'); + +* { + margin: 0; + padding: 0; + box-sizing: inherit; +} + +html { + font-size: 62.5%; + box-sizing: border-box; +} + +body { + font-family: 'Press Start 2P', sans-serif; + color: #eee; + background-color: #222; + /* background-color: #60b347; */ +} + +/* LAYOUT */ +header { + position: relative; + height: 35vh; + border-bottom: 7px solid #eee; +} + +main { + height: 65vh; + color: #eee; + display: flex; + align-items: center; + justify-content: space-around; +} + +.left { + width: 52rem; + display: flex; + flex-direction: column; + align-items: center; +} + +.right { + width: 52rem; + font-size: 2rem; +} + +/* ELEMENTS STYLE */ +h1 { + font-size: 4rem; + text-align: center; + position: absolute; + width: 100%; + top: 52%; + left: 50%; + transform: translate(-50%, -50%); +} + +.number { + background: #eee; + color: #333; + font-size: 6rem; + width: 15rem; + padding: 3rem 0rem; + text-align: center; + position: absolute; + bottom: 0; + left: 50%; + transform: translate(-50%, 50%); +} + +.between { + font-size: 1.4rem; + position: absolute; + top: 2rem; + right: 2rem; +} + +.again { + position: absolute; + top: 2rem; + left: 2rem; +} + +.guess { + background: none; + border: 4px solid #eee; + font-family: inherit; + color: inherit; + font-size: 5rem; + padding: 2.5rem; + width: 25rem; + text-align: center; + display: block; + margin-bottom: 3rem; +} + +.btn { + border: none; + background-color: #eee; + color: #222; + font-size: 2rem; + font-family: inherit; + padding: 2rem 3rem; + cursor: pointer; +} + +.btn:hover { + background-color: #ccc; +} + +.message { + margin-bottom: 8rem; + height: 3rem; +} + +.label-score { + margin-bottom: 2rem; +} diff --git a/index b/index new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/index @@ -0,0 +1 @@ + diff --git a/index.html b/index.html new file mode 100644 index 00000000..e2489eee --- /dev/null +++ b/index.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + +
    +

    TIC TAC TOE

    +

    + Game starts by just Tap on + box

    First Player starts as + Player X And Second Player as + Player 0 +

    +

    +
    +
    + + + +
    +
    + + + +
    +
    + + + +
    +
    +


    + + +

    +

    +
    + + + diff --git a/logic.js b/logic.js new file mode 100644 index 00000000..2cdc9ba1 --- /dev/null +++ b/logic.js @@ -0,0 +1,426 @@ +// Function called whenever user tab on any box +function myfunc() { + + // Setting DOM to all boxes or input field + var b1, b2, b3, b4, b5, b6, b7, b8, b9; + b1 = document.getElementById("b1").value; + b2 = document.getElementById("b2").value; + b3 = document.getElementById("b3").value; + b4 = document.getElementById("b4").value; + b5 = document.getElementById("b5").value; + b6 = document.getElementById("b6").value; + b7 = document.getElementById("b7").value; + b8 = document.getElementById("b8").value; + b9 = document.getElementById("b9").value; + + var b1btn, b2btn, b3btn, b4btn, b5btn, + b6btn, b7btn, b8btn, b9btn; + + b1btn = document.getElementById("b1"); + b2btn = document.getElementById("b2"); + b3btn = document.getElementById("b3"); + b4btn = document.getElementById("b4"); + b5btn = document.getElementById("b5"); + b6btn = document.getElementById("b6"); + b7btn = document.getElementById("b7"); + b8btn = document.getElementById("b8"); + b9btn = document.getElementById("b9"); + + // Checking if Player X won or not and after + // that disabled all the other fields + if ((b1 == 'x' || b1 == 'X') && (b2 == 'x' || + b2 == 'X') && (b3 == 'x' || b3 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b2btn.style.color = "red"; + b3btn.style.color = "red"; + } + else if ((b1 == 'x' || b1 == 'X') && (b4 == 'x' || + b4 == 'X') && (b7 == 'x' || b7 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b2btn.disabled = true; + b3btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b4btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b7 == 'x' || b7 == 'X') && (b8 == 'x' || + b8 == 'X') && (b9 == 'x' || b9 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + + b7btn.style.color = "red"; + b8btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == 'x' || b3 == 'X') && (b6 == 'x' || + b6 == 'X') && (b9 == 'x' || b9 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + + b3btn.style.color = "red"; + b6btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b1 == 'x' || b1 == 'X') && (b5 == 'x' || + b5 == 'X') && (b9 == 'x' || b9 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + + b1btn.style.color = "red"; + b5btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == 'x' || b3 == 'X') && (b5 == 'x' || + b5 == 'X') && (b7 == 'x' || b7 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b3btn.style.color = "red"; + b5btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b2 == 'x' || b2 == 'X') && (b5 == 'x' || + b5 == 'X') && (b8 == 'x' || b8 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b9btn.disabled = true; + + b2btn.style.color = "red"; + b5btn.style.color = "red"; + b8btn.style.color = "red"; + } + else if ((b4 == 'x' || b4 == 'X') && (b5 == 'x' || + b5 == 'X') && (b6 == 'x' || b6 == 'X')) { + document.getElementById('print') + .innerHTML = "Player X won"; + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b4btn.style.color = "red"; + b5btn.style.color = "red"; + b6btn.style.color = "red"; + } + + // Checking of Player X finish + // Checking for Player 0 starts, Is player 0 won or + // not and after that disabled all the other fields + else if ((b1 == '0' || b1 == '0') && (b2 == '0' || + b2 == '0') && (b3 == '0' || b3 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b2btn.style.color = "red"; + b3btn.style.color = "red"; + } + else if ((b1 == '0' || b1 == '0') && (b4 == '0' || + b4 == '0') && (b7 == '0' || b7 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b2btn.disabled = true; + b3btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b1btn.style.color = "red"; + b4btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b7 == '0' || b7 == '0') && (b8 == '0' || + b8 == '0') && (b9 == '0' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b6btn.disabled = true; + + b7btn.style.color = "red"; + b8btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == '0' || b3 == '0') && (b6 == '0' || + b6 == '0') && (b9 == '0' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b5btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b3btn.style.color = "red"; + b6btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b1 == '0' || b1 == '0') && (b5 == '0' || + b5 == '0') && (b9 == '0' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b2btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + + b1btn.style.color = "red"; + b5btn.style.color = "red"; + b9btn.style.color = "red"; + } + else if ((b3 == '0' || b3 == '0') && (b5 == '0' || + b5 == '0') && (b7 == '0' || b7 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b3btn.style.color = "red"; + b5btn.style.color = "red"; + b7btn.style.color = "red"; + } + else if ((b2 == '0' || b2 == '0') && (b5 == '0' || + b5 == '0') && (b8 == '0' || b8 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b3btn.disabled = true; + b4btn.disabled = true; + b6btn.disabled = true; + b7btn.disabled = true; + b9btn.disabled = true; + + b2btn.style.color = "red"; + b5btn.style.color = "red"; + b8btn.style.color = "red"; + } + else if ((b4 == '0' || b4 == '0') && (b5 == '0' || + b5 == '0') && (b6 == '0' || b6 == '0')) { + document.getElementById('print') + .innerHTML = "Player 0 won"; + b1btn.disabled = true; + b2btn.disabled = true; + b3btn.disabled = true; + b7btn.disabled = true; + b8btn.disabled = true; + b9btn.disabled = true; + + b4btn.style.color = "red"; + b5btn.style.color = "red"; + b6btn.style.color = "red"; + } + + // Checking of Player 0 finish + // Here, Checking about Tie + else if ((b1 == 'X' || b1 == '0') && (b2 == 'X' + || b2 == '0') && (b3 == 'X' || b3 == '0') && + (b4 == 'X' || b4 == '0') && (b5 == 'X' || + b5 == '0') && (b6 == 'X' || b6 == '0') && + (b7 == 'X' || b7 == '0') && (b8 == 'X' || + b8 == '0') && (b9 == 'X' || b9 == '0')) { + document.getElementById('print') + .innerHTML = "Match Tie"; + } + else { + + // Here, Printing Result + if (flag == 1) { + document.getElementById('print') + .innerHTML = "Player X Turn"; + } + else { + document.getElementById('print') + .innerHTML = "Player 0 Turn"; + } + } +} + +// Function to reset game +function myfunc_2() { + location.reload(); + b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = ''; +} + +// Here onwards, functions check turn of the player +// and put accordingly value X or 0 +flag = 1; +function myfunc_3() { + if (flag == 1) { + document.getElementById("b1").value = "X"; + document.getElementById("b1").disabled = true; + flag = 0; + } + else { + document.getElementById("b1").value = "0"; + document.getElementById("b1").disabled = true; + flag = 1; + } +} + +function myfunc_4() { + if (flag == 1) { + document.getElementById("b2").value = "X"; + document.getElementById("b2").disabled = true; + flag = 0; + } + else { + document.getElementById("b2").value = "0"; + document.getElementById("b2").disabled = true; + flag = 1; + } +} + +function myfunc_5() { + if (flag == 1) { + document.getElementById("b3").value = "X"; + document.getElementById("b3").disabled = true; + flag = 0; + } + else { + document.getElementById("b3").value = "0"; + document.getElementById("b3").disabled = true; + flag = 1; + } +} + +function myfunc_6() { + if (flag == 1) { + document.getElementById("b4").value = "X"; + document.getElementById("b4").disabled = true; + flag = 0; + } + else { + document.getElementById("b4").value = "0"; + document.getElementById("b4").disabled = true; + flag = 1; + } +} + +function myfunc_7() { + if (flag == 1) { + document.getElementById("b5").value = "X"; + document.getElementById("b5").disabled = true; + flag = 0; + } + else { + document.getElementById("b5").value = "0"; + document.getElementById("b5").disabled = true; + flag = 1; + } +} + +function myfunc_8() { + if (flag == 1) { + document.getElementById("b6").value = "X"; + document.getElementById("b6").disabled = true; + flag = 0; + } + else { + document.getElementById("b6").value = "0"; + document.getElementById("b6").disabled = true; + flag = 1; + } +} + +function myfunc_9() { + if (flag == 1) { + document.getElementById("b7").value = "X"; + document.getElementById("b7").disabled = true; + flag = 0; + } + else { + document.getElementById("b7").value = "0"; + document.getElementById("b7").disabled = true; + flag = 1; + } +} + +function myfunc_10() { + if (flag == 1) { + document.getElementById("b8").value = "X"; + document.getElementById("b8").disabled = true; + flag = 0; + } + else { + document.getElementById("b8").value = "0"; + document.getElementById("b8").disabled = true; + flag = 1; + } +} + +function myfunc_11() { + if (flag == 1) { + document.getElementById("b9").value = "X"; + document.getElementById("b9").disabled = true; + flag = 0; + } + else { + document.getElementById("b9").value = "0"; + document.getElementById("b9").disabled = true; + flag = 1; + } +} diff --git a/memorycards/app.js b/memorycards/app.js new file mode 100644 index 00000000..205dd18e --- /dev/null +++ b/memorycards/app.js @@ -0,0 +1,113 @@ +document.addEventListener('DOMContentLoaded', () => { + + //card options.... + const cardArray = [ + { + name: 'icecream', + img: 'icecream.jpg' + }, + { + name: 'burger', + img: 'burger.jpg' + }, + { + name: 'balls', + img: 'balls.jpg' + }, + { + name: 'burger', + img: 'burger.jpg' + }, + { + name: 'hotdog', + img: 'hotdong.jpg' + }, + { + name: 'hotdog', + img: 'hotdong.jpg' + }, + { + name: 'fries', + img: 'fries.jpg' + }, + { + name: 'coldcoffee', + img: 'coldcoffee.jpg' + }, + { + name: 'fries', + img: 'fries.jpg' + }, + { + name: 'balls', + img: 'balls.jpg' + }, + { + name: 'icecream', + img: 'icecream.jpg' + }, + { + name: 'coldcoffee', + img: 'coldcoffee.jpg' + }, + + ] + cardArray.sort(() => 0.5 - Math.random()) + + const grid = document.querySelector('.grid') + var resultDisplay = document.querySelector('#result') + var cardsChosen = [] + var cardsChosenId = [] + var cardsWon =[] + //create your board------ + function CreateBoard() { + for (let i = 0; i < cardArray.length; i++) { + var card = document.createElement('img') + card.setAttribute('src', './fill.jpg') + card.setAttribute('data-id', i) + card.addEventListener('click',flipCard) + grid.appendChild(card) + } + + } + + //check for matches---- + function checkForMatch() { + var cards = document.querySelectorAll('img') + const optionOneId = cardsChosenId[0] + const optionTwoId = cardsChosenId[1] + if (cardsChosen[0] === cardsChosen[1]){ + alert('You found a match') + cards[optionOneId].setAttribute('src' , './blank1.jpg') + cards[optionTwoId].setAttribute('src', './blank1.jpg') + cardsWon.push(cardsChosen) + } else { + cards[optionOneId].setAttribute('src' , './fill.jpg') + cards[optionTwoId].setAttribute('src', './fill.jpg') + alert('Sorry, try again') + } + cardsChosen = [] + cardsChosenId = [] + resultDisplay.textContent = cardsWon.length + if (cardsWon.length === cardArray.length/2){ + resultDisplay.textContent ='Congratulations! You Found Them All !' + } + + } + //flip your card---- + + function flipCard() { + var cardId = this.getAttribute('data-id') + cardsChosen.push(cardArray[cardId].name) + cardsChosenId.push(cardId) + this.setAttribute('src', cardArray[cardId].img) + if(cardsChosen.length === 2) { + setTimeout(checkForMatch, 500) + } + } + + CreateBoard() + + + +}) \ No newline at end of file diff --git a/memorycards/balls.jpg b/memorycards/balls.jpg new file mode 100644 index 00000000..d01b5342 Binary files /dev/null and b/memorycards/balls.jpg differ diff --git a/memorycards/blank.jfif b/memorycards/blank.jfif new file mode 100644 index 00000000..23592f2f Binary files /dev/null and b/memorycards/blank.jfif differ diff --git a/memorycards/blank1.jpg b/memorycards/blank1.jpg new file mode 100644 index 00000000..50e11366 Binary files /dev/null and b/memorycards/blank1.jpg differ diff --git a/memorycards/burger.jpg b/memorycards/burger.jpg new file mode 100644 index 00000000..a00a3cf6 Binary files /dev/null and b/memorycards/burger.jpg differ diff --git a/memorycards/coldcoffee.jpg b/memorycards/coldcoffee.jpg new file mode 100644 index 00000000..e9d548a4 Binary files /dev/null and b/memorycards/coldcoffee.jpg differ diff --git a/memorycards/fill.jpg b/memorycards/fill.jpg new file mode 100644 index 00000000..d1539709 Binary files /dev/null and b/memorycards/fill.jpg differ diff --git a/memorycards/fries.jpg b/memorycards/fries.jpg new file mode 100644 index 00000000..d32d3300 Binary files /dev/null and b/memorycards/fries.jpg differ diff --git a/memorycards/hotdong.jpg b/memorycards/hotdong.jpg new file mode 100644 index 00000000..d51a2420 Binary files /dev/null and b/memorycards/hotdong.jpg differ diff --git a/memorycards/icecream.jpg b/memorycards/icecream.jpg new file mode 100644 index 00000000..fa3964ed Binary files /dev/null and b/memorycards/icecream.jpg differ diff --git a/memorycards/memory.html b/memorycards/memory.html new file mode 100644 index 00000000..abdc9096 --- /dev/null +++ b/memorycards/memory.html @@ -0,0 +1,19 @@ + + + + + + + memory game + + + + + +

    Score:

    +
    + +
    + + + \ No newline at end of file diff --git a/memorycards/style.css b/memorycards/style.css new file mode 100644 index 00000000..568ecf89 --- /dev/null +++ b/memorycards/style.css @@ -0,0 +1,6 @@ +.grid{ + display: flex; + flex-wrap: wrap; + height:300px; + width:400px; +} \ No newline at end of file diff --git a/mern-blog-app/app.js b/mern-blog-app/app.js new file mode 100644 index 00000000..6a16aa37 --- /dev/null +++ b/mern-blog-app/app.js @@ -0,0 +1,85 @@ +const express = require('express'); +const passport = require('passport'); +const cookieParser = require('cookie-parser'); +const jwt = require('jsonwebtoken'); +const bcrypt = require('bcrypt'); +const User = require('./models/User'); // Import the User model + +const app = express(); +app.use(express.json()); +app.use(cookieParser()); + +// Passport.js configuration (passport-config.js) - Same as before + +// Middleware to protect routes +function authenticateUser(req, res, next) { + passport.authenticate('jwt', { session: false }, (err, user) => { + if (err || !user) { + return res.status(401).json({ message: 'Unauthorized' }); + } + req.user = user; + return next(); + })(req, res, next); +} + +// Register a new user +app.post('/register', async (req, res) => { + try { + const { username, email, password } = req.body; + const hashedPassword = await bcrypt.hash(password, 10); + + const newUser = new User({ username, email, password: hashedPassword }); + await newUser.save(); + res.status(201).json({ message: 'User registered successfully' }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Login route +app.post('/login', (req, res, next) => { + passport.authenticate('local', { session: false }, (err, user, info) => { + if (err || !user) { + return res.status(401).json({ message: 'Authentication failed' }); + } + req.login(user, { session: false }, (loginErr) => { + if (loginErr) { + return next(loginErr); + } + + // Generate JWT tokens upon successful login + const accessToken = jwt.sign({ _id: user._id }, 'your-secret-key', { + expiresIn: '1h', // Adjust the expiration time as needed + }); + const refreshToken = jwt.sign({ _id: user._id }, 'your-secret-key-refresh', { + expiresIn: '7d', // Adjust the expiration time as needed + }); + + // Set tokens as cookies (you can also send them in the response body) + res.cookie('accessToken', accessToken, { httpOnly: true }); + res.cookie('refreshToken', refreshToken, { httpOnly: true }); + + return res.status(200).json({ message: 'Login successful' }); + }); + })(req, res, next); +}); + +// Protected route example - User homepage +app.get('/user-homepage', authenticateUser, (req, res) => { + // Fetch and send user's blogs to the frontend + res.status(200).json({ message: 'User homepage data' }); +}); + +// Extend the backend to handle user-specific blog operations (create, edit, delete) + +// Logout route - Clear cookies +app.get('/logout', (req, res) => { + res.clearCookie('accessToken'); + res.clearCookie('refreshToken'); + res.status(200).json({ message: 'Logout successful' }); +}); + +const PORT = process.env.PORT || 3001; +app.listen(PORT, () => { + console.log(`Server is running on port ${PORT}`); +}); diff --git a/mern-blog-app/frontend/src/App.jsx b/mern-blog-app/frontend/src/App.jsx new file mode 100644 index 00000000..e69de29b diff --git a/mern-blog-app/frontend/src/BlogForm.jsx b/mern-blog-app/frontend/src/BlogForm.jsx new file mode 100644 index 00000000..daf601ae --- /dev/null +++ b/mern-blog-app/frontend/src/BlogForm.jsx @@ -0,0 +1,39 @@ +// BlogForm.jsx +import React, { useState } from 'react'; + +function BlogForm() { + const [formData, setFormData] = useState({ + title: '', + content: '', + }); + + const handleChange = (e) => { + setFormData({ ...formData, [e.target.name]: e.target.value }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + // Send a POST request to create or update the blog + }; + + return ( +
    + +