Compare commits

..

6 Commits

Author SHA1 Message Date
relaxed
5b75d45910 add is login requied 2024-12-25 13:47:09 +05:00
relaxed
9cc85a2525 pizzas: fix 2, wtf 2024-12-25 13:10:50 +05:00
relaxed
c4c52809d2 pizzas: 2 2024-12-25 13:03:35 +05:00
relaxed
432e75526f add boolean 2024-12-25 12:59:45 +05:00
relaxed
b218b7c7e3 pizzas: 1 2024-12-25 12:47:39 +05:00
relaxed
7c29c46eec fix login 2024-12-25 12:47:26 +05:00
51 changed files with 4420 additions and 5142 deletions

325
bun.lock
View File

@ -1,325 +0,0 @@
{
"lockfileVersion": 1,
"workspaces": {
"": {
"name": "wdb",
"dependencies": {
"@tauri-apps/api": "2.2.0",
"@tauri-apps/plugin-fs": "2.0.4",
"@tauri-apps/plugin-opener": "2.2.3",
"@tauri-apps/plugin-shell": "2.2.0",
"@tauri-apps/plugin-sql": "2.0.2",
},
"devDependencies": {
"@sveltejs/adapter-static": "3.0.8",
"@sveltejs/kit": "2.15.2",
"@sveltejs/vite-plugin-svelte": "5.0.3",
"@tailwindcss/vite": "^4.0.17",
"@tauri-apps/cli": "2.2.2",
"svelte": "5.17.3",
"svelte-check": "4.1.3",
"typescript": "5.6.3",
"vite": "6.0.7",
},
},
},
"packages": {
"@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="],
"@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="],
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="],
"@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="],
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="],
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="],
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="],
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="],
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="],
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="],
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="],
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="],
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="],
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="],
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="],
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="],
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="],
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="],
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="],
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="],
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="],
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="],
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="],
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="],
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="],
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
"@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
"@polka/url": ["@polka/url@1.0.0-next.28", "", {}, "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw=="],
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.30.1", "", { "os": "android", "cpu": "arm" }, "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q=="],
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.30.1", "", { "os": "android", "cpu": "arm64" }, "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w=="],
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q=="],
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA=="],
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.30.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ=="],
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw=="],
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg=="],
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug=="],
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw=="],
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA=="],
"@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.30.1", "", { "os": "linux", "cpu": "none" }, "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ=="],
"@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.30.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw=="],
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.30.1", "", { "os": "linux", "cpu": "none" }, "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw=="],
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.30.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA=="],
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg=="],
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow=="],
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw=="],
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.30.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw=="],
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og=="],
"@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.8", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg=="],
"@sveltejs/kit": ["@sveltejs/kit@2.15.2", "", { "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.1", "import-meta-resolve": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0", "tiny-glob": "^0.2.9" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0" }, "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-p208T1kdM6zd8k4YXIUM60pLWQ8dZqehXSiqn4NulXHyHibX53uIAL2xtNL8GjxX2IVPqPRT978MwVYhCKExdQ=="],
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.0.3", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.0", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.15", "vitefu": "^1.0.4" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw=="],
"@sveltejs/vite-plugin-svelte-inspector": ["@sveltejs/vite-plugin-svelte-inspector@4.0.1", "", { "dependencies": { "debug": "^4.3.7" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.0", "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw=="],
"@tailwindcss/node": ["@tailwindcss/node@4.0.17", "", { "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "tailwindcss": "4.0.17" } }, "sha512-LIdNwcqyY7578VpofXyqjH6f+3fP4nrz7FBLki5HpzqjYfXdF2m/eW18ZfoKePtDGg90Bvvfpov9d2gy5XVCbg=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.17", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.17", "@tailwindcss/oxide-darwin-arm64": "4.0.17", "@tailwindcss/oxide-darwin-x64": "4.0.17", "@tailwindcss/oxide-freebsd-x64": "4.0.17", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.17", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.17", "@tailwindcss/oxide-linux-arm64-musl": "4.0.17", "@tailwindcss/oxide-linux-x64-gnu": "4.0.17", "@tailwindcss/oxide-linux-x64-musl": "4.0.17", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.17", "@tailwindcss/oxide-win32-x64-msvc": "4.0.17" } }, "sha512-B4OaUIRD2uVrULpAD1Yksx2+wNarQr2rQh65nXqaqbLY1jCd8fO+3KLh/+TH4Hzh2NTHQvgxVbPdUDOtLk7vAw=="],
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.0.17", "", { "os": "android", "cpu": "arm64" }, "sha512-3RfO0ZK64WAhop+EbHeyxGThyDr/fYhxPzDbEQjD2+v7ZhKTb2svTWy+KK+J1PHATus2/CQGAGp7pHY/8M8ugg=="],
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.0.17", "", { "os": "darwin", "cpu": "arm64" }, "sha512-e1uayxFQCCDuzTk9s8q7MC5jFN42IY7nzcr5n0Mw/AcUHwD6JaBkXnATkD924ZsHyPDvddnusIEvkgLd2CiREg=="],
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.0.17", "", { "os": "darwin", "cpu": "x64" }, "sha512-d6z7HSdOKfXQ0HPlVx1jduUf/YtBuCCtEDIEFeBCzgRRtDsUuRtofPqxIVaSCUTOk5+OfRLonje6n9dF6AH8wQ=="],
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.0.17", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EjrVa6lx3wzXz3l5MsdOGtYIsRjgs5Mru6lDv4RuiXpguWeOb3UzGJ7vw7PEzcFadKNvNslEQqoAABeMezprxQ=="],
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.0.17", "", { "os": "linux", "cpu": "arm" }, "sha512-65zXfCOdi8wuaY0Ye6qMR5LAXokHYtrGvo9t/NmxvSZtCCitXV/gzJ/WP5ksXPhff1SV5rov0S+ZIZU+/4eyCQ=="],
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.0.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-+aaq6hJ8ioTdbJV5IA1WjWgLmun4T7eYLTvJIToiXLHy5JzUERRbIZjAcjgK9qXMwnvuu7rqpxzej+hGoEcG5g=="],
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.0.17", "", { "os": "linux", "cpu": "arm64" }, "sha512-/FhWgZCdUGAeYHYnZKekiOC0aXFiBIoNCA0bwzkICiMYS5Rtx2KxFfMUXQVnl4uZRblG5ypt5vpPhVaXgGk80w=="],
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.0.17", "", { "os": "linux", "cpu": "x64" }, "sha512-gELJzOHK6GDoIpm/539Golvk+QWZjxQcbkKq9eB2kzNkOvrP0xc5UPgO9bIMNt1M48mO8ZeNenCMGt6tfkvVBg=="],
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.0.17", "", { "os": "linux", "cpu": "x64" }, "sha512-68NwxcJrZn94IOW4TysMIbYv5AlM6So1luTlbYUDIGnKma1yTFGBRNEJ+SacJ3PZE2rgcTBNRHX1TB4EQ/XEHw=="],
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.0.17", "", { "os": "win32", "cpu": "arm64" }, "sha512-AkBO8efP2/7wkEXkNlXzRD4f/7WerqKHlc6PWb5v0jGbbm22DFBLbIM19IJQ3b+tNewQZa+WnPOaGm0SmwMNjw=="],
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.0.17", "", { "os": "win32", "cpu": "x64" }, "sha512-7/DTEvXcoWlqX0dAlcN0zlmcEu9xSermuo7VNGX9tJ3nYMdo735SHvbrHDln1+LYfF6NhJ3hjbpbjkMOAGmkDg=="],
"@tailwindcss/vite": ["@tailwindcss/vite@4.0.17", "", { "dependencies": { "@tailwindcss/node": "4.0.17", "@tailwindcss/oxide": "4.0.17", "lightningcss": "1.29.2", "tailwindcss": "4.0.17" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-HJbBYDlDVg5cvYZzECb6xwc1IDCEM3uJi3hEZp3BjZGCNGJcTsnCpan+z+VMW0zo6gR0U6O6ElqU1OoZ74Dhww=="],
"@tauri-apps/api": ["@tauri-apps/api@2.2.0", "", {}, "sha512-R8epOeZl1eJEl603aUMIGb4RXlhPjpgxbGVEaqY+0G5JG9vzV/clNlzTeqc+NLYXVqXcn8mb4c5b9pJIUDEyAg=="],
"@tauri-apps/cli": ["@tauri-apps/cli@2.2.2", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.2.2", "@tauri-apps/cli-darwin-x64": "2.2.2", "@tauri-apps/cli-linux-arm-gnueabihf": "2.2.2", "@tauri-apps/cli-linux-arm64-gnu": "2.2.2", "@tauri-apps/cli-linux-arm64-musl": "2.2.2", "@tauri-apps/cli-linux-x64-gnu": "2.2.2", "@tauri-apps/cli-linux-x64-musl": "2.2.2", "@tauri-apps/cli-win32-arm64-msvc": "2.2.2", "@tauri-apps/cli-win32-ia32-msvc": "2.2.2", "@tauri-apps/cli-win32-x64-msvc": "2.2.2" }, "bin": { "tauri": "tauri.js" } }, "sha512-5fVEdP4t4BT0ymvXZAM78kB0S/TaiRDLDoSRWGxVy1e7XCwuKyST5m6ybeyw/h/soK/91tbf+W3xXXy7XzkT4A=="],
"@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JMXbX5hGrLOzJbjisd7gBe25PmHouXA1+f4yVWg5PRlgxW7pla7krOzhu2mchFlMVDr8aLwhMLgohvvx+raXag=="],
"@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-i2gxKXev+Ed0UWeq0xSiyRjSkzzBbu9MCOhs/QVv1YuV+097K/fF89f+a4v5JJftCq2IOHhSKH23KyTJBLnNKQ=="],
"@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-iC2HndsN5smmbvEDUQFyTHyYHSgx7OwJ6puyXLLpkAHnQDo4TGSPxIlPeZFSZmEoaJEmHLdG3j1LcFWOKrxWQg=="],
"@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-YzK30tleUzWxfIp1davc5RhvmNZxiZQkUnQ4zajGJZ99zxNk8kwvv8nYSC3/J2R8sYpnuv+7CzNyIwA2s6yH+w=="],
"@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-nOw2apBzOCTiH1fLOjL42ajHNhMzdp640CX5RrWkDYdyVO7YbGmWzrN26PPXohScScXVjSjtDDxdeQV1gHCxhg=="],
"@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Tmm4qVY8yxSugi8sCko1dyZxyPGK8m3tWm+b1J0DXwzxqaoMqNXuYGxkwtUdkznPXEfQSD8OGBfwjXNmVGE91Q=="],
"@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-AwAcaCUhmwzOFPvje80g2BAhnkoEpXdl1E0Uk+lvr9makHM0+aV++M5jibD97yxKnK5NrQ9YXPH5Sn6CdncgUg=="],
"@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-u7TnwuUAN+eX6R2kDfSM8fsUFiBzNqq9PnAOsQ2qbwbHGbu7mHfGO1OFgnIzBt1C9FolFbENk2pzjiL4R9baXQ=="],
"@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.2.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-9KScbGKU6GfHThEYWdlO0+COW/8SDfIXbYgEvEcfZztE4VedHBbI0XfU+l+aS8nJN+fvYX+DtvY0tpDwyo0G4A=="],
"@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-ko8OWCLwFaHfdBaKbRX/C5btNt61v17qKOSQPksuc5PVvY0tAoci09612nEMlYiogZKEtn7VAqSdRAG6h0tz+g=="],
"@tauri-apps/plugin-fs": ["@tauri-apps/plugin-fs@2.0.4", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-hOq0OVGBz2gnsUnV49nlcj5ognlONvbZsO/uvDE+/6VFhGZrCakW1xiHjIn8A9XFf2w+FfhG45H5hIMDAOrXTQ=="],
"@tauri-apps/plugin-opener": ["@tauri-apps/plugin-opener@2.2.3", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-QZDtGwqs2ssjc+GbHzTFlN0gtgXR7B1dcphIJ3vBrX+PXOdI58hP82TyT2rbH2myBVj2uWkyqKhM8FbbGopqng=="],
"@tauri-apps/plugin-shell": ["@tauri-apps/plugin-shell@2.2.0", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-iC3Ic1hLmasoboG7BO+7p+AriSoqAwKrIk+Hpk+S/bjTQdXqbl2GbdclghI4gM32X0bls7xHzIFqhRdrlvJeaA=="],
"@tauri-apps/plugin-sql": ["@tauri-apps/plugin-sql@2.0.2", "", { "dependencies": { "@tauri-apps/api": "^2.0.0" } }, "sha512-qrSY8hLfqHlnO3nH6DR2h6zEVT5sSeB5HHymvT40/FKwv8unewwRiPq4xV+qQZXN1a58ZtSDqVOCBnLHxGPczQ=="],
"@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
"@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="],
"acorn": ["acorn@8.14.0", "", { "bin": "bin/acorn" }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="],
"acorn-typescript": ["acorn-typescript@1.4.13", "", { "peerDependencies": { "acorn": ">=8.9.0" } }, "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q=="],
"aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
"axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
"clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
"cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="],
"debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
"detect-libc": ["detect-libc@2.0.3", "", {}, "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw=="],
"devalue": ["devalue@5.1.1", "", {}, "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="],
"enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="],
"esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": "bin/esbuild" }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="],
"esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="],
"esrap": ["esrap@1.3.7", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-r6/xjxdZrYp2TUqaPh9uueBTfAmlygsofC4q3HqbpLg/SapByBzb0Y603we7WejTTxMmZYYBu0+G+hNH0E/eog=="],
"fdir": ["fdir@6.4.2", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ=="],
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
"globalyzer": ["globalyzer@0.1.0", "", {}, "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q=="],
"globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="],
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
"import-meta-resolve": ["import-meta-resolve@4.1.0", "", {}, "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw=="],
"is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
"jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
"lightningcss": ["lightningcss@1.29.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.29.2", "lightningcss-darwin-x64": "1.29.2", "lightningcss-freebsd-x64": "1.29.2", "lightningcss-linux-arm-gnueabihf": "1.29.2", "lightningcss-linux-arm64-gnu": "1.29.2", "lightningcss-linux-arm64-musl": "1.29.2", "lightningcss-linux-x64-gnu": "1.29.2", "lightningcss-linux-x64-musl": "1.29.2", "lightningcss-win32-arm64-msvc": "1.29.2", "lightningcss-win32-x64-msvc": "1.29.2" } }, "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA=="],
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.29.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA=="],
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.29.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w=="],
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.29.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg=="],
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.29.2", "", { "os": "linux", "cpu": "arm" }, "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg=="],
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ=="],
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.29.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ=="],
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg=="],
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.29.2", "", { "os": "linux", "cpu": "x64" }, "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w=="],
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.29.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw=="],
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.29.2", "", { "os": "win32", "cpu": "x64" }, "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA=="],
"locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="],
"magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
"mrmime": ["mrmime@2.0.0", "", {}, "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"nanoid": ["nanoid@3.3.8", "", { "bin": "bin/nanoid.cjs" }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="],
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
"postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="],
"readdirp": ["readdirp@4.0.2", "", {}, "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA=="],
"rollup": ["rollup@4.30.1", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.30.1", "@rollup/rollup-android-arm64": "4.30.1", "@rollup/rollup-darwin-arm64": "4.30.1", "@rollup/rollup-darwin-x64": "4.30.1", "@rollup/rollup-freebsd-arm64": "4.30.1", "@rollup/rollup-freebsd-x64": "4.30.1", "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", "@rollup/rollup-linux-arm-musleabihf": "4.30.1", "@rollup/rollup-linux-arm64-gnu": "4.30.1", "@rollup/rollup-linux-arm64-musl": "4.30.1", "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", "@rollup/rollup-linux-riscv64-gnu": "4.30.1", "@rollup/rollup-linux-s390x-gnu": "4.30.1", "@rollup/rollup-linux-x64-gnu": "4.30.1", "@rollup/rollup-linux-x64-musl": "4.30.1", "@rollup/rollup-win32-arm64-msvc": "4.30.1", "@rollup/rollup-win32-ia32-msvc": "4.30.1", "@rollup/rollup-win32-x64-msvc": "4.30.1", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w=="],
"sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
"set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="],
"sirv": ["sirv@3.0.0", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg=="],
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
"svelte": ["svelte@5.17.3", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", "@types/estree": "^1.0.5", "acorn": "^8.12.1", "acorn-typescript": "^1.4.13", "aria-query": "^5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "esm-env": "^1.2.1", "esrap": "^1.3.2", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-eLgtpR2JiTgeuNQRCDcLx35Z7Lu9Qe09GPOz+gvtR9nmIZu5xgFd6oFiLGQlxLD0/u7xVyF5AUkjDVyFHe6Bvw=="],
"svelte-check": ["svelte-check@4.1.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": "bin/svelte-check" }, "sha512-IEMoQDH+TrPKwKeIyJim+PU8FxnzQMXsFHR/ldErkHpPXEGHCujHUXiR8jg6qDMqzsif5BbDOUFORltu87ex7g=="],
"tailwindcss": ["tailwindcss@4.0.17", "", {}, "sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw=="],
"tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="],
"tiny-glob": ["tiny-glob@0.2.9", "", { "dependencies": { "globalyzer": "0.1.0", "globrex": "^0.1.2" } }, "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg=="],
"totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="],
"typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="],
"vite": ["vite@6.0.7", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx"], "bin": "bin/vite.js" }, "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ=="],
"vitefu": ["vitefu@1.0.5", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA=="],
"yaml": ["yaml@2.7.0", "", { "bin": "bin.mjs" }, "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA=="],
"zimmerframe": ["zimmerframe@1.1.2", "", {}, "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w=="],
"@tailwindcss/node/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
}
}

