commit edbf304790b162fe3db6e0c6a16878636df64618 Author: Victor Batischev Date: Wed Feb 14 18:02:53 2024 +0300 init diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..e5e2fd0 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,20 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + extends: [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + '@vue/eslint-config-typescript', + '@vue/eslint-config-prettier/skip-formatting', + '@feature-sliced', + ], + rules: { + 'vue/multi-word-component-names': 0, + 'import/order': 'warn', + }, + parserOptions: { + ecmaVersion: 'latest', + }, +} diff --git a/.fantasticonrc.js b/.fantasticonrc.js new file mode 100644 index 0000000..146e211 --- /dev/null +++ b/.fantasticonrc.js @@ -0,0 +1,41 @@ +module.exports = { + inputDir: './src/shared/assets/icons/formatting', // (required) + outputDir: './public/fonts/icons', // (required) + fontTypes: ['woff', 'woff2'], + assetTypes: ['ts', 'css'], + fontsUrl: '/fonts/icons', + normalize: true, + formatOptions: { + json: { + // render the JSON human readable with two spaces indentation (default is none, so minified) + indent: 2, + }, + ts: { + // select what kind of types you want to generate (default `['enum', 'constant', 'literalId', 'literalKey']`) + types: ['literalId'], + // render the types with `'` instead of `"` (default is `"`) + singleQuotes: true, + // customise names used for the generated types and constants + // enumName: 'MyIconType', + // constantName: 'IconsCodes', + literalIdName: 'IconNames', + // literalKeyName: 'IconKey', + }, + }, + // Use a custom Handlebars template + templates: { + // css: './my-custom-tp.css.hbs', + }, + pathOptions: { + ts: './src/shared/lib/types/icons.ts', + // json: './misc/icon-codepoints.json', + css: './src/app/styles/utils/icons.scss', + }, + // getIconId: ({ + // basename, // `string` - Example: 'foo'; + // relativeDirPath, // `string` - Example: 'sub/dir/foo.svg' + // absoluteFilePath, // `string` - Example: '/var/icons/sub/dir/foo.svg' + // relativeFilePath, // `string` - Example: 'foo.svg' + // index, // `number` - Example: `0` + // }) => [index, basename].join('_'), // '0_foo' +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b989c2c --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore + +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.exe +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv + +# CSSComb config +csscomb.json diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..6366314 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,10 @@ +{ + "tabWidth": 4, + "bracketSpacing": true, + "singleQuote": true, + "trailingComma": "all", + "semi": false, + "jsxSingleQuote": true, + "arrowParens": "avoid", + "printWidth": 80 +} \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..009a534 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "Vue.volar", + "Vue.vscode-typescript-vue-plugin", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..05443af --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# vue-health + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. + +If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/johnsoncodehk/volar/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: + +1. Disable the built-in TypeScript Extension + 1) Run `Extensions: Show Built-in Extensions` from VSCode's command palette + 2) Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` +2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +npm run lint +``` diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/index.html b/index.html new file mode 100644 index 0000000..884d757 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + Vite App + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b895f0e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8278 @@ +{ + "name": "vue-health", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vue-health", + "version": "0.0.0", + "dependencies": { + "@vuepic/vue-datepicker": "^7.4.0", + "axios": "^1.6.1", + "fantasticon": "^2.0.0", + "oslllo-svg-fixer": "^3.0.0", + "pinia": "^2.1.7", + "v3-infinite-loading": "^1.3.1", + "vite-plugin-vue3-bem": "^1.0.12", + "vue": "^3.3.4", + "vue-router": "^4.2.5", + "vue3-bem": "^1.0.8", + "vue3-lazyload": "^0.3.8", + "vue3-toastify": "^0.1.14" + }, + "devDependencies": { + "@feature-sliced/eslint-config": "^0.1.0-beta.6", + "@rushstack/eslint-patch": "^1.3.3", + "@tsconfig/node18": "^18.2.2", + "@types/node": "^18.18.5", + "@vitejs/plugin-vue": "^4.4.0", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/eslint-config-prettier": "^8.0.0", + "@vue/eslint-config-typescript": "^12.0.0", + "@vue/tsconfig": "^0.4.0", + "eslint": "^8.49.0", + "eslint-plugin-vue": "^9.17.0", + "node-sass": "^9.0.0", + "npm-run-all2": "^6.1.1", + "prettier": "^3.0.3", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "typescript": "~5.2.0", + "vite": "^4.4.11", + "vue-tsc": "^1.8.19" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", + "convert-source-map": "^2.0.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/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.4", + "@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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "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==", + "dev": true, + "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-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz", + "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@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-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@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.20" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "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-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "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-typescript": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.5.tgz", + "integrity": "sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", + "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/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/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "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.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@feature-sliced/eslint-config": { + "version": "0.1.0-beta.6", + "resolved": "https://registry.npmjs.org/@feature-sliced/eslint-config/-/eslint-config-0.1.0-beta.6.tgz", + "integrity": "sha512-exhyS6DUvAamLlDGS2ToIdm7YTvo3GJD67QNfziHgJrJqCcViMvCW13gmo6QQwFRpXQj6gUnV3QTgPNzLznIsg==", + "dev": true, + "peerDependencies": { + "eslint": ">=6", + "eslint-plugin-boundaries": ">=2", + "eslint-plugin-import": ">=2" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jimp/bmp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz", + "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "bmp-js": "^0.1.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/core": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz", + "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "exif-parser": "^0.1.12", + "file-type": "^16.5.4", + "load-bmfont": "^1.3.1", + "mkdirp": "^0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "node_modules/@jimp/core/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@jimp/custom": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz", + "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.16.13" + } + }, + "node_modules/@jimp/gif": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz", + "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "gifwrap": "^0.9.2", + "omggif": "^1.0.9" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/jpeg": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz", + "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "jpeg-js": "^0.4.2" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blit": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz", + "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-blur": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz", + "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-circle": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz", + "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-color": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz", + "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-contain": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz", + "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-cover": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz", + "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5", + "@jimp/plugin-scale": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-crop": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz", + "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-displace": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz", + "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-dither": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz", + "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-fisheye": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz", + "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-flip": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz", + "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-rotate": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-gaussian": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz", + "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-invert": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz", + "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-mask": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz", + "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-normalize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz", + "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-print": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz", + "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "load-bmfont": "^1.4.0" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-resize": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz", + "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-rotate": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz", + "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blit": ">=0.3.5", + "@jimp/plugin-crop": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-scale": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz", + "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-shadow": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz", + "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-blur": ">=0.3.5", + "@jimp/plugin-resize": ">=0.3.5" + } + }, + "node_modules/@jimp/plugin-threshold": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz", + "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5", + "@jimp/plugin-color": ">=0.8.0", + "@jimp/plugin-resize": ">=0.8.0" + } + }, + "node_modules/@jimp/plugins": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz", + "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.16.13", + "@jimp/plugin-blur": "^0.16.13", + "@jimp/plugin-circle": "^0.16.13", + "@jimp/plugin-color": "^0.16.13", + "@jimp/plugin-contain": "^0.16.13", + "@jimp/plugin-cover": "^0.16.13", + "@jimp/plugin-crop": "^0.16.13", + "@jimp/plugin-displace": "^0.16.13", + "@jimp/plugin-dither": "^0.16.13", + "@jimp/plugin-fisheye": "^0.16.13", + "@jimp/plugin-flip": "^0.16.13", + "@jimp/plugin-gaussian": "^0.16.13", + "@jimp/plugin-invert": "^0.16.13", + "@jimp/plugin-mask": "^0.16.13", + "@jimp/plugin-normalize": "^0.16.13", + "@jimp/plugin-print": "^0.16.13", + "@jimp/plugin-resize": "^0.16.13", + "@jimp/plugin-rotate": "^0.16.13", + "@jimp/plugin-scale": "^0.16.13", + "@jimp/plugin-shadow": "^0.16.13", + "@jimp/plugin-threshold": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/png": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz", + "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.16.13", + "pngjs": "^3.3.3" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/tiff": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz", + "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "utif": "^2.0.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/types": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz", + "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.16.13", + "@jimp/gif": "^0.16.13", + "@jimp/jpeg": "^0.16.13", + "@jimp/png": "^0.16.13", + "@jimp/tiff": "^0.16.13", + "timm": "^1.6.1" + }, + "peerDependencies": { + "@jimp/custom": ">=0.3.5" + } + }, + "node_modules/@jimp/utils": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz", + "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "regenerator-runtime": "^0.13.3" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "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.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@resvg/resvg-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.0.tgz", + "integrity": "sha512-Tf3YpbBKcQn991KKcw/vg7vZf98v01seSv6CVxZBbRkL/xyjnoYB6KgrFL6zskT1A4dWC/vg77KyNOW+ePaNlA==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.0", + "@resvg/resvg-js-android-arm64": "2.6.0", + "@resvg/resvg-js-darwin-arm64": "2.6.0", + "@resvg/resvg-js-darwin-x64": "2.6.0", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.0", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.0", + "@resvg/resvg-js-linux-arm64-musl": "2.6.0", + "@resvg/resvg-js-linux-x64-gnu": "2.6.0", + "@resvg/resvg-js-linux-x64-musl": "2.6.0", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.0", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.0", + "@resvg/resvg-js-win32-x64-msvc": "2.6.0" + } + }, + "node_modules/@resvg/resvg-js-android-arm-eabi": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.0.tgz", + "integrity": "sha512-lJnZ/2P5aMocrFMW7HWhVne5gH82I8xH6zsfH75MYr4+/JOaVcGCTEQ06XFohGMdYRP3v05SSPLPvTM/RHjxfA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.0.tgz", + "integrity": "sha512-N527f529bjMwYWShZYfBD60dXA4Fux+D695QsHQ93BDYZSHUoOh1CUGUyICevnTxs7VgEl98XpArmUWBZQVMfQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-MabUKLVayEwlPo0mIqAmMt+qESN8LltCvv5+GLgVga1avpUrkxj/fkU1TKm8kQegutUjbP/B0QuMuUr0uhF8ew==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.0.tgz", + "integrity": "sha512-zrFetdnSw/suXjmyxSjfDV7i61hahv6DDG6kM7BYN2yJ3Es5+BZtqYZTcIWogPJedYKmzN1YTMWGd/3f0ubFiA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.0.tgz", + "integrity": "sha512-sH4gxXt7v7dGwjGyzLwn7SFGvwZG6DQqLaZ11MmzbCwd9Zosy1TnmrMJfn6TJ7RHezmQMgBPi18bl55FZ1AT4A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.0.tgz", + "integrity": "sha512-fCyMncqCJtrlANADIduYF4IfnWQ295UKib7DAxFXQhBsM9PLDTpizr0qemZcCNadcwSVHnAIzL4tliZhCM8P6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-ouLjTgBQHQyxLht4FdMPTvuY8xzJigM9EM2Tlu0llWkN1mKyTQrvYWi6TA6XnKdzDJHy7ZLpWpjZi7F5+Pg+Vg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.0.tgz", + "integrity": "sha512-n3zC8DWsvxC1AwxpKFclIPapDFibs5XdIRoV/mcIlxlh0vseW1F49b97F33BtJQRmlntsqqN6GMMqx8byB7B+Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-n4tasK1HOlAxdTEROgYA1aCfsEKk0UOFDNd/AQTTZlTmCbHKXPq+O8npaaKlwXquxlVK8vrkcWbksbiGqbCAcw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.0.tgz", + "integrity": "sha512-X2+EoBJFwDI5LDVb51Sk7ldnVLitMGr9WwU/i21i3fAeAXZb3hM16k67DeTy16OYkT2dk/RfU1tP1wG+rWbz2Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.0.tgz", + "integrity": "sha512-L7oevWjQoUgK5W1fCKn0euSVemhDXVhrjtwqpc7MwBKKimYeiOshO1Li1pa8bBt5PESahenhWgdB6lav9O0fEg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-x64-msvc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.0.tgz", + "integrity": "sha512-8lJlghb+Unki5AyKgsnFbRJwkEj9r1NpwyuBG8yEJiG1W9eEGl03R3I7bsVa3haof/3J1NlWf0rzSa1G++A2iw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", + "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==", + "dev": true + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.2.tgz", + "integrity": "sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", + "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.4.0.tgz", + "integrity": "sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz", + "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.10.tgz", + "integrity": "sha512-nsV1o3AZ5n5jaEAObrS3MWLBWaGwUj/vAsc15FVNIv+DbpizQRISg9wzygsHBr56ELRH8r4K75vkYNMtsSNNWw==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.10.10" + } + }, + "node_modules/@volar/source-map": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.10.tgz", + "integrity": "sha512-GVKjLnifV4voJ9F0vhP56p4+F3WGf+gXlRtjFZsv6v3WxBTWU3ZVeaRaEHJmWrcv5LXmoYYpk/SC25BKemPRkg==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.10.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.10.tgz", + "integrity": "sha512-4a2r5bdUub2m+mYVnLu2wt59fuoYWe7nf0uXtGHU8QQ5LDNfzAR0wK7NgDiQ9rcl2WT3fxT2AA9AylAwFtj50A==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.10.10", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz", + "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/shared": "3.3.8", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", + "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", + "dependencies": { + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", + "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.8", + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-ssr": "3.3.8", + "@vue/reactivity-transform": "3.3.8", + "@vue/shared": "3.3.8", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", + "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", + "dependencies": { + "@vue/compiler-dom": "3.3.8", + "@vue/shared": "3.3.8" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz", + "integrity": "sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", + "integrity": "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/parser": "^6.7.0", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "1.8.22", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.22.tgz", + "integrity": "sha512-bsMoJzCrXZqGsxawtUea1cLjUT9dZnDsy5TuZ+l1fxRMzUGQUG9+Ypq4w//CqpWmrx7nIAJpw2JVF/t258miRw==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.10.5", + "@volar/source-map": "~1.10.5", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz", + "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==", + "dependencies": { + "@vue/shared": "3.3.8" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", + "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", + "dependencies": { + "@babel/parser": "^7.23.0", + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz", + "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==", + "dependencies": { + "@vue/reactivity": "3.3.8", + "@vue/shared": "3.3.8" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz", + "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==", + "dependencies": { + "@vue/runtime-core": "3.3.8", + "@vue/shared": "3.3.8", + "csstype": "^3.1.2" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz", + "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==", + "dependencies": { + "@vue/compiler-ssr": "3.3.8", + "@vue/shared": "3.3.8" + }, + "peerDependencies": { + "vue": "3.3.8" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz", + "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "node_modules/@vuepic/vue-datepicker": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-7.4.0.tgz", + "integrity": "sha512-dXYzbcnRet9b+Dkh+f8rhMnjj5QXgejJTQp+ZRALgwP2oeli2c8e4VvJ0NVxoc7QTU8D5x5Et8NP51C450Pkvg==", + "dependencies": { + "date-fns": "^2.30.0", + "date-fns-tz": "^1.3.7" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" + }, + "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/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.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/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "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/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "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.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bufferstreams": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-3.0.0.tgz", + "integrity": "sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==", + "dependencies": { + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/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/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "dev": true, + "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/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "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==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "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/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/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/cubic2quad": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", + "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-fns-tz": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.3.8.tgz", + "integrity": "sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==", + "peerDependencies": { + "date-fns": ">=2.0.0" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "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/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.578", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz", + "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "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-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz", + "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fantasticon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fantasticon/-/fantasticon-2.0.0.tgz", + "integrity": "sha512-6/VpHU4CD4qTJblTRXN0/EvNmGPv8P0enQsBLA8PyFupEKvnxlO9ktZyroj1yynskgbzvce5//BYh5OVKw1MSw==", + "dependencies": { + "change-case": "^4.1.2", + "cli-color": "^2.0.2", + "commander": "^9.4.1", + "glob": "^8.0.3", + "handlebars": "^4.7.7", + "slugify": "^1.6.5", + "svg2ttf": "^6.0.3", + "svgicons2svgfont": "^12.0.0", + "ttf2eot": "^3.1.0", + "ttf2woff": "^3.0.0", + "ttf2woff2": "^4.0.5" + }, + "bin": { + "fantasticon": "bin/fantasticon" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/fantasticon/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/fantasticon/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/gifwrap": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", + "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", + "dependencies": { + "image-q": "^4.0.0", + "omggif": "^1.0.10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/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/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-q": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", + "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", + "dependencies": { + "@types/node": "16.9.1" + } + }, + "node_modules/image-q/node_modules/@types/node": { + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "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==", + "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==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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/is-wsl/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/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==" + }, + "node_modules/jimp": { + "version": "0.16.13", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.13.tgz", + "integrity": "sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.16.13", + "@jimp/plugins": "^0.16.13", + "@jimp/types": "^0.16.13", + "regenerator-runtime": "^0.13.3" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/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/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/load-bmfont": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", + "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", + "dependencies": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/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/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/microbuffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", + "integrity": "sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "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==", + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.0.tgz", + "integrity": "sha512-PbZERfeFdrHQOOXiAKOY0VPbykZy90ndPKk0d+CFDegTKmWp1VgOTz2xACVbr1BjCWxrQp68CXtvNsveFhqDJg==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-gyp/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/node-gyp/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/node-gyp/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "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==", + "dev": true + }, + "node_modules/node-sass": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-9.0.0.tgz", + "integrity": "sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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/npm-run-all2": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-6.1.1.tgz", + "integrity": "sha512-lWLbkPZ5BSdXtN8lR+0rc8caKoPdymycpZksyDEC9MOBvfdwTXZ0uVhb7bMcGeXv2/BKtfQuo6Zn3zfc8rxNXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.3", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-pkg": "^8.0.0", + "shell-quote": "^1.7.3" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0", + "npm": ">= 8" + } + }, + "node_modules/npm-run-all2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm-run-all2/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-run-all2/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" + }, + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/oslllo-potrace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/oslllo-potrace/-/oslllo-potrace-2.0.1.tgz", + "integrity": "sha512-XDsVIUfwXnylngcbecF/6gBHdtFgEnqDt0a9WKqXIo/jPe2AkZkmi6bNaNb9OwlAgoIjy0b1Hi6odPEqztPszg==", + "dependencies": { + "jimp": "^0.16.1" + } + }, + "node_modules/oslllo-svg-fixer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/oslllo-svg-fixer/-/oslllo-svg-fixer-3.0.0.tgz", + "integrity": "sha512-fk0oWpDfWlcZI42EJfwZV2a7K2hbB63big8KBCDdIU/72QUeUw2z41hTRO/YJeNyFwixb6ecmwOVdJuWQ6SMLg==", + "dependencies": { + "ansi-colors": "^4.1.3", + "cli-progress": "^3.12.0", + "fast-glob": "^3.3.1", + "oslllo-potrace": "^2.0.1", + "oslllo-svg2": "^2.0.2", + "oslllo-validator": "^3.1.0", + "piscina": "^4.1.0", + "yargs": "^16.2.0" + }, + "bin": { + "oslllo-svg-fixer": "src/cli.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/oslllo-svg-fixer/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/oslllo-svg-fixer/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/oslllo-svg2": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/oslllo-svg2/-/oslllo-svg2-2.0.2.tgz", + "integrity": "sha512-Pg1e7op02QaGoUWAuAfORj7TrtJuTXFAOm+5Ycq8iBOvcg/0ZZc3Laxj3Ceh3f9Ad8zmt7qvz90amKPLqXjk7g==", + "dependencies": { + "@resvg/resvg-js": "^2.1.0", + "domino": "^2.1.6", + "jimp": "^0.16.1", + "oslllo-validator": "3.1.0" + } + }, + "node_modules/oslllo-validator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/oslllo-validator/-/oslllo-validator-3.1.0.tgz", + "integrity": "sha512-eqaVuDxnxDO55+pncqTTphbeq6O5XHMyrSfWQoL48mG2rUjr2ZBzvkFkcxIiG3l7IaIY6/L1oX1AJIDdZyzuPQ==", + "dependencies": { + "domino": "^2.1.6", + "validator": "^13.7.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" + }, + "node_modules/parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" + }, + "node_modules/parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dependencies": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + }, + "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==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/piscina": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.2.0.tgz", + "integrity": "sha512-/Yq6CLchvi5UQ6YGeiYHIJQV09VcZ5eYuNVS/YPkpxlxKrB4tEbIyc6j8F5b0jCP6tHdiji1Gos4fapc7q1csg==", + "dependencies": { + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", + "dependencies": { + "pngjs": "^3.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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-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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "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/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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/read-pkg-up/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg-up/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==", + "dev": true + }, + "node_modules/read-pkg-up/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/read-pkg-up/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/read-pkg-up/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg-up/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/read-pkg-up/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/read-pkg-up/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.6.0.tgz", + "integrity": "sha512-rLjWJzQFOq4xw7MgJrCZ6T1jIOvvYElXT12r+y0CC6u67hegDHaxcPqb2fZHOGlqxugGQPNB1EnTezjBetkwkw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "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/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "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==", + "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==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/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==", + "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==", + "optional": true + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-graph": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", + "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + }, + "bin": { + "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scss-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", + "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", + "dev": true, + "dependencies": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, + "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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "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/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==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/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/stdout-stream/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/stdout-stream/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/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svg2ttf": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.0.3.tgz", + "integrity": "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==", + "dependencies": { + "@xmldom/xmldom": "^0.7.2", + "argparse": "^2.0.1", + "cubic2quad": "^1.2.1", + "lodash": "^4.17.10", + "microbuffer": "^1.0.0", + "svgpath": "^2.1.5" + }, + "bin": { + "svg2ttf": "svg2ttf.js" + } + }, + "node_modules/svgicons2svgfont": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-12.0.0.tgz", + "integrity": "sha512-fjyDkhiG0M1TPBtZzD12QV3yDcG2fUgiqHPOCYzf7hHE40Hl3GhnE6P1njsJCCByhwM7MiufyDW3L7IOR5dg9w==", + "dependencies": { + "commander": "^9.3.0", + "glob": "^8.0.3", + "sax": "^1.2.4", + "svg-pathdata": "^6.0.3" + }, + "bin": { + "svgicons2svgfont": "bin/svgicons2svgfont.js" + }, + "engines": { + "node": ">=16.15.0" + } + }, + "node_modules/svgicons2svgfont/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/svgicons2svgfont/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/svgpath": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", + "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==", + "funding": { + "url": "https://github.com/fontello/svg2ttf?sponsor=1" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/timm": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", + "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "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/ttf2eot": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-3.1.0.tgz", + "integrity": "sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "ttf2eot": "ttf2eot.js" + } + }, + "node_modules/ttf2woff": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", + "integrity": "sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==", + "dependencies": { + "argparse": "^2.0.1", + "pako": "^1.0.0" + }, + "bin": { + "ttf2woff": "ttf2woff.js" + } + }, + "node_modules/ttf2woff2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/ttf2woff2/-/ttf2woff2-4.0.5.tgz", + "integrity": "sha512-zpoU0NopfjoyVqkFeQ722SyKk/n607mm5OHxuDS/wCCSy82B8H3hHXrezftA2KMbKqfJIjie2lsJHdvPnBGbsw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "bufferstreams": "^3.0.0", + "nan": "^2.14.2", + "node-gyp": "^9.0.0" + }, + "bin": { + "ttf2woff2": "bin/ttf2woff2.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ttf2woff2/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/ttf2woff2/node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/ttf2woff2/node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "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/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dependencies": { + "pako": "^1.0.5" + } + }, + "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==" + }, + "node_modules/v3-infinite-loading": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/v3-infinite-loading/-/v3-infinite-loading-1.3.1.tgz", + "integrity": "sha512-Yi/STWDo+jasQSd8sBCta2u5/C75eLWdTyqkUPOcCEWYFzzw0DddYrDfvjB2IEbcvFxNiA4ljBpNLcRLVe2adA==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "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/vite-plugin-vue3-bem": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vite-plugin-vue3-bem/-/vite-plugin-vue3-bem-1.0.12.tgz", + "integrity": "sha512-5wkT0+1NnoHGjr2tB1rs4iHZ5OIYftPdhv7hD79xzxRzSFbWd5bPJK/8p1n4f9QjG2LHWz4jZ9yH+A4zqTHr1Q==", + "dependencies": { + "@vue/compiler-sfc": "^3.2.33", + "magic-string": "^0.26.2" + } + }, + "node_modules/vite-plugin-vue3-bem/node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vue": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz", + "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==", + "dependencies": { + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-sfc": "3.3.8", + "@vue/runtime-dom": "3.3.8", + "@vue/server-renderer": "3.3.8", + "@vue/shared": "3.3.8" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", + "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.22", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.22.tgz", + "integrity": "sha512-j9P4kHtW6eEE08aS5McFZE/ivmipXy0JzrnTgbomfABMaVKx37kNBw//irL3+LlE3kOo63XpnRigyPC3w7+z+A==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.10.5", + "@vue/language-core": "1.8.22", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue3-bem": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vue3-bem/-/vue3-bem-1.0.8.tgz", + "integrity": "sha512-mWJvixhRH0viGrFqji+sjiOsOQB2agbtf3iORZgmKhgp88XOHXxMcuBEKVztHUiNuwiVjyzc6y0hafxgUefCpQ==", + "peerDependencies": { + "@vue/runtime-core": "*" + } + }, + "node_modules/vue3-lazyload": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/vue3-lazyload/-/vue3-lazyload-0.3.8.tgz", + "integrity": "sha512-UiJHRT7mzry102WbhtrRgJh+f8Z8u4Z+H1RU4dvPmQeq7wFSDFxZB9iJOWGihH2FscXN/8rMGLDOQJAmjwqpCg==", + "dependencies": { + "vue-demi": "^0.12.5" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue3-lazyload/node_modules/vue-demi": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.12.5.tgz", + "integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue3-toastify": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/vue3-toastify/-/vue3-toastify-0.1.14.tgz", + "integrity": "sha512-2wyzMhWq8IjTclL25tqKWknDFdFI1vPueMGZpHNlPWf6TBfxBycBANS+2n4W1xD7tHhX4G6HhCe31sle6OpwYQ==", + "engines": { + "node": ">=16", + "npm": ">=7" + }, + "peerDependencies": { + "vue": ">=3.2.0" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "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==" + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6ab97cd --- /dev/null +++ b/package.json @@ -0,0 +1,57 @@ +{ + "name": "vue-health", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "format": "prettier --write src/", + "format-icons": "node src/shared/utils/npm/formattingIcons.js", + "icons": "fantasticon" + }, + "dependencies": { + "@vuepic/vue-datepicker": "^7.4.0", + "axios": "^1.6.1", + "fantasticon": "^2.0.0", + "oslllo-svg-fixer": "^3.0.0", + "pinia": "^2.1.7", + "v3-infinite-loading": "^1.3.1", + "vite-plugin-vue3-bem": "^1.0.12", + "vue": "^3.3.4", + "vue-router": "^4.2.5", + "vue3-bem": "^1.0.8", + "vue3-lazyload": "^0.3.8", + "vue3-toastify": "^0.1.14" + }, + "devDependencies": { + "@feature-sliced/eslint-config": "^0.1.0-beta.6", + "@rushstack/eslint-patch": "^1.3.3", + "@tsconfig/node18": "^18.2.2", + "@types/node": "^18.18.5", + "@vitejs/plugin-vue": "^4.4.0", + "@vitejs/plugin-vue-jsx": "^3.1.0", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/eslint-config-prettier": "^8.0.0", + "@vue/eslint-config-typescript": "^12.0.0", + "@vue/tsconfig": "^0.4.0", + "eslint": "^8.49.0", + "eslint-plugin-vue": "^9.17.0", + "node-sass": "^9.0.0", + "npm-run-all2": "^6.1.1", + "prettier": "^3.0.3", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "typescript": "~5.2.0", + "vite": "^4.4.11", + "vue-tsc": "^1.8.19" + }, + "overrides": { + "fantasticon": { + "glob": "7.2.0" + } + } +} diff --git a/public/fonts/NeueHaasUnica-Black.woff b/public/fonts/NeueHaasUnica-Black.woff new file mode 100644 index 0000000..8e8e0e9 Binary files /dev/null and b/public/fonts/NeueHaasUnica-Black.woff differ diff --git a/public/fonts/NeueHaasUnica-Black.woff2 b/public/fonts/NeueHaasUnica-Black.woff2 new file mode 100644 index 0000000..164720b Binary files /dev/null and b/public/fonts/NeueHaasUnica-Black.woff2 differ diff --git a/public/fonts/NeueHaasUnica-Bold.woff b/public/fonts/NeueHaasUnica-Bold.woff new file mode 100644 index 0000000..030d6ad Binary files /dev/null and b/public/fonts/NeueHaasUnica-Bold.woff differ diff --git a/public/fonts/NeueHaasUnica-Bold.woff2 b/public/fonts/NeueHaasUnica-Bold.woff2 new file mode 100644 index 0000000..b24d528 Binary files /dev/null and b/public/fonts/NeueHaasUnica-Bold.woff2 differ diff --git a/public/fonts/NeueHaasUnica-Medium.woff b/public/fonts/NeueHaasUnica-Medium.woff new file mode 100644 index 0000000..222e5a8 Binary files /dev/null and b/public/fonts/NeueHaasUnica-Medium.woff differ diff --git a/public/fonts/NeueHaasUnica-Medium.woff2 b/public/fonts/NeueHaasUnica-Medium.woff2 new file mode 100644 index 0000000..fa15337 Binary files /dev/null and b/public/fonts/NeueHaasUnica-Medium.woff2 differ diff --git a/public/fonts/NeueHaasUnica-Regular.woff b/public/fonts/NeueHaasUnica-Regular.woff new file mode 100644 index 0000000..8e76c6c Binary files /dev/null and b/public/fonts/NeueHaasUnica-Regular.woff differ diff --git a/public/fonts/NeueHaasUnica-Regular.woff2 b/public/fonts/NeueHaasUnica-Regular.woff2 new file mode 100644 index 0000000..5b6772c Binary files /dev/null and b/public/fonts/NeueHaasUnica-Regular.woff2 differ diff --git a/public/fonts/TinkoffSans-Bold.woff b/public/fonts/TinkoffSans-Bold.woff new file mode 100644 index 0000000..ee421a4 Binary files /dev/null and b/public/fonts/TinkoffSans-Bold.woff differ diff --git a/public/fonts/TinkoffSans-Bold.woff2 b/public/fonts/TinkoffSans-Bold.woff2 new file mode 100644 index 0000000..42f5091 Binary files /dev/null and b/public/fonts/TinkoffSans-Bold.woff2 differ diff --git a/public/fonts/icons/icons.css b/public/fonts/icons/icons.css new file mode 100644 index 0000000..ac8e7bc --- /dev/null +++ b/public/fonts/icons/icons.css @@ -0,0 +1,56 @@ +@font-face { + font-family: "icons"; + src: url("./public/fonts/icons/icons.woff?ce6361810f7aeed17b09d8e9e447cd48") format("woff"), +url("./public/fonts/icons/icons.woff2?ce6361810f7aeed17b09d8e9e447cd48") format("woff2"); +} + +i[class^="icon-"]:before, i[class*=" icon-"]:before { + font-family: icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-book-open:before { + content: "\f101"; +} +.icon-calendar:before { + content: "\f102"; +} +.icon-dots-vertical:before { + content: "\f103"; +} +.icon-help-circle:before { + content: "\f104"; +} +.icon-message-text:before { + content: "\f105"; +} +.icon-plus:before { + content: "\f106"; +} +.icon-search:before { + content: "\f107"; +} +.icon-trash:before { + content: "\f108"; +} +.icon-user-edit:before { + content: "\f109"; +} +.icon-user-plus:before { + content: "\f10a"; +} +.icon-user:before { + content: "\f10b"; +} +.icon-users-right:before { + content: "\f10c"; +} +.icon-video-recorder:before { + content: "\f10d"; +} diff --git a/public/fonts/icons/icons.woff b/public/fonts/icons/icons.woff new file mode 100644 index 0000000..9ffc1bf Binary files /dev/null and b/public/fonts/icons/icons.woff differ diff --git a/public/fonts/icons/icons.woff2 b/public/fonts/icons/icons.woff2 new file mode 100644 index 0000000..3639334 Binary files /dev/null and b/public/fonts/icons/icons.woff2 differ diff --git a/public/images/default/avatar.png b/public/images/default/avatar.png new file mode 100644 index 0000000..4dc75b4 Binary files /dev/null and b/public/images/default/avatar.png differ diff --git a/public/images/default/circle-matrix-1.svg b/public/images/default/circle-matrix-1.svg new file mode 100644 index 0000000..d947012 --- /dev/null +++ b/public/images/default/circle-matrix-1.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/images/icons/google.svg b/public/images/icons/google.svg new file mode 100644 index 0000000..0c88092 --- /dev/null +++ b/public/images/icons/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/images/icons/vk.svg b/public/images/icons/vk.svg new file mode 100644 index 0000000..7765307 --- /dev/null +++ b/public/images/icons/vk.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/images/icons/yandex.svg b/public/images/icons/yandex.svg new file mode 100644 index 0000000..4f206fd --- /dev/null +++ b/public/images/icons/yandex.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/app/App.vue b/src/app/App.vue new file mode 100644 index 0000000..c9fe6a0 --- /dev/null +++ b/src/app/App.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/app/configs.ts b/src/app/configs.ts new file mode 100644 index 0000000..79fc710 --- /dev/null +++ b/src/app/configs.ts @@ -0,0 +1,7 @@ +const mainHost = import.meta.env.MAIN_HOST || 'https://human.dmtay.ru' + +export default { + mainHost, + baseURL: mainHost + '/api/', + medicalURL: mainHost + '/medical/', +} diff --git a/src/app/createApp.ts b/src/app/createApp.ts new file mode 100644 index 0000000..7d075b9 --- /dev/null +++ b/src/app/createApp.ts @@ -0,0 +1,143 @@ +import VueDatePicker from '@vuepic/vue-datepicker' +import { createApp, defineAsyncComponent, h } from 'vue' +import Vue3Toasity, { type ToastContainerOptions } from 'vue3-toastify' + +import App from '@/app/App.vue' + +import { PageLayout } from '@/widgets' +import { + AuthCard, + AuthForm, + Button, + ButtonMenu, + Card, + FileCard, + IconBase, + type IconNames, + InfinityLoading, + Input, + Link, + Logo, + Spinner, + Tabs, + Tag, + ToastIcon, + Tooltip, + TransitionFade, + UserBase, + Dropdown, + Textarea, +} from '@/shared' + +export const create = () => { + const app = createApp(App) + + app.use(Vue3Toasity, { + autoClose: 2000, + hideProgressBar: true, + pauseOnHover: false, + icon: ({ type }) => + h(ToastIcon, { + view: type, + }), + closeButton: ({ closeToast }) => + h(IconBase, { + name: 'close' as IconNames, + class: 'Toastify__close-button', + onClick: closeToast, + }), + } as ToastContainerOptions) + + app.component('VueDatePicker', VueDatePicker) + app.component('icon-base-component', IconBase) + app.component('button-component', Button) + app.component('card-component', Card) + app.component('file-card-component', FileCard) + app.component('transition-fade-component', TransitionFade) + app.component('input-component', Input) + app.component('page-layout-component', PageLayout) + app.component('user-base-component', UserBase) + app.component('link-component', Link) + app.component('button-menu-component', ButtonMenu) + app.component('tag-component', Tag) + app.component('tooltip-component', Tooltip) + app.component('spinner-component', Spinner) + app.component('tabs-component', Tabs) + app.component('infinity-loading-component', InfinityLoading) + app.component('logo-component', Logo) + app.component('auth-form-component', AuthForm) + app.component('auth-card-component', AuthCard) + app.component('dropdown-component', Dropdown) + app.component('textarea-component', Textarea) + + //modals + app.component( + 'modal-dialog-component', + defineAsyncComponent( + () => import('@/widgets/modals/ui/ModalDialog/ModalDialog.vue'), + ), + ) + + app.component( + 'modal-edit-patient-component', + defineAsyncComponent( + () => import('@/widgets/modals/ui/EditPatient/EditPatient.vue'), + ), + ) + + app.component( + 'modal-select-questionnaire-component', + defineAsyncComponent( + () => + import( + '@/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.vue' + ), + ), + ) + + app.component( + 'modal-add-destination-component', + defineAsyncComponent( + () => + import( + '@/widgets/modals/ui/ModalAddDestination/ModalAddDestination.vue' + ), + ), + ) + + app.component( + 'modal-add-reminder-component', + defineAsyncComponent( + () => + import( + '@/widgets/modals/ui/ModalAddReminder/ModalAddReminder.vue' + ), + ), + ) + + app.component( + 'modal-view-questionnaire-component', + defineAsyncComponent( + () => + import( + '@/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.vue' + ), + ), + ) + + app.component( + 'modal-analysis-hint-component', + defineAsyncComponent( + () => import('@/widgets/modals/ui/AnalysisHints/AnalysisHints.vue'), + ), + ) + + app.component( + 'modal-view-optimums-component', + defineAsyncComponent( + () => import('@/widgets/modals/ui/ViewOptimums/ViewOptimums.vue'), + ), + ) + + return app +} diff --git a/src/app/directives/clickOutside.ts b/src/app/directives/clickOutside.ts new file mode 100644 index 0000000..6d186c1 --- /dev/null +++ b/src/app/directives/clickOutside.ts @@ -0,0 +1,16 @@ +import type { Directive } from 'vue' + +export const clickOutside: Directive = { + mounted(element, { value }) { + element.clickOutside = function (event: Event) { + if (!(element === event.target || element.contains(event.target))) { + value(event) + } + } + + document.body.addEventListener('click', element.clickOutside) + }, + unmounted(element) { + document.body.removeEventListener('click', element.clickOutside) + }, +} diff --git a/src/app/directives/index.ts b/src/app/directives/index.ts new file mode 100644 index 0000000..d2b6fcf --- /dev/null +++ b/src/app/directives/index.ts @@ -0,0 +1 @@ +export * from './clickOutside' diff --git a/src/app/main.ts b/src/app/main.ts new file mode 100644 index 0000000..3224e16 --- /dev/null +++ b/src/app/main.ts @@ -0,0 +1,16 @@ +import '@/app/styles/index.scss' +import { createPinia } from 'pinia' +import VueLazyLoad from 'vue3-lazyload' +import { create } from '@/app/createApp' +import { router } from '@/app/providers/router' +import { clickOutside } from './directives' + +export const app = create() +app.use(createPinia()) +app.use(router) +app.directive('click-outside', clickOutside) +app.use(VueLazyLoad, { + delay: 300, +}) + +app.mount('#app') diff --git a/src/app/providers/router/index.ts b/src/app/providers/router/index.ts new file mode 100644 index 0000000..0e93633 --- /dev/null +++ b/src/app/providers/router/index.ts @@ -0,0 +1,44 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { type Middleware, type MiddlewareContext } from './middlewares' +import { routes } from './routes' + +export const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes, +}) + +router.beforeEach(async (to, from, next) => { + if (!to.meta.middleware) { + return next() + } + + const middleware = to.meta.middleware as Middleware[] + + const context: MiddlewareContext = { + to, + from, + next, + } + + return middleware[0]({ + ...context, + next: middlewarePipeline(context, middleware, 1), + }) +}) + +const middlewarePipeline = ( + context: MiddlewareContext, + middleware: Middleware[], + index: number, +) => { + const nextMiddleware = middleware[index] + + if (!nextMiddleware) { + return context.next + } + + return () => { + const nextPipeline = middlewarePipeline(context, middleware, index + 1) + nextMiddleware({ ...context, next: nextPipeline }) + } +} diff --git a/src/app/providers/router/middlewares.ts b/src/app/providers/router/middlewares.ts new file mode 100644 index 0000000..155189b --- /dev/null +++ b/src/app/providers/router/middlewares.ts @@ -0,0 +1,43 @@ +import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router' +import { tokenValidate } from '@/features' +import { Routes } from '@/shared' + +export type MiddlewareContext = { + to: RouteLocationNormalized + from: RouteLocationNormalized + next: NavigationGuardNext +} + +export type Middleware = (context: MiddlewareContext) => any + +export const guest = async ({ next }: MiddlewareContext) => { + const isAuth = await tokenValidate() + + if (isAuth) { + return next({ + name: Routes.INDEX, + }) + } + + return next() +} + +export const auth = async ({ next }: MiddlewareContext) => { + const isAuth = await tokenValidate() + + if (!isAuth) { + return next({ + name: Routes.LOGIN, + }) + } + + return next() +} + +export const patient = ({ to, next }: MiddlewareContext) => { + if (to.params.id) { + return next() + } + + return next({ name: Routes.MY_PATIENTS }) +} diff --git a/src/app/providers/router/routes.ts b/src/app/providers/router/routes.ts new file mode 100644 index 0000000..dc1ffd2 --- /dev/null +++ b/src/app/providers/router/routes.ts @@ -0,0 +1,124 @@ +import type { RouteRecordRaw } from 'vue-router' +import { Routes } from '@/shared' +import { auth, guest, patient } from './middlewares' + +export const routes: RouteRecordRaw[] = [ + { + path: '/', + name: Routes.INDEX, + redirect: { name: Routes.MY_PATIENTS }, + meta: { + middleware: [auth], + }, + }, + { + path: '/patient/:id?', + name: Routes.PATIENT, + props: true, + component: () => import('@/pages/patient/ui/Patient/Patient.vue'), + meta: { + middleware: [auth, patient], + page: { + title: 'Пациента', + }, + }, + }, + { + path: '/my-patients', + name: Routes.MY_PATIENTS, + component: () => + import('@/pages/patients/ui/MyPatients/MyPatients.vue'), + meta: { + middleware: [auth], + page: { + title: 'Мои пациенты', + }, + }, + }, + { + path: '/requests-patients', + name: Routes.REQUESTS_PATIENTS, + component: () => + import('@/pages/patients/ui/RequestsPatients/RequestsPatients.vue'), + meta: { + middleware: [auth], + page: { + title: 'Запросы на ведение', + }, + }, + }, + { + path: '/calendar', + name: Routes.CALENDAR, + component: () => import('@/pages/calendar/ui/Calendar/Calendar.vue'), + meta: { + middleware: [auth], + page: { + title: 'Календарь', + }, + }, + }, + { + path: '/chat', + name: Routes.CHAT, + component: () => import('@/pages/chat/ui/Chat/Chat.vue'), + meta: { + middleware: [auth], + page: { + title: 'Чат', + }, + }, + }, + { + path: '/videochat', + name: Routes.VIDEOCHAT, + component: () => import('@/pages/videochat/ui/Videochat/Videochat.vue'), + meta: { + middleware: [auth], + page: { + title: 'Видеочат', + }, + }, + }, + { + path: '/library', + name: Routes.LIBRARY, + component: () => import('@/pages/library/ui/Library/Library.vue'), + meta: { + middleware: [auth], + page: { + title: 'Моя библиотека', + }, + }, + }, + { + path: '/login', + name: Routes.LOGIN, + component: () => import('@/pages/login/ui/LoginPage/LoginPage.vue'), + meta: { + middleware: [guest], + }, + }, + { + path: '/support', + name: Routes.SUPPORT, + component: () => import('@/pages/support/ui/Support/Support.vue'), + meta: { + middleware: [auth], + page: { + title: 'Поддержка', + }, + }, + }, + { + path: '/profile', + name: Routes.PROFILE, + component: () => import('@/pages/profile/ui/Profile/Profile.vue'), + meta: { + middleware: [auth], + page: { + title: 'Профиль', + }, + }, + }, +] diff --git a/src/app/styles/index.scss b/src/app/styles/index.scss new file mode 100644 index 0000000..2fc7bea --- /dev/null +++ b/src/app/styles/index.scss @@ -0,0 +1,16 @@ +@import './utils/utils'; +@import './utils/reset'; +@import './utils/common'; + +@import './utils/fonts'; +@import './utils/icons'; +@import './utils/toast'; +@import './utils/datetimepocker'; + +@import '../../shared/shared'; +@import '../../entities/entities'; +@import '../../features/features'; +@import '../../widgets/widgets'; +@import '../../pages/pages'; + +@import './utils/animations'; diff --git a/src/app/styles/utils/animations.scss b/src/app/styles/utils/animations.scss new file mode 100644 index 0000000..2341e23 --- /dev/null +++ b/src/app/styles/utils/animations.scss @@ -0,0 +1,46 @@ +// fade +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.3s ease; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +// fade-page +.fade-page-enter-active, +.fade-page-leave-active { + transition: opacity 0.5s linear !important; +} + +.fade-page-enter-from, +.fade-page-leave-to { + opacity: 0; +} + +// list +.list-item { + display: inline-block; + margin-right: 10px; +} +.list-enter-active, +.list-leave-active { + transition: all 0.3s ease; +} +.list-enter-from, +.list-leave-to { + opacity: 0; + transform: translateX(30px); +} + +@keyframes rotate360 { + 0% { + transform: rotate(0); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/src/app/styles/utils/common.scss b/src/app/styles/utils/common.scss new file mode 100644 index 0000000..c2cfabc --- /dev/null +++ b/src/app/styles/utils/common.scss @@ -0,0 +1,121 @@ +body { + font-size: toRem(14); + color: var(--dark-main); + font-family: $mainFontFamily, sans-serif; + font-weight: 400; + background-color: var(--white); + overflow-y: hidden; + position: relative; +} + +#app { + height: 100vh; +} + +img { + height: auto; + width: auto; + transition: opacity 0.3s ease; + + &[lazy='loading'] { + opacity: 0; + will-change: transform, opacity; + } + + &[lazy='error'] { + } + + &[lazy='loaded'] { + opacity: 1; + } +} + +a { + color: var(--bright-blue); + text-decoration: none; +} + +html { + font-size: 12px; +} + +input { + border: none; +} + +.scroller { + &::-webkit-scrollbar { + width: 15px; + } + + &::-webkit-scrollbar-thumb { + background: var(--dark-64); + background-clip: content-box; + border: 5px solid transparent; + border-radius: 1000px; + } +} + +.visually-hidden { + position: absolute; + overflow: hidden; + white-space: nowrap; + margin: 0; + padding: 0; + height: 1px; + width: 1px; + clip: rect(0 0 0 0); + clip-path: inset(100%); +} + +.justify-center { + justify-content: center; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-between { + justify-content: space-between; +} + +.items-center { + align-items: center; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.row { + @include row(toRem(4)); +} + +.column { + @include column(toRem(4)); +} + +.wrap { + flex-wrap: wrap; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} diff --git a/src/app/styles/utils/datetimepocker.scss b/src/app/styles/utils/datetimepocker.scss new file mode 100644 index 0000000..d29e540 --- /dev/null +++ b/src/app/styles/utils/datetimepocker.scss @@ -0,0 +1,76 @@ +@import '@vuepic/vue-datepicker/dist/main.css'; + +.dp { + $b: &; + + font-family: $mainFontFamily !important; + &__theme_light { + --dp-font-size: toRem(15); + --dp-text-color: var(--dark-main); + // --dp-background-color: var(--grey-main); + --dp-input-padding: 12px 30px 12px 12px; + --dp-icon-color: var(--brand-main); + --dp-hover-icon-color: var(--brand-main); + --dp-hover-text-color: var(--dark-main); + --dp-primary-color: var(--brand-main); + } + + &__main { + height: inherit; + display: flex; + align-items: center; + + > div { + height: inherit; + width: inherit; + } + } + + &__input { + border: none; + background-color: transparent; + + &_wrap { + height: inherit; + display: flex; + align-items: center; + } + } + + &__month_year_wrap { + font-size: toRem(17); + #{$b}__btn:last-child { + color: var(--brand-main); + } + } + + &__today { + border: none; + position: relative; + + &::after { + content: ''; + position: absolute; + width: 50%; + height: 2px; + bottom: 5px; + background: #000; + } + } + + &__calendar { + font-size: toRem(15); + &_header { + font-weight: 400; + text-transform: uppercase; + } + } + + &__container_block { + font-size: toRem(15); + } + + &__overlay_container { + font-size: toRem(15); + } +} diff --git a/src/app/styles/utils/fonts.scss b/src/app/styles/utils/fonts.scss new file mode 100644 index 0000000..b306de8 --- /dev/null +++ b/src/app/styles/utils/fonts.scss @@ -0,0 +1,6 @@ +@include newFont($mainFontFamily, 'NeueHaasUnica-Regular', 400); +@include newFont($mainFontFamily, 'NeueHaasUnica-Medium', 500); +@include newFont($mainFontFamily, 'NeueHaasUnica-Bold', 700); +@include newFont($mainFontFamily, 'NeueHaasUnica-Black', 900); + +@include newFont($decorationFontFamily, 'TinkoffSans-Bold', 700); diff --git a/src/app/styles/utils/functions.scss b/src/app/styles/utils/functions.scss new file mode 100644 index 0000000..981262e --- /dev/null +++ b/src/app/styles/utils/functions.scss @@ -0,0 +1,40 @@ +@use 'sass:math'; + +@function toRem($size) { + $remSize: math.div($size, 12) * 1rem; + + @return $remSize; +} + +@mixin fontSize($name, $options: ()) { + @each $tagName, $tagValue in $tags { + @if $tagName == $name { + $selectedTag: map-get($tags, $tagName); + $fontSize: nth($selectedTag, 1); + $lineHeight: nth($selectedTag, 2); + + font-size: $fontSize; + line-height: $lineHeight; + + @if map-get($options, weight) { + font-weight: map-get($options, weight); + } + + @if map-get($options, style) { + font-style: map-get($options, style); + } + + @if map-get($options, uppercase) { + text-transform: uppercase; + } + + @if map-get($options, letter-spacing) { + letter-spacing: map-get($options, letter-spacing); + } + + @if map-get($options, line-height) { + line-height: map-get($options, line-height); + } + } + } +} diff --git a/src/app/styles/utils/icons.scss b/src/app/styles/utils/icons.scss new file mode 100644 index 0000000..d2558a7 --- /dev/null +++ b/src/app/styles/utils/icons.scss @@ -0,0 +1,128 @@ +@font-face { + font-family: "icons"; + src: url("/fonts/icons/icons.woff?98e4dbf90127ac6ec671d6317de9533e") format("woff"), +url("/fonts/icons/icons.woff2?98e4dbf90127ac6ec671d6317de9533e") format("woff2"); +} + +i[class^="icon-"]:before, i[class*=" icon-"]:before { + font-family: icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-arrow-down:before { + content: "\f101"; +} +.icon-arrow-left:before { + content: "\f102"; +} +.icon-arrow-narrow-down:before { + content: "\f103"; +} +.icon-arrow-narrow-up-right:before { + content: "\f104"; +} +.icon-arrow-narrow-up:before { + content: "\f105"; +} +.icon-arrow-right:before { + content: "\f106"; +} +.icon-bell:before { + content: "\f107"; +} +.icon-book-open:before { + content: "\f108"; +} +.icon-calculator:before { + content: "\f109"; +} +.icon-calendar:before { + content: "\f10a"; +} +.icon-camera:before { + content: "\f10b"; +} +.icon-check-circle:before { + content: "\f10c"; +} +.icon-check-heart:before { + content: "\f10d"; +} +.icon-check:before { + content: "\f10e"; +} +.icon-clock:before { + content: "\f10f"; +} +.icon-close:before { + content: "\f110"; +} +.icon-date:before { + content: "\f111"; +} +.icon-dots-vertical:before { + content: "\f112"; +} +.icon-file:before { + content: "\f113"; +} +.icon-help-circle:before { + content: "\f114"; +} +.icon-info-circle:before { + content: "\f115"; +} +.icon-info:before { + content: "\f116"; +} +.icon-link:before { + content: "\f117"; +} +.icon-message-text:before { + content: "\f118"; +} +.icon-pencil-line:before { + content: "\f119"; +} +.icon-placeholder:before { + content: "\f11a"; +} +.icon-plus:before { + content: "\f11b"; +} +.icon-search:before { + content: "\f11c"; +} +.icon-switch-vertical:before { + content: "\f11d"; +} +.icon-trash:before { + content: "\f11e"; +} +.icon-tui-marker:before { + content: "\f11f"; +} +.icon-user-edit:before { + content: "\f120"; +} +.icon-user-plus:before { + content: "\f121"; +} +.icon-user:before { + content: "\f122"; +} +.icon-users-right:before { + content: "\f123"; +} +.icon-video-recorder:before { + content: "\f124"; +} +.icon-x-circle:before { + content: "\f125"; +} diff --git a/src/app/styles/utils/mixins.scss b/src/app/styles/utils/mixins.scss new file mode 100644 index 0000000..997e540 --- /dev/null +++ b/src/app/styles/utils/mixins.scss @@ -0,0 +1,111 @@ +@mixin newFont($family, $pathName, $weight) { + @font-face { + font-family: '#{$family}'; + src: + url('/fonts/#{$pathName}.woff2') format('woff2'), + url('/fonts/#{$pathName}.woff') format('woff'); + font-weight: #{$weight}; + font-display: swap; + } +} + +@mixin ellipsis { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; +} + +@mixin center($position: 'both') { + position: absolute; + + @if $position == 'vertical' { + top: 50%; + transform: translateY(-50%); + } @else if $position == 'horizontal' { + left: 50%; + transform: translateX(-50%); + } @else if $position == 'both' { + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } @else if $position == 'stretch' { + top: 0; + left: 0; + width: 100%; + height: 100%; + } +} + +@mixin column($gap: 0px) { + display: flex; + flex-direction: column; + gap: $gap; +} + +@mixin row($gap: 0px) { + display: flex; + flex-direction: row; + gap: $gap; +} + +@mixin responsive($breakpoint) { + @if $breakpoint == 'sm' { + @media only screen and (max-width: 576px) { + @content; + } + } + @if $breakpoint == 'md' { + @media only screen and (max-width: 768px) { + @content; + } + } + @if $breakpoint == 'lg' { + @media only screen and (max-width: 992px) { + @content; + } + } + @if $breakpoint == 'xl' { + @media only screen and (max-width: 1200px) { + @content; + } + } + @if $breakpoint == 'xxl' { + @media only screen and (max-width: 1400px) { + @content; + } + } +} + +@mixin modalBaseStyles() { + &__content { + @include center(); + @include column(); + width: toRem(490); + background-color: var(--white); + border-radius: $borderRadius24; + padding: toRem(32); + } + + &__title { + @include fontSize( + h2, + ( + weight: 500, + ) + ); + } + + &__description { + margin-top: toRem(20); + + @include fontSize(s-13); + } + + &__buttons { + display: flex; + justify-content: flex-end; + gap: toRem(12); + margin-top: toRem(24); + } +} diff --git a/src/app/styles/utils/reset.scss b/src/app/styles/utils/reset.scss new file mode 100644 index 0000000..51cd361 --- /dev/null +++ b/src/app/styles/utils/reset.scss @@ -0,0 +1,571 @@ +//** * Modern CSS Reset Tweaks * ================================================== */ +html { + -webkit-text-size-adjust: 100%; + + &:focus-within { + scroll-behavior: smooth; + } +} + +body { + text-size-adjust: 100%; + position: relative; + + width: 100%; + min-height: 100vh; + + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeSpeed; +} + +/* Box sizing normalization */ +*, +::after, +::before { + box-sizing: border-box; +} + +/* Elements that don't have a class get default styles */ +a:not([class]) { + text-decoration-skip-ink: auto; +} + +/** + * CSS Reset Tweaks + * + * http://meyerweb.com/eric/tools/css/reset/ + * v2.0-modified | 20110126 + * License: none (public domain) + */ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + font-size: 100%; + font: inherit; + margin: 0; + padding: 0; + border: 0; + vertical-align: baseline; +} + +/* make sure to set some focus styles for accessibility */ +:focus { + outline: 0; +} + +/* HTML5 display-role reset for older browsers */ +main, +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} + +ol, +ul { + list-style: none; +} + +blockquote, +q { + quotes: none; + + &:before, + &:after { + content: ''; + content: none; + } +} + +/** + * Input Reset + */ +input:required, +input { + box-shadow: none; +} + +input:-webkit-autofill, +input:-webkit-autofill:hover, +input:-webkit-autofill:focus, +input:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px white inset; +} + +input[type='search']::-webkit-search-cancel-button, +input[type='search']::-webkit-search-decoration, +input[type='search']::-webkit-search-results-button, +input[type='search']::-webkit-search-results-decoration { + -webkit-appearance: none; + -moz-appearance: none; +} + +input[type='search'] { + -webkit-appearance: none; + -moz-appearance: none; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +textarea { + overflow: auto; + vertical-align: top; + resize: vertical; +} + +input { + &:focus { + outline: none; + } +} + +/** + * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. + */ +audio, +canvas, +video { + display: inline-block; + max-width: 100%; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + */ +[hidden] { + display: none; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ +a:active, +a:hover { + outline: none; +} + +/* Make images easier to work with */ +img { + max-width: 100%; + display: inline-block; + vertical-align: middle; + height: auto; +} + +/* Make pictures easier to work with */ +picture { + display: inline-block; +} + +/** + * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +button, +html input[type='button'], +input[type='reset'], +input[type='submit'] { + -webkit-appearance: button; + cursor: pointer; + border: 0; + background: transparent; +} + +/** + * Re-set default cursor for disabled elements. + */ +button[disabled], +html input[disabled] { + cursor: default; +} + +[disabled] { + pointer-events: none; +} + +/** + * 1. Address box sizing set to content-box in IE 8/9. + */ +input[type='checkbox'], +input[type='radio'] { + padding: 0; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ +input[type='search'] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ +input[type='search']::-webkit-search-cancel-button, +input[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 3+. + */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +button { + border: 0; + background: transparent; +} + +textarea { + overflow: auto; + vertical-align: top; + resize: vertical; +} + +/** + * Remove most spacing between table cells. + */ +table { + border-collapse: collapse; + border-spacing: 0; + text-indent: 0; +} + +/** + * Based on normalize.css v8.0.1 + * github.com/necolas/normalize.css + */ +hr { + box-sizing: content-box; + overflow: visible; + background: #000; + border: 0; + height: 1px; + line-height: 0; + margin: 0; + padding: 0; + page-break-after: always; + width: 100%; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + */ +pre { + font-family: monospace, monospace; + font-size: 100%; +} + +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + text-decoration: none; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 75%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -5px; +} + +sup { + top: -5px; +} + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1; + margin: 0; + padding: 0; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner { + border-style: none; + padding: 0; + outline: 0; +} + +legend { + color: inherit; + white-space: normal; + + display: block; + border: 0; + max-width: 100%; + width: 100%; +} + +fieldset { + min-width: 0; +} + +body:not(:-moz-handler-blocked) fieldset { + display: block; +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* + * Misc + * ========================================================================== */ + +template { + display: none; +} diff --git a/src/app/styles/utils/toast.scss b/src/app/styles/utils/toast.scss new file mode 100644 index 0000000..b1789bc --- /dev/null +++ b/src/app/styles/utils/toast.scss @@ -0,0 +1,43 @@ +@import 'vue3-toastify/dist/index.css'; + +:root { + --toastify-text-color-light: var(--dark-main); + --toastify-toast-min-height: toRem(48); +} + +.Toastify { + font-family: $mainFontFamily, sans-serif; + + &__toast { + border-radius: $borderRadius8; + box-shadow: 0 4px 24px 0 rgba(0, 0, 0, 0.12); + padding: toRem(12) toRem(16); + + &-body { + margin: 0; + padding: 0; + } + + &-content { + @include fontSize(s-13); + } + + &-icon { + font-size: toRem(16); + } + + &--success { + background-color: var(--green-bg); + } + + &--error { + background-color: var(--critical-bg); + } + } + + &__close-button { + color: var(--dark-main); + font-size: toRem(24); + height: 100%; + } +} diff --git a/src/app/styles/utils/utils.scss b/src/app/styles/utils/utils.scss new file mode 100644 index 0000000..3c45ce9 --- /dev/null +++ b/src/app/styles/utils/utils.scss @@ -0,0 +1,8 @@ +@import 'functions'; + +@import 'vars/colors'; +@import 'vars/other'; +@import 'vars/spaces'; +@import 'vars/typography'; + +@import 'mixins'; diff --git a/src/app/styles/utils/vars/colors.scss b/src/app/styles/utils/vars/colors.scss new file mode 100644 index 0000000..f545af5 --- /dev/null +++ b/src/app/styles/utils/vars/colors.scss @@ -0,0 +1,71 @@ +:root { + --white: #fff; + + // main + --dark-main: #364153; + --berry-main: #ef6093; + --grey-main: #f2f5f9; + --brand-main: #a241f0; + --berry-main: #ef6093; + --orange-main: #fab619; + --purple-main: #775abf; + --green-main: #b2d677; + --critical-main: #ed6a5eff; + + //border + --grey-border: #dfe4ed; + --green-border: rgba(135, 163, 88, 1); + + //background + --green-bg: rgba(236, 244, 225, 1); + --critical-bg: #f6c2bd; + --brand-4-bg: rgba(162, 65, 240, 0.04); //#F6EEFF + --blue-20-bg: rgba(134, 200, 241, 0.2); //#f4f5fd + --purple-bg: #f6eeff; + --purple-8-bg: rgba(119, 90, 191, 0.08); + + //hover + --brand-hover: #9138d8; + --grey-hover: #eaeffa; + + //states + --berry-8: rgba(239, 96, 147, 0.08); + --dark-4: rgba(54, 65, 83, 0.04); + --dark-14: rgba(54, 65, 83, 0.14); + --dark-20: rgba(54, 65, 83, 0.2); + --berry-14: rgba(239, 96, 147, 0.14); + --berry-20: rgba(239, 96, 147, 0.2); + --dark-32: rgba(54, 65, 83, 0.32); + --green-32: rgba(206, 248, 137, 0.32); + --green-64: rgba(178, 214, 119, 0.64); + --dark-64: #364153a3; + --grey-64: #f8fafc; + --blue-20: #86c8f133; + --brand-20: rgba(162, 65, 240, 0.2); + --brand-64: rgba(162, 65, 240, 0.64); + --brand-8: rgba(162, 65, 240, 0.08); + --brand-4: rgba(162, 65, 240, 0.04); + --dark-blue: #3388bc; + --blue-14: rgba(134, 200, 241, 0.14); + --green-14: rgba(178, 214, 119, 0.14); + --green-20: rgba(178, 214, 119, 0.2); + --orange-20: rgba(255, 219, 117, 0.2); + --orange-32: rgba(255, 219, 117, 0.32); + --berry-4: rgba(239, 96, 147, 0.04); + --berry-8: rgba(239, 96, 147, 0.08); + --berry-14: rgba(239, 96, 147, 0.14); + + --text-primary: rgba(0, 0, 0, 0.8); + --day-Base-base-04: #dddfe0; + + // gradients + --brand-linear: linear-gradient(138deg, #a241f0 2.35%, #775abf 96.98%); + --ch-linear1: linear-gradient( + 112deg, + #ac52f4 0.73%, + #a9139a 33.95%, + #5a409c 104.31% + ); + + --dp-font-family: $mainFontFamily; +} diff --git a/src/app/styles/utils/vars/other.scss b/src/app/styles/utils/vars/other.scss new file mode 100644 index 0000000..370d989 --- /dev/null +++ b/src/app/styles/utils/vars/other.scss @@ -0,0 +1,11 @@ +$borderRadius2: toRem(2); +$borderRadius4: toRem(4); +$borderRadius6: toRem(6); +$borderRadius8: toRem(8); +$borderRadius10: toRem(10); +$borderRadius12: toRem(12); +$borderRadius16: toRem(16); +$borderRadius20: toRem(20); +$borderRadius24: toRem(24); + +$widthSideBar: toRem(260); diff --git a/src/app/styles/utils/vars/spaces.scss b/src/app/styles/utils/vars/spaces.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/styles/utils/vars/typography.scss b/src/app/styles/utils/vars/typography.scss new file mode 100644 index 0000000..606be41 --- /dev/null +++ b/src/app/styles/utils/vars/typography.scss @@ -0,0 +1,38 @@ +$mainFontFamily: 'NeueHaasUnicaW1G'; +$decorationFontFamily: 'Tinkoff Sans'; +$icon: 'icon', sans-serif; + +$tags: ( + h2: ( + toRem(28), + normal, + ), + h3: ( + toRem(20), + normal, + ), + b-16: ( + toRem(16), + normal, + ), + b-15: ( + toRem(15), + normal, + ), + b-14: ( + toRem(14), + normal, + ), + s-13: ( + toRem(13), + normal, + ), + s-12: ( + toRem(12), + toRem(16.5), + ), + s-11: ( + toRem(11), + toRem(16), + ), +); diff --git a/src/entities/entities.scss b/src/entities/entities.scss new file mode 100644 index 0000000..eff82bc --- /dev/null +++ b/src/entities/entities.scss @@ -0,0 +1,18 @@ +/*---------------- User Styles ------------------------*/ +@import 'user/ui/UserAvatar/UserAvatar'; + +/*---------------- Patient Styles ---------------------*/ +@import 'patient/ui/PatientRequest/PatientRequest'; +@import 'patient/ui/ProgressBar/ProgressBar'; +@import 'patient/ui/PatientSurveyCard/PatientSurveyCard'; +@import 'patient/ui/PatientHealthMatrix/PatientHealthMatrix'; +@import 'patient/ui/PatientBasicInfo/PatientBasicInfo'; +@import 'patient/ui/PatientFilesCard/PatientFilesCard'; +@import 'patient/ui/PatientReminders/PatientReminders'; +@import 'patient/ui/EditableCard/EditableCard'; +@import 'patient/ui/InitialAppointment/InitialAppointment'; +@import 'patient/ui/QuestionnaireCard/QuestionnaireCard'; +@import 'patient/ui/EmptySurvey/EmptySurvey'; +@import 'patient/ui/InitialHealthMatrix/InitialHealthMatrix'; +@import 'patient/ui/InitialPurpose/InitialPurpose'; +@import 'patient/ui/EditableInput/EditableInput'; diff --git a/src/entities/index.ts b/src/entities/index.ts new file mode 100644 index 0000000..1c89925 --- /dev/null +++ b/src/entities/index.ts @@ -0,0 +1,3 @@ +export * from './user' +export * from './patient' +export * from './medical' diff --git a/src/entities/medical/api/index.ts b/src/entities/medical/api/index.ts new file mode 100644 index 0000000..2a2e3fd --- /dev/null +++ b/src/entities/medical/api/index.ts @@ -0,0 +1,245 @@ +import type { AxiosPromise } from 'axios' +import type { + Patient, + PatientReminder, + THealthMatrix, + HealthMatrixData, + PatientAnalysis, + PatientTreatmentCourse, +} from '@/entities' +import { medicalApi } from '@/shared' +import type { + Medical, + SetSurveyData, + AddReminderData, + TreatmentCourse, + AddTreatmentCourseData, + DeleteAppointmentData, + DeleteTreatmentCourseFromPatientData, + MedicalSurvey, + ViewSurveyAnswersData, + SurveyDetail, + MedicalTest, + AddOrUpdateOptimumData, + MarkerOptimums, + AddOrUpdateAnalysisData, + TreatmentCourseData, +} from '../lib' + +/**------------------ Surveys -------------------------- */ +export const fetchSurveys = ( + search?: MedicalAPI.GET.FetchSurveys.Params, +): MedicalAPI.GET.FetchSurveys.Response => + medicalApi.get('survey', { + params: { search }, + }) + +export const setSurveysToPatient = ( + data: MedicalAPI.PUT.SetSurveysToPatient.Params, +): MedicalAPI.PUT.SetSurveysToPatient.Response => + medicalApi.put(`customer/${data.customer_id}/survey`, { + survey_ids: data.survey_ids, + }) + +export const fetchSurveyQuestions = ( + params: MedicalAPI.GET.FetchQuestionsOfSurvey.Params, +): MedicalAPI.GET.FetchQuestionsOfSurvey.Response => + medicalApi.get(`survey/${params}`) + +export const viewSurveyAnswers = ( + params: MedicalAPI.GET.FetchAnswersOfSurvey.Params, +): MedicalAPI.GET.FetchAnswersOfSurvey.Response => + medicalApi.get( + `customer/${params.customer_id}/survey/${params.survey_attemp_id}`, + ) + +/**------------------ Reminder -------------------------- */ +export const addReminderToPatient = ( + data: MedicalAPI.POST.addReminderToPatient.Params, +): MedicalAPI.POST.addReminderToPatient.Response => + medicalApi.post('eventReminder', data) + +/**------------------ Treatmen Course -------------------------- */ +export const fetchTreatmentCourse = ( + search?: MedicalAPI.GET.FetchTreatmentCourse.Params, +): MedicalAPI.GET.FetchTreatmentCourse.Response => + medicalApi.get('treatmentCourse', { + params: { search }, + }) + +export const addTreatmentCourseToPatient = ( + data: MedicalAPI.POST.AddTreatmentCourseToPatient.Params, +): MedicalAPI.POST.AddTreatmentCourseToPatient.Response => + medicalApi.post(`users/${data.user_id}/treatmentCourseUser`, data) + +export const addFileToTreatment = (data: { + user_id: number + payload: FormData +}): MedicalAPI.POST.AddTreatmentCourseToPatient.Response => + medicalApi.post(`users/${data.user_id}/treatmentCourseUser`, data.payload) + +export const fetchPatientTreatmentCourse = ( + data: MedicalAPI.GET.FetchPatientTreatmentCourse.Params, +): MedicalAPI.GET.FetchPatientTreatmentCourse.Response => + medicalApi.get(`users/${data}/treatmentCourseUser`) + +export const deleteTreatmentCourseFromPatient = ( + data: MedicalAPI.DELETE.DeleteTreatmentCourseFromPatient.Params, +): MedicalAPI.DELETE.DeleteTreatmentCourseFromPatient.Response => + medicalApi.delete( + `users/${data.user_id}/treatmentCourseUser/${data.treatment_course_id}`, + ) + +export const editTreatmentCourse = ( + data: MedicalAPI.PUT.UpdateTreatmentCourse.Params, +): MedicalAPI.PUT.UpdateTreatmentCourse.Response => + medicalApi.put( + `users/${data.user_id}/treatmentCourseUser/${data.treatment_course_id}`, + data.payload, + ) + +/**------------------ Appointment -------------------------- */ + +export const deleteAppointmentFromPatient = ( + data: MedicalAPI.DELETE.DeleteAppointmentFromPatient.Params, +): MedicalAPI.DELETE.DeleteAppointmentFromPatient.Response => + medicalApi.delete(`appointment/${data.appointment}`) + +/**------------------ Medical Test -------------------------- */ + +export const fetchMedicalTests = + (): MedicalAPI.GET.FetchAllMedicalTest.Response => + medicalApi.get('listMedicalTest') + +export const updateCustomOptimum = ( + data: MedicalAPI.POST.UpdateCustomOptimum.Params, +): MedicalAPI.POST.UpdateCustomOptimum.Response => + medicalApi.post('optimalCustom', data) + +export const addOrUpdateAnalysis = ( + data: MedicalAPI.POST.AddOrUpdateAnalysis.Params, +): MedicalAPI.POST.AddOrUpdateAnalysis.Response => + medicalApi.post(`users/${data.user_id}/analysis`, data) + +/**------------------ Health Matrix -------------------------- */ +export const updateHealthMatrixValue = ( + data: MedicalAPI.POST.UpdateHealthMatrixValue.Params, +): MedicalAPI.POST.UpdateHealthMatrixValue.Response => + medicalApi.post(`appointment/${data.appointment_id}/healthMatrix`, data) + +export namespace MedicalAPI { + export namespace GET { + export namespace FetchSurveys { + export type Params = string + export type Response = AxiosPromise<{ + data: Medical['survey_list'] + }> + } + + export namespace FetchTreatmentCourse { + export type Params = string + export type Response = AxiosPromise<{ + data: TreatmentCourse[] + }> + } + + export namespace FetchPatientTreatmentCourse { + export type Params = Patient['id'] + export type Response = AxiosPromise<{ + data: TreatmentCourse[] + }> + } + + export namespace FetchAnswersOfSurvey { + export type Params = ViewSurveyAnswersData + export type Response = AxiosPromise<{ + data: SurveyDetail + }> + } + + export namespace FetchQuestionsOfSurvey { + export type Params = MedicalSurvey['id'] + export type Response = AxiosPromise<{ + data: SurveyDetail + }> + } + + export namespace FetchAllMedicalTest { + export type Response = AxiosPromise<{ + data: MedicalTest[] + }> + } + } + + export namespace PUT { + export namespace SetSurveysToPatient { + export type Params = SetSurveyData + export type Response = AxiosPromise<{ + data: any + }> + } + + export namespace UpdateTreatmentCourse { + export type Params = TreatmentCourseData + export type Response = AxiosPromise<{ + data: PatientTreatmentCourse + }> + } + } + + export namespace POST { + export namespace addReminderToPatient { + export type Params = AddReminderData + export type Response = AxiosPromise<{ + data: PatientReminder + }> + } + + export namespace AddTreatmentCourseToPatient { + export type Params = AddTreatmentCourseData + export type Response = AxiosPromise<{ + data: any + }> + } + + export namespace UpdateCustomOptimum { + export type Params = AddOrUpdateOptimumData + export type Response = AxiosPromise<{ + data: MarkerOptimums + }> + } + + export namespace AddOrUpdateAnalysis { + export type Params = AddOrUpdateAnalysisData + export type Response = AxiosPromise<{ + data: PatientAnalysis + }> + } + export namespace UpdateHealthMatrixValue { + export type Params = HealthMatrixData + export type Response = AxiosPromise<{ + data: Maybe + }> + } + } + + export namespace DELETE { + export namespace DeleteAppointmentFromPatient { + export type Params = DeleteAppointmentData + export type Response = AxiosPromise<{ + data: { + success: boolean + data: boolean + message: null | string + } + }> + } + + export namespace DeleteTreatmentCourseFromPatient { + export type Params = DeleteTreatmentCourseFromPatientData + export type Response = AxiosPromise<{ + data: any + }> + } + } +} diff --git a/src/entities/medical/index.ts b/src/entities/medical/index.ts new file mode 100644 index 0000000..bdd8c6b --- /dev/null +++ b/src/entities/medical/index.ts @@ -0,0 +1,3 @@ +export * from './api' +export * from './lib' +export * from './model' diff --git a/src/entities/medical/lib/helpers.ts b/src/entities/medical/lib/helpers.ts new file mode 100644 index 0000000..36dd1f0 --- /dev/null +++ b/src/entities/medical/lib/helpers.ts @@ -0,0 +1,44 @@ +import type { MedicalTest, BaseAnalysisOptimumValues } from './types' + +export function setTestOptimums( + list: MedicalTest[], + patientInfo: { + age: number + sex: string + }, +): BaseAnalysisOptimumValues[] { + return list?.map(x => { + const markesLength = x.markers?.length || 0 + let optimums + let i + markers: for (i = 0; i < markesLength; i++) { + optimums = x.markers[i].optimums?.find(y => { + const ages = y.age.split('-').map(Number) + if (ages.length == 2) { + return ( + ages[0] <= patientInfo.age && + patientInfo.age <= ages[1] && + y.sex == patientInfo.sex + ) + } else if (ages.length == 1) { + return ( + ages[0] <= patientInfo.age && y.sex == patientInfo.sex + ) + } else { + return false + } + }) + + if (optimums && optimums.age) { + break markers + } + } + + return { + type: 'base', + test_id: Number(x.id), + sex: patientInfo.sex, + value: String(optimums?.age), + } + }) +} diff --git a/src/entities/medical/lib/index.ts b/src/entities/medical/lib/index.ts new file mode 100644 index 0000000..8a42fe0 --- /dev/null +++ b/src/entities/medical/lib/index.ts @@ -0,0 +1,2 @@ +export * from './types' +export * from './helpers' diff --git a/src/entities/medical/lib/types.ts b/src/entities/medical/lib/types.ts new file mode 100644 index 0000000..c7372fd --- /dev/null +++ b/src/entities/medical/lib/types.ts @@ -0,0 +1,215 @@ +import type { Appointments, Patient, PatientAnalysis } from '@/entities' + +export type Medical = { + survey_list: MedicalSurvey[] + treatment_courses: TreatmentCourse[] + patient_treatment: TreatmentCourse[] + survey: Maybe + medical_test: MedicalTest[] +} + +export type MedicalSurvey = { + id: number + title: string + description: string + questions_count: number | string +} + +export type SetSurveyData = { + customer_id: number + survey_ids: number[] +} + +export type AddReminderData = { + performer_id: number // user id + datetime: string + type: 'appointment' | 'notice' + text: string +} + +export type TreatmentCourse = { + id: number + title: string + duration: number + created_at: string | null + updated_at: string | null + nutrition: string | null + medication: string | null + buds: string | null + analysis_and_research: string | null + comment: string | null + enable: 1 | 0 +} + +export type SurveyDetail = { + id: number + title: string + description: string + questions: { + id: number + question_text: string + question_type: 'text' | 'checkbox' | 'radio' + survey_id: number + options: { + id: number + option: string + question_id: number + sort: null + is_selected?: boolean + model?: any + }[] + answers?: { + id: number + question_id: number + survey_attempt_id: number + user_id: number + answer_text: string + question_option_id: number | null + }[] + }[] +} + +export type MedicalTest = { + id: number + title: string + created_at: null | string + updated_at: null | string + unit: null | string + markers: { + id: number + name: string + list_medical_test_id: number + unit: null | string + created_at: null | string + updated_at: null | string + tip_min: null | string + tip_max: null | string + notice: null | string + optimums: MarkerOptimums[] + optimums_custom: MarkerOptimums[] + head: string[] + result: any[] + }[] +} + +// For displaying analysis +export type TestMarkers = { + id: number + name: string + list_medical_test_id: number + unit: null | string + created_at: null | string + updated_at: null | string + tip_min: null | string + tip_max: null | string + notice: null | string + optimums: MarkerOptimums | MarkerOptimums[] + optimums_custom: any[] + result?: PatientAnalysis[] +} + +export type MarkerOptimums = { + id: number + marker_id: number + sex: string + age: string + min: number + max: number + created_at: string + updated_at: string + interval?: string +} + +export type BaseAnalysisOptimumValues = { + type: 'base' | 'custom' + test_id: MedicalTest['id'] + sex: string + value: string +} + +export type AddTreatmentCourseData = { + user_id: number + appointment_id: number + treatment_course_id?: number + enabled?: boolean | number + file?: File +} + +export type DeleteAppointmentData = { + appointment: Appointments['id'] +} + +export type DeleteTreatmentCourseFromPatientData = { + user_id: Patient['id'] + treatment_course_id: TreatmentCourse['id'] +} + +export type ViewSurveyAnswersData = { + customer_id: Patient['id'] + survey_attemp_id: MedicalSurvey['id'] +} + +export type AddOrUpdateOptimumData = { + list_medical_test_id: number + marker_id: number + sex: string + age: string + min: number + max?: number +} + +export type AddOrUpdateAnalysisData = { + list_medical_test_id: number + result?: number | null + quality: string + date: string + user_id: number + marker_id: number +} + +export type HealthMatrixData = { + appointment_id: number + antecedents?: string | null + triggers?: string | null + medmators?: string | null + nutrition?: string | null + sleep?: string | null + movement?: string | null + stress?: string | null + relation?: string | null + assimilation?: string | null + assimilation_color?: string | null + energy?: string | null + energy_color?: string | null + inflammation?: string | null + inflammation_color?: string | null + structure?: string | null + structure_color?: string | null + mental?: string | null + mental_color?: string | null + communications?: string | null + communications_color?: string | null + transport?: string | null + transport_color?: string | null + detoxification?: string | null + detoxification_color?: string | null + circle_mental?: string | null + circle_spiritual?: string | null + circle_emotional?: string | null +} + +export type TreatmentCourseData = { + user_id: Patient['id'] + treatment_course_id?: TreatmentCourse['id'] + payload?: + | { + nutrition?: TreatmentCourse['nutrition'] + medication?: TreatmentCourse['medication'] + buds?: TreatmentCourse['buds'] + analysis_and_research?: TreatmentCourse['analysis_and_research'] + comment?: TreatmentCourse['comment'] + title?: TreatmentCourse['title'] + enable?: TreatmentCourse['enable'] + } + | FormData +} diff --git a/src/entities/medical/model/index.ts b/src/entities/medical/model/index.ts new file mode 100644 index 0000000..ade88eb --- /dev/null +++ b/src/entities/medical/model/index.ts @@ -0,0 +1 @@ +export * from './medical' diff --git a/src/entities/medical/model/medical.ts b/src/entities/medical/model/medical.ts new file mode 100644 index 0000000..9e914ae --- /dev/null +++ b/src/entities/medical/model/medical.ts @@ -0,0 +1,489 @@ +import { defineStore, storeToRefs } from 'pinia' +import { computed, reactive, ref } from 'vue' +import { toast } from 'vue3-toastify' +import { + addReminderToPatient, + addTreatmentCourseToPatient, + fetchMedicalTests, + editTreatmentCourse, + fetchPatientTreatmentCourse, + fetchSurveyQuestions, + fetchSurveys, + fetchTreatmentCourse, + setSurveysToPatient, + setTestOptimums, + updateCustomOptimum, + viewSurveyAnswers, + type PatientAnalysis, + addFileToTreatment, +} from '@/entities' +import { usePatientStore } from '@/entities' +import { Stores, declension } from '@/shared' +import type { + Medical, + SetSurveyData, + AddReminderData, + AddTreatmentCourseData, + ViewSurveyAnswersData, + BaseAnalysisOptimumValues, + MarkerOptimums, + AddOrUpdateOptimumData, + TreatmentCourseData, +} from '../lib' + +type MedicalState = BaseState> + +export const useMedicalStore = defineStore(Stores.MEDICAL, () => { + /** + * State + */ + + const state: MedicalState = reactive({ + data: { + survey_list: [], + treatment_courses: [], + patient_treatment: [], + survey: null, + medical_test: [], + }, + loading: false, + }) + + const currOptimums = ref([]) + const { analysisResults, infoForMedicalTest } = storeToRefs( + usePatientStore(), + ) + + /** + * Getters + */ + + const surveyList = computed(() => { + return state.data?.survey_list?.map(x => ({ + ...x, + questions_count: declension(Number(x.questions_count), [ + 'вопрос', + 'вопроса', + 'вопросов', + ]), + })) + }) + + const treatmentCourses = computed( + () => + state.data?.treatment_courses?.map(x => ({ + ...x, + duration: declension(x.duration, ['день', 'дня', 'дней']), + })), + ) + + const patientTreatments = computed(() => { + return ( + state.data?.patient_treatment?.map(x => ({ + id: x.id, + title: x.title, + })) || [] + ) + }) + + const currSurvey = computed(() => state.data?.survey) + + const medicalTestList = computed(() => { + if (state.data?.medical_test && state.data.medical_test?.length) { + const newList: any[] = [] + + state.data.medical_test.forEach((x, idx) => { + const date: Set = new Set() + const markers: any[] = [] + + x.markers?.forEach(el => { + const result: PatientAnalysis[] = [] + let optimums: MarkerOptimums | undefined + let interval: string = '' + + if (currOptimums.value[idx]['type'] == 'custom') { + optimums = el.optimums_custom?.find(x => { + return ( + String( + currOptimums.value[idx]['value'], + ).includes(x.age) && + currOptimums.value[idx].sex == x.sex + ) + }) + } else { + optimums = el.optimums?.find(x => { + return ( + String( + currOptimums.value[idx]['value'], + ).includes(x.age) && + currOptimums.value[idx].sex == x.sex + ) + }) + } + + analysisResults.value?.forEach(a => { + if (a.marker_id === el.id) { + let analysisState: string = '' + + if (a.result) { + if ( + optimums?.min && + optimums?.max && + !Number.isNaN(optimums?.min) && + !Number.isNaN(optimums?.max) + ) { + if (optimums.min > a.result) { + analysisState = 'down' + } else if ( + optimums.min <= a.result && + a.result <= optimums.max + ) { + analysisState = 'normal' + } else { + analysisState = 'up' + } + + interval = `${ + optimums?.min + '-' + optimums?.max + }` + } else if (optimums?.min) { + if (optimums.min > a.result) { + analysisState = 'down' + } else if (optimums.min == a.result) { + analysisState = 'normal' + } else { + analysisState = 'up' + } + interval = `${optimums?.min}` + } + } + + date.add(a.date) + + result.push({ + ...a, + state: analysisState, + }) + } + }) + + markers.push({ + id: el.id, + name: el.name, + unit: el.unit, + list_medical_test_id: el.list_medical_test_id, + tip_min: el.tip_min, + tip_max: el.tip_max, + notice: el.notice, + result, + optimums: { + ...optimums, + interval, + }, + }) + }) + + newList.push({ + id: x.id, + title: x.title, + unit: x.unit, + analyze_date: [...date], + markers, + }) + }) + + return newList + } else { + return [] + } + }) + + const hasCustomGetters = (testId: number, markerId: number, age: string) => + computed(() => { + const medicalTest = state.data?.medical_test.find( + x => x.id == testId, + ) + const testMarker = medicalTest?.markers.find(x => x.id == markerId) + + return testMarker?.optimums_custom.find(x => x.age == age) + }) + + const updateCurrOptimumsVal = (optimum: { + value: string + sex: string + type: 'base' | 'custom' + test_id: number + }) => { + currOptimums.value.forEach((el, idx) => { + if (el.test_id == optimum.test_id) { + currOptimums.value[idx] = { + ...optimum, + sex: + optimum.sex == 'children' + ? infoForMedicalTest.value.sex + : optimum.sex, + } + return + } + }) + } + /** + * Actions + */ + + const setSurveyList = async (search: string) => { + try { + state.loading = true + const { data } = await fetchSurveys(search) + + if (data.data && state.data?.survey_list) { + state.data.survey_list = data.data + } + } catch (e) { + console.log(e) + } + state.loading = false + } + + const setTreatmentCourseList = async (search: string) => { + try { + state.loading = true + const { data } = await fetchTreatmentCourse(search) + if (data.data?.length && state.data?.treatment_courses) { + state.data.treatment_courses = data.data + } + } catch (e: any) { + console.log('e ->', e) + } + state.loading = false + } + + const setPatientTreatmentCourseList = async (payload: number) => { + try { + state.loading = true + const { data } = await fetchPatientTreatmentCourse(payload) + + if (data.data?.length && state.data?.patient_treatment) { + state.data.patient_treatment = data.data + } + } catch (e: any) { + console.log('e ->', e) + } + state.loading = false + } + + const addDestinationToPatient = async (payload: AddTreatmentCourseData) => { + try { + state.loading = true + const { data } = await addTreatmentCourseToPatient(payload) + if (data.data) { + usePatientStore().setDataToState(data.data) + } + + toast.success('Успешно сохранено!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + state.loading = false + } + + const addFileToTreatmentCourse = async (payload: any) => { + try { + state.loading = true + const { data } = await addFileToTreatment(payload) + if (data.data) { + usePatientStore().setDataToState(data.data) + } + + toast.success('Успешно сохранено!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + state.loading = false + } + + const addSurveyToPatient = async (payload: SetSurveyData) => { + try { + state.loading = true + const { data } = await setSurveysToPatient(payload) + usePatientStore().setDataToState(data.data) + toast.success('Успешно сохранено!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + state.loading = false + } + + const addReminder = async (payload: AddReminderData) => { + try { + state.loading = true + const { data } = await addReminderToPatient(payload) + + usePatientStore().setReminderToState(data.data) + toast.success('Успешно сохранено!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + state.loading = false + } + + const viewSurvey = async (survey_id: number) => { + state.loading = true + try { + state.loading = true + const { data } = await fetchSurveyQuestions(survey_id) + if (data.data && state.data) { + state.data.survey = data.data + } + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + state.loading = false + } + + const viewSurveyResult = async (payload: ViewSurveyAnswersData) => { + try { + state.loading = true + const { data } = await viewSurveyAnswers(payload) + if (data.data && state.data) { + state.data.survey = data.data + + state.data.survey['questions'] = data.data.questions.map(x => ({ + ...x, + options: x.options.map(y => ({ + ...y, + model: y.is_selected ? y.id : '', + })), + })) + } + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + state.loading = false + } + + const setMedicalTest = async () => { + try { + state.loading = true + const { data } = await fetchMedicalTests() + if (data.data && data.data?.length && state.data?.medical_test) { + currOptimums.value = setTestOptimums( + data.data, + infoForMedicalTest.value, + ) + state.data.medical_test = data.data + } + } catch (e: any) { + console.log('e ->', e) + } + + state.loading = true + } + + /** + * только для кастомных оптимумов + * @param {AddOrUpdateOptimumData} payload + */ + const addOrUpdateCustomOptimum = async ( + payload: AddOrUpdateOptimumData, + ) => { + try { + const { data } = await updateCustomOptimum(payload) + toast.success('Успешно сохранено!') + + if (data.data && data.data?.marker_id) { + const testIdx = state.data?.medical_test.length || 0 + let markerIdx, optimumIdx, i, j + testLoop: for (i = 0; i < testIdx; i++) { + if ( + state.data?.medical_test[i]['id'] == + payload.list_medical_test_id + ) { + markerIdx = + state.data?.medical_test[i]?.markers?.length || 0 + for (j = 0; j < markerIdx; j++) { + if ( + state.data.medical_test[i]['markers'][j][ + 'id' + ] == payload.marker_id + ) { + optimumIdx = + state.data.medical_test[i]['markers'][j]?.[ + 'optimums_custom' + ]?.length || 0 + let hasOptimum = false + for (let k = 0; k < optimumIdx; k++) { + if ( + state.data.medical_test[i]['markers'][ + j + ]?.['optimums_custom'][k]['sex'] == + payload.sex && + state.data.medical_test[i]['markers'][ + j + ]?.['optimums_custom'][k]['age'] == + payload.age + ) { + state.data.medical_test[i]['markers'][ + j + ]['optimums_custom'][k] = { + ...data.data, + } + hasOptimum = true + } + } + + if (!hasOptimum) { + state.data.medical_test[i]['markers'][j][ + 'optimums_custom' + ].push({ + ...data.data, + }) + + break testLoop + } + } + } + } + } + } + } catch (e: any) { + console.log('e ->', e) + } + } + + const updateTreatmentCourse = async (payload: TreatmentCourseData) => { + try { + const { data } = await editTreatmentCourse(payload) + + if (data.data) { + usePatientStore().setTreatmentDataToState(data.data) + } + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + } + } + + return { + state, + surveyList, + currSurvey, + treatmentCourses, + patientTreatments, + medicalTestList, + currOptimums, + hasCustomGetters, + updateCurrOptimumsVal, + setSurveyList, + addSurveyToPatient, + addReminder, + setTreatmentCourseList, + addDestinationToPatient, + setPatientTreatmentCourseList, + viewSurvey, + viewSurveyResult, + setMedicalTest, + addOrUpdateCustomOptimum, + updateTreatmentCourse, + addFileToTreatmentCourse, + } +}) diff --git a/src/entities/medical/ui/index.ts b/src/entities/medical/ui/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/entities/patient/api/index.ts b/src/entities/patient/api/index.ts new file mode 100644 index 0000000..d06ae03 --- /dev/null +++ b/src/entities/patient/api/index.ts @@ -0,0 +1,180 @@ +import { type AxiosPromise } from 'axios' +import { baseApi, medicalApi } from '@/shared' +import type { + Appointments, + EditAppointmentData, + EditPatientData, + Patient, + PatientAnalysis, + PatientMediaFile, +} from '../lib' + +/**------------------ Patient -------------------------- */ +export const fetchPatients = async ({ + search, + page, + per_page, +}: PatientAPI.GET.FetchPatients.Params): PatientAPI.GET.FetchPatients.Response => { + const response = await baseApi.get( + `customer?search=${search}&page=${page}&perPage=${per_page}`, + ) + + return response.data +} + +export const fetchPatient = async ( + data: PatientAPI.GET.FetchPatient.Params, +): PatientAPI.GET.FetchPatient.Response => { + const response = await baseApi.get(`customer/${data}`) + + return response.data +} + +export const deletePatient = (data: PatientAPI.DELETE.DeletePatient.Params) => + new Promise(resolve => { + setTimeout(() => { + console.log('delete: ', data) + + resolve(data) + }, 1000) + }) + +export const editPatient = ( + data: PatientAPI.PUT.EditPatient.Params, +): PatientAPI.PUT.EditPatient.Response => + baseApi.put(`customer/${data.id}`, data) + +/**------------------ Patient Appointment -------------------------- */ +export const editPatientAppointment = ( + data: PatientAPI.PUT.EditAppointment.Params, +): PatientAPI.PUT.EditAppointment.Response => + medicalApi.put(`appointment/${data.id}`, data) + +export const addAppointmentToPatient = ( + data: PatientAPI.POST.AddAppointment.Params, +): PatientAPI.POST.AddAppointment.Response => + medicalApi.post('appointment', data) + +/**------------------ Set Avatar of Customer -------------------------- */ +export const setPatientAvatar = ( + data: PatientAPI.POST.SetAvatar.Params, +): PatientAPI.POST.SetAvatar.Response => baseApi.post('user/setAvatar', data) + +/**------------------ Media Files -------------------------- */ +export const setFilesToPatient = ( + data: PatientAPI.POST.SetFiles.Params, +): PatientAPI.POST.SetFiles.Response => + medicalApi.post(`customer/${data.customer_id}/file`, data.files) + +export const deleteMediaFile = async ( + data: PatientAPI.DELETE.DeleteFile.Params, +) => medicalApi.delete(`file/${data}`) + +/**------------------ Medical Tests -------------------------- */ + +export const fetchCustomerMedicalTest = ( + customer_id: PatientAPI.GET.FetchCustomerMedicalTests.Params, +): PatientAPI.GET.FetchCustomerMedicalTests.Response => + medicalApi.get(`users/${customer_id}/analysis`) + +/** + * Module PatientAPI + * Interfaces: + * EditPatientParams + * EditAppointmentParams + */ +interface EditPatientParams extends EditPatientData { + id: number +} + +interface EditAppointmentParams extends EditAppointmentData { + id: Appointments['id'] + user_id: Appointments['user_id'] +} +export namespace PatientAPI { + export namespace GET { + export namespace FetchPatients { + export type Params = { + page: number + per_page: number + search: string + } + export type Response = AxiosPromise> + } + + export namespace FetchPatient { + export type Params = Patient['id'] + export type Response = AxiosPromise + + // export type Response = AxiosResponse<{ + // data: Patient[] + // }> + } + + export namespace FetchCustomerMedicalTests { + export type Params = Patient['id'] + export type Response = AxiosPromise<{ + data: PatientAnalysis[] + }> + } + } + + export namespace DELETE { + export namespace DeletePatient { + export type Params = Patient['id'] + } + + export namespace DeleteFile { + export type Params = PatientMediaFile['id'] + } + } + + export namespace PUT { + export namespace EditPatient { + export type Params = EditPatientParams + export type Response = AxiosPromise<{ + data: Patient + }> + } + + export namespace EditAppointment { + export type Params = EditAppointmentParams + export type Response = AxiosPromise<{ + data: Appointments + }> + } + } + + export namespace POST { + export namespace AddAppointment { + export type Params = { + user_id: Appointments['user_id'] + } + export type Response = AxiosPromise<{ + data: { + user_id: number + updated_at: string + created_at: string + id: number + } + }> + } + + export namespace SetAvatar { + export type Params = FormData + export type Response = AxiosPromise<{ + data: Patient + }> + } + + export namespace SetFiles { + export type Params = { + customer_id: Patient['id'] + files: FormData + } + export type Response = AxiosPromise<{ + data: Patient + }> + } + } +} diff --git a/src/entities/patient/index.ts b/src/entities/patient/index.ts new file mode 100644 index 0000000..97b4aa2 --- /dev/null +++ b/src/entities/patient/index.ts @@ -0,0 +1,4 @@ +export * from './api' +export * from './ui' +export * from './lib' +export * from './model' diff --git a/src/entities/patient/lib/hooks.ts b/src/entities/patient/lib/hooks.ts new file mode 100644 index 0000000..b4aba63 --- /dev/null +++ b/src/entities/patient/lib/hooks.ts @@ -0,0 +1,65 @@ +import { onBeforeUnmount, onMounted, ref, watch } from 'vue' +import { fetchPatients } from '../api' +import type { Patient, PatientsState, PatientTableRow } from '../lib' + +export const useSearchPatient = (cb: (search: string) => void) => { + let timeout: Timeout + + const search = ref('') + + onBeforeUnmount(() => { + clearTimeout(timeout) + }) + + watch(search, value => { + clearTimeout(timeout) + + timeout = setTimeout(async () => { + await cb(value) + }, 300) + }) + + return search +} + +export const useFetchPatients = async ( + search: string = '', + page: Pagination['current_page'] = 1, + state: PatientsState, + converter: (list: Patient[]) => PatientTableRow[], +) => { + const { data } = await fetchPatients({ + page, + per_page: state.pagination.per_page, + search, + }) + + const newData = converter(data.data) + + return { + pagination: data, + data: !state.data || search ? newData : [...state.data, ...newData], + } +} + +export const useBasePatientsLoad = ( + cb: (search?: string, page?: Pagination['current_page']) => Promise, + currentPage: Pagination['current_page'], + lastPage: Pagination['last_page'], + isFirstLoad: boolean, +) => { + const loadData = async ($state: any) => { + await cb('', currentPage + 1) + if (currentPage < lastPage) { + $state.loaded() + } else { + $state.complete() + } + } + + onMounted(async () => { + if (isFirstLoad) await cb() + }) + + return loadData +} diff --git a/src/entities/patient/lib/index.ts b/src/entities/patient/lib/index.ts new file mode 100644 index 0000000..3850a8e --- /dev/null +++ b/src/entities/patient/lib/index.ts @@ -0,0 +1,2 @@ +export * from './types' +export * from './hooks' diff --git a/src/entities/patient/lib/types.ts b/src/entities/patient/lib/types.ts new file mode 100644 index 0000000..4236707 --- /dev/null +++ b/src/entities/patient/lib/types.ts @@ -0,0 +1,205 @@ +import type { LinkProps, UserBaseProps } from '@/shared' +import type { PatientRequestProps } from '../ui' + +export type Patient = { + id: number + sex: string + avatar: string + name: string + gender: Gender + anamnesis: string | null + asking: string | null + birthdate: string + children_count: number + city: string + contact: string + email: string + marital: string + profession: string + media: PatientMediaFile[] + medical_test: PatientMedicalTest[] + survey_attempts: PatientSurvey[] + files: PatientFiles[] + health_matrix: number[] + appointments: Appointments[] + event_reminder_customer: PatientReminder[] +} + +export type PatientTableRow = { + id: Patient['id'] + patient: UserBaseProps + age: number + gender: Gender + contact?: LinkProps + time?: string + actions?: boolean + type?: string + description?: string + request?: PatientRequestProps['request'] + applicationDate?: string + reminder?: string +} + +export type PatientsState = BaseStatePagination> + +export enum PatientStep { + MAIN, + QUESTIONNAIRE, + ANALYZES, + FILES, + HEALTH_MATRIX, + PURPOSE, +} + +export type PatientFiles = { + id: number + name: string + file_name: string + url: string +} + +export type PatientSurvey = { + id: number + title: string + survey_id: number + attemp: number + percent: number + answers_count: number + survey: { + id: number + title: string + questions_count: number + description: string + } +} + +export type PatientMediaFile = { + id: number + file_name: string + created_at: string +} + +export type PatientMedicalTest = { + id: number + title: string + created_at: string + unit: string | null + medical_tests: any[] +} + +export type Appointments = { + id: number + user_id: number + complaint: string + taking_medication: string + taking_bud: string + physical_activity: string + stress: string + sleep: string + bad_habits: string + conclusion: string + created_at: string + updated_at: string + treatment_course_user?: PatientTreatmentCourse + health_matrix: THealthMatrix +} + +export type THealthMatrix = { + id: number + appointment_id: number + antecedents: string | null + triggers: string | null + medmators: string | null + nutrition: string | null + sleep: string | null + movement: string | null + stress: string | null + relation: string | null + assimilation: string | null + assimilation_color: string | null + energy: string | null + energy_color: string | null + inflammation: string | null + inflammation_color: string | null + structure: string | null + structure_color: string | null + mental: string | null + mental_color: string | null + communications: string | null + communications_color: string | null + transport: string | null + transport_color: string | null + detoxification: string | null + detoxification_color: string | null + circle_mental: string | null + circle_spiritual: string | null + circle_emotional: string | null + created_at: string + updated_at: string +} + +export type EditPatientData = { + name?: string + sex?: string + city?: string + asking?: string + marital?: string + contact?: string + anamnesis?: string + birthdate?: string + profession?: string + children_count?: string +} + +export type EditAppointmentData = { + complaint?: Appointments['complaint'] + taking_medication?: Appointments['taking_medication'] + taking_bud?: Appointments['taking_bud'] + physical_activity?: Appointments['physical_activity'] + stress?: Appointments['stress'] + sleep?: Appointments['sleep'] + bad_habits?: Appointments['bad_habits'] + conclusion?: Appointments['conclusion'] +} + +export type PatientReminder = { + id: number + text: string + type: string + user_id: number + performer_id: number + datetime: string + created_at: string + updated_at: string +} + +export type PatientTreatmentCourse = { + id: number + title: string + duration: number | null + user_id: number + performer_id: number + created_at: string + updated_at: string + appointment_id: number + nutrition: string | null + medication: string + buds: string | null + analysis_and_research: string | null + comment: string | null + media: PatientFiles[] + enabled: number +} + +export type PatientAnalysis = { + id?: number + user_id: number + performer_id?: number + result: number | null + marker_id: number + quality: string + date: string + created_at?: string + updated_at?: string + state?: string +} diff --git a/src/entities/patient/model/converters/index.ts b/src/entities/patient/model/converters/index.ts new file mode 100644 index 0000000..4672991 --- /dev/null +++ b/src/entities/patient/model/converters/index.ts @@ -0,0 +1,2 @@ +export * from './patientsToMyPatients' +export * from './patientsToRequestsPatients' diff --git a/src/entities/patient/model/converters/patientsToMyPatients.ts b/src/entities/patient/model/converters/patientsToMyPatients.ts new file mode 100644 index 0000000..03c4568 --- /dev/null +++ b/src/entities/patient/model/converters/patientsToMyPatients.ts @@ -0,0 +1,20 @@ +import { dateToAge } from '@/shared' +import type { Patient, PatientTableRow } from '../../lib' + +export const patientsToMyPatients = (list: Patient[]): PatientTableRow[] => { + return list.map(item => ({ + id: item.id, + patient: { + name: item.name || '', + avatar: item.avatar || '', + }, + gender: 1, + age: dateToAge(item.birthdate), + request: item.asking || '', + reminder: 'моковые данные, с бека не приходит!!!', + contact: { + href: `tel:${item.contact || ''}`, + text: item.contact || '', + }, + })) +} diff --git a/src/entities/patient/model/converters/patientsToRequestsPatients.ts b/src/entities/patient/model/converters/patientsToRequestsPatients.ts new file mode 100644 index 0000000..db0450f --- /dev/null +++ b/src/entities/patient/model/converters/patientsToRequestsPatients.ts @@ -0,0 +1,19 @@ +import { dateToAge } from '@/shared' +import type { Patient, PatientTableRow } from '../../lib' + +export const patientsToRequestsPatients = ( + list: Patient[], +): PatientTableRow[] => { + return list.map(item => ({ + id: item.id, + patient: { + name: item.name || '', + avatar: item.avatar || '', + }, + gender: 1, + age: dateToAge(item.birthdate), + applicationDate: '2023-10-23T05:57:37.000000Z', + request: item.asking || '', + actions: true, + })) +} diff --git a/src/entities/patient/model/index.ts b/src/entities/patient/model/index.ts new file mode 100644 index 0000000..5401340 --- /dev/null +++ b/src/entities/patient/model/index.ts @@ -0,0 +1 @@ +export * from './module' diff --git a/src/entities/patient/model/module/index.ts b/src/entities/patient/model/module/index.ts new file mode 100644 index 0000000..4dd713a --- /dev/null +++ b/src/entities/patient/model/module/index.ts @@ -0,0 +1,3 @@ +export * from './my-patients' +export * from './request-patients' +export * from './patient' diff --git a/src/entities/patient/model/module/my-patients.ts b/src/entities/patient/model/module/my-patients.ts new file mode 100644 index 0000000..55da99f --- /dev/null +++ b/src/entities/patient/model/module/my-patients.ts @@ -0,0 +1,54 @@ +import { defineStore } from 'pinia' +import { reactive } from 'vue' +import { patientsToMyPatients } from '@/entities/patient/model/converters' +import { Stores } from '@/shared' +import { deletePatient } from '../../api' +import type { Patient, PatientsState } from '../../lib' +import { useFetchPatients } from '../../lib' + +export const usePatientsStore = defineStore(Stores.MY_PATIENTS, () => { + const state = reactive({ + loading: false, + data: null, + pagination: { + current_page: 1, + per_page: 10, + last_page: 1, + }, + }) + + const setMyPatients = async ( + search: string = '', + page: Pagination['current_page'] = 1, + ) => { + try { + const { data, pagination } = await useFetchPatients( + search, + page, + state, + patientsToMyPatients, + ) + + state.pagination = pagination + state.data = data + } catch (e) { + console.log(e) + } + } + + const deleteMyPatient = async (id: Patient['id']) => { + try { + await deletePatient(id) + + state.data = state.data?.filter(item => item.id !== id) + } catch (e) { + console.log(e) + } + } + + return { + state, + setMyPatients: setMyPatients, + deleteMyPatient: deleteMyPatient, + } +}) diff --git a/src/entities/patient/model/module/patient.ts b/src/entities/patient/model/module/patient.ts new file mode 100644 index 0000000..cb2afbf --- /dev/null +++ b/src/entities/patient/model/module/patient.ts @@ -0,0 +1,562 @@ +import { defineStore } from 'pinia' +import { computed, reactive, ref } from 'vue' +import { toast } from 'vue3-toastify' +import { + editPatient, + fetchPatient, + editPatientAppointment, + addAppointmentToPatient, + setPatientAvatar, + setFilesToPatient, + deleteMediaFile, + deleteAppointmentFromPatient, + deleteTreatmentCourseFromPatient, + updateHealthMatrixValue, + type DeleteTreatmentCourseFromPatientData, + fetchCustomerMedicalTest, + addOrUpdateAnalysis, + type AddOrUpdateAnalysisData, + type HealthMatrixData, +} from '@/entities' +import { + Stores, + dateToAge, + declension, + formattingDateForClient, + getTimeFromDate, + prettifyDate, +} from '@/shared' +import { + PatientStep, + type Appointments, + type EditAppointmentData, + type EditPatientData, + type Patient, + type PatientReminder, + type PatientMediaFile, + type PatientAnalysis, + type PatientTreatmentCourse, +} from '../../lib' + +type PatientState = BaseState> +export const APPOINTMENTSITEMS: { + key: + | 'taking_medication' + | 'taking_bud' + | 'physical_activity' + | 'stress' + | 'sleep' + | 'bad_habits' + | 'complaint' + name: any +}[] = [ + { + name: 'Прием медикаментов', + key: 'taking_medication', + }, + { + name: 'Прием бадов', + key: 'taking_bud', + }, + { + name: 'Физическая активность', + key: 'physical_activity', + }, + { + name: 'Стресс', + key: 'stress', + }, + { + name: 'Сон', + key: 'sleep', + }, + { + name: 'Вредные привычки', + key: 'bad_habits', + }, + { + name: 'Жалобы', + key: 'complaint', + }, +] + +export const usePatientStore = defineStore(Stores.PATIENT, () => { + /**-------- State -------------- */ + + const state = reactive({ + loading: false, + data: null, + }) + + const analysisResults = ref([]) + const idxAppointment = ref(0) + const patientStep = ref(PatientStep.MAIN) + + /**-------- Action -------------- */ + const setCurrentPatient = async (id: Patient['id']) => { + try { + state.loading = true + + const { data } = await fetchPatient(id) + state.data = data + idxAppointment.value = data?.appointments?.[0]?.id || 0 + } catch (e) { + console.log(e) + } finally { + state.loading = false + } + } + + const resetCurrentPatient = () => { + state.data = null + } + + const onEditPatient = async (payload: EditPatientData) => { + try { + const { data } = await editPatient({ + ...payload, + id: Number(state.data?.id), + }) + state.data = data.data + toast.success('Изменения сохранены !') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + state.loading = false + } + + const onEditAppointment = async (payload: EditAppointmentData) => { + try { + const { data } = await editPatientAppointment({ + ...payload, + id: Number(currAppointment.value?.id), + user_id: Number(currAppointment.value?.user_id), + }) + const appointment = data.data + let appointmentID = -1 + state.data?.appointments.forEach((el, i) => { + if (el.id == appointment.id) { + appointmentID = i + } + }) + + if (typeof appointmentID == 'number' && appointmentID > -1) { + APPOINTMENTSITEMS.forEach(elem => { + if (state.data?.appointments[appointmentID]) { + state.data.appointments[appointmentID][elem.key] = + appointment[elem.key] + } + }) + } + toast.success('Изменения сохранены!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const onCreateAppointment = async (payload: { + user_id: Appointments['user_id'] + }) => { + try { + await addAppointmentToPatient(payload) + await setCurrentPatient(payload.user_id) + toast.success('Успешно добавлено новый прием!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const onUpdateAvatar = async (payload: FormData) => { + try { + const { data } = await setPatientAvatar(payload) + if (data.data) { + state.data = data.data + } + toast.success('Изменения сохранены') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const onUploadFiles = async (payload: FormData) => { + try { + const { data } = await setFilesToPatient({ + customer_id: Number(state.data?.id), + files: payload, + }) + + if (data.data) { + state.data = data.data + } + toast.success('Файлы успешно сохранены') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const onDeleteMediaFile = async (payload: { + id: PatientMediaFile['id'] + type: 'patient' | 'treatmentCourse' + }) => { + try { + state.loading = true + + await deleteMediaFile(payload.id) + + if (payload.type == 'patient' && state.data?.media) { + const filteredMedia = state.data.media.filter( + file => file.id !== payload.id, + ) + + state.data.media = filteredMedia + } + + if (payload.type == 'treatmentCourse') { + state.data?.appointments?.forEach((app, idx) => { + if ( + app.id == currAppointment.value?.id && + state.data?.appointments[idx]?.treatment_course_user + ) { + const media = + state.data.appointments[ + idx + ].treatment_course_user?.media.filter( + x => x.id != payload.id, + ) || [] + + state.data.appointments[idx].treatment_course_user = { + analysis_and_research: + currAppointment.value.treatment_course_user + ?.analysis_and_research || '', + appointment_id: + currAppointment.value.treatment_course_user + ?.appointment_id || 0, + buds: + currAppointment.value.treatment_course_user + ?.buds || '[]', + comment: + currAppointment.value.treatment_course_user + ?.comment || '', + created_at: + currAppointment.value.treatment_course_user + ?.created_at || '', + duration: + currAppointment.value.treatment_course_user + ?.duration || 0, + enabled: + currAppointment.value.treatment_course_user + ?.enabled || 0, + id: + currAppointment.value.treatment_course_user + ?.id || 1, + media: media, + medication: + currAppointment.value.treatment_course_user + ?.medication || '[]', + nutrition: + currAppointment.value.treatment_course_user + ?.nutrition || '', + performer_id: + currAppointment.value.treatment_course_user + ?.performer_id || 1, + title: + currAppointment.value.treatment_course_user + ?.title || '', + updated_at: + currAppointment.value.treatment_course_user + ?.updated_at || '', + user_id: + currAppointment.value.treatment_course_user + ?.user_id || 1, + } + } + }) + } + + toast.success('Файл удален') + } catch (e) { + console.log(e) + + toast.error('Произошла ошибка') + } finally { + state.loading = false + } + } + + const onDeleteAppointment = async (id: Appointments['id']) => { + try { + await deleteAppointmentFromPatient({ appointment: id }) + + if (state.data?.appointments) { + state.data.appointments = state.data?.appointments.filter( + x => x.id != id, + ) + } + if (idxAppointment.value == id) { + idxAppointment.value = state.data?.appointments?.[0]?.id || 0 + } + toast.success('Прием удален') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const onDeleteTreatmentCourse = async ( + payload: DeleteTreatmentCourseFromPatientData, + ) => { + try { + await deleteTreatmentCourseFromPatient(payload) + state.data?.appointments?.forEach((app, idx) => { + if ( + app.id == currAppointment.value?.id && + state.data?.appointments[idx]?.treatment_course_user + ) { + state.data.appointments[idx].treatment_course_user = + undefined + } + }) + + toast.success('Назначения удален') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const setPatientAnalysis = async () => { + try { + if (state.data?.id) { + const { data } = await fetchCustomerMedicalTest(state.data.id) + + if (data.data && Array.isArray(data.data)) { + analysisResults.value = data.data + } + } + } catch (e: any) { + console.log('e -> ', e) + } + } + + const updatePatientAnalysisResult = async ( + payload: AddOrUpdateAnalysisData, + ) => { + try { + const { data } = await addOrUpdateAnalysis(payload) + const lenAnalysis = analysisResults.value.length + let isChanged = false + + for (let i = 0; i < lenAnalysis; i++) { + if ( + analysisResults.value[i]['marker_id'] == + payload.marker_id && + analysisResults.value[i]['date'] == payload.date + ) { + analysisResults.value[i]['result'] = Number( + data?.data?.result || payload.result, + ) + isChanged = true + break + } + } + + if (!isChanged) { + // If analysisResult has not been changed, then this is a new analysis + analysisResults.value.push(data.data) + } + } catch (e: any) { + console.log('e -> ', e) + } + } + + const updateAnalysisDate = async (payload: AddOrUpdateAnalysisData) => { + try { + const { data } = await addOrUpdateAnalysis(payload) + const lenAnalysis = analysisResults.value.length + + for (let i = 0; i < lenAnalysis; i++) { + if ( + analysisResults.value[i]['marker_id'] == + payload.marker_id && + analysisResults.value[i]['id'] == data.data.id + ) { + analysisResults.value[i] = { + ...data.data, + } + break + } + } + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const onUpdateHealthMatrix = async (payload: HealthMatrixData) => { + try { + const { data } = await updateHealthMatrixValue(payload) + if (data.data?.appointment_id) { + for (let i = 0; i < appointmentLen.value; i++) { + if ( + state.data?.appointments[i]?.health_matrix + ?.appointment_id == data.data.appointment_id + ) { + state.data.appointments[i].health_matrix = { + ...data.data, + } + } + } + } + toast.success('Изменения сохранены!') + } catch (e: any) { + toast.error(`Что-то не так! ${e?.message || ''}`) + console.log('e -> ', e) + } + } + + const setDataToState = (data: Patient) => { + state.data = data + } + + const setReminderToState = (data: PatientReminder) => { + state.data?.event_reminder_customer.push(data) + } + + const setTreatmentDataToState = (data: PatientTreatmentCourse) => { + state.data?.appointments?.forEach((app, idx) => { + if ( + app.id == currAppointment.value?.id && + state.data?.appointments[idx] + ) { + state.data.appointments[idx].treatment_course_user = data + } + }) + } + + /**-------- Getters -------------- */ + const appointmentLen = computed(() => state.data?.appointments?.length || 0) + const patientInfo = computed(() => ({ + sex: state.data?.sex || '', + name: state.data?.name || '', + city: state.data?.city || '', + avatar: state.data?.avatar || '', + marital: state.data?.marital || '', + contact: state.data?.contact || '', + birthdate: state.data?.birthdate || '', + profession: state.data?.profession || '', + children_count: state.data?.children_count || '', + birthday: prettifyDate(state.data?.birthdate) || '', + age: + declension(dateToAge(state.data?.birthdate || '0'), [ + 'год', + 'года', + 'лет', + ]) || '', + asking: state.data?.asking || '', + anamnesis: state.data?.anamnesis || '', + })) + + const analyzes = computed( + () => + state.data?.medical_test?.map(x => ({ + ...x, + created_at: prettifyDate(x.created_at), + })) || [], + ) + + const survey = computed( + () => + state.data?.survey_attempts?.map(x => ({ + id: x.id, + title: x.survey?.title, + total: x.survey?.questions_count || 0, + answers: x.answers_count || 0, + percent: x.percent, + })), + ) + + const files = computed(() => state.data?.files) + + const media = computed(() => state.data?.media) + + const matrixHealth = computed(() => state.data?.health_matrix) + + const reminders = computed( + () => + state.data?.event_reminder_customer?.map(x => ({ + id: x.id, + date: String( + formattingDateForClient(x.datetime, 'short'), + ).replace(/\./g, ''), + time: getTimeFromDate(x.datetime), + type: x.type, + name: x.text, + })), + ) + + const appointments = computed( + () => + state.data?.appointments?.map(x => ({ + id: x.id, + name: prettifyDate(x.created_at) || '', + })), + ) + + const currAppointment = computed( + () => state.data?.appointments?.find(x => x.id == idxAppointment.value), + ) + + const infoForMedicalTest = computed( + (): { + sex: string + age: number + } => ({ + sex: state.data?.sex || '', + age: dateToAge(state.data?.birthdate || '0'), + }), + ) + + const treatmentCourse = computed((): PatientTreatmentCourse | null => { + return currAppointment.value?.treatment_course_user || null + }) + + return { + state, + media, + files, + survey, + analyzes, + reminders, + patientInfo, + patientStep, + matrixHealth, + appointments, + idxAppointment, + currAppointment, + analysisResults, + infoForMedicalTest, + treatmentCourse, + setCurrentPatient, + resetCurrentPatient, + onEditPatient, + onEditAppointment, + onCreateAppointment, + setDataToState, + setReminderToState, + setTreatmentDataToState, + onUpdateAvatar, + onUploadFiles, + onDeleteMediaFile, + onDeleteAppointment, + onDeleteTreatmentCourse, + setPatientAnalysis, + updatePatientAnalysisResult, + updateAnalysisDate, + onUpdateHealthMatrix, + } +}) diff --git a/src/entities/patient/model/module/request-patients.ts b/src/entities/patient/model/module/request-patients.ts new file mode 100644 index 0000000..a448dc9 --- /dev/null +++ b/src/entities/patient/model/module/request-patients.ts @@ -0,0 +1,44 @@ +import { defineStore } from 'pinia' +import { reactive } from 'vue' +import { Stores } from '@/shared' +import { type PatientsState, useFetchPatients } from '../../lib' +import { patientsToRequestsPatients } from '../converters' + +export const useRequestPatientsStore = defineStore( + Stores.REQUEST_PATIENTS, + () => { + const state = reactive({ + loading: false, + data: null, + pagination: { + current_page: 1, + per_page: 10, + last_page: 0, + }, + }) + + const setRequestPatients = async ( + search: string = '', + page: Pagination['current_page'] = 1, + ) => { + try { + const { data, pagination } = await useFetchPatients( + search, + page, + state, + patientsToRequestsPatients, + ) + + state.pagination = pagination + state.data = data + } catch (e) { + console.log(e) + } + } + + return { + state, + setRequestPatients, + } + }, +) diff --git a/src/entities/patient/ui/EditableCard/EditableCard.scss b/src/entities/patient/ui/EditableCard/EditableCard.scss new file mode 100644 index 0000000..a2d3080 --- /dev/null +++ b/src/entities/patient/ui/EditableCard/EditableCard.scss @@ -0,0 +1,58 @@ +.editable__card { + &--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + .card { + gap: toRem(24); + } + + pre { + font-family: $mainFontFamily; + color: var(--dark-main); + @include fontSize( + s-13, + ( + line-height: 1.3, + ) + ); + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + } + + p { + color: var(--dark-64); + @include fontSize( + s-13, + ( + line-height: 1.3, + ) + ); + } + + textarea { + border: none; + overflow: auto; + outline: none; + @include fontSize( + s-13, + ( + line-height: 1.3, + ) + ); + + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + resize: none; + color: var(--dark-main); + } +} diff --git a/src/entities/patient/ui/EditableCard/EditableCard.vue b/src/entities/patient/ui/EditableCard/EditableCard.vue new file mode 100644 index 0000000..c6bcdf0 --- /dev/null +++ b/src/entities/patient/ui/EditableCard/EditableCard.vue @@ -0,0 +1,92 @@ + + diff --git a/src/entities/patient/ui/EditableCard/index.ts b/src/entities/patient/ui/EditableCard/index.ts new file mode 100644 index 0000000..73776ea --- /dev/null +++ b/src/entities/patient/ui/EditableCard/index.ts @@ -0,0 +1,3 @@ +import EditableCard, { type EditableCardProps } from './EditableCard.vue' + +export { EditableCard, type EditableCardProps } diff --git a/src/entities/patient/ui/EditableInput/EditableInput.scss b/src/entities/patient/ui/EditableInput/EditableInput.scss new file mode 100644 index 0000000..24bfd19 --- /dev/null +++ b/src/entities/patient/ui/EditableInput/EditableInput.scss @@ -0,0 +1,20 @@ +.editable-input { + display: flex; + align-items: center; + p { + @include fontSize(s-13); + cursor: pointer; + padding: toRem(8) 0; + &.empty { + text-align: center; + color: var(--dark-32); + } + } + + input { + width: 100%; + padding: toRem(6); + border: 1px solid var(--brand-main); + border-radius: $borderRadius6; + } +} diff --git a/src/entities/patient/ui/EditableInput/EditableInput.vue b/src/entities/patient/ui/EditableInput/EditableInput.vue new file mode 100644 index 0000000..bc5e3e1 --- /dev/null +++ b/src/entities/patient/ui/EditableInput/EditableInput.vue @@ -0,0 +1,43 @@ + + diff --git a/src/entities/patient/ui/EditableInput/index.ts b/src/entities/patient/ui/EditableInput/index.ts new file mode 100644 index 0000000..2d7c28e --- /dev/null +++ b/src/entities/patient/ui/EditableInput/index.ts @@ -0,0 +1,3 @@ +import EditableInput, { type EditableInputProps } from './EditableInput.vue' + +export { EditableInput, type EditableInputProps } diff --git a/src/entities/patient/ui/EmptySurvey/EmptySurvey.scss b/src/entities/patient/ui/EmptySurvey/EmptySurvey.scss new file mode 100644 index 0000000..efe809e --- /dev/null +++ b/src/entities/patient/ui/EmptySurvey/EmptySurvey.scss @@ -0,0 +1,20 @@ +.empty-survey { + aspect-ratio: 1 / 1.1; + max-height: 252px; + background: var(--brand-4-bg); + border-radius: $borderRadius20; + + &__title { + @include fontSize( + h3, + ( + weight: 500, + ) + ); + } + + &__subtitle { + @include fontSize(b-14); + text-align: center; + } +} diff --git a/src/entities/patient/ui/EmptySurvey/EmptySurvey.vue b/src/entities/patient/ui/EmptySurvey/EmptySurvey.vue new file mode 100644 index 0000000..5c85c0d --- /dev/null +++ b/src/entities/patient/ui/EmptySurvey/EmptySurvey.vue @@ -0,0 +1,11 @@ + + diff --git a/src/entities/patient/ui/EmptySurvey/index.ts b/src/entities/patient/ui/EmptySurvey/index.ts new file mode 100644 index 0000000..b9b1f65 --- /dev/null +++ b/src/entities/patient/ui/EmptySurvey/index.ts @@ -0,0 +1,3 @@ +import EmptySurvey, { type EmptySurveyProps } from './EmptySurvey.vue' + +export { EmptySurvey, type EmptySurveyProps } diff --git a/src/entities/patient/ui/InitialAppointment/InitialAppointment.scss b/src/entities/patient/ui/InitialAppointment/InitialAppointment.scss new file mode 100644 index 0000000..a1f1169 --- /dev/null +++ b/src/entities/patient/ui/InitialAppointment/InitialAppointment.scss @@ -0,0 +1,28 @@ +.initial-appointment { + aspect-ratio: 1 / 1.1; + max-height: 390px; + background: var(--brand-4-bg); + border-radius: $borderRadius20; + + &__title { + @include fontSize( + h2, + ( + weight: 500, + ) + ); + } + + &__subtitle { + max-width: 330px; + @include fontSize(b-14); + text-align: center; + } + + &__actions { + margin-top: toRem(24); + display: flex; + flex-wrap: wrap; + gap: 12px; + } +} diff --git a/src/entities/patient/ui/InitialAppointment/InitialAppointment.vue b/src/entities/patient/ui/InitialAppointment/InitialAppointment.vue new file mode 100644 index 0000000..642b3ea --- /dev/null +++ b/src/entities/patient/ui/InitialAppointment/InitialAppointment.vue @@ -0,0 +1,27 @@ + + diff --git a/src/entities/patient/ui/InitialAppointment/index.ts b/src/entities/patient/ui/InitialAppointment/index.ts new file mode 100644 index 0000000..6cc302d --- /dev/null +++ b/src/entities/patient/ui/InitialAppointment/index.ts @@ -0,0 +1,5 @@ +import InitialAppointment, { + type InitialAppointmentProps, +} from './InitialAppointment.vue' + +export { InitialAppointment, type InitialAppointmentProps } diff --git a/src/entities/patient/ui/InitialHealthMatrix/InitialHealthMatrix.scss b/src/entities/patient/ui/InitialHealthMatrix/InitialHealthMatrix.scss new file mode 100644 index 0000000..78b45a8 --- /dev/null +++ b/src/entities/patient/ui/InitialHealthMatrix/InitialHealthMatrix.scss @@ -0,0 +1,27 @@ +.initial-health-matrix { + width: 100%; + aspect-ratio: 1 / 1.1; + max-height: 413px; + background: var(--brand-4-bg); + border-radius: $borderRadius20; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + margin-top: toRem(45); + + &__title { + max-width: toRem(340); + text-align: center; + margin-bottom: toRem(24); + + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } +} diff --git a/src/entities/patient/ui/InitialHealthMatrix/InitialHealthMatrix.vue b/src/entities/patient/ui/InitialHealthMatrix/InitialHealthMatrix.vue new file mode 100644 index 0000000..043b600 --- /dev/null +++ b/src/entities/patient/ui/InitialHealthMatrix/InitialHealthMatrix.vue @@ -0,0 +1,23 @@ + + diff --git a/src/entities/patient/ui/InitialHealthMatrix/index.ts b/src/entities/patient/ui/InitialHealthMatrix/index.ts new file mode 100644 index 0000000..a66c07b --- /dev/null +++ b/src/entities/patient/ui/InitialHealthMatrix/index.ts @@ -0,0 +1,5 @@ +import InitialHealthMatrix, { + type InitialHealthMatrixProps, +} from './InitialHealthMatrix.vue' + +export { InitialHealthMatrix, type InitialHealthMatrixProps } diff --git a/src/entities/patient/ui/InitialPurpose/InitialPurpose.scss b/src/entities/patient/ui/InitialPurpose/InitialPurpose.scss new file mode 100644 index 0000000..4195ad6 --- /dev/null +++ b/src/entities/patient/ui/InitialPurpose/InitialPurpose.scss @@ -0,0 +1,24 @@ +.initial-purpose { + width: 100%; + aspect-ratio: 1 / 1.1; + max-height: 413px; + background: var(--brand-4-bg); + border-radius: $borderRadius20; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-top: toRem(45); + + &__title { + max-width: toRem(340); + text-align: center; + margin-bottom: toRem(24); + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } +} diff --git a/src/entities/patient/ui/InitialPurpose/InitialPurpose.vue b/src/entities/patient/ui/InitialPurpose/InitialPurpose.vue new file mode 100644 index 0000000..5f7a04c --- /dev/null +++ b/src/entities/patient/ui/InitialPurpose/InitialPurpose.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/entities/patient/ui/InitialPurpose/index.ts b/src/entities/patient/ui/InitialPurpose/index.ts new file mode 100644 index 0000000..d8f1e89 --- /dev/null +++ b/src/entities/patient/ui/InitialPurpose/index.ts @@ -0,0 +1,3 @@ +import InitialPurpose, { type InitialPurposeProps } from './InitialPurpose.vue' + +export { InitialPurpose, type InitialPurposeProps } diff --git a/src/entities/patient/ui/PatientBasicInfo/PatientBasicInfo.scss b/src/entities/patient/ui/PatientBasicInfo/PatientBasicInfo.scss new file mode 100644 index 0000000..eaeb7b9 --- /dev/null +++ b/src/entities/patient/ui/PatientBasicInfo/PatientBasicInfo.scss @@ -0,0 +1,21 @@ +.patient-basic-info { + .row-name { + text-align: left; + font-size: toRem(16); + margin-bottom: 2px; + } + + &__row[class$='unavailable'] { + color: var(--dark-32); + } + + table { + td, + th { + font-size: toRem(13); + line-height: toRem(20); + padding: toRem(4) 0; + vertical-align: middle; + } + } +} diff --git a/src/entities/patient/ui/PatientBasicInfo/PatientBasicInfo.vue b/src/entities/patient/ui/PatientBasicInfo/PatientBasicInfo.vue new file mode 100644 index 0000000..ccb947c --- /dev/null +++ b/src/entities/patient/ui/PatientBasicInfo/PatientBasicInfo.vue @@ -0,0 +1,133 @@ + + diff --git a/src/entities/patient/ui/PatientBasicInfo/index.ts b/src/entities/patient/ui/PatientBasicInfo/index.ts new file mode 100644 index 0000000..ed4626f --- /dev/null +++ b/src/entities/patient/ui/PatientBasicInfo/index.ts @@ -0,0 +1,5 @@ +import PatientBasicInfo, { + type PatientBasicInfoProps, +} from './PatientBasicInfo.vue' + +export { PatientBasicInfo, type PatientBasicInfoProps } diff --git a/src/entities/patient/ui/PatientFilesCard/PatientFilesCard.scss b/src/entities/patient/ui/PatientFilesCard/PatientFilesCard.scss new file mode 100644 index 0000000..89815e2 --- /dev/null +++ b/src/entities/patient/ui/PatientFilesCard/PatientFilesCard.scss @@ -0,0 +1,64 @@ +.patient-files { + &__card { + &--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &--button { + height: 20px; + font-size: toRem(13); + padding: 0; + &:hover { + background-color: white; + } + } + + .card { + gap: toRem(20); + } + + p { + font-size: toRem(13); + color: var(--dark-64); + } + } + + &__list { + padding: 0 !important; + display: flex; + flex-direction: column; + gap: toRem(10); + + &--item { + list-style: none; + display: flex; + align-items: center; + justify-content: space-between; + + .file { + display: flex; + align-items: flex-start; + @include fontSize(s-13); + color: var(--dark-main) !important; + + i { + padding: 0 toRem(8) 0 0; + } + + &-name { + width: 240px; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + border: none !important; + } + } + } + } +} diff --git a/src/entities/patient/ui/PatientFilesCard/PatientFilesCard.vue b/src/entities/patient/ui/PatientFilesCard/PatientFilesCard.vue new file mode 100644 index 0000000..e46840d --- /dev/null +++ b/src/entities/patient/ui/PatientFilesCard/PatientFilesCard.vue @@ -0,0 +1,54 @@ + + diff --git a/src/entities/patient/ui/PatientFilesCard/index.ts b/src/entities/patient/ui/PatientFilesCard/index.ts new file mode 100644 index 0000000..4788531 --- /dev/null +++ b/src/entities/patient/ui/PatientFilesCard/index.ts @@ -0,0 +1,5 @@ +import PatientFilesCard, { + type PatientFilesCardProps, +} from './PatientFilesCard.vue' + +export { PatientFilesCard, type PatientFilesCardProps } diff --git a/src/entities/patient/ui/PatientHealthMatrix/PatientHealthMatrix.scss b/src/entities/patient/ui/PatientHealthMatrix/PatientHealthMatrix.scss new file mode 100644 index 0000000..daa016a --- /dev/null +++ b/src/entities/patient/ui/PatientHealthMatrix/PatientHealthMatrix.scss @@ -0,0 +1,51 @@ +.health-matrix { + &__card { + &--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + .card { + gap: toRem(20); + } + } + + &__graph { + display: flex; + width: 100%; + overflow: hidden; + + &--item { + display: flex; + flex-direction: column; + + &:first-child .overlay { + border-radius: toRem(24) 0 0 toRem(24); + } + + &:last-child .overlay { + border-radius: 0 toRem(24) toRem(24) 0; + } + } + + .overlay { + height: toRem(24); + } + + .value { + display: block; + padding: toRem(6) 0 0; + text-align: center; + @include fontSize( + s-13, + ( + line-height: toRem(20), + ) + ); + } + } +} diff --git a/src/entities/patient/ui/PatientHealthMatrix/PatientHealthMatrix.vue b/src/entities/patient/ui/PatientHealthMatrix/PatientHealthMatrix.vue new file mode 100644 index 0000000..dbe9efd --- /dev/null +++ b/src/entities/patient/ui/PatientHealthMatrix/PatientHealthMatrix.vue @@ -0,0 +1,54 @@ + + diff --git a/src/entities/patient/ui/PatientHealthMatrix/index.ts b/src/entities/patient/ui/PatientHealthMatrix/index.ts new file mode 100644 index 0000000..7210eec --- /dev/null +++ b/src/entities/patient/ui/PatientHealthMatrix/index.ts @@ -0,0 +1,5 @@ +import PatientHealthMatrix, { + type PatientHealthMatrixProps, +} from './PatientHealthMatrix.vue' + +export { PatientHealthMatrix, type PatientHealthMatrixProps } diff --git a/src/entities/patient/ui/PatientNavigation/PatientNavigation.scss b/src/entities/patient/ui/PatientNavigation/PatientNavigation.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/entities/patient/ui/PatientNavigation/PatientNavigation.vue b/src/entities/patient/ui/PatientNavigation/PatientNavigation.vue new file mode 100644 index 0000000..dcb2eb1 --- /dev/null +++ b/src/entities/patient/ui/PatientNavigation/PatientNavigation.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/entities/patient/ui/PatientNavigation/index.ts b/src/entities/patient/ui/PatientNavigation/index.ts new file mode 100644 index 0000000..0eb8a05 --- /dev/null +++ b/src/entities/patient/ui/PatientNavigation/index.ts @@ -0,0 +1,5 @@ +import PatientNavigation, { + type PatientNavigationProps, +} from './PatientNavigation.vue' + +export { PatientNavigation, type PatientNavigationProps } diff --git a/src/entities/patient/ui/PatientReminders/PatientReminders.scss b/src/entities/patient/ui/PatientReminders/PatientReminders.scss new file mode 100644 index 0000000..e22bb8a --- /dev/null +++ b/src/entities/patient/ui/PatientReminders/PatientReminders.scss @@ -0,0 +1,69 @@ +.patient-reminders { + &__card { + &--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &--button { + height: 20px; + font-size: toRem(13); + padding: 0; + &:hover { + background-color: white; + } + } + + .card { + gap: toRem(20); + } + + p { + font-size: toRem(13); + color: var(--dark-64); + } + } + + &__list { + td, + th { + padding: toRem(8) 0; + @include fontSize( + s-13, + ( + line-height: 1.5, + ) + ); + } + + th { + padding-right: toRem(4); + } + + span { + min-width: toRem(50); + height: 20px; + display: flex; + align-items: center; + justify-content: center; + color: var(--dark-64); + } + + mark { + min-width: toRem(50); + height: 20px; + display: flex; + align-items: center; + justify-content: center; + padding: 0 toRem(4); + color: var(--dark-main); + background: var(--blue-20); + border-radius: 3px; + @include fontSize(s-13); + } + } +} diff --git a/src/entities/patient/ui/PatientReminders/PatientReminders.vue b/src/entities/patient/ui/PatientReminders/PatientReminders.vue new file mode 100644 index 0000000..5b1365c --- /dev/null +++ b/src/entities/patient/ui/PatientReminders/PatientReminders.vue @@ -0,0 +1,83 @@ + + diff --git a/src/entities/patient/ui/PatientReminders/index.ts b/src/entities/patient/ui/PatientReminders/index.ts new file mode 100644 index 0000000..6a55052 --- /dev/null +++ b/src/entities/patient/ui/PatientReminders/index.ts @@ -0,0 +1,5 @@ +import PatientReminders, { + type PatientRemindersProps, +} from './PatientReminders.vue' + +export { PatientReminders, type PatientRemindersProps } diff --git a/src/entities/patient/ui/PatientRequest/PatientRequest.scss b/src/entities/patient/ui/PatientRequest/PatientRequest.scss new file mode 100644 index 0000000..08dd3a7 --- /dev/null +++ b/src/entities/patient/ui/PatientRequest/PatientRequest.scss @@ -0,0 +1,10 @@ +.patient-request { + display: flex; + gap: toRem(6); + + &__tooltip-content { + @include column(toRem(12)); + + align-items: flex-start; + } +} diff --git a/src/entities/patient/ui/PatientRequest/PatientRequest.vue b/src/entities/patient/ui/PatientRequest/PatientRequest.vue new file mode 100644 index 0000000..a82c76f --- /dev/null +++ b/src/entities/patient/ui/PatientRequest/PatientRequest.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/entities/patient/ui/PatientRequest/index.ts b/src/entities/patient/ui/PatientRequest/index.ts new file mode 100644 index 0000000..7faca9b --- /dev/null +++ b/src/entities/patient/ui/PatientRequest/index.ts @@ -0,0 +1,3 @@ +import PatientRequest, { type PatientRequestProps } from './PatientRequest.vue' + +export { PatientRequest, type PatientRequestProps } diff --git a/src/entities/patient/ui/PatientSurveyCard/PatientSurveyCard.scss b/src/entities/patient/ui/PatientSurveyCard/PatientSurveyCard.scss new file mode 100644 index 0000000..7b4f070 --- /dev/null +++ b/src/entities/patient/ui/PatientSurveyCard/PatientSurveyCard.scss @@ -0,0 +1,39 @@ +.patient-survey { + &__card { + &--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &--button { + height: 20px; + font-size: toRem(13); + padding: 0; + &:hover { + background-color: white; + } + } + + .card { + gap: toRem(20); + } + + table { + td, + th { + font-size: toRem(13); + line-height: toRem(20); + padding: toRem(4) 0; + } + } + + p { + font-size: toRem(13); + color: var(--dark-64); + } + } +} diff --git a/src/entities/patient/ui/PatientSurveyCard/PatientSurveyCard.vue b/src/entities/patient/ui/PatientSurveyCard/PatientSurveyCard.vue new file mode 100644 index 0000000..8f85529 --- /dev/null +++ b/src/entities/patient/ui/PatientSurveyCard/PatientSurveyCard.vue @@ -0,0 +1,93 @@ + + diff --git a/src/entities/patient/ui/PatientSurveyCard/index.ts b/src/entities/patient/ui/PatientSurveyCard/index.ts new file mode 100644 index 0000000..e05154c --- /dev/null +++ b/src/entities/patient/ui/PatientSurveyCard/index.ts @@ -0,0 +1,5 @@ +import PatientSurveyCard, { + type PatientSurveyCardProps, +} from './PatientSurveyCard.vue' + +export { PatientSurveyCard, type PatientSurveyCardProps } diff --git a/src/entities/patient/ui/ProgressBar/ProgressBar.scss b/src/entities/patient/ui/ProgressBar/ProgressBar.scss new file mode 100644 index 0000000..9f33672 --- /dev/null +++ b/src/entities/patient/ui/ProgressBar/ProgressBar.scss @@ -0,0 +1,27 @@ +.progress { + display: flex; + + &.row { + flex-direction: row; + align-items: center; + gap: toRem(16); + } + + &.column { + flex-direction: column; + align-items: flex-start; + gap: toRem(8); + } + &__bar { + width: 100%; + overflow: hidden; + position: relative; + background: var(--grey-main); + } + + .value { + height: inherit; + border-radius: inherit; + background: var(--green-main); + } +} diff --git a/src/entities/patient/ui/ProgressBar/ProgressBar.vue b/src/entities/patient/ui/ProgressBar/ProgressBar.vue new file mode 100644 index 0000000..9c1ca0f --- /dev/null +++ b/src/entities/patient/ui/ProgressBar/ProgressBar.vue @@ -0,0 +1,50 @@ + + diff --git a/src/entities/patient/ui/ProgressBar/index.ts b/src/entities/patient/ui/ProgressBar/index.ts new file mode 100644 index 0000000..f120549 --- /dev/null +++ b/src/entities/patient/ui/ProgressBar/index.ts @@ -0,0 +1,3 @@ +import ProgressBar, { type ProgressBarProps } from './ProgressBar.vue' + +export { ProgressBar, type ProgressBarProps } diff --git a/src/entities/patient/ui/QuestionnaireCard/QuestionnaireCard.scss b/src/entities/patient/ui/QuestionnaireCard/QuestionnaireCard.scss new file mode 100644 index 0000000..124f075 --- /dev/null +++ b/src/entities/patient/ui/QuestionnaireCard/QuestionnaireCard.scss @@ -0,0 +1,27 @@ +.questionnaire-card { + &__title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &__subtitle { + display: block; + margin-top: toRem(8); + @include fontSize(s-13); + color: var(--dark-64); + } + + &__actions { + display: flex; + flex-wrap: wrap; + gap: toRem(20); + } + + .card { + gap: toRem(20); + } +} diff --git a/src/entities/patient/ui/QuestionnaireCard/QuestionnaireCard.vue b/src/entities/patient/ui/QuestionnaireCard/QuestionnaireCard.vue new file mode 100644 index 0000000..a715d6a --- /dev/null +++ b/src/entities/patient/ui/QuestionnaireCard/QuestionnaireCard.vue @@ -0,0 +1,42 @@ + + diff --git a/src/entities/patient/ui/QuestionnaireCard/index.ts b/src/entities/patient/ui/QuestionnaireCard/index.ts new file mode 100644 index 0000000..72d4a5b --- /dev/null +++ b/src/entities/patient/ui/QuestionnaireCard/index.ts @@ -0,0 +1,5 @@ +import QuestionnaireCard, { + type QuestionnaireCardProps, +} from './QuestionnaireCard.vue' + +export { QuestionnaireCard, type QuestionnaireCardProps } diff --git a/src/entities/patient/ui/index.ts b/src/entities/patient/ui/index.ts new file mode 100644 index 0000000..f07c96f --- /dev/null +++ b/src/entities/patient/ui/index.ts @@ -0,0 +1,15 @@ +export * from './PatientRequest' +export * from './PatientNavigation' +export * from './ProgressBar' +export * from './PatientFilesCard' +export * from './PatientHealthMatrix' +export * from './PatientBasicInfo' +export * from './PatientSurveyCard' +export * from './PatientReminders' +export * from './EditableCard' +export * from './InitialAppointment' +export * from './QuestionnaireCard' +export * from './EmptySurvey' +export * from './InitialHealthMatrix' +export * from './InitialPurpose' +export * from './EditableInput' diff --git a/src/entities/user/api/index.ts b/src/entities/user/api/index.ts new file mode 100644 index 0000000..2e90ef6 --- /dev/null +++ b/src/entities/user/api/index.ts @@ -0,0 +1,16 @@ +import type { AxiosResponse } from 'axios' +import { baseApi } from '@/shared' +import type { User } from '../lib' + +export const fetchUser = (): Promise => + baseApi.get('user') + +export namespace UserAPI { + export namespace GET { + export namespace FetchUser { + export type Response = AxiosResponse<{ + data: User + }> + } + } +} diff --git a/src/entities/user/index.ts b/src/entities/user/index.ts new file mode 100644 index 0000000..9ce2daa --- /dev/null +++ b/src/entities/user/index.ts @@ -0,0 +1,4 @@ +export * from './model' +export * from './lib' +export * from './api' +export * from './ui' diff --git a/src/entities/user/lib/index.ts b/src/entities/user/lib/index.ts new file mode 100644 index 0000000..c9f6f04 --- /dev/null +++ b/src/entities/user/lib/index.ts @@ -0,0 +1 @@ +export * from './types' diff --git a/src/entities/user/lib/types.ts b/src/entities/user/lib/types.ts new file mode 100644 index 0000000..d49c9df --- /dev/null +++ b/src/entities/user/lib/types.ts @@ -0,0 +1,24 @@ +export type User = { + id: number + name: string + email: string + birthdate: Maybe + city: Maybe + marital: Maybe + children_count: Maybe + profession: Maybe + contact: Maybe + anamnesis: Maybe + asking: Maybe + roles: UserRole[] +} + +export type UserRole = { + id: number + name: UserRoles + guard_name: number +} + +export enum UserRoles { + ADMIN = 'admin', +} diff --git a/src/entities/user/model/index.ts b/src/entities/user/model/index.ts new file mode 100644 index 0000000..5401340 --- /dev/null +++ b/src/entities/user/model/index.ts @@ -0,0 +1 @@ +export * from './module' diff --git a/src/entities/user/model/module/index.ts b/src/entities/user/model/module/index.ts new file mode 100644 index 0000000..c0f3d4b --- /dev/null +++ b/src/entities/user/model/module/index.ts @@ -0,0 +1,19 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { Stores } from '@/shared' +import { fetchUser } from '../../api' +import type { User } from '../../lib' + +export const useUserStore = defineStore(Stores.USER, () => { + const currentUser = ref>(null) + + const setCurrentUser = async () => { + const { data } = await fetchUser() + currentUser.value = data.data + } + + return { + currentUser, + setCurrentUser, + } +}) diff --git a/src/entities/user/ui/UserAvatar/UserAvatar.scss b/src/entities/user/ui/UserAvatar/UserAvatar.scss new file mode 100644 index 0000000..179a7ef --- /dev/null +++ b/src/entities/user/ui/UserAvatar/UserAvatar.scss @@ -0,0 +1,17 @@ +.user-avatar { + &__img { + width: 40px; + height: 40px; + border-radius: 50%; + cursor: pointer; + + &.noavatar { + background: var(--purple-8-bg); + cursor: pointer; + } + } + + input[type='file'] { + display: none; + } +} diff --git a/src/entities/user/ui/UserAvatar/UserAvatar.vue b/src/entities/user/ui/UserAvatar/UserAvatar.vue new file mode 100644 index 0000000..8a3726d --- /dev/null +++ b/src/entities/user/ui/UserAvatar/UserAvatar.vue @@ -0,0 +1,59 @@ + + diff --git a/src/entities/user/ui/UserAvatar/index.ts b/src/entities/user/ui/UserAvatar/index.ts new file mode 100644 index 0000000..cc724ab --- /dev/null +++ b/src/entities/user/ui/UserAvatar/index.ts @@ -0,0 +1,3 @@ +import UserAvatar, { type UserAvatarProps } from './UserAvatar.vue' + +export { UserAvatar, type UserAvatarProps } diff --git a/src/entities/user/ui/index.ts b/src/entities/user/ui/index.ts new file mode 100644 index 0000000..3cb17f5 --- /dev/null +++ b/src/entities/user/ui/index.ts @@ -0,0 +1 @@ +export * from './UserAvatar' diff --git a/src/features/auth/api/index.ts b/src/features/auth/api/index.ts new file mode 100644 index 0000000..1808718 --- /dev/null +++ b/src/features/auth/api/index.ts @@ -0,0 +1,48 @@ +import type { AxiosResponse } from 'axios' +import { fetchUser } from '@/entities' +import { type AuthData, baseApi } from '@/shared' +import type { RegistrationData } from '../model' + +export const tokenValidate = async () => { + const { data } = await fetchUser() + + // @ts-ignore + return data !== 1 +} + +export const login = ( + data: AuthAPI.POST.Login.Params, +): Promise => baseApi.post('login', data) + +export const registration = ( + data: AuthAPI.POST.Registration.Params, +): Promise => baseApi.post('register', data) + +export const logout = (): Promise => + baseApi.post('logout') + +export namespace AuthAPI { + export namespace POST { + export namespace Login { + export type Params = AuthData + export type Response = AxiosResponse<{ + data: { + access_token: string + } + }> + } + + export namespace Registration { + export type Params = RegistrationData + export type Response = AxiosResponse<{ + data: { + access_token: string + } + }> + } + + export namespace Logout { + export type Response = AxiosResponse + } + } +} diff --git a/src/features/auth/index.ts b/src/features/auth/index.ts new file mode 100644 index 0000000..3b81eef --- /dev/null +++ b/src/features/auth/index.ts @@ -0,0 +1,3 @@ +export * from './ui' +export * from './model' +export * from './api' diff --git a/src/features/auth/model/index.ts b/src/features/auth/model/index.ts new file mode 100644 index 0000000..5401340 --- /dev/null +++ b/src/features/auth/model/index.ts @@ -0,0 +1 @@ +export * from './module' diff --git a/src/features/auth/model/module/index.ts b/src/features/auth/model/module/index.ts new file mode 100644 index 0000000..7705fa0 --- /dev/null +++ b/src/features/auth/model/module/index.ts @@ -0,0 +1,85 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { useRouter } from 'vue-router' +import { toast } from 'vue3-toastify' +import { type AuthData, Routes, Stores, useJWT } from '@/shared' +import { login, logout, registration } from '../../api' + +enum MedicType { + DOCTOR = 'doctor', + NUTRITIONIST = 'nutritionist', +} + +export type EducationData = { + permission: boolean + passport: Maybe + diploma: Maybe + medicType: Maybe +} + +export type RegistrationData = AuthData & EducationData + +export const useAuthStore = defineStore(Stores.AUTH, () => { + const router = useRouter() + const loading = ref(false) + + const { removeJWT, setJWT } = useJWT() + + const onLogin = async (data: AuthData) => { + try { + loading.value = true + const res = await login(data) + + setJWT(res.data.data.access_token) + + await router.push({ name: Routes.INDEX }) + } catch (e: any) { + console.log(e.response.data.message) + + if (e.response.data.message === 'Invalid login credentials') { + toast.error('Неверные логин или пароль') + } + } finally { + loading.value = false + } + } + + const onRegistration = async (data: NonNullable) => { + try { + loading.value = true + const res = await registration(data) + + setJWT(res.data.data.access_token) + + await router.push({ name: Routes.INDEX }) + } catch (e: any) { + console.log(e.response.data.message) + + toast.error('Такой пользователь уже зарегестрирован') + } finally { + loading.value = false + } + } + + const onLogout = async () => { + try { + loading.value = true + await logout() + + removeJWT() + + await router.push({ name: Routes.LOGIN }) + } catch (e: any) { + console.log(e.response.data.message) + } finally { + loading.value = false + } + } + + return { + onLogin, + onRegistration, + onLogout, + loading, + } +}) diff --git a/src/features/auth/ui/LogIn/LogIn.scss b/src/features/auth/ui/LogIn/LogIn.scss new file mode 100644 index 0000000..10bb1dc --- /dev/null +++ b/src/features/auth/ui/LogIn/LogIn.scss @@ -0,0 +1,3 @@ +.log-in { + @include column(toRem(12)); +} diff --git a/src/features/auth/ui/LogIn/LogIn.vue b/src/features/auth/ui/LogIn/LogIn.vue new file mode 100644 index 0000000..6d68fc5 --- /dev/null +++ b/src/features/auth/ui/LogIn/LogIn.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/features/auth/ui/LogIn/index.ts b/src/features/auth/ui/LogIn/index.ts new file mode 100644 index 0000000..1733fd5 --- /dev/null +++ b/src/features/auth/ui/LogIn/index.ts @@ -0,0 +1,3 @@ +import LogIn, { type LogInProps } from './LogIn.vue' + +export { LogIn, type LogInProps } diff --git a/src/features/auth/ui/LogOut/LogOut.scss b/src/features/auth/ui/LogOut/LogOut.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/auth/ui/LogOut/LogOut.vue b/src/features/auth/ui/LogOut/LogOut.vue new file mode 100644 index 0000000..01ee4f8 --- /dev/null +++ b/src/features/auth/ui/LogOut/LogOut.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/features/auth/ui/LogOut/index.ts b/src/features/auth/ui/LogOut/index.ts new file mode 100644 index 0000000..15066e0 --- /dev/null +++ b/src/features/auth/ui/LogOut/index.ts @@ -0,0 +1,3 @@ +import LogOut, { type LogOutProps } from './LogOut.vue' + +export { LogOut, type LogOutProps } diff --git a/src/features/auth/ui/Registration/Registration.scss b/src/features/auth/ui/Registration/Registration.scss new file mode 100644 index 0000000..ab3d6f4 --- /dev/null +++ b/src/features/auth/ui/Registration/Registration.scss @@ -0,0 +1,6 @@ +@import 'steps/DataStep/DataStep'; +@import 'steps/EmailStep/EmailStep'; + +.registration { + @include column(toRem(12)); +} diff --git a/src/features/auth/ui/Registration/Registration.vue b/src/features/auth/ui/Registration/Registration.vue new file mode 100644 index 0000000..58441ec --- /dev/null +++ b/src/features/auth/ui/Registration/Registration.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/features/auth/ui/Registration/index.ts b/src/features/auth/ui/Registration/index.ts new file mode 100644 index 0000000..b0ba18a --- /dev/null +++ b/src/features/auth/ui/Registration/index.ts @@ -0,0 +1,3 @@ +import Registration, { type RegistrationProps } from './Registration.vue' + +export { Registration, type RegistrationProps } diff --git a/src/features/auth/ui/Registration/steps/DataStep/DataStep.scss b/src/features/auth/ui/Registration/steps/DataStep/DataStep.scss new file mode 100644 index 0000000..20f967f --- /dev/null +++ b/src/features/auth/ui/Registration/steps/DataStep/DataStep.scss @@ -0,0 +1,25 @@ +.data-step { + &__content, + &__files { + @include column(toRem(22)); + } + + &__medic-type { + border: 1px solid #000; + height: toRem(57); + } + + &__files { + border: 1px solid #000; + height: toRem(130); + } + + &__permission { + border: 1px solid #000; + height: toRem(27); + } + + &__button { + align-self: center; + } +} diff --git a/src/features/auth/ui/Registration/steps/DataStep/DataStep.vue b/src/features/auth/ui/Registration/steps/DataStep/DataStep.vue new file mode 100644 index 0000000..ba61e84 --- /dev/null +++ b/src/features/auth/ui/Registration/steps/DataStep/DataStep.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/features/auth/ui/Registration/steps/DataStep/index.ts b/src/features/auth/ui/Registration/steps/DataStep/index.ts new file mode 100644 index 0000000..ef1a9de --- /dev/null +++ b/src/features/auth/ui/Registration/steps/DataStep/index.ts @@ -0,0 +1,3 @@ +import DataStep, { type DataStepProps } from './DataStep.vue' + +export { DataStep, type DataStepProps } diff --git a/src/features/auth/ui/Registration/steps/EmailStep/EmailStep.scss b/src/features/auth/ui/Registration/steps/EmailStep/EmailStep.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/auth/ui/Registration/steps/EmailStep/EmailStep.vue b/src/features/auth/ui/Registration/steps/EmailStep/EmailStep.vue new file mode 100644 index 0000000..0838cbb --- /dev/null +++ b/src/features/auth/ui/Registration/steps/EmailStep/EmailStep.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/features/auth/ui/Registration/steps/EmailStep/index.ts b/src/features/auth/ui/Registration/steps/EmailStep/index.ts new file mode 100644 index 0000000..a034c9d --- /dev/null +++ b/src/features/auth/ui/Registration/steps/EmailStep/index.ts @@ -0,0 +1,3 @@ +import EmailStep, { type EmailStepProps } from './EmailStep.vue' + +export { EmailStep, type EmailStepProps } diff --git a/src/features/auth/ui/Registration/steps/index.ts b/src/features/auth/ui/Registration/steps/index.ts new file mode 100644 index 0000000..6ba7443 --- /dev/null +++ b/src/features/auth/ui/Registration/steps/index.ts @@ -0,0 +1,2 @@ +export * from './EmailStep' +export * from './DataStep' diff --git a/src/features/auth/ui/index.ts b/src/features/auth/ui/index.ts new file mode 100644 index 0000000..87d65de --- /dev/null +++ b/src/features/auth/ui/index.ts @@ -0,0 +1,3 @@ +export * from './LogOut' +export * from './LogIn' +export * from './Registration' diff --git a/src/features/features.scss b/src/features/features.scss new file mode 100644 index 0000000..0c6cc54 --- /dev/null +++ b/src/features/features.scss @@ -0,0 +1,24 @@ +@import 'auth/ui/LogIn/LogIn'; +@import 'auth/ui/LogOut/LogOut'; +@import 'auth/ui/Registration/Registration'; + +@import 'patient/ui/EditPatientAnamnesis/EditPatientAnamnesis'; +@import 'patient/ui/EditPatientAsking/EditPatientAsking'; +@import 'patient/ui/EditAppointmentItems/EditAppointmentItems'; +@import 'patient/ui/AddMediaFiles/AddMediaFiles'; +@import 'patient/ui/DeleteMediaFile/DeleteMediaFile'; +@import 'patient/ui/EditableAnalysisResult/EditableAnalysisResult'; +@import 'patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum'; +@import 'patient/ui/AddNewAnalysis/AddNewAnalysis'; +@import 'patient/ui/EditAnalysisDate/EditAnalysisDate'; + +/*------------ Medical ---------------*/ +@import 'medical/ui/MedicalCalculator/MedicalCalculator'; +@import 'patient/ui/EditHealthMatrixItems/EditHealthMatrixItems'; +@import 'patient/ui/HealthMatrixCircle/HealthMatrixCircle'; +@import 'patient/ui/AddPurpose/AddPurpose'; +@import 'patient/ui/SelectPurposeItem/SelectPurposeItem'; +@import 'patient/ui/EditTreatmentTitle/EditTreatmentTitle'; +@import 'patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse'; +@import 'patient/ui/AddPreparations/AddPreparations'; +@import 'patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles'; diff --git a/src/features/index.ts b/src/features/index.ts new file mode 100644 index 0000000..62607aa --- /dev/null +++ b/src/features/index.ts @@ -0,0 +1,3 @@ +export * from './auth' +export * from './patient' +export * from './medical' diff --git a/src/features/medical/api/index.ts b/src/features/medical/api/index.ts new file mode 100644 index 0000000..ea3d8ad --- /dev/null +++ b/src/features/medical/api/index.ts @@ -0,0 +1,33 @@ +import type { AxiosPromise } from 'axios' +import { baseApi } from '@/shared' +import type { CalculationData, CalculatorUnits } from '../lib' + +/**------------------ Medical Calculator -------------------------- */ +export const fetchCalcUnits = + (): MedicalFeaturesAPI.GET.FetchCalculatorUnits.Response => + baseApi.get('unit') + +export const calculation = ( + params: MedicalFeaturesAPI.GET.Calculation.Params, +): MedicalFeaturesAPI.GET.Calculation.Response => + baseApi.get('calculate', { + params, + }) + +export namespace MedicalFeaturesAPI { + export namespace GET { + export namespace Calculation { + export type Params = CalculationData + + export type Response = AxiosPromise<{ + data: CalculatorUnits + }> + } + + export namespace FetchCalculatorUnits { + export type Response = AxiosPromise<{ + data: any + }> + } + } +} diff --git a/src/features/medical/index.ts b/src/features/medical/index.ts new file mode 100644 index 0000000..ed7fac8 --- /dev/null +++ b/src/features/medical/index.ts @@ -0,0 +1,4 @@ +export * from './ui' +export * from './api' +export * from './model' +export * from './lib' diff --git a/src/features/medical/lib/index.ts b/src/features/medical/lib/index.ts new file mode 100644 index 0000000..c9f6f04 --- /dev/null +++ b/src/features/medical/lib/index.ts @@ -0,0 +1 @@ +export * from './types' diff --git a/src/features/medical/lib/types.ts b/src/features/medical/lib/types.ts new file mode 100644 index 0000000..ffd43d2 --- /dev/null +++ b/src/features/medical/lib/types.ts @@ -0,0 +1,12 @@ +export type CalculationData = { + unit_from: string + unit_to: string + value: string +} + +export type CalculatorUnits = { + [key: string]: { + value: number + title: string + } +} diff --git a/src/features/medical/model/calculator.ts b/src/features/medical/model/calculator.ts new file mode 100644 index 0000000..0f64f2b --- /dev/null +++ b/src/features/medical/model/calculator.ts @@ -0,0 +1,59 @@ +import { defineStore } from 'pinia' +import { computed, ref } from 'vue' +import { toast } from 'vue3-toastify' +import { calculation, fetchCalcUnits } from '@/features' +import type { CalculationData, CalculatorUnits } from '../lib' + +export const useCalculatorStore = defineStore('calculator', () => { + /** + * ----------- State ------------- + */ + const units = ref({}) + const loading = ref(false) + + /** + * ----------- Actions ------------- + */ + const setUnits = async () => { + loading.value = true + try { + const { data } = await fetchCalcUnits() + if (data.data && Object.keys(data.data).length) { + units.value = data.data + } + } catch (e: any) { + console.log('e -> ', e) + } + loading.value = false + } + + const calcValue = async (params: CalculationData) => { + loading.value = true + try { + const { data } = await calculation(params) + return data + } catch (e: any) { + toast.error(e?.error || '') + console.log('e -> ', e) + } + loading.value = false + } + + /** + * ----------- Getters ------------- + */ + + const formUnits = computed<{ key: string; title: string }[]>(() => { + return Object.keys(units.value || {}).map(x => ({ + title: units.value?.[x]?.title || '', + key: x, + })) + }) + + return { + formUnits, + loading, + setUnits, + calcValue, + } +}) diff --git a/src/features/medical/model/index.ts b/src/features/medical/model/index.ts new file mode 100644 index 0000000..bd06b67 --- /dev/null +++ b/src/features/medical/model/index.ts @@ -0,0 +1 @@ +export * from './calculator' diff --git a/src/features/medical/ui/MedicalCalculator/MedicalCalculator.scss b/src/features/medical/ui/MedicalCalculator/MedicalCalculator.scss new file mode 100644 index 0000000..76aa2bb --- /dev/null +++ b/src/features/medical/ui/MedicalCalculator/MedicalCalculator.scss @@ -0,0 +1,130 @@ +.medical-calculator { + $b: &; + + @keyframes btnAnimation { + from { + transform: rotate(0); + } + to { + transform: rotate(180); + } + } + + width: 100%; + min-width: 200px; + position: relative; + + &.show #{$b}__body { + opacity: 1; + visibility: visible; + } + + &__control { + cursor: pointer; + padding: toRem(8) toRem(16); + color: var(--brand-main); + display: flex; + align-items: center; + gap: toRem(6); + background-color: var(--brand-8); + border-radius: $borderRadius10; + } + + &__body { + border-radius: $borderRadius20; + position: absolute; + padding: toRem(32); + width: 500px; + top: 110%; + right: 0; + opacity: 0; + visibility: hidden; + + border: 1px solid var(--grey-border); + background: var(--white); + z-index: 99; + box-shadow: + 0px 0px 32px 0px rgba(0, 0, 0, 0.08), + 0px 0px 0px 0px rgba(0, 0, 0, 0.04); + transition: all 0.2s linear; + + &--title { + display: flex; + align-items: center; + gap: toRem(12); + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + + &-icon { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--brand-8); + border-radius: $borderRadius6; + } + } + + &--subtitle { + margin: toRem(16) 0 toRem(11); + @include fontSize( + s-12, + ( + line-height: toRem(16.5), + ) + ); + } + } + + &__content { + .row { + gap: toRem(24); + } + + .dropdown__menu { + z-index: 2 !important; + } + + .input { + background-color: var(--grey-64); + } + } + + &__reverse { + width: 20px; + height: 20px; + + i { + transition: transform 0.3s ease-in-out; + } + + &.clickEvent { + i { + transform: rotate(180deg); + } + } + } + + &__units { + display: flex; + flex-direction: column; + gap: toRem(8); + + &--item { + padding: toRem(9) toRem(12); + border-radius: $borderRadius6; + cursor: pointer; + transition: all 0.25 linear; + @include fontSize(s-13); + + &:hover { + background-color: var(--grey-64); + } + } + } +} diff --git a/src/features/medical/ui/MedicalCalculator/MedicalCalculator.vue b/src/features/medical/ui/MedicalCalculator/MedicalCalculator.vue new file mode 100644 index 0000000..4217790 --- /dev/null +++ b/src/features/medical/ui/MedicalCalculator/MedicalCalculator.vue @@ -0,0 +1,187 @@ + + diff --git a/src/features/medical/ui/MedicalCalculator/index.ts b/src/features/medical/ui/MedicalCalculator/index.ts new file mode 100644 index 0000000..8b00a97 --- /dev/null +++ b/src/features/medical/ui/MedicalCalculator/index.ts @@ -0,0 +1,5 @@ +import MedicalCalculator, { + type MedicalCalculatorProps, +} from './MedicalCalculator.vue' + +export { MedicalCalculator, type MedicalCalculatorProps } diff --git a/src/features/medical/ui/index.ts b/src/features/medical/ui/index.ts new file mode 100644 index 0000000..6edeae0 --- /dev/null +++ b/src/features/medical/ui/index.ts @@ -0,0 +1 @@ +export * from './MedicalCalculator' diff --git a/src/features/patient/api/index.ts b/src/features/patient/api/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/index.ts b/src/features/patient/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/features/patient/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/features/patient/model/index.ts b/src/features/patient/model/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/AddMediaFiles/AddMediaFiles.scss b/src/features/patient/ui/AddMediaFiles/AddMediaFiles.scss new file mode 100644 index 0000000..6aa543f --- /dev/null +++ b/src/features/patient/ui/AddMediaFiles/AddMediaFiles.scss @@ -0,0 +1,42 @@ +.add-media-files { + @include row(toRem(10)); + + position: relative; + justify-content: center; + align-items: center; + cursor: pointer; + border-radius: $borderRadius8; + + &--view--field { + width: toRem(381); + margin-top: toRem(24); + padding: toRem(15); + border: 1px dashed var(--brand-64, rgba(162, 65, 240, 0.64)); + + &.treatment-media { + width: 100%; + } + } + + &--view--button { + width: toRem(28); + height: toRem(28); + transition: background-color 0.3s ease; + + &:hover { + background-color: var(--brand-4); + } + } + + &__text { + text-align: center; + color: var(--brand-main, #a241f0); + font-size: toRem(15); + font-weight: 400; + line-height: 1.6; + } + + &__plus-icon { + color: var(--brand-main, #a241f0); + } +} diff --git a/src/features/patient/ui/AddMediaFiles/AddMediaFiles.vue b/src/features/patient/ui/AddMediaFiles/AddMediaFiles.vue new file mode 100644 index 0000000..f01d8b4 --- /dev/null +++ b/src/features/patient/ui/AddMediaFiles/AddMediaFiles.vue @@ -0,0 +1,98 @@ + + diff --git a/src/features/patient/ui/AddMediaFiles/index.ts b/src/features/patient/ui/AddMediaFiles/index.ts new file mode 100644 index 0000000..c98eb25 --- /dev/null +++ b/src/features/patient/ui/AddMediaFiles/index.ts @@ -0,0 +1,3 @@ +import AddMediaFiles, { type AddMediaFilesProps } from './AddMediaFiles.vue' + +export { AddMediaFiles, type AddMediaFilesProps } diff --git a/src/features/patient/ui/AddNewAnalysis/AddNewAnalysis.scss b/src/features/patient/ui/AddNewAnalysis/AddNewAnalysis.scss new file mode 100644 index 0000000..711ed81 --- /dev/null +++ b/src/features/patient/ui/AddNewAnalysis/AddNewAnalysis.scss @@ -0,0 +1,4 @@ +.add-new-analysis { + width: 100% !important; + height: 100%; +} diff --git a/src/features/patient/ui/AddNewAnalysis/AddNewAnalysis.vue b/src/features/patient/ui/AddNewAnalysis/AddNewAnalysis.vue new file mode 100644 index 0000000..7f08875 --- /dev/null +++ b/src/features/patient/ui/AddNewAnalysis/AddNewAnalysis.vue @@ -0,0 +1,54 @@ + + diff --git a/src/features/patient/ui/AddNewAnalysis/index.ts b/src/features/patient/ui/AddNewAnalysis/index.ts new file mode 100644 index 0000000..b33eac5 --- /dev/null +++ b/src/features/patient/ui/AddNewAnalysis/index.ts @@ -0,0 +1,3 @@ +import AddNewAnalysis, { type AddNewAnalysisProps } from './AddNewAnalysis.vue' + +export { AddNewAnalysis, type AddNewAnalysisProps } diff --git a/src/features/patient/ui/AddPreparations/AddPreparations.scss b/src/features/patient/ui/AddPreparations/AddPreparations.scss new file mode 100644 index 0000000..1639006 --- /dev/null +++ b/src/features/patient/ui/AddPreparations/AddPreparations.scss @@ -0,0 +1,97 @@ +.add-preparations { + .card { + gap: toRem(20); + } + + &__title { + text-transform: capitalize; + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &__list { + @include column(toRem(16)); + + &--item { + display: grid; + grid-template-columns: 170px auto 82px 16px; + gap: toRem(12); + + .item--period { + display: flex; + } + + .item--title { + display: flex; + align-items: center; + gap: toRem(8); + } + + .item--link { + position: relative; + } + } + } + + &__delete-btn { + width: 16px; + height: 16px; + color: var(--brand-main); + margin: auto; + } + + &__add--item-btn { + width: fit-content !important; + } + + .dropdown { + width: auto; + min-width: auto; + margin: auto; + + &__control { + width: auto; + align-items: center; + justify-content: flex-start; + padding: 0; + background: none; + + span { + @include fontSize(s-13); + color: var(--brand-main); + + &.empty { + color: var(--dark-32); + } + } + + i { + font-size: toRem(16); + color: var(--brand-main); + } + } + + &__menu { + right: 0; + left: auto; + padding: toRem(6); + + ul { + li { + padding: toRem(8) toRem(12); + transition: all 0.25s linear; + border-radius: $borderRadius6; + cursor: pointer; + + &:hover { + background-color: var(--grey-main); + } + } + } + } + } +} diff --git a/src/features/patient/ui/AddPreparations/AddPreparations.vue b/src/features/patient/ui/AddPreparations/AddPreparations.vue new file mode 100644 index 0000000..915f6ae --- /dev/null +++ b/src/features/patient/ui/AddPreparations/AddPreparations.vue @@ -0,0 +1,221 @@ + + diff --git a/src/features/patient/ui/AddPreparations/index.ts b/src/features/patient/ui/AddPreparations/index.ts new file mode 100644 index 0000000..0a8b688 --- /dev/null +++ b/src/features/patient/ui/AddPreparations/index.ts @@ -0,0 +1,5 @@ +import AddPreparations, { + type AddPreparationsProps, +} from './AddPreparations.vue' + +export { AddPreparations, type AddPreparationsProps } diff --git a/src/features/patient/ui/AddPurpose/AddPurpose.scss b/src/features/patient/ui/AddPurpose/AddPurpose.scss new file mode 100644 index 0000000..1bd346b --- /dev/null +++ b/src/features/patient/ui/AddPurpose/AddPurpose.scss @@ -0,0 +1,28 @@ +.add-purpose { + width: 100%; + aspect-ratio: 1 / 1.1; + max-height: 252px; + background: var(--brand-4-bg); + border-radius: $borderRadius20; + + &__title { + @include fontSize( + h3, + ( + weight: 500, + ) + ); + } + + &__subtitle { + @include fontSize(b-14); + text-align: center; + } + + &__actions { + margin-top: toRem(24); + display: flex; + flex-wrap: wrap; + gap: 12px; + } +} diff --git a/src/features/patient/ui/AddPurpose/AddPurpose.vue b/src/features/patient/ui/AddPurpose/AddPurpose.vue new file mode 100644 index 0000000..798ad2d --- /dev/null +++ b/src/features/patient/ui/AddPurpose/AddPurpose.vue @@ -0,0 +1,34 @@ + + diff --git a/src/features/patient/ui/AddPurpose/index.ts b/src/features/patient/ui/AddPurpose/index.ts new file mode 100644 index 0000000..606b0a2 --- /dev/null +++ b/src/features/patient/ui/AddPurpose/index.ts @@ -0,0 +1,3 @@ +import AddPurpose, { type AddPurposeProps } from './AddPurpose.vue' + +export { AddPurpose, type AddPurposeProps } diff --git a/src/features/patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles.scss b/src/features/patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles.scss new file mode 100644 index 0000000..fe6fc19 --- /dev/null +++ b/src/features/patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles.scss @@ -0,0 +1,44 @@ +.add-treatment-course-files { + &__card--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &__list { + padding: 0 !important; + display: flex; + flex-direction: column; + gap: toRem(10); + + &--item { + list-style: none; + display: flex; + align-items: center; + justify-content: space-between; + + .file { + display: flex; + align-items: flex-start; + @include fontSize(s-13); + color: var(--dark-main) !important; + + i { + padding: 0 toRem(8) 0 0; + } + + &-name { + width: 240px; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + border: none !important; + } + } + } + } +} diff --git a/src/features/patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles.vue b/src/features/patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles.vue new file mode 100644 index 0000000..8fcebdc --- /dev/null +++ b/src/features/patient/ui/AddTreatmentCourseFiles/AddTreatmentCourseFiles.vue @@ -0,0 +1,51 @@ + + diff --git a/src/features/patient/ui/AddTreatmentCourseFiles/index.ts b/src/features/patient/ui/AddTreatmentCourseFiles/index.ts new file mode 100644 index 0000000..acbbef5 --- /dev/null +++ b/src/features/patient/ui/AddTreatmentCourseFiles/index.ts @@ -0,0 +1,5 @@ +import AddTreatmentCourseFiles, { + type AddTreatmentCourseFilesProps, +} from './AddTreatmentCourseFiles.vue' + +export { AddTreatmentCourseFiles, type AddTreatmentCourseFilesProps } diff --git a/src/features/patient/ui/DeleteMediaFile/DeleteMediaFile.scss b/src/features/patient/ui/DeleteMediaFile/DeleteMediaFile.scss new file mode 100644 index 0000000..a9cf455 --- /dev/null +++ b/src/features/patient/ui/DeleteMediaFile/DeleteMediaFile.scss @@ -0,0 +1,5 @@ +.delete-media-file { + &:hover { + background-color: var(--grey-64); + } +} diff --git a/src/features/patient/ui/DeleteMediaFile/DeleteMediaFile.vue b/src/features/patient/ui/DeleteMediaFile/DeleteMediaFile.vue new file mode 100644 index 0000000..b1e5bd7 --- /dev/null +++ b/src/features/patient/ui/DeleteMediaFile/DeleteMediaFile.vue @@ -0,0 +1,50 @@ + + diff --git a/src/features/patient/ui/DeleteMediaFile/index.ts b/src/features/patient/ui/DeleteMediaFile/index.ts new file mode 100644 index 0000000..4edf844 --- /dev/null +++ b/src/features/patient/ui/DeleteMediaFile/index.ts @@ -0,0 +1,5 @@ +import DeleteMediaFile, { + type DeleteMediaFileProps, +} from './DeleteMediaFile.vue' + +export { DeleteMediaFile, type DeleteMediaFileProps } diff --git a/src/features/patient/ui/DeleteTreatmentCourse/DeleteTreatmentCourse.scss b/src/features/patient/ui/DeleteTreatmentCourse/DeleteTreatmentCourse.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/DeleteTreatmentCourse/DeleteTreatmentCourse.vue b/src/features/patient/ui/DeleteTreatmentCourse/DeleteTreatmentCourse.vue new file mode 100644 index 0000000..2a322a5 --- /dev/null +++ b/src/features/patient/ui/DeleteTreatmentCourse/DeleteTreatmentCourse.vue @@ -0,0 +1,29 @@ + + diff --git a/src/features/patient/ui/DeleteTreatmentCourse/index.ts b/src/features/patient/ui/DeleteTreatmentCourse/index.ts new file mode 100644 index 0000000..7f42afa --- /dev/null +++ b/src/features/patient/ui/DeleteTreatmentCourse/index.ts @@ -0,0 +1,5 @@ +import DeleteTreatmentCourse, { + type DeleteTreatmentCourseProps, +} from './DeleteTreatmentCourse.vue' + +export { DeleteTreatmentCourse, type DeleteTreatmentCourseProps } diff --git a/src/features/patient/ui/EditAnalysisDate/EditAnalysisDate.scss b/src/features/patient/ui/EditAnalysisDate/EditAnalysisDate.scss new file mode 100644 index 0000000..8df0d5a --- /dev/null +++ b/src/features/patient/ui/EditAnalysisDate/EditAnalysisDate.scss @@ -0,0 +1,24 @@ +.edit-analysis-date { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + + &__value { + padding: toRem(12) toRem(12) toRem(12) 0; + } + + &__empty { + padding: toRem(12) toRem(12) toRem(12) 0; + color: var(--dark-32); + } + + &__input { + width: 100%; + padding: toRem(6); + margin: toRem(6) 0; + border: 1px solid var(--brand-main); + border-radius: $borderRadius6; + } +} diff --git a/src/features/patient/ui/EditAnalysisDate/EditAnalysisDate.vue b/src/features/patient/ui/EditAnalysisDate/EditAnalysisDate.vue new file mode 100644 index 0000000..e1c426f --- /dev/null +++ b/src/features/patient/ui/EditAnalysisDate/EditAnalysisDate.vue @@ -0,0 +1,94 @@ + + diff --git a/src/features/patient/ui/EditAnalysisDate/index.ts b/src/features/patient/ui/EditAnalysisDate/index.ts new file mode 100644 index 0000000..308e6f5 --- /dev/null +++ b/src/features/patient/ui/EditAnalysisDate/index.ts @@ -0,0 +1,5 @@ +import EditAnalysisDate, { + type EditAnalysisDateProps, +} from './EditAnalysisDate.vue' + +export { EditAnalysisDate, type EditAnalysisDateProps } diff --git a/src/features/patient/ui/EditAppointmentItems/EditAppointmentItems.scss b/src/features/patient/ui/EditAppointmentItems/EditAppointmentItems.scss new file mode 100644 index 0000000..23affe8 --- /dev/null +++ b/src/features/patient/ui/EditAppointmentItems/EditAppointmentItems.scss @@ -0,0 +1,2 @@ +.edit-appointment-items { +} diff --git a/src/features/patient/ui/EditAppointmentItems/EditAppointmentItems.vue b/src/features/patient/ui/EditAppointmentItems/EditAppointmentItems.vue new file mode 100644 index 0000000..8d47686 --- /dev/null +++ b/src/features/patient/ui/EditAppointmentItems/EditAppointmentItems.vue @@ -0,0 +1,20 @@ + + diff --git a/src/features/patient/ui/EditAppointmentItems/index.ts b/src/features/patient/ui/EditAppointmentItems/index.ts new file mode 100644 index 0000000..fcd0c22 --- /dev/null +++ b/src/features/patient/ui/EditAppointmentItems/index.ts @@ -0,0 +1,5 @@ +import EditAppointmentItems, { + type EditAppointmentItemsProps, +} from './EditAppointmentItems.vue' + +export { EditAppointmentItems, type EditAppointmentItemsProps } diff --git a/src/features/patient/ui/EditHealthMatrixItems/EditHealthMatrixItems.scss b/src/features/patient/ui/EditHealthMatrixItems/EditHealthMatrixItems.scss new file mode 100644 index 0000000..d8a27f8 --- /dev/null +++ b/src/features/patient/ui/EditHealthMatrixItems/EditHealthMatrixItems.scss @@ -0,0 +1,134 @@ +.edit-health-matrix-items { + --matrix-item-bg-color: var(--grey-64); + --matrix-item-border-color: var(--dark-main); + --matrix-item-hover-color: var(--dark-4); + + &.view-good { + --matrix-item-bg-color: var(--green-14); + --matrix-item-border-color: var(--green-main); + --matrix-item-hover-color: var(--green-20); + } + + &.view-normal { + --matrix-item-bg-color: var(--orange-20); + --matrix-item-border-color: var(--orange-main); + --matrix-item-hover-color: var(--orange-32); + } + + &.view-bad { + --matrix-item-bg-color: var(--berry-8); + --matrix-item-border-color: var(--berry-main); + --matrix-item-hover-color: var(--berry-4); + } + + width: 100%; + height: 100%; + padding: toRem(16); + background-color: var(--matrix-item-bg-color); + border-radius: $borderRadius12; + display: flex; + flex-direction: column; + gap: toRem(12); + + &__title { + @include fontSize( + b-14, + ( + weight: 500, + ) + ); + line-height: toRem(21); + } + + &__header { + display: flex; + align-items: center; + gap: toRem(3); + + .tooltip__content { + padding: toRem(12); + width: 196px; + } + + .space { + flex-grow: 1; + } + + .dropdown { + width: auto; + min-width: 0; + + &__control { + padding: 0; + gap: toRem(4); + background: none; + } + + &__menu { + width: 178px; + right: 0; + left: auto; + padding: toRem(12); + } + } + } + + &__body { + flex-grow: 1; + + &--text { + height: 100%; + padding: toRem(4) toRem(6); + border-radius: $borderRadius6; + transition: all 0.3s linear; + cursor: pointer; + + &:hover { + background-color: var(--matrix-item-hover-color); + } + .empty { + color: var(--dark-32); + @include fontSize(s-12); + } + + pre { + font-family: $mainFontFamily; + color: var(--dark-main); + @include fontSize( + s-12, + ( + line-height: 1.2, + ) + ); + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; + } + } + + &--input { + width: 100%; + height: 100%; + min-height: 58px; + border: none; + overflow: auto; + outline: none; + @include fontSize( + s-12, + ( + line-height: 1.3, + ) + ); + + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + resize: none; + border-radius: $borderRadius6; + border: 1px solid var(--matrix-item-border-color); + padding: toRem(4) toRem(6); + } + } +} diff --git a/src/features/patient/ui/EditHealthMatrixItems/EditHealthMatrixItems.vue b/src/features/patient/ui/EditHealthMatrixItems/EditHealthMatrixItems.vue new file mode 100644 index 0000000..ae2fca1 --- /dev/null +++ b/src/features/patient/ui/EditHealthMatrixItems/EditHealthMatrixItems.vue @@ -0,0 +1,142 @@ + + diff --git a/src/features/patient/ui/EditHealthMatrixItems/index.ts b/src/features/patient/ui/EditHealthMatrixItems/index.ts new file mode 100644 index 0000000..1edd5e0 --- /dev/null +++ b/src/features/patient/ui/EditHealthMatrixItems/index.ts @@ -0,0 +1,5 @@ +import EditHealthMatrixItems, { + type EditHealthMatrixItemsProps, +} from './EditHealthMatrixItems.vue' + +export { EditHealthMatrixItems, type EditHealthMatrixItemsProps } diff --git a/src/features/patient/ui/EditPatientAnamnesis/EditPatientAnamnesis.scss b/src/features/patient/ui/EditPatientAnamnesis/EditPatientAnamnesis.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/EditPatientAnamnesis/EditPatientAnamnesis.vue b/src/features/patient/ui/EditPatientAnamnesis/EditPatientAnamnesis.vue new file mode 100644 index 0000000..0429152 --- /dev/null +++ b/src/features/patient/ui/EditPatientAnamnesis/EditPatientAnamnesis.vue @@ -0,0 +1,20 @@ + + diff --git a/src/features/patient/ui/EditPatientAnamnesis/index.ts b/src/features/patient/ui/EditPatientAnamnesis/index.ts new file mode 100644 index 0000000..e3705f7 --- /dev/null +++ b/src/features/patient/ui/EditPatientAnamnesis/index.ts @@ -0,0 +1,5 @@ +import EditPatientAnamnesis, { + type EditPatientAnamnesisProps, +} from './EditPatientAnamnesis.vue' + +export { EditPatientAnamnesis, type EditPatientAnamnesisProps } diff --git a/src/features/patient/ui/EditPatientAsking/EditPatientAsking.scss b/src/features/patient/ui/EditPatientAsking/EditPatientAsking.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/EditPatientAsking/EditPatientAsking.vue b/src/features/patient/ui/EditPatientAsking/EditPatientAsking.vue new file mode 100644 index 0000000..c7e2b73 --- /dev/null +++ b/src/features/patient/ui/EditPatientAsking/EditPatientAsking.vue @@ -0,0 +1,22 @@ + + diff --git a/src/features/patient/ui/EditPatientAsking/index.ts b/src/features/patient/ui/EditPatientAsking/index.ts new file mode 100644 index 0000000..a72d01e --- /dev/null +++ b/src/features/patient/ui/EditPatientAsking/index.ts @@ -0,0 +1,5 @@ +import EditPatientAsking, { + type EditPatientAskingProps, +} from './EditPatientAsking.vue' + +export { EditPatientAsking, type EditPatientAskingProps } diff --git a/src/features/patient/ui/EditTreatmentItems/EditTreatmentItems.scss b/src/features/patient/ui/EditTreatmentItems/EditTreatmentItems.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/EditTreatmentItems/EditTreatmentItems.vue b/src/features/patient/ui/EditTreatmentItems/EditTreatmentItems.vue new file mode 100644 index 0000000..b7f280d --- /dev/null +++ b/src/features/patient/ui/EditTreatmentItems/EditTreatmentItems.vue @@ -0,0 +1,32 @@ + + diff --git a/src/features/patient/ui/EditTreatmentItems/index.ts b/src/features/patient/ui/EditTreatmentItems/index.ts new file mode 100644 index 0000000..8187389 --- /dev/null +++ b/src/features/patient/ui/EditTreatmentItems/index.ts @@ -0,0 +1,5 @@ +import EditTreatmentItems, { + type EditTreatmentItemsProps, +} from './EditTreatmentItems.vue' + +export { EditTreatmentItems, type EditTreatmentItemsProps } diff --git a/src/features/patient/ui/EditTreatmentTitle/EditTreatmentTitle.scss b/src/features/patient/ui/EditTreatmentTitle/EditTreatmentTitle.scss new file mode 100644 index 0000000..a1c723c --- /dev/null +++ b/src/features/patient/ui/EditTreatmentTitle/EditTreatmentTitle.scss @@ -0,0 +1,28 @@ +.edit-treatment-title { + flex: 1 0 90%; + + p { + @include fontSize( + b-16, + ( + weight: 700, + ) + ); + padding: toRem(5) 0; + color: var(--dark-main); + + &.empty { + font-weight: 400; + color: var(--dark-32); + } + } + + input { + width: 100%; + padding: toRem(6); + + border: 1px solid var(--brand-main); + + border-radius: $borderRadius6; + } +} diff --git a/src/features/patient/ui/EditTreatmentTitle/EditTreatmentTitle.vue b/src/features/patient/ui/EditTreatmentTitle/EditTreatmentTitle.vue new file mode 100644 index 0000000..1fb21e9 --- /dev/null +++ b/src/features/patient/ui/EditTreatmentTitle/EditTreatmentTitle.vue @@ -0,0 +1,56 @@ + + diff --git a/src/features/patient/ui/EditTreatmentTitle/index.ts b/src/features/patient/ui/EditTreatmentTitle/index.ts new file mode 100644 index 0000000..1541652 --- /dev/null +++ b/src/features/patient/ui/EditTreatmentTitle/index.ts @@ -0,0 +1,5 @@ +import EditTreatmentTitle, { + type EditTreatmentTitleProps, +} from './EditTreatmentTitle.vue' + +export { EditTreatmentTitle, type EditTreatmentTitleProps } diff --git a/src/features/patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum.scss b/src/features/patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum.scss new file mode 100644 index 0000000..9f54624 --- /dev/null +++ b/src/features/patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum.scss @@ -0,0 +1,21 @@ +.editable-analysis-optimum { + display: flex; + align-items: center; + justify-content: flex-end; + p { + @include fontSize(s-12); + cursor: pointer; + padding: toRem(12) toRem(16) toRem(12) 0; + &.empty { + text-align: center; + color: var(--dark-32); + } + } + + input { + width: 100%; + padding: toRem(6); + border: 1px solid var(--brand-main); + border-radius: $borderRadius6; + } +} diff --git a/src/features/patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum.vue b/src/features/patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum.vue new file mode 100644 index 0000000..0a9ff03 --- /dev/null +++ b/src/features/patient/ui/EditableAnalysisOptimum/EditableAnalysisOptimum.vue @@ -0,0 +1,66 @@ + + diff --git a/src/features/patient/ui/EditableAnalysisOptimum/index.ts b/src/features/patient/ui/EditableAnalysisOptimum/index.ts new file mode 100644 index 0000000..1ae4c65 --- /dev/null +++ b/src/features/patient/ui/EditableAnalysisOptimum/index.ts @@ -0,0 +1,5 @@ +import EditableAnalysisOptimum, { + type EditableAnalysisOptimumProps, +} from './EditableAnalysisOptimum.vue' + +export { EditableAnalysisOptimum, type EditableAnalysisOptimumProps } diff --git a/src/features/patient/ui/EditableAnalysisResult/EditableAnalysisResult.scss b/src/features/patient/ui/EditableAnalysisResult/EditableAnalysisResult.scss new file mode 100644 index 0000000..d437d71 --- /dev/null +++ b/src/features/patient/ui/EditableAnalysisResult/EditableAnalysisResult.scss @@ -0,0 +1,71 @@ +.analysis-result { + $b: &; + + width: 100%; + cursor: pointer; + transition: all 0.2s linear; + + &__state { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + gap: toRem(6); + border-radius: $borderRadius6; + padding: toRem(6) toRem(10); + background-color: var(--grey-64); + &:hover { + background-color: var(--grey-hover); + #{$b}__hint { + opacity: 1; + background-color: var(--blue-20-bg); + } + } + + span { + line-height: 12px; + } + + &.up, + &.down { + background-color: var(--berry-14); + + #{$b}__hint { + background-color: var(--berry-20); + } + } + + &.normal { + background-color: var(--green-32); + + #{$b}__hint { + background-color: var(--green-64); + } + } + } + + &__hint { + width: 14px; + height: 14px; + opacity: 0; + transition: all 0.3s linear; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + } + + &.disable { + cursor: not-allowed; + #{$b}__state:hover { + background-color: var(--grey-64); + } + } + + input { + width: 100%; + padding: toRem(6); + border: 1px solid var(--brand-main); + border-radius: $borderRadius6; + } +} diff --git a/src/features/patient/ui/EditableAnalysisResult/EditableAnalysisResult.vue b/src/features/patient/ui/EditableAnalysisResult/EditableAnalysisResult.vue new file mode 100644 index 0000000..92c982d --- /dev/null +++ b/src/features/patient/ui/EditableAnalysisResult/EditableAnalysisResult.vue @@ -0,0 +1,121 @@ + + diff --git a/src/features/patient/ui/EditableAnalysisResult/index.ts b/src/features/patient/ui/EditableAnalysisResult/index.ts new file mode 100644 index 0000000..d83ba98 --- /dev/null +++ b/src/features/patient/ui/EditableAnalysisResult/index.ts @@ -0,0 +1,5 @@ +import EditableAnalysisResult, { + type EditableAnalysisResultProps, +} from './EditableAnalysisResult.vue' + +export { EditableAnalysisResult, type EditableAnalysisResultProps } diff --git a/src/features/patient/ui/HealthMatrixCircle/HealthMatrixCircle.scss b/src/features/patient/ui/HealthMatrixCircle/HealthMatrixCircle.scss new file mode 100644 index 0000000..e441d12 --- /dev/null +++ b/src/features/patient/ui/HealthMatrixCircle/HealthMatrixCircle.scss @@ -0,0 +1,52 @@ +.health-matrix-circle { + width: 140px; + height: 140px; + border-radius: 50%; + background-image: url('/images/default/circle-matrix-1.svg'); + background-size: cover; + background-position: center; + display: flex; + align-items: center; + justify-content: center; + margin: auto; + position: relative; + top: 50%; + transform: translate(0, -50%); + + svg { + border-radius: 50%; + cursor: pointer; + } + + .dropdown { + position: absolute; + transform: translate(0, 0); + opacity: 0; + width: auto; + min-width: 0; + transition: + transform 0.2s linear, + opacity 0.25s linear; + + &__control { + padding: 0; + gap: toRem(4); + background: none; + + i { + display: flex; + align-items: center; + justify-content: center; + height: 14px; + width: 14px; + } + } + + &__menu { + width: 178px; + right: 0; + left: auto; + padding: toRem(12); + } + } +} diff --git a/src/features/patient/ui/HealthMatrixCircle/HealthMatrixCircle.vue b/src/features/patient/ui/HealthMatrixCircle/HealthMatrixCircle.vue new file mode 100644 index 0000000..79c9025 --- /dev/null +++ b/src/features/patient/ui/HealthMatrixCircle/HealthMatrixCircle.vue @@ -0,0 +1,132 @@ + + diff --git a/src/features/patient/ui/HealthMatrixCircle/index.ts b/src/features/patient/ui/HealthMatrixCircle/index.ts new file mode 100644 index 0000000..3afc18c --- /dev/null +++ b/src/features/patient/ui/HealthMatrixCircle/index.ts @@ -0,0 +1,5 @@ +import HealthMatrixCircle, { + type HealthMatrixCircleProps, +} from './HealthMatrixCircle.vue' + +export { HealthMatrixCircle, type HealthMatrixCircleProps } diff --git a/src/features/patient/ui/SearchPurposeLibrary/SearchPurposeLibrary.scss b/src/features/patient/ui/SearchPurposeLibrary/SearchPurposeLibrary.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/SearchPurposeLibrary/SearchPurposeLibrary.vue b/src/features/patient/ui/SearchPurposeLibrary/SearchPurposeLibrary.vue new file mode 100644 index 0000000..b7e5e4e --- /dev/null +++ b/src/features/patient/ui/SearchPurposeLibrary/SearchPurposeLibrary.vue @@ -0,0 +1,41 @@ + + diff --git a/src/features/patient/ui/SearchPurposeLibrary/index.ts b/src/features/patient/ui/SearchPurposeLibrary/index.ts new file mode 100644 index 0000000..2afd69c --- /dev/null +++ b/src/features/patient/ui/SearchPurposeLibrary/index.ts @@ -0,0 +1,5 @@ +import SearchPurposeLibrary, { + type SearchPurposeLibraryProps, +} from './SearchPurposeLibrary.vue' + +export { SearchPurposeLibrary, type SearchPurposeLibraryProps } diff --git a/src/features/patient/ui/SearchSurvey/SearchSurvey.scss b/src/features/patient/ui/SearchSurvey/SearchSurvey.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/features/patient/ui/SearchSurvey/SearchSurvey.vue b/src/features/patient/ui/SearchSurvey/SearchSurvey.vue new file mode 100644 index 0000000..4a98a7c --- /dev/null +++ b/src/features/patient/ui/SearchSurvey/SearchSurvey.vue @@ -0,0 +1,36 @@ + + diff --git a/src/features/patient/ui/SearchSurvey/index.ts b/src/features/patient/ui/SearchSurvey/index.ts new file mode 100644 index 0000000..6240453 --- /dev/null +++ b/src/features/patient/ui/SearchSurvey/index.ts @@ -0,0 +1,3 @@ +import SearchSurvey, { type SearchSurveyProps } from './SearchSurvey.vue' + +export { SearchSurvey, type SearchSurveyProps } diff --git a/src/features/patient/ui/SelectPurposeItem/SelectPurposeItem.scss b/src/features/patient/ui/SelectPurposeItem/SelectPurposeItem.scss new file mode 100644 index 0000000..1b5858b --- /dev/null +++ b/src/features/patient/ui/SelectPurposeItem/SelectPurposeItem.scss @@ -0,0 +1,28 @@ +.select-purpose-item { + &__list { + @include column(toRem(8)); + + &--item { + padding: toRem(6) toRem(8); + display: flex; + align-items: center; + gap: toRem(10); + border-radius: $borderRadius6; + transition: all 0.2s linear; + cursor: pointer; + + &:hover { + background-color: var(--grey-64); + } + + &-name { + @include fontSize( + s-12, + ( + weight: 500, + ) + ); + } + } + } +} diff --git a/src/features/patient/ui/SelectPurposeItem/SelectPurposeItem.vue b/src/features/patient/ui/SelectPurposeItem/SelectPurposeItem.vue new file mode 100644 index 0000000..fa9a1c2 --- /dev/null +++ b/src/features/patient/ui/SelectPurposeItem/SelectPurposeItem.vue @@ -0,0 +1,36 @@ + + diff --git a/src/features/patient/ui/SelectPurposeItem/index.ts b/src/features/patient/ui/SelectPurposeItem/index.ts new file mode 100644 index 0000000..7876fdb --- /dev/null +++ b/src/features/patient/ui/SelectPurposeItem/index.ts @@ -0,0 +1,5 @@ +import SelectPurposeItem, { + type SelectPurposeItemProps, +} from './SelectPurposeItem.vue' + +export { SelectPurposeItem, type SelectPurposeItemProps } diff --git a/src/features/patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse.scss b/src/features/patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse.scss new file mode 100644 index 0000000..efb3173 --- /dev/null +++ b/src/features/patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse.scss @@ -0,0 +1,73 @@ +.toggle-treatment-course { + $b: &; + + width: 100%; + display: flex; + align-items: center; + gap: toRem(12); + padding: toRem(16) toRem(20); + border-radius: $borderRadius12; + border: 1px solid var(--grey-border); + cursor: pointer; + + &__label { + @include fontSize(b-14); + } + + &__input { + display: none; + + &:checked ~ #{$b}__thumb { + left: 28px; + } + + &:checked ~ #{$b}__track { + background: var(--ch-linear1); + } + } + + &__inner { + width: 48px; + height: 24px; + position: relative; + } + + &__track { + width: inherit; + height: inherit; + border-radius: $borderRadius12; + background: var(--grey-main); + position: relative; + transition: all 0.3s ease-in; + + &::after { + content: ''; + width: 12px; + height: 12px; + position: absolute; + right: 6px; + top: 6px; + border: 2px solid var(--dark-20); + border-radius: 50%; + } + } + + &__icon { + position: absolute; + z-index: 2; + color: var(--white); + top: 4px; + left: 4px; + } + + &__thumb { + width: 16px; + height: 16px; + top: 4px; + left: 4px; + position: absolute; + border-radius: 50%; + background-color: var(--white); + transition: all 0.25s ease-in; + } +} diff --git a/src/features/patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse.vue b/src/features/patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse.vue new file mode 100644 index 0000000..0af9920 --- /dev/null +++ b/src/features/patient/ui/ToggleTreatmentCourse/ToggleTreatmentCourse.vue @@ -0,0 +1,48 @@ + + diff --git a/src/features/patient/ui/ToggleTreatmentCourse/index.ts b/src/features/patient/ui/ToggleTreatmentCourse/index.ts new file mode 100644 index 0000000..4805bf1 --- /dev/null +++ b/src/features/patient/ui/ToggleTreatmentCourse/index.ts @@ -0,0 +1,5 @@ +import ToggleTreatmentCourse, { + type ToggleTreatmentCourseProps, +} from './ToggleTreatmentCourse.vue' + +export { ToggleTreatmentCourse, type ToggleTreatmentCourseProps } diff --git a/src/features/patient/ui/index.ts b/src/features/patient/ui/index.ts new file mode 100644 index 0000000..48da520 --- /dev/null +++ b/src/features/patient/ui/index.ts @@ -0,0 +1,21 @@ +export * from './EditPatientAsking' +export * from './EditPatientAnamnesis' +export * from './EditAppointmentItems' +export * from './AddMediaFiles' +export * from './DeleteMediaFile' +export * from './DeleteTreatmentCourse' +export * from './SearchSurvey' +export * from './EditableAnalysisResult' +export * from './EditableAnalysisOptimum' +export * from './AddNewAnalysis' +export * from './EditAnalysisDate' +export * from './EditHealthMatrixItems' +export * from './HealthMatrixCircle' +export * from './AddPurpose' +export * from './SearchPurposeLibrary' +export * from './SelectPurposeItem' +export * from './EditTreatmentTitle' +export * from './ToggleTreatmentCourse' +export * from './EditTreatmentItems' +export * from './AddPreparations' +export * from './AddTreatmentCourseFiles' diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..c7eb815 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,28 @@ +import 'vue3-bem' + +export {} + +declare global { + type Maybe = null | undefined | T + type Timeout = ReturnType + type Gender = 1 | 0 + + type BaseState = { + loading: boolean + data: T + } + + type BaseStatePagination = { + loading: boolean + data: T + pagination: Pagination + } + + type Pagination = { + current_page: number + per_page: number + last_page: number + } + + type PaginationData = Pagination & { data: T } +} diff --git a/src/pages/calendar/index.ts b/src/pages/calendar/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/calendar/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/calendar/ui/Calendar/Calendar.scss b/src/pages/calendar/ui/Calendar/Calendar.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/calendar/ui/Calendar/Calendar.vue b/src/pages/calendar/ui/Calendar/Calendar.vue new file mode 100644 index 0000000..4c9eae2 --- /dev/null +++ b/src/pages/calendar/ui/Calendar/Calendar.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/pages/calendar/ui/Calendar/index.ts b/src/pages/calendar/ui/Calendar/index.ts new file mode 100644 index 0000000..2f94fff --- /dev/null +++ b/src/pages/calendar/ui/Calendar/index.ts @@ -0,0 +1,3 @@ +import Calendar, { type CalendarProps } from './Calendar.vue' + +export { Calendar, type CalendarProps } diff --git a/src/pages/calendar/ui/index.ts b/src/pages/calendar/ui/index.ts new file mode 100644 index 0000000..8c50cf8 --- /dev/null +++ b/src/pages/calendar/ui/index.ts @@ -0,0 +1 @@ +export * from './Calendar' diff --git a/src/pages/chat/index.ts b/src/pages/chat/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/chat/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/chat/ui/Chat/Chat.scss b/src/pages/chat/ui/Chat/Chat.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/chat/ui/Chat/Chat.vue b/src/pages/chat/ui/Chat/Chat.vue new file mode 100644 index 0000000..d2f7b66 --- /dev/null +++ b/src/pages/chat/ui/Chat/Chat.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/pages/chat/ui/Chat/index.ts b/src/pages/chat/ui/Chat/index.ts new file mode 100644 index 0000000..b4b6ed3 --- /dev/null +++ b/src/pages/chat/ui/Chat/index.ts @@ -0,0 +1,3 @@ +import Chat, { type ChatProps } from './Chat.vue' + +export { Chat, type ChatProps } diff --git a/src/pages/chat/ui/index.ts b/src/pages/chat/ui/index.ts new file mode 100644 index 0000000..62a2487 --- /dev/null +++ b/src/pages/chat/ui/index.ts @@ -0,0 +1 @@ +export * from './Chat' diff --git a/src/pages/index.ts b/src/pages/index.ts new file mode 100644 index 0000000..fc9377c --- /dev/null +++ b/src/pages/index.ts @@ -0,0 +1,7 @@ +export * from './login' +export * from './patients' +export * from './calendar' +export * from './chat' +export * from './library' +export * from './videochat' +export * from './patient' diff --git a/src/pages/library/index.ts b/src/pages/library/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/library/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/library/ui/Library/Library.scss b/src/pages/library/ui/Library/Library.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/library/ui/Library/Library.vue b/src/pages/library/ui/Library/Library.vue new file mode 100644 index 0000000..2ab99c9 --- /dev/null +++ b/src/pages/library/ui/Library/Library.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/pages/library/ui/Library/index.ts b/src/pages/library/ui/Library/index.ts new file mode 100644 index 0000000..22cb8c1 --- /dev/null +++ b/src/pages/library/ui/Library/index.ts @@ -0,0 +1,3 @@ +import Library, { type LibraryProps } from './Library.vue' + +export { Library, type LibraryProps } diff --git a/src/pages/library/ui/index.ts b/src/pages/library/ui/index.ts new file mode 100644 index 0000000..d5c5532 --- /dev/null +++ b/src/pages/library/ui/index.ts @@ -0,0 +1 @@ +export * from './Library' diff --git a/src/pages/login/index.ts b/src/pages/login/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/login/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/login/ui/LoginPage/LoginPage.scss b/src/pages/login/ui/LoginPage/LoginPage.scss new file mode 100644 index 0000000..031b7cb --- /dev/null +++ b/src/pages/login/ui/LoginPage/LoginPage.scss @@ -0,0 +1,26 @@ +.login-page { + @include column(); + align-items: center; + height: 100vh; + position: relative; + padding-top: toRem(130); + + &__header { + position: absolute; + top: toRem(32); + left: 0; + padding: 0 toRem(32); + width: 100%; + } + + &__content { + @include column(toRem(26)); + + align-items: center; + } + + &__footer { + @include center(horizontal); + bottom: toRem(50); + } +} diff --git a/src/pages/login/ui/LoginPage/LoginPage.vue b/src/pages/login/ui/LoginPage/LoginPage.vue new file mode 100644 index 0000000..4ed3f08 --- /dev/null +++ b/src/pages/login/ui/LoginPage/LoginPage.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/pages/login/ui/LoginPage/index.ts b/src/pages/login/ui/LoginPage/index.ts new file mode 100644 index 0000000..de3fb19 --- /dev/null +++ b/src/pages/login/ui/LoginPage/index.ts @@ -0,0 +1,3 @@ +import LoginPage from './LoginPage.vue' + +export { LoginPage } diff --git a/src/pages/login/ui/index.ts b/src/pages/login/ui/index.ts new file mode 100644 index 0000000..f5de7eb --- /dev/null +++ b/src/pages/login/ui/index.ts @@ -0,0 +1 @@ +export * from './LoginPage' diff --git a/src/pages/pages.scss b/src/pages/pages.scss new file mode 100644 index 0000000..5f7469d --- /dev/null +++ b/src/pages/pages.scss @@ -0,0 +1,8 @@ +@import 'login/ui/LoginPage/LoginPage'; +@import 'patients/ui/MyPatients/MyPatients'; +@import 'patients/ui/RequestsPatients/RequestsPatients'; +@import 'calendar/ui/Calendar/Calendar'; +@import 'chat/ui/Chat/Chat'; +@import 'videochat/ui/Videochat/Videochat'; +@import 'library/ui/Library/Library'; +@import 'patient/ui/Patient/Patient'; diff --git a/src/pages/patient/index.ts b/src/pages/patient/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/patient/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/patient/ui/Patient/Patient.scss b/src/pages/patient/ui/Patient/Patient.scss new file mode 100644 index 0000000..c5486f0 --- /dev/null +++ b/src/pages/patient/ui/Patient/Patient.scss @@ -0,0 +1,5 @@ +.patient { + //&__wrapper { + // @include column(toRem(24)); + //} +} diff --git a/src/pages/patient/ui/Patient/Patient.vue b/src/pages/patient/ui/Patient/Patient.vue new file mode 100644 index 0000000..c58dd17 --- /dev/null +++ b/src/pages/patient/ui/Patient/Patient.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/pages/patient/ui/Patient/index.ts b/src/pages/patient/ui/Patient/index.ts new file mode 100644 index 0000000..ab5c32b --- /dev/null +++ b/src/pages/patient/ui/Patient/index.ts @@ -0,0 +1,3 @@ +import Patient, { type PatientProps } from './Patient.vue' + +export { Patient, type PatientProps } diff --git a/src/pages/patient/ui/index.ts b/src/pages/patient/ui/index.ts new file mode 100644 index 0000000..e7ace59 --- /dev/null +++ b/src/pages/patient/ui/index.ts @@ -0,0 +1 @@ +export * from './Patient' diff --git a/src/pages/patients/index.ts b/src/pages/patients/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/patients/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/patients/ui/MyPatients/MyPatients.scss b/src/pages/patients/ui/MyPatients/MyPatients.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/patients/ui/MyPatients/MyPatients.vue b/src/pages/patients/ui/MyPatients/MyPatients.vue new file mode 100644 index 0000000..6ac283f --- /dev/null +++ b/src/pages/patients/ui/MyPatients/MyPatients.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/pages/patients/ui/MyPatients/index.ts b/src/pages/patients/ui/MyPatients/index.ts new file mode 100644 index 0000000..99b3ee7 --- /dev/null +++ b/src/pages/patients/ui/MyPatients/index.ts @@ -0,0 +1,3 @@ +import MyPatients, { type MyPatientsProps } from './MyPatients.vue' + +export { MyPatients, type MyPatientsProps } diff --git a/src/pages/patients/ui/RequestsPatients/RequestsPatients.scss b/src/pages/patients/ui/RequestsPatients/RequestsPatients.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/patients/ui/RequestsPatients/RequestsPatients.vue b/src/pages/patients/ui/RequestsPatients/RequestsPatients.vue new file mode 100644 index 0000000..d658de6 --- /dev/null +++ b/src/pages/patients/ui/RequestsPatients/RequestsPatients.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/pages/patients/ui/RequestsPatients/index.ts b/src/pages/patients/ui/RequestsPatients/index.ts new file mode 100644 index 0000000..f0c2522 --- /dev/null +++ b/src/pages/patients/ui/RequestsPatients/index.ts @@ -0,0 +1,5 @@ +import RequestsPatients, { + type RequestsPatientsProps, +} from './RequestsPatients.vue' + +export { RequestsPatients, type RequestsPatientsProps } diff --git a/src/pages/patients/ui/index.ts b/src/pages/patients/ui/index.ts new file mode 100644 index 0000000..a9d8497 --- /dev/null +++ b/src/pages/patients/ui/index.ts @@ -0,0 +1,2 @@ +export * from './MyPatients' +export * from './RequestsPatients' diff --git a/src/pages/profile/ui/Profile/Profile.scss b/src/pages/profile/ui/Profile/Profile.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/profile/ui/Profile/Profile.vue b/src/pages/profile/ui/Profile/Profile.vue new file mode 100644 index 0000000..86e86fb --- /dev/null +++ b/src/pages/profile/ui/Profile/Profile.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/pages/profile/ui/Profile/index.ts b/src/pages/profile/ui/Profile/index.ts new file mode 100644 index 0000000..774357a --- /dev/null +++ b/src/pages/profile/ui/Profile/index.ts @@ -0,0 +1,3 @@ +import Profile, { type ProfileProps } from './Profile.vue' + +export { Profile, type ProfileProps } diff --git a/src/pages/profile/ui/index.ts b/src/pages/profile/ui/index.ts new file mode 100644 index 0000000..ea36afc --- /dev/null +++ b/src/pages/profile/ui/index.ts @@ -0,0 +1 @@ +export * from './Profile' diff --git a/src/pages/support/index.ts b/src/pages/support/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/support/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/support/ui/Support/Support.scss b/src/pages/support/ui/Support/Support.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/support/ui/Support/Support.vue b/src/pages/support/ui/Support/Support.vue new file mode 100644 index 0000000..66f6402 --- /dev/null +++ b/src/pages/support/ui/Support/Support.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/pages/support/ui/Support/index.ts b/src/pages/support/ui/Support/index.ts new file mode 100644 index 0000000..b4decf6 --- /dev/null +++ b/src/pages/support/ui/Support/index.ts @@ -0,0 +1,3 @@ +import Support, { type SupportProps } from './Support.vue' + +export { Support, type SupportProps } diff --git a/src/pages/support/ui/index.ts b/src/pages/support/ui/index.ts new file mode 100644 index 0000000..2d31231 --- /dev/null +++ b/src/pages/support/ui/index.ts @@ -0,0 +1 @@ +export * from './Support' diff --git a/src/pages/videochat/index.ts b/src/pages/videochat/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/pages/videochat/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/pages/videochat/ui/Videochat/Videochat.scss b/src/pages/videochat/ui/Videochat/Videochat.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/videochat/ui/Videochat/Videochat.vue b/src/pages/videochat/ui/Videochat/Videochat.vue new file mode 100644 index 0000000..fc7b5f5 --- /dev/null +++ b/src/pages/videochat/ui/Videochat/Videochat.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/pages/videochat/ui/Videochat/index.ts b/src/pages/videochat/ui/Videochat/index.ts new file mode 100644 index 0000000..383d37b --- /dev/null +++ b/src/pages/videochat/ui/Videochat/index.ts @@ -0,0 +1,3 @@ +import Videochat, { type VideochatProps } from './Videochat.vue' + +export { Videochat, type VideochatProps } diff --git a/src/pages/videochat/ui/index.ts b/src/pages/videochat/ui/index.ts new file mode 100644 index 0000000..7504e78 --- /dev/null +++ b/src/pages/videochat/ui/index.ts @@ -0,0 +1 @@ +export * from './Videochat' diff --git a/src/shared/api/index.ts b/src/shared/api/index.ts new file mode 100644 index 0000000..3f25746 --- /dev/null +++ b/src/shared/api/index.ts @@ -0,0 +1,20 @@ +import axios from 'axios' +import config from '@/app/configs' + +const token = localStorage.getItem('user-token') || '' + +const baseApi = axios.create({ + baseURL: config.baseURL, + headers: { + Authorization: `Bearer ${token}`, + }, +}) + +const medicalApi = axios.create({ + baseURL: config.medicalURL, + headers: { + Authorization: `Bearer ${token}`, + }, +}) + +export { baseApi, medicalApi } diff --git a/src/shared/assets/icons/arrow-down.svg b/src/shared/assets/icons/arrow-down.svg new file mode 100644 index 0000000..bf579b6 --- /dev/null +++ b/src/shared/assets/icons/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/bell.svg b/src/shared/assets/icons/bell.svg new file mode 100644 index 0000000..0126b2a --- /dev/null +++ b/src/shared/assets/icons/bell.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/book-open.svg b/src/shared/assets/icons/book-open.svg new file mode 100644 index 0000000..ed27f4d --- /dev/null +++ b/src/shared/assets/icons/book-open.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/calendar.svg b/src/shared/assets/icons/calendar.svg new file mode 100644 index 0000000..5b85631 --- /dev/null +++ b/src/shared/assets/icons/calendar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/check-circle.svg b/src/shared/assets/icons/check-circle.svg new file mode 100644 index 0000000..19f8b15 --- /dev/null +++ b/src/shared/assets/icons/check-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/close.svg b/src/shared/assets/icons/close.svg new file mode 100644 index 0000000..f914599 --- /dev/null +++ b/src/shared/assets/icons/close.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/dots-vertical.svg b/src/shared/assets/icons/dots-vertical.svg new file mode 100644 index 0000000..7c95d12 --- /dev/null +++ b/src/shared/assets/icons/dots-vertical.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/file.svg b/src/shared/assets/icons/file.svg new file mode 100644 index 0000000..0b85034 --- /dev/null +++ b/src/shared/assets/icons/file.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/formatting/arrow-down.svg b/src/shared/assets/icons/formatting/arrow-down.svg new file mode 100644 index 0000000..caa15bc --- /dev/null +++ b/src/shared/assets/icons/formatting/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/arrow-left.svg b/src/shared/assets/icons/formatting/arrow-left.svg new file mode 100644 index 0000000..250fedf --- /dev/null +++ b/src/shared/assets/icons/formatting/arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/arrow-narrow-down.svg b/src/shared/assets/icons/formatting/arrow-narrow-down.svg new file mode 100644 index 0000000..a972a86 --- /dev/null +++ b/src/shared/assets/icons/formatting/arrow-narrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/arrow-narrow-up-right.svg b/src/shared/assets/icons/formatting/arrow-narrow-up-right.svg new file mode 100644 index 0000000..dd7e6fd --- /dev/null +++ b/src/shared/assets/icons/formatting/arrow-narrow-up-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/arrow-narrow-up.svg b/src/shared/assets/icons/formatting/arrow-narrow-up.svg new file mode 100644 index 0000000..2a814cb --- /dev/null +++ b/src/shared/assets/icons/formatting/arrow-narrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/arrow-right.svg b/src/shared/assets/icons/formatting/arrow-right.svg new file mode 100644 index 0000000..8863178 --- /dev/null +++ b/src/shared/assets/icons/formatting/arrow-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/bell.svg b/src/shared/assets/icons/formatting/bell.svg new file mode 100644 index 0000000..2c271c5 --- /dev/null +++ b/src/shared/assets/icons/formatting/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/book-open.svg b/src/shared/assets/icons/formatting/book-open.svg new file mode 100644 index 0000000..19313ee --- /dev/null +++ b/src/shared/assets/icons/formatting/book-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/calculator.svg b/src/shared/assets/icons/formatting/calculator.svg new file mode 100644 index 0000000..8b59010 --- /dev/null +++ b/src/shared/assets/icons/formatting/calculator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/calendar.svg b/src/shared/assets/icons/formatting/calendar.svg new file mode 100644 index 0000000..ec63fa8 --- /dev/null +++ b/src/shared/assets/icons/formatting/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/camera.svg b/src/shared/assets/icons/formatting/camera.svg new file mode 100644 index 0000000..a8b6f51 --- /dev/null +++ b/src/shared/assets/icons/formatting/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/check-circle.svg b/src/shared/assets/icons/formatting/check-circle.svg new file mode 100644 index 0000000..b821d95 --- /dev/null +++ b/src/shared/assets/icons/formatting/check-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/check-heart.svg b/src/shared/assets/icons/formatting/check-heart.svg new file mode 100644 index 0000000..aae2731 --- /dev/null +++ b/src/shared/assets/icons/formatting/check-heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/check.svg b/src/shared/assets/icons/formatting/check.svg new file mode 100644 index 0000000..a4ccbc0 --- /dev/null +++ b/src/shared/assets/icons/formatting/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/clock.svg b/src/shared/assets/icons/formatting/clock.svg new file mode 100644 index 0000000..9686b38 --- /dev/null +++ b/src/shared/assets/icons/formatting/clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/close.svg b/src/shared/assets/icons/formatting/close.svg new file mode 100644 index 0000000..695cfdb --- /dev/null +++ b/src/shared/assets/icons/formatting/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/date.svg b/src/shared/assets/icons/formatting/date.svg new file mode 100644 index 0000000..8f622ac --- /dev/null +++ b/src/shared/assets/icons/formatting/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/dots-vertical.svg b/src/shared/assets/icons/formatting/dots-vertical.svg new file mode 100644 index 0000000..8dbac2f --- /dev/null +++ b/src/shared/assets/icons/formatting/dots-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/file.svg b/src/shared/assets/icons/formatting/file.svg new file mode 100644 index 0000000..4ca3c53 --- /dev/null +++ b/src/shared/assets/icons/formatting/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/help-circle.svg b/src/shared/assets/icons/formatting/help-circle.svg new file mode 100644 index 0000000..b582973 --- /dev/null +++ b/src/shared/assets/icons/formatting/help-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/info-circle.svg b/src/shared/assets/icons/formatting/info-circle.svg new file mode 100644 index 0000000..c6dbc8a --- /dev/null +++ b/src/shared/assets/icons/formatting/info-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/info.svg b/src/shared/assets/icons/formatting/info.svg new file mode 100644 index 0000000..760e9b2 --- /dev/null +++ b/src/shared/assets/icons/formatting/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/link.svg b/src/shared/assets/icons/formatting/link.svg new file mode 100644 index 0000000..1a480bf --- /dev/null +++ b/src/shared/assets/icons/formatting/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/message-text.svg b/src/shared/assets/icons/formatting/message-text.svg new file mode 100644 index 0000000..a0c4146 --- /dev/null +++ b/src/shared/assets/icons/formatting/message-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/pencil-line.svg b/src/shared/assets/icons/formatting/pencil-line.svg new file mode 100644 index 0000000..33bafa1 --- /dev/null +++ b/src/shared/assets/icons/formatting/pencil-line.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/placeholder.svg b/src/shared/assets/icons/formatting/placeholder.svg new file mode 100644 index 0000000..698a8e7 --- /dev/null +++ b/src/shared/assets/icons/formatting/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/plus.svg b/src/shared/assets/icons/formatting/plus.svg new file mode 100644 index 0000000..de8f4c5 --- /dev/null +++ b/src/shared/assets/icons/formatting/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/search.svg b/src/shared/assets/icons/formatting/search.svg new file mode 100644 index 0000000..50e0e53 --- /dev/null +++ b/src/shared/assets/icons/formatting/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/switch-vertical.svg b/src/shared/assets/icons/formatting/switch-vertical.svg new file mode 100644 index 0000000..3c4ae81 --- /dev/null +++ b/src/shared/assets/icons/formatting/switch-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/trash.svg b/src/shared/assets/icons/formatting/trash.svg new file mode 100644 index 0000000..5b7a7e2 --- /dev/null +++ b/src/shared/assets/icons/formatting/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/tui-marker.svg b/src/shared/assets/icons/formatting/tui-marker.svg new file mode 100644 index 0000000..7f94bc0 --- /dev/null +++ b/src/shared/assets/icons/formatting/tui-marker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/user-edit.svg b/src/shared/assets/icons/formatting/user-edit.svg new file mode 100644 index 0000000..1c51c23 --- /dev/null +++ b/src/shared/assets/icons/formatting/user-edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/user-plus.svg b/src/shared/assets/icons/formatting/user-plus.svg new file mode 100644 index 0000000..75e5408 --- /dev/null +++ b/src/shared/assets/icons/formatting/user-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/user.svg b/src/shared/assets/icons/formatting/user.svg new file mode 100644 index 0000000..182ba52 --- /dev/null +++ b/src/shared/assets/icons/formatting/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/users-right.svg b/src/shared/assets/icons/formatting/users-right.svg new file mode 100644 index 0000000..bdf2105 --- /dev/null +++ b/src/shared/assets/icons/formatting/users-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/video-recorder.svg b/src/shared/assets/icons/formatting/video-recorder.svg new file mode 100644 index 0000000..e55a4f5 --- /dev/null +++ b/src/shared/assets/icons/formatting/video-recorder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/formatting/x-circle.svg b/src/shared/assets/icons/formatting/x-circle.svg new file mode 100644 index 0000000..74e9207 --- /dev/null +++ b/src/shared/assets/icons/formatting/x-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/help-circle.svg b/src/shared/assets/icons/help-circle.svg new file mode 100644 index 0000000..7866838 --- /dev/null +++ b/src/shared/assets/icons/help-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/message-text.svg b/src/shared/assets/icons/message-text.svg new file mode 100644 index 0000000..6f02207 --- /dev/null +++ b/src/shared/assets/icons/message-text.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/pencil-line.svg b/src/shared/assets/icons/pencil-line.svg new file mode 100644 index 0000000..5335520 --- /dev/null +++ b/src/shared/assets/icons/pencil-line.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/shared/assets/icons/placeholder.svg b/src/shared/assets/icons/placeholder.svg new file mode 100644 index 0000000..97a5ebc --- /dev/null +++ b/src/shared/assets/icons/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/shared/assets/icons/plus.svg b/src/shared/assets/icons/plus.svg new file mode 100644 index 0000000..eef1e5b --- /dev/null +++ b/src/shared/assets/icons/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/search.svg b/src/shared/assets/icons/search.svg new file mode 100644 index 0000000..2236798 --- /dev/null +++ b/src/shared/assets/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/trash.svg b/src/shared/assets/icons/trash.svg new file mode 100644 index 0000000..1c198aa --- /dev/null +++ b/src/shared/assets/icons/trash.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/user-edit.svg b/src/shared/assets/icons/user-edit.svg new file mode 100644 index 0000000..6e2b5bc --- /dev/null +++ b/src/shared/assets/icons/user-edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/user-plus.svg b/src/shared/assets/icons/user-plus.svg new file mode 100644 index 0000000..7dae4b6 --- /dev/null +++ b/src/shared/assets/icons/user-plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/user.svg b/src/shared/assets/icons/user.svg new file mode 100644 index 0000000..ada60e4 --- /dev/null +++ b/src/shared/assets/icons/user.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/users-right.svg b/src/shared/assets/icons/users-right.svg new file mode 100644 index 0000000..0c39933 --- /dev/null +++ b/src/shared/assets/icons/users-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/assets/icons/video-recorder.svg b/src/shared/assets/icons/video-recorder.svg new file mode 100644 index 0000000..6ad3dd4 --- /dev/null +++ b/src/shared/assets/icons/video-recorder.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/shared/assets/icons/x-circle.svg b/src/shared/assets/icons/x-circle.svg new file mode 100644 index 0000000..31ada7c --- /dev/null +++ b/src/shared/assets/icons/x-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/shared/index.ts b/src/shared/index.ts new file mode 100644 index 0000000..89107e1 --- /dev/null +++ b/src/shared/index.ts @@ -0,0 +1,5 @@ +export * from './lib' +export * from './utils' +export * from './ui' +export * from './lib/types' +export * from './api' diff --git a/src/shared/lib/hooks/index.ts b/src/shared/lib/hooks/index.ts new file mode 100644 index 0000000..389bc29 --- /dev/null +++ b/src/shared/lib/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './usePageTitle' +export * from './useJWT' diff --git a/src/shared/lib/hooks/useJWT.ts b/src/shared/lib/hooks/useJWT.ts new file mode 100644 index 0000000..bfa8779 --- /dev/null +++ b/src/shared/lib/hooks/useJWT.ts @@ -0,0 +1,18 @@ +import { baseApi } from '@/shared' + +export const useJWT = () => { + const setJWT = (token: string) => { + localStorage.setItem('user-token', token) + baseApi.defaults.headers.Authorization = `Bearer ${token}` + } + + const removeJWT = () => { + localStorage.removeItem('user-token') + baseApi.defaults.headers.Authorization = '' + } + + return { + setJWT, + removeJWT, + } +} diff --git a/src/shared/lib/hooks/usePageTitle.ts b/src/shared/lib/hooks/usePageTitle.ts new file mode 100644 index 0000000..d2501c5 --- /dev/null +++ b/src/shared/lib/hooks/usePageTitle.ts @@ -0,0 +1,6 @@ +import { useRoute } from 'vue-router' + +export const usePageTitle = () => { + const route = useRoute() + return route.meta.page?.title ?? '' +} diff --git a/src/shared/lib/hooks/useWindowSize.ts b/src/shared/lib/hooks/useWindowSize.ts new file mode 100644 index 0000000..72a4327 --- /dev/null +++ b/src/shared/lib/hooks/useWindowSize.ts @@ -0,0 +1,23 @@ +import { onMounted, onUnmounted, ref } from 'vue' + +export const useWindowSize = () => { + const width = ref(window.innerWidth) + const height = ref(window.innerHeight) + const handleResize = () => { + width.value = window.innerWidth + height.value = window.innerHeight + } + + onMounted(() => { + window.addEventListener('resize', handleResize) + }) + + onUnmounted(() => { + window.removeEventListener('resize', handleResize) + }) + + return { + width, + height, + } +} diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts new file mode 100644 index 0000000..a1c77e9 --- /dev/null +++ b/src/shared/lib/index.ts @@ -0,0 +1,2 @@ +export * from './hooks' +export * from './types' diff --git a/src/shared/lib/types/icons.ts b/src/shared/lib/types/icons.ts new file mode 100644 index 0000000..3a97a30 --- /dev/null +++ b/src/shared/lib/types/icons.ts @@ -0,0 +1,38 @@ +export type IconNames = + | 'arrow-down' + | 'arrow-left' + | 'arrow-narrow-down' + | 'arrow-narrow-up-right' + | 'arrow-narrow-up' + | 'arrow-right' + | 'bell' + | 'book-open' + | 'calculator' + | 'calendar' + | 'camera' + | 'check-circle' + | 'check-heart' + | 'check' + | 'clock' + | 'close' + | 'date' + | 'dots-vertical' + | 'file' + | 'help-circle' + | 'info-circle' + | 'info' + | 'link' + | 'message-text' + | 'pencil-line' + | 'placeholder' + | 'plus' + | 'search' + | 'switch-vertical' + | 'trash' + | 'tui-marker' + | 'user-edit' + | 'user-plus' + | 'user' + | 'users-right' + | 'video-recorder' + | 'x-circle' diff --git a/src/shared/lib/types/index.ts b/src/shared/lib/types/index.ts new file mode 100644 index 0000000..765c7e1 --- /dev/null +++ b/src/shared/lib/types/index.ts @@ -0,0 +1,3 @@ +export * from './other' +export * from './store' +export * from './icons' diff --git a/src/shared/lib/types/other.ts b/src/shared/lib/types/other.ts new file mode 100644 index 0000000..e1f0831 --- /dev/null +++ b/src/shared/lib/types/other.ts @@ -0,0 +1,20 @@ +export type IconSvgNames = 'yandex' | 'vk' | 'google' + +export enum Routes { + INDEX = 'index', + LOGIN = 'login', + PATIENT = 'patient', + MY_PATIENTS = 'my-patients', + REQUESTS_PATIENTS = 'requests-patients', + CALENDAR = 'calendar', + VIDEOCHAT = 'videochat', + CHAT = 'chat', + LIBRARY = 'library', + SUPPORT = 'support', + PROFILE = 'profile', +} + +export type AuthData = { + email: string + password: string +} diff --git a/src/shared/lib/types/store.ts b/src/shared/lib/types/store.ts new file mode 100644 index 0000000..26b24a8 --- /dev/null +++ b/src/shared/lib/types/store.ts @@ -0,0 +1,9 @@ +export enum Stores { + AUTH = 'auth', + USER = 'user', + MY_PATIENTS = 'my-patients', + REQUEST_PATIENTS = 'request-patients', + PATIENT = 'patient', + MODALS = 'modals', + MEDICAL = 'medical', +} diff --git a/src/shared/shared.scss b/src/shared/shared.scss new file mode 100644 index 0000000..34c4fb0 --- /dev/null +++ b/src/shared/shared.scss @@ -0,0 +1,29 @@ +@import './ui/IconBase/IconBase'; +@import './ui/Button/Button'; +@import './ui/Card/Card'; +@import './ui/Input/Input'; +@import './ui/MenuItem/MenuItem'; +@import './ui/MenuItemList/MenuItemList'; +@import './ui/UserBase/UserBase'; +@import './ui/Link/Link'; +@import './ui/ButtonMenu/ButtonMenu'; +@import './ui/Tag/Tag'; +@import './ui/Tooltip/Tooltip'; +@import './ui/Spinner/Spinner'; +@import './ui/InfinityLoading/InfinityLoading'; +@import './ui/Tabs/Tabs'; +@import './ui/Logo/Logo'; +@import './ui/AuthForm/AuthForm'; +@import './ui/AuthCard/AuthCard'; +@import './ui/ButtonSocial/ButtonSocial'; +@import './ui/ToastIcon/ToastIcon'; +@import './ui/Dropdown/Dropdown'; +@import './ui/RadioBox/RadioBox'; +@import './ui/CheckBox/CheckBox'; +@import './ui/DataList/DataList'; +@import './ui/Textarea/Textarea'; +@import './ui/DatePicker/DatePicker'; +@import './ui/FileCard/FileCard'; +@import './ui/RadioInput/RadioInput'; +@import './ui/Accordion/Accordion'; +@import './ui/InputLink/InputLink'; diff --git a/src/shared/ui/Accordion/Accordion.scss b/src/shared/ui/Accordion/Accordion.scss new file mode 100644 index 0000000..a187839 --- /dev/null +++ b/src/shared/ui/Accordion/Accordion.scss @@ -0,0 +1,43 @@ +.accordion { + width: 100%; + border: 1px solid var(--grey-border); + border-radius: $borderRadius20; + overflow: hidden; + transition: 0.4s; + + &__header { + width: inherit; + display: flex; + justify-content: space-between; + align-items: center; + padding: toRem(24); + transition: padding 0.2s ease-out; + + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + color: var(--dark-main); + + i { + pointer-events: none; + transition: all 0.2s; + } + + &.active { + padding: toRem(24) toRem(24) toRem(12); + i { + transform: rotate(180deg); + } + } + } + + &__panel { + padding: 0 toRem(24); + max-height: 0; + overflow: hidden; + transition: max-height 0.2s ease-out; + } +} diff --git a/src/shared/ui/Accordion/Accordion.vue b/src/shared/ui/Accordion/Accordion.vue new file mode 100644 index 0000000..09795e3 --- /dev/null +++ b/src/shared/ui/Accordion/Accordion.vue @@ -0,0 +1,33 @@ + + diff --git a/src/shared/ui/Accordion/index.ts b/src/shared/ui/Accordion/index.ts new file mode 100644 index 0000000..1edda9a --- /dev/null +++ b/src/shared/ui/Accordion/index.ts @@ -0,0 +1,3 @@ +import Accordion, { type AccordionProps } from './Accordion.vue' + +export { Accordion, type AccordionProps } diff --git a/src/shared/ui/AuthCard/AuthCard.scss b/src/shared/ui/AuthCard/AuthCard.scss new file mode 100644 index 0000000..0efdb88 --- /dev/null +++ b/src/shared/ui/AuthCard/AuthCard.scss @@ -0,0 +1,23 @@ +.auth-card { + padding: toRem(40); + border-radius: $borderRadius24; + border: 1px solid var(--grey-border); + width: toRem(440); + + @include column(toRem(22)); + + align-items: center; + + &__title { + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } + + &__content { + width: 100%; + } +} diff --git a/src/shared/ui/AuthCard/AuthCard.vue b/src/shared/ui/AuthCard/AuthCard.vue new file mode 100644 index 0000000..c3f7d4a --- /dev/null +++ b/src/shared/ui/AuthCard/AuthCard.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/shared/ui/AuthCard/index.ts b/src/shared/ui/AuthCard/index.ts new file mode 100644 index 0000000..4f33139 --- /dev/null +++ b/src/shared/ui/AuthCard/index.ts @@ -0,0 +1,3 @@ +import AuthCard, { type AuthCardProps } from './AuthCard.vue' + +export { AuthCard, type AuthCardProps } diff --git a/src/shared/ui/AuthForm/AuthForm.scss b/src/shared/ui/AuthForm/AuthForm.scss new file mode 100644 index 0000000..8f7f862 --- /dev/null +++ b/src/shared/ui/AuthForm/AuthForm.scss @@ -0,0 +1,19 @@ +.auth-form { + text-align: center; + + &__content { + @include column(toRem(22)); + } + + &__step-toggle { + @include fontSize(s-13); + } + + &__socials { + @include column(toRem(12)); + } + + &__divider { + @include fontSize(b14); + } +} diff --git a/src/shared/ui/AuthForm/AuthForm.vue b/src/shared/ui/AuthForm/AuthForm.vue new file mode 100644 index 0000000..f017c36 --- /dev/null +++ b/src/shared/ui/AuthForm/AuthForm.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/shared/ui/AuthForm/index.ts b/src/shared/ui/AuthForm/index.ts new file mode 100644 index 0000000..84a864a --- /dev/null +++ b/src/shared/ui/AuthForm/index.ts @@ -0,0 +1,3 @@ +import AuthForm, { type AuthFormProps } from './AuthForm.vue' + +export { AuthForm, type AuthFormProps } diff --git a/src/shared/ui/Button/Button.scss b/src/shared/ui/Button/Button.scss new file mode 100644 index 0000000..c33823b --- /dev/null +++ b/src/shared/ui/Button/Button.scss @@ -0,0 +1,110 @@ +.button { + $b: &; + + position: relative; + display: flex; + gap: toRem(6); + justify-content: space-between; + align-items: center; + transition: 0.3s ease; + + @include fontSize(s-12); + + &__content { + width: 100%; + } + + &__icon { + display: flex; + align-items: center; + } + + &--size { + &-xs { + padding: 0 toRem(8); + height: toRem(28); + border-radius: $borderRadius8; + + #{$b}__icon { + font-size: toRem(12); + } + + &.is-only-icon { + width: toRem(28) !important; + } + } + + &-m { + padding: 0 toRem(12); + height: toRem(36); + border-radius: $borderRadius8; + + #{$b}__icon { + font-size: toRem(14); + } + } + + &-l { + padding: 0 toRem(16); + height: toRem(44); + border-radius: $borderRadius8; + + #{$b}__icon { + font-size: toRem(12); + } + } + } + + &--view { + &-brand { + background: var(--brand-main); + color: var(--white); + + &:hover { + background-color: var(--brand-hover); + } + } + + &-flat { + &:hover { + background-color: var(--grey-hover); + } + } + + &-secondary { + color: var(--brand-main); + + &:hover { + color: var(--brand-hover); + background-color: var(--brand-4); + } + } + + &-dense { + background-color: var(--brand-8); + color: var(--brand-main); + } + + &-blue { + background-color: var(--blue-14); + color: var(--dark-blue); + } + } + + &.is-only-icon { + padding: 0; + justify-content: center; + } + + &.is-disabled { + pointer-events: none; + opacity: 0.7; + } + + &.rounded { + border: 1px solid var(--dark-14); + // &:hover { + // background: rgba(0,0,0, .08); + // } + } +} diff --git a/src/shared/ui/Button/Button.vue b/src/shared/ui/Button/Button.vue new file mode 100644 index 0000000..4e4b174 --- /dev/null +++ b/src/shared/ui/Button/Button.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/shared/ui/Button/index.ts b/src/shared/ui/Button/index.ts new file mode 100644 index 0000000..86cccab --- /dev/null +++ b/src/shared/ui/Button/index.ts @@ -0,0 +1,3 @@ +import Button, { type ButtonProps } from './Button.vue' + +export { Button, type ButtonProps } diff --git a/src/shared/ui/ButtonMenu/ButtonMenu.scss b/src/shared/ui/ButtonMenu/ButtonMenu.scss new file mode 100644 index 0000000..762f98a --- /dev/null +++ b/src/shared/ui/ButtonMenu/ButtonMenu.scss @@ -0,0 +1,43 @@ +.button-menu { + display: inline-block; + position: relative; + + &__menu { + position: absolute; + top: calc(100% + #{toRem(12)}); + right: 0; + min-width: toRem(180); + border: 1px solid var(--grey-border); + background-color: var(--white); + padding: toRem(16); + border-radius: $borderRadius16; + z-index: 2; + + @include column(toRem(8)); + } + + &__menu-item { + display: flex; + align-items: center; + gap: toRem(4); + border-radius: $borderRadius6; + transition: background-color 0.3s ease; + height: toRem(36); + cursor: pointer; + padding: 0 toRem(8); + + &:hover { + background-color: var(--grey-main); + } + } + + &__icon { + font-size: toRem(16); + } + + &__text { + @include fontSize(s-13); + + white-space: nowrap; + } +} diff --git a/src/shared/ui/ButtonMenu/ButtonMenu.vue b/src/shared/ui/ButtonMenu/ButtonMenu.vue new file mode 100644 index 0000000..79073d0 --- /dev/null +++ b/src/shared/ui/ButtonMenu/ButtonMenu.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/shared/ui/ButtonMenu/index.ts b/src/shared/ui/ButtonMenu/index.ts new file mode 100644 index 0000000..966c19a --- /dev/null +++ b/src/shared/ui/ButtonMenu/index.ts @@ -0,0 +1,3 @@ +import ButtonMenu, { type ButtonMenuProps } from './ButtonMenu.vue' + +export { ButtonMenu, type ButtonMenuProps } diff --git a/src/shared/ui/ButtonSocial/ButtonSocial.scss b/src/shared/ui/ButtonSocial/ButtonSocial.scss new file mode 100644 index 0000000..a81b439 --- /dev/null +++ b/src/shared/ui/ButtonSocial/ButtonSocial.scss @@ -0,0 +1,24 @@ +.button-social { + display: flex; + padding: toRem(9) 0 toRem(9) toRem(60); + border-radius: $borderRadius8; + background-color: var(--white); + border: 1px solid var(--grey-border); + align-items: center; + gap: toRem(4); + cursor: pointer; + transition: border 0.3s ease; + + &__icon { + width: toRem(24); + height: toRem(24); + } + + &__text { + @include fontSize(b-15); + } + + &:hover { + border-color: var(--dark-main); + } +} diff --git a/src/shared/ui/ButtonSocial/ButtonSocial.vue b/src/shared/ui/ButtonSocial/ButtonSocial.vue new file mode 100644 index 0000000..8caaf8c --- /dev/null +++ b/src/shared/ui/ButtonSocial/ButtonSocial.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/shared/ui/ButtonSocial/index.ts b/src/shared/ui/ButtonSocial/index.ts new file mode 100644 index 0000000..9abe28c --- /dev/null +++ b/src/shared/ui/ButtonSocial/index.ts @@ -0,0 +1,3 @@ +import ButtonSocial, { type ButtonSocialProps } from './ButtonSocial.vue' + +export { ButtonSocial, type ButtonSocialProps } diff --git a/src/shared/ui/Card/Card.scss b/src/shared/ui/Card/Card.scss new file mode 100644 index 0000000..e1eb83a --- /dev/null +++ b/src/shared/ui/Card/Card.scss @@ -0,0 +1,32 @@ +.card { + display: flex; + flex-direction: column; + gap: toRem(11); + background-color: var(--light-blue); + border-radius: $borderRadius20; + + &--size { + &-m { + padding: toRem(24) toRem(24) toRem(20) toRem(24); + } + + &-l { + padding: toRem(30) toRem(32); + } + } + + &.rounded { + border: 1px solid var(--grey-border); + } + + &.hoverable { + &:hover { + border-color: var(--brand-main); + cursor: pointer; + } + } + + &.active { + border-color: var(--brand-main); + } +} diff --git a/src/shared/ui/Card/Card.vue b/src/shared/ui/Card/Card.vue new file mode 100644 index 0000000..4d5f869 --- /dev/null +++ b/src/shared/ui/Card/Card.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/shared/ui/Card/index.ts b/src/shared/ui/Card/index.ts new file mode 100644 index 0000000..d3b42e5 --- /dev/null +++ b/src/shared/ui/Card/index.ts @@ -0,0 +1,3 @@ +import Card, { type CardProps } from './Card.vue' + +export { Card, type CardProps } diff --git a/src/shared/ui/CheckBox/CheckBox.scss b/src/shared/ui/CheckBox/CheckBox.scss new file mode 100644 index 0000000..19690d6 --- /dev/null +++ b/src/shared/ui/CheckBox/CheckBox.scss @@ -0,0 +1,49 @@ +.check-box { + $b: &; + position: relative; + display: inline-flex; + align-items: center; + gap: toRem(8); + padding-left: 6px; + cursor: pointer; + @include fontSize( + s-13, + ( + line-height: 1, + ) + ); + + &.read-only { + pointer-events: none; + } + + &__inner { + display: block; + width: 16px; + height: 16px; + border-radius: $borderRadius4; + background-color: var(--dark-14); + display: flex; + align-items: center; + justify-content: center; + + svg path { + stroke: inherit; + } + } + + &__label { + padding-top: 3px; + } + + &__checkbox { + display: none; + + &:checked ~ #{$b}__inner { + background-color: var(--brand-main); + svg path { + stroke: #fff; + } + } + } +} diff --git a/src/shared/ui/CheckBox/CheckBox.vue b/src/shared/ui/CheckBox/CheckBox.vue new file mode 100644 index 0000000..89f2e0c --- /dev/null +++ b/src/shared/ui/CheckBox/CheckBox.vue @@ -0,0 +1,76 @@ + + diff --git a/src/shared/ui/CheckBox/index.ts b/src/shared/ui/CheckBox/index.ts new file mode 100644 index 0000000..0f697b5 --- /dev/null +++ b/src/shared/ui/CheckBox/index.ts @@ -0,0 +1,3 @@ +import CheckBox, { type CheckBoxProps } from './CheckBox.vue' + +export { CheckBox, type CheckBoxProps } diff --git a/src/shared/ui/DataList/DataList.scss b/src/shared/ui/DataList/DataList.scss new file mode 100644 index 0000000..1cbe876 --- /dev/null +++ b/src/shared/ui/DataList/DataList.scss @@ -0,0 +1,24 @@ +.data-list { + &__search { + padding: 0 0 toRem(24) 0; + } + &__label { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + &__body { + display: flex; + flex-direction: column; + gap: toRem(24); + padding: toRem(12) 0; + } + + &__additional--info { + color: var(--dark-64); + @include fontSize(s-13); + } +} diff --git a/src/shared/ui/DataList/DataList.vue b/src/shared/ui/DataList/DataList.vue new file mode 100644 index 0000000..c156c4f --- /dev/null +++ b/src/shared/ui/DataList/DataList.vue @@ -0,0 +1,77 @@ + + diff --git a/src/shared/ui/DataList/index.ts b/src/shared/ui/DataList/index.ts new file mode 100644 index 0000000..d32f562 --- /dev/null +++ b/src/shared/ui/DataList/index.ts @@ -0,0 +1,3 @@ +import DataList, { type DataListProps } from './DataList.vue' + +export { DataList, type DataListProps } diff --git a/src/shared/ui/DatePicker/DatePicker.scss b/src/shared/ui/DatePicker/DatePicker.scss new file mode 100644 index 0000000..08fc747 --- /dev/null +++ b/src/shared/ui/DatePicker/DatePicker.scss @@ -0,0 +1,28 @@ +.date-picker { + width: 100%; + display: flex; + align-items: center; + position: relative; + background-color: var(--grey-main); + border-radius: $borderRadius12; + + &:hover { + background-color: var(--grey-hover); + } + + i { + position: absolute; + right: toRem(20); + } + + &.size { + &-m { + height: toRem(44); + font-weight: 400; + } + &-l { + height: toRem(57); + width: 500; + } + } +} diff --git a/src/shared/ui/DatePicker/DatePicker.vue b/src/shared/ui/DatePicker/DatePicker.vue new file mode 100644 index 0000000..f8cd7a4 --- /dev/null +++ b/src/shared/ui/DatePicker/DatePicker.vue @@ -0,0 +1,44 @@ + + diff --git a/src/shared/ui/DatePicker/index.ts b/src/shared/ui/DatePicker/index.ts new file mode 100644 index 0000000..57377af --- /dev/null +++ b/src/shared/ui/DatePicker/index.ts @@ -0,0 +1,3 @@ +import DatePicker, { type DatePickerProps } from './DatePicker.vue' + +export { DatePicker, type DatePickerProps } diff --git a/src/shared/ui/Dropdown/Dropdown.scss b/src/shared/ui/Dropdown/Dropdown.scss new file mode 100644 index 0000000..e562b3a --- /dev/null +++ b/src/shared/ui/Dropdown/Dropdown.scss @@ -0,0 +1,40 @@ +.dropdown { + width: 100%; + min-width: 200px; + position: relative; + + &:focus .dropdown__menu { + opacity: 1; + visibility: visible; + } + + &__control { + display: flex; + align-items: center; + justify-content: space-between; + padding: toRem(10) toRem(24); + border-radius: $borderRadius12; + cursor: pointer; + font-size: toRem(15); + line-height: toRem(24); + color: var(--text-primary); + background-color: var(--grey-64); + + i { + font-size: 20px; + } + } + + &__menu { + border-radius: $borderRadius12; + position: absolute; + padding: toRem(16); + top: 110%; + left: 0; + right: 0; + opacity: 0; + visibility: hidden; + border: 1px solid #dddfe0; + transition: all 0.2s linear; + } +} diff --git a/src/shared/ui/Dropdown/Dropdown.vue b/src/shared/ui/Dropdown/Dropdown.vue new file mode 100644 index 0000000..3c93115 --- /dev/null +++ b/src/shared/ui/Dropdown/Dropdown.vue @@ -0,0 +1,21 @@ + + diff --git a/src/shared/ui/Dropdown/index.ts b/src/shared/ui/Dropdown/index.ts new file mode 100644 index 0000000..b771c9e --- /dev/null +++ b/src/shared/ui/Dropdown/index.ts @@ -0,0 +1,3 @@ +import Dropdown, { type DropdownProps } from './Dropdown.vue' + +export { Dropdown, type DropdownProps } diff --git a/src/shared/ui/FileCard/FileCard.scss b/src/shared/ui/FileCard/FileCard.scss new file mode 100644 index 0000000..c63ffdb --- /dev/null +++ b/src/shared/ui/FileCard/FileCard.scss @@ -0,0 +1,15 @@ +.file-card { + @include row(toRem(11)); + + align-items: center; + transition: background-color 0.3s ease; + border-radius: $borderRadius8; + background-color: var(--white); + + &.hoverable { + &:hover { + cursor: pointer; + background-color: var(--grey-64); + } + } +} diff --git a/src/shared/ui/FileCard/FileCard.vue b/src/shared/ui/FileCard/FileCard.vue new file mode 100644 index 0000000..eaf3fc4 --- /dev/null +++ b/src/shared/ui/FileCard/FileCard.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/shared/ui/FileCard/index.ts b/src/shared/ui/FileCard/index.ts new file mode 100644 index 0000000..4a50c6b --- /dev/null +++ b/src/shared/ui/FileCard/index.ts @@ -0,0 +1,3 @@ +import FileCard, { type FileCardProps } from './FileCard.vue' + +export { FileCard, type FileCardProps } diff --git a/src/shared/ui/IconBase/IconBase.scss b/src/shared/ui/IconBase/IconBase.scss new file mode 100644 index 0000000..15a7ce5 --- /dev/null +++ b/src/shared/ui/IconBase/IconBase.scss @@ -0,0 +1,40 @@ +.icon-base { + display: inline-block; + font-weight: 400; + + &::before { + font-family: $icon; + display: block; + font-size: inherit; + color: inherit; + line-height: 1; + } + + &.icon--size { + &-xs { + font-size: toRem(12); + } + + &-m { + font-size: toRem(16); + } + + &-l { + font-size: toRem(20); + } + } + + &.icon--view { + &-secondary { + color: var(--dark-64); + } + + &-brand { + color: var(--brand-main); + } + + &-danger { + color: var(--berry-main); + } + } +} diff --git a/src/shared/ui/IconBase/IconBase.vue b/src/shared/ui/IconBase/IconBase.vue new file mode 100644 index 0000000..4d184e6 --- /dev/null +++ b/src/shared/ui/IconBase/IconBase.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/shared/ui/IconBase/index.ts b/src/shared/ui/IconBase/index.ts new file mode 100644 index 0000000..8ae8276 --- /dev/null +++ b/src/shared/ui/IconBase/index.ts @@ -0,0 +1,3 @@ +import IconBase, { type IconBaseProps } from './IconBase.vue' + +export { IconBase, type IconBaseProps } diff --git a/src/shared/ui/InfinityLoading/InfinityLoading.scss b/src/shared/ui/InfinityLoading/InfinityLoading.scss new file mode 100644 index 0000000..765cd18 --- /dev/null +++ b/src/shared/ui/InfinityLoading/InfinityLoading.scss @@ -0,0 +1 @@ +@import 'v3-infinite-loading/lib/style.css'; diff --git a/src/shared/ui/InfinityLoading/InfinityLoading.vue b/src/shared/ui/InfinityLoading/InfinityLoading.vue new file mode 100644 index 0000000..24149ae --- /dev/null +++ b/src/shared/ui/InfinityLoading/InfinityLoading.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/shared/ui/InfinityLoading/index.ts b/src/shared/ui/InfinityLoading/index.ts new file mode 100644 index 0000000..ec382f0 --- /dev/null +++ b/src/shared/ui/InfinityLoading/index.ts @@ -0,0 +1,5 @@ +import InfinityLoading, { + type InfinityLoadingProps, +} from './InfinityLoading.vue' + +export { InfinityLoading, type InfinityLoadingProps } diff --git a/src/shared/ui/Input/Input.scss b/src/shared/ui/Input/Input.scss new file mode 100644 index 0000000..db53ee8 --- /dev/null +++ b/src/shared/ui/Input/Input.scss @@ -0,0 +1,45 @@ +.input { + display: flex; + align-items: center; + gap: toRem(8); + background-color: var(--grey-main); + border-radius: $borderRadius12; + padding: 0 toRem(20); + color: var(--dark-main); + transition: background 0.3s ease; + + &__value { + border: none; + height: 100%; + background-color: transparent; + width: 100%; + } + + &.size { + &-m { + height: toRem(44); + font-weight: 400; + } + &-l { + height: toRem(57); + width: 500; + } + } + + &.readonly { + cursor: not-allowed; + } + + input:-webkit-autofill { + box-shadow: inset 0 0 0 30px var(--grey-main); + transition: box-shadow 0.3s ease; + + &:hover { + box-shadow: inset 0 0 0 1000px var(--grey-hover); + } + } + + &:hover { + background-color: var(--grey-hover); + } +} diff --git a/src/shared/ui/Input/Input.vue b/src/shared/ui/Input/Input.vue new file mode 100644 index 0000000..f3eeb6e --- /dev/null +++ b/src/shared/ui/Input/Input.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/shared/ui/Input/index.ts b/src/shared/ui/Input/index.ts new file mode 100644 index 0000000..deae6fb --- /dev/null +++ b/src/shared/ui/Input/index.ts @@ -0,0 +1,3 @@ +import Input, { type InputProps } from './Input.vue' + +export { Input, type InputProps } diff --git a/src/shared/ui/InputLink/InputLink.scss b/src/shared/ui/InputLink/InputLink.scss new file mode 100644 index 0000000..c4af096 --- /dev/null +++ b/src/shared/ui/InputLink/InputLink.scss @@ -0,0 +1,60 @@ +.input-link { + position: relative; + + &__icon { + width: toRem(12); + height: toRem(12); + color: var(--dark-32); + + &.active { + color: var(--brand-main); + } + } + + &__toolbar { + position: absolute; + top: - toRem(46); + left: - toRem(12); + width: toRem(264); + padding: toRem(6); + border-radius: $borderRadius6; + background-color: var(--white); + box-shadow: + 0px 0px 32px 0px rgba(0, 0, 0, 0.08), + 0px 0px 0px 0px rgba(0, 0, 0, 0.04); + display: none; + transition: all 0.25s linear; + + &--input { + width: 100%; + padding: toRem(6) toRem(58) toRem(6) toRem(6); + border-radius: $borderRadius6; + border: 1px solid var(--Grey-border, #dfe4ed); + @include fontSize(s-13); + } + + button { + position: absolute; + width: toRem(22) !important; + height: toRem(22); + top: toRem(9); + border-radius: toRem(5); + + &:nth-child(2) { + right: toRem(39); + + i { + font-size: toRem(14); + } + } + + &:nth-child(3) { + right: toRem(12); + + i { + font-size: toRem(10) !important; + } + } + } + } +} diff --git a/src/shared/ui/InputLink/InputLink.vue b/src/shared/ui/InputLink/InputLink.vue new file mode 100644 index 0000000..9ea0d5f --- /dev/null +++ b/src/shared/ui/InputLink/InputLink.vue @@ -0,0 +1,75 @@ + + diff --git a/src/shared/ui/InputLink/index.ts b/src/shared/ui/InputLink/index.ts new file mode 100644 index 0000000..73ba231 --- /dev/null +++ b/src/shared/ui/InputLink/index.ts @@ -0,0 +1,3 @@ +import InputLink, { type InputLinkProps } from './InputLink.vue' + +export { InputLink, type InputLinkProps } diff --git a/src/shared/ui/Link/Link.scss b/src/shared/ui/Link/Link.scss new file mode 100644 index 0000000..2422477 --- /dev/null +++ b/src/shared/ui/Link/Link.scss @@ -0,0 +1,43 @@ +.link { + $b: &; + + display: inline-flex; + gap: toRem(8); + align-items: center; + cursor: pointer; + transition: color 0.3s ease; + + &__icon { + font-size: toRem(12); + } + + &--view { + &-brand { + color: var(--brand-main); + + &:hover { + color: var(--brand-hover); + } + } + + &-base { + &:hover { + color: var(--dark-64); + } + } + } + + &--size { + &-xs { + #{$b}__text { + @include fontSize(s-12); + } + } + + &-s { + #{$b}__text { + @include fontSize(s-13); + } + } + } +} diff --git a/src/shared/ui/Link/Link.vue b/src/shared/ui/Link/Link.vue new file mode 100644 index 0000000..56ff69b --- /dev/null +++ b/src/shared/ui/Link/Link.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/shared/ui/Link/index.ts b/src/shared/ui/Link/index.ts new file mode 100644 index 0000000..6911264 --- /dev/null +++ b/src/shared/ui/Link/index.ts @@ -0,0 +1,3 @@ +import Link, { type LinkProps } from './Link.vue' + +export { Link, type LinkProps } diff --git a/src/shared/ui/Logo/Logo.scss b/src/shared/ui/Logo/Logo.scss new file mode 100644 index 0000000..3f84821 --- /dev/null +++ b/src/shared/ui/Logo/Logo.scss @@ -0,0 +1,20 @@ +.logo { + background: var(--brand-linear); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + text-transform: uppercase; + font-weight: 900; + + &--size { + &-m { + font-size: toRem(24); + letter-spacing: -0.24px; + } + + &-l { + font-size: toRem(60); + letter-spacing: -0.6px; + } + } +} diff --git a/src/shared/ui/Logo/Logo.vue b/src/shared/ui/Logo/Logo.vue new file mode 100644 index 0000000..24fc736 --- /dev/null +++ b/src/shared/ui/Logo/Logo.vue @@ -0,0 +1,13 @@ + + + diff --git a/src/shared/ui/Logo/index.ts b/src/shared/ui/Logo/index.ts new file mode 100644 index 0000000..e2be97b --- /dev/null +++ b/src/shared/ui/Logo/index.ts @@ -0,0 +1,3 @@ +import Logo, { type LogoProps } from './Logo.vue' + +export { Logo, type LogoProps } diff --git a/src/shared/ui/MenuItem/MenuItem.scss b/src/shared/ui/MenuItem/MenuItem.scss new file mode 100644 index 0000000..8c68104 --- /dev/null +++ b/src/shared/ui/MenuItem/MenuItem.scss @@ -0,0 +1,42 @@ +.menu-item { + $b: &; + + display: flex; + gap: toRem(8); + align-items: center; + height: toRem(32); + padding: 0 toRem(18); + border-radius: $borderRadius6; + transition: background-color 0.3s ease; + + @include fontSize(s-13); + + &__icon { + font-size: toRem(16); + } + + &--view { + &-base { + #{$b}__icon { + color: var(--dark-main); + } + } + + &-brand { + #{$b}__icon { + color: var(--brand-main); + } + } + + &-orange { + #{$b}__icon { + color: var(--orange-main); + } + } + } + + &--active, + &:hover { + background-color: var(--grey-main); + } +} diff --git a/src/shared/ui/MenuItem/MenuItem.vue b/src/shared/ui/MenuItem/MenuItem.vue new file mode 100644 index 0000000..d3aae11 --- /dev/null +++ b/src/shared/ui/MenuItem/MenuItem.vue @@ -0,0 +1,40 @@ + + + diff --git a/src/shared/ui/MenuItem/index.ts b/src/shared/ui/MenuItem/index.ts new file mode 100644 index 0000000..58d998b --- /dev/null +++ b/src/shared/ui/MenuItem/index.ts @@ -0,0 +1,3 @@ +import MenuItem, { type MenuItemProps } from './MenuItem.vue' + +export { MenuItem, type MenuItemProps } diff --git a/src/shared/ui/MenuItemList/MenuItemList.scss b/src/shared/ui/MenuItemList/MenuItemList.scss new file mode 100644 index 0000000..de6f9ea --- /dev/null +++ b/src/shared/ui/MenuItemList/MenuItemList.scss @@ -0,0 +1,11 @@ +.menu-item-list { + &, + &__links-children { + @include column(toRem(8)); + } + + &__links-children { + padding-top: toRem(8); + padding-left: toRem(24); + } +} diff --git a/src/shared/ui/MenuItemList/MenuItemList.vue b/src/shared/ui/MenuItemList/MenuItemList.vue new file mode 100644 index 0000000..c9abac9 --- /dev/null +++ b/src/shared/ui/MenuItemList/MenuItemList.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/shared/ui/MenuItemList/index.ts b/src/shared/ui/MenuItemList/index.ts new file mode 100644 index 0000000..9951ce8 --- /dev/null +++ b/src/shared/ui/MenuItemList/index.ts @@ -0,0 +1,3 @@ +import MenuItemList, { type MenuItemListProps } from './MenuItemList.vue' + +export { MenuItemList, type MenuItemListProps } diff --git a/src/shared/ui/RadioBox/RadioBox.scss b/src/shared/ui/RadioBox/RadioBox.scss new file mode 100644 index 0000000..74fa129 --- /dev/null +++ b/src/shared/ui/RadioBox/RadioBox.scss @@ -0,0 +1,36 @@ +.radio-box { + display: table-cell; + cursor: pointer; + + &__label { + margin: 2px; + display: flex; + align-items: center; + justify-content: center; + background: var(--grey-main); + border: 1px solid #000; + padding: 2px toRem(8) 0; + border: 1.5px solid var(--grey-main); + border-radius: $borderRadius4; + @include fontSize( + b-14, + ( + line-height: normal, + ) + ); + height: 32px; + + &--active { + background: var(--white); + border-color: var(--brand-main); + } + } + + &__checkbox { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + } +} diff --git a/src/shared/ui/RadioBox/RadioBox.vue b/src/shared/ui/RadioBox/RadioBox.vue new file mode 100644 index 0000000..fbfaed4 --- /dev/null +++ b/src/shared/ui/RadioBox/RadioBox.vue @@ -0,0 +1,31 @@ + + diff --git a/src/shared/ui/RadioBox/index.ts b/src/shared/ui/RadioBox/index.ts new file mode 100644 index 0000000..d46926a --- /dev/null +++ b/src/shared/ui/RadioBox/index.ts @@ -0,0 +1,3 @@ +import RadioBox, { type RadioBoxProps } from './RadioBox.vue' + +export { RadioBox, type RadioBoxProps } diff --git a/src/shared/ui/RadioInput/RadioInput.scss b/src/shared/ui/RadioInput/RadioInput.scss new file mode 100644 index 0000000..2d504d0 --- /dev/null +++ b/src/shared/ui/RadioInput/RadioInput.scss @@ -0,0 +1,58 @@ +.radio-input { + $b: &; + position: relative; + display: inline-flex; + align-items: center; + gap: toRem(8); + padding-left: 6px; + cursor: pointer; + @include fontSize( + s-13, + ( + line-height: 1, + ) + ); + + &.read-only { + pointer-events: none; + } + + &__inner { + display: block; + width: 16px; + height: 16px; + border-radius: 50%; + background-color: var(--brand-8); + position: relative; + &::before { + content: ''; + position: absolute; + width: 8px; + height: 8px; + background-color: var(--brand-main); + border-radius: 50%; + opacity: 0; + visibility: hidden; + @include center(both); + transition: all 0.25s linear; + } + + &.active::before { + opacity: 1; + visibility: visible; + } + } + + &__label { + padding-top: 3px; + } + + &__radio { + display: none; + + &:checked ~ #{$b}__inner::before { + opacity: 1; + visibility: visible; + } + } +} diff --git a/src/shared/ui/RadioInput/RadioInput.vue b/src/shared/ui/RadioInput/RadioInput.vue new file mode 100644 index 0000000..287c369 --- /dev/null +++ b/src/shared/ui/RadioInput/RadioInput.vue @@ -0,0 +1,36 @@ + + diff --git a/src/shared/ui/RadioInput/index.ts b/src/shared/ui/RadioInput/index.ts new file mode 100644 index 0000000..109a6ea --- /dev/null +++ b/src/shared/ui/RadioInput/index.ts @@ -0,0 +1,3 @@ +import RadioInput, { type RadioInputProps } from './RadioInput.vue' + +export { RadioInput, type RadioInputProps } diff --git a/src/shared/ui/Spinner/Spinner.scss b/src/shared/ui/Spinner/Spinner.scss new file mode 100644 index 0000000..fb48494 --- /dev/null +++ b/src/shared/ui/Spinner/Spinner.scss @@ -0,0 +1,30 @@ +.spinner { + position: relative; + border-radius: 100%; + overflow: hidden; + + img, + svg { + display: block; + width: 100%; + height: 100%; + animation: rotate360 1s infinite linear; + } + + &--size { + &-s { + width: toRem(16); + height: toRem(16); + } + + &-m { + width: toRem(20); + height: toRem(20); + } + + &-xxl { + width: toRem(80); + height: toRem(80); + } + } +} diff --git a/src/shared/ui/Spinner/Spinner.vue b/src/shared/ui/Spinner/Spinner.vue new file mode 100644 index 0000000..94db714 --- /dev/null +++ b/src/shared/ui/Spinner/Spinner.vue @@ -0,0 +1,75 @@ + + + diff --git a/src/shared/ui/Spinner/index.ts b/src/shared/ui/Spinner/index.ts new file mode 100644 index 0000000..5bb4f27 --- /dev/null +++ b/src/shared/ui/Spinner/index.ts @@ -0,0 +1,3 @@ +import Spinner, { type SpinnerProps } from './Spinner.vue' + +export { Spinner, type SpinnerProps } diff --git a/src/shared/ui/Tabs/Tabs.scss b/src/shared/ui/Tabs/Tabs.scss new file mode 100644 index 0000000..5f92eba --- /dev/null +++ b/src/shared/ui/Tabs/Tabs.scss @@ -0,0 +1,46 @@ +.tabs { + &__list { + display: flex; + gap: toRem(8); + } + + &__item { + display: flex; + align-items: center; + padding: 0 toRem(16); + height: toRem(32); + border-radius: $borderRadius8; + border: 1px solid var(--grey-hover); + background-color: var(--white); + transition: border 0.3s ease; + + @include fontSize( + s-13, + ( + line-height: toRem(20), + ) + ); + + &:hover { + border-color: var(--grey-border); + } + } + + &__scroller { + position: relative; + } + + &__toggle { + position: absolute; + left: 0; + top: 0; + bottom: 0; + border-radius: $borderRadius8; + //background-color: var(--white); + border: 2px solid var(--brand-main); + box-sizing: border-box; + + transition: 0.3s ease; + transition-property: transform, width; + } +} diff --git a/src/shared/ui/Tabs/Tabs.vue b/src/shared/ui/Tabs/Tabs.vue new file mode 100644 index 0000000..a180bd3 --- /dev/null +++ b/src/shared/ui/Tabs/Tabs.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/shared/ui/Tabs/index.ts b/src/shared/ui/Tabs/index.ts new file mode 100644 index 0000000..63f62ae --- /dev/null +++ b/src/shared/ui/Tabs/index.ts @@ -0,0 +1,3 @@ +import Tabs, { type TabsProps } from './Tabs.vue' + +export { Tabs, type TabsProps } diff --git a/src/shared/ui/Tag/Tag.scss b/src/shared/ui/Tag/Tag.scss new file mode 100644 index 0000000..87ed945 --- /dev/null +++ b/src/shared/ui/Tag/Tag.scss @@ -0,0 +1,33 @@ +.tag { + display: inline-flex; + align-items: center; + padding: toRem(4) toRem(6); + border-radius: $borderRadius6; + height: toRem(24); + transition: background-color 0.3s ease; + white-space: nowrap; + + @include fontSize(s-12); + + &.is-hoverable { + background-color: transparent; + } + + &--view { + &-base { + background-color: var(--blue-20); + + &:hover { + background-color: var(--blue-20); + } + } + + &-grey { + background-color: var(--grey-hover); + + &:hover { + background-color: var(--grey-hover); + } + } + } +} diff --git a/src/shared/ui/Tag/Tag.vue b/src/shared/ui/Tag/Tag.vue new file mode 100644 index 0000000..10f15a1 --- /dev/null +++ b/src/shared/ui/Tag/Tag.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/shared/ui/Tag/index.ts b/src/shared/ui/Tag/index.ts new file mode 100644 index 0000000..59c94a9 --- /dev/null +++ b/src/shared/ui/Tag/index.ts @@ -0,0 +1,3 @@ +import Tag, { type TagProps } from './Tag.vue' + +export { Tag, type TagProps } diff --git a/src/shared/ui/Textarea/Textarea.scss b/src/shared/ui/Textarea/Textarea.scss new file mode 100644 index 0000000..a4b7906 --- /dev/null +++ b/src/shared/ui/Textarea/Textarea.scss @@ -0,0 +1,32 @@ +.textarea { + width: 100%; + display: flex; + align-items: center; + gap: toRem(8); + background-color: var(--grey-main); + border-radius: $borderRadius12; + padding: toRem(20); + color: var(--dark-main); + transition: background 0.3s ease; + + &__value { + width: 100%; + height: 100%; + min-height: 50px; + border: none; + background-color: transparent; + } + + input:-webkit-autofill { + box-shadow: inset 0 0 0 30px var(--grey-main); + transition: box-shadow 0.3s ease; + + &:hover { + box-shadow: inset 0 0 0 1000px var(--grey-hover); + } + } + + &:hover { + background-color: var(--grey-hover); + } +} diff --git a/src/shared/ui/Textarea/Textarea.vue b/src/shared/ui/Textarea/Textarea.vue new file mode 100644 index 0000000..3c41bf2 --- /dev/null +++ b/src/shared/ui/Textarea/Textarea.vue @@ -0,0 +1,26 @@ + + diff --git a/src/shared/ui/Textarea/index.ts b/src/shared/ui/Textarea/index.ts new file mode 100644 index 0000000..7149694 --- /dev/null +++ b/src/shared/ui/Textarea/index.ts @@ -0,0 +1,3 @@ +import Textarea, { type TextareaProps } from './Textarea.vue' + +export { Textarea, type TextareaProps } diff --git a/src/shared/ui/ToastIcon/ToastIcon.scss b/src/shared/ui/ToastIcon/ToastIcon.scss new file mode 100644 index 0000000..ec1a96c --- /dev/null +++ b/src/shared/ui/ToastIcon/ToastIcon.scss @@ -0,0 +1,11 @@ +.toast-icon { + &--view { + &-success { + color: var(--green-border); + } + + &-error { + color: var(--critical-main); + } + } +} diff --git a/src/shared/ui/ToastIcon/ToastIcon.vue b/src/shared/ui/ToastIcon/ToastIcon.vue new file mode 100644 index 0000000..c21af95 --- /dev/null +++ b/src/shared/ui/ToastIcon/ToastIcon.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/shared/ui/ToastIcon/index.ts b/src/shared/ui/ToastIcon/index.ts new file mode 100644 index 0000000..e574785 --- /dev/null +++ b/src/shared/ui/ToastIcon/index.ts @@ -0,0 +1,3 @@ +import ToastIcon, { type ToastIconProps } from './ToastIcon.vue' + +export { ToastIcon, type ToastIconProps } diff --git a/src/shared/ui/Tooltip/Tooltip.scss b/src/shared/ui/Tooltip/Tooltip.scss new file mode 100644 index 0000000..053f85b --- /dev/null +++ b/src/shared/ui/Tooltip/Tooltip.scss @@ -0,0 +1,44 @@ +.tooltip { + position: relative; + + &__parent { + cursor: pointer; + } + + &__header { + display: flex; + gap: toRem(12); + align-items: center; + } + + &__icon-wrapper { + padding: toRem(5); + width: toRem(24); + height: toRem(24); + border-radius: $borderRadius6; + background-color: var(--brand-20); + color: var(--purple-main); + } + + &__icon { + font-size: toRem(14); + } + + &__title { + font-weight: 700; + } + + &__content { + position: absolute; + left: 0; + z-index: 2; + + border: 1px solid var(--grey-border); + border-radius: $borderRadius16; + padding: toRem(24); + background-color: var(--white); + @include column(toRem(24)); + + display: inline-flex; + } +} diff --git a/src/shared/ui/Tooltip/Tooltip.vue b/src/shared/ui/Tooltip/Tooltip.vue new file mode 100644 index 0000000..192246e --- /dev/null +++ b/src/shared/ui/Tooltip/Tooltip.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/shared/ui/Tooltip/index.ts b/src/shared/ui/Tooltip/index.ts new file mode 100644 index 0000000..bf3c0fa --- /dev/null +++ b/src/shared/ui/Tooltip/index.ts @@ -0,0 +1,3 @@ +import Tooltip, { type TooltipProps } from './Tooltip.vue' + +export { Tooltip, type TooltipProps } diff --git a/src/shared/ui/TransitionFade/TransitionFade.scss b/src/shared/ui/TransitionFade/TransitionFade.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/shared/ui/TransitionFade/TransitionFade.vue b/src/shared/ui/TransitionFade/TransitionFade.vue new file mode 100644 index 0000000..ec85dd5 --- /dev/null +++ b/src/shared/ui/TransitionFade/TransitionFade.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/shared/ui/TransitionFade/index.ts b/src/shared/ui/TransitionFade/index.ts new file mode 100644 index 0000000..03979bc --- /dev/null +++ b/src/shared/ui/TransitionFade/index.ts @@ -0,0 +1,3 @@ +import TransitionFade, { type TransitionFadeProps } from './TransitionFade.vue' + +export { TransitionFade, type TransitionFadeProps } diff --git a/src/shared/ui/UserBase/UserBase.scss b/src/shared/ui/UserBase/UserBase.scss new file mode 100644 index 0000000..22b4486 --- /dev/null +++ b/src/shared/ui/UserBase/UserBase.scss @@ -0,0 +1,18 @@ +.user-base { + $b: &; + + display: flex; + gap: toRem(8); + align-items: center; + padding: toRem(2) 0; + + &__avatar { + border-radius: 50%; + width: toRem(32); + height: toRem(32); + } + + &__name { + @include fontSize(s-12); + } +} diff --git a/src/shared/ui/UserBase/UserBase.vue b/src/shared/ui/UserBase/UserBase.vue new file mode 100644 index 0000000..d817be1 --- /dev/null +++ b/src/shared/ui/UserBase/UserBase.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/shared/ui/UserBase/index.ts b/src/shared/ui/UserBase/index.ts new file mode 100644 index 0000000..fb44d1a --- /dev/null +++ b/src/shared/ui/UserBase/index.ts @@ -0,0 +1,3 @@ +import UserBase, { type UserBaseProps } from './UserBase.vue' + +export { UserBase, type UserBaseProps } diff --git a/src/shared/ui/index.ts b/src/shared/ui/index.ts new file mode 100644 index 0000000..55913c0 --- /dev/null +++ b/src/shared/ui/index.ts @@ -0,0 +1,30 @@ +export * from './IconBase' +export * from './Button' +export * from './Card' +export * from './TransitionFade' +export * from './Input' +export * from './MenuItem' +export * from './MenuItemList' +export * from './UserBase' +export * from './Link' +export * from './ButtonMenu' +export * from './Tag' +export * from './Tooltip' +export * from './Spinner' +export * from './ToastIcon' +export * from './Tabs' +export * from './InfinityLoading' +export * from './Logo' +export * from './AuthForm' +export * from './AuthCard' +export * from './ButtonSocial' +export * from './Dropdown' +export * from './RadioBox' +export * from './CheckBox' +export * from './DataList' +export * from './Textarea' +export * from './DatePicker' +export * from './FileCard' +export * from './RadioInput' +export * from './Accordion' +export * from './InputLink' diff --git a/src/shared/utils/functions/date.ts b/src/shared/utils/functions/date.ts new file mode 100644 index 0000000..16a92b0 --- /dev/null +++ b/src/shared/utils/functions/date.ts @@ -0,0 +1,46 @@ +export const formattingDateForClient = ( + date: string, + format: 'long' | 'short' = 'long', +) => { + const dateSrc = new Date(date).toLocaleString('ru', { + // year: 'numeric', + month: format, + day: 'numeric', + }) + + return dateSrc.split('.').join('.') +} + +export const dateToAge = (date: string) => { + const birthYear = +new Date(date).toLocaleString('ru', { + year: 'numeric', + }) + + const currentYear = +new Date().toLocaleString('ru', { + year: 'numeric', + }) + + return currentYear - birthYear +} + +export const getSeconds = (date: string) => { + return Math.floor(new Date(date).getTime() / 1000) +} + +export const prettifyDate = (date: string | undefined) => { + if (!date) return + + date = new Intl.DateTimeFormat('en-GB').format(new Date(date)) + + return date.split('/').join('.') +} + +export const getTimeFromDate = (val: string) => { + if (!val) return + const date = new Intl.DateTimeFormat('ru', { + hour: 'numeric', + minute: 'numeric', + }).format(new Date(val)) + + return date +} diff --git a/src/shared/utils/functions/declension.ts b/src/shared/utils/functions/declension.ts new file mode 100644 index 0000000..ef8eb35 --- /dev/null +++ b/src/shared/utils/functions/declension.ts @@ -0,0 +1,16 @@ +export const declension = (number: number, words: string[]) => { + let word + if (number % 10 === 1 && number % 100 !== 11) { + word = words[0] // for numbers ending in 1, except 11 + } else if ( + number % 10 >= 2 && + number % 10 <= 4 && + (number % 100 < 10 || number % 100 >= 20) + ) { + word = words[1] // for numbers ending in 2, 3, 4, except 12, 13, 14 + } else { + word = words[2] // for all other cases + } + + return `${number} ${word}` +} diff --git a/src/shared/utils/functions/getIconSvg.ts b/src/shared/utils/functions/getIconSvg.ts new file mode 100644 index 0000000..a958281 --- /dev/null +++ b/src/shared/utils/functions/getIconSvg.ts @@ -0,0 +1,7 @@ +import type { IconSvgNames } from '@/shared' + +export const getIconSvg = (name: IconSvgNames) => { + const directory = `/images/icons/` + + return `${directory}/${name}.svg` +} diff --git a/src/shared/utils/functions/index.ts b/src/shared/utils/functions/index.ts new file mode 100644 index 0000000..9017af4 --- /dev/null +++ b/src/shared/utils/functions/index.ts @@ -0,0 +1,4 @@ +export * from './getIconSvg' +export * from './declension' +export * from './date' +export * from './other' diff --git a/src/shared/utils/functions/other.ts b/src/shared/utils/functions/other.ts new file mode 100644 index 0000000..2635112 --- /dev/null +++ b/src/shared/utils/functions/other.ts @@ -0,0 +1,7 @@ +export const getGender = (gender: Gender) => (gender ? 'М' : 'Ж') + +export const toRem = (px: number) => { + const rem = 12 + + return `${(px / 12) * rem}rem` +} diff --git a/src/shared/utils/index.ts b/src/shared/utils/index.ts new file mode 100644 index 0000000..326e352 --- /dev/null +++ b/src/shared/utils/index.ts @@ -0,0 +1 @@ +export * from './functions' diff --git a/src/shared/utils/npm/formattingIcons.js b/src/shared/utils/npm/formattingIcons.js new file mode 100644 index 0000000..0d580d3 --- /dev/null +++ b/src/shared/utils/npm/formattingIcons.js @@ -0,0 +1,11 @@ +/* eslint-env node */ +const SVGFixer = require('oslllo-svg-fixer') + +const iconsFolder = './src/shared/assets/icons' +const destination = './src/shared/assets/icons/formatting' + +SVGFixer(iconsFolder, destination, { + showProgressBar: true, +}) + .fix() + .then() diff --git a/src/shims-vue.ts b/src/shims-vue.ts new file mode 100644 index 0000000..31e5f11 --- /dev/null +++ b/src/shims-vue.ts @@ -0,0 +1,10 @@ +export {} + +declare module 'vue-router' { + interface RouteMeta { + middleware?: unknown + page?: { + title: string + } + } +} diff --git a/src/widgets/index.ts b/src/widgets/index.ts new file mode 100644 index 0000000..5f61722 --- /dev/null +++ b/src/widgets/index.ts @@ -0,0 +1,4 @@ +export * from './layouts' +export * from './patient' +export * from './modals' +export * from './navigation' diff --git a/src/widgets/layouts/index.ts b/src/widgets/layouts/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/widgets/layouts/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/widgets/layouts/ui/PageLayout/PageLayout.scss b/src/widgets/layouts/ui/PageLayout/PageLayout.scss new file mode 100644 index 0000000..ae69bcf --- /dev/null +++ b/src/widgets/layouts/ui/PageLayout/PageLayout.scss @@ -0,0 +1,52 @@ +.page-layout { + padding-left: $widthSideBar; + height: 100%; + overflow-y: auto; + + &__header { + display: flex; + align-items: center; + justify-content: space-between; + height: toRem(90); + + &--small { + height: toRem(60); + } + } + + &__control { + display: flex; + align-items: center; + height: toRem(90); + } + + &__title { + @include fontSize( + h2, + ( + weight: 500, + ) + ); + } + + &__wrapper { + box-sizing: content-box; + padding: 0 toRem(60); + max-width: toRem(1024); + margin: 0 auto; + position: relative; + height: 100%; + } + + &__tabs { + margin-bottom: toRem(24); + } + + &__spinner { + @include center(); + } + + &__content { + padding-bottom: toRem(20); + } +} diff --git a/src/widgets/layouts/ui/PageLayout/PageLayout.vue b/src/widgets/layouts/ui/PageLayout/PageLayout.vue new file mode 100644 index 0000000..2a494f5 --- /dev/null +++ b/src/widgets/layouts/ui/PageLayout/PageLayout.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/widgets/layouts/ui/PageLayout/index.ts b/src/widgets/layouts/ui/PageLayout/index.ts new file mode 100644 index 0000000..8998991 --- /dev/null +++ b/src/widgets/layouts/ui/PageLayout/index.ts @@ -0,0 +1,3 @@ +import PageLayout, { type PageLayoutProps } from './PageLayout.vue' + +export { PageLayout, type PageLayoutProps } diff --git a/src/widgets/layouts/ui/index.ts b/src/widgets/layouts/ui/index.ts new file mode 100644 index 0000000..c3fa771 --- /dev/null +++ b/src/widgets/layouts/ui/index.ts @@ -0,0 +1 @@ +export * from './PageLayout' diff --git a/src/widgets/modals/index.ts b/src/widgets/modals/index.ts new file mode 100644 index 0000000..1ccc9c5 --- /dev/null +++ b/src/widgets/modals/index.ts @@ -0,0 +1,2 @@ +export * from './ui' +export * from './model' diff --git a/src/widgets/modals/model/index.ts b/src/widgets/modals/model/index.ts new file mode 100644 index 0000000..497dcff --- /dev/null +++ b/src/widgets/modals/model/index.ts @@ -0,0 +1,48 @@ +import { defineStore } from 'pinia' +import { reactive } from 'vue' +import type { ModalDialogProps } from '@/widgets/modals/ui/ModalDialog' +import { Stores } from '@/shared' + +export enum ModalsName { + DIALOG = 'dialog', + EDITPATIENT = 'edit-patient', + SELECTQUESTIONAIRE = 'select-questionnaire', + ADDDESTINATION = 'add-destination', + ADDREMINDER = 'add-reminder', + VIEWQUESTIONNAIRE = 'view-questionnaire', + ANALYSISHINTS = 'analysis-hint', + VIEWOPTIMUMS = 'view-optimums', +} + +type ModalsProps = ModalDialogProps + +type ModalsStore = { + active: Maybe + props: Maybe +} + +export const useModalsStore = defineStore(Stores.MODALS, () => { + const state = reactive({ + active: null, + props: null, + }) + + const setModal = ( + modal: ModalsStore['active'], + props?: ModalsStore['props'], + ) => { + state.active = modal + state.props = props + } + + const closeModal = () => { + state.active = null + state.props = null + } + + return { + state, + setModal, + closeModal, + } +}) diff --git a/src/widgets/modals/ui/AnalysisHints/AnalysisHints.scss b/src/widgets/modals/ui/AnalysisHints/AnalysisHints.scss new file mode 100644 index 0000000..8bcb4da --- /dev/null +++ b/src/widgets/modals/ui/AnalysisHints/AnalysisHints.scss @@ -0,0 +1,85 @@ +.analysis-hints { + @include modalBaseStyles(); + + &__content { + width: toRem(430); + gap: toRem(32); + } + + &__notice { + margin-top: toRem(12); + padding: toRem(16); + border-radius: $borderRadius12; + background-color: var(--berry-8); + + &--title { + @include fontSize( + b-14, + ( + weight: 500, + ) + ); + line-height: toRem(21); + margin-bottom: toRem(8); + } + + &--subtitle { + @include fontSize(s-13); + } + + .row { + gap: toRem(12); + } + } + + &__reasons { + @include column(toRem(16)); + &--title { + display: flex; + align-items: center; + gap: toRem(12); + + &-icon { + width: 24px; + height: 24px; + padding: toRem(5); + background-color: var(--brand-8); + border-radius: $borderRadius6; + } + + &-text { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + color: var(--dark-main); + } + } + + &--list { + @include column(toRem(8)); + + &-item { + @include fontSize(s-12); + color: var(--dark-main); + } + + &-empty { + color: var(--dark-64); + } + } + } + + &__close-btn { + position: absolute; + width: 20px; + height: 20px; + top: 20px; + right: 20px; + &:hover { + background: none; + } + } +} diff --git a/src/widgets/modals/ui/AnalysisHints/AnalysisHints.vue b/src/widgets/modals/ui/AnalysisHints/AnalysisHints.vue new file mode 100644 index 0000000..a63732e --- /dev/null +++ b/src/widgets/modals/ui/AnalysisHints/AnalysisHints.vue @@ -0,0 +1,117 @@ + + + diff --git a/src/widgets/modals/ui/AnalysisHints/index.ts b/src/widgets/modals/ui/AnalysisHints/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/widgets/modals/ui/EditPatient/EditPatient.scss b/src/widgets/modals/ui/EditPatient/EditPatient.scss new file mode 100644 index 0000000..cc12a69 --- /dev/null +++ b/src/widgets/modals/ui/EditPatient/EditPatient.scss @@ -0,0 +1,22 @@ +.edit-patient { + @include modalBaseStyles(); + &__body { + margin-top: 24px; + overflow-y: scroll; + max-height: 60vh; + table { + width: 100%; + td, + th { + font-size: toRem(13); + line-height: toRem(20); + padding: toRem(8) 0; + vertical-align: middle; + } + + th { + padding-left: 20px; + } + } + } +} diff --git a/src/widgets/modals/ui/EditPatient/EditPatient.vue b/src/widgets/modals/ui/EditPatient/EditPatient.vue new file mode 100644 index 0000000..87af075 --- /dev/null +++ b/src/widgets/modals/ui/EditPatient/EditPatient.vue @@ -0,0 +1,145 @@ +t + + + diff --git a/src/widgets/modals/ui/EditPatient/index.ts b/src/widgets/modals/ui/EditPatient/index.ts new file mode 100644 index 0000000..c53bc73 --- /dev/null +++ b/src/widgets/modals/ui/EditPatient/index.ts @@ -0,0 +1,3 @@ +import EditPatient, { type EditPatientProps } from './EditPatient.vue' + +export { EditPatient, type EditPatientProps } diff --git a/src/widgets/modals/ui/ModalAddDestination/ModalAddDestination.scss b/src/widgets/modals/ui/ModalAddDestination/ModalAddDestination.scss new file mode 100644 index 0000000..038ce5d --- /dev/null +++ b/src/widgets/modals/ui/ModalAddDestination/ModalAddDestination.scss @@ -0,0 +1,43 @@ +.modal-add-destination { + @include modalBaseStyles(); + + &__content { + width: 600px; + } + + &__body { + margin-top: 24px; + overflow-y: scroll; + overflow-x: hidden; + max-height: 60vh; + @include column(toRem(24)); + + &--section { + @include column(toRem(20)); + + h3 { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &-empty { + color: var(--dark-64); + padding: 0 toRem(16); + } + } + + .input.size-m { + padding: toRem(12) toRem(16); + } + } + + &__buttons { + .space { + flex-grow: 1; + } + } +} diff --git a/src/widgets/modals/ui/ModalAddDestination/ModalAddDestination.vue b/src/widgets/modals/ui/ModalAddDestination/ModalAddDestination.vue new file mode 100644 index 0000000..2cfcf08 --- /dev/null +++ b/src/widgets/modals/ui/ModalAddDestination/ModalAddDestination.vue @@ -0,0 +1,100 @@ + + diff --git a/src/widgets/modals/ui/ModalAddDestination/index.ts b/src/widgets/modals/ui/ModalAddDestination/index.ts new file mode 100644 index 0000000..c97c777 --- /dev/null +++ b/src/widgets/modals/ui/ModalAddDestination/index.ts @@ -0,0 +1,5 @@ +import ModalAddDestination, { + type ModalAddDestinationProps, +} from './ModalAddDestination.vue' + +export { ModalAddDestination, type ModalAddDestinationProps } diff --git a/src/widgets/modals/ui/ModalAddReminder/ModalAddReminder.scss b/src/widgets/modals/ui/ModalAddReminder/ModalAddReminder.scss new file mode 100644 index 0000000..842da21 --- /dev/null +++ b/src/widgets/modals/ui/ModalAddReminder/ModalAddReminder.scss @@ -0,0 +1,48 @@ +.modal-add-reminder { + @include modalBaseStyles(); + &__content { + width: toRem(590); + } + + &__tab { + &--header { + padding: toRem(24) 0; + li { + display: inline-flex; + width: 50%; + justify-content: center; + border: 2px solid var(--dark-14); + padding: toRem(19) 0; + cursor: pointer; + transition: border 0.25s linear; + + &:first-child { + border-radius: $borderRadius12 0 0 $borderRadius12; + } + + &:last-child { + border-radius: 0 $borderRadius12 $borderRadius12 0; + } + + &.active { + border-color: var(--brand-main); + } + } + } + + &--content { + display: flex; + flex-direction: column; + gap: toRem(16); + + &.row { + display: flex; + flex-direction: row; + } + + &.reverse { + flex-direction: column-reverse; + } + } + } +} diff --git a/src/widgets/modals/ui/ModalAddReminder/ModalAddReminder.vue b/src/widgets/modals/ui/ModalAddReminder/ModalAddReminder.vue new file mode 100644 index 0000000..501adf9 --- /dev/null +++ b/src/widgets/modals/ui/ModalAddReminder/ModalAddReminder.vue @@ -0,0 +1,111 @@ + + diff --git a/src/widgets/modals/ui/ModalAddReminder/index.ts b/src/widgets/modals/ui/ModalAddReminder/index.ts new file mode 100644 index 0000000..e224dd5 --- /dev/null +++ b/src/widgets/modals/ui/ModalAddReminder/index.ts @@ -0,0 +1,5 @@ +import ModalAddReminder, { + type ModalAddReminderProps, +} from './ModalAddReminder.vue' + +export { ModalAddReminder, type ModalAddReminderProps } diff --git a/src/widgets/modals/ui/ModalDialog/ModalDialog.scss b/src/widgets/modals/ui/ModalDialog/ModalDialog.scss new file mode 100644 index 0000000..521d73d --- /dev/null +++ b/src/widgets/modals/ui/ModalDialog/ModalDialog.scss @@ -0,0 +1,3 @@ +.modal-dialog { + @include modalBaseStyles(); +} diff --git a/src/widgets/modals/ui/ModalDialog/ModalDialog.vue b/src/widgets/modals/ui/ModalDialog/ModalDialog.vue new file mode 100644 index 0000000..4f9ad3c --- /dev/null +++ b/src/widgets/modals/ui/ModalDialog/ModalDialog.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/widgets/modals/ui/ModalDialog/index.ts b/src/widgets/modals/ui/ModalDialog/index.ts new file mode 100644 index 0000000..8b6e49f --- /dev/null +++ b/src/widgets/modals/ui/ModalDialog/index.ts @@ -0,0 +1,3 @@ +import ModalDialog, { type ModalDialogProps } from './ModalDialog.vue' + +export { ModalDialog, type ModalDialogProps } diff --git a/src/widgets/modals/ui/ModalPopupBase/ModalPopupBase.scss b/src/widgets/modals/ui/ModalPopupBase/ModalPopupBase.scss new file mode 100644 index 0000000..a0bee6e --- /dev/null +++ b/src/widgets/modals/ui/ModalPopupBase/ModalPopupBase.scss @@ -0,0 +1,12 @@ +.modal-popup-base { + @include center('stretch'); + + z-index: 3; + + &__overlay { + @include center('stretch'); + + background-color: #000; + opacity: 0.75; + } +} diff --git a/src/widgets/modals/ui/ModalPopupBase/ModalPopupBase.vue b/src/widgets/modals/ui/ModalPopupBase/ModalPopupBase.vue new file mode 100644 index 0000000..33941a3 --- /dev/null +++ b/src/widgets/modals/ui/ModalPopupBase/ModalPopupBase.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/widgets/modals/ui/ModalPopupBase/index.ts b/src/widgets/modals/ui/ModalPopupBase/index.ts new file mode 100644 index 0000000..8df0126 --- /dev/null +++ b/src/widgets/modals/ui/ModalPopupBase/index.ts @@ -0,0 +1,3 @@ +import ModalPopupBase, { type ModalPopupBaseProps } from './ModalPopupBase.vue' + +export { ModalPopupBase, type ModalPopupBaseProps } diff --git a/src/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.scss b/src/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.scss new file mode 100644 index 0000000..d59e840 --- /dev/null +++ b/src/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.scss @@ -0,0 +1,72 @@ +.modal-view-questionnaire { + @include modalBaseStyles(); + + &__content { + width: toRem(600); + gap: toRem(24); + + .no-question { + color: var(--dark-64); + } + } + + &__list { + @include column(toRem(24)); + + &--item { + @include row(toRem(12)); + + &.icon { + display: flex; + align-items: center; + justify-content: center; + width: 30px; + height: 30px; + border-radius: $borderRadius8; + background-color: var(--blue-20); + } + } + } + + &__question { + &--title { + @include fontSize( + b-14, + ( + weight: 500, + line-height: toRem(21), + ) + ); + color: var(--text-primary); + } + + &--text { + @include fontSize( + s-12, + ( + line-height: toRem(16.5), + ) + ); + color: var(--dark-main); + margin: toRem(8) 0 toRem(4); + } + + &--options { + @include column(toRem(12)); + padding: toRem(8) 0; + + p { + padding-left: toRem(6); + } + + [class$='__label'] { + @include fontSize( + s-12, + ( + line-height: toRem(16.5), + ) + ); + } + } + } +} diff --git a/src/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.vue b/src/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.vue new file mode 100644 index 0000000..6cc73f5 --- /dev/null +++ b/src/widgets/modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire.vue @@ -0,0 +1,83 @@ + + diff --git a/src/widgets/modals/ui/ModalViewQuestionnaire/index.ts b/src/widgets/modals/ui/ModalViewQuestionnaire/index.ts new file mode 100644 index 0000000..13c61c5 --- /dev/null +++ b/src/widgets/modals/ui/ModalViewQuestionnaire/index.ts @@ -0,0 +1,5 @@ +import ModalViewQuestionnaire, { + type ModalViewQuestionnaireProps, +} from './ModalViewQuestionnaire.vue' + +export { ModalViewQuestionnaire, type ModalViewQuestionnaireProps } diff --git a/src/widgets/modals/ui/Modals/Modals.scss b/src/widgets/modals/ui/Modals/Modals.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/widgets/modals/ui/Modals/Modals.vue b/src/widgets/modals/ui/Modals/Modals.vue new file mode 100644 index 0000000..18b4fb7 --- /dev/null +++ b/src/widgets/modals/ui/Modals/Modals.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/widgets/modals/ui/Modals/index.ts b/src/widgets/modals/ui/Modals/index.ts new file mode 100644 index 0000000..fda77fd --- /dev/null +++ b/src/widgets/modals/ui/Modals/index.ts @@ -0,0 +1,3 @@ +import Modals, { type ModalsProps } from './Modals.vue' + +export { Modals, type ModalsProps } diff --git a/src/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.scss b/src/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.scss new file mode 100644 index 0000000..49ea335 --- /dev/null +++ b/src/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.scss @@ -0,0 +1,14 @@ +.select-questionnaires { + @include modalBaseStyles(); + + &__content { + width: toRem(590); + } + + &__body { + margin-top: 24px; + overflow-y: scroll; + max-height: 60vh; + overflow-x: hidden; + } +} diff --git a/src/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.vue b/src/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.vue new file mode 100644 index 0000000..f4f2303 --- /dev/null +++ b/src/widgets/modals/ui/SelectQuestionnaires/SelectQuestionnaires.vue @@ -0,0 +1,54 @@ + + diff --git a/src/widgets/modals/ui/SelectQuestionnaires/index.ts b/src/widgets/modals/ui/SelectQuestionnaires/index.ts new file mode 100644 index 0000000..9b0a1a4 --- /dev/null +++ b/src/widgets/modals/ui/SelectQuestionnaires/index.ts @@ -0,0 +1,5 @@ +import SelectQuestionnaires, { + type SelectQuestionnairesProps, +} from './SelectQuestionnaires.vue' + +export { SelectQuestionnaires, type SelectQuestionnairesProps } diff --git a/src/widgets/modals/ui/ViewOptimums/ViewOptimums.scss b/src/widgets/modals/ui/ViewOptimums/ViewOptimums.scss new file mode 100644 index 0000000..1bb541d --- /dev/null +++ b/src/widgets/modals/ui/ViewOptimums/ViewOptimums.scss @@ -0,0 +1,140 @@ +.view-optimums { + &__content { + @include center(); + @include column(); + width: toRem(430); + background-color: var(--white); + border-radius: $borderRadius24; + padding: toRem(32); + } + + &__header { + margin: toRem(24) 0; + + a { + @include fontSize( + s-12, + ( + line-height: toRem(16.5), + ) + ); + color: var(--brand-main); + } + } + + &__title { + display: flex; + align-items: center; + gap: toRem(12); + + &--icon { + display: inline-flex; + background-color: var(--brand-8); + padding: toRem(5); + border-radius: $borderRadius6; + } + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &__description { + margin: toRem(16) 0 toRem(12); + @include fontSize(s-12); + } + + &__tab { + display: inline-flex; + align-items: center; + gap: toRem(12); + + &--item { + height: toRem(26.5); + border-radius: $borderRadius8; + border: 1px solid var(--day-Base-base-04); + padding: toRem(4) toRem(14); + cursor: pointer; + transition: all 0.2s ease-in-out; + + &.active { + padding: toRem(3) toRem(13); + border-width: 2px; + border-color: var(--brand-main); + } + + span { + @include fontSize( + s-12, + ( + line-height: toRem(16.5), + ) + ); + } + + &.disable { + pointer-events: none; + } + } + } + + &__options--list { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: toRem(40); + + .col { + @include column(toRem(12)); + + h4 { + @include fontSize( + s-13, + ( + weight: 500, + ) + ); + } + + div { + padding: toRem(4.5) toRem(12); + border-radius: $borderRadius6; + background: var(--grey-main); + display: flex; + align-items: center; + justify-content: space-between; + gap: toRem(20); + border-radius: $borderRadius6; + border: 1.5px solid var(--grey-main); + transition: opacity 0.2s ease-in; + cursor: pointer; + + i { + opacity: 0; + transition: opacity 0.2s ease-in; + } + + &.active { + border-color: var(--brand-main); + + i { + opacity: 1; + } + } + + &.disable { + pointer-events: none; + } + } + } + } + + &__buttons { + display: flex; + justify-content: flex-end; + gap: toRem(12); + margin-top: toRem(24); + } +} diff --git a/src/widgets/modals/ui/ViewOptimums/ViewOptimums.vue b/src/widgets/modals/ui/ViewOptimums/ViewOptimums.vue new file mode 100644 index 0000000..553b44b --- /dev/null +++ b/src/widgets/modals/ui/ViewOptimums/ViewOptimums.vue @@ -0,0 +1,183 @@ + + diff --git a/src/widgets/modals/ui/ViewOptimums/index.ts b/src/widgets/modals/ui/ViewOptimums/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/widgets/modals/ui/index.ts b/src/widgets/modals/ui/index.ts new file mode 100644 index 0000000..c0635b8 --- /dev/null +++ b/src/widgets/modals/ui/index.ts @@ -0,0 +1,3 @@ +export * from './Modals' +export * from './EditPatient' +export * from './SelectQuestionnaires' diff --git a/src/widgets/navigation/index.ts b/src/widgets/navigation/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/widgets/navigation/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/widgets/navigation/ui/Sidebar/Sidebar.scss b/src/widgets/navigation/ui/Sidebar/Sidebar.scss new file mode 100644 index 0000000..7ac35f5 --- /dev/null +++ b/src/widgets/navigation/ui/Sidebar/Sidebar.scss @@ -0,0 +1,54 @@ +.sidebar { + position: fixed; + top: 0; + left: 0; + border-right: 1px solid var(--grey-border); + width: $widthSideBar; + height: 100%; + background-color: var(--white); + z-index: 2; + + @include column(); + + &__header, + &__content, + &__footer { + border-top: 1px solid var(--grey-border); + } + + &__content, + &__footer { + padding-left: toRem(14); + padding-right: toRem(32); + } + + &__header { + height: toRem(90); + display: flex; + align-items: center; + border: none; + padding: 0 toRem(32); + } + + &__content { + flex-grow: 1; + } + + &__content, + &__footer { + padding-top: toRem(12); + padding-bottom: toRem(24); + } + + &__links-header { + @include fontSize( + s-11, + ( + uppercase: true, + letter-spacing: 1, + ) + ); + + padding: toRem(12) 0 toRem(12) toRem(18); + } +} diff --git a/src/widgets/navigation/ui/Sidebar/Sidebar.vue b/src/widgets/navigation/ui/Sidebar/Sidebar.vue new file mode 100644 index 0000000..7a405c5 --- /dev/null +++ b/src/widgets/navigation/ui/Sidebar/Sidebar.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/widgets/navigation/ui/Sidebar/index.ts b/src/widgets/navigation/ui/Sidebar/index.ts new file mode 100644 index 0000000..dd2dbb3 --- /dev/null +++ b/src/widgets/navigation/ui/Sidebar/index.ts @@ -0,0 +1,3 @@ +import Sidebar, { type SidebarProps } from './Sidebar.vue' + +export { Sidebar, type SidebarProps } diff --git a/src/widgets/navigation/ui/index.ts b/src/widgets/navigation/ui/index.ts new file mode 100644 index 0000000..9130e63 --- /dev/null +++ b/src/widgets/navigation/ui/index.ts @@ -0,0 +1 @@ +export * from './Sidebar' diff --git a/src/widgets/patient/index.ts b/src/widgets/patient/index.ts new file mode 100644 index 0000000..ed58495 --- /dev/null +++ b/src/widgets/patient/index.ts @@ -0,0 +1 @@ +export * from './ui' diff --git a/src/widgets/patient/ui/PatientAnalyzeCard/PatientAnalyzeCard.scss b/src/widgets/patient/ui/PatientAnalyzeCard/PatientAnalyzeCard.scss new file mode 100644 index 0000000..098377a --- /dev/null +++ b/src/widgets/patient/ui/PatientAnalyzeCard/PatientAnalyzeCard.scss @@ -0,0 +1,106 @@ +.patient-analyze-card { + &__content { + display: flex; + gap: toRem(18); + padding-bottom: toRem(24); + + .view-optimums { + display: flex; + align-items: center; + color: var(--brand-main); + @include fontSize( + s-12, + ( + weight: 700, + ) + ); + + i { + margin-left: toRem(4); + } + } + + .table { + &-head { + color: var(--dark-main); + @include fontSize( + s-12, + ( + weight: 700, + ) + ); + } + + &-body { + display: flex; + flex-direction: column; + } + + &-tr { + display: flex; + gap: toRem(18); + } + + &-td { + text-align: center; + padding: toRem(12) 0; + display: flex; + align-items: center; + @include fontSize(s-12); + } + } + + .markers { + flex: 1 0 470px; + .table-tr { + display: flex; + gap: toRem(18); + + .table-td:nth-child(1) { + flex: 1 0 250px; + } + .table-td:nth-child(2) { + flex: 0 0 80px; + } + + div:nth-child(3), + .table-td:nth-child(3) { + flex: 0 0 100px; + } + + .table-td:not(:first-child) { + padding-right: toRem(16); + } + } + } + + .analysis { + overflow-x: scroll; + display: flex; + gap: toRem(20); + + .table-head { + .table-tr { + .table-td { + padding-right: toRem(12); + letter-spacing: -0.24px; + } + } + } + .table-body { + .table-td { + margin: 6px 0; + padding: 0; + } + } + + .table-td { + min-width: 80px; + } + } + + .actions { + flex: 0 0 32px; + } + } +} diff --git a/src/widgets/patient/ui/PatientAnalyzeCard/PatientAnalyzeCard.vue b/src/widgets/patient/ui/PatientAnalyzeCard/PatientAnalyzeCard.vue new file mode 100644 index 0000000..7b07d89 --- /dev/null +++ b/src/widgets/patient/ui/PatientAnalyzeCard/PatientAnalyzeCard.vue @@ -0,0 +1,205 @@ + + diff --git a/src/widgets/patient/ui/PatientAnalyzeCard/index.ts b/src/widgets/patient/ui/PatientAnalyzeCard/index.ts new file mode 100644 index 0000000..0a785a1 --- /dev/null +++ b/src/widgets/patient/ui/PatientAnalyzeCard/index.ts @@ -0,0 +1,5 @@ +import PatientAnalyzeCard, { + type PatientAnalyzeCardProps, +} from './PatientAnalyzeCard.vue' + +export { PatientAnalyzeCard, type PatientAnalyzeCardProps } diff --git a/src/widgets/patient/ui/PatientAnalyzesStep/PatientAnalyzesStep.scss b/src/widgets/patient/ui/PatientAnalyzesStep/PatientAnalyzesStep.scss new file mode 100644 index 0000000..c7cc545 --- /dev/null +++ b/src/widgets/patient/ui/PatientAnalyzesStep/PatientAnalyzesStep.scss @@ -0,0 +1,27 @@ +.patient-analyzes-step { + &__title { + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } + + &__content { + @include column(toRem(20)); + padding: toRem(20) 0; + } + + .row { + padding: toRem(13) 0; + } + + .column { + gap: toRem(8); + } + + .check-box { + padding-left: 0; + } +} diff --git a/src/widgets/patient/ui/PatientAnalyzesStep/PatientAnalyzesStep.vue b/src/widgets/patient/ui/PatientAnalyzesStep/PatientAnalyzesStep.vue new file mode 100644 index 0000000..80e5d50 --- /dev/null +++ b/src/widgets/patient/ui/PatientAnalyzesStep/PatientAnalyzesStep.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/widgets/patient/ui/PatientAnalyzesStep/index.ts b/src/widgets/patient/ui/PatientAnalyzesStep/index.ts new file mode 100644 index 0000000..467a87c --- /dev/null +++ b/src/widgets/patient/ui/PatientAnalyzesStep/index.ts @@ -0,0 +1,5 @@ +import PatientAnalyzesStep, { + type PatientAnalyzesStepProps, +} from './PatientAnalyzesStep.vue' + +export { PatientAnalyzesStep, type PatientAnalyzesStepProps } diff --git a/src/widgets/patient/ui/PatientAppointment/PatientAppointment.scss b/src/widgets/patient/ui/PatientAppointment/PatientAppointment.scss new file mode 100644 index 0000000..72cf309 --- /dev/null +++ b/src/widgets/patient/ui/PatientAppointment/PatientAppointment.scss @@ -0,0 +1,89 @@ +.patient-appointment { + margin-top: toRem(20); + &__title { + @include fontSize( + h3, + ( + weight: 700, + ) + ); + margin-bottom: toRem(13); + } + + &__list { + ul { + display: flex; + flex-direction: column; + gap: toRem(8); + } + + ul + button { + margin-top: toRem(20); + } + + &--item { + list-style: none; + display: flex; + justify-content: space-between; + align-items: center; + padding: toRem(4) toRem(12); + border-radius: $borderRadius6; + cursor: pointer; + + &:hover { + background-color: var(--grey-64); + } + + &-title { + display: flex; + align-items: center; + min-height: 28px; + line-height: 1; + flex: 1 1 auto; + } + } + } + + &__body { + padding: toRem(24) 0; + @include column(toRem(20)); + + .card { + gap: toRem(16); + } + } + + &__card--title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + } + + &__course { + display: flex; + flex-direction: column; + gap: toRem(16); + + &--item { + display: flex; + justify-content: space-between; + align-items: center; + background: var(--blue-20); + padding: toRem(14) toRem(16); + border-radius: $borderRadius12; + cursor: pointer; + + &-title { + @include fontSize(b-14); + color: var(--dark-main); + } + + &-actions { + @include row(toRem(8)); + } + } + } +} diff --git a/src/widgets/patient/ui/PatientAppointment/PatientAppointment.vue b/src/widgets/patient/ui/PatientAppointment/PatientAppointment.vue new file mode 100644 index 0000000..f45f381 --- /dev/null +++ b/src/widgets/patient/ui/PatientAppointment/PatientAppointment.vue @@ -0,0 +1,182 @@ + + diff --git a/src/widgets/patient/ui/PatientAppointment/index.ts b/src/widgets/patient/ui/PatientAppointment/index.ts new file mode 100644 index 0000000..4376944 --- /dev/null +++ b/src/widgets/patient/ui/PatientAppointment/index.ts @@ -0,0 +1,5 @@ +import PatientAppointment, { + type PatientAppointmentProps, +} from './PatientAppointment.vue' + +export { PatientAppointment, type PatientAppointmentProps } diff --git a/src/widgets/patient/ui/PatientFilesStep/PatientFilesStep.scss b/src/widgets/patient/ui/PatientFilesStep/PatientFilesStep.scss new file mode 100644 index 0000000..c49454d --- /dev/null +++ b/src/widgets/patient/ui/PatientFilesStep/PatientFilesStep.scss @@ -0,0 +1,63 @@ +.patient-files-step { + padding-bottom: toRem(60); + + &__title { + letter-spacing: -0.4px; + color: var(--dark-main, #364153); + font-size: toRem(20); + font-weight: 700; + line-height: 1.5; + } + + &__description { + margin-top: toRem(4); + color: var(--dark-main, #364153); + font-size: toRem(14); + font-weight: 400; + line-height: 1.5; + } + + &__list { + @include column(toRem(7)); + + margin-top: toRem(13); + } + + &__item { + @include row(toRem(8)); + + max-width: toRem(474); + padding: toRem(4) 0; + } + + &__item-inner { + justify-content: flex-start; + width: 100%; + height: 100%; + padding: toRem(6) toRem(12); + } + + &__item-icon { + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + width: toRem(24); + height: toRem(24); + padding: toRem(6); + border-radius: $borderRadius6; + background: var(--blue-20, rgba(134, 200, 241, 0.2)); + } + + &__item-text { + overflow: hidden; + margin-right: auto; + white-space: nowrap; + letter-spacing: -0.14px; + text-overflow: ellipsis; + color: var(--dark-main, #364153); + font-size: toRem(14); + font-weight: 500; + line-height: 1.5; + } +} diff --git a/src/widgets/patient/ui/PatientFilesStep/PatientFilesStep.vue b/src/widgets/patient/ui/PatientFilesStep/PatientFilesStep.vue new file mode 100644 index 0000000..c2fbf05 --- /dev/null +++ b/src/widgets/patient/ui/PatientFilesStep/PatientFilesStep.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/widgets/patient/ui/PatientFilesStep/index.ts b/src/widgets/patient/ui/PatientFilesStep/index.ts new file mode 100644 index 0000000..7021b9c --- /dev/null +++ b/src/widgets/patient/ui/PatientFilesStep/index.ts @@ -0,0 +1,5 @@ +import PatientFilesStep, { + type PatientFilesStepProps, +} from './PatientFilesStep.vue' + +export { PatientFilesStep, type PatientFilesStepProps } diff --git a/src/widgets/patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep.scss b/src/widgets/patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep.scss new file mode 100644 index 0000000..ac028db --- /dev/null +++ b/src/widgets/patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep.scss @@ -0,0 +1,179 @@ +.patient-health-matrix-step { + &__title { + padding: toRem(12) 0; + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } + + &__list { + padding: toRem(16) 0 toRem(24); + + .dropdown__menu { + z-index: 2; + } + + ul { + display: flex; + flex-direction: column; + gap: toRem(8); + position: relative; + } + + ul + button { + margin-top: toRem(20); + } + + &--item { + list-style: none; + display: flex; + justify-content: space-between; + align-items: center; + padding: toRem(4) toRem(12); + border-radius: $borderRadius6; + cursor: pointer; + + &:hover { + background-color: var(--grey-64); + } + + &-title { + display: flex; + align-items: center; + min-height: 28px; + line-height: 1; + flex: 1 1 auto; + } + } + } + + &__content { + display: flex; + flex-direction: column; + + &--main { + display: grid; + grid-template-columns: repeat(4, 244px); + gap: toRem(16); + position: relative; + padding-bottom: toRem(28); + + &::before { + content: ''; + width: 2px; + height: 100%; + position: absolute; + left: 244px; + background-color: var(--grey-border); + } + + &-block { + &:nth-child(1), + &:nth-child(5), + &:nth-child(9) { + padding-right: toRem(15); + } + min-height: 126px; + } + } + + &--bottom { + &-title { + @include fontSize( + b-16, + ( + weight: 500, + ) + ); + padding: toRem(18) 0; + border-top: 2px solid var(--grey-border); + border-bottom: 2px solid var(--grey-border); + } + + &-content { + display: flex; + gap: toRem(16); + padding: toRem(18) 0; + + & > div { + height: inherit; + min-height: 126px; + } + } + } + } + + .dropdown__control, + .tooltip__parent { + i, + .state { + position: relative; + z-index: -1; + } + } + + .dropdown__menu { + z-index: 2; + } + + .state { + display: block; + padding: toRem(6); + border-radius: $borderRadius6; + + span { + display: block; + width: 8px; + height: 8px; + border-radius: $borderRadius2; + } + + &-good { + background-color: var(--green-14); + span { + background-color: var(--green-main); + } + } + &-normal { + background-color: var(--orange-20); + span { + background-color: var(--orange-main); + } + } + &-bad { + background-color: var(--berry-8); + span { + background-color: var(--berry-main); + } + } + + &--list { + display: flex; + flex-direction: column; + gap: toRem(6); + + &-item { + height: toRem(32); + display: flex; + align-items: center; + gap: toRem(12); + padding: 0 toRem(8); + cursor: pointer; + border-radius: $borderRadius6; + + &:hover { + background-color: var(--grey-64); + } + + @include fontSize(s-13); + + .state { + padding: 0; + } + } + } + } +} diff --git a/src/widgets/patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep.vue b/src/widgets/patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep.vue new file mode 100644 index 0000000..d594be8 --- /dev/null +++ b/src/widgets/patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep.vue @@ -0,0 +1,233 @@ + + + diff --git a/src/widgets/patient/ui/PatientHealthMatrixStep/index.ts b/src/widgets/patient/ui/PatientHealthMatrixStep/index.ts new file mode 100644 index 0000000..19c30da --- /dev/null +++ b/src/widgets/patient/ui/PatientHealthMatrixStep/index.ts @@ -0,0 +1,5 @@ +import PatientHealthMatrixStep, { + type PatientHealthMatrixStepProps, +} from './PatientHealthMatrixStep.vue' + +export { PatientHealthMatrixStep, type PatientHealthMatrixStepProps } diff --git a/src/widgets/patient/ui/PatientMainStep/PatientMainStep.scss b/src/widgets/patient/ui/PatientMainStep/PatientMainStep.scss new file mode 100644 index 0000000..f66c9f2 --- /dev/null +++ b/src/widgets/patient/ui/PatientMainStep/PatientMainStep.scss @@ -0,0 +1,43 @@ +.patient-card { + @include row(toRem(30)); + + @include responsive('lg') { + @include column(toRem(20)); + } + + &--aside { + flex: 0 0 293px; + @include column(toRem(12)); + &--block { + flex: 0 0 auto; + padding: toRem(24); + border-radius: toRem(20); + background: #f4f0ff; + } + } + + &--content { + flex: 1 1 auto; + display: flex; + flex-direction: column; + gap: toRem(20); + } + + .avatar { + width: 5.75rem; + height: 5.5rem; + border-radius: 3.75rem; + } + + a { + color: var(--purple-main); + display: flex; + align-items: flex-start; + span { + font-size: toRem(13); + line-height: toRem(16); + border-bottom: 1px solid var(--purple-main); + margin: 0 toRem(6) 0 0; + } + } +} diff --git a/src/widgets/patient/ui/PatientMainStep/PatientMainStep.vue b/src/widgets/patient/ui/PatientMainStep/PatientMainStep.vue new file mode 100644 index 0000000..cbdf580 --- /dev/null +++ b/src/widgets/patient/ui/PatientMainStep/PatientMainStep.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/widgets/patient/ui/PatientMainStep/index.ts b/src/widgets/patient/ui/PatientMainStep/index.ts new file mode 100644 index 0000000..167d7af --- /dev/null +++ b/src/widgets/patient/ui/PatientMainStep/index.ts @@ -0,0 +1,5 @@ +import PatientMainStep, { + type PatientMainStepProps, +} from './PatientMainStep.vue' + +export { PatientMainStep, type PatientMainStepProps } diff --git a/src/widgets/patient/ui/PatientPurposeContent/PatientPurposeContent.scss b/src/widgets/patient/ui/PatientPurposeContent/PatientPurposeContent.scss new file mode 100644 index 0000000..9d9ae2f --- /dev/null +++ b/src/widgets/patient/ui/PatientPurposeContent/PatientPurposeContent.scss @@ -0,0 +1,11 @@ +.patient-purpose-content { + &__header { + display: flex; + align-items: center; + margin-bottom: toRem(20); + } + + &__content { + @include column(toRem(20)); + } +} diff --git a/src/widgets/patient/ui/PatientPurposeContent/PatientPurposeContent.vue b/src/widgets/patient/ui/PatientPurposeContent/PatientPurposeContent.vue new file mode 100644 index 0000000..5904bc5 --- /dev/null +++ b/src/widgets/patient/ui/PatientPurposeContent/PatientPurposeContent.vue @@ -0,0 +1,97 @@ + + diff --git a/src/widgets/patient/ui/PatientPurposeContent/index.ts b/src/widgets/patient/ui/PatientPurposeContent/index.ts new file mode 100644 index 0000000..779e8e8 --- /dev/null +++ b/src/widgets/patient/ui/PatientPurposeContent/index.ts @@ -0,0 +1,5 @@ +import PatientPurposeContent, { + type PatientPurposeContentProps, +} from './PatientPurposeContent.vue' + +export { PatientPurposeContent, type PatientPurposeContentProps } diff --git a/src/widgets/patient/ui/PatientPurposeStep/PatientPurposeStep.scss b/src/widgets/patient/ui/PatientPurposeStep/PatientPurposeStep.scss new file mode 100644 index 0000000..dc96cb0 --- /dev/null +++ b/src/widgets/patient/ui/PatientPurposeStep/PatientPurposeStep.scss @@ -0,0 +1,65 @@ +.patient-purpose-step { + &__title { + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } + &__list { + padding: toRem(16) 0 toRem(24); + + .dropdown__menu { + z-index: 3; + } + + ul { + display: flex; + flex-direction: column; + gap: toRem(8); + position: relative; + } + + ul + button { + margin-top: toRem(20); + } + + &--item { + list-style: none; + display: flex; + justify-content: space-between; + align-items: center; + padding: toRem(4) toRem(12); + border-radius: $borderRadius6; + cursor: pointer; + + &:hover { + background-color: var(--grey-64); + } + + &-title { + display: flex; + align-items: center; + min-height: 28px; + line-height: 1; + flex: 1 1 auto; + } + } + } + + &__add { + display: flex; + flex-direction: column; + gap: toRem(24); + + &--title { + @include fontSize( + b-16, + ( + weight: 700, + ) + ); + } + } +} diff --git a/src/widgets/patient/ui/PatientPurposeStep/PatientPurposeStep.vue b/src/widgets/patient/ui/PatientPurposeStep/PatientPurposeStep.vue new file mode 100644 index 0000000..421b0de --- /dev/null +++ b/src/widgets/patient/ui/PatientPurposeStep/PatientPurposeStep.vue @@ -0,0 +1,113 @@ + + + diff --git a/src/widgets/patient/ui/PatientPurposeStep/index.ts b/src/widgets/patient/ui/PatientPurposeStep/index.ts new file mode 100644 index 0000000..c3a794e --- /dev/null +++ b/src/widgets/patient/ui/PatientPurposeStep/index.ts @@ -0,0 +1,5 @@ +import PatientPurposeStep, { + type PatientPurposeStepProps, +} from './PatientPurposeStep.vue' + +export { PatientPurposeStep, type PatientPurposeStepProps } diff --git a/src/widgets/patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep.scss b/src/widgets/patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep.scss new file mode 100644 index 0000000..c62f810 --- /dev/null +++ b/src/widgets/patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep.scss @@ -0,0 +1,30 @@ +.patient-questionnaire-step { + @include row(toRem(32)); + + @include responsive('lg') { + @include column(toRem(20)); + } + + &__title { + @include fontSize( + h3, + ( + weight: 700, + ) + ); + } + + &__content { + flex: 1 1 auto; + display: flex; + flex-direction: column; + gap: toRem(20); + } + + &__aside { + flex: 0 0 312px; + display: flex; + flex-direction: column; + gap: toRem(20); + } +} diff --git a/src/widgets/patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep.vue b/src/widgets/patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep.vue new file mode 100644 index 0000000..f21f0db --- /dev/null +++ b/src/widgets/patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep.vue @@ -0,0 +1,134 @@ + + + diff --git a/src/widgets/patient/ui/PatientQuestionnaireStep/index.ts b/src/widgets/patient/ui/PatientQuestionnaireStep/index.ts new file mode 100644 index 0000000..0691f82 --- /dev/null +++ b/src/widgets/patient/ui/PatientQuestionnaireStep/index.ts @@ -0,0 +1,5 @@ +import PatientQuestionnaireStep, { + type PatientQuestionnaireStepProps, +} from './PatientQuestionnaireStep.vue' + +export { PatientQuestionnaireStep, type PatientQuestionnaireStepProps } diff --git a/src/widgets/patient/ui/PatientTable/PatientTable.scss b/src/widgets/patient/ui/PatientTable/PatientTable.scss new file mode 100644 index 0000000..9965ea6 --- /dev/null +++ b/src/widgets/patient/ui/PatientTable/PatientTable.scss @@ -0,0 +1,109 @@ +.patient-table { + $b: &; + + &__content { + @include column(toRem(8)); + margin-top: toRem(16); + } + + &__click-wrapper, + &__row, + &__header { + display: flex; + } + + &__click-wrapper { + width: 100%; + } + + &__row { + align-items: center; + transition: background-color 0.3s ease; + cursor: pointer; + border-radius: $borderRadius16; + height: toRem(60); + + &:hover { + background-color: var(--grey-64); + } + } + + &__row-actions { + display: flex; + justify-content: flex-end; + } + + &__header { + border-bottom: 1px solid var(--grey-border); + } + + &__column { + flex-grow: 1; + padding: toRem(12); + display: flex; + align-items: center; + + &:last-child { + justify-content: end; + } + } + + &__header-cell { + display: flex; + align-items: center; + color: var(--grey); + height: toRem(42); + padding: 0 toRem(12); + + @include fontSize( + s-12, + ( + weight: 500, + ) + ); + + &:last-child { + justify-content: end; + } + } + + &__cell { + display: flex; + gap: toRem(4); + + @include fontSize(s-12); + + span { + display: block; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + } + } + + &__search { + display: flex; + gap: toRem(4); + align-items: center; + height: 100%; + + input { + width: toRem(150); + } + + i { + font-size: toRem(12); + } + } + + &.is-deletable { + #{$b}__click-wrapper { + width: calc(100% - #{toRem(20)}); + } + + #{$b}__row { + padding-right: toRem(12); + } + } +} diff --git a/src/widgets/patient/ui/PatientTable/PatientTable.vue b/src/widgets/patient/ui/PatientTable/PatientTable.vue new file mode 100644 index 0000000..daa54aa --- /dev/null +++ b/src/widgets/patient/ui/PatientTable/PatientTable.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/widgets/patient/ui/PatientTable/data.ts b/src/widgets/patient/ui/PatientTable/data.ts new file mode 100644 index 0000000..fd4d685 --- /dev/null +++ b/src/widgets/patient/ui/PatientTable/data.ts @@ -0,0 +1,104 @@ +import { declension, formattingDateForClient, getGender } from '@/shared' +import type { Columns } from './PatientTable.vue' + +export const columnsData: Record< + Columns, + { + name: string + order: number + width: number + view?: { + component?: { + name: string + propName?: string + bind?: any + } + formatting?: any + } + } +> = { + patient: { + name: 'ФИО', + order: 2, + width: 270, + view: { + component: { + name: 'user-base', + bind: { + size: 'xs', + }, + }, + }, + }, + age: { + name: 'Возраст', + order: 3, + width: 100, + view: { + formatting: (age: number) => + declension(age, ['год', 'года', 'лет']), + }, + }, + contact: { + name: 'Контактные данные', + order: 11, + width: 190, + view: { + component: { + name: 'link', + }, + }, + }, + gender: { + name: 'Пол', + order: 4, + width: 100, + view: { + formatting: getGender, + }, + }, + time: { + name: 'Время приема', + order: 1, + width: 100, + }, + actions: { + name: 'Действие', + order: 11, + width: 200, + }, + type: { + name: 'Тип', + order: 1, + width: 100, + }, + applicationDate: { + name: 'Дата заявки', + order: 5, + width: 125, + view: { + formatting: (date: string) => formattingDateForClient(date), + }, + }, + description: { + name: 'Описание', + order: 1, + width: 100, + }, + request: { + name: 'Запрос', + order: 5, + width: 160, + view: { + component: { + name: 'patient-request', + propName: 'request', + }, + }, + }, + reminder: { + name: 'Напоминание', + order: 6, + width: 120, + }, +} diff --git a/src/widgets/patient/ui/PatientTable/index.ts b/src/widgets/patient/ui/PatientTable/index.ts new file mode 100644 index 0000000..9050bd7 --- /dev/null +++ b/src/widgets/patient/ui/PatientTable/index.ts @@ -0,0 +1,3 @@ +import PatientTable, { type PatientTableProps } from './PatientTable.vue' + +export { PatientTable, type PatientTableProps } diff --git a/src/widgets/patient/ui/index.ts b/src/widgets/patient/ui/index.ts new file mode 100644 index 0000000..53659d7 --- /dev/null +++ b/src/widgets/patient/ui/index.ts @@ -0,0 +1,10 @@ +export * from './PatientTable' +export * from './PatientMainStep' +export * from './PatientQuestionnaireStep' +export * from './PatientAnalyzesStep' +export * from './PatientFilesStep' +export * from './PatientHealthMatrixStep' +export * from './PatientPurposeStep' +export * from './PatientAppointment' +export * from './PatientAnalyzeCard' +export * from './PatientPurposeContent' diff --git a/src/widgets/widgets.scss b/src/widgets/widgets.scss new file mode 100644 index 0000000..79712ff --- /dev/null +++ b/src/widgets/widgets.scss @@ -0,0 +1,28 @@ +/*------ Layout -------*/ +@import 'layouts/ui/PageLayout/PageLayout'; + +/*------ Modal -------*/ +@import 'modals/ui/ModalDialog/ModalDialog'; +@import 'modals/ui/ModalPopupBase/ModalPopupBase'; +@import 'modals/ui/EditPatient/EditPatient'; +@import 'modals/ui/ModalAddDestination/ModalAddDestination'; +@import 'modals/ui/SelectQuestionnaires/SelectQuestionnaires'; +@import 'modals/ui/ModalAddReminder/ModalAddReminder'; +@import 'modals/ui/ModalViewQuestionnaire/ModalViewQuestionnaire'; +@import 'modals/ui/AnalysisHints/AnalysisHints'; +@import 'modals/ui/ViewOptimums/ViewOptimums'; + +/*------ Other -------*/ +@import 'navigation/ui/Sidebar/Sidebar'; + +/*------ Patient -------*/ +@import 'patient/ui/PatientTable/PatientTable'; +@import 'patient/ui/PatientFilesStep/PatientFilesStep'; +@import 'patient/ui/PatientMainStep/PatientMainStep.scss'; +@import 'patient/ui/PatientAppointment/PatientAppointment'; +@import 'patient/ui/PatientQuestionnaireStep/PatientQuestionnaireStep'; +@import 'patient/ui/PatientAnalyzesStep/PatientAnalyzesStep'; +@import 'patient/ui/PatientAnalyzeCard/PatientAnalyzeCard'; +@import 'patient/ui/PatientHealthMatrixStep/PatientHealthMatrixStep'; +@import 'patient/ui/PatientPurposeStep/PatientPurposeStep'; +@import 'patient/ui/PatientPurposeContent/PatientPurposeContent'; diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..c30b8db --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,23 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": [ + "env.d.ts", + "src/**/*", + "src/**/*.vue" + ], + "exclude": [ + "src/**/__tests__/*" + ], + "compilerOptions": { + "composite": true, + "baseUrl": ".", + "typeRoots": [ + "./src" + ], + "paths": { + "@/*": [ + "./src/*" + ] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..dee96be --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/node18/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..882bd39 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,17 @@ +import { fileURLToPath, URL } from 'node:url' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import { defineConfig } from 'vite' +import ViteVue3Bem from 'vite-plugin-vue3-bem' + +// https://vitejs.dev/config/ +export default defineConfig({ + //@ts-ignore + plugins: [vue(), ViteVue3Bem(), vueJsx()], + + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +})