diff --git a/package-lock.json b/package-lock.json index 4e064237..a7a92b91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.4.0", "license": "MIT", "dependencies": { + "@mdi/js": "^7.2.96", "@vuepic/vue-datepicker": "^5.1.2", "axios": "^1.4.0", "cbor-js": "^0.1.0", @@ -29,7 +30,10 @@ "swiper": "^9.3.2", "ua-parser-js": "^1.0.35", "vue": "^3.3.4", - "vue-i18n": "^9.2.2" + "vue-i18n": "^9.2.2", + "vue-router": "^4.2.2", + "vue3-perfect-scrollbar": "^1.6.1", + "vuetify": "^3.3.5" }, "devDependencies": { "@vitejs/plugin-vue": "^4.2.0", @@ -2998,6 +3002,11 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "node_modules/@mdi/js": { + "version": "7.2.96", + "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.2.96.tgz", + "integrity": "sha512-paR9M9ZT7rKbh2boksNUynuSZMHhqRYnEZOm/KrZTjQ4/FzyhjLHuvw/8XYzP+E7fS4+/Ms/82EN1pl/OFsiIA==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3045,6 +3054,14 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -3441,8 +3458,7 @@ "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 + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -3470,7 +3486,6 @@ "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3534,11 +3549,21 @@ "node": ">=6" } }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001476", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001476.tgz", "integrity": "sha512-JmpktFppVSvyUN4gsLS0bShY2L9ZUslHLE72vgemBkS43JD2fOvKTKs+GtRwuxrtRGnwJFW0ye7kWRRlLJS9vQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3603,6 +3628,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3719,6 +3749,17 @@ "postcss": "^8.4" } }, + "node_modules/css-declaration-sorter": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", + "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, "node_modules/css-has-pseudo": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-5.0.2.tgz", @@ -3756,6 +3797,44 @@ "postcss": "^8.4" } }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssdb": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz", @@ -3776,7 +3855,6 @@ "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" }, @@ -3784,6 +3862,90 @@ "node": ">=4" } }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -3885,6 +4047,19 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, "node_modules/dom7": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", @@ -3893,6 +4068,44 @@ "ssr-window": "^4.0.0" } }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/ejs": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", @@ -3911,8 +4124,15 @@ "node_modules/electron-to-chromium": { "version": "1.4.356", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", - "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==", - "dev": true + "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==" + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/es-abstract": { "version": "1.21.2", @@ -4034,7 +4254,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -4490,8 +4709,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -4689,7 +4907,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -4908,7 +5125,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -5276,6 +5492,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/line-awesome": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/line-awesome/-/line-awesome-1.3.0.tgz", @@ -5308,6 +5532,11 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5320,6 +5549,11 @@ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5341,6 +5575,11 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5451,8 +5690,7 @@ "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "node_modules/normalize-range": { "version": "0.1.2", @@ -5463,11 +5701,21 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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" }, @@ -5609,14 +5857,18 @@ "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 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -5634,6 +5886,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pinia": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.4.tgz", @@ -5730,6 +5990,18 @@ "postcss": "^8.4" } }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, "node_modules/postcss-clamp": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", @@ -5802,6 +6074,38 @@ "postcss": "^8.4" } }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-custom-media": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-9.1.3.tgz", @@ -5887,6 +6191,50 @@ "postcss": "^8.4" } }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-double-position-gradients": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-4.0.3.tgz", @@ -5995,6 +6343,46 @@ "postcss": "^8.4" } }, + "node_modules/postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dependencies": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-import/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-import/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-import/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, "node_modules/postcss-initial": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", @@ -6057,6 +6445,98 @@ "postcss": "^8.4" } }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-nesting": { "version": "11.2.2", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-11.2.2.tgz", @@ -6077,6 +6557,131 @@ "postcss": "^8.4" } }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-opacity-percentage": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", @@ -6099,6 +6704,21 @@ "postcss": "^8.2" } }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-overflow-shorthand": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-4.0.1.tgz", @@ -6245,6 +6865,35 @@ "postcss": "^8.4" } }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", @@ -6277,7 +6926,6 @@ "version": "6.0.11", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6286,11 +6934,39 @@ "node": ">=4" } }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -6356,6 +7032,14 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -6473,7 +7157,6 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -6717,6 +7400,12 @@ "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", @@ -6828,6 +7517,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6844,7 +7548,6 @@ "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" }, @@ -6852,6 +7555,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/swiper": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.3.2.tgz", @@ -7117,7 +7848,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -7151,8 +7881,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { "version": "4.3.9", @@ -7288,6 +8017,63 @@ "vue": "^3.0.0" } }, + "node_modules/vue-router": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.2.tgz", + "integrity": "sha512-cChBPPmAflgBGmy3tBsjeoe3f3VOSG6naKyY5pjtrqLGbNEXdzCigFUHgBvp9e3ysAtFtEx7OLqcSDh/1Cq2TQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue3-perfect-scrollbar": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vue3-perfect-scrollbar/-/vue3-perfect-scrollbar-1.6.1.tgz", + "integrity": "sha512-r9wfxlFwVyHXMPKG0PnR7fDfJPQ20KEVzKQfSU5by2WKYz2PwV0bTfyfejmEyZXsXL0O8VtSWtgxfPuFR2AGOg==", + "dependencies": { + "cssnano": "^5.1.14", + "perfect-scrollbar": "^1.5.5", + "postcss-import": "^12.0.0" + } + }, + "node_modules/vuetify": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.3.5.tgz", + "integrity": "sha512-vkfPgPmKfSJa+jq6Ov+CTg7L1t2jLPKa7Slef9OrVHcLqg+gLuIj0z4PJE6E9HjFTUbgZShShOGxps52REJRIA==", + "engines": { + "node": "^12.20 || >=14.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "typescript": ">=4.7", + "vite-plugin-vuetify": "^1.0.0-alpha.12", + "vue": "^3.2.0", + "vue-i18n": "^9.0.0", + "webpack-plugin-vuetify": "^2.0.0-alpha.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite-plugin-vuetify": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } + } + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -7738,6 +8524,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index c1653c00..00a70580 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" }, "dependencies": { + "@mdi/js": "^7.2.96", "@vuepic/vue-datepicker": "^5.1.2", "axios": "^1.4.0", "cbor-js": "^0.1.0", @@ -38,7 +39,10 @@ "swiper": "^9.3.2", "ua-parser-js": "^1.0.35", "vue": "^3.3.4", - "vue-i18n": "^9.2.2" + "vue-i18n": "^9.2.2", + "vue-router": "^4.2.2", + "vue3-perfect-scrollbar": "^1.6.1", + "vuetify": "^3.3.5" }, "devDependencies": { "@vitejs/plugin-vue": "^4.2.0", diff --git a/src/DesktopApp.vue b/src/DesktopApp.vue index 9648ab2b..082dd4d2 100644 --- a/src/DesktopApp.vue +++ b/src/DesktopApp.vue @@ -1,15 +1,76 @@ - + + + + + + diff --git a/src/desktop-main.js b/src/desktop-main.js index 96690e3a..2d5a3a27 100644 --- a/src/desktop-main.js +++ b/src/desktop-main.js @@ -1,6 +1,316 @@ -import { createApp } from 'vue' +import { createApp } from 'vue'; +import { createPinia } from 'pinia'; +import { createI18n } from 'vue-i18n'; + +import { createVuetify } from 'vuetify'; +import { VApp } from 'vuetify/components/VApp'; +import { VAvatar } from 'vuetify/components/VAvatar'; +import { VBtn } from 'vuetify/components/VBtn'; +import { VCard, VCardActions, VCardItem, VCardSubtitle, VCardText, VCardTitle } from 'vuetify/components/VCard'; +import { VChip } from 'vuetify/components/VChip'; +import { VDialog } from 'vuetify/components/VDialog'; +import { VDivider } from 'vuetify/components/VDivider'; +import { VForm } from 'vuetify/components/VForm'; +import { VContainer, VCol, VRow, VSpacer } from 'vuetify/components/VGrid'; +import { VIcon } from 'vuetify/components/VIcon'; +import { VImg } from 'vuetify/components/VImg'; +import { VInput } from 'vuetify/components/VInput'; +import { VList, VListGroup, VListImg, VListItem, VListItemAction, VListItemMedia, VListItemSubtitle, VListItemTitle, VListSubheader } from 'vuetify/components/VList'; +import { VMenu } from 'vuetify/components/VMenu'; +import { VOverlay } from 'vuetify/components/VOverlay'; +import { VPagination } from 'vuetify/components/VPagination'; +import { VProgressCircular } from 'vuetify/components/VProgressCircular'; +import { VProgressLinear } from 'vuetify/components/VProgressLinear'; +import { VSelect } from 'vuetify/components/VSelect'; +import { VSheet } from 'vuetify/components/VSheet'; +import { VSnackbar } from 'vuetify/components/VSnackbar'; +import { VTabs } from 'vuetify/components/VTabs'; +import { VTable } from 'vuetify/components/VTable'; +import { VTextField } from 'vuetify/components/VTextField'; +import { aliases, mdi } from 'vuetify/iconsets/mdi-svg'; +import 'vuetify/styles'; + +import 'line-awesome/dist/line-awesome/css/line-awesome.css'; + +import { PerfectScrollbar } from 'vue3-perfect-scrollbar'; +import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.min.css'; + +import VueDatePicker from '@vuepic/vue-datepicker'; +import '@vuepic/vue-datepicker/dist/main.css'; + +import router from '@/router/desktop.js'; + +import version from '@/lib/version.js'; +import settings from '@/lib/settings.js'; +import userstate from '@/lib/userstate.js'; +import { + getI18nOptions, + translateIf, + translateError, + i18nFunctions +} from '@/lib/i18n.js'; + +import '@/styles/desktop/base.css'; +import '@/styles/desktop/layout.css'; +import '@/styles/desktop/font-size.css'; +import '@/styles/desktop/gap-size.css'; +import '@/styles/desktop/vuetify.css'; +import '@/styles/desktop/classess.css'; import App from './DesktopApp.vue'; const app = createApp(App); +const pinia = createPinia(); +const i18n = createI18n(getI18nOptions()); +const vuetify = createVuetify({ + components: { + VApp, + VAvatar, + VBtn, + VCard, + VCardActions, + VCardItem, + VCardSubtitle, + VCardText, + VCardTitle, + VChip, + VDialog, + VDivider, + VForm, + VContainer, + VCol, + VRow, + VSpacer, + VIcon, + VImg, + VInput, + VList, + VListGroup, + VListImg, + VListItem, + VListItemAction, + VListItemMedia, + VListItemSubtitle, + VListItemTitle, + VListSubheader, + VMenu, + VOverlay, + VPagination, + VProgressCircular, + VProgressLinear, + VSelect, + VSheet, + VSnackbar, + VTabs, + VTable, + VTextField + }, + icons: { + defaultSet: 'mdi', + aliases, + sets: { + mdi + } + }, + + defaults: { + VAlert: { + VBtn: { + color: undefined + } + }, + VAutocomplete: { + variant: 'outlined', + color: 'primary', + hideDetails: 'auto' + }, + VAvatar: { + variant: 'flat', + VIcon: { + size: 24, + }, + }, + VBadge: { + color: 'primary' + }, + VBtn: { + color: 'primary' + }, + VCheckbox: { + color: 'primary', + hideDetails: 'auto' + }, + VChip: { + elevation: 0 + }, + VList: { + color: 'primary' + }, + VPagination: { + activeColor: 'primary' + }, + VRadio: { + color: 'primary', + hideDetails: 'auto' + }, + VSelect: { + variant: 'outlined', + color: 'primary', + hideDetails: 'auto' + }, + VSlider: { + color: 'primary', + hideDetails: 'auto' + }, + VSwitch: { + color: 'primary', + hideDetails: 'auto' + }, + VProgressCircular: { + size: 40 + }, + VTabs: { + color: 'primary', + VSlideGroup: { + showArrows: true + } + }, + VTextarea: { + variant: 'outlined', + color: 'primary', + hideDetails: 'auto' + }, + VTextField: { + variant: 'outlined', + color: 'primary', + hideDetails: 'auto' + }, + VTooltip: { + location: 'top' + } + }, + theme: { + defaultTheme: 'light', + themes: { + light: { + dark: false, + colors: { + 'primary': '#c67e48', + 'secondary': '#8a8d93', + 'on-secondary': '#fff', + 'success': '#4cd964', + 'info': '#2196f3', + 'warning': '#ff9500', + 'error': '#ff3b30', + 'on-primary': '#ffffff', + 'on-success': '#ffffff', + 'on-warning': '#ffffff', + 'background': '#faf8f4', + 'on-background': '#413935', + 'on-surface': '#413935', + 'grey-50': '#fafafa', + 'grey-100': '#f0f2f8', + 'grey-200': '#eeeeee', + 'grey-300': '#e0e0e0', + 'grey-400': '#bdbdbd', + 'grey-500': '#9e9e9e', + 'grey-600': '#757575', + 'grey-700': '#616161', + 'grey-800': '#424242', + 'grey-900': '#212121', + 'perfect-scrollbar-thumb': '#dbdade', + 'skin-bordered-background': '#fff', + 'skin-bordered-surface': '#fff' + }, + variables: { + 'btn-height': '38px', + 'code-color': '#ff8000', + 'overlay-scrim-background': '#3a3541', + 'overlay-scrim-opacity': 0.5, + 'hover-opacity': 0.04, + 'focus-opacity': 0.1, + 'selected-opacity': 0.12, + 'activated-opacity': 0.1, + 'pressed-opacity': 0.14, + 'dragged-opacity': 0.1, + 'border-color': '#3a3541', + 'table-header-background': '#f9fafc', + 'custom-background': '#f9f8f9', + 'shadow-key-umbra-opacity': 'rgba(var(--v-theme-on-surface), 0.08)', + 'shadow-key-penumbra-opacity': 'rgba(var(--v-theme-on-surface), 0.12)', + 'shadow-key-ambient-opacity': 'rgba(var(--v-theme-on-surface), 0.04)' + } + }, + dark: { + dark: true, + colors: { + 'primary': '#c67e48', + 'secondary': '#8a8d93', + 'on-secondary': '#fff', + 'success': '#4cd964', + 'info': '#2196f3', + 'warning': '#ff9500', + 'error': '#ff3b30', + 'on-primary': '#ffffff', + 'on-success': '#ffffff', + 'on-warning': '#ffffff', + 'background': '#28243d', + 'on-background': '#fcf0e3', + 'surface': '#312d4b', + 'on-surface': '#fcf0e3', + 'grey-50': '#2a2e42', + 'grey-100': '#474360', + 'grey-200': '#4a5072', + 'grey-300': '#5e6692', + 'grey-400': '#7983bb', + 'grey-500': '#8692d0', + 'grey-600': '#aab3de', + 'grey-700': '#b6bee3', + 'grey-800': '#cfd3ec', + 'grey-900': '#e7e9f6', + 'perfect-scrollbar-thumb': '#4a5072', + 'skin-bordered-background': '#312d4b', + 'skin-bordered-surface': '#312d4b' + }, + variables: { + 'btn-height': '38px', + 'code-color': '#ff8000', + 'overlay-scrim-background': '#2C2942', + 'overlay-scrim-opacity': 0.6, + 'hover-opacity': 0.04, + 'focus-opacity': 0.1, + 'selected-opacity': 0.12, + 'activated-opacity': 0.1, + 'pressed-opacity': 0.14, + 'dragged-opacity': 0.1, + 'border-color': '#E7E3FC', + 'table-header-background': '#3D3759', + 'custom-background': '#373452', + 'shadow-key-umbra-opacity': 'rgba(20, 18, 33, 0.08)', + 'shadow-key-penumbra-opacity': 'rgba(20, 18, 33, 0.12)', + 'shadow-key-ambient-opacity': 'rgba(20, 18, 33, 0.04)' + } + } + } + } +}); + +app.use(pinia); +app.use(i18n); +app.use(vuetify); +app.use(router); + +app.component('PerfectScrollbar', PerfectScrollbar); +app.component('VueDatePicker', VueDatePicker); + +app.config.globalProperties.$version = version.getVersion(); +app.config.globalProperties.$buildTime = version.getBuildTime(); + +app.config.globalProperties.$settings = settings; +app.config.globalProperties.$locale = i18nFunctions(i18n.global); +app.config.globalProperties.$tIf = (text, isTranslate) => translateIf(text, isTranslate, i18n.global.t); +app.config.globalProperties.$tError = (message) => translateError(message, i18n.global.t); + +app.config.globalProperties.$user = userstate; + app.mount('#app'); diff --git a/src/locales/en.js b/src/locales/en.js index 101f5c5f..e767242c 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -702,6 +702,7 @@ export default { 'Not Specified': 'Not Specified', 'No results': 'No results', 'Unknown': 'Unknown', + 'Other': 'Other', 'Default': 'Default', 'Done': 'Done', 'Continue': 'Continue', @@ -746,6 +747,7 @@ export default { 'Accounts': 'Accounts', 'Statistics': 'Statistics', 'Settings': 'Settings', + 'Application Settings': 'Application Settings', 'Select All': 'Select All', 'Select None': 'Select None', 'Invert Selection': 'Invert Selection', @@ -806,6 +808,7 @@ export default { 'PIN code is invalid': 'PIN code is invalid', 'PIN code is wrong': 'PIN code is wrong', 'Sign Up': 'Sign Up', + 'Overview': 'Overview', 'Transaction List': 'Transaction List', 'Account List': 'Account List', 'This Week': 'This Week', @@ -915,6 +918,8 @@ export default { 'No transaction data': 'No transaction data', 'Are you sure you want to delete this transaction?': 'Are you sure you want to delete this transaction?', 'Unable to delete this transaction': 'Unable to delete this transaction', + 'Transaction Data': 'Transaction Data', + 'Statistics Data': 'Statistics Data', 'Unable to get transaction statistics': 'Unable to get transaction statistics', 'Total Amount': 'Total Amount', 'Total Assets': 'Total Assets', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index fc444c56..91b7cded 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -702,6 +702,7 @@ export default { 'Not Specified': '未指定', 'No results': '无结果', 'Unknown': '未知', + 'Other': '其他', 'Default': '默认', 'Done': '完成', 'Continue': '继续', @@ -746,6 +747,7 @@ export default { 'Accounts': '账户', 'Statistics': '统计', 'Settings': '设置', + 'Application Settings': '应用设置', 'Select All': '全部选择', 'Select None': '全部不选', 'Invert Selection': '反向选择', @@ -806,6 +808,7 @@ export default { 'PIN code is invalid': 'PIN码无效', 'PIN code is wrong': 'PIN码错误', 'Sign Up': '注册', + 'Overview': '总览', 'Transaction List': '交易列表', 'Account List': '账户列表', 'This Week': '本周', @@ -915,6 +918,8 @@ export default { 'No transaction data': '没有交易数据', 'Are you sure you want to delete this transaction?': '您确定要删除该交易?', 'Unable to delete this transaction': '无法删除该交易', + 'Transaction Data': '交易数据', + 'Statistics Data': '统计数据', 'Unable to get transaction statistics': '无法获取交易统计数据', 'Total Amount': '总金额', 'Total Assets': '总资产', diff --git a/src/router/desktop.js b/src/router/desktop.js new file mode 100644 index 00000000..9871b7c9 --- /dev/null +++ b/src/router/desktop.js @@ -0,0 +1,137 @@ +import { createRouter, createWebHashHistory } from 'vue-router'; + +import userState from '@/lib/userstate.js'; + +import MainLayout from '@/views/desktop/MainLayout.vue'; +import LoginPage from '@/views/desktop/LoginPage.vue'; +import SignUpPage from '@/views/desktop/SignupPage.vue'; +import UnlockPage from '@/views/desktop/UnlockPage.vue'; + +import HomePage from '@/views/desktop/HomePage.vue'; +import TransactionsPage from '@/views/desktop/TransactionsPage.vue'; +import StatisticsTransactionPage from '@/views/desktop/statistics/TransactionPage.vue'; +import AccountsPage from '@/views/desktop/AccountsPage.vue'; +import TransactionCategoriesPage from '@/views/desktop/TransactionCategoriesPage.vue'; +import TransactionTagsPage from '@/views/desktop/TransactionTagsPage.vue'; +import ExchangeRatesPage from '@/views/desktop/ExchangeRatesPage.vue'; +import UserSettingsPage from '@/views/desktop/user/UserSettingsPage.vue'; +import AppSettingsPage from '@/views/desktop/app/AppSettingsPage.vue'; +import AboutPage from '@/views/desktop/AboutPage.vue'; + +function checkLogin() { + if (!userState.isUserLogined()) { + return { + path: '/login', + replace: true + }; + } + + if (!userState.isUserUnlocked()) { + return { + path: '/unlock', + replace: true + }; + } +} + +function checkLocked() { + if (!userState.isUserLogined()) { + return { + path: '/login', + replace: true + }; + } + + if (userState.isUserUnlocked()) { + return { + path: '/', + replace: true + }; + } +} + +function checkNotLogin() { + if (userState.isUserLogined() && !userState.isUserUnlocked()) { + return { + path: '/unlock', + replace: true + }; + } + + if (userState.isUserLogined()) { + return { + path: '/', + replace: true + }; + } +} + +const router = createRouter({ + history: createWebHashHistory(), + routes: [ + { + path: '/', + component: MainLayout, + beforeEnter: checkLogin, + children: [ + { + path: '', + component: HomePage + }, + { + path: '/transactions', + component: TransactionsPage + }, + { + path: '/statistics/transaction', + component: StatisticsTransactionPage + }, + { + path: '/accounts', + component: AccountsPage + }, + { + path: '/categories', + component: TransactionCategoriesPage + }, + { + path: '/tags', + component: TransactionTagsPage + }, + { + path: '/exchange_rates', + component: ExchangeRatesPage + }, + { + path: '/user/settings', + component: UserSettingsPage + }, + { + path: '/app/settings', + component: AppSettingsPage + }, + { + path: '/about', + component: AboutPage + } + ] + }, + { + path: '/login', + component: LoginPage, + beforeEnter: checkNotLogin + }, + { + path: '/signup', + component: LoginPage, + beforeEnter: SignUpPage + }, + { + path: '/unlock', + component: UnlockPage, + beforeEnter: checkLocked + } + ], +}) + +export default router; diff --git a/src/styles/desktop/base.css b/src/styles/desktop/base.css new file mode 100644 index 00000000..e5a12b26 --- /dev/null +++ b/src/styles/desktop/base.css @@ -0,0 +1,42 @@ +/** Base class **/ +/** reference: https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free **/ + +*, +::before, +::after { + box-sizing: inherit; + background-repeat: no-repeat; +} + +:root { + --v-theme-overlay-multiplier: 1; + --v-scrollbar-offset: 0px; +} + +html { + box-sizing: border-box; +} + +html { + font-family: inter,sans-serif,-apple-system,blinkmacsystemfont,Segoe UI,roboto,Helvetica Neue,arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol; + line-height: 1.5; + font-size: 1rem; + overflow-x: hidden; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +html.overflow-y-hidden { + overflow-y: hidden!important; +} + +a { + color: rgb(var(--v-theme-primary)); + text-decoration: none; +} + +p { + margin-block-end: 1rem; +} diff --git a/src/styles/desktop/classess.css b/src/styles/desktop/classess.css new file mode 100644 index 00000000..d880fd47 --- /dev/null +++ b/src/styles/desktop/classess.css @@ -0,0 +1,12 @@ +.disabled { + opacity: 0.55 !important; + pointer-events: none !important; +} + +.readonly { + pointer-events: none !important; +} + +.cursor-pointer { + cursor: pointer; +} diff --git a/src/styles/desktop/font-size.css b/src/styles/desktop/font-size.css new file mode 100644 index 00000000..a863899e --- /dev/null +++ b/src/styles/desktop/font-size.css @@ -0,0 +1,67 @@ +/** Text size class **/ +/** reference: https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free **/ + +.text-xs { + font-size: .75rem; + line-height: 1rem; +} + +.text-sm { + font-size: .875rem; + line-height: 1.25rem; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-5xl { + font-size: 3rem; + line-height: 1; +} + +.text-6xl { + font-size: 3.75rem; + line-height: 1; +} + +.text-7xl { + font-size: 4.5rem; + line-height: 1; +} + +.text-8xl { + font-size: 6rem; + line-height: 1; +} + +.text-9xl { + font-size: 8rem; + line-height: 1; +} diff --git a/src/styles/desktop/gap-size.css b/src/styles/desktop/gap-size.css new file mode 100644 index 00000000..a2eb5269 --- /dev/null +++ b/src/styles/desktop/gap-size.css @@ -0,0 +1,362 @@ +/** Gap size class **/ +/** reference: https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free **/ + +.gap-0 { + gap: 0; +} + +.gap-x-0 { + column-gap: 0; +} + +.gap-y-0 { + row-gap: 0; +} + +.gap-1 { + gap: .25rem; +} + +.gap-x-1 { + column-gap: .25rem; +} + +.gap-y-1 { + row-gap: .25rem; +} + +.gap-2 { + gap: .5rem; +} + +.gap-x-2 { + column-gap: .5rem; +} + +.gap-y-2 { + row-gap: .5rem; +} + +.gap-3 { + gap: .75rem; +} + +.gap-x-3 { + column-gap: .75rem; +} + +.gap-y-3 { + row-gap: .75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-x-4 { + column-gap: 1rem; +} + +.gap-y-4 { + row-gap: 1rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-x-5 { + column-gap: 1.25rem; +} + +.gap-y-5 { + row-gap: 1.25rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-x-6 { + column-gap: 1.5rem; +} + +.gap-y-6 { + row-gap: 1.5rem; +} + +.gap-7 { + gap: 1.75rem; +} + +.gap-x-7 { + column-gap: 1.75rem; +} + +.gap-y-7 { + row-gap: 1.75rem; +} + +.gap-8 { + gap: 2rem; +} + +.gap-x-8 { + column-gap: 2rem; +} + +.gap-y-8 { + row-gap: 2rem; +} + +.gap-9 { + gap: 2.25rem; +} + +.gap-x-9 { + column-gap: 2.25rem; +} + +.gap-y-9 { + row-gap: 2.25rem; +} + +.gap-10 { + gap: 2.5rem; +} + +.gap-x-10 { + column-gap: 2.5rem; +} + +.gap-y-10 { + row-gap: 2.5rem; +} + +.gap-11 { + gap: 2.75rem; +} + +.gap-x-11 { + column-gap: 2.75rem; +} + +.gap-y-11 { + row-gap: 2.75rem; +} + +.gap-12 { + gap: 3rem; +} + +.gap-x-12 { + column-gap: 3rem; +} + +.gap-y-12 { + row-gap: 3rem; +} + +.gap-14 { + gap: 3.5rem; +} + +.gap-x-14 { + column-gap: 3.5rem; +} + +.gap-y-14 { + row-gap: 3.5rem; +} + +.gap-16 { + gap: 4rem; +} + +.gap-x-16 { + column-gap: 4rem; +} + +.gap-y-16 { + row-gap: 4rem; +} + +.gap-20 { + gap: 5rem; +} + +.gap-x-20 { + column-gap: 5rem; +} + +.gap-y-20 { + row-gap: 5rem; +} + +.gap-24 { + gap: 6rem; +} + +.gap-x-24 { + column-gap: 6rem; +} + +.gap-y-24 { + row-gap: 6rem; +} + +.gap-28 { + gap: 7rem; +} + +.gap-x-28 { + column-gap: 7rem; +} + +.gap-y-28 { + row-gap: 7rem; +} + +.gap-32 { + gap: 8rem; +} + +.gap-x-32 { + column-gap: 8rem; +} + +.gap-y-32 { + row-gap: 8rem; +} + +.gap-36 { + gap: 9rem; +} + +.gap-x-36 { + column-gap: 9rem; +} + +.gap-y-36 { + row-gap: 9rem; +} + +.gap-40 { + gap: 10rem; +} + +.gap-x-40 { + column-gap: 10rem; +} + +.gap-y-40 { + row-gap: 10rem; +} + +.gap-44 { + gap: 11rem; +} + +.gap-x-44 { + column-gap: 11rem; +} + +.gap-y-44 { + row-gap: 11rem; +} + +.gap-48 { + gap: 12rem; +} + +.gap-x-48 { + column-gap: 12rem; +} + +.gap-y-48 { + row-gap: 12rem; +} + +.gap-52 { + gap: 13rem; +} + +.gap-x-52 { + column-gap: 13rem; +} + +.gap-y-52 { + row-gap: 13rem; +} + +.gap-56 { + gap: 14rem; +} + +.gap-x-56 { + column-gap: 14rem; +} + +.gap-y-56 { + row-gap: 14rem; +} + +.gap-60 { + gap: 15rem; +} + +.gap-x-60 { + column-gap: 15rem; +} + +.gap-y-60 { + row-gap: 15rem; +} + +.gap-64 { + gap: 16rem; +} + +.gap-x-64 { + column-gap: 16rem; +} + +.gap-y-64 { + row-gap: 16rem; +} + +.gap-72 { + gap: 18rem; +} + +.gap-x-72 { + column-gap: 18rem; +} + +.gap-y-72 { + row-gap: 18rem; +} + +.gap-80 { + gap: 20rem; +} + +.gap-x-80 { + column-gap: 20rem; +} + +.gap-y-80 { + row-gap: 20rem; +} + +.gap-96 { + gap: 24rem; +} + +.gap-x-96 { + column-gap: 24rem; +} + +.gap-y-96 { + row-gap: 24rem; +} diff --git a/src/styles/desktop/layout.css b/src/styles/desktop/layout.css new file mode 100644 index 00000000..25c4feeb --- /dev/null +++ b/src/styles/desktop/layout.css @@ -0,0 +1,544 @@ +/** Layout class **/ +/** reference: https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free **/ + +html, +body { + min-block-size: 100%; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title, +.layout-nav-type-vertical .layout-vertical-nav .nav-link > :first-child, +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child { + margin-block: 0; + margin-inline: 0 1.125rem; + padding-block: 0; + padding-inline: 1.375rem 1rem; + white-space: nowrap; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > :first-child, +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child { + border-radius: .4rem; + block-size: 2.75rem; + margin-block-end: .375rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link .nav-item-icon, +.layout-nav-type-vertical .layout-vertical-nav .nav-group .nav-item-icon { + flex-shrink: 0; + font-size: 1.5rem; + margin-inline-end: .625rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group .nav-group .nav-item-icon, +.layout-nav-type-vertical .layout-vertical-nav .nav-group .nav-link .nav-item-icon { + font-size: .9rem; + margin-inline-end: .925rem; + margin-inline-start: .3rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group .nav-group .nav-link .nav-item-icon, +.layout-nav-type-vertical .layout-vertical-nav .nav-group .nav-group .nav-group .nav-item-icon { + visibility: hidden; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group.active > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.open > :first-child:before { + opacity: calc(var(--v-selected-opacity) * var(--v-theme-overlay-multiplier)); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group.active > :hover:first-child .nav-group.active > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.open > :hover:first-child .nav-group.active > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.active > :hover:first-child .nav-group.open > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.open > :hover:first-child .nav-group.open > :first-child:before { + opacity: calc(var(--v-selected-opacity) + var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group.active > :focus-visible:first-child .nav-group.active > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.open > :focus-visible:first-child .nav-group.active > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.active > :focus-visible:first-child .nav-group.open > :first-child:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.open > :focus-visible:first-child .nav-group.open > :first-child:before { + opacity: calc(var(--v-selected-opacity) + var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} + +@supports not selector(:focus-visible) { + .layout-nav-type-vertical .layout-vertical-nav .nav-group.active > :focus:first-child:before, + .layout-nav-type-vertical .layout-vertical-nav .nav-group.open > :focus:first-child:before { + opacity: calc(var(--v-selected-opacity) + var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title { + block-size: 1.5rem; + color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)); + font-size: .75rem; + text-transform: uppercase; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-item-badge { + display: inline-block; + border-radius: 1.5rem; + font-size: .8em; + font-weight: 500; + line-height: 1; + padding-block: .25em; + padding-inline: .55em; + text-align: center; + vertical-align: baseline; + white-space: nowrap; +} + +.layout-nav-type-vertical .layout-vertical-nav { + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-item-title { + letter-spacing: .15px; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title { + letter-spacing: .4px; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > .router-link-exact-active { + background-color: rgb(var(--v-theme-primary)); + color: rgb(var(--v-theme-on-primary)); + box-shadow: 0 4px 14px -4px var(--v-shadow-key-umbra-opacity), 0 4px 8px -4px var(--v-shadow-key-penumbra-opacity), 0 4px 8px -4px var(--v-shadow-key-ambient-opacity); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link a { + color: inherit; +} + +.layout-navbar { + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} + +html.v-overlay-scroll-blocked:not([style*="--v-body-scroll-y: 0px;"]) .layout-navbar-sticky .navbar-blur.layout-navbar .navbar-content-container, +.layout-wrapper.layout-nav-type-vertical.window-scrolled.layout-navbar-sticky .navbar-blur.layout-navbar .navbar-content-container { + -webkit-backdrop-filter: blur(6px); + backdrop-filter: blur(6px); + background-color: rgb(var(--v-theme-surface), .9); +} + +html.v-overlay-scroll-blocked:not([style*="--v-body-scroll-y: 0px;"]) .layout-navbar-sticky .layout-navbar .navbar-content-container, +.layout-wrapper.layout-nav-type-vertical.window-scrolled.layout-navbar-sticky .layout-navbar .navbar-content-container { + background-color: rgb(var(--v-theme-surface)); +} + +html.v-overlay-scroll-blocked:not([style*="--v-body-scroll-y: 0px;"]) .layout-navbar-sticky .layout-navbar .navbar-content-container, +.layout-wrapper.layout-nav-type-vertical.window-scrolled.layout-navbar-sticky .layout-navbar .navbar-content-container { + box-shadow: 0 4px 14px -4px var(--v-shadow-key-umbra-opacity), 0 4px 8px -4px var(--v-shadow-key-penumbra-opacity), 0 4px 8px -4px var(--v-shadow-key-ambient-opacity); + padding-inline: 1.2rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > .router-link-exact-active { + background: linear-gradient(-72.47deg, rgb(var(--v-theme-primary)) 22.16%, rgba(var(--v-theme-primary), .7) 76.47%) !important; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title .title-text { + display: flex; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; + column-gap: .625rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title .title-text:before, +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title .title-text:after { + border-block-end: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)); + content: ""; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title .title-text:after { + flex: 1 1 auto; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title .title-text:before { + flex: 0 1 .75rem; + margin-inline-start: -1.375rem; +} + +.layout-nav-type-vertical.layout-vertical-nav-collapsed .layout-vertical-nav:not(.hovered) .nav-section-title { + margin-inline: 4px 0; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > :first-child, +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child { + block-size: 2.625rem !important; + border-end-end-radius: 3.125rem !important; + border-end-start-radius: 0 !important; + border-start-end-radius: 3.125rem !important; + border-start-start-radius: 0 !important; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > :first-child, +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child { + transition: margin-inline .15s ease-in-out; + will-change: margin-inline; +} + +.layout-nav-type-vertical.layout-vertical-nav-collapsed .layout-vertical-nav:not(.hovered) .nav-link > :first-child, +.layout-nav-type-vertical.layout-vertical-nav-collapsed .layout-vertical-nav:not(.hovered) .nav-group > :first-child { + margin-inline: 0 5px; +} + +.layout-nav-type-vertical .layout-vertical-nav { + background-color: rgb(var(--v-theme-background)); +} + +.layout-vertical-nav-collapsed.layout-nav-type-vertical .layout-vertical-nav.hovered { + box-shadow: 0 4px 5px -2px var(--v-shadow-key-umbra-opacity), 0 2px 10px 1px var(--v-shadow-key-penumbra-opacity), 0 2px 16px 1px var(--v-shadow-key-ambient-opacity); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-header { + overflow: hidden; + padding: 1rem .25rem 1rem 1.375rem; + margin-inline: 0 1.125rem; + min-block-size: 64px; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-header .app-logo { + flex-shrink: 0; + transition: transform .25s ease-in-out; +} + +.layout-vertical-nav-collapsed.layout-nav-type-vertical .layout-vertical-nav:not(.hovered) .nav-header .app-logo { + transform: translate(-4px); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-header .app-title { + margin-inline-start: .9rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .vertical-nav-items-shadow { + position: absolute; + z-index: 1; + background: linear-gradient(rgb(var(--v-theme-background)) 5%, rgba(var(--v-theme-background), 75%) 45%, rgba(var(--v-theme-background), 20%) 80%, transparent); + block-size: 55px; + inline-size: 100%; + inset-block-start: 62px; + opacity: 0; + pointer-events: none; + transition: opacity .15s ease-in-out; + will-change: opacity; +} + +.layout-nav-type-vertical .layout-vertical-nav.scrolled .vertical-nav-items-shadow { + opacity: 1; +} + +.layout-nav-type-vertical .layout-vertical-nav .ps__rail-y { + z-index: 1; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title { + margin-block-end: .5rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title:not(:first-child) { + margin-block-start: 1.5rem; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-section-title .placeholder-icon { + margin-inline: auto; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link, +.layout-nav-type-vertical .layout-vertical-nav .nav-group { + overflow: hidden; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link.disabled, +.layout-nav-type-vertical .layout-vertical-nav .nav-group.disabled { + opacity: var(--v-disabled-opacity); + pointer-events: none; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > a { + position: relative; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > a:before { + position: absolute; + border-radius: inherit; + background: currentcolor; + block-size: 100%; + content: ""; + inline-size: 100%; + inset: 0; + opacity: 0; + pointer-events: none; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > a:hover:before { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-link > a:focus-visible:before { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} + +@supports not selector(:focus-visible) { + .layout-nav-type-vertical .layout-vertical-nav .nav-link > a:focus:before { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group .nav-group-arrow { + flex-shrink: 0; + transform-origin: center; + transition: transform .15s ease-in-out; + will-change: transform; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group.open > .nav-group-label .nav-group-arrow { + transform: rotate(90deg); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child { + position: relative; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child:before { + position: absolute; + border-radius: inherit; + background: currentcolor; + block-size: 100%; + content: ""; + inline-size: 100%; + inset: 0; + opacity: 0; + pointer-events: none; +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child:hover:before { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} + +.layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child:focus-visible:before { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} + +@supports not selector(:focus-visible) { + .layout-nav-type-vertical .layout-vertical-nav .nav-group > :first-child:focus:before { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} + +.vertical-nav-section-title-enter-active, +.vertical-nav-section-title-leave-active { + transition: opacity .1s ease-in-out, transform .1s ease-in-out; +} + +.vertical-nav-section-title-enter-from, +.vertical-nav-section-title-leave-to { + opacity: 0; + transform: translate(15px); +} + +.transition-slide-x-enter-active, +.transition-slide-x-leave-active { + transition: opacity .1s ease-in-out, transform .12s ease-in-out; +} + +.transition-slide-x-enter-from, +.transition-slide-x-leave-to { + opacity: 0; + transform: translate(-15px); +} + +.vertical-nav-app-title-enter-active, +.vertical-nav-app-title-leave-active { + transition: opacity .1s ease-in-out, transform .12s ease-in-out; +} + +.vertical-nav-app-title-enter-from, +.vertical-nav-app-title-leave-to { + opacity: 0; + transform: translate(-15px); +} + +.layout-vertical-nav ol, .layout-vertical-nav ul, +.layout-horizontal-nav ol, .layout-horizontal-nav ul { + list-style: none; +} + +.scrollable-content.v-navigation-drawer .v-navigation-drawer__content { + display: flex; + overflow: hidden; + flex-direction: column; +} + +.layout-wrapper.layout-nav-type-vertical .layout-navbar .navbar-content-container { + transition: padding .2s ease, background-color .18s ease; +} + +.layout-wrapper.layout-nav-type-vertical .layout-navbar .navbar-content-container { + border-radius: 0 0 10px 10px; +} + +.layout-wrapper.layout-nav-type-vertical .layout-footer .footer-content-container { + border-radius: 10px 10px 0 0; +} + +.layout-footer-sticky.layout-wrapper.layout-nav-type-vertical .layout-footer .footer-content-container { + background-color: rgb(var(--v-theme-surface)); + padding-block: 0; + padding-inline: 1.2rem; + box-shadow: 0 4px 14px -4px var(--v-shadow-key-umbra-opacity), 0 4px 8px -4px var(--v-shadow-key-penumbra-opacity), 0 4px 8px -4px var(--v-shadow-key-ambient-opacity); +} + +.layout-wrapper.layout-nav-type-vertical.layout-content-height-fixed .page-content-container > .v-layout:first-child { + overflow: hidden; + min-block-size: 100%; +} + +.layout-wrapper.layout-nav-type-vertical.layout-content-height-fixed .page-content-container > .v-layout:first-child > .v-main .v-main__wrap > :first-child { + block-size: 100%; + overflow-y: auto; +} + +.layout-wrapper.layout-nav-type-horizontal.layout-content-height-fixed > .layout-page-content { + display: flex; +} + +.layout-vertical-nav { + position: fixed; + z-index: 1004; + display: flex; + flex-direction: column; + block-size: 100%; + inline-size: 260px; + inset-block-start: 0; + inset-inline-start: 0; + transition: transform .25s ease-in-out, inline-size .25s ease-in-out, box-shadow .25s ease-in-out; + will-change: transform, inline-size; +} + +.layout-vertical-nav .nav-header { + display: flex; + align-items: center; +} + +.layout-vertical-nav .app-title-wrapper { + margin-inline-end: auto; +} + +.layout-vertical-nav .nav-items { + block-size: 100%; +} + +.layout-vertical-nav .nav-item-title { + overflow: hidden; + margin-inline-end: auto; + text-overflow: ellipsis; + white-space: nowrap; +} + +.layout-vertical-nav-collapsed .layout-vertical-nav:not(.hovered) { + inline-size: 68px +} + +.layout-vertical-nav.overlay-nav:not(.visible) { + transform: translate(-260px); +} + +.layout-content-width-boxed.layout-wrapper.layout-nav-type-vertical .layout-navbar { + inline-size: 100%; + margin-inline: auto; + max-inline-size: 1440px; +} + +.layout-wrapper.layout-nav-type-vertical .layout-navbar { + padding-inline: 1.5rem; +} + +.layout-wrapper.layout-nav-type-vertical.layout-navbar-hidden .layout-navbar { + display: none; +} + +.layout-wrapper.layout-nav-type-vertical.layout-navbar-sticky .layout-navbar { + position: sticky; + inset-block-start: 0; +} + +.layout-wrapper.layout-nav-type-vertical { + block-size: 100%; +} + +.layout-wrapper.layout-nav-type-vertical .layout-content-wrapper { + display: flex; + flex-direction: column; + flex-grow: 1; + min-block-size: calc(var(--vh, 1vh) * 100); + transition: padding-inline-start .2s ease-in-out; + will-change: padding-inline-start; +} + +.layout-wrapper.layout-nav-type-vertical .layout-navbar { + z-index: 11; +} + +.layout-wrapper.layout-nav-type-vertical .layout-navbar .navbar-content-container { + block-size: 64px; +} + +.layout-wrapper.layout-nav-type-vertical .layout-overlay { + position: fixed; + z-index: 1003; + background-color: #0009; + cursor: pointer; + inset: 0; + opacity: 0; + pointer-events: none; + transition: opacity .25s ease-in-out; + will-change: transform; +} + +.layout-wrapper.layout-nav-type-vertical .layout-overlay.visible { + opacity: 1; + pointer-events: auto; +} + +.layout-wrapper.layout-nav-type-vertical:not(.layout-overlay-nav) .layout-content-wrapper { + padding-inline-start: 260px; +} + +.layout-wrapper.layout-nav-type-vertical.layout-vertical-nav-collapsed .layout-content-wrapper { + padding-inline-start: 68px; +} + +.layout-wrapper.layout-nav-type-vertical.layout-content-height-fixed .layout-content-wrapper { + max-block-size: calc(var(--vh) * 100); +} + +.layout-wrapper.layout-nav-type-vertical.layout-content-height-fixed .layout-page-content { + display: flex; + overflow: hidden; +} + +.layout-wrapper.layout-nav-type-vertical.layout-content-height-fixed .layout-page-content .page-content-container { + inline-size: 100%; +} + +.layout-wrapper.layout-nav-type-vertical.layout-content-height-fixed .layout-page-content .page-content-container > :first-child { + max-block-size: 100%; + overflow-y: auto; +} + +.layout-vertical-nav .nav-link a { + display: flex; + align-items: center; + cursor: pointer; +} + +.layout-page-content { + flex-grow: 1; + padding-block: 1.5rem; +} + +.layout-page-content { + padding-inline: 1.5rem; +} + diff --git a/src/styles/desktop/vuetify.css b/src/styles/desktop/vuetify.css new file mode 100644 index 00000000..7d689934 --- /dev/null +++ b/src/styles/desktop/vuetify.css @@ -0,0 +1,211 @@ +/** Vuetify class overrides **/ +/** reference: https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free **/ + +.v-application__wrap { + min-height: calc(var(--vh, 1vh) * 100); +} + +h1, +h2, +h3, +h4, +h5, +h6, +.text-h1, +.text-h2, +.text-h3, +.text-h4, +.text-h5, +.text-h6, +.text-button, +.text-overline, +.v-card-title { + color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity)); +} + +.v-application, +.text-body-1, +.text-body-2, +.text-subtitle-1, +.text-subtitle-2 { + color: rgba(var(--v-theme-on-background), var(--v-medium-emphasis-opacity)); +} + +.v-row .v-col .v-input__details, +.v-row [class^="v-col-*"] .v-input__details { + margin-block-end: 0; +} + +.v-btn--density-compact.v-btn--size-default .v-btn__content > svg { + block-size: 22px; + font-size: 22px; + inline-size: 22px; +} + +.v-card-text + .v-card-text { + padding-block-start: 0 !important; +} + +.v-checkbox.v-input, +.v-switch.v-input { + --v-input-control-height: auto; + flex: unset; +} + +.v-selection-control--density-comfortable.v-checkbox-btn .v-selection-control__wrapper, +.v-selection-control--density-comfortable.v-radio .v-selection-control__wrapper, +.v-selection-control--density-comfortable.v-radio-btn .v-selection-control__wrapper { + margin-inline-start: -.5625rem; +} + +.v-selection-control--density-compact.v-radio .v-selection-control__wrapper, +.v-selection-control--density-compact.v-radio-btn .v-selection-control__wrapper, +.v-selection-control--density-compact.v-checkbox-btn .v-selection-control__wrapper { + margin-inline-start: -.3125rem; +} + +.v-selection-control--density-default.v-checkbox-btn .v-selection-control__wrapper, +.v-selection-control--density-default.v-radio .v-selection-control__wrapper, +.v-selection-control--density-default.v-radio-btn .v-selection-control__wrapper { + margin-inline-start: -.6875rem; +} + +.v-radio-group .v-selection-control-group .v-radio:not(:last-child) { + margin-inline-end: .9rem; +} + +.disable-tab-transition { + overflow: unset !important; +} + +.disable-tab-transition .v-window__container { + block-size: auto !important; +} + +.disable-tab-transition .v-window-item:not(.v-window-item--active) { + display: none !important; +} + +.disable-tab-transition .v-window__container .v-window-item { + transform: none !important; +} + +.v-list .v-list-item__prepend > .v-icon, +.v-list .v-list-item__append > .v-icon { + opacity: var(--v-high-emphasis-opacity); +} + +.card-list { + --v-card-list-gap: 20px; +} + +.card-list.v-list { + padding-block: 0; +} + +.card-list .v-list-item { + min-block-size: unset; + min-block-size: auto !important; + padding-block: 0 !important; + padding-inline: 0 !important; +} + +.card-list .v-list-item > .v-ripple__container { + opacity: 0; +} + +.card-list .v-list-item:not(:last-child) { + padding-block-end: var(--v-card-list-gap) !important; +} + +.card-list .v-list-item: hover > .v-list-item__overlay, +.card-list .v-list-item:focus > .v-list-item__overlay, +.card-list .v-list-item:active > .v-list-item__overlay, +.card-list .v-list-item.active > .v-list-item__overlay { + opacity: 0 !important; +} + +.v-divider { + color: rgb(var(--v-border-color)); +} + +.v-data-table .v-checkbox-btn .v-selection-control__wrapper { + margin-inline-start: 0 !important; +} + +.v-data-table .v-selection-control { + display: flex !important; +} + +.v-data-table .v-pagination { + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); +} + +.v-data-table-footer { + margin-block-start: 1rem; +} + +.v-field:hover .v-field__outline { + --v-field-border-opacity: var(--v-medium-emphasis-opacity); +} + +.v-label { + opacity: 1 !important; +} + +.v-label:not(.v-field-label--floating) { + color: rgba(var(--v-theme-on-background), var(--v-medium-emphasis-opacity)); +} + +.v-messages { + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); + opacity: 1; +} + +.v-alert__close .v-btn--icon .v-icon { + --v-icon-size-multiplier: 1.5; +} + +.v-badge__badge { + display: flex; + align-items: center; +} + +.v-btn:focus-visible:after { + opacity: 0 !important; +} + +.v-input:not(.v-select--chips) .v-select__selection .v-chip { + margin-block: 2px var(--select-chips-margin-bottom); +} + +.v-card-subtitle, +.v-list-item-subtitle { + color: rgba(var(--v-theme-on-background), var(--v-medium-emphasis-opacity)); +} + +.v-field__input input::placeholder, +input.v-field__input::placeholder, +textarea.v-field__input::placeholder { + color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)) !important; + opacity: 1 !important; +} + +.v-card-item { + padding: 1.25rem; +} + +.v-card-text { + letter-spacing: .0094rem; + padding: 1.25rem; +} + +.v-card--variant-elevated { + box-shadow: 0 4px 5px -2px var(--v-shadow-key-umbra-opacity), 0 2px 10px 1px var(--v-shadow-key-penumbra-opacity), 0 2px 16px 1px var(--v-shadow-key-ambient-opacity); +} + +.v-card--variant-elevated, +.v-card--variant-flat { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); +} diff --git a/src/views/desktop/AboutPage.vue b/src/views/desktop/AboutPage.vue new file mode 100644 index 00000000..49babd49 --- /dev/null +++ b/src/views/desktop/AboutPage.vue @@ -0,0 +1,13 @@ + + + about + + + + diff --git a/src/views/desktop/AccountsPage.vue b/src/views/desktop/AccountsPage.vue new file mode 100644 index 00000000..2e202c61 --- /dev/null +++ b/src/views/desktop/AccountsPage.vue @@ -0,0 +1,13 @@ + + + accounts + + + + diff --git a/src/views/desktop/ExchangeRatesPage.vue b/src/views/desktop/ExchangeRatesPage.vue new file mode 100644 index 00000000..28fdb97f --- /dev/null +++ b/src/views/desktop/ExchangeRatesPage.vue @@ -0,0 +1,13 @@ + + + exchange rates + + + + diff --git a/src/views/desktop/HomePage.vue b/src/views/desktop/HomePage.vue new file mode 100644 index 00000000..00f33e6b --- /dev/null +++ b/src/views/desktop/HomePage.vue @@ -0,0 +1,13 @@ + + + overview + + + + diff --git a/src/views/desktop/LoginPage.vue b/src/views/desktop/LoginPage.vue new file mode 100644 index 00000000..62ef8504 --- /dev/null +++ b/src/views/desktop/LoginPage.vue @@ -0,0 +1,344 @@ + + + + + + + {{ $t('global.app.title') }} + + + + + + + + + + + + + + + + + + + + + + {{ $t('Log In') }} + + + {{ $t('Continue') }} + + + + + {{ $t('Don\'t have an account?') }} + + {{ $t('Create an account') }} + + + + + + + {{ currentLanguageName }} + + + + + {{ lang.displayName }} + + + + + + + + + + + + Powered by + ezBookkeeping {{ version }} + + + + + + + + {{ snackbarMessage }} + + + {{ $t('Close') }} + + + + + + + + + + + + + + + + diff --git a/src/views/desktop/MainLayout.vue b/src/views/desktop/MainLayout.vue new file mode 100644 index 00000000..6611d937 --- /dev/null +++ b/src/views/desktop/MainLayout.vue @@ -0,0 +1,268 @@ + + + + + + + diff --git a/src/views/desktop/SignupPage.vue b/src/views/desktop/SignupPage.vue new file mode 100644 index 00000000..21fb2dfa --- /dev/null +++ b/src/views/desktop/SignupPage.vue @@ -0,0 +1,13 @@ + + + + + + + diff --git a/src/views/desktop/TransactionCategoriesPage.vue b/src/views/desktop/TransactionCategoriesPage.vue new file mode 100644 index 00000000..fb8db1f5 --- /dev/null +++ b/src/views/desktop/TransactionCategoriesPage.vue @@ -0,0 +1,13 @@ + + + categories + + + + diff --git a/src/views/desktop/TransactionTagsPage.vue b/src/views/desktop/TransactionTagsPage.vue new file mode 100644 index 00000000..a8f6dadb --- /dev/null +++ b/src/views/desktop/TransactionTagsPage.vue @@ -0,0 +1,13 @@ + + + tags + + + + diff --git a/src/views/desktop/TransactionsPage.vue b/src/views/desktop/TransactionsPage.vue new file mode 100644 index 00000000..fb4979f8 --- /dev/null +++ b/src/views/desktop/TransactionsPage.vue @@ -0,0 +1,13 @@ + + + transactions + + + + diff --git a/src/views/desktop/UnlockPage.vue b/src/views/desktop/UnlockPage.vue new file mode 100644 index 00000000..21fb2dfa --- /dev/null +++ b/src/views/desktop/UnlockPage.vue @@ -0,0 +1,13 @@ + + + + + + + diff --git a/src/views/desktop/app/AppSettingsPage.vue b/src/views/desktop/app/AppSettingsPage.vue new file mode 100644 index 00000000..da0098a5 --- /dev/null +++ b/src/views/desktop/app/AppSettingsPage.vue @@ -0,0 +1,13 @@ + + + app settings + + + + diff --git a/src/views/desktop/statistics/TransactionPage.vue b/src/views/desktop/statistics/TransactionPage.vue new file mode 100644 index 00000000..54eee68a --- /dev/null +++ b/src/views/desktop/statistics/TransactionPage.vue @@ -0,0 +1,13 @@ + + + statistics + + + + diff --git a/src/views/desktop/user/UserSettingsPage.vue b/src/views/desktop/user/UserSettingsPage.vue new file mode 100644 index 00000000..2b7a5823 --- /dev/null +++ b/src/views/desktop/user/UserSettingsPage.vue @@ -0,0 +1,13 @@ + + + user settings + + + + diff --git a/third-patry-dependencies.json b/third-patry-dependencies.json index f69de134..2cd8090c 100644 --- a/third-patry-dependencies.json +++ b/third-patry-dependencies.json @@ -93,12 +93,24 @@ "url": "https://github.com/vuejs/pinia", "licenseUrl": "https://github.com/vuejs/pinia/blob/pinia%402.1.4/LICENSE" }, + { + "name": "vue-router", + "copyright": "Copyright (c) 2019-present Eduardo San Martin Morote", + "url": "https://github.com/vuejs/router", + "licenseUrl": "https://github.com/vuejs/router/blob/v4.2.2/LICENSE" + }, { "name": "vue-i18n", "copyright": "Copyright (c) 2016 kazuya kawaguchi", "url": "https://github.com/intlify/vue-i18n-next", "licenseUrl": "https://github.com/intlify/vue-i18n-next/blob/v9.2.2/LICENSE" }, + { + "name": "vuetify", + "copyright": "Copyright (c) 2016-2023 John Jeremy Leider", + "url": "https://vuetifyjs.com", + "licenseUrl": "https://github.com/vuetifyjs/vuetify/blob/v3.3.5/LICENSE.md" + }, { "name": "register-service-worker", "copyright": "Copyright (c) 2013-present, Yuxi (Evan) You", @@ -141,6 +153,12 @@ "url": "https://github.com/nolimits4web/skeleton-elements", "licenseUrl": "https://github.com/nolimits4web/skeleton-elements/blob/v4.0.1/LICENSE" }, + { + "name": "vue3-perfect-scrollbar", + "copyright": "Copyright (c) 2018 Adam", + "url": "https://github.com/mercs600/vue3-perfect-scrollbar", + "licenseUrl": "https://github.com/mercs600/vue3-perfect-scrollbar/blob/1.6.1/LICENSE" + }, { "name": "@vuepic/vue-datepicker", "copyright": "Copyright (c) 2021-present Vuepic", @@ -201,9 +219,20 @@ "url": "https://github.com/faisalman/ua-parser-js", "licenseUrl": "https://github.com/faisalman/ua-parser-js/blob/1.0.35/license.md" }, + { + "name": "Materio - Vuetify VueJS 3 Free Admin Template", + "copyright": "Copyright (c) 2022 ThemeSelection", + "url": "https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free", + "licenseUrl": "https://github.com/themeselection/materio-vuetify-vuejs-admin-template-free/blob/v2.1.0/LICENSE" + }, { "name": "Icons8 Line Awesome", "url": "https://icons8.com/line-awesome", "licenseUrl": "https://github.com/icons8/line-awesome/blob/master/LICENSE.md" + }, + { + "name": "Material Design Icons for JS/TypeScript", + "url": "https://materialdesignicons.com", + "licenseUrl": "https://github.com/Templarian/MaterialDesign-JS/blob/v7.2.96/LICENSE" } ] diff --git a/vite.config.js b/vite.config.js index 729dc4aa..0757839d 100644 --- a/vite.config.js +++ b/vite.config.js @@ -110,10 +110,20 @@ export default defineConfig(async () => { manualChunks: function (id) { if (/[\\/]node_modules[\\/]leaflet[\\/]/i.test(id)) { return 'leaflet'; + } else if (/[\\/]node_modules[\\/](moment|moment-timezone)[\\/]/i.test(id)) { + return 'moment'; } else if (/[\\/]node_modules[\\/](dom7|framework7.*|skeleton-elements|swiper)[\\/]/i.test(id)) { return 'vendor-mobile'; + } else if (/[\\/]node_modules[\\/](vuetify|vue-router|vue3-perfect-scrollbar|@mdi.*)[\\/]/i.test(id)) { + return 'vendor-desktop'; } else if (/[\\/]node_modules[\\/]/i.test(id)) { - return 'vendor'; + return 'vendor-common'; + } else if (/[\\/]src[\\/]locales[\\/]/i.test(id)) { + return 'locales'; + } else if (/[\\/]src[\\/](consts|stores)[\\/]/i.test(id)) { + return 'common'; + } else if (/[\\/]src[\\/]lib[\\/](map[\\/]|[a-zA-Z0-9-_]+\.js)/i.test(id)) { + return 'common'; } } },
{{ $t('global.app.title') }}