BIN
bun.lockb Executable file

Binary file not shown.

640
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -13,21 +13,23 @@
},
"license": "MIT",
"dependencies": {
"@tauri-apps/api": "2.2.0",
"@tauri-apps/plugin-fs": "2.0.4",
"@tauri-apps/plugin-opener": "2.2.3",
"@tauri-apps/plugin-shell": "2.2.0",
"@tauri-apps/plugin-sql": "2.0.2"
"@tauri-apps/api": "^2.1.1",
"@tauri-apps/plugin-opener": "^2.2.2",
"@tauri-apps/plugin-fs": "~2.0.4",
"@tauri-apps/plugin-shell": "^2.2.0",
"@tauri-apps/plugin-sql": "~2.0.2"
},
"devDependencies": {
"@sveltejs/adapter-static": "3.0.8",
"@sveltejs/kit": "2.15.2",
"@sveltejs/vite-plugin-svelte": "5.0.3",
"@tauri-apps/cli": "2.2.2",
"@tailwindcss/vite": "^4.0.17",
"svelte": "5.17.3",
"svelte-check": "4.1.3",
"typescript": "5.6.3",
"vite": "6.0.7"
"@sveltejs/adapter-static": "^3.0.8",
"@sveltejs/kit": "^2.15.0",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"svelte": "^5.15.0",
"svelte-check": "^4.1.1",
"typescript": "~5.6.3",
"vite": "^6.0.5",
"@tauri-apps/cli": "^2.1.0",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.17"
}
}

