diff options
Diffstat (limited to 'src/webapp')
90 files changed, 2973 insertions, 2189 deletions
diff --git a/src/webapp/TODO.txt b/src/webapp/TODO.txt index 2e37cd9..0999ab8 100644 --- a/src/webapp/TODO.txt +++ b/src/webapp/TODO.txt @@ -1,3 +1,3 @@ --- Refresh access token list if 404 is returned --- Don't initialise components before they are needed +TODO: Refresh access token list if 404 is returned +TODO: Don't initialise components before they are needed Example of this is access token list, the tokens get loaded on page load diff --git a/src/webapp/package-lock.json b/src/webapp/package-lock.json index 2ccdaf8..7eb459f 100644 --- a/src/webapp/package-lock.json +++ b/src/webapp/package-lock.json @@ -6,29 +6,22 @@ "packages": { "": { "version": "0.0.0", - "dependencies": { - "@types/validator": "^13.7.1" - }, "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.33", + "@sveltejs/vite-plugin-svelte": "^1.0.0-next.37", "@tailwindcss/forms": "^0.4.0", - "@tailwindcss/typography": "^0.5.0", "@tsconfig/svelte": "^3.0.0", - "autoprefixer": "^10.4.1", - "lz-string": "^1.4.4", + "@types/validator": "^13.7.1", + "autoprefixer": "^10.4.2", "postcss": "^8.4.5", - "svelte": "^3.44.3", - "svelte-check": "^2.2.11", - "svelte-fsm": "^1.1.2", + "postcss-load-config": "^3.1.1", + "svelte": "^3.46.4", + "svelte-check": "^2.4.3", "svelte-preprocess": "^4.10.1", "svelte-spa-router": "^3.2.0", - "svelte-tiny-virtual-list": "^1.1.7", - "tailwindcss": "^3.0.8", - "tslib": "^2.3.1", - "typescript": "^4.5.4", + "tailwindcss": "^3.0.12", + "typescript": "^4.5.5", "validator": "^13.7.0", - "vest": "^4.0.1", - "vite": "^2.7.10" + "vite": "^2.8.1" } }, "node_modules/@babel/code-frame": { @@ -177,16 +170,15 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.33", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.33.tgz", - "integrity": "sha512-aj0h2+ZixgT+yoJFIs8dRRw/Cj9tgNu3+hY4CJikpa04mfhR61wXqJFfi2ZEFMUvFda5nCxKYIChFkc6wq5fJA==", + "version": "1.0.0-next.37", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz", + "integrity": "sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^4.1.2", "debug": "^4.3.3", "kleur": "^4.1.4", "magic-string": "^0.25.7", - "require-relative": "^0.8.7", "svelte-hmr": "^0.14.9" }, "engines": { @@ -215,22 +207,6 @@ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" } }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.0.tgz", - "integrity": "sha512-1p/3C6C+JJziS/ghtG8ACYalbA2SyLJY27Pm33cVTlAoY6VQ7zfm2H64cPxUMBkVIlWXTtWHhZcZJPobMRmQAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || insiders" - } - }, "node_modules/@tsconfig/svelte": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", @@ -267,7 +243,8 @@ "node_modules/@types/validator": { "version": "13.7.1", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.1.tgz", - "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==" + "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==", + "dev": true }, "node_modules/acorn": { "version": "7.4.1", @@ -336,13 +313,13 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz", - "integrity": "sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "dev": true, "dependencies": { "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001294", + "caniuse-lite": "^1.0.30001297", "fraction.js": "^4.1.2", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -450,9 +427,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001294", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz", - "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==", + "version": "1.0.30001311", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz", + "integrity": "sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==", "dev": true, "funding": { "type": "opencollective", @@ -476,10 +453,16 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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", @@ -520,12 +503,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/context": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/context/-/context-2.0.1.tgz", - "integrity": "sha512-8QV3EXa7WP9l8aL8a3BMM792vvuPbIyp6ktGHEX6V4XiGNaiqxCGMRGzEavE3cPnHWqI9fXTujPEfBPt0iRhQw==", - "dev": true - }, "node_modules/cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -637,38 +614,43 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", - "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz", + "integrity": "sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, + "engines": { + "node": ">=12" + }, "optionalDependencies": { - "esbuild-android-arm64": "0.13.15", - "esbuild-darwin-64": "0.13.15", - "esbuild-darwin-arm64": "0.13.15", - "esbuild-freebsd-64": "0.13.15", - "esbuild-freebsd-arm64": "0.13.15", - "esbuild-linux-32": "0.13.15", - "esbuild-linux-64": "0.13.15", - "esbuild-linux-arm": "0.13.15", - "esbuild-linux-arm64": "0.13.15", - "esbuild-linux-mips64le": "0.13.15", - "esbuild-linux-ppc64le": "0.13.15", - "esbuild-netbsd-64": "0.13.15", - "esbuild-openbsd-64": "0.13.15", - "esbuild-sunos-64": "0.13.15", - "esbuild-windows-32": "0.13.15", - "esbuild-windows-64": "0.13.15", - "esbuild-windows-arm64": "0.13.15" + "esbuild-android-arm64": "0.14.21", + "esbuild-darwin-64": "0.14.21", + "esbuild-darwin-arm64": "0.14.21", + "esbuild-freebsd-64": "0.14.21", + "esbuild-freebsd-arm64": "0.14.21", + "esbuild-linux-32": "0.14.21", + "esbuild-linux-64": "0.14.21", + "esbuild-linux-arm": "0.14.21", + "esbuild-linux-arm64": "0.14.21", + "esbuild-linux-mips64le": "0.14.21", + "esbuild-linux-ppc64le": "0.14.21", + "esbuild-linux-riscv64": "0.14.21", + "esbuild-linux-s390x": "0.14.21", + "esbuild-netbsd-64": "0.14.21", + "esbuild-openbsd-64": "0.14.21", + "esbuild-sunos-64": "0.14.21", + "esbuild-windows-32": "0.14.21", + "esbuild-windows-64": "0.14.21", + "esbuild-windows-arm64": "0.14.21" } }, "node_modules/esbuild-android-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", - "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz", + "integrity": "sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==", "cpu": [ "arm64" ], @@ -676,12 +658,15 @@ "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-darwin-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", - "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz", + "integrity": "sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==", "cpu": [ "x64" ], @@ -689,12 +674,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", - "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz", + "integrity": "sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==", "cpu": [ "arm64" ], @@ -702,12 +690,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-freebsd-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", - "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz", + "integrity": "sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==", "cpu": [ "x64" ], @@ -715,12 +706,15 @@ "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", - "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz", + "integrity": "sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==", "cpu": [ "arm64" ], @@ -728,12 +722,15 @@ "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-32": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", - "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz", + "integrity": "sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==", "cpu": [ "ia32" ], @@ -741,12 +738,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", - "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz", + "integrity": "sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==", "cpu": [ "x64" ], @@ -754,12 +754,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-arm": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", - "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz", + "integrity": "sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==", "cpu": [ "arm" ], @@ -767,12 +770,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", - "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz", + "integrity": "sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==", "cpu": [ "arm64" ], @@ -780,12 +786,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", - "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz", + "integrity": "sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==", "cpu": [ "mips64el" ], @@ -793,12 +802,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", - "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz", + "integrity": "sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==", "cpu": [ "ppc64" ], @@ -806,12 +818,47 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz", + "integrity": "sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz", + "integrity": "sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-netbsd-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", - "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz", + "integrity": "sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==", "cpu": [ "x64" ], @@ -819,12 +866,15 @@ "optional": true, "os": [ "netbsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-openbsd-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", - "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz", + "integrity": "sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==", "cpu": [ "x64" ], @@ -832,12 +882,15 @@ "optional": true, "os": [ "openbsd" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-sunos-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", - "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz", + "integrity": "sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==", "cpu": [ "x64" ], @@ -845,12 +898,15 @@ "optional": true, "os": [ "sunos" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-windows-32": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", - "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz", + "integrity": "sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==", "cpu": [ "ia32" ], @@ -858,12 +914,15 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-windows-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", - "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz", + "integrity": "sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==", "cpu": [ "x64" ], @@ -871,12 +930,15 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/esbuild-windows-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", - "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz", + "integrity": "sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==", "cpu": [ "arm64" ], @@ -884,7 +946,10 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=12" + } }, "node_modules/escalade": { "version": "3.1.1", @@ -911,9 +976,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -923,7 +988,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fastq": { @@ -1053,18 +1118,6 @@ "optional": true, "peer": true }, - "node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -1081,27 +1134,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1137,9 +1169,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -1214,39 +1246,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "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/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -1341,19 +1340,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/n4s": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/n4s/-/n4s-4.0.1.tgz", - "integrity": "sha512-S3/8mLYORi1SjgUflavLmZg/d3r0K7t+G9LsYdE3zPIILKX2A8nXpdUTauOBk6ayUUhJD0zQEtfJY+qNsYysBw==", - "dev": true, - "dependencies": { - "context": "^2.0.1" - } - }, "node_modules/nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -1477,14 +1467,14 @@ } }, "node_modules/postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", + "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", "dev": true, "dependencies": { - "nanoid": "^3.1.30", + "nanoid": "^3.2.0", "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1495,30 +1485,31 @@ } }, "node_modules/postcss-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", - "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "dev": true, "dependencies": { - "camelcase-css": "^2.0.1", - "postcss": "^8.1.6" + "camelcase-css": "^2.0.1" }, "engines": { - "node": ">=10.0" + "node": "^12 || ^14 || >= 16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" } }, "node_modules/postcss-load-config": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", - "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", + "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", "dev": true, "dependencies": { - "import-cwd": "^3.0.0", - "lilconfig": "^2.0.3", + "lilconfig": "^2.0.4", "yaml": "^1.10.2" }, "engines": { @@ -1557,9 +1548,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", - "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -1628,20 +1619,18 @@ "node": ">=8" } }, - "node_modules/require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1784,9 +1773,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1822,26 +1811,38 @@ "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/svelte": { - "version": "3.44.3", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.44.3.tgz", - "integrity": "sha512-aGgrNCip5PQFNfq9e9tmm7EYxWLVHoFsEsmKrtOeRD8dmoGDdyTQ+21xd7qgFd8MNdKGSYvg7F9dr+Tc0yDymg==", + "version": "3.46.4", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", + "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/svelte-check": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.2.11.tgz", - "integrity": "sha512-clotPGGZPj3LuS9qP1lk+Wwnsj+js42ehCPmHk+qtyaQh/dU95e0qkpPmtmOMYHN6My5Y75XqeN1QNLj5V5gwA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.4.3.tgz", + "integrity": "sha512-0zJMMgqYHoP7QEG3tfc5DekpHAOqoy4QOL8scWMSdHIpVVDVC0MuYK57nFyj3XVTW8Zfm85FlgnAdQYsVmST2Q==", "dev": true, "dependencies": { - "chalk": "^4.0.0", "chokidar": "^3.4.1", "fast-glob": "^3.2.7", "import-fresh": "^3.2.1", "minimist": "^1.2.5", + "picocolors": "^1.0.0", "sade": "^1.7.4", "source-map": "^0.7.3", "svelte-preprocess": "^4.0.0", @@ -1854,16 +1855,6 @@ "svelte": "^3.24.0" } }, - "node_modules/svelte-fsm": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/svelte-fsm/-/svelte-fsm-1.1.2.tgz", - "integrity": "sha512-lGeuhELDkQC5WK4+MHJtdigXCqwsYMR1euyRTacDCwtbORzEy5ovivTY3Mnd5bM7H+huO3nKjNjdPvDLcLn3pQ==", - "dev": true, - "engines": { - "node": ">=14.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/svelte-hmr": { "version": "0.14.9", "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.9.tgz", @@ -1951,39 +1942,33 @@ "url": "https://github.com/sponsors/ItalyPaleAle" } }, - "node_modules/svelte-tiny-virtual-list": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-1.1.7.tgz", - "integrity": "sha512-8314cmLXOVqIQwSc3NFu8yGU7BdHEJeixrwFirmnMoWl6YNcCq5jVjCKjE3tDNJfUenz1LN5M5YshPt6GcPuww==", - "dev": true - }, "node_modules/tailwindcss": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.8.tgz", - "integrity": "sha512-Yww1eRYO1AxITJmW/KduZPxNvYdHuedeKwPju9Oakp7MdiixRi5xkpLhirsc81QCxHL0eoce6qKmxXwYGt4Cjw==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.22.tgz", + "integrity": "sha512-F8lt74RlNZirnkaSk310+vGQta7c0/hgx7/bqxruM4wS9lp8oqV93lzavajC3VT0Lp4UUtUVIt8ifKcmGzkr0A==", "dev": true, "dependencies": { "arg": "^5.0.1", "chalk": "^4.1.2", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "color-name": "^1.1.4", "cosmiconfig": "^7.0.1", "detective": "^5.2.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "normalize-path": "^3.0.0", "object-hash": "^2.2.0", - "postcss-js": "^3.0.3", + "postcss": "^8.4.6", + "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.0", "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.7", + "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", - "resolve": "^1.20.0", - "tmp": "^0.2.1" + "resolve": "^1.22.0" }, "bin": { "tailwind": "lib/cli.js", @@ -2009,33 +1994,6 @@ "node": ">=10.13.0" } }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2048,16 +2006,10 @@ "node": ">=8.0" } }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -2082,25 +2034,15 @@ "node": ">= 0.10" } }, - "node_modules/vest": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/vest/-/vest-4.0.1.tgz", - "integrity": "sha512-J1WJeMVyyjzkQ4uiLxDoIBiiW44FxAl/Z2znNxTQlwPQe7Ys/VDjbEJV1GnErB9oCr0O1tUc5JbwXh8/eQlfzA==", - "dev": true, - "dependencies": { - "context": "^2.0.1", - "n4s": "^4.0.1" - } - }, "node_modules/vite": { - "version": "2.7.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.10.tgz", - "integrity": "sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.1.tgz", + "integrity": "sha512-Typ8qjUnW0p53gBsJpisrKcZlEbUPZATja9BG6Z09QZjg9YrnEn/htkr/VH4WhnH7eNUQeSD+wKI1lHzQRWskw==", "dev": true, "dependencies": { - "esbuild": "^0.13.12", - "postcss": "^8.4.5", - "resolve": "^1.20.0", + "esbuild": "^0.14.14", + "postcss": "^8.4.6", + "resolve": "^1.22.0", "rollup": "^2.59.0" }, "bin": { @@ -2270,16 +2212,15 @@ } }, "@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.33", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.33.tgz", - "integrity": "sha512-aj0h2+ZixgT+yoJFIs8dRRw/Cj9tgNu3+hY4CJikpa04mfhR61wXqJFfi2ZEFMUvFda5nCxKYIChFkc6wq5fJA==", + "version": "1.0.0-next.37", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz", + "integrity": "sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==", "dev": true, "requires": { "@rollup/pluginutils": "^4.1.2", "debug": "^4.3.3", "kleur": "^4.1.4", "magic-string": "^0.25.7", - "require-relative": "^0.8.7", "svelte-hmr": "^0.14.9" } }, @@ -2292,18 +2233,6 @@ "mini-svg-data-uri": "^1.2.3" } }, - "@tailwindcss/typography": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.0.tgz", - "integrity": "sha512-1p/3C6C+JJziS/ghtG8ACYalbA2SyLJY27Pm33cVTlAoY6VQ7zfm2H64cPxUMBkVIlWXTtWHhZcZJPobMRmQAA==", - "dev": true, - "requires": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - } - }, "@tsconfig/svelte": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-3.0.0.tgz", @@ -2340,7 +2269,8 @@ "@types/validator": { "version": "13.7.1", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.1.tgz", - "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==" + "integrity": "sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==", + "dev": true }, "acorn": { "version": "7.4.1", @@ -2391,13 +2321,13 @@ "dev": true }, "autoprefixer": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.1.tgz", - "integrity": "sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "dev": true, "requires": { "browserslist": "^4.19.1", - "caniuse-lite": "^1.0.30001294", + "caniuse-lite": "^1.0.30001297", "fraction.js": "^4.1.2", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -2467,9 +2397,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001294", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001294.tgz", - "integrity": "sha512-LiMlrs1nSKZ8qkNhpUf5KD0Al1KCBE3zaT7OLOwEkagXMEDij98SiOovn9wxVGQpklk9vVC/pUSqgYmkmKOS8g==", + "version": "1.0.30001311", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz", + "integrity": "sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==", "dev": true }, "chalk": { @@ -2483,9 +2413,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -2519,12 +2449,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "context": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/context/-/context-2.0.1.tgz", - "integrity": "sha512-8QV3EXa7WP9l8aL8a3BMM792vvuPbIyp6ktGHEX6V4XiGNaiqxCGMRGzEavE3cPnHWqI9fXTujPEfBPt0iRhQw==", - "dev": true - }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -2610,146 +2534,162 @@ "dev": true }, "esbuild": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.15.tgz", - "integrity": "sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.21.tgz", + "integrity": "sha512-7WEoNMBJdLN993dr9h0CpFHPRc3yFZD+EAVY9lg6syJJ12gc5fHq8d75QRExuhnMkT2DaRiIKFThRvDWP+fO+A==", "dev": true, "requires": { - "esbuild-android-arm64": "0.13.15", - "esbuild-darwin-64": "0.13.15", - "esbuild-darwin-arm64": "0.13.15", - "esbuild-freebsd-64": "0.13.15", - "esbuild-freebsd-arm64": "0.13.15", - "esbuild-linux-32": "0.13.15", - "esbuild-linux-64": "0.13.15", - "esbuild-linux-arm": "0.13.15", - "esbuild-linux-arm64": "0.13.15", - "esbuild-linux-mips64le": "0.13.15", - "esbuild-linux-ppc64le": "0.13.15", - "esbuild-netbsd-64": "0.13.15", - "esbuild-openbsd-64": "0.13.15", - "esbuild-sunos-64": "0.13.15", - "esbuild-windows-32": "0.13.15", - "esbuild-windows-64": "0.13.15", - "esbuild-windows-arm64": "0.13.15" + "esbuild-android-arm64": "0.14.21", + "esbuild-darwin-64": "0.14.21", + "esbuild-darwin-arm64": "0.14.21", + "esbuild-freebsd-64": "0.14.21", + "esbuild-freebsd-arm64": "0.14.21", + "esbuild-linux-32": "0.14.21", + "esbuild-linux-64": "0.14.21", + "esbuild-linux-arm": "0.14.21", + "esbuild-linux-arm64": "0.14.21", + "esbuild-linux-mips64le": "0.14.21", + "esbuild-linux-ppc64le": "0.14.21", + "esbuild-linux-riscv64": "0.14.21", + "esbuild-linux-s390x": "0.14.21", + "esbuild-netbsd-64": "0.14.21", + "esbuild-openbsd-64": "0.14.21", + "esbuild-sunos-64": "0.14.21", + "esbuild-windows-32": "0.14.21", + "esbuild-windows-64": "0.14.21", + "esbuild-windows-arm64": "0.14.21" } }, "esbuild-android-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.15.tgz", - "integrity": "sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.21.tgz", + "integrity": "sha512-Bqgld1TY0wZv8TqiQmVxQFgYzz8ZmyzT7clXBDZFkOOdRybzsnj8AZuK1pwcLVA7Ya6XncHgJqIao7NFd3s0RQ==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.15.tgz", - "integrity": "sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.21.tgz", + "integrity": "sha512-j+Eg+e13djzyYINVvAbOo2/zvZ2DivuJJTaBrJnJHSD7kUNuGHRkHoSfFjbI80KHkn091w350wdmXDNSgRjfYQ==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.15.tgz", - "integrity": "sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.21.tgz", + "integrity": "sha512-nDNTKWDPI0RuoPj5BhcSB2z5EmZJJAyRtZLIjyXSqSpAyoB8eyAKXl4lB8U2P78Fnh4Lh1le/fmpewXE04JhBQ==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.15.tgz", - "integrity": "sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.21.tgz", + "integrity": "sha512-zIurkCHXhxELiDZtLGiexi8t8onQc2LtuE+S7457H/pP0g0MLRKMrsn/IN4LDkNe6lvBjuoZZi2OfelOHn831g==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.15.tgz", - "integrity": "sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.21.tgz", + "integrity": "sha512-wdxMmkJfbwcN+q85MpeUEamVZ40FNsBa9mPq8tAszDn8TRT2HoJvVRADPIIBa9SWWwlDChIMjkDKAnS3KS/sPA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.15.tgz", - "integrity": "sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.21.tgz", + "integrity": "sha512-fmxvyzOPPh2xiEHojpCeIQP6pXcoKsWbz3ryDDIKLOsk4xp3GbpHIEAWP0xTeuhEbendmvBDVKbAVv3PnODXLg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.15.tgz", - "integrity": "sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.21.tgz", + "integrity": "sha512-edZyNOv1ql+kpmlzdqzzDjRQYls+tSyi4QFi+PdBhATJFUqHsnNELWA9vMSzAaInPOEaVUTA5Ml28XFChcy4DA==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.15.tgz", - "integrity": "sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.21.tgz", + "integrity": "sha512-aSU5pUueK6afqmLQsbU+QcFBT62L+4G9hHMJDHWfxgid6hzhSmfRH9U/f+ymvxsSTr/HFRU4y7ox8ZyhlVl98w==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.15.tgz", - "integrity": "sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.21.tgz", + "integrity": "sha512-t5qxRkq4zdQC0zXpzSB2bTtfLgOvR0C6BXYaRE/6/k8/4SrkZcTZBeNu+xGvwCU4b5dU9ST9pwIWkK6T1grS8g==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.15.tgz", - "integrity": "sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.21.tgz", + "integrity": "sha512-jLZLQGCNlUsmIHtGqNvBs3zN+7a4D9ckf0JZ+jQTwHdZJ1SgV9mAjbB980OFo66LoY+WeM7t3WEnq3FjI1zw4A==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.15.tgz", - "integrity": "sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.21.tgz", + "integrity": "sha512-4TWxpK391en2UBUw6GSrukToTDu6lL9vkm3Ll40HrI08WG3qcnJu7bl8e1+GzelDsiw1QmfAY/nNvJ6iaHRpCQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.21.tgz", + "integrity": "sha512-fElngqOaOfTsF+u+oetDLHsPG74vB2ZaGZUqmGefAJn3a5z9Z2pNa4WpVbbKgHpaAAy5tWM1m1sbGohj6Ki6+Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.21.tgz", + "integrity": "sha512-brleZ6R5fYv0qQ7ZBwenQmP6i9TdvJCB092c/3D3pTLQHBGHJb5zWgKxOeS7bdHzmLy6a6W7GbFk6QKpjyD6QA==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.15.tgz", - "integrity": "sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.21.tgz", + "integrity": "sha512-nCEgsLCQ8RoFWVV8pVI+kX66ICwbPP/M9vEa0NJGIEB/Vs5sVGMqkf67oln90XNSkbc0bPBDuo4G6FxlF7PN8g==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.15.tgz", - "integrity": "sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.21.tgz", + "integrity": "sha512-h9zLMyVD0T73MDTVYIb/qUTokwI6EJH9O6wESuTNq6+XpMSr6C5aYZ4fvFKdNELW+Xsod+yDS2hV2JTUAbFrLA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.15.tgz", - "integrity": "sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.21.tgz", + "integrity": "sha512-Kl+7Cot32qd9oqpLdB1tEGXEkjBlijrIxMJ0+vlDFaqsODutif25on0IZlFxEBtL2Gosd4p5WCV1U7UskNQfXA==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.15.tgz", - "integrity": "sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.21.tgz", + "integrity": "sha512-V7vnTq67xPBUCk/9UtlolmQ798Ecjdr1ZoI1vcSgw7M82aSSt0eZdP6bh5KAFZU8pxDcx3qoHyWQfHYr11f22A==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.15.tgz", - "integrity": "sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.21.tgz", + "integrity": "sha512-kDgHjKOHwjfJDCyRGELzVxiP/RBJBTA+wyspf78MTTJQkyPuxH2vChReNdWc+dU2S4gIZFHMdP1Qrl/k22ZmaA==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.15.tgz", - "integrity": "sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==", + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.21.tgz", + "integrity": "sha512-8Sbo0zpzgwWrwjQYLmHF78f7E2xg5Ve63bjB2ng3V2aManilnnTGaliq2snYg+NOX60+hEvJHRdVnuIAHW0lVw==", "dev": true, "optional": true }, @@ -2772,9 +2712,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -2879,15 +2819,6 @@ "optional": true, "peer": true }, - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2898,23 +2829,6 @@ "resolve-from": "^4.0.0" } }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2947,9 +2861,9 @@ } }, "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -3006,36 +2920,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "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 - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", - "dev": true - }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -3109,19 +2993,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "n4s": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/n4s/-/n4s-4.0.1.tgz", - "integrity": "sha512-S3/8mLYORi1SjgUflavLmZg/d3r0K7t+G9LsYdE3zPIILKX2A8nXpdUTauOBk6ayUUhJD0zQEtfJY+qNsYysBw==", - "dev": true, - "requires": { - "context": "^2.0.1" - } - }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "dev": true }, "node-releases": { @@ -3209,34 +3084,32 @@ "dev": true }, "postcss": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", - "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", + "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", "dev": true, "requires": { - "nanoid": "^3.1.30", + "nanoid": "^3.2.0", "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "source-map-js": "^1.0.2" } }, "postcss-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", - "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", "dev": true, "requires": { - "camelcase-css": "^2.0.1", - "postcss": "^8.1.6" + "camelcase-css": "^2.0.1" } }, "postcss-load-config": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", - "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz", + "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==", "dev": true, "requires": { - "import-cwd": "^3.0.0", - "lilconfig": "^2.0.3", + "lilconfig": "^2.0.4", "yaml": "^1.10.2" } }, @@ -3250,9 +3123,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", - "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -3292,20 +3165,15 @@ "integrity": "sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==", "dev": true }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -3400,9 +3268,9 @@ "dev": true }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, "sourcemap-codec": { @@ -3429,35 +3297,35 @@ "has-flag": "^4.0.0" } }, + "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 + }, "svelte": { - "version": "3.44.3", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.44.3.tgz", - "integrity": "sha512-aGgrNCip5PQFNfq9e9tmm7EYxWLVHoFsEsmKrtOeRD8dmoGDdyTQ+21xd7qgFd8MNdKGSYvg7F9dr+Tc0yDymg==", + "version": "3.46.4", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.46.4.tgz", + "integrity": "sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==", "dev": true }, "svelte-check": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.2.11.tgz", - "integrity": "sha512-clotPGGZPj3LuS9qP1lk+Wwnsj+js42ehCPmHk+qtyaQh/dU95e0qkpPmtmOMYHN6My5Y75XqeN1QNLj5V5gwA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-2.4.3.tgz", + "integrity": "sha512-0zJMMgqYHoP7QEG3tfc5DekpHAOqoy4QOL8scWMSdHIpVVDVC0MuYK57nFyj3XVTW8Zfm85FlgnAdQYsVmST2Q==", "dev": true, "requires": { - "chalk": "^4.0.0", "chokidar": "^3.4.1", "fast-glob": "^3.2.7", "import-fresh": "^3.2.1", "minimist": "^1.2.5", + "picocolors": "^1.0.0", "sade": "^1.7.4", "source-map": "^0.7.3", "svelte-preprocess": "^4.0.0", "typescript": "*" } }, - "svelte-fsm": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/svelte-fsm/-/svelte-fsm-1.1.2.tgz", - "integrity": "sha512-lGeuhELDkQC5WK4+MHJtdigXCqwsYMR1euyRTacDCwtbORzEy5ovivTY3Mnd5bM7H+huO3nKjNjdPvDLcLn3pQ==", - "dev": true - }, "svelte-hmr": { "version": "0.14.9", "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.9.tgz", @@ -3488,39 +3356,33 @@ "regexparam": "2.0.0" } }, - "svelte-tiny-virtual-list": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-1.1.7.tgz", - "integrity": "sha512-8314cmLXOVqIQwSc3NFu8yGU7BdHEJeixrwFirmnMoWl6YNcCq5jVjCKjE3tDNJfUenz1LN5M5YshPt6GcPuww==", - "dev": true - }, "tailwindcss": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.8.tgz", - "integrity": "sha512-Yww1eRYO1AxITJmW/KduZPxNvYdHuedeKwPju9Oakp7MdiixRi5xkpLhirsc81QCxHL0eoce6qKmxXwYGt4Cjw==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.22.tgz", + "integrity": "sha512-F8lt74RlNZirnkaSk310+vGQta7c0/hgx7/bqxruM4wS9lp8oqV93lzavajC3VT0Lp4UUtUVIt8ifKcmGzkr0A==", "dev": true, "requires": { "arg": "^5.0.1", "chalk": "^4.1.2", - "chokidar": "^3.5.2", + "chokidar": "^3.5.3", "color-name": "^1.1.4", "cosmiconfig": "^7.0.1", "detective": "^5.2.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "normalize-path": "^3.0.0", "object-hash": "^2.2.0", - "postcss-js": "^3.0.3", + "postcss": "^8.4.6", + "postcss-js": "^4.0.0", "postcss-load-config": "^3.1.0", "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.7", + "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0", "quick-lru": "^5.1.1", - "resolve": "^1.20.0", - "tmp": "^0.2.1" + "resolve": "^1.22.0" }, "dependencies": { "glob-parent": { @@ -3534,26 +3396,6 @@ } } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3563,16 +3405,10 @@ "is-number": "^7.0.0" } }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true }, "util-deprecate": { @@ -3587,26 +3423,16 @@ "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", "dev": true }, - "vest": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/vest/-/vest-4.0.1.tgz", - "integrity": "sha512-J1WJeMVyyjzkQ4uiLxDoIBiiW44FxAl/Z2znNxTQlwPQe7Ys/VDjbEJV1GnErB9oCr0O1tUc5JbwXh8/eQlfzA==", - "dev": true, - "requires": { - "context": "^2.0.1", - "n4s": "^4.0.1" - } - }, "vite": { - "version": "2.7.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.7.10.tgz", - "integrity": "sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.1.tgz", + "integrity": "sha512-Typ8qjUnW0p53gBsJpisrKcZlEbUPZATja9BG6Z09QZjg9YrnEn/htkr/VH4WhnH7eNUQeSD+wKI1lHzQRWskw==", "dev": true, "requires": { - "esbuild": "^0.13.12", + "esbuild": "^0.14.14", "fsevents": "~2.3.2", - "postcss": "^8.4.5", - "resolve": "^1.20.0", + "postcss": "^8.4.6", + "resolve": "^1.22.0", "rollup": "^2.59.0" } }, diff --git a/src/webapp/package.json b/src/webapp/package.json index 138c6ec..f33585c 100644 --- a/src/webapp/package.json +++ b/src/webapp/package.json @@ -10,18 +10,17 @@ }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.37", + "@tailwindcss/forms": "^0.4.0", "@tsconfig/svelte": "^3.0.0", - "carbon-components": "^10.52.0", - "carbon-components-svelte": "^0.58.0", - "carbon-icons-svelte": "^10.44.4", - "carbon-preprocess-svelte": "^0.6.0", - "lz-string": "^1.4.4", + "@types/validator": "^13.7.1", + "autoprefixer": "^10.4.2", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.1", "svelte": "^3.46.4", "svelte-check": "^2.4.3", - "svelte-fsm": "^1.1.2", - "svelte-preprocess": "^4.10.3", + "svelte-preprocess": "^4.10.1", "svelte-spa-router": "^3.2.0", - "tslib": "^2.3.1", + "tailwindcss": "^3.0.12", "typescript": "^4.5.5", "validator": "^13.7.0", "vite": "^2.8.1" diff --git a/src/webapp/pnpm-lock.yaml b/src/webapp/pnpm-lock.yaml index c983ca4..df99ee5 100644 --- a/src/webapp/pnpm-lock.yaml +++ b/src/webapp/pnpm-lock.yaml @@ -2,36 +2,32 @@ lockfileVersion: 5.3 specifiers: '@sveltejs/vite-plugin-svelte': ^1.0.0-next.37 + '@tailwindcss/forms': ^0.4.0 '@tsconfig/svelte': ^3.0.0 - carbon-components: ^10.52.0 - carbon-components-svelte: ^0.58.0 - carbon-icons-svelte: ^10.44.4 - carbon-preprocess-svelte: ^0.6.0 - lz-string: ^1.4.4 + '@types/validator': ^13.7.1 + autoprefixer: ^10.4.2 + postcss: ^8.4.6 svelte: ^3.46.4 svelte-check: ^2.4.3 - svelte-fsm: ^1.1.2 svelte-preprocess: ^4.10.3 svelte-spa-router: ^3.2.0 - tslib: ^2.3.1 + tailwindcss: ^3.0.22 typescript: ^4.5.5 validator: ^13.7.0 vite: ^2.8.1 devDependencies: '@sveltejs/vite-plugin-svelte': 1.0.0-next.37_svelte@3.46.4+vite@2.8.1 + '@tailwindcss/forms': 0.4.0_tailwindcss@3.0.22 '@tsconfig/svelte': 3.0.0 - carbon-components: 10.52.0 - carbon-components-svelte: 0.58.0 - carbon-icons-svelte: 10.44.4 - carbon-preprocess-svelte: 0.6.0_svelte@3.46.4 - lz-string: 1.4.4 + '@types/validator': 13.7.1 + autoprefixer: 10.4.2_postcss@8.4.6 + postcss: 8.4.6 svelte: 3.46.4 - svelte-check: 2.4.3_svelte@3.46.4 - svelte-fsm: 1.1.2 - svelte-preprocess: 4.10.3_svelte@3.46.4+typescript@4.5.5 + svelte-check: 2.4.3_postcss@8.4.6+svelte@3.46.4 + svelte-preprocess: 4.10.3_88b359da5cac6d8f6ee1bbb7080a3fa9 svelte-spa-router: 3.2.0 - tslib: 2.3.1 + tailwindcss: 3.0.22_autoprefixer@10.4.2 typescript: 4.5.5 validator: 13.7.0 vite: 2.8.1 @@ -45,52 +41,6 @@ packages: '@babel/highlight': 7.16.10 dev: true - /@babel/generator/7.17.0: - resolution: {integrity: sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - - /@babel/helper-environment-visitor/7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-function-name/7.16.7: - resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-get-function-arity': 7.16.7 - '@babel/template': 7.16.7 - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-get-function-arity/7.16.7: - resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-hoist-variables/7.16.7: - resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-split-export-declaration/7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} @@ -105,73 +55,6 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.17.0: - resolution: {integrity: sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true - - /@babel/template/7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.0 - '@babel/types': 7.17.0 - dev: true - - /@babel/traverse/7.17.0: - resolution: {integrity: sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.0 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.16.7 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.0 - '@babel/types': 7.17.0 - debug: 4.3.3 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types/7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - to-fast-properties: 2.0.0 - dev: true - - /@carbon/telemetry/0.0.0-alpha.6: - resolution: {integrity: sha512-DCE8ui/tFi+qvCH+mewbUbWzsiq5Ko3HU1lgrVbpjWv1LfswLKFmMg4Os+PmX6edYoBj39qVChJPeaN/UyfJDw==} - hasBin: true - dependencies: - '@babel/parser': 7.17.0 - '@babel/traverse': 7.17.0 - ci-info: 2.0.0 - configstore: 5.0.1 - fast-glob: 3.2.11 - fs-extra: 9.1.0 - got: 11.8.3 - semver: 7.3.5 - winston: 3.5.1 - yargs: 16.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@dabh/diagnostics/2.0.2: - resolution: {integrity: sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==} - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - dev: true - /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -201,11 +84,6 @@ packages: picomatch: 2.3.1 dev: true - /@sindresorhus/is/4.4.0: - resolution: {integrity: sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==} - engines: {node: '>=10'} - dev: true - /@sveltejs/vite-plugin-svelte/1.0.0-next.37_svelte@3.46.4+vite@2.8.1: resolution: {integrity: sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==} engines: {node: ^14.13.1 || >= 16} @@ -228,59 +106,58 @@ packages: - supports-color dev: true - /@szmarczak/http-timer/4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + /@tailwindcss/forms/0.4.0_tailwindcss@3.0.22: + resolution: {integrity: sha512-DeaQBx6EgEeuZPQACvC+mKneJsD8am1uiJugjgQK1+/Vt+Ai0GpFBC2T2fqnUad71WgOxyrZPE6BG1VaI6YqfQ==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' dependencies: - defer-to-connect: 2.0.1 + mini-svg-data-uri: 1.4.3 + tailwindcss: 3.0.22_autoprefixer@10.4.2 dev: true /@tsconfig/svelte/3.0.0: resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==} dev: true - /@types/cacheable-request/6.0.2: - resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} - dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.3 - '@types/node': 17.0.17 - '@types/responselike': 1.0.0 - dev: true - - /@types/http-cache-semantics/4.0.1: - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - dev: true - - /@types/keyv/3.1.3: - resolution: {integrity: sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==} - dependencies: - '@types/node': 17.0.17 - dev: true - /@types/node/17.0.17: resolution: {integrity: sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==} dev: true + /@types/parse-json/4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: true + /@types/pug/2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true - /@types/responselike/1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + /@types/sass/1.43.1: + resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: '@types/node': 17.0.17 dev: true - /@types/sass/1.43.1: - resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} + /@types/validator/13.7.1: + resolution: {integrity: sha512-I6OUIZ5cYRk5lp14xSOAiXjWrfVoMZVjDuevBYgQDYzZIjsf2CAISpEcXOkFAtpAHbmWIDLcZObejqny/9xq5Q==} + dev: true + + /acorn-node/1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: - '@types/node': 17.0.17 + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 dev: true - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true dev: true /ansi-styles/3.2.1: @@ -305,13 +182,24 @@ packages: picomatch: 2.3.1 dev: true - /async/3.2.3: - resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} + /arg/5.0.1: + resolution: {integrity: sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==} dev: true - /at-least-node/1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + /autoprefixer/10.4.2_postcss@8.4.6: + resolution: {integrity: sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.19.1 + caniuse-lite: 1.0.30001311 + fraction.js: 4.1.3 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.6 + postcss-value-parser: 4.2.0 dev: true /balanced-match/1.0.2: @@ -337,26 +225,20 @@ packages: fill-range: 7.0.1 dev: true - /buffer-crc32/0.2.13: - resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} - dev: true - - /cacheable-lookup/5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} + /browserslist/4.19.1: + resolution: {integrity: sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001311 + electron-to-chromium: 1.4.68 + escalade: 3.1.1 + node-releases: 2.0.2 + picocolors: 1.0.0 dev: true - /cacheable-request/7.0.2: - resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.2 - get-stream: 5.2.0 - http-cache-semantics: 4.1.0 - keyv: 4.1.1 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.0 + /buffer-crc32/0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} dev: true /callsites/3.1.0: @@ -364,46 +246,13 @@ packages: engines: {node: '>=6'} dev: true - /carbon-components-svelte/0.58.0: - resolution: {integrity: sha512-I2OA9kn7FzidynFFLSvfmixQRqkLqa+qjnKMgCdonSD59zNVUB4bBOgSxaEujeAUJphrL6Hjm9kpm9EQRjX96A==} - dependencies: - flatpickr: 4.6.9 - dev: true - - /carbon-components/10.52.0: - resolution: {integrity: sha512-itiG52GdDGxGh4IyuIV7gsuQCE1LLD2FCTEp5bPGhF/Onn042QzGendjl+yE7kfUk3FVlWmHN216dh/mA2sdZg==} - requiresBuild: true - dependencies: - '@carbon/telemetry': 0.0.0-alpha.6 - flatpickr: 4.6.1 - lodash.debounce: 4.0.8 - warning: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /carbon-icons-svelte/10.44.4: - resolution: {integrity: sha512-KsqXj0tYFF4S9b4mDSyt3Ovo0TA6QQ6nW0XRoY7D7EahM6hGluz0CdMw3wp/lbAUItTlTfYk+aPpiCKvpbTIyA==} + /camelcase-css/2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} dev: true - /carbon-preprocess-svelte/0.6.0_svelte@3.46.4: - resolution: {integrity: sha512-z/SOcB1jqrodshM87YPWdTcLdQzCKKLiWueM4RPfTIz9EIo7DgJSn0gbnVtEOk8Vy/xOZ0EnnAu5fY8ualzngQ==} - dependencies: - purgecss: 4.1.3 - svelte-preprocess: 4.10.3_svelte@3.46.4+typescript@4.5.5 - typescript: 4.5.5 - transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - node-sass - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss - - svelte + /caniuse-lite/1.0.30001311: + resolution: {integrity: sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==} dev: true /chalk/2.4.2: @@ -415,6 +264,14 @@ packages: supports-color: 5.5.0 dev: true + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -430,24 +287,6 @@ packages: fsevents: 2.3.2 dev: true - /ci-info/2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - dev: true - - /cliui/7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-response/1.0.2: - resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} - dependencies: - mimic-response: 1.0.1 - dev: true - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -469,56 +308,19 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /color-string/1.9.0: - resolution: {integrity: sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: true - - /color/3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - dependencies: - color-convert: 1.9.3 - color-string: 1.9.0 - dev: true - - /colors/1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - dev: true - - /colorspace/1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - dev: true - - /commander/8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: true - /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true - /configstore/5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} + /cosmiconfig/7.0.1: + resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + engines: {node: '>=10'} dependencies: - dot-prop: 5.3.0 - graceful-fs: 4.2.9 - make-dir: 3.1.0 - unique-string: 2.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 - dev: true - - /crypto-random-string/2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 dev: true /cssesc/3.0.0: @@ -539,16 +341,8 @@ packages: ms: 2.1.2 dev: true - /decompress-response/6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /defer-to-connect/2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + /defined/1.0.0: + resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} dev: true /detect-indent/6.1.0: @@ -556,25 +350,32 @@ packages: engines: {node: '>=8'} dev: true - /dot-prop/5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + /detective/5.2.0: + resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} + engines: {node: '>=0.8.0'} + hasBin: true dependencies: - is-obj: 2.0.0 + acorn-node: 1.8.2 + defined: 1.0.0 + minimist: 1.2.5 + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /dlv/1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true - /enabled/2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + /electron-to-chromium/1.4.68: + resolution: {integrity: sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==} dev: true - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: - once: 1.4.0 + is-arrayish: 0.2.1 dev: true /es6-promise/3.3.1: @@ -810,10 +611,6 @@ packages: reusify: 1.0.4 dev: true - /fecha/4.2.1: - resolution: {integrity: sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==} - dev: true - /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -821,26 +618,8 @@ packages: to-regex-range: 5.0.1 dev: true - /flatpickr/4.6.1: - resolution: {integrity: sha512-3ULSxbXmcMIRzer/2jLNweoqHpwDvsjEawO2FUd9UFR8uPwLM+LruZcPDpuZStcEgbQKhuFOfXo4nYdGladSNw==} - dev: true - - /flatpickr/4.6.9: - resolution: {integrity: sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==} - dev: true - - /fn.name/1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - dev: true - - /fs-extra/9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.9 - jsonfile: 6.1.0 - universalify: 2.0.0 + /fraction.js/4.1.3: + resolution: {integrity: sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==} dev: true /fs.realpath/1.0.0: @@ -859,18 +638,6 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-stream/5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -878,6 +645,13 @@ packages: is-glob: 4.0.3 dev: true + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + /glob/7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: @@ -889,28 +663,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals/11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /got/11.8.3: - resolution: {integrity: sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.4.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.2 - '@types/responselike': 1.0.0 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.2 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.0 - dev: true - /graceful-fs/4.2.9: resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} dev: true @@ -920,6 +672,11 @@ packages: engines: {node: '>=4'} dev: true + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -927,18 +684,6 @@ packages: function-bind: 1.1.1 dev: true - /http-cache-semantics/4.1.0: - resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} - dev: true - - /http2-wrapper/1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -947,11 +692,6 @@ packages: resolve-from: 4.0.0 dev: true - /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} - engines: {node: '>=0.8.19'} - dev: true - /inflight/1.0.6: resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} dependencies: @@ -963,8 +703,8 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /is-arrayish/0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + /is-arrayish/0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true /is-binary-path/2.1.0: @@ -985,11 +725,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1002,46 +737,12 @@ packages: engines: {node: '>=0.12.0'} dev: true - /is-obj/2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-stream/2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-typedarray/1.0.0: - resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} - dev: true - /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /jsesc/2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer/3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /jsonfile/6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.9 - dev: true - - /keyv/4.1.1: - resolution: {integrity: sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==} - dependencies: - json-buffer: 3.0.1 + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true /kleur/4.1.4: @@ -1049,46 +750,13 @@ packages: engines: {node: '>=6'} dev: true - /kuler/2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - dev: true - - /lodash.debounce/4.0.8: - resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=} - dev: true - - /logform/2.3.2: - resolution: {integrity: sha512-V6JiPThZzTsbVRspNO6TmHkR99oqYTs8fivMBYQkjZj6rxW92KxtDCPE6IkAk1DNBnYKNkjm4jYBm6JDUcyhOA==} - dependencies: - colors: 1.4.0 - fecha: 4.2.1 - ms: 2.1.3 - safe-stable-stringify: 1.1.1 - triple-beam: 1.3.0 - dev: true - - /loose-envify/1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: true - - /lowercase-keys/2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - - /lru-cache/6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + /lilconfig/2.0.4: + resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==} engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 dev: true - /lz-string/1.4.4: - resolution: {integrity: sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=} - hasBin: true + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true /magic-string/0.25.7: @@ -1097,13 +765,6 @@ packages: sourcemap-codec: 1.4.8 dev: true - /make-dir/3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1117,21 +778,16 @@ packages: picomatch: 2.3.1 dev: true - /mimic-response/1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true - - /mimic-response/3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true + /mini-svg-data-uri/1.4.3: + resolution: {integrity: sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==} + hasBin: true + dev: true + /minimatch/3.0.5: resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} dependencies: @@ -1158,24 +814,29 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms/2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - /nanoid/3.2.0: resolution: {integrity: sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /node-releases/2.0.2: + resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} + dev: true + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /normalize-url/6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + /normalize-range/0.1.2: + resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash/2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} dev: true /once/1.4.0: @@ -1184,17 +845,6 @@ packages: wrappy: 1.0.2 dev: true - /one-time/1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - dependencies: - fn.name: 1.1.0 - dev: true - - /p-cancelable/2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true - /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1202,6 +852,16 @@ packages: callsites: 3.1.0 dev: true + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.16.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /path-is-absolute/1.0.1: resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} engines: {node: '>=0.10.0'} @@ -1211,6 +871,11 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -1220,6 +885,39 @@ packages: engines: {node: '>=8.6'} dev: true + /postcss-js/4.0.0_postcss@8.4.6: + resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.3.3 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.6 + dev: true + + /postcss-load-config/3.1.3: + resolution: {integrity: sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==} + engines: {node: '>= 10'} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + lilconfig: 2.0.4 + yaml: 1.10.2 + dev: true + + /postcss-nested/5.0.6_postcss@8.4.6: + resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.6 + postcss-selector-parser: 6.0.9 + dev: true + /postcss-selector-parser/6.0.9: resolution: {integrity: sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==} engines: {node: '>=4'} @@ -1228,6 +926,10 @@ packages: util-deprecate: 1.0.2 dev: true + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + /postcss/8.4.6: resolution: {integrity: sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==} engines: {node: ^10 || ^12 || >=14} @@ -1237,23 +939,6 @@ packages: source-map-js: 1.0.2 dev: true - /pump/3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /purgecss/4.1.3: - resolution: {integrity: sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==} - hasBin: true - dependencies: - commander: 8.3.0 - glob: 7.2.0 - postcss: 8.4.6 - postcss-selector-parser: 6.0.9 - dev: true - /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -1263,15 +948,6 @@ packages: engines: {node: '>=10'} dev: true - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1284,15 +960,6 @@ packages: engines: {node: '>=8'} dev: true - /require-directory/2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - dev: true - - /resolve-alpn/1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true - /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1307,12 +974,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /responselike/2.0.0: - resolution: {integrity: sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1346,19 +1007,6 @@ packages: mri: 1.2.0 dev: true - /safe-buffer/5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safe-stable-stringify/1.1.1: - resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} - dev: true - - /safe-stable-stringify/2.3.1: - resolution: {integrity: sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==} - engines: {node: '>=10'} - dev: true - /sander/0.5.1: resolution: {integrity: sha1-dB4kXiMfB8r7b98PEzrfohalAq0=} dependencies: @@ -1368,29 +1016,6 @@ packages: rimraf: 2.7.1 dev: true - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver/7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /simple-swizzle/0.2.2: - resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} - dependencies: - is-arrayish: 0.3.2 - dev: true - /sorcery/0.10.0: resolution: {integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=} hasBin: true @@ -1406,11 +1031,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} - engines: {node: '>=0.10.0'} - dev: true - /source-map/0.7.3: resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} engines: {node: '>= 8'} @@ -1420,32 +1040,6 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true - /stack-trace/0.0.10: - resolution: {integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=} - dev: true - - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string_decoder/1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1460,12 +1054,19 @@ packages: has-flag: 3.0.0 dev: true + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /svelte-check/2.4.3_svelte@3.46.4: + /svelte-check/2.4.3_postcss@8.4.6+svelte@3.46.4: resolution: {integrity: sha512-0zJMMgqYHoP7QEG3tfc5DekpHAOqoy4QOL8scWMSdHIpVVDVC0MuYK57nFyj3XVTW8Zfm85FlgnAdQYsVmST2Q==} hasBin: true peerDependencies: @@ -1479,7 +1080,7 @@ packages: sade: 1.8.1 source-map: 0.7.3 svelte: 3.46.4 - svelte-preprocess: 4.10.3_svelte@3.46.4+typescript@4.5.5 + svelte-preprocess: 4.10.3_88b359da5cac6d8f6ee1bbb7080a3fa9 typescript: 4.5.5 transitivePeerDependencies: - '@babel/core' @@ -1494,11 +1095,6 @@ packages: - sugarss dev: true - /svelte-fsm/1.1.2: - resolution: {integrity: sha512-lGeuhELDkQC5WK4+MHJtdigXCqwsYMR1euyRTacDCwtbORzEy5ovivTY3Mnd5bM7H+huO3nKjNjdPvDLcLn3pQ==} - engines: {node: '>=14.0.0', npm: '>=7.0.0'} - dev: true - /svelte-hmr/0.14.9_svelte@3.46.4: resolution: {integrity: sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg==} peerDependencies: @@ -1507,7 +1103,7 @@ packages: svelte: 3.46.4 dev: true - /svelte-preprocess/4.10.3_svelte@3.46.4+typescript@4.5.5: + /svelte-preprocess/4.10.3_88b359da5cac6d8f6ee1bbb7080a3fa9: resolution: {integrity: sha512-ttw17lJfb/dx2ZJT9sesaXT5l7mPQ9Apx1H496Kli3Hkk7orIRGpOw6rCPkRNzr6ueVPqb4vzodS5x7sBFhKHw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -1552,6 +1148,7 @@ packages: '@types/sass': 1.43.1 detect-indent: 6.1.0 magic-string: 0.25.7 + postcss: 8.4.6 sorcery: 0.10.0 strip-indent: 3.0.0 svelte: 3.46.4 @@ -1569,13 +1166,37 @@ packages: engines: {node: '>= 8'} dev: true - /text-hex/1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - dev: true - - /to-fast-properties/2.0.0: - resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} - engines: {node: '>=4'} + /tailwindcss/3.0.22_autoprefixer@10.4.2: + resolution: {integrity: sha512-F8lt74RlNZirnkaSk310+vGQta7c0/hgx7/bqxruM4wS9lp8oqV93lzavajC3VT0Lp4UUtUVIt8ifKcmGzkr0A==} + engines: {node: '>=12.13.0'} + hasBin: true + peerDependencies: + autoprefixer: ^10.0.2 + dependencies: + arg: 5.0.1 + autoprefixer: 10.4.2_postcss@8.4.6 + chalk: 4.1.2 + chokidar: 3.5.3 + color-name: 1.1.4 + cosmiconfig: 7.0.1 + detective: 5.2.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.2.11 + glob-parent: 6.0.2 + is-glob: 4.0.3 + normalize-path: 3.0.0 + object-hash: 2.2.0 + postcss: 8.4.6 + postcss-js: 4.0.0_postcss@8.4.6 + postcss-load-config: 3.1.3 + postcss-nested: 5.0.6_postcss@8.4.6 + postcss-selector-parser: 6.0.9 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.0 + transitivePeerDependencies: + - ts-node dev: true /to-regex-range/5.0.1: @@ -1585,38 +1206,12 @@ packages: is-number: 7.0.0 dev: true - /triple-beam/1.3.0: - resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} - dev: true - - /tslib/2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - dev: true - - /typedarray-to-buffer/3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - /typescript/4.5.5: resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /unique-string/2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - dependencies: - crypto-random-string: 2.0.0 - dev: true - - /universalify/2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - /util-deprecate/1.0.2: resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} dev: true @@ -1650,87 +1245,16 @@ packages: fsevents: 2.3.2 dev: true - /warning/3.0.0: - resolution: {integrity: sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=} - dependencies: - loose-envify: 1.4.0 - dev: true - - /winston-transport/4.5.0: - resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} - engines: {node: '>= 6.4.0'} - dependencies: - logform: 2.3.2 - readable-stream: 3.6.0 - triple-beam: 1.3.0 - dev: true - - /winston/3.5.1: - resolution: {integrity: sha512-tbRtVy+vsSSCLcZq/8nXZaOie/S2tPXPFt4be/Q3vI/WtYwm7rrwidxVw2GRa38FIXcJ1kUM6MOZ9Jmnk3F3UA==} - engines: {node: '>= 6.4.0'} - dependencies: - '@dabh/diagnostics': 2.0.2 - async: 3.2.3 - is-stream: 2.0.1 - logform: 2.3.2 - one-time: 1.0.0 - readable-stream: 3.6.0 - safe-stable-stringify: 2.3.1 - stack-trace: 0.0.10 - triple-beam: 1.3.0 - winston-transport: 4.5.0 - dev: true - - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - /wrappy/1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} dev: true - /write-file-atomic/3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - - /xdg-basedir/4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} - dev: true - - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} dev: true - /yallist/4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser/20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 + /yaml/1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} dev: true diff --git a/src/webapp/postcss.config.cjs b/src/webapp/postcss.config.cjs new file mode 100644 index 0000000..e48cff5 --- /dev/null +++ b/src/webapp/postcss.config.cjs @@ -0,0 +1,13 @@ +const tailwindcss = require("tailwindcss"); +const autoprefixer = require("autoprefixer"); + +const config = { + plugins: [ + //Some plugins, like tailwindcss/nesting, need to run before Tailwind, + tailwindcss(), + //But others, like autoprefixer, need to run after, + autoprefixer, + ], +}; + +module.exports = config; diff --git a/src/webapp/src/app.css b/src/webapp/src/app.css new file mode 100644 index 0000000..2005db4 --- /dev/null +++ b/src/webapp/src/app.css @@ -0,0 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +html { + font-family: "Inter UI", sans-serif; +} diff --git a/src/webapp/src/app.svelte b/src/webapp/src/app.svelte index 14e05aa..ddda7ac 100644 --- a/src/webapp/src/app.svelte +++ b/src/webapp/src/app.svelte @@ -1,12 +1,14 @@ <script lang="ts"> - import Router, {replace, location} from "svelte-spa-router"; + import Router, { replace, location } from "svelte-spa-router"; + import { onMount } from "svelte"; import routes from "./routes"; - import {onMount} from "svelte"; - import {session_is_valid_async} from "@/lib/stores/session"; + import "./assets/fonts/inter/inter.css"; + import "./app.css"; + import { session_is_valid_async } from "@/lib/stores/session"; import preferences from "@/lib/stores/preferences"; - import {ApplicationTheme} from "@/lib/enums/ApplicationTheme"; + import { ApplicationTheme } from "@/lib/enums/ApplicationTheme"; - preferences.subscribe(e => { + preferences.subscribe((e) => { switch (e.theme) { case ApplicationTheme.DARK: document.documentElement.setAttribute("theme", "g100"); @@ -33,4 +35,4 @@ }); </script> -<Router {routes}/> +<Router {routes} /> diff --git a/src/webapp/src/assets/fonts/inter/Inter-Black.woff b/src/webapp/src/assets/fonts/inter/Inter-Black.woff Binary files differnew file mode 100644 index 0000000..a18593a --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Black.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Black.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Black.woff2 Binary files differnew file mode 100644 index 0000000..68f64c9 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Black.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-BlackItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-BlackItalic.woff Binary files differnew file mode 100644 index 0000000..b6b0194 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-BlackItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-BlackItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-BlackItalic.woff2 Binary files differnew file mode 100644 index 0000000..1c9c7ca --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-BlackItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-Bold.woff b/src/webapp/src/assets/fonts/inter/Inter-Bold.woff Binary files differnew file mode 100644 index 0000000..eaf3d4b --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Bold.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Bold.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Bold.woff2 Binary files differnew file mode 100644 index 0000000..2846f29 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Bold.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-BoldItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-BoldItalic.woff Binary files differnew file mode 100644 index 0000000..3275076 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-BoldItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-BoldItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-BoldItalic.woff2 Binary files differnew file mode 100644 index 0000000..0b1fe8e --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-BoldItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraBold.woff b/src/webapp/src/assets/fonts/inter/Inter-ExtraBold.woff Binary files differnew file mode 100644 index 0000000..c2c17ed --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraBold.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraBold.woff2 b/src/webapp/src/assets/fonts/inter/Inter-ExtraBold.woff2 Binary files differnew file mode 100644 index 0000000..c24c2bd --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraBold.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff Binary files differnew file mode 100644 index 0000000..c42f705 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff2 Binary files differnew file mode 100644 index 0000000..4a81dc7 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraBoldItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraLight.woff b/src/webapp/src/assets/fonts/inter/Inter-ExtraLight.woff Binary files differnew file mode 100644 index 0000000..d0de5f3 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraLight.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraLight.woff2 b/src/webapp/src/assets/fonts/inter/Inter-ExtraLight.woff2 Binary files differnew file mode 100644 index 0000000..f2ea706 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraLight.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraLightItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-ExtraLightItalic.woff Binary files differnew file mode 100644 index 0000000..81f1a28 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraLightItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-ExtraLightItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-ExtraLightItalic.woff2 Binary files differnew file mode 100644 index 0000000..9af717b --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ExtraLightItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-Italic.woff b/src/webapp/src/assets/fonts/inter/Inter-Italic.woff Binary files differnew file mode 100644 index 0000000..a806b38 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Italic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Italic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Italic.woff2 Binary files differnew file mode 100644 index 0000000..a619fc5 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Italic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-Light.woff b/src/webapp/src/assets/fonts/inter/Inter-Light.woff Binary files differnew file mode 100644 index 0000000..c496464 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Light.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Light.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Light.woff2 Binary files differnew file mode 100644 index 0000000..bc4be66 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Light.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-LightItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-LightItalic.woff Binary files differnew file mode 100644 index 0000000..f84a9de --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-LightItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-LightItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-LightItalic.woff2 Binary files differnew file mode 100644 index 0000000..842b2df --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-LightItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-Medium.woff b/src/webapp/src/assets/fonts/inter/Inter-Medium.woff Binary files differnew file mode 100644 index 0000000..d546843 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Medium.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Medium.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Medium.woff2 Binary files differnew file mode 100644 index 0000000..f92498a --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Medium.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-MediumItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-MediumItalic.woff Binary files differnew file mode 100644 index 0000000..459a656 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-MediumItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-MediumItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-MediumItalic.woff2 Binary files differnew file mode 100644 index 0000000..0e3019f --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-MediumItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-Regular.woff b/src/webapp/src/assets/fonts/inter/Inter-Regular.woff Binary files differnew file mode 100644 index 0000000..62d3a61 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Regular.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Regular.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Regular.woff2 Binary files differnew file mode 100644 index 0000000..6c2b689 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Regular.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-SemiBold.woff b/src/webapp/src/assets/fonts/inter/Inter-SemiBold.woff Binary files differnew file mode 100644 index 0000000..a815f43 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-SemiBold.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-SemiBold.woff2 b/src/webapp/src/assets/fonts/inter/Inter-SemiBold.woff2 Binary files differnew file mode 100644 index 0000000..611e90c --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-SemiBold.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-SemiBoldItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-SemiBoldItalic.woff Binary files differnew file mode 100644 index 0000000..909e43a --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-SemiBoldItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 Binary files differnew file mode 100644 index 0000000..545685b --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-Thin.woff b/src/webapp/src/assets/fonts/inter/Inter-Thin.woff Binary files differnew file mode 100644 index 0000000..62bc58c --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Thin.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-Thin.woff2 b/src/webapp/src/assets/fonts/inter/Inter-Thin.woff2 Binary files differnew file mode 100644 index 0000000..abbc3a5 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-Thin.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-ThinItalic.woff b/src/webapp/src/assets/fonts/inter/Inter-ThinItalic.woff Binary files differnew file mode 100644 index 0000000..700a7f0 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ThinItalic.woff diff --git a/src/webapp/src/assets/fonts/inter/Inter-ThinItalic.woff2 b/src/webapp/src/assets/fonts/inter/Inter-ThinItalic.woff2 Binary files differnew file mode 100644 index 0000000..ab0b200 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-ThinItalic.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-italic.var.woff2 b/src/webapp/src/assets/fonts/inter/Inter-italic.var.woff2 Binary files differnew file mode 100644 index 0000000..b826d5a --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-italic.var.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter-roman.var.woff2 b/src/webapp/src/assets/fonts/inter/Inter-roman.var.woff2 Binary files differnew file mode 100644 index 0000000..6a256a0 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter-roman.var.woff2 diff --git a/src/webapp/src/assets/fonts/inter/Inter.var.woff2 b/src/webapp/src/assets/fonts/inter/Inter.var.woff2 Binary files differnew file mode 100644 index 0000000..365eedc --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/Inter.var.woff2 diff --git a/src/webapp/src/assets/fonts/inter/LICENSE.txt b/src/webapp/src/assets/fonts/inter/LICENSE.txt new file mode 100644 index 0000000..ff80f8c --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/LICENSE.txt @@ -0,0 +1,94 @@ +Copyright (c) 2016-2020 The Inter Project Authors. +"Inter" is trademark of Rasmus Andersson. +https://github.com/rsms/inter + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION AND CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/src/webapp/src/assets/fonts/inter/inter.css b/src/webapp/src/assets/fonts/inter/inter.css new file mode 100644 index 0000000..f450010 --- /dev/null +++ b/src/webapp/src/assets/fonts/inter/inter.css @@ -0,0 +1,200 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url("Inter-Thin.woff2?v=3.19") format("woff2"), + url("Inter-Thin.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100; + font-display: swap; + src: url("Inter-ThinItalic.woff2?v=3.19") format("woff2"), + url("Inter-ThinItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url("Inter-ExtraLight.woff2?v=3.19") format("woff2"), + url("Inter-ExtraLight.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 200; + font-display: swap; + src: url("Inter-ExtraLightItalic.woff2?v=3.19") format("woff2"), + url("Inter-ExtraLightItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("Inter-Light.woff2?v=3.19") format("woff2"), + url("Inter-Light.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url("Inter-LightItalic.woff2?v=3.19") format("woff2"), + url("Inter-LightItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("Inter-Regular.woff2?v=3.19") format("woff2"), + url("Inter-Regular.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("Inter-Italic.woff2?v=3.19") format("woff2"), + url("Inter-Italic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("Inter-Medium.woff2?v=3.19") format("woff2"), + url("Inter-Medium.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url("Inter-MediumItalic.woff2?v=3.19") format("woff2"), + url("Inter-MediumItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("Inter-SemiBold.woff2?v=3.19") format("woff2"), + url("Inter-SemiBold.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url("Inter-SemiBoldItalic.woff2?v=3.19") format("woff2"), + url("Inter-SemiBoldItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("Inter-Bold.woff2?v=3.19") format("woff2"), + url("Inter-Bold.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("Inter-BoldItalic.woff2?v=3.19") format("woff2"), + url("Inter-BoldItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("Inter-ExtraBold.woff2?v=3.19") format("woff2"), + url("Inter-ExtraBold.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 800; + font-display: swap; + src: url("Inter-ExtraBoldItalic.woff2?v=3.19") format("woff2"), + url("Inter-ExtraBoldItalic.woff?v=3.19") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url("Inter-Black.woff2?v=3.19") format("woff2"), + url("Inter-Black.woff?v=3.19") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 900; + font-display: swap; + src: url("Inter-BlackItalic.woff2?v=3.19") format("woff2"), + url("Inter-BlackItalic.woff?v=3.19") format("woff"); +} + +/* ------------------------------------------------------- +Variable font. +Usage: + + html { font-family: 'Inter', sans-serif; } + @supports (font-variation-settings: normal) { + html { font-family: 'Inter var', sans-serif; } + } +*/ +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url("Inter-roman.var.woff2?v=3.19") format("woff2"); +} +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url("Inter-italic.var.woff2?v=3.19") format("woff2"); +} + + +/* -------------------------------------------------------------------------- +[EXPERIMENTAL] Multi-axis, single variable font. + +Slant axis is not yet widely supported (as of February 2019) and thus this +multi-axis single variable font is opt-in rather than the default. + +When using this, you will probably need to set font-variation-settings +explicitly, e.g. + + * { font-variation-settings: "slnt" 0deg } + .italic { font-variation-settings: "slnt" 10deg } + +*/ +@font-face { + font-family: 'Inter var experimental'; + font-weight: 100 900; + font-display: swap; + font-style: oblique 0deg 10deg; + src: url("Inter.var.woff2?v=3.19") format("woff2"); +} diff --git a/src/webapp/src/components/entry-card.svelte b/src/webapp/src/components/entry-card.svelte index e264589..2694264 100644 --- a/src/webapp/src/components/entry-card.svelte +++ b/src/webapp/src/components/entry-card.svelte @@ -1,44 +1,43 @@ -<script lang="ts"> - import type {IEntryDto} from "@/lib/models/IEntryDto"; - import {Link, Tag, OverflowMenu, OverflowMenuItem} from "carbon-components-svelte"; - import {del_entry_async} from "@/lib/stores/entries"; +<!--<script lang="ts">--> +<!-- import type {IEntryDto} from "@/lib/models/IEntryDto";--> +<!-- import {Link, Tag, OverflowMenu, OverflowMenuItem} from "carbon-components-svelte";--> +<!-- import {del_entry_async} from "@/lib/stores/entries";--> - export let entry = {} as IEntryDto; +<!-- export let entry = {} as IEntryDto;--> - async function delete_entry(id) { - await del_entry_async(id); - } -</script> -<style> - .header { - display: flex; - justify-content: space-between; - align-items: center; - } +<!-- async function delete_entry(id) {--> +<!-- await del_entry_async(id);--> +<!-- }--> +<!--</script>--> +<!--<style>--> +<!-- .header {--> +<!-- display: flex;--> +<!-- justify-content: space-between;--> +<!-- align-items: center;--> +<!-- }--> - .card { - margin: 10px 0; - padding-bottom: 5px; - border-bottom: 2px solid var(--cds-active-secondary); - } -</style> -<div class="card"> - <div class="header"> - <Link href="{entry.url}">{entry.url}</Link> - <OverflowMenu flipped> - <OverflowMenuItem text="Edit" - on:click={() => alert("Not implemented")}/> - <OverflowMenuItem danger - on:click={() => delete_entry(entry.id)} - text="Delete"/> - </OverflowMenu> - </div> - {#if entry.tags.length > 0} - {#each entry.tags.split(" ") as tag} - <Tag size="sm">{tag}</Tag> - {/each} - {/if} - {#if entry.description} - <p>{@html entry.description.replace("\n", "<br>")}</p> - {/if} -</div> +<!-- .card {--> +<!-- margin: 10px 0;--> +<!-- padding-bottom: 5px;--> +<!-- }--> +<!--</style>--> +<!--<div class="card">--> +<!-- <div class="header">--> +<!-- <Link href="{entry.url}">{entry.url}</Link>--> +<!-- <OverflowMenu flipped>--> +<!-- <OverflowMenuItem text="Edit"--> +<!-- on:click={() => alert("Not implemented")}/>--> +<!-- <OverflowMenuItem danger--> +<!-- on:click={() => delete_entry(entry.id)}--> +<!-- text="Delete"/>--> +<!-- </OverflowMenu>--> +<!-- </div>--> +<!-- {#if entry.tags.length > 0}--> +<!-- {#each entry.tags.split(" ") as tag}--> +<!-- <Tag size="sm">{tag}</Tag>--> +<!-- {/each}--> +<!-- {/if}--> +<!-- {#if entry.description}--> +<!-- <p>{@html entry.description.replace("\n", "<br>")}</p>--> +<!-- {/if}--> +<!--</div>--> diff --git a/src/webapp/src/components/entry-list.svelte b/src/webapp/src/components/entry-list.svelte index a546de5..c4de7e7 100644 --- a/src/webapp/src/components/entry-list.svelte +++ b/src/webapp/src/components/entry-list.svelte @@ -1,29 +1,29 @@ -<script lang="ts"> - import EntryCard from "@/components/entry-card.svelte"; - import entries, {hydrate_entry_cache_async} from "@/lib/stores/entries"; - import {Grid, InlineLoading, InlineNotification, Search, Tile} from "carbon-components-svelte"; - import {onMount} from "svelte"; +<!--<script lang="ts">--> +<!-- import EntryCard from "@/components/entry-card.svelte";--> +<!-- import entries, {hydrate_entry_cache_async} from "@/lib/stores/entries";--> +<!-- import {Grid, InlineLoading, InlineNotification, Search, Tile} from "carbon-components-svelte";--> +<!-- import {onMount} from "svelte";--> - onMount(async () => { - await hydrate_entry_cache_async(); - }); -</script> +<!-- onMount(async () => {--> +<!-- await hydrate_entry_cache_async();--> +<!-- });--> +<!--</script>--> -<Tile> - <Grid> - <Search placeholder="Search for entries..." - size="sm"/> - <!--TODO: Show loader when something is changing in the store--> - {#if false} - <InlineLoading description="Loading entries..."/> - {:else if $entries.length > 0} - {#each $entries as entry} - <EntryCard {entry}/> - {/each} - {:else} - <InlineNotification title="No entries..." - kind="info" - hideCloseButton/> - {/if} - </Grid> -</Tile> +<!--<Tile>--> +<!-- <Grid>--> +<!-- <Search placeholder="Search for entries..."--> +<!-- size="sm"/>--> +<!-- <!–TODO: Show loader when something is changing in the store–>--> +<!-- {#if false}--> +<!-- <InlineLoading description="Loading entries..."/>--> +<!-- {:else if $entries.length > 0}--> +<!-- {#each $entries as entry}--> +<!-- <EntryCard {entry}/>--> +<!-- {/each}--> +<!-- {:else}--> +<!-- <InlineNotification title="No entries..."--> +<!-- kind="info"--> +<!-- hideCloseButton/>--> +<!-- {/if}--> +<!-- </Grid>--> +<!--</Tile>--> diff --git a/src/webapp/src/components/forms/entry-form.svelte b/src/webapp/src/components/forms/entry-form.svelte index 973065b..941f63a 100644 --- a/src/webapp/src/components/forms/entry-form.svelte +++ b/src/webapp/src/components/forms/entry-form.svelte @@ -1,200 +1,200 @@ -<script lang="ts"> - import {Button, Column, Form, Grid, InlineNotification, Row, TextArea, TextInput, Tile} from "carbon-components-svelte"; - import type {IErrorResult} from "@/lib/models/IErrorResult"; - import type {IEntryDto} from "@/lib/models/IEntryDto"; - import isFQDN from "validator/lib/isURL"; - import {create_entry_async} from "@/lib/stores/entries"; - import {createEventDispatcher} from "svelte"; - import {get_site_report} from "@/lib/api/root"; - import type {ISiteReportDto} from "@/lib/models/ISiteReportDto"; - import preferences from "@/lib/stores/preferences"; - import {get} from "svelte/store"; +<!--<script lang="ts">--> +<!-- import {Button, Column, Form, Grid, InlineNotification, Row, TextArea, TextInput, Tile} from "carbon-components-svelte";--> +<!-- import {get} from "svelte/store";--> +<!-- import {createEventDispatcher} from "svelte";--> +<!-- import type {IErrorResult} from "@/lib/models/IErrorResult";--> +<!-- import type {IEntryDto} from "@/lib/models/IEntryDto";--> +<!-- import isFQDN from "validator/es/lib/isFQDN";--> +<!-- import {create_entry_async} from "@/lib/stores/entries";--> +<!-- import {get_site_report} from "@/lib/api/root";--> +<!-- import type {ISiteReportDto} from "@/lib/models/ISiteReportDto";--> +<!-- import preferences from "@/lib/stores/preferences";--> - const dispatch = createEventDispatcher(); - let url_change_temp = ""; - let description_is_autopopulated = false; - let enable_site_report = get(preferences).enable_site_report; +<!-- const dispatch = createEventDispatcher();--> +<!-- let url_change_temp = "";--> +<!-- let description_is_auto_populated = false;--> +<!-- let enable_site_report = get(preferences).enable_site_report;--> - const form = { - loading: false, - error: {} as IErrorResult, - url: { - value: "", - error: "", - warning: "", - async change(event) { - if (!enable_site_report) return; - let latest_value = event.target.value; - if (!latest_value.startsWith("http")) latest_value = "http://" + latest_value; - if (latest_value === url_change_temp) return; - url_change_temp = latest_value; - form.url.warning = ""; - if (!isFQDN(latest_value)) { - return; - } - try { - const http_request = await get_site_report({ - url: latest_value - }); - if (http_request.ok) { - form.url.warning = ""; - const report = await http_request.json() as ISiteReportDto; - if (report.duplicate) { - form.url.warning = "This url is already in you database"; - } else if (report.unreachable) { - if (description_is_autopopulated) form.description.value = ""; - form.url.warning = "Unreachable url"; - } else if (report.description && !form.description.value || description_is_autopopulated) { - form.description.value = report.description; - description_is_autopopulated = true; - } - } else if (http_request.status === 404) { - if (description_is_autopopulated) form.description.value = ""; - form.url.warning = ""; - } - } catch { - form.url.warning = ""; - } - }, - validate() { - form.url.error = ""; - let is_valid = true; - if (!isFQDN(form.url.value)) { - is_valid = false; - form.url.error = "Invalid url"; - } - return is_valid; - }, - reset() { - form.url.value = ""; - form.url.warning = ""; - form.url.error = ""; - } - }, - tags: { - value: "", - error: "", - warning: "", - validate() { - form.tags.error = ""; - return true; - }, - reset() { - form.tags.value = ""; - form.tags.warning = ""; - form.tags.error = ""; - } - }, - description: { - value: "", - error: "", - warning: "", - validate() { - form.description.error = ""; - return true; - }, - reset() { - form.description.value = ""; - form.description.warning = ""; - form.description.error = ""; - } - }, - is_valid() { - const url_is_valid = form.url.validate(); - const tags_is_valid = form.tags.validate(); - const description_is_valid = form.description.validate(); - return (url_is_valid && tags_is_valid && description_is_valid); - }, - payload(): IEntryDto { - return { - url: this.url.value, - tags: this.tags.value, - description: this.description.value - } as IEntryDto; - }, - reset() { - form.url.reset(); - form.description.reset(); - form.tags.reset(); - }, - async submit() { - if (!form.is_valid()) return; - if (!form.url.value.startsWith("http")) { - form.url.value = "http://" + form.url.value; - } - form.error = {} as IErrorResult; - form.loading = true; - const request = await create_entry_async(form.payload()); - form.loading = false; - if (request.ok) { - form.reset(); - dispatch("created"); - } else if (request?.error) { - form.error = request.error; - } - } - }; +<!-- const form = {--> +<!-- loading: false,--> +<!-- error: {} as IErrorResult,--> +<!-- url: {--> +<!-- value: "",--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- async change(event) {--> +<!-- if (!enable_site_report) return;--> +<!-- let latest_value = event.target.value;--> +<!-- if (!latest_value.startsWith("http")) latest_value = "http://" + latest_value;--> +<!-- if (latest_value === url_change_temp) return;--> +<!-- url_change_temp = latest_value;--> +<!-- form.url.warning = "";--> +<!-- if (!isFQDN(latest_value)) {--> +<!-- return;--> +<!-- }--> +<!-- try {--> +<!-- const http_request = await get_site_report({--> +<!-- url: latest_value--> +<!-- });--> +<!-- if (http_request.ok) {--> +<!-- form.url.warning = "";--> +<!-- const report = await http_request.json() as ISiteReportDto;--> +<!-- if (report.duplicate) {--> +<!-- form.url.warning = "This url is already in you database";--> +<!-- } else if (report.unreachable) {--> +<!-- if (description_is_auto_populated) form.description.value = "";--> +<!-- form.url.warning = "Unreachable url";--> +<!-- } else if (report.description && !form.description.value || description_is_auto_populated) {--> +<!-- form.description.value = report.description;--> +<!-- description_is_auto_populated = true;--> +<!-- }--> +<!-- } else if (http_request.status === 404) {--> +<!-- if (description_is_auto_populated) form.description.value = "";--> +<!-- form.url.warning = "";--> +<!-- }--> +<!-- } catch {--> +<!-- form.url.warning = "";--> +<!-- }--> +<!-- },--> +<!-- validate() {--> +<!-- form.url.error = "";--> +<!-- let is_valid = true;--> +<!-- if (!isFQDN(form.url.value)) {--> +<!-- is_valid = false;--> +<!-- form.url.error = "Invalid url";--> +<!-- }--> +<!-- return is_valid;--> +<!-- },--> +<!-- reset() {--> +<!-- form.url.value = "";--> +<!-- form.url.warning = "";--> +<!-- form.url.error = "";--> +<!-- }--> +<!-- },--> +<!-- tags: {--> +<!-- value: "",--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- validate() {--> +<!-- form.tags.error = "";--> +<!-- return true;--> +<!-- },--> +<!-- reset() {--> +<!-- form.tags.value = "";--> +<!-- form.tags.warning = "";--> +<!-- form.tags.error = "";--> +<!-- }--> +<!-- },--> +<!-- description: {--> +<!-- value: "",--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- validate() {--> +<!-- form.description.error = "";--> +<!-- return true;--> +<!-- },--> +<!-- reset() {--> +<!-- form.description.value = "";--> +<!-- form.description.warning = "";--> +<!-- form.description.error = "";--> +<!-- }--> +<!-- },--> +<!-- is_valid() {--> +<!-- const url_is_valid = form.url.validate();--> +<!-- const tags_is_valid = form.tags.validate();--> +<!-- const description_is_valid = form.description.validate();--> +<!-- return (url_is_valid && tags_is_valid && description_is_valid);--> +<!-- },--> +<!-- payload(): IEntryDto {--> +<!-- return {--> +<!-- url: this.url.value,--> +<!-- tags: this.tags.value,--> +<!-- description: this.description.value--> +<!-- } as IEntryDto;--> +<!-- },--> +<!-- reset() {--> +<!-- form.url.reset();--> +<!-- form.description.reset();--> +<!-- form.tags.reset();--> +<!-- },--> +<!-- async submit() {--> +<!-- if (!form.is_valid()) return;--> +<!-- if (!form.url.value.startsWith("http")) {--> +<!-- form.url.value = "http://" + form.url.value;--> +<!-- }--> +<!-- form.error = {} as IErrorResult;--> +<!-- form.loading = true;--> +<!-- const request = await create_entry_async(form.payload());--> +<!-- form.loading = false;--> +<!-- if (request.ok) {--> +<!-- form.reset();--> +<!-- dispatch("created");--> +<!-- } else if (request?.error) {--> +<!-- form.error = request.error;--> +<!-- }--> +<!-- }--> +<!-- };--> - preferences.subscribe(val => { - enable_site_report = val.enable_site_report; - if (!enable_site_report) form.url.warning = ""; - }); -</script> +<!-- preferences.subscribe(val => {--> +<!-- enable_site_report = val.enable_site_report;--> +<!-- if (!enable_site_report) form.url.warning = "";--> +<!-- });--> +<!--</script>--> -<Tile> - <Form on:submit={form.submit} - disabled={form.loading}> - <Grid condensed> - <Row style="padding-bottom: 12px"> - <Column> - <h2>New entry</h2> - </Column> - </Row> - {#if form.error.title || form.error.text} - <Row> - <Column> - <InlineNotification - hideCloseButton - title={form.error.title ?? ""} - subtitle={form.error.text ?? ""}/> - </Column> - </Row> - {/if} - <Row> - <Column> - <TextInput placeholder="url" - inputmode="url" - size="sm" - warn={form.url.warning !== ""} - warnText={form.url.warning} - invalid={form.url.error !== ""} - invalidMessage={form.url.error} - on:keyup={form.url.change} - on:focusout={form.url.validate} - on:change={form.url.validate} - bind:value={form.url.value}/> - </Column> - </Row> - <Row> - <Column> - <TextInput placeholder="tags" - size="sm" - bind:value={form.tags.value}/> - </Column> - </Row> - <Row style="padding-bottom: 5px"> - <Column> - <TextArea placeholder="description" - size="sm" - bind:value={form.description.value}/> - </Column> - </Row> - <Row style="justify-content: end"> - <Button size="sm" - type="submit"> - Submit - </Button> - </Row> - </Grid> - </Form> -</Tile> +<!--<Tile>--> +<!-- <Form on:submit={form.submit}--> +<!-- disabled={form.loading}>--> +<!-- <Grid condensed>--> +<!-- <Row style="padding-bottom: 12px">--> +<!-- <Column>--> +<!-- <h2>New entry</h2>--> +<!-- </Column>--> +<!-- </Row>--> +<!-- {#if form.error.title || form.error.text}--> +<!-- <Row>--> +<!-- <Column>--> +<!-- <InlineNotification--> +<!-- hideCloseButton--> +<!-- title={form.error.title ?? ""}--> +<!-- subtitle={form.error.text ?? ""}/>--> +<!-- </Column>--> +<!-- </Row>--> +<!-- {/if}--> +<!-- <Row>--> +<!-- <Column>--> +<!-- <TextInput placeholder="url"--> +<!-- inputmode="url"--> +<!-- size="sm"--> +<!-- warn={form.url.warning !== ""}--> +<!-- warnText={form.url.warning}--> +<!-- invalid={form.url.error !== ""}--> +<!-- invalidMessage={form.url.error}--> +<!-- on:keyup={form.url.change}--> +<!-- on:focusout={form.url.validate}--> +<!-- on:change={form.url.validate}--> +<!-- bind:value={form.url.value}/>--> +<!-- </Column>--> +<!-- </Row>--> +<!-- <Row>--> +<!-- <Column>--> +<!-- <TextInput placeholder="tags"--> +<!-- size="sm"--> +<!-- bind:value={form.tags.value}/>--> +<!-- </Column>--> +<!-- </Row>--> +<!-- <Row style="padding-bottom: 5px">--> +<!-- <Column>--> +<!-- <TextArea placeholder="description"--> +<!-- size="sm"--> +<!-- bind:value={form.description.value}/>--> +<!-- </Column>--> +<!-- </Row>--> +<!-- <Row style="justify-content: end">--> +<!-- <Button size="sm"--> +<!-- type="submit">--> +<!-- Submit--> +<!-- </Button>--> +<!-- </Row>--> +<!-- </Grid>--> +<!-- </Form>--> +<!--</Tile>--> diff --git a/src/webapp/src/components/ui/buttons/button.svelte b/src/webapp/src/components/ui/buttons/button.svelte new file mode 100644 index 0000000..94c52fd --- /dev/null +++ b/src/webapp/src/components/ui/buttons/button.svelte @@ -0,0 +1,91 @@ +<script lang="ts"> + /** + * Specify the kind of button + * @type {"primary" | "secondary" | "tertiary" | "ghost" | "danger" | "danger-tertiary" | "danger-ghost"} + */ + export let kind = "primary"; + + /** + * Specify the icon to render + * @type {typeof import("svelte").SvelteComponent} + */ + export let icon = undefined; + + /** + * Specify the ARIA label for the button icon + * @type {string} + */ + export let icon_description = undefined; + + /** + * Set the alignment of the tooltip relative to the icon + * `hasIconOnly` must be set to `true` + * @type {"start" | "center" | "end"} + */ + export let tooltip_alignment = "center"; + + /** + * Set the position of the tooltip relative to the icon + * @type {"top" | "right" | "bottom" | "left"} + */ + export let tooltip_position = "bottom"; + + /** Set to `true` to disable the button */ + export let disabled = false; + + /** + * Set the `href` to use an anchor link + * @type {string} + */ + export let href = undefined; + + /** Specify the tabindex */ + export let tabindex = "0"; + + /** Specify the `type` attribute for the button element */ + export let type = "button"; + + /** Obtain a reference to the HTML element */ + export let ref = null; + + $: buttonProps = { + type: href && !disabled ? undefined : type, + tabindex, + disabled: disabled === true ? true : undefined, + href, + ...$$restProps + }; +</script> + +{#if href && !disabled} + <a bind:this="{ref}" + {...buttonProps} + href="{href}" + on:click> + + <slot/> + + <svelte:component + this="{icon}" + aria-hidden="true" + class="bx--btn__icon" + aria-label="{icon_description}" + /> + + </a> +{:else} + <button bind:this="{ref}" + {...buttonProps} + on:click> + + <slot/> + + <svelte:component + this="{icon}" + aria-hidden="true" + class="bx--btn__icon" + aria-label="{icon_description}" + /> + + </button> +{/if} diff --git a/src/webapp/src/components/ui/buttons/index.ts b/src/webapp/src/components/ui/buttons/index.ts new file mode 100644 index 0000000..35cec88 --- /dev/null +++ b/src/webapp/src/components/ui/buttons/index.ts @@ -0,0 +1 @@ +export {default as Button} from "./button.svelte"; diff --git a/src/webapp/src/components/ui/icons/checkmark-circle.svelte b/src/webapp/src/components/ui/icons/checkmark-circle.svelte new file mode 100644 index 0000000..06615ce --- /dev/null +++ b/src/webapp/src/components/ui/icons/checkmark-circle.svelte @@ -0,0 +1,49 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round" + transform="translate(2 2)"> + <circle cx="8.5" + cy="8.5" + r="8"/> + <path d="m5.5 9.5 2 2 5-5"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/icons/close.svelte b/src/webapp/src/components/ui/icons/close.svelte new file mode 100644 index 0000000..dc5749b --- /dev/null +++ b/src/webapp/src/components/ui/icons/close.svelte @@ -0,0 +1,46 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round"> + <path d="m7.5 7.5 6 6"/> + <path d="m13.5 7.5-6 6"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/icons/eye-striked.svelte b/src/webapp/src/components/ui/icons/eye-striked.svelte new file mode 100644 index 0000000..287466e --- /dev/null +++ b/src/webapp/src/components/ui/icons/eye-striked.svelte @@ -0,0 +1,49 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round" + transform="translate(2 4)"> + <path d="M4.21098664 2.25927021C2.72674608 3.17424129 1.32308387 4.58781789 0 6.5 2.53705308 10.1666667 5.37038642 12 8.5 12 9.9230893 12 11.2849174 11.6209257 12.5854843 10.8627772M14.173426 9.72269094C15.1532781 8.88149971 16.0954695 7.8072694 17 6.5 14.4629469 2.83333333 11.6296136 1 8.5 1 7.66950473 1 6.85987336 1.1291024 6.0711059 1.38730721"/> + <line x1="2" + x2="15" + y2="13.071"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/icons/eye.svelte b/src/webapp/src/components/ui/icons/eye.svelte new file mode 100644 index 0000000..9b340b7 --- /dev/null +++ b/src/webapp/src/components/ui/icons/eye.svelte @@ -0,0 +1,47 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round" + transform="translate(2 5)"> + <path d="m8.5 11c3.1296136 0 5.9629469-1.83333333 8.5-5.5-2.5370531-3.66666667-5.3703864-5.5-8.5-5.5-3.12961358 0-5.96294692 1.83333333-8.5 5.5 2.53705308 3.66666667 5.37038642 5.5 8.5 5.5z"/> + <path d="m8.5 2c.18463928 0 .36593924.01429736.54285316.04184538-.02850842.148891-.04285316.30184762-.04285316.45815462 0 1.38071187 1.1192881 2.5 2.5 2.5.156307 0 .3092636-.01434474.4576252-.04178957.0280774.17585033.0423748.35715029.0423748.54178957 0 1.93299662-1.5670034 3.5-3.5 3.5-1.93299662 0-3.5-1.56700338-3.5-3.5s1.56700338-3.5 3.5-3.5z"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/icons/index.ts b/src/webapp/src/components/ui/icons/index.ts new file mode 100644 index 0000000..a013b44 --- /dev/null +++ b/src/webapp/src/components/ui/icons/index.ts @@ -0,0 +1,7 @@ +export {default as Eye} from "./eye.svelte"; +export {default as EyeStriked} from "./eye-striked.svelte"; +export {default as Close} from "./close.svelte"; +export {default as CheckmarkCircle} from "./checkmark-circle.svelte"; +export {default as InfoCircle} from "./info-circle.svelte"; +export {default as MinusCircle} from "./minus-circle.svelte"; +export {default as WarningCircle} from "./warning-circle.svelte"; diff --git a/src/webapp/src/components/ui/icons/info-circle.svelte b/src/webapp/src/components/ui/icons/info-circle.svelte new file mode 100644 index 0000000..cb00db6 --- /dev/null +++ b/src/webapp/src/components/ui/icons/info-circle.svelte @@ -0,0 +1,55 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd" + transform="translate(2 2)"> + <g stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round"> + <circle cx="8.5" + cy="8.5" + r="8"/> + <path d="m8.5 12.5v-4h-1"/> + <path d="m7.5 12.5h2"/> + </g> + <circle cx="8.5" + cy="5.5" + fill="currentColor" + r="1"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/icons/minus-circle.svelte b/src/webapp/src/components/ui/icons/minus-circle.svelte new file mode 100644 index 0000000..6110ee7 --- /dev/null +++ b/src/webapp/src/components/ui/icons/minus-circle.svelte @@ -0,0 +1,47 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round" + transform="translate(2 3)"> + <path d="m8 16c4.4380025 0 8-3.5262833 8-7.96428571 0-4.43800246-3.5619975-8.03571429-8-8.03571429-4.43800245 0-8 3.59771183-8 8.03571429 0 4.43800241 3.56199755 7.96428571 8 7.96428571z"/> + <path d="m4 8h8"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/icons/warning-circle.svelte b/src/webapp/src/components/ui/icons/warning-circle.svelte new file mode 100644 index 0000000..6200f32 --- /dev/null +++ b/src/webapp/src/components/ui/icons/warning-circle.svelte @@ -0,0 +1,55 @@ +<script> + let className = undefined; + export {className as class}; + export let id = undefined; + export let tabindex = undefined; + export let focusable = false; + export let title = undefined; + export let style = undefined; + $: ariaLabel = $$props["aria-label"]; + $: ariaLabelledBy = $$props["aria-labelledby"]; + $: labelled = ariaLabel || ariaLabelledBy || title; + $: attributes = { + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-hidden": labelled ? undefined : true, + role: labelled ? "img" : undefined, + focusable: tabindex === "0" ? true : focusable, + tabindex, + }; +</script> +<svg height="21" + viewBox="0 0 21 21" + width="21" + xmlns="http://www.w3.org/2000/svg" + fill="currentColor" + style="{style}" + id="{id}" + class="{className}" + preserveAspectRatio="xMidYMid meet" + {...attributes}> + + <g fill="none" + fill-rule="evenodd"> + <circle cx="10.5" + cy="10.5" + r="8" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round"/> + <path d="m10.5 11.5v-5" + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round"/> + <circle cx="10.5" + cy="14.5" + fill="currentColor" + r="1"/> + </g> + + <slot> + {#if title} + <title>{title}</title> + {/if} + </slot> +</svg> diff --git a/src/webapp/src/components/ui/index.ts b/src/webapp/src/components/ui/index.ts new file mode 100644 index 0000000..3ff3bf3 --- /dev/null +++ b/src/webapp/src/components/ui/index.ts @@ -0,0 +1,3 @@ +export {TextInput, PasswordInput, InlineCheckbox, Checkbox} from "./inputs"; +export {InlineNotification} from "./notifications"; +export {Button} from "./buttons"; diff --git a/src/webapp/src/components/ui/inputs/checkbox.svelte b/src/webapp/src/components/ui/inputs/checkbox.svelte new file mode 100644 index 0000000..2272b3b --- /dev/null +++ b/src/webapp/src/components/ui/inputs/checkbox.svelte @@ -0,0 +1,42 @@ +<script lang="ts"> + import { createEventDispatcher } from "svelte"; + import { generate_unsafe_id } from "@/lib/helpers"; + + export let value = ""; + export let checked = false; + export let required = false; + export let readonly = false; + export let disabled = false; + export let label_text = ""; + export let hide_label = false; + export let name = ""; + export let title = undefined; + export let id = "input-" + generate_unsafe_id(4); + + const dispatch = createEventDispatcher(); + + $: dispatch("check", checked); +</script> + +<div {...$$restProps}> + <input + type="checkbox" + {value} + {checked} + {disabled} + {id} + {name} + {required} + {readonly} + on:change={() => (checked = !checked)} + on:change + on:blur + /> + <label for={id} {title}> + <span class:invisible={hide_label}> + <slot name="label_text"> + {label_text} + </slot> + </span> + </label> +</div> diff --git a/src/webapp/src/components/ui/inputs/index.ts b/src/webapp/src/components/ui/inputs/index.ts new file mode 100644 index 0000000..e4adc78 --- /dev/null +++ b/src/webapp/src/components/ui/inputs/index.ts @@ -0,0 +1,4 @@ +export {default as TextInput} from "./text-input.svelte"; +export {default as PasswordInput} from "./password-input.svelte"; +export {default as Checkbox} from "./checkbox.svelte"; +export {default as InlineCheckbox} from "./inline-checkbox.svelte"; diff --git a/src/webapp/src/components/ui/inputs/inline-checkbox.svelte b/src/webapp/src/components/ui/inputs/inline-checkbox.svelte new file mode 100644 index 0000000..814134c --- /dev/null +++ b/src/webapp/src/components/ui/inputs/inline-checkbox.svelte @@ -0,0 +1,11 @@ +<script lang="ts"> + import { generate_unsafe_id } from "@/lib/helpers"; + + export let checked = false; + export let title = undefined; + export let id = "input-" + generate_unsafe_id(4); +</script> + +<input type="checkbox" {checked} {id} on:change /> + +<label for={id} {title} aria-label={$$props["aria-label"]} /> diff --git a/src/webapp/src/components/ui/inputs/password-input.svelte b/src/webapp/src/components/ui/inputs/password-input.svelte new file mode 100644 index 0000000..b03c575 --- /dev/null +++ b/src/webapp/src/components/ui/inputs/password-input.svelte @@ -0,0 +1,98 @@ +<script lang="ts"> + import { generate_unsafe_id } from "@/lib/helpers"; + import { Eye, EyeStriked } from "@/components/ui/icons"; + + export let hide_password_label = "Hide password"; + export let show_password_label = "Show password"; + export let value = ""; + export let type = "password"; + export let placeholder = ""; + export let disabled = false; + export let helper_text = ""; + export let id = "input-" + generate_unsafe_id(4); + export let name = undefined; + export let label_text = ""; + export let hide_label = false; + export let invalid = false; + export let invalid_text = ""; + export let warn = false; + export let warn_text = ""; + export let required = false; + export let readonly = false; + + function on_input(event: Event) { + value = (event.target as HTMLInputElement).value; + } + + $: error_id = `error-${id}`; + $: warn_id = `warn-${id}`; +</script> + +<div class="flex"> + {#if label_text} + <label for={id} class:invisible={hide_label} class:disabled> + <slot name="label_text"> + {label_text} + </slot> + </label> + {/if} + + <div class="flex"> + <input + data-invalid={invalid || undefined} + aria-invalid={invalid || undefined} + aria-describedby={invalid ? error_id : warn ? warn_id : undefined} + {disabled} + {id} + {name} + {placeholder} + value={value ?? ""} + {required} + {readonly} + {type} + class="reset px-1.5 py-0.5" + class:disabled + class:border-red-500={invalid} + class:border-amber-500={warn} + on:change + on:input + on:input={on_input} + on:keydown + on:keyup + on:focus + on:blur + /> + + <button + type="button" + title={type === "password" + ? show_password_label + : hide_password_label} + {disabled} + on:click={() => + !disabled && (type = type === "password" ? "text" : "password")} + > + {#if !disabled} + {#if type === "text"} + <EyeStriked /> + {:else} + <Eye /> + {/if} + {/if} + </button> + </div> + + {#if warn && warn_text} + <small>{warn_text}</small> + {/if} + + {#if invalid && invalid_text} + <small>{invalid_text}</small> + {/if} +</div> + +<style lang="postcss"> + .disabled { + @apply opacity-75 cursor-not-allowed; + } +</style> diff --git a/src/webapp/src/components/ui/inputs/text-input.svelte b/src/webapp/src/components/ui/inputs/text-input.svelte new file mode 100644 index 0000000..91a9bc0 --- /dev/null +++ b/src/webapp/src/components/ui/inputs/text-input.svelte @@ -0,0 +1,87 @@ +<script lang="ts"> + import { createEventDispatcher } from "svelte"; + import { generate_unsafe_id } from "@/lib/helpers"; + + export let value = ""; + export let placeholder = ""; + export let disabled = false; + export let helper_text = ""; + export let id = "input-" + generate_unsafe_id(4); + export let name = undefined; + export let label_text = ""; + export let hide_label = false; + export let invalid = false; + export let invalid_text = ""; + export let warn = false; + export let warn_text = ""; + export let required = false; + export let readonly = false; + + const dispatch = createEventDispatcher(); + + function parse(raw: any) { + if ($$restProps.type !== "number") return raw; + return raw != "" ? Number(raw) : null; + } + + function on_input(event: Event) { + value = parse((event.target as HTMLInputElement).value); + dispatch("input", value); + } + + function on_change(event: Event) { + dispatch("change", parse((event.target as HTMLInputElement).value)); + } + + $: error_id = `error-${id}`; + $: warn_id = `warn-${id}`; +</script> + +<div class="flex"> + {#if label_text} + <label for={id} class:invisible={hide_label} class:disabled> + <slot name="label_text"> + {label_text} + </slot> + </label> + {/if} + + <input + data-invalid={invalid || undefined} + aria-invalid={invalid || undefined} + data-warn={warn || undefined} + aria-describedby={invalid ? error_id : warn ? warn_id : undefined} + {disabled} + {id} + {name} + {placeholder} + {required} + {readonly} + class="px-1.5 py-0.5" + class:disabled + class:border-red-500={invalid} + class:border-amber-500={warn} + on:change={on_change} + on:input={on_input} + on:keydown + on:keyup + on:focus + on:blur + bind:value + {...$$restProps} + /> + + {#if warn && warn_text} + <small>{warn_text}</small> + {/if} + + {#if invalid && invalid_text} + <small>{invalid_text}</small> + {/if} +</div> + +<style lang="postcss"> + .disabled { + @apply opacity-75 cursor-not-allowed; + } +</style> diff --git a/src/webapp/src/components/ui/notifications/index.ts b/src/webapp/src/components/ui/notifications/index.ts new file mode 100644 index 0000000..43362ad --- /dev/null +++ b/src/webapp/src/components/ui/notifications/index.ts @@ -0,0 +1 @@ +export {default as InlineNotification} from "./inline-notification.svelte"; diff --git a/src/webapp/src/components/ui/notifications/inline-notification.svelte b/src/webapp/src/components/ui/notifications/inline-notification.svelte new file mode 100644 index 0000000..7917170 --- /dev/null +++ b/src/webapp/src/components/ui/notifications/inline-notification.svelte @@ -0,0 +1,75 @@ +<script lang="ts"> + import { createEventDispatcher, onMount } from "svelte"; + import NotificationIcon from "./notification-icon.svelte"; + import NotificationButton from "./notification-button.svelte"; + + export let kind = "error"; + export let low_contrast = false; + export let timeout = 0; + export let role = "alert"; + export let title = ""; + export let subtitle = ""; + export let hide_close_button = false; + export let icon_description = "Closes notification"; + + const dispatch = createEventDispatcher(); + let open = true; + let timeoutId = undefined; + + function close(closeFromTimeout) { + open = false; + dispatch("close", { timeout: closeFromTimeout === true }); + } + + onMount(() => { + if (timeout) { + timeoutId = setTimeout(() => close(true), timeout); + } + return () => { + clearTimeout(timeoutId); + }; + }); +</script> + +{#if open} + <div + {role} + {kind} + class:bx--inline-notification={true} + class:bx--inline-notification--low-contrast={low_contrast} + class:bx--inline-notification--hide-close-button={hide_close_button} + class:bx--inline-notification--error={kind === "error"} + class:bx--inline-notification--info={kind === "info"} + class:bx--inline-notification--info-square={kind === "info-square"} + class:bx--inline-notification--success={kind === "success"} + class:bx--inline-notification--warning={kind === "warning"} + class:bx--inline-notification--warning-alt={kind === "warning-alt"} + {...$$restProps} + > + <div class:bx--inline-notification__details={true}> + <NotificationIcon notification_type="inline" {kind} /> + + <div class:bx--inline-notification__text-wrapper={true}> + <p class:bx--inline-notification__title={true}> + <slot name="title">{title}</slot> + </p> + + <div class:bx--inline-notification__subtitle={true}> + <slot name="subtitle">{subtitle}</slot> + </div> + + <slot /> + </div> + </div> + + <slot name="actions" /> + + {#if !hide_close_button} + <NotificationButton + {icon_description} + notification_type="inline" + on:click={close} + /> + {/if} + </div> +{/if} diff --git a/src/webapp/src/components/ui/notifications/notification-action-button.svelte b/src/webapp/src/components/ui/notifications/notification-action-button.svelte new file mode 100644 index 0000000..5981b9b --- /dev/null +++ b/src/webapp/src/components/ui/notifications/notification-action-button.svelte @@ -0,0 +1,15 @@ +<script lang="ts"> + import { Button } from "@/components/ui"; + + let className = undefined; + export { className as class }; +</script> + +<Button + kind="ghost" + {...$$restProps} + class="bx--inline-notification__action-button {className}" + on:click +> + <slot /> +</Button> diff --git a/src/webapp/src/components/ui/notifications/notification-button.svelte b/src/webapp/src/components/ui/notifications/notification-button.svelte new file mode 100644 index 0000000..4b2e204 --- /dev/null +++ b/src/webapp/src/components/ui/notifications/notification-button.svelte @@ -0,0 +1,24 @@ +<script lang="ts"> + import Close from "@/components/ui/icons/close.svelte"; + + export let notification_type = "toast"; + export let icon = Close; + export let title = undefined; + export let icon_description = "Close icon"; +</script> + +<button + type="button" + aria-label={icon_description} + title={icon_description} + class:bx--toast-notification__close-button={notification_type === "toast"} + class:bx--inline-notification__close-button={notification_type === "inline"} + {...$$restProps} + on:click +> + <svelte:component + this={icon} + {title} + class="bx--{notification_type}-notification__close-icon" + /> +</button> diff --git a/src/webapp/src/components/ui/notifications/notification-icon.svelte b/src/webapp/src/components/ui/notifications/notification-icon.svelte new file mode 100644 index 0000000..117b636 --- /dev/null +++ b/src/webapp/src/components/ui/notifications/notification-icon.svelte @@ -0,0 +1,25 @@ +<script lang="ts"> + import { + CheckmarkCircle, + MinusCircle, + InfoCircle, + WarningCircle, + } from "@/components/ui/icons"; + + export let kind = "error"; + export let notification_type = "toast"; + export let icon_description = "Closes notification"; + + const icons = { + error: MinusCircle, + info: InfoCircle, + success: CheckmarkCircle, + warning: WarningCircle, + }; +</script> + +<svelte:component + this={icons[kind]} + title={icon_description} + class="bx--{notification_type}-notification__icon" +/> diff --git a/src/webapp/src/components/ui/notifications/toast-notification.svelte b/src/webapp/src/components/ui/notifications/toast-notification.svelte new file mode 100644 index 0000000..dbe756f --- /dev/null +++ b/src/webapp/src/components/ui/notifications/toast-notification.svelte @@ -0,0 +1,71 @@ +<script lang="ts"> + import { createEventDispatcher, onMount } from "svelte"; + import NotificationIcon from "./notification-icon.svelte"; + import NotificationButton from "./notification-button.svelte"; + + export let kind = "error"; + export let low_contrast = false; + export let timeout = 0; + export let role = "alert"; + export let title = ""; + export let subtitle = ""; + export let caption = ""; + export let icon_description = "Closes notification"; + export let hide_close_button = false; + + const dispatch = createEventDispatcher(); + let open = true; + let timeout_id = undefined; + + function close(closeFromTimeout) { + open = false; + dispatch("close", { timeout: closeFromTimeout === true }); + } + + onMount(() => { + if (timeout) { + timeout_id = setTimeout(() => close(true), timeout); + } + return () => { + clearTimeout(timeout_id); + }; + }); +</script> + +{#if open} + <div + {role} + {kind} + class:bx--toast-notification={true} + class:bx--toast-notification--low-contrast={low_contrast} + class:bx--toast-notification--error={kind === "error"} + class:bx--toast-notification--info={kind === "info"} + class:bx--toast-notification--info-square={kind === "info-square"} + class:bx--toast-notification--success={kind === "success"} + class:bx--toast-notification--warning={kind === "warning"} + class:bx--toast-notification--warning-alt={kind === "warning-alt"} + {...$$restProps} + > + <NotificationIcon {kind} /> + + <div class:bx--toast-notification__details={true}> + <h3 class:bx--toast-notification__title={true}> + <slot name="title">{title}</slot> + </h3> + + <div class:bx--toast-notification__subtitle={true}> + <slot name="subtitle">{subtitle}</slot> + </div> + + <div class:bx--toast-notification__caption={true}> + <slot name="caption">{caption}</slot> + </div> + + <slot /> + </div> + + {#if !hide_close_button} + <NotificationButton {icon_description} on:click={close} /> + {/if} + </div> +{/if} diff --git a/src/webapp/src/components/ui/readme.txt b/src/webapp/src/components/ui/readme.txt new file mode 100644 index 0000000..891d3fd --- /dev/null +++ b/src/webapp/src/components/ui/readme.txt @@ -0,0 +1 @@ +A collection of UI compnents largely inspired by carbon-components made by IBM diff --git a/src/webapp/src/lib/configuration.ts b/src/webapp/src/lib/configuration.ts index a480141..39f0cf2 100644 --- a/src/webapp/src/lib/configuration.ts +++ b/src/webapp/src/lib/configuration.ts @@ -1,8 +1,8 @@ export const api_version = "v1"; -// export const api_docs = "http://localhost:5003/swagger/index.html"; -// export const api_url = "http://localhost:5003"; -export const api_docs = "https://bmt-api.ivarlovlie.no/swagger/index.html"; -export const api_url = "https://bmt-api.ivarlovlie.no"; +export const api_docs = "http://localhost:5003/swagger/index.html"; +export const api_url = "http://localhost:5003"; +// export const api_docs = "https://bmt-api.ivarlovlie.no/swagger/index.html"; +// export const api_url = "https://bmt-api.ivarlovlie.no"; export function api_base(path) { return `${api_url}/${api_version}/${path}`; diff --git a/src/webapp/src/lib/stores/persistent-store.ts b/src/webapp/src/lib/stores/persistent-store.ts index 6720bdc..f65d8df 100644 --- a/src/webapp/src/lib/stores/persistent-store.ts +++ b/src/webapp/src/lib/stores/persistent-store.ts @@ -1,6 +1,5 @@ import {writable as _writable, readable as _readable,} from "svelte/store"; import type {Writable, Readable, StartStopNotifier} from "svelte/store"; -import lzString from "lz-string"; enum StoreType { SESSION = 0, @@ -8,12 +7,10 @@ enum StoreType { } interface StoreOptions { - compress?: boolean, - store?: StoreType + store?: StoreType; } const default_store_options = { - compress: false, store: StoreType.SESSION } as StoreOptions; @@ -39,11 +36,9 @@ function get_store(type: StoreType): Storage { } } -function prepared_store_value(value, compress): string { +function prepared_store_value(value): string { try { - let returnValue = JSON.stringify(value); - if (compress) returnValue = lzString.compressToUTF16(returnValue); - return returnValue; + return JSON.stringify(value); } catch (e) { console.error(e); return "__INVALID__"; @@ -53,9 +48,8 @@ function prepared_store_value(value, compress): string { function get_store_value<T>(options: WritableStore<T> | ReadableStore<T>): object | boolean { try { const storage = get_store(options.options.store); - let value = storage.getItem(options.name); + const value = storage.getItem(options.name); if (!value) return false; - if (options.options.compress) value = lzString.decompressFromUTF16(value); return JSON.parse(value); } catch (e) { console.error(e); @@ -72,7 +66,7 @@ function subscribe<T>(store, options: WritableStore<T> | ReadableStore<T>): void const storage = get_store(options.options.store); if (!store.subscribe) return; store.subscribe((state) => { - storage.setItem(options.name, prepared_store_value(state, options.options.compress)); + storage.setItem(options.name, prepared_store_value(state)); }); } diff --git a/src/webapp/src/lib/stores/preferences.ts b/src/webapp/src/lib/stores/preferences.ts index e99f90d..121699a 100644 --- a/src/webapp/src/lib/stores/preferences.ts +++ b/src/webapp/src/lib/stores/preferences.ts @@ -14,21 +14,20 @@ const preferences = writable_persistent({ name: storage_keys.preferences, options: { store: StoreType.LOCAL, - compress: false }, initialState: default_preferences }); export function set_site_report_state(enabled: boolean) { - const prefs = get(preferences); - prefs.enable_site_report = enabled; - preferences.set(prefs); + const preferences_copy = get(preferences); + preferences_copy.enable_site_report = enabled; + preferences.set(preferences_copy); } export function set_theme(theme: ApplicationTheme) { - const prefs = get(preferences); - prefs.theme = theme; - preferences.set(prefs); + const preferences_copy = get(preferences); + preferences_copy.theme = theme; + preferences.set(preferences_copy); } export default preferences; diff --git a/src/webapp/src/lib/stores/session.ts b/src/webapp/src/lib/stores/session.ts index 36231cc..1eea985 100644 --- a/src/webapp/src/lib/stores/session.ts +++ b/src/webapp/src/lib/stores/session.ts @@ -1,5 +1,5 @@ import {get} from "svelte/store"; -import isUUID from "validator/lib/isUUID"; +import isUUID from "validator/es/lib/isUUID"; import {SECONDS_BETWEEN_SESSION_CHECK, storage_keys} from "@/lib/configuration"; import {get_profile_async, create_session_async} from "@/lib/api/account"; import {writable_persistent, StoreType} from "@/lib/stores/persistent-store"; @@ -12,7 +12,6 @@ const session = writable_persistent<IProfileData>({ initialState: {} as IProfileData, options: { store: StoreType.SESSION, - compress: false, } }); diff --git a/src/webapp/src/main.ts b/src/webapp/src/main.ts index f70b640..11cf514 100644 --- a/src/webapp/src/main.ts +++ b/src/webapp/src/main.ts @@ -1,9 +1,8 @@ +import "./app.css"; import App from "./app.svelte"; -import "./styles/carbon.scss"; -import "./styles/global.scss"; const app = new App({ - target: document.getElementById("app") + target: document.getElementById("app"), }); export default app; diff --git a/src/webapp/src/routes/app/_header.svelte b/src/webapp/src/routes/app/_header.svelte index d96e73c..d1a612f 100644 --- a/src/webapp/src/routes/app/_header.svelte +++ b/src/webapp/src/routes/app/_header.svelte @@ -1,99 +1,99 @@ -<script lang="ts"> - import session, {clear_session_async} from "@/lib/stores/session"; - import preferences, {set_site_report_state, set_theme} from "@/lib/stores/preferences"; - import {replace} from "svelte-spa-router"; - import HeaderPanelToggle from "@/components/carbon-extras/HeaderPanelToggle.svelte"; - import SettingsAdjust20 from "carbon-icons-svelte/lib/SettingsAdjust20"; - import UserAvatarFilledAlt20 from "carbon-icons-svelte/lib/UserAvatarFilledAlt20"; - import {ApplicationTheme} from "@/lib/enums/ApplicationTheme"; - import {get} from "svelte/store"; - import {Header, HeaderAction, HeaderPanelDivider, HeaderPanelLink, HeaderPanelLinks, HeaderUtilities, Tooltip,} from "carbon-components-svelte"; - import {api_base} from "@/lib/configuration"; - import Help16 from "carbon-icons-svelte/lib/Help16"; - import {end_session_async} from "@/lib/api/account"; - import {clear_entries} from "@/lib/stores/entries"; - import AccessTokensModal from "./modals/access-tokens-modal.svelte"; - import FileImportModal from "./modals/file-import-modal.svelte"; +<!--<script lang="ts">--> +<!-- import session, {clear_session_async} from "@/lib/stores/session";--> +<!-- import preferences, {set_site_report_state, set_theme} from "@/lib/stores/preferences";--> +<!-- import {replace} from "svelte-spa-router";--> +<!-- import HeaderPanelToggle from "@/components/carbon-extras/HeaderPanelToggle.svelte";--> +<!-- import SettingsAdjust20 from "carbon-icons-svelte/lib/SettingsAdjust20";--> +<!-- import UserAvatarFilledAlt20 from "carbon-icons-svelte/lib/UserAvatarFilledAlt20";--> +<!-- import {ApplicationTheme} from "@/lib/enums/ApplicationTheme";--> +<!-- import {get} from "svelte/store";--> +<!-- import {Header, HeaderAction, HeaderPanelDivider, HeaderPanelLink, HeaderPanelLinks, HeaderUtilities, Tooltip,} from "carbon-components-svelte";--> +<!-- import {api_base} from "@/lib/configuration";--> +<!-- import Help16 from "carbon-icons-svelte/lib/Help16";--> +<!-- import {end_session_async} from "@/lib/api/account";--> +<!-- import {clear_entries} from "@/lib/stores/entries";--> +<!-- import AccessTokensModal from "./modals/access-tokens-modal.svelte";--> +<!-- import FileImportModal from "./modals/file-import-modal.svelte";--> - let profile_dropdown_is_open = false; - let options_dropdown_is_open = false; - let enable_dark_theme = get(preferences).theme === ApplicationTheme.DARK; - let enable_site_report = get(preferences).enable_site_report; - let access_token_modal_is_open = false; - let file_import_modal_is_open = false; +<!-- let profile_dropdown_is_open = false;--> +<!-- let options_dropdown_is_open = false;--> +<!-- let enable_dark_theme = get(preferences).theme === ApplicationTheme.DARK;--> +<!-- let enable_site_report = get(preferences).enable_site_report;--> +<!-- let access_token_modal_is_open = false;--> +<!-- let file_import_modal_is_open = false;--> - preferences.subscribe(e => { - enable_site_report = e.enable_site_report; - enable_dark_theme = e.theme === ApplicationTheme.DARK; - }); +<!-- preferences.subscribe(e => {--> +<!-- enable_site_report = e.enable_site_report;--> +<!-- enable_dark_theme = e.theme === ApplicationTheme.DARK;--> +<!-- });--> - function download_data() { - const anchor = document.createElement("a"); - anchor.href = api_base("account/archive"); - anchor.click(); - anchor.remove(); - } +<!-- function download_data() {--> +<!-- const anchor = document.createElement("a");--> +<!-- anchor.href = api_base("account/archive");--> +<!-- anchor.click();--> +<!-- anchor.remove();--> +<!-- }--> - async function handle_logout() { - await clear_session_async(); - await end_session_async(); - clear_entries(); - await replace("/login"); - } -</script> +<!-- async function handle_logout() {--> +<!-- await clear_session_async();--> +<!-- await end_session_async();--> +<!-- clear_entries();--> +<!-- await replace("/login");--> +<!-- }--> +<!--</script>--> -<AccessTokensModal open={access_token_modal_is_open} - on:close={() => access_token_modal_is_open = false}/> +<!--<AccessTokensModal open={access_token_modal_is_open}--> +<!-- on:close={() => access_token_modal_is_open = false}/>--> -<FileImportModal open="{file_import_modal_is_open}" - on:close={() => file_import_modal_is_open = false}/> +<!--<FileImportModal open="{file_import_modal_is_open}"--> +<!-- on:close={() => file_import_modal_is_open = false}/>--> -<Header company="IOL" - platformName="Bookmark Thing"> - <HeaderUtilities> - <HeaderAction aria-label="Settings" - bind:isOpen={options_dropdown_is_open} - icon={SettingsAdjust20} - closeIcon={SettingsAdjust20} - transition={false}> - <HeaderPanelLinks> - <HeaderPanelDivider>Actions</HeaderPanelDivider> - <HeaderPanelLink on:click={() => alert("Not implemented")}>Import data from file</HeaderPanelLink> - <HeaderPanelLink on:click={() => alert("Not implemented")}>Connect github</HeaderPanelLink> - <HeaderPanelDivider>Options</HeaderPanelDivider> - <HeaderPanelToggle size="sm" - on:toggle={() => set_site_report_state(!enable_site_report)} - toggled="{enable_site_report}"> - <span>Enable site report</span> - <Tooltip tooltipBodyId="tooltip-body" - icon={Help16}> - <div id="tooltip-body"> - A service that runs and provides insights when you write a FQDN inside of the entry form. - 1.Checks if the url is alive - 2.Checks if the url is already in your database - 3.Autopopulates the entry description based on the sites own description - </div> - </Tooltip> - </HeaderPanelToggle> - <HeaderPanelToggle size="sm" - on:toggle={() => set_theme(enable_dark_theme ? ApplicationTheme.LIGHT : ApplicationTheme.DARK)} - toggled="{enable_dark_theme}"> - Use dark theme - </HeaderPanelToggle> - </HeaderPanelLinks> - </HeaderAction> - <HeaderAction aria-label="Profile" - bind:isOpen={profile_dropdown_is_open} - icon={UserAvatarFilledAlt20} - closeIcon={UserAvatarFilledAlt20} - transition={false}> - <HeaderPanelLinks> - <HeaderPanelDivider>Logged in as {$session?.username}</HeaderPanelDivider> - <HeaderPanelLink on:click={() => alert("Not implemented")}>Manage profile</HeaderPanelLink> - <HeaderPanelLink on:click={() => access_token_modal_is_open = true}>Manage access tokens</HeaderPanelLink> - <HeaderPanelLink on:click={download_data}>Download data</HeaderPanelLink> - <HeaderPanelLink on:click={handle_logout}>Log out</HeaderPanelLink> - </HeaderPanelLinks> - </HeaderAction> - </HeaderUtilities> -</Header> +<!--<Header company="IOL"--> +<!-- platformName="Bookmark Thing">--> +<!-- <HeaderUtilities>--> +<!-- <HeaderAction aria-label="Settings"--> +<!-- bind:isOpen={options_dropdown_is_open}--> +<!-- icon={SettingsAdjust20}--> +<!-- closeIcon={SettingsAdjust20}--> +<!-- transition={false}>--> +<!-- <HeaderPanelLinks>--> +<!-- <HeaderPanelDivider>Actions</HeaderPanelDivider>--> +<!-- <HeaderPanelLink on:click={() => alert("Not implemented")}>Import data from file</HeaderPanelLink>--> +<!-- <HeaderPanelLink on:click={() => alert("Not implemented")}>Connect github</HeaderPanelLink>--> +<!-- <HeaderPanelDivider>Options</HeaderPanelDivider>--> +<!-- <HeaderPanelToggle size="sm"--> +<!-- on:toggle={() => set_site_report_state(!enable_site_report)}--> +<!-- toggled="{enable_site_report}">--> +<!-- <span>Enable site report</span>--> +<!-- <Tooltip tooltipBodyId="tooltip-body"--> +<!-- icon={Help16}>--> +<!-- <div id="tooltip-body">--> +<!-- A service that runs and provides insights when you write a FQDN inside of the entry form.--> +<!-- 1.Checks if the url is alive--> +<!-- 2.Checks if the url is already in your database--> +<!-- 3.Autopopulates the entry description based on the sites own description--> +<!-- </div>--> +<!-- </Tooltip>--> +<!-- </HeaderPanelToggle>--> +<!-- <HeaderPanelToggle size="sm"--> +<!-- on:toggle={() => set_theme(enable_dark_theme ? ApplicationTheme.LIGHT : ApplicationTheme.DARK)}--> +<!-- toggled="{enable_dark_theme}">--> +<!-- Use dark theme--> +<!-- </HeaderPanelToggle>--> +<!-- </HeaderPanelLinks>--> +<!-- </HeaderAction>--> +<!-- <HeaderAction aria-label="Profile"--> +<!-- bind:isOpen={profile_dropdown_is_open}--> +<!-- icon={UserAvatarFilledAlt20}--> +<!-- closeIcon={UserAvatarFilledAlt20}--> +<!-- transition={false}>--> +<!-- <HeaderPanelLinks>--> +<!-- <HeaderPanelDivider>Logged in as {$session?.username}</HeaderPanelDivider>--> +<!-- <HeaderPanelLink on:click={() => alert("Not implemented")}>Manage profile</HeaderPanelLink>--> +<!-- <HeaderPanelLink on:click={() => access_token_modal_is_open = true}>Manage access tokens</HeaderPanelLink>--> +<!-- <HeaderPanelLink on:click={download_data}>Download data</HeaderPanelLink>--> +<!-- <HeaderPanelLink on:click={handle_logout}>Log out</HeaderPanelLink>--> +<!-- </HeaderPanelLinks>--> +<!-- </HeaderAction>--> +<!-- </HeaderUtilities>--> +<!--</Header>--> diff --git a/src/webapp/src/routes/app/home.svelte b/src/webapp/src/routes/app/home.svelte index 5b0b141..1714c5b 100644 --- a/src/webapp/src/routes/app/home.svelte +++ b/src/webapp/src/routes/app/home.svelte @@ -1,26 +1,26 @@ -<script lang="ts"> - import EntryForm from "@/components/forms/entry-form.svelte"; - import EntryList from "@/components/entry-list.svelte"; - import Header from "./_header.svelte"; - import { - Column, - Content, - Grid, - Row - } from "carbon-components-svelte"; -</script> +<!--<script lang="ts">--> +<!-- import EntryForm from "@/components/forms/entry-form.svelte";--> +<!-- import EntryList from "@/components/entry-list.svelte";--> +<!-- import Header from "./_header.svelte";--> +<!-- import {--> +<!-- Column,--> +<!-- Content,--> +<!-- Grid,--> +<!-- Row--> +<!-- } from "carbon-components-svelte";--> +<!--</script>--> -<Header/> +<!--<Header/>--> -<Content> - <Grid> - <Row> - <Column> - <EntryForm/> - </Column> - <Column> - <EntryList/> - </Column> - </Row> - </Grid> -</Content> +<!--<Content>--> +<!-- <Grid>--> +<!-- <Row>--> +<!-- <Column>--> +<!-- <EntryForm/>--> +<!-- </Column>--> +<!-- <Column>--> +<!-- <EntryList/>--> +<!-- </Column>--> +<!-- </Row>--> +<!-- </Grid>--> +<!--</Content>--> diff --git a/src/webapp/src/routes/app/modals/access-tokens-modal.svelte b/src/webapp/src/routes/app/modals/access-tokens-modal.svelte index d550f95..99c6685 100644 --- a/src/webapp/src/routes/app/modals/access-tokens-modal.svelte +++ b/src/webapp/src/routes/app/modals/access-tokens-modal.svelte @@ -1,151 +1,151 @@ -<script lang="ts"> - import {delete_token_async, get_tokens_async} from "@/lib/api/account"; - import {Modal, DataTable, ToolbarContent, Toolbar, ToolbarMenu, ToolbarMenuItem, Button, OverflowMenu, OverflowMenuItem, CodeSnippet, Link} from "carbon-components-svelte"; - import {onMount} from "svelte"; - import type {IAccessToken} from "@/lib/models/IAccessToken"; - import {api_docs} from "@/lib/configuration"; - import NewAccessTokenModal from "./new-access-token-modal.svelte"; +<!--<script lang="ts">--> +<!-- import {delete_token_async, get_tokens_async} from "@/lib/api/account";--> +<!-- import {Modal, DataTable, ToolbarContent, Toolbar, ToolbarMenu, ToolbarMenuItem, Button, OverflowMenu, OverflowMenuItem, CodeSnippet, Link} from "carbon-components-svelte";--> +<!-- import {onMount} from "svelte";--> +<!-- import type {IAccessToken} from "@/lib/models/IAccessToken";--> +<!-- import {api_docs} from "@/lib/configuration";--> +<!-- import NewAccessTokenModal from "./new-access-token-modal.svelte";--> - export let open; - let loading_tokens_table; - let tokens = [] as Array<IAccessToken>; - let create_access_token_modal_is_open = false; - let copy_access_token_modal_is_open = false; - let new_access_token = ""; - const table_headers = [ - {key: "created", value: "Created"}, - {key: "expiry_date", value: "Expires"}, - {key: "permissions", value: "Permissions"}, - {key: "overflow", empty: true}, - ]; +<!-- export let open;--> +<!-- let loading_tokens_table;--> +<!-- let tokens = [] as Array<IAccessToken>;--> +<!-- let create_access_token_modal_is_open = false;--> +<!-- let copy_access_token_modal_is_open = false;--> +<!-- let new_access_token = "";--> +<!-- const table_headers = [--> +<!-- {key: "created", value: "Created"},--> +<!-- {key: "expiry_date", value: "Expires"},--> +<!-- {key: "permissions", value: "Permissions"},--> +<!-- {key: "overflow", empty: true},--> +<!-- ];--> - function create_permission_string(token: IAccessToken): string { - let permission_string = ""; - if (token.allow_create) permission_string += "create"; - if (token.allow_read) permission_string += " read"; - if (token.allow_update) permission_string += " update"; - if (token.allow_delete) permission_string += " delete"; - return permission_string; - } +<!-- function create_permission_string(token: IAccessToken): string {--> +<!-- let permission_string = "";--> +<!-- if (token.allow_create) permission_string += "create";--> +<!-- if (token.allow_read) permission_string += " read";--> +<!-- if (token.allow_update) permission_string += " update";--> +<!-- if (token.allow_delete) permission_string += " delete";--> +<!-- return permission_string;--> +<!-- }--> - async function load_tokens() { - loading_tokens_table = true; - const get_tokens_request = await get_tokens_async(); - loading_tokens_table = false; - if (get_tokens_request.ok) { - const response_json = await get_tokens_request.json(); - if (response_json?.length > 0) { - const new_tokens = []; - for (const token of response_json as Array<IAccessToken>) { - new_tokens.push({ - id: token.id, - expiry_date: new Date(token.expiry_date).toLocaleDateString(), - created: new Date(token.created).toLocaleDateString(), - permissions: create_permission_string(token), - }); - } - tokens = new_tokens; - } else { - tokens = []; - } - } else { - tokens = []; - } - } +<!-- async function load_tokens() {--> +<!-- loading_tokens_table = true;--> +<!-- const get_tokens_request = await get_tokens_async();--> +<!-- loading_tokens_table = false;--> +<!-- if (get_tokens_request.ok) {--> +<!-- const response_json = await get_tokens_request.json();--> +<!-- if (response_json?.length > 0) {--> +<!-- const new_tokens = [];--> +<!-- for (const token of response_json as Array<IAccessToken>) {--> +<!-- new_tokens.push({--> +<!-- id: token.id,--> +<!-- expiry_date: new Date(token.expiry_date).toLocaleDateString(),--> +<!-- created: new Date(token.created).toLocaleDateString(),--> +<!-- permissions: create_permission_string(token),--> +<!-- });--> +<!-- }--> +<!-- tokens = new_tokens;--> +<!-- } else {--> +<!-- tokens = [];--> +<!-- }--> +<!-- } else {--> +<!-- tokens = [];--> +<!-- }--> +<!-- }--> - async function delete_token(event) { - const row = event.target.closest("tr"); - const id = row.id.substring(4, row.id.length); - if (confirm("Are you sure you want to delete this token?")) { - const http_request = await delete_token_async(id); - if (http_request.ok) { - await load_tokens(); - } - } - } +<!-- async function delete_token(event) {--> +<!-- const row = event.target.closest("tr");--> +<!-- const id = row.id.substring(4, row.id.length);--> +<!-- if (confirm("Are you sure you want to delete this token?")) {--> +<!-- const http_request = await delete_token_async(id);--> +<!-- if (http_request.ok) {--> +<!-- await load_tokens();--> +<!-- }--> +<!-- }--> +<!-- }--> - async function delete_all_tokens() { - if (confirm("Are you sure you want to delete all tokens?")) { - for (const token of tokens) { - await delete_token_async(token.id); - } - await load_tokens(); - } - } +<!-- async function delete_all_tokens() {--> +<!-- if (confirm("Are you sure you want to delete all tokens?")) {--> +<!-- for (const token of tokens) {--> +<!-- await delete_token_async(token.id);--> +<!-- }--> +<!-- await load_tokens();--> +<!-- }--> +<!-- }--> - async function handle_token_created(e) { - const token = e.detail; - console.log("Created token", token); - create_access_token_modal_is_open = false; - new_access_token = token; - copy_access_token_modal_is_open = true; - await load_tokens(); - } +<!-- async function handle_token_created(e) {--> +<!-- const token = e.detail;--> +<!-- console.log("Created token", token);--> +<!-- create_access_token_modal_is_open = false;--> +<!-- new_access_token = token;--> +<!-- copy_access_token_modal_is_open = true;--> +<!-- await load_tokens();--> +<!-- }--> - function copy_access_token_modal_closed() { - new_access_token = ""; - copy_access_token_modal_is_open = false; - } +<!-- function copy_access_token_modal_closed() {--> +<!-- new_access_token = "";--> +<!-- copy_access_token_modal_is_open = false;--> +<!-- }--> - onMount(async () => { - await load_tokens(); - }); -</script> +<!-- onMount(async () => {--> +<!-- await load_tokens();--> +<!-- });--> +<!--</script>--> -<Modal size="lg" - passiveModal="{true}" - {open} - preventCloseOnClickOutside - modalHeading="Manage access tokens" - on:open - on:close> - <DataTable size="compact" - sortable="{true}" - headers={table_headers} - style="padding-bottom: 50px" - rows={tokens}> - <Toolbar size="sm"> - <ToolbarContent> - <ToolbarMenu> - <ToolbarMenuItem> - <Link href="{api_docs}" - target="_blank">API documentation - </Link> - </ToolbarMenuItem> - <ToolbarMenuItem danger - on:click={delete_all_tokens}> - Delete all tokens - </ToolbarMenuItem> - </ToolbarMenu> - <Button on:click={() => create_access_token_modal_is_open = true}>Create token</Button> - </ToolbarContent> - </Toolbar> - <svelte:fragment slot="cell" - let:cell> - {#if cell.key === "overflow"} - <OverflowMenu flipped - size="sm"> - <OverflowMenuItem danger - on:click={delete_token} - text="Delete"/> - </OverflowMenu> - {:else} - {cell.value} - {/if} - </svelte:fragment> - </DataTable> -</Modal> +<!--<Modal size="lg"--> +<!-- passiveModal="{true}"--> +<!-- {open}--> +<!-- preventCloseOnClickOutside--> +<!-- modalHeading="Manage access tokens"--> +<!-- on:open--> +<!-- on:close>--> +<!-- <DataTable size="compact"--> +<!-- sortable="{true}"--> +<!-- headers={table_headers}--> +<!-- style="padding-bottom: 50px"--> +<!-- rows={tokens}>--> +<!-- <Toolbar size="sm">--> +<!-- <ToolbarContent>--> +<!-- <ToolbarMenu>--> +<!-- <ToolbarMenuItem>--> +<!-- <Link href="{api_docs}"--> +<!-- target="_blank">API documentation--> +<!-- </Link>--> +<!-- </ToolbarMenuItem>--> +<!-- <ToolbarMenuItem danger--> +<!-- on:click={delete_all_tokens}>--> +<!-- Delete all tokens--> +<!-- </ToolbarMenuItem>--> +<!-- </ToolbarMenu>--> +<!-- <Button on:click={() => create_access_token_modal_is_open = true}>Create token</Button>--> +<!-- </ToolbarContent>--> +<!-- </Toolbar>--> +<!-- <svelte:fragment slot="cell"--> +<!-- let:cell>--> +<!-- {#if cell.key === "overflow"}--> +<!-- <OverflowMenu flipped--> +<!-- size="sm">--> +<!-- <OverflowMenuItem danger--> +<!-- on:click={delete_token}--> +<!-- text="Delete"/>--> +<!-- </OverflowMenu>--> +<!-- {:else}--> +<!-- {cell.value}--> +<!-- {/if}--> +<!-- </svelte:fragment>--> +<!-- </DataTable>--> +<!--</Modal>--> -<Modal size="sm" - passiveModal="{true}" - preventCloseOnClickOutside - modalHeading="Your access token" - modalDescription="This will only be shown once" - on:close={copy_access_token_modal_closed} - open={copy_access_token_modal_is_open}> - <CodeSnippet code={new_access_token}/> - <br> -</Modal> +<!--<Modal size="sm"--> +<!-- passiveModal="{true}"--> +<!-- preventCloseOnClickOutside--> +<!-- modalHeading="Your access token"--> +<!-- modalDescription="This will only be shown once"--> +<!-- on:close={copy_access_token_modal_closed}--> +<!-- open={copy_access_token_modal_is_open}>--> +<!-- <CodeSnippet code={new_access_token}/>--> +<!-- <br>--> +<!--</Modal>--> -<NewAccessTokenModal bind:open={create_access_token_modal_is_open} - on:created={handle_token_created}/> +<!--<NewAccessTokenModal bind:open={create_access_token_modal_is_open}--> +<!-- on:created={handle_token_created}/>--> diff --git a/src/webapp/src/routes/app/modals/file-import-modal.svelte b/src/webapp/src/routes/app/modals/file-import-modal.svelte index b013688..bc18d75 100644 --- a/src/webapp/src/routes/app/modals/file-import-modal.svelte +++ b/src/webapp/src/routes/app/modals/file-import-modal.svelte @@ -1,126 +1,126 @@ -<script lang="ts"> - import {Modal, FileUploader, Select, SelectItem, Form, FormGroup} from "carbon-components-svelte"; +<!--<script lang="ts">--> +<!-- import {Modal, FileUploader, Select, SelectItem, Form, FormGroup} from "carbon-components-svelte";--> - export let open; +<!-- export let open;--> - let available_fields = []; - let import_json = []; +<!-- let available_fields = [];--> +<!-- let import_json = [];--> - const mappings = { - can_map: false, - url: { - value: "", - error: "", - validate() { - } - }, - tags: { - value: "", - error: "", - available_fields: [], - is_array: false, - validate() { - console.log(import_json); - const first_tag = import_json[0][mappings.tags.value]; - console.log(first_tag); - if (typeof first_tag === "object") { - for (const field in first_tag) { - mappings.tags.available_fields.push(field); - } - console.log(mappings.tags.available_fields); - mappings.tags.is_array = true; - } else { - mappings.tags.is_array = false; - } - } - }, - description: { - value: "", - error: "", - validate() { - } - } - }; +<!-- const mappings = {--> +<!-- can_map: false,--> +<!-- url: {--> +<!-- value: "",--> +<!-- error: "",--> +<!-- validate() {--> +<!-- }--> +<!-- },--> +<!-- tags: {--> +<!-- value: "",--> +<!-- error: "",--> +<!-- available_fields: [],--> +<!-- is_array: false,--> +<!-- validate() {--> +<!-- console.log(import_json);--> +<!-- const first_tag = import_json[0][mappings.tags.value];--> +<!-- console.log(first_tag);--> +<!-- if (typeof first_tag === "object") {--> +<!-- for (const field in first_tag) {--> +<!-- mappings.tags.available_fields.push(field);--> +<!-- }--> +<!-- console.log(mappings.tags.available_fields);--> +<!-- mappings.tags.is_array = true;--> +<!-- } else {--> +<!-- mappings.tags.is_array = false;--> +<!-- }--> +<!-- }--> +<!-- },--> +<!-- description: {--> +<!-- value: "",--> +<!-- error: "",--> +<!-- validate() {--> +<!-- }--> +<!-- }--> +<!-- };--> - async function file_input_change(e) { - const file = e.target.files[0]; - if (!file) return; - const text = await file.text(); - import_json = JSON.parse(text); - const first_entry = import_json[0]; - if (typeof first_entry !== "object") return; - for (const field in first_entry) { - available_fields.push(field); - } - mappings.can_map = available_fields.length >= 3; - } -</script> +<!-- async function file_input_change(e) {--> +<!-- const file = e.target.files[0];--> +<!-- if (!file) return;--> +<!-- const text = await file.text();--> +<!-- import_json = JSON.parse(text);--> +<!-- const first_entry = import_json[0];--> +<!-- if (typeof first_entry !== "object") return;--> +<!-- for (const field in first_entry) {--> +<!-- available_fields.push(field);--> +<!-- }--> +<!-- mappings.can_map = available_fields.length >= 3;--> +<!-- }--> +<!--</script>--> -<Modal size="lg" - passiveModal="{true}" - preventCloseOnClickOutside - modalHeading="Import entries from a json file" - on:close - bind:open={open}> +<!--<Modal size="lg"--> +<!-- passiveModal="{true}"--> +<!-- preventCloseOnClickOutside--> +<!-- modalHeading="Import entries from a json file"--> +<!-- on:close--> +<!-- bind:open={open}>--> - {#if mappings.can_map} - <Form> - <FormGroup legendText="Mappings" - noMargin - message - messageText="Map the fields you want to import"> - <Select inline - labelText="Url" - error="{mappings.url.error !== ''}" - errorMessage="{mappings.url.error}" - on:change={mappings.url.validate} - bind:selected={mappings.url.value}> - {#each available_fields as field} - <SelectItem value="{field}" - text="{field}"/> - {/each} - </Select> - <Select inline - labelText="Tags" - error="{mappings.tags.error !== ''}" - errorMessage="{mappings.tags.error}" - on:change={mappings.tags.validate} - bind:selected={mappings.tags.value}> - {#each available_fields as field} - <SelectItem value="{field}" - text="{field}"/> - {/each} - </Select> - {#if mappings.tags.available_fields.length > 0} - <Select inline - labelText="Tags" - error="{mappings.tags.error !== ''}" - errorMessage="{mappings.tags.error}" - bind:selected={mappings.tags.value}> - {#each mappings.tags.available_fields as field} - <SelectItem value="{field}" - text="{field}"/> - {/each} - </Select> - {/if} - <Select inline - labelText="Description" - error="{mappings.description.error !== ''}" - errorMessage="{mappings.description.error}" - on:change={mappings.description.validate} - bind:selected={mappings.description.value}> - {#each available_fields as field} - <SelectItem value="{field}" - text="{field}"/> - {/each} - </Select> - </FormGroup> - </Form> - {/if} - <FileUploader - buttonLabel="Select json file" - accept={[".json"]} - on:change={file_input_change} - status="" - /> -</Modal> +<!-- {#if mappings.can_map}--> +<!-- <Form>--> +<!-- <FormGroup legendText="Mappings"--> +<!-- noMargin--> +<!-- message--> +<!-- messageText="Map the fields you want to import">--> +<!-- <Select inline--> +<!-- labelText="Url"--> +<!-- error="{mappings.url.error !== ''}"--> +<!-- errorMessage="{mappings.url.error}"--> +<!-- on:change={mappings.url.validate}--> +<!-- bind:selected={mappings.url.value}>--> +<!-- {#each available_fields as field}--> +<!-- <SelectItem value="{field}"--> +<!-- text="{field}"/>--> +<!-- {/each}--> +<!-- </Select>--> +<!-- <Select inline--> +<!-- labelText="Tags"--> +<!-- error="{mappings.tags.error !== ''}"--> +<!-- errorMessage="{mappings.tags.error}"--> +<!-- on:change={mappings.tags.validate}--> +<!-- bind:selected={mappings.tags.value}>--> +<!-- {#each available_fields as field}--> +<!-- <SelectItem value="{field}"--> +<!-- text="{field}"/>--> +<!-- {/each}--> +<!-- </Select>--> +<!-- {#if mappings.tags.available_fields.length > 0}--> +<!-- <Select inline--> +<!-- labelText="Tags"--> +<!-- error="{mappings.tags.error !== ''}"--> +<!-- errorMessage="{mappings.tags.error}"--> +<!-- bind:selected={mappings.tags.value}>--> +<!-- {#each mappings.tags.available_fields as field}--> +<!-- <SelectItem value="{field}"--> +<!-- text="{field}"/>--> +<!-- {/each}--> +<!-- </Select>--> +<!-- {/if}--> +<!-- <Select inline--> +<!-- labelText="Description"--> +<!-- error="{mappings.description.error !== ''}"--> +<!-- errorMessage="{mappings.description.error}"--> +<!-- on:change={mappings.description.validate}--> +<!-- bind:selected={mappings.description.value}>--> +<!-- {#each available_fields as field}--> +<!-- <SelectItem value="{field}"--> +<!-- text="{field}"/>--> +<!-- {/each}--> +<!-- </Select>--> +<!-- </FormGroup>--> +<!-- </Form>--> +<!-- {/if}--> +<!-- <FileUploader--> +<!-- buttonLabel="Select json file"--> +<!-- accept={[".json"]}--> +<!-- on:change={file_input_change}--> +<!-- status=""--> +<!-- />--> +<!--</Modal>--> diff --git a/src/webapp/src/routes/app/modals/new-access-token-modal.svelte b/src/webapp/src/routes/app/modals/new-access-token-modal.svelte index c130328..9f55431 100644 --- a/src/webapp/src/routes/app/modals/new-access-token-modal.svelte +++ b/src/webapp/src/routes/app/modals/new-access-token-modal.svelte @@ -1,133 +1,133 @@ -<script lang="ts"> - import {Checkbox, Form, FormGroup, Modal} from "carbon-components-svelte"; - import NativeDateInput from "@/components/carbon-extras/NativeDateInput.svelte"; - import type {ICreateTokenRequest} from "@/lib/models/ICreateTokenRequest"; - import {create_token_async} from "@/lib/api/account"; - import {createEventDispatcher} from "svelte"; +<!--<script lang="ts">--> +<!-- import {Checkbox, Form, FormGroup, Modal} from "carbon-components-svelte";--> +<!-- import NativeDateInput from "@/components/carbon-extras/NativeDateInput.svelte";--> +<!-- import type {ICreateTokenRequest} from "@/lib/models/ICreateTokenRequest";--> +<!-- import {create_token_async} from "@/lib/api/account";--> +<!-- import {createEventDispatcher} from "svelte";--> - export let open = false; - const date = new Date(); - date.setDate(date.getDate() + 1); - const default_expiry_date = date; - const dispatch = createEventDispatcher(); - const form = { - error: "", - loading: false, - expiry_date: { - value: default_expiry_date, - error: "", - warning: "", - reset() { - form.expiry_date.value = default_expiry_date; - }, - change() { - }, - validate() { - } - }, - allow_create: { - value: false, - error: "", - warning: "", - reset() { - form.allow_create.value = false; - }, - change() { - }, - validate() { - } - }, - allow_read: { - value: false, - error: "", - warning: "", - reset() { - form.allow_read.value = false; - }, - change() { - }, - validate() { - } - }, - allow_update: { - value: false, - error: "", - warning: "", - reset() { - form.allow_update.value = false; - }, - change() { - }, - validate() { - } - }, - allow_delete: { - value: false, - error: "", - warning: "", - reset() { - form.allow_delete.value = false; - }, - change() { - }, - validate() { - } - }, - reset() { - form.allow_read.reset(); - form.allow_delete.reset(); - form.allow_update.reset(); - form.allow_create.reset(); - form.expiry_date.reset(); - }, - payload(): ICreateTokenRequest { - return { - allow_delete: form.allow_delete.value, - allow_read: form.allow_read.value, - allow_update: form.allow_update.value, - allow_create: form.allow_create.value, - expiry_date: form.expiry_date.value, - } as ICreateTokenRequest; - }, - async submit() { - form.loading = true; - const http_request = await create_token_async(form.payload()); - form.loading = false; - if (http_request.ok) { - dispatch("created", await http_request.text()); - } - } - }; -</script> +<!-- export let open = false;--> +<!-- const date = new Date();--> +<!-- date.setDate(date.getDate() + 1);--> +<!-- const default_expiry_date = date;--> +<!-- const dispatch = createEventDispatcher();--> +<!-- const form = {--> +<!-- error: "",--> +<!-- loading: false,--> +<!-- expiry_date: {--> +<!-- value: default_expiry_date,--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- reset() {--> +<!-- form.expiry_date.value = default_expiry_date;--> +<!-- },--> +<!-- change() {--> +<!-- },--> +<!-- validate() {--> +<!-- }--> +<!-- },--> +<!-- allow_create: {--> +<!-- value: false,--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- reset() {--> +<!-- form.allow_create.value = false;--> +<!-- },--> +<!-- change() {--> +<!-- },--> +<!-- validate() {--> +<!-- }--> +<!-- },--> +<!-- allow_read: {--> +<!-- value: false,--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- reset() {--> +<!-- form.allow_read.value = false;--> +<!-- },--> +<!-- change() {--> +<!-- },--> +<!-- validate() {--> +<!-- }--> +<!-- },--> +<!-- allow_update: {--> +<!-- value: false,--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- reset() {--> +<!-- form.allow_update.value = false;--> +<!-- },--> +<!-- change() {--> +<!-- },--> +<!-- validate() {--> +<!-- }--> +<!-- },--> +<!-- allow_delete: {--> +<!-- value: false,--> +<!-- error: "",--> +<!-- warning: "",--> +<!-- reset() {--> +<!-- form.allow_delete.value = false;--> +<!-- },--> +<!-- change() {--> +<!-- },--> +<!-- validate() {--> +<!-- }--> +<!-- },--> +<!-- reset() {--> +<!-- form.allow_read.reset();--> +<!-- form.allow_delete.reset();--> +<!-- form.allow_update.reset();--> +<!-- form.allow_create.reset();--> +<!-- form.expiry_date.reset();--> +<!-- },--> +<!-- payload(): ICreateTokenRequest {--> +<!-- return {--> +<!-- allow_delete: form.allow_delete.value,--> +<!-- allow_read: form.allow_read.value,--> +<!-- allow_update: form.allow_update.value,--> +<!-- allow_create: form.allow_create.value,--> +<!-- expiry_date: form.expiry_date.value,--> +<!-- } as ICreateTokenRequest;--> +<!-- },--> +<!-- async submit() {--> +<!-- form.loading = true;--> +<!-- const http_request = await create_token_async(form.payload());--> +<!-- form.loading = false;--> +<!-- if (http_request.ok) {--> +<!-- dispatch("created", await http_request.text());--> +<!-- }--> +<!-- }--> +<!-- };--> +<!--</script>--> -<Modal modalHeading="Create access token" - preventCloseOnClickOutside - hasForm - primaryButtonText="Submit" - secondaryButtonText="Cancel" - style="padding-bottom: 50px;padding-right: 30px;" - on:click:button--secondary={() => open = false} - bind:open={open} - on:submit={form.submit}> - <Form> - <FormGroup> - <NativeDateInput label="Expiry date" - minDate="{new Date()}" - bind:value={form.expiry_date.value}/> - </FormGroup> - <FormGroup legendText="Permissions"> - <Checkbox id="permission-create" - labelText="Create" - bind:checked="{form.allow_create.value}"/> - <Checkbox id="permission-read" - labelText="Read" - bind:checked="{form.allow_read.value}"/> - <Checkbox id="permission-update" - labelText="Update" - bind:checked="{form.allow_update.value}"/> - <Checkbox id="permission-delete" - labelText="Delete" - bind:checked="{form.allow_delete.value}"/> - </FormGroup> - </Form> -</Modal> +<!--<Modal modalHeading="Create access token"--> +<!-- preventCloseOnClickOutside--> +<!-- hasForm--> +<!-- primaryButtonText="Submit"--> +<!-- secondaryButtonText="Cancel"--> +<!-- style="padding-bottom: 50px;padding-right: 30px;"--> +<!-- on:click:button--secondary={() => open = false}--> +<!-- bind:open={open}--> +<!-- on:submit={form.submit}>--> +<!-- <Form>--> +<!-- <FormGroup>--> +<!-- <NativeDateInput label="Expiry date"--> +<!-- minDate="{new Date()}"--> +<!-- bind:value={form.expiry_date.value}/>--> +<!-- </FormGroup>--> +<!-- <FormGroup legendText="Permissions">--> +<!-- <Checkbox id="permission-create"--> +<!-- labelText="Create"--> +<!-- bind:checked="{form.allow_create.value}"/>--> +<!-- <Checkbox id="permission-read"--> +<!-- labelText="Read"--> +<!-- bind:checked="{form.allow_read.value}"/>--> +<!-- <Checkbox id="permission-update"--> +<!-- labelText="Update"--> +<!-- bind:checked="{form.allow_update.value}"/>--> +<!-- <Checkbox id="permission-delete"--> +<!-- labelText="Delete"--> +<!-- bind:checked="{form.allow_delete.value}"/>--> +<!-- </FormGroup>--> +<!-- </Form>--> +<!--</Modal>--> diff --git a/src/webapp/src/routes/public/login.svelte b/src/webapp/src/routes/public/login.svelte index c0d65a6..b70267c 100644 --- a/src/webapp/src/routes/public/login.svelte +++ b/src/webapp/src/routes/public/login.svelte @@ -1,21 +1,120 @@ <script lang="ts"> - import {replace} from "svelte-spa-router"; - import LoginForm from "@/components/forms/login-form.svelte"; - import {Column, Content, Grid, Row} from "carbon-components-svelte"; + import { replace } from "svelte-spa-router"; + import { start_session_async } from "@/lib/stores/session"; + import type { ICreateSessionRequest } from "@/lib/models/ICreateSessionRequest"; + import type { IErrorResult } from "@/lib/models/IErrorResult"; + import { api_base } from "@/lib/configuration"; + import { + TextInput, + PasswordInput, + InlineNotification, + Button, + Checkbox, + } from "@/components/ui"; - async function handle_authenticated() { - await replace("/app"); - } + const form = { + loading: false, + error: {} as IErrorResult, + username: { + value: "", + error: "", + validate() { + form.username.error = ""; + let is_valid = true; + if (!form.username.value) { + form.username.error = "Username is required"; + is_valid = false; + } + return is_valid; + }, + }, + password: { + value: "", + error: "", + validate() { + form.password.error = ""; + let is_valid = true; + if (!form.password.value) { + form.password.error = "Password is required"; + is_valid = false; + } + return is_valid; + }, + }, + persist: { + value: false, + error: "", + validate() { + return true; + }, + }, + is_valid() { + const username_is_valid = form.username.validate(); + const password_is_valid = form.password.validate(); + const persist_is_valid = form.persist.validate(); + return username_is_valid && password_is_valid && persist_is_valid; + }, + payload(): ICreateSessionRequest { + return { + username: this.username.value, + password: this.password.value, + persist: this.persist.value, + } as ICreateSessionRequest; + }, + async submit() { + if (!form.is_valid()) return; + form.error = {} as IErrorResult; + form.loading = true; + const login_request = await start_session_async(form.payload()); + form.loading = false; + if (login_request.ok) { + await replace("/app"); + } else if (login_request.error) { + form.error = login_request.error; + } + }, + }; </script> -<Content> - <Grid noGutter={true}> - <Row> - <Column sm={12} - md={6} - lg={6}> - <LoginForm on:authenticated={handle_authenticated}/> - </Column> - </Row> - </Grid> -</Content> +<form on:submit={form.submit} class="flex flex-col max-w-sm m-5"> + <h1 class="text-2xl pb-2">Login</h1> + {#if form.error.title || form.error.text} + <InlineNotification + hide_close_button + title={form.error.title ?? ""} + subtitle={form.error.text ?? ""} + /> + {/if} + <div class="flex flex-col gap-y-1.5"> + <TextInput + type="text" + placeholder="Username" + invalid={form.username.error !== ""} + invalid_text={form.username.error} + bind:value={form.username.value} + /> + + <PasswordInput + placeholder="Password" + invalid={form.password.error !== ""} + invalid_text={form.password.error} + bind:value={form.password.value} + /> + </div> + <div> + <Checkbox + name="persist" + label_text="Persist session" + bind:checked={form.persist.value} + /> + <Button type="submit" disabled={form.loading}>Submit</Button> + </div> + <div> + <Button + kind="secondary" + href={api_base("account/create-github-session")} + > + Login with Github + </Button> + </div> +</form> diff --git a/src/webapp/src/vite-env.d.ts b/src/webapp/src/vite-env.d.ts index 33a0646..4078e74 100644 --- a/src/webapp/src/vite-env.d.ts +++ b/src/webapp/src/vite-env.d.ts @@ -1,3 +1,2 @@ /// <reference types="svelte" /> /// <reference types="vite/client" /> -/// <reference types="validator" /> diff --git a/src/webapp/svelte.config.js b/src/webapp/svelte.config.js index 866775a..b45af77 100644 --- a/src/webapp/svelte.config.js +++ b/src/webapp/svelte.config.js @@ -1,6 +1,9 @@ import sveltePreprocess from "svelte-preprocess"; -import {optimizeImports} from "carbon-preprocess-svelte"; export default { - preprocess: [sveltePreprocess(), optimizeImports()], + preprocess: [ + sveltePreprocess({ + postcss: true, + }), + ], }; diff --git a/src/webapp/tailwind.config.cjs b/src/webapp/tailwind.config.cjs new file mode 100644 index 0000000..ccfc63f --- /dev/null +++ b/src/webapp/tailwind.config.cjs @@ -0,0 +1,121 @@ +const forms = require("@tailwindcss/forms"); + +module.exports = { + darkMode: "class", + content: ["./src/**/*.{html,js,svelte,ts}"], + plugins: [forms], + theme: { + extend: { + colors: { + gray: { + "50": "#f9fafb", + "100": "#f0f1f3", + "200": "#d9dbdf", + "300": "#b7bbc2", + "400": "#8f959f", + "500": "#6e7582", + "600": "#555e6e", + "700": "#3e4859", + "800": "#283242", + "900": "#131f30", + }, + cerise: { + "50": "#fff6f6", + "100": "#ffefef", + "200": "#f9d3d3", + "300": "#eaa6a6", + "400": "#e56d6d", + "500": "#d93c3e", + "600": "#bd0e0f", + "700": "#930705", + "800": "#680605", + "900": "#470201", + }, + orange: { + "50": "#fff8f1", + "100": "#fbecdf", + "200": "#f6d7bf", + "300": "#e5ad8b", + "400": "#d67a4a", + "500": "#c4540b", + "600": "#9c4303", + "700": "#713707", + "800": "#4a2702", + "900": "#2c1b01", + }, + lemon: { + "50": "#fdfdea", + "100": "#fdf6be", + "200": "#f5e27b", + "300": "#d9bd2f", + "400": "#b6930d", + "500": "#967100", + "600": "#805501", + "700": "#643e02", + "800": "#422a00", + "900": "#271a00", + }, + green: { + "50": "#f3faf7", + "100": "#daf5eb", + "200": "#b6e5d3", + "300": "#85c8ac", + "400": "#3ca773", + "500": "#108835", + "600": "#016d00", + "700": "#005301", + "800": "#003906", + "900": "#072408", + }, + leaf: { + "50": "#edfafa", + "100": "#d5f5f6", + "200": "#aae7ea", + "300": "#69c8ce", + "400": "#13a2ad", + "500": "#0d828d", + "600": "#056874", + "700": "#06505c", + "800": "#043744", + "900": "#01222f", + }, + azure: { + "50": "#f4faff", + "100": "#e2f0ff", + "200": "#c4defe", + "300": "#95bbee", + "400": "#5e95e4", + "500": "#2173e6", + "600": "#1358cc", + "700": "#1242a2", + "800": "#1a2e6c", + "900": "#161d38", + }, + blue: { + "50": "#f5f8ff", + "100": "#e5edff", + "200": "#ccdafc", + "300": "#a5b8e9", + "400": "#7c91e1", + "500": "#5c69e9", + "600": "#4a46e1", + "700": "#3a31b9", + "800": "#282284", + "900": "#191452", + }, + indigo: { + "50": "#faf9ff", + "100": "#f1effe", + "200": "#dcd7fc", + "300": "#bcb2f2", + "400": "#9e86e5", + "500": "#895ddb", + "600": "#8335c8", + "700": "#6620a9", + "800": "#48147b", + "900": "#2f0d4d", + }, + } + } + } +}; diff --git a/src/webapp/tsconfig.json b/src/webapp/tsconfig.json index c143677..dbf7e23 100644 --- a/src/webapp/tsconfig.json +++ b/src/webapp/tsconfig.json @@ -8,6 +8,10 @@ "baseUrl": ".", "allowJs": true, "checkJs": true, + "types": [ + "vite/client", + "@types/validator" + ], "paths": { "@/*": [ "src/*" diff --git a/src/webapp/vite.config.js b/src/webapp/vite.config.js index 8cbaae5..d8571ec 100644 --- a/src/webapp/vite.config.js +++ b/src/webapp/vite.config.js @@ -1,14 +1,13 @@ import {defineConfig} from "vite"; import {svelte} from "@sveltejs/vite-plugin-svelte"; import path from "path"; -import {optimizeCss} from "carbon-preprocess-svelte"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [svelte(), process.env.NODE_ENV === "production" && optimizeCss()], + plugins: [svelte()], resolve: { alias: { - "@": path.resolve("/src"), + "@": "/src", }, }, }); |