6
postcss.config.js Normal file
View File

@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

BIN
src-tauri/icons/128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
src-tauri/icons/32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 974 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src-tauri/icons/icon.icns Normal file

Binary file not shown.

BIN
src-tauri/icons/icon.ico Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 85 KiB

BIN
src-tauri/icons/icon.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,12 +1,6 @@
#[tauri::command]
fn exit(app_handle: tauri::AppHandle) {
app_handle.exit(0);
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![exit])
.plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_sql::Builder::new().build())
.plugin(tauri_plugin_shell::init())

View File

@ -26,7 +26,10 @@
"active": true,
"targets": "all",
"icon": [
"icons/icon.png",
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
]
}

View File

@ -0,0 +1,5 @@
<script>
export let value = false;
</script>
<input type="checkbox" bind:checked={value} class="size-5 mx-2" />

View File

@ -1,12 +1,6 @@
<script>
/**
* @typedef {Object} Props
* @property {any} value
* @property {boolean} [is_required]
*/
/** @type {Props} */
let { value = $bindable(), is_required = true } = $props();
export let value;
export let is_required = true;
</script>
{#if is_required}

View File

@ -1,17 +1,6 @@
<script>
/**
* @typedef {Object} Props
* @property {string} [name]
* @property {boolean} [is_vertical]
* @property {import('svelte').Snippet} [children]
*/
/** @type {Props} */
let {
name = $bindable(""),
is_vertical = false,
children
} = $props();
export let name = "";
export let is_vertical = false;
</script>
<div
@ -20,5 +9,5 @@
flex justify-start"
>
<h1>{name}</h1>
{@render children?.()}
<slot />
</div>

View File

@ -2,25 +2,25 @@
import Select from "./Select.svelte";
import Button from "../ui/Button.svelte";
import x from "$lib/components/ui/x.svg";
/**
* @typedef {Object} Props
* @property {Array<number>} [value]
* @property {any} [on_change]
* @property {any} item_list_query
*/
/** @type {Props} */
let { value = $bindable([]), on_change = () => {}, item_list_query } = $props();
/** @type {Array<number>} */
export let value = [];
export let on_change = () => {};
export let item_list_query;
</script>
{#each value as _, item_index}
<div class="w-full mb-2 space-x-2 flex justify-center items-center">
<Select bind:value={value[item_index]}
query={item_list_query} {on_change}>
{#snippet children({ vtype })}
<Select
bind:value={value[item_index]}
query={item_list_query}
{on_change}
let:vtype
>
{vtype.name}
{vtype.id}
{/snippet}
</Select>
<Button
type={"second"}
@ -29,7 +29,8 @@
value.splice(item_index, 1);
value = value;
await on_change();
}}>
}}
>
<img src={x} class="w-[30px] invert" alt="x close img" />
</Button>
</div>

View File

@ -1,23 +1,10 @@
<script>
/**
* @typedef {Object} Props
* @property {number} [value]
* @property {boolean} [is_float]
* @property {number} [min]
* @property {number} [max]
* @property {string} [step]
* @property {boolean} [is_required]
*/
/** @type {Props} */
let {
value = $bindable(),
is_float = false,
min = 0,
max = 999999999,
step = "0.1",
is_required = true
} = $props();
export let value = 0;
export let is_float = false;
export let min = 0;
export let max = 999999999;
export let step = "0.1";
export let is_required = true;
</script>
{#if is_float && is_required}
@ -28,7 +15,7 @@
{step}
{value}
required
oninput={(e) => (value = parseFloat(e.target.value))}
on:input={(e) => (value = parseFloat(e.target.value))}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black
@ -41,7 +28,7 @@
{max}
{step}
{value}
oninput={(e) => (value = parseFloat(e.target.value))}
on:input={(e) => (value = parseFloat(e.target.value))}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black
@ -56,7 +43,7 @@
{max}
{value}
required
oninput={(e) => (value = Number(e.target.value))}
on:input={(e) => (value = Number(e.target.value))}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black
@ -68,7 +55,7 @@
{min}
{max}
{value}
oninput={(e) => (value = Number(e.target.value))}
on:input={(e) => (value = Number(e.target.value))}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black

View File

@ -72,14 +72,8 @@
});
const pattern = ".{22,}";
/**
* @typedef {Object} Props
* @property {string} [phone]
* @property {boolean} [is_required]
*/
/** @type {Props} */
let { phone = $bindable("+7 "), is_required = true } = $props();
export let phone = "+7 ";
export let is_required = true;
</script>
{#if is_required}

View File

@ -1,42 +1,32 @@
<script>
/**
* @typedef {Object} Props
* @property {any} value
* @property {any} query
* @property {boolean} [is_required]
* @property {any} [on_change]
* @property {import('svelte').Snippet<[any]>} [children]
*/
export let value;
/** @type {Props} */
let {
value = $bindable(),
query,
is_required = true,
on_change = () => {},
children
} = $props();
export let query;
export let is_required = true;
export let on_change = () => {};
</script>
{#if is_required}
<select
required
bind:value
onchange={on_change}
on:change={on_change}
class="w-full h-min p-2
border-2 border-black dark:border-none
bg-white dark:bg-black
text-black dark:text-white
appearance-none">
appearance-none"
>
{#await query then vtypes}
{#each vtypes as vtype}
{#if vtype.id === value}
<option selected value={vtype.id}>
{@render children?.({ vtype, })}
<slot {vtype} />
</option>
{:else}
<option value={vtype.id}>
{@render children?.({ vtype, })}
<slot {vtype} />
</option>
{/if}
{/each}
@ -49,16 +39,17 @@
border-2 border-black dark:border-none
bg-white dark:bg-black
text-black dark:text-white
appearance-none">
appearance-none"
>
{#await query then vtypes}
{#each vtypes as vtype}
{#if vtype.id === value}
<option selected value={vtype.id}>
{@render children?.({ vtype, })}
<slot {vtype} />
</option>
{:else}
<option value={vtype.id}>
{@render children?.({ vtype, })}
<slot {vtype} />
</option>
{/if}
{/each}

View File

@ -1,21 +1,9 @@
<script>
/**
* @typedef {Object} Props
* @property {boolean} [is_input]
* @property {string} [value]
* @property {number} [min_len]
* @property {number} [max_len]
* @property {boolean} [is_required]
*/
/** @type {Props} */
let {
is_input = true,
value = $bindable(),
min_len = 0,
max_len = 100,
is_required = true
} = $props();
export let is_input = true;
export let value = "";
export let min_len = 0;
export let max_len = 100;
export let is_required = true;
</script>
{#if is_input && is_required}
@ -25,7 +13,7 @@
maxlength={max_len}
{value}
required
oninput={(e) => (value = e.target.value)}
on:input={(e) => (value = e.target.value)}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black
@ -37,7 +25,7 @@
minlength={min_len}
maxlength={max_len}
{value}
oninput={(e) => (value = e.target.value)}
on:input={(e) => (value = e.target.value)}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black
@ -49,7 +37,7 @@
<textarea
required
{value}
oninput={(e) => (value = e.target.value)}
on:input={(e) => (value = e.target.value)}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black
@ -58,7 +46,7 @@
{:else if !is_input}
<textarea
{value}
oninput={(e) => (value = e.target.value)}
on:input={(e) => (value = e.target.value)}
class="w-full p-2 mx-2
border-2 border-black dark:border-none
bg-white dark:bg-black

View File

@ -1,40 +1,27 @@
<script>
import Button from "../ui/Button.svelte";
import Search from "../ui/Search.svelte";
export let is_searching = false;
/** @type {any} */
export let current_item;
export let search_query_result = "";
export let columns = ["id", "name"];
export let current_table;
export let on_add_click = () => {};
export let toggle_add_dialog = () => {};
export let joins = "";
/** @typedef SearchParam
* @property {string} name
* @property {boolean} is_number
*/
/**
* @typedef {Object} Props
* @property {boolean} [is_searching]
* @property {any} current_item
* @property {string} [search_query_result]
* @property {any} [columns]
* @property {any} current_table
* @property {any} [on_add_click]
* @property {any} [toggle_add_dialog]
* @property {string} [joins]
* @property {string} [search_names]
* @property {Array<SearchParam>} [ex_params]
* @property {import('svelte').Snippet<[any]>} [children]
*/
/** @type {Props} */
let {
is_searching = $bindable(false),
current_item = $bindable(),
search_query_result = $bindable(""),
columns = ["id", "name"],
current_table,
on_add_click = () => {},
toggle_add_dialog = () => {},
joins = "",
search_names = "*",
ex_params = [],
children
} = $props();
/** @type {Array<SearchParam>}*/
export let ex_params = [];
</script>
<div class="m-2 flex space-x-2">
@ -43,7 +30,8 @@
on_click={() => {
on_add_click();
toggle_add_dialog();
}}>
}}
>
Добавить
</Button>
<Search
@ -51,11 +39,10 @@
bind:current_item
bind:search_query_result
{joins}
{search_names}
{ex_params}
{columns}
{current_table}
></Search>
</div>
{@render children?.({ is_searching, search_query_result, })}
<slot {is_searching} {search_query_result} />

View File

@ -1,22 +1,12 @@
<script>
import Button from "../ui/Button.svelte";
/**
* @typedef {Object} Props
* @property {boolean} [is_dialog_item_add]
* @property {any} [on_add]
* @property {any} [on_save]
* @property {any} [on_delete]
* @property {any} [form]
*/
/** @type {Props} */
let {
is_dialog_item_add = $bindable(false),
on_add = async () => {},
on_save = async () => {},
on_delete = async () => {},
form = null
} = $props();
export let is_dialog_item_add = false;
export let on_add = async () => {};
export let on_save = async () => {};
export let on_delete = async () => {};
export let form = null;
</script>
{#if is_dialog_item_add}
@ -25,7 +15,8 @@
if (form === null || form.checkValidity()) {
await on_add();
}
}}>
}}
>
Добавить
</Button>
{:else}
@ -35,7 +26,8 @@
if (form === null || form.checkValidity()) {
await on_save();
}
}}>
}}
>
Сохранить
</Button>
<Button on_click={on_delete}>Удалить</Button>

View File

@ -7,55 +7,40 @@
import TextInput from "../form/TextInput.svelte";
import Search from "../ui/Search.svelte";
/**
* @typedef {Object} Props
* @property {boolean} [is_item_dialog_open]
* @property {boolean} [is_dialog_item_add]
* @property {string} [cur_dialog_name]
* @property {any} current_table
* @property {any} current_item
* @property {any} query
* @property {any} db
* @property {any} [toggle_add_dialog]
* @property {any} [open_item_edit]
* @property {any} [sql_insert_short]
* @property {any} [sql_update_short]
* @property {any} [sql_delete_short]
* @property {string} [second_col_name]
* @property {any} [columns]
* @property {any} [columns_display]
* @property {boolean} [is_searching] - export let is_searching = false;
* @property {import('svelte').Snippet} [second_value_input]
*/
export let is_item_dialog_open = false;
export let is_dialog_item_add = false;
/** @type {Props} */
let {
is_item_dialog_open = $bindable(false),
is_dialog_item_add = $bindable(false),
cur_dialog_name = "__example__",
current_table,
current_item = $bindable(),
query,
db,
toggle_add_dialog = () => {},
open_item_edit = (/** @type {any} */ item) => {},
sql_insert_short = async (
export let cur_dialog_name = "__example__";
export let current_table;
/** @type {any} */
export let current_item;
export let query;
export let db;
export let toggle_add_dialog = () => {};
export let open_item_edit = (/** @type {any} */ item) => {};
export let sql_insert_short = async (
/** @type {any} */ arg1,
/** @type {any} */ arg2,
) => {},
sql_update_short = async (
) => {};
export let sql_update_short = async (
/** @type {any} */ arg1,
/** @type {any} */ arg2,
) => {},
sql_delete_short = () => {},
second_col_name = "name",
columns = ["id", "name"],
columns_display = columns,
is_searching = $bindable(false),
second_value_input
} = $props();
) => {};
export let sql_delete_short = () => {};
let search_query_result = $state("");
export let second_col_name = "name";
export let columns = ["id", "name"];
export let columns_display = columns;
// export let is_searching = false;
export let is_searching = false;
let search_query_result = "";
</script>
<Dialog
@ -63,19 +48,22 @@
on_close={() => {
is_dialog_item_add = false;
}}
name={cur_dialog_name}>
{#snippet children({ form })}
name={cur_dialog_name}
let:form
>
{#if !is_dialog_item_add}
<h1>{columns_display[0]} {current_item.id}</h1>
{/if}
<Field name={columns_display[1]}>
{#if second_value_input}{@render second_value_input()}{:else}
<slot name="second_value_input">
<TextInput bind:value={current_item[second_col_name]}></TextInput>
{/if}
</slot>
</Field>
<TableCudButtons {form} bind:is_dialog_item_add
<TableCudButtons
{form}
bind:is_dialog_item_add
on_add={async () => {
await sql_insert_short(current_table, [second_col_name]);
}}
@ -84,17 +72,19 @@
}}
on_delete={sql_delete_short}
></TableCudButtons>
{/snippet}
</Dialog>
<div class="m-2 flex space-x-2">
<Button
is_visible={!is_searching}
on_click={() => {
current_item = {id: 0};
current_item = {
id: 0,
};
current_item[second_col_name] = "";
toggle_add_dialog();
}}>
}}
>
Добавить
</Button>

View File

@ -1,22 +1,20 @@
<script>
import Spinner from "../ui/Spinner.svelte";
import Table from "../table/Table.svelte";
import Tr from "../table/Tr.svelte";
import Atd from "../table/Atd.svelte";
/**
* @typedef {Object} Props
* @property {any} query
* @property {Array<string>} [columns]
* @property {Array<string>} [names]
*/
/** @type {Props} */
let { query, columns = [], names = [] } = $props();
export let query;
/** @type {Array<string>} */
export let columns = [];
/** @type {Array<string>} */
export let names = [];
</script>
<Table {columns} {query} >
{#snippet children({ item, index })}
<Table {columns} {query} let:item let:index>
<Tr {index}>
<Atd {item} {names}></Atd>
</Tr>
{/snippet}
</Table>

View File

@ -1,15 +1,14 @@
<script>
import Td from "./Td.svelte";
/**
* @typedef {Object} Props
* @property {any} [item]
* @property {Array<string>} [names]
*/
/** @type {any} */
export let item = {};
/** @type {Props} */
let { item = {}, names = [] } = $props();
/** @type {Array<string>} */
export let names = [];
</script>
{#each names as name}
<Td>{item[name]}</Td>
<Td>
{item[name]}
</Td>
{/each}

View File

@ -2,30 +2,15 @@
import Atd from "./Atd.svelte";
import Tr from "./Tr.svelte";
import Spinner from "../ui/Spinner.svelte";
// export let data;
export let columns = ["__empty__"];
export let columns_display = columns;
export let class_name = "";
export let query;
export let open_item_edit = (/** @type {any} */ item) => {};
/**
* @typedef {Object} Props
* @property {any} [columns] - export let data;
* @property {any} [columns_display]
* @property {string} [class_name]
* @property {any} query
* @property {any} [open_item_edit]
* @property {boolean} [is_searching]
* @property {any} search_query
* @property {import('svelte').Snippet<[any]>} [children]
*/
/** @type {Props} */
let {
columns = ["__empty__"],
columns_display = columns,
class_name = "",
query,
open_item_edit = (/** @type {any} */ item) => {},
is_searching = $bindable(),
search_query,
children
} = $props();
export let is_searching = false;
export let search_query;
</script>
{#if !is_searching}
@ -37,7 +22,8 @@
<tr
class="w-full sticky
bg-black text-white"
style="inset-block-start: 0;">
style="inset-block-start: 0;"
>
{#each columns_display as column_name}
<td class="w-max p-2 text-center">
{column_name}
@ -45,18 +31,17 @@
{/each}
</tr>
{#each data as item, i}
{#if children}{@render children({ item, index: i, })}{:else}
<slot {item} index={i}>
<Tr on_click={() => open_item_edit(item)} index={i}>
<Atd {item} names={columns}></Atd>
</Tr>
{/if}
</slot>
{/each}
</tbody>
</table>
{:catch}
<h1>Не удалось загрузить данные</h1>
{/await}
{:else if search_query !== ""}
{#await search_query}
<Spinner></Spinner>
@ -66,7 +51,8 @@
<tr
class="w-full sticky
bg-black text-white"
style="inset-block-start: 0;">
style="inset-block-start: 0;"
>
{#each columns_display as column_name}
<td class="w-max p-2 text-center">
{column_name}
@ -74,11 +60,11 @@
{/each}
</tr>
{#each data as item, i}
{#if children}{@render children({ item, index: i, })}{:else}
<slot {item} index={i}>
<Tr on_click={() => open_item_edit(item)} index={i}>
<Atd {item} names={columns}></Atd>
</Tr>
{/if}
</slot>
{/each}
</tbody>
</table>

View File

@ -1,13 +1,5 @@
<script>
/**
* @typedef {Object} Props
* @property {import('svelte').Snippet} [children]
*/
/** @type {Props} */
let { children } = $props();
</script>
<td class="p-2 border-[1px] border-black overflow-hidden text-ellipsis break-words">
{@render children?.()}
<td
class="p-2 border-[1px] border-black overflow-hidden text-ellipsis break-words"
>
<slot />
</td>

View File

@ -1,19 +1,18 @@
<script>
/**
* @typedef {Object} Props
* @property {number} [index]
* @property {any} [on_click]
* @property {import('svelte').Snippet} [children]
*/
/** @type {Props} */
let { index = 0, on_click = () => {}, children } = $props();
export let index = 0;
export let on_click = () => {};
</script>
<tr onclick={on_click}
class="text-black dark:text-white
{index % 2 == 0
<!-- class="bg-white dark:bg-gray-800" -->
<!-- {index % 2 == 0 ? 'text-white' : 'text-black'} -->
<!-- {index % 2 == 0 ? 'bg-[#444]' : 'bg-[#dcdcdc]'}" -->
<tr
on:click={on_click}
class="
text-black dark:text-white
{index % 2 == 0
? 'bg-[#fff] dark:bg-gray-800'
: 'bg-[#e0e0e0] dark:bg-gray-700'}">
{@render children?.()}
: 'bg-[#e0e0e0] dark:bg-gray-700'}"
>
<slot />
</tr>

View File

@ -1,23 +1,12 @@
<script>
/**
* @typedef {Object} Props
* @property {boolean} [is_visible]
* @property {any} [on_click]
* @property {any} [on_submit]
* @property {'primary' | 'regular' | 'second'} [type]
* @property {string} [class_name]
* @property {import('svelte').Snippet} [children]
*/
export let is_visible = true;
export let on_click = () => {};
export let on_submit = () => {};
/** @type {Props} */
let {
is_visible = true,
on_click = () => {},
on_submit = () => {},
type = "primary",
class_name = "",
children
} = $props();
/** @type {'primary' | 'regular' | 'second'} */
export let type = "primary";
export let class_name = "";
let styles = {
// bg-[#6664AF] dark:bg-[#6664AF] text-white text-2xl
@ -40,7 +29,7 @@ shadow-[-2px_-2px_#000] dark:shadow-[-2px_-2px_var(--b-border)] ${class_name}`,
</script>
{#if is_visible}
<button type="submit" class={styles[type]} onclick={on_click}>
{@render children?.()}
<button type="submit" class={styles[type]} on:click={on_click}>
<slot />
</button>
{/if}

View File

@ -1,31 +1,18 @@
<script>
// import ThemeSwitch from "./ThemeSwitch.svelte";
import x from "./x.svg";
/**
* @typedef {Object} Props
* @property {boolean} [is_open]
* @property {boolean} [is_name_editable]
* @property {string} [name]
* @property {string} [class_name]
* @property {any} [on_close]
* @property {import('svelte').Snippet<[any]>} [children]
*/
/** @type {Props} */
let {
is_open = $bindable(false),
is_name_editable = false,
name = $bindable(""),
class_name = "",
on_close = () => {
export let is_open = false;
export let is_name_editable = false;
export let name = "";
export let class_name = "";
export let on_close = () => {
is_open = false;
},
children
} = $props();
};
let dialog = $state();
let dialog;
let local_open = false;
function toggle_dialog() {
function toggle_dialog(_) {
if (is_open && local_open) {
dialog.showModal();
document.addEventListener("keydown", (event) => {
@ -49,9 +36,9 @@
}
}
$effect(toggle_dialog)
$: _ = toggle_dialog(is_open);
let form = $state();
let form;
</script>
<dialog
@ -61,38 +48,51 @@
max-w-full max-h-full
flex justify-center items-center
{is_open ? 'visible opacity-100' : 'invisible opacity-0'}
backdrop-blur-xs
backdrop-blur-sm
bg-[#000000aa]
transition-all duration-300">
transition-all duration-300"
>
<div
class="w-[700px] h-auto mx-4 px-2 flex flex-col
class="w-[700px] h-[800px] mx-4 px-2 flex flex-col
border-[var(--w-border)] dark:border-[var(--b-border)] border-2 rounded-xl
bg-[var(--w-bg-second)] dark:bg-[var(--b-bg-second)]
text-[var(--w-text)] dark:text-[var(--b-text)] text-2xl
overflow-hidden
{class_name}">
{class_name}"
>
<div class=" relative flex flex-initial justify-between items-center">
{#if is_name_editable}
<input
type="text"
bind:value={name}
class="bg-[var(--w-bg)] dark:bg-[var(--b-bg)] w-full focus-visible:outline-hidden"
class="bg-[var(--w-bg)] dark:bg-[var(--b-bg)] w-full focus-visible:outline-none"
/>
{:else}
<p class=" w-full focus-visible:outline-hidden">
<p class=" w-full focus-visible:outline-none">
{name}
</p>
{/if}
<button class="size-[60px] m-2 pb-3"
onclick={() => {
<button
on:click={() => {
is_open = false;
on_close();
}}>
<img src={x} class="size-[40px] dark:invert" alt="x close img"/>
}}
class="size-[60px] m-2 pb-3"
>
<img
src={x}
class="size-[40px] dark:invert"
alt="x close img"
/>
</button>
</div>
<form bind:this={form} action="/" target="_self" class="overflow-y-auto">
{@render children?.({ form, })}
<form
bind:this={form}
action="/"
target="_self"
class="overflow-y-auto"
>
<slot {form}></slot>
</form>
</div>
</dialog>

View File

@ -1,28 +1,25 @@
<script>
import Button from "./Button.svelte";
let form = $state();
let login = $state("");
let passoword = $state("");
let form;
let login = "";
let passoword = "";
/**
* @typedef {Object} Props
* @property {boolean} [is_logedin]
* @property {string} [access_level]
* @property {any} [check_login]
*/
/** @type {Props} */
let { is_logedin = $bindable(false), access_level = $bindable(""), check_login = async (l, p) => [false, ""] } = $props();
let is_error = $state(false);
export let is_logedin = false;
export let access_level = "";
export let check_login = async (l, p) => [false, ""];
let is_error = false;
</script>
{#if !is_logedin}
<div
class="w-full h-full pr-4 overflow-y-auto
flex justify-center items-center
bg-[var(--w-bg-second)] dark:bg-[#111]">
<form bind:this={form}
class="flex flex-col justify-center items-center">
bg-[var(--w-bg-second)] dark:bg-[#111]"
>
<form
bind:this={form}
class="flex flex-col justify-center items-center"
>
<h1 class="text-4xl">Вход</h1>
<input
type="text"
@ -46,7 +43,7 @@
<h1>Неправильный логин или пароль</h1>
{/if}
<Button
class_name={"w-[400px]! m-2! text-xl"}
class_name={"!w-[400px] !m-2 text-xl"}
on_click={async () => {
if (form.checkValidity()) {
if (login === "admin" && passoword === "1234") {
@ -71,7 +68,9 @@
}
}
}
}}>Войти
}}
>
Войти
</Button>
</form>
</div>

View File

@ -1,38 +1,35 @@
<script>
import ThemeSwitch from "./ThemeSwitch.svelte";
import Button from "./Button.svelte";
/**
* @typedef {Object} Props
* @property {'tables' | 'viewes'} [current_page]
* @property {any} [db_scheme]
* @property {boolean} [is_view_open]
* @property {any} [check_access]
* @property {boolean} [is_logedin]
* @property {boolean} [is_loaded]
* @property {any} [on_logout]
*/
/** @type {Props} */
let {
current_page = $bindable(""),
db_scheme = {},
is_view_open = $bindable(false),
check_access = (name) => false,
is_logedin = false,
is_loaded = false,
on_logout = () => {}
} = $props();
// /** @type {'tables' | 'viewes'} */
export let current_page = "";
/** @type {any} */
export let db_scheme = {};
export let is_view_open = false;
export let check_access = (name) => false;
export let is_logedin = false;
export let is_loaded = false;
export let on_logout = () => {};
</script>
<div class="w-full h-[80px] mb-2 pr-4 text-xl flex-initial
flex justify-between items-center
bg-[var(--w-bg-second)] dark:bg-[#111]">
<div
class="w-full h-[80px] mb-2 pr-4 text-xl flex-initial
flex justify-between items-center
bg-[var(--w-bg-second)] dark:bg-[#111]"
>
<div class="flex">
{#if is_logedin && is_loaded}
{#each Object.entries(db_scheme) as page_name}
{#if check_access(page_name[0])}
<button
onclick={() => {
on:click={() => {
is_view_open = false;
current_page = page_name[0];
}}
@ -51,7 +48,10 @@ bg-[var(--w-bg-second)] dark:bg-[#111]">
<div class="space-x-4 flex justify-center items-center">
<ThemeSwitch></ThemeSwitch>
{#if is_logedin && is_loaded}
<Button on_click={on_logout} class_name={"text-black! hover:text-white! dark:text-white! bg-[var(--w-red)] dark:bg-[var(--b-red)]"}>
<Button
on_click={on_logout}
class_name={"!text-black hover:!text-white dark:!text-white bg-[var(--w-red)] dark:bg-[var(--b-red)]"}
>
Выход
</Button>
{/if}

View File

@ -1,5 +1,4 @@
<script>
import { invoke } from "@tauri-apps/api/core";
import Database from "@tauri-apps/plugin-sql";
import { onMount } from "svelte";
import NavBar from "$lib/components/ui/NavBar.svelte";
@ -26,7 +25,7 @@
}
async function sql_delete_short() {
await db?.execute(
await db.execute(
`delete from ${current_table} where id = ${current_item.id}`,
);
is_item_dialog_open = false;
@ -56,14 +55,14 @@
.map((el) => format_type_insert(current_item[el]))
.filter((el) => el !== null)
.join(", ")}) ${ex ? ex : ""}`;
const res = await db?.execute(q);
const res = await db.execute(q);
is_item_dialog_open = false;
toggle_update();
return res;
}
/**
* @param {string} name
* @param {any} an
@param {string} name
@param {any} an
*/
function format_type_update(name, an) {
if (typeof an === "string") {
@ -81,56 +80,57 @@
* @param {Array<string>} columns
*/
async function sql_update_short(table_name, columns) {
let q = `UPDATE ${table_name} SET ${columns
// let q = `UPDATE ${table_name} SET
// ${columns.map((el) => (typeof current_item[el] === "string" ? `${el} = "${current_item[el]}"` : `${el} = ${current_item[el]}`)).join(", ")}
// WHERE id = ${current_item.id}`;
let q = `UPDATE ${table_name} SET
${columns
.map((el) => format_type_update(el, current_item[el]))
.filter((el) => el !== null)
.join(", ")}
WHERE id = ${current_item.id}`;
await db?.execute(q);
// console.log(q);
await db.execute(q);
is_item_dialog_open = false;
toggle_update();
}
let current_table = $state("");
let current_view = $state("");
let is_view_open = $state(false);
export let db_scheme;
let is_logedin = $state(false);
/** @type {any} */
export let current_item = {};
let access_level = $state("");
let is_loaded = $state(false);
/**
* @typedef {Object} Props
* @property {any} db_scheme
* @property {any} [current_item]
* @property {Database | undefined} db
* @property {boolean} [is_item_dialog_open]
* @property {boolean} [is_dialog_item_add]
* @property {boolean} [is_login_requied]
* @property {any} [check_access]
* @property {any} [check_login]
* @property {any} [load_db]
* @property {import('svelte').Snippet<[any]>} [children]
*/
/** @type {Props} */
let {
db_scheme,
current_item = $bindable({}),
db,
is_item_dialog_open = $bindable(false),
is_dialog_item_add = $bindable(false),
is_login_requied = true,
check_access = $bindable((access_level, tab_name, name) => false),
check_login = $bindable(async (login, passowrd) => [false, ""]),
load_db = async () => {},
children
} = $props();
/** @type {Database} */
export let db;
/** @type {string} */
let current_page = $state(Object.entries(db_scheme)[0][0]);
let current_page = "Пиццерия";
let current_table = "";
let current_view = "";
let is_view_open = false;
export let is_item_dialog_open = false;
export let is_dialog_item_add = false;
let is_logedin = false;
export let is_login_requied = true;
let access_level = "";
/**
* @param {string} access_level
* @param {string} tab_name
* @param {string | null} name
*/
export let check_access = (access_level, tab_name, name) => false;
/**
* @param {string} login
* @param {string} passowrd
*/
export let check_login = async (login, passowrd) => [false, ""];
let is_loaded = false;
export let load_db = async () => {};
onMount(async () => {
await load_db();
is_loaded = true;
@ -140,10 +140,9 @@ WHERE id = ${current_item.id}`;
check_login = async () => [true, ""];
}
});
let cur_dialog_name = $derived(is_dialog_item_add
$: cur_dialog_name = is_dialog_item_add
? `Добавить в ${db_scheme[current_page].tables[current_table]}`
: `Изменить ${db_scheme[current_page].tables[current_table]}`);
: `Изменить ${db_scheme[current_page].tables[current_table]}`;
</script>
<NavBar
@ -158,11 +157,9 @@ WHERE id = ${current_item.id}`;
is_logedin = false;
// @ts-ignore
access_level = "";
current_page = Object.entries(db_scheme)[0][0];
current_page = "Запросы";
current_table = "";
current_view = "";
} else {
invoke("exit");
}
}}
></NavBar>
@ -175,14 +172,28 @@ WHERE id = ${current_item.id}`;
bind:current_view
bind:is_view_open
db_scheme={db_scheme[current_page]}
check_access={(/** @type {any} */name) => check_access(access_level, current_page, name)}
check_access={(name) => check_access(access_level, current_page, name)}
></SideMenu>
<div class="w-full pr-4 overflow-y-auto rounded-tl-xl
bg-[var(--w-bg-second)] dark:bg-[#111]">
<div
class="w-full pr-4 overflow-y-auto rounded-tl-xl
bg-[var(--w-bg-second)] dark:bg-[#111]"
>
<LoginForm bind:is_logedin bind:access_level {check_login}></LoginForm>
{#if is_loaded && is_logedin}
{@render children?.({ current_page, current_table, current_view, is_view_open, cur_dialog_name, toggle_update, toggle_add_dialog, open_item_edit, sql_update_short, sql_insert_short, sql_delete_short })}
<slot
{current_page}
{current_table}
{current_view}
{is_view_open}
{cur_dialog_name}
{toggle_update}
{toggle_add_dialog}
{open_item_edit}
{sql_update_short}
{sql_insert_short}
{sql_delete_short}
/>
{/if}
</div>
</div>

View File

@ -1,37 +1,30 @@
<script>
import Button from "./Button.svelte";
import ViewTable from "../shorts/ViewTable.svelte";
export let is_searching = false;
export let search_value = "";
export let search_query_result = "";
/** @type {any} */
export let current_item;
export let columns = ["id", "name"];
export let current_table = "";
export let joins = "";
/** @typedef SearchParam
* @property {string} name
* @property {boolean} is_number
*/
/**
* @typedef {Object} Props
* @property {boolean} [is_searching]
* @property {string} [search_value]
* @property {string} [search_query_result]
* @property {any} current_item
* @property {any} [columns]
* @property {string} [current_table]
* @property {string} [joins]
* @property {string} [search_names]
* @property {Array<SearchParam>} [ex_params]
* @property {boolean} [is_contains]
*/
/** @type {Array<SearchParam>}*/
export let ex_params = [];
/** @type {Props} */
let {
is_searching = $bindable(false),
search_value = $bindable(""),
search_query_result = $bindable(""),
current_item = $bindable(),
columns = ["id", "name"],
current_table = "",
joins = "",
search_names = "*",
ex_params = [],
is_contains = $bindable(true)
} = $props();
export let is_contains = true;
/**
* @param {string} thing
@ -79,7 +72,7 @@
const search_splitted = search_purified.split(" ");
columns.forEach((/** @type {any} */ el) => {
columns.forEach((el) => {
const param = make_sql_param(el, current_item[el], search_purified);
if (param !== null) {
@ -96,13 +89,21 @@
if (ex_params.length !== 0) {
ex_params.forEach((el) => {
const param = make_sql_param(el.name, el.is_number ? null : "", search_purified,);
const param = make_sql_param(
el.name,
el.is_number ? null : "",
search_purified,
);
if (param !== null) {
params.push(param);
}
search_splitted.forEach((sp) => {
const param = make_sql_param(el.name,el.is_number ? null : "",sp);
const param = make_sql_param(
el.name,
el.is_number ? null : "",
sp,
);
if (param !== null && !params.includes(param)) {
params.push(param);
}
@ -113,17 +114,21 @@
if (params.length === 0) {
search_query_result = "";
} else {
search_query_result = `SELECT ${search_names} FROM ${current_table} ${joins} WHERE ${params.join(" OR ")}`;
search_query_result = `SELECT * FROM ${current_table} ${joins} WHERE ${params.join(" OR ")}`;
}
// console.log(`SELECT * FROM ${current_table} \n${joins} \nWHERE \n${params.join(" OR ")}`);
}
</script>
<div class="">
<div class=" flex justify-start items-center">
<Button type={is_searching ? "second" : "primary"}
<Button
on_click={() => {
is_searching = !is_searching;
}}>
}}
type={is_searching ? "second" : "primary"}
>
{#if is_searching}
{"<-"}
{:else}
@ -132,12 +137,15 @@
</Button>
{#if is_searching}
<input type="text"
<input
type="text"
bind:value={search_value}
oninput={on_input}
on:input={on_input}
class=" w-full mx-4 p-2 text-xl border-black border-2
bg-[#fff] dark:bg-gray-800
dark:text-white"/>
dark:text-white
"
/>
{/if}
</div>
{#if is_searching}
@ -146,11 +154,11 @@
type="checkbox"
class="size-7 mr-4"
checked
onclick={() => {
on:click={() => {
is_contains = !is_contains;
on_input("");
}}
/>похоже?
/> похоже?
</div>
{/if}
</div>

View File

@ -1,40 +1,33 @@
<script>
/**
* @typedef {Object} Props
* @property {string} [current_table]
* @property {string} [current_view]
* @property {boolean} [is_view_open]
* @property {any} [db_scheme]
* @property {any} [check_access]
* @property {boolean} [is_logedin]
* @property {boolean} [is_loaded]
*/
export let current_table = "";
export let current_view = "";
export let is_view_open = false;
/** @type {Props} */
let {
current_table = $bindable(""),
current_view = $bindable(""),
is_view_open = $bindable(false),
db_scheme = { tables: {}, viewes: {} },
check_access = (/** @type {any} */ name) => false,
is_logedin = false,
is_loaded = false
} = $props();
export let db_scheme = { tables: {}, viewes: {} };
export let check_access = (name) => false;
export let is_logedin = false;
export let is_loaded = false;
</script>
<div class="w-[240px] h-full text-xl p-3 mr-2 flex-initial rounded-tr-xl
bg-[var(--w-bg-second)] dark:bg-[var(--b-bg-second)]">
<div
class="w-[240px] h-full text-xl p-3 mr-2 flex-initial rounded-tr-xl
bg-[var(--w-bg-second)] dark:bg-[var(--b-bg-second)]"
>
{#if is_logedin && is_loaded}
{#if Object.entries(db_scheme.viewes).length !== 0 && Object.entries(db_scheme.viewes).some( (el) => check_access(el[0]), )}
<button
onclick={() => {
on:click={() => {
is_view_open = !is_view_open;
}}
class="py-2 my-1 w-full
{is_view_open
? 'bg-[#d8efff] dark:bg-[#114040]'
: 'bg-[var(--w-button-bg)] dark:bg-black text-[var(--w-accent-text)] dark:text-[var(--b-accent-text)]'}
border-2 border-[var(--w-border)] dark:border-[var(--b-border)]">
border-2 border-[var(--w-border)] dark:border-[var(--b-border)]"
>
Отчеты
</button>
@ -43,8 +36,11 @@ bg-[var(--w-bg-second)] dark:bg-[var(--b-bg-second)]">
{#each !is_view_open ? Object.entries(db_scheme.tables) : Object.entries(db_scheme.viewes) as item_name}
{#if check_access(item_name[0])}
<button
onclick={() => {
if (`${current_table}` === item_name[0] || current_view === item_name[0]) {
on:click={() => {
if (
`${current_table}` === item_name[0] ||
current_view === item_name[0]
) {
current_table = "";
current_view = "";
}

View File

@ -1,10 +1,10 @@
<script>
import { onMount } from "svelte";
let is_resize = $state(false);
let is_transparent = $state(false);
let is_dark = $state(true);
let is_update = $state(false);
let is_resize = false;
let is_transparent = false;
let is_dark = true;
let is_update = false;
function handleSwitchDarkMode() {
setTimeout(() => {
@ -40,13 +40,13 @@
{#if !is_update}
<div class="min-w-[40px] min-h-[40px] flex justify-center items-center">
<!-- svelte-ignore a11y_click_events_have_key_events -->
<!-- svelte-ignore a11y_no_static_element_interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
class="group min-h-[50px] min-w-[50px] rounded-full flex justify-center items-center
{is_dark ? 'bg-[var(--w-bg)]' : 'bg-[var(--b-bg)]'}
"
onclick={handleSwitchDarkMode}
on:click={handleSwitchDarkMode}
>
<div
class=" rounded-full

View File

@ -1,6 +1,7 @@
@import 'tailwindcss';
@tailwind base;
@tailwind components;
@tailwind utilities;
@custom-variant dark (&:where(.dark, .dark *));
@font-face {
font-family: JetBrainsMono;

File diff suppressed because it is too large Load Diff

10
tailwind.config.js Normal file
View File

@ -0,0 +1,10 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{html,js,svelte,ts}'],
darkMode: 'selector',
theme: {
extend: {},
},
plugins: [],
}

View File

@ -1,17 +1,18 @@
import { defineConfig } from "vite";
import { sveltekit } from "@sveltejs/kit/vite";
import tailwindcss from "@tailwindcss/vite";
// @ts-expect-error process is a nodejs global
const host = process.env.TAURI_DEV_HOST;
// https://vitejs.dev/config/
export default defineConfig(async () => ({
plugins: [
sveltekit(),
tailwindcss()
],
plugins: [sveltekit()],
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
//
// 1. prevent vite from obscuring rust errors
clearScreen: false,
// 2. tauri expects a fixed port, fail if that port is not available
server: {
port: 1420,
strictPort: true,
@ -24,6 +25,7 @@ export default defineConfig(async () => ({
}
: undefined,
watch: {
// 3. tell vite to ignore watching `src-tauri`
ignored: ["**/src-tauri/**"],
},
},