first commit
@@ -0,0 +1,86 @@
|
||||
# ========================
|
||||
# Dependencies
|
||||
# ========================
|
||||
node_modules/
|
||||
.pnpm-store/
|
||||
|
||||
# ========================
|
||||
# Build / Dist
|
||||
# ========================
|
||||
dist/
|
||||
build/
|
||||
.output/
|
||||
.vite/
|
||||
*.local
|
||||
|
||||
# ========================
|
||||
# Tauri / Rust
|
||||
# ========================
|
||||
src-tauri/target/
|
||||
src-tauri/gen/
|
||||
src-tauri/WixTools/
|
||||
src-tauri/*.log
|
||||
|
||||
# Cargo (якщо root workspace)
|
||||
/target/
|
||||
|
||||
# ========================
|
||||
# Env / secrets
|
||||
# ========================
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
*.pem
|
||||
*.key
|
||||
|
||||
# ========================
|
||||
# Logs / cache
|
||||
# ========================
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
.cache/
|
||||
.turbo/
|
||||
.eslintcache
|
||||
.stylelintcache
|
||||
|
||||
# ========================
|
||||
# IDE / editors
|
||||
# ========================
|
||||
.idea/
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
!.vscode/settings.json
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.project
|
||||
.classpath
|
||||
.settings/
|
||||
|
||||
# ========================
|
||||
# OS
|
||||
# ========================
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
Desktop.ini
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# ========================
|
||||
# Test / coverage
|
||||
# ========================
|
||||
coverage/
|
||||
*.lcov
|
||||
.nyc_output/
|
||||
|
||||
# ========================
|
||||
# Misc
|
||||
# ========================
|
||||
*.tsbuildinfo
|
||||
.parcel-cache/
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# Tauri + Solid + Typescript
|
||||
|
||||
This template should help get you started developing with Tauri, Solid and Typescript in Vite.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)
|
||||
@@ -0,0 +1,722 @@
|
||||
{
|
||||
"version": "5",
|
||||
"specifiers": {
|
||||
"npm:@tauri-apps/api@2": "2.11.1",
|
||||
"npm:@tauri-apps/cli@2": "2.11.4",
|
||||
"npm:@tauri-apps/plugin-autostart@^2.5.1": "2.5.1",
|
||||
"npm:@tauri-apps/plugin-global-shortcut@^2.3.2": "2.3.2",
|
||||
"npm:@tauri-apps/plugin-opener@2": "2.5.5",
|
||||
"npm:solid-js@^1.9.3": "1.9.15",
|
||||
"npm:typescript@~6.0.3": "6.0.3",
|
||||
"npm:vite-plugin-solid@^2.11.12": "2.11.14_solid-js@1.9.15_vite@8.2.0",
|
||||
"npm:vite@^8.0.16": "8.2.0"
|
||||
},
|
||||
"npm": {
|
||||
"@babel/code-frame@7.29.7": {
|
||||
"integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
|
||||
"dependencies": [
|
||||
"@babel/helper-validator-identifier",
|
||||
"js-tokens",
|
||||
"picocolors"
|
||||
]
|
||||
},
|
||||
"@babel/compat-data@7.29.7": {
|
||||
"integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="
|
||||
},
|
||||
"@babel/core@7.29.7": {
|
||||
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
||||
"dependencies": [
|
||||
"@babel/code-frame",
|
||||
"@babel/generator",
|
||||
"@babel/helper-compilation-targets",
|
||||
"@babel/helper-module-transforms",
|
||||
"@babel/helpers",
|
||||
"@babel/parser",
|
||||
"@babel/template",
|
||||
"@babel/traverse",
|
||||
"@babel/types",
|
||||
"@jridgewell/remapping",
|
||||
"convert-source-map",
|
||||
"debug",
|
||||
"gensync",
|
||||
"json5",
|
||||
"semver"
|
||||
]
|
||||
},
|
||||
"@babel/generator@7.29.8": {
|
||||
"integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
|
||||
"dependencies": [
|
||||
"@babel/parser",
|
||||
"@babel/types",
|
||||
"@jridgewell/gen-mapping",
|
||||
"@jridgewell/trace-mapping",
|
||||
"jsesc"
|
||||
]
|
||||
},
|
||||
"@babel/helper-compilation-targets@7.29.7": {
|
||||
"integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
|
||||
"dependencies": [
|
||||
"@babel/compat-data",
|
||||
"@babel/helper-validator-option",
|
||||
"browserslist",
|
||||
"lru-cache",
|
||||
"semver"
|
||||
]
|
||||
},
|
||||
"@babel/helper-globals@7.29.7": {
|
||||
"integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="
|
||||
},
|
||||
"@babel/helper-module-imports@7.18.6": {
|
||||
"integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
|
||||
"dependencies": [
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"@babel/helper-module-imports@7.29.7": {
|
||||
"integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
|
||||
"dependencies": [
|
||||
"@babel/traverse",
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"@babel/helper-module-transforms@7.29.7_@babel+core@7.29.7": {
|
||||
"integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
|
||||
"dependencies": [
|
||||
"@babel/core",
|
||||
"@babel/helper-module-imports@7.29.7",
|
||||
"@babel/helper-validator-identifier",
|
||||
"@babel/traverse"
|
||||
]
|
||||
},
|
||||
"@babel/helper-plugin-utils@7.29.7": {
|
||||
"integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="
|
||||
},
|
||||
"@babel/helper-string-parser@7.29.7": {
|
||||
"integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="
|
||||
},
|
||||
"@babel/helper-validator-identifier@7.29.7": {
|
||||
"integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="
|
||||
},
|
||||
"@babel/helper-validator-option@7.29.7": {
|
||||
"integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="
|
||||
},
|
||||
"@babel/helpers@7.29.7": {
|
||||
"integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
|
||||
"dependencies": [
|
||||
"@babel/template",
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"@babel/parser@7.29.8": {
|
||||
"integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
|
||||
"dependencies": [
|
||||
"@babel/types"
|
||||
],
|
||||
"bin": true
|
||||
},
|
||||
"@babel/plugin-syntax-jsx@7.29.7_@babel+core@7.29.7": {
|
||||
"integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
|
||||
"dependencies": [
|
||||
"@babel/core",
|
||||
"@babel/helper-plugin-utils"
|
||||
]
|
||||
},
|
||||
"@babel/template@7.29.7": {
|
||||
"integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
|
||||
"dependencies": [
|
||||
"@babel/code-frame",
|
||||
"@babel/parser",
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"@babel/traverse@7.29.8": {
|
||||
"integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
|
||||
"dependencies": [
|
||||
"@babel/code-frame",
|
||||
"@babel/generator",
|
||||
"@babel/helper-globals",
|
||||
"@babel/parser",
|
||||
"@babel/template",
|
||||
"@babel/types",
|
||||
"debug"
|
||||
]
|
||||
},
|
||||
"@babel/types@7.29.8": {
|
||||
"integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
|
||||
"dependencies": [
|
||||
"@babel/helper-string-parser",
|
||||
"@babel/helper-validator-identifier"
|
||||
]
|
||||
},
|
||||
"@jridgewell/gen-mapping@0.3.13": {
|
||||
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
|
||||
"dependencies": [
|
||||
"@jridgewell/sourcemap-codec",
|
||||
"@jridgewell/trace-mapping"
|
||||
]
|
||||
},
|
||||
"@jridgewell/remapping@2.3.5": {
|
||||
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
|
||||
"dependencies": [
|
||||
"@jridgewell/gen-mapping",
|
||||
"@jridgewell/trace-mapping"
|
||||
]
|
||||
},
|
||||
"@jridgewell/resolve-uri@3.1.2": {
|
||||
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="
|
||||
},
|
||||
"@jridgewell/sourcemap-codec@1.5.5": {
|
||||
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
|
||||
},
|
||||
"@jridgewell/trace-mapping@0.3.31": {
|
||||
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
|
||||
"dependencies": [
|
||||
"@jridgewell/resolve-uri",
|
||||
"@jridgewell/sourcemap-codec"
|
||||
]
|
||||
},
|
||||
"@oxc-project/types@0.142.0": {
|
||||
"integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ=="
|
||||
},
|
||||
"@rolldown/binding-android-arm64@1.2.2": {
|
||||
"integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==",
|
||||
"os": ["android"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@rolldown/binding-darwin-arm64@1.2.2": {
|
||||
"integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==",
|
||||
"os": ["darwin"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@rolldown/binding-darwin-x64@1.2.2": {
|
||||
"integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==",
|
||||
"os": ["darwin"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@rolldown/binding-freebsd-x64@1.2.2": {
|
||||
"integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==",
|
||||
"os": ["freebsd"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@rolldown/binding-linux-arm-gnueabihf@1.2.2": {
|
||||
"integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm"]
|
||||
},
|
||||
"@rolldown/binding-linux-arm64-gnu@1.2.2": {
|
||||
"integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@rolldown/binding-linux-arm64-musl@1.2.2": {
|
||||
"integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@rolldown/binding-linux-ppc64-gnu@1.2.2": {
|
||||
"integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["ppc64"]
|
||||
},
|
||||
"@rolldown/binding-linux-s390x-gnu@1.2.2": {
|
||||
"integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["s390x"]
|
||||
},
|
||||
"@rolldown/binding-linux-x64-gnu@1.2.2": {
|
||||
"integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@rolldown/binding-linux-x64-musl@1.2.2": {
|
||||
"integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@rolldown/binding-openharmony-arm64@1.2.2": {
|
||||
"integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==",
|
||||
"os": ["openharmony"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@rolldown/binding-win32-arm64-msvc@1.2.2": {
|
||||
"integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@rolldown/binding-win32-x64-msvc@1.2.2": {
|
||||
"integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@rolldown/pluginutils@1.0.1": {
|
||||
"integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="
|
||||
},
|
||||
"@tauri-apps/api@2.11.1": {
|
||||
"integrity": "sha512-M2FPuYND2m+wh5hfW9ZpSdxMPdEJovPBWwoHJmwUpysTYNHaOkVFN419m/K0LIgjb/7KU2vBgsUepJWugQCvAA=="
|
||||
},
|
||||
"@tauri-apps/cli-darwin-arm64@2.11.4": {
|
||||
"integrity": "sha512-1ryOF3ZhpZ/nemHV5zVwBQBz9jDGKmKPvWPADOhc83ig0P4bMc2iER4NbC6r9sjeIZ6RVQ4g3RZIYvezhcl4TQ==",
|
||||
"os": ["darwin"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@tauri-apps/cli-darwin-x64@2.11.4": {
|
||||
"integrity": "sha512-uFsGQAAfuyz1k/yGLmkWfkBlgKAqZfxqlHmLWx81QU27RJWfmbNHCIq8T8w1e+VClleIuZUjpHWfoE4E3DLo3A==",
|
||||
"os": ["darwin"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@tauri-apps/cli-linux-arm-gnueabihf@2.11.4": {
|
||||
"integrity": "sha512-IaHZn5CdBL21oUmjiVOS1ctw6Ip1O0pjp70FwOWmYz1myWe0SY96ZIj2FYf7pT0m8bI2h/hrs5ZbEXXh44/MkQ==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm"]
|
||||
},
|
||||
"@tauri-apps/cli-linux-arm64-gnu@2.11.4": {
|
||||
"integrity": "sha512-N41/ukTRVe6XSuUTESuFdGeOW2i7k62tK+6gHK5Kd5/q5RPvvi19GaWAVPPb9u95HSGmTChSolBfzynUsssFaA==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@tauri-apps/cli-linux-arm64-musl@2.11.4": {
|
||||
"integrity": "sha512-v277UnT/fB64xAfSroL5N3Km3tLmvATWqJJw/wRI+g6o+HkeD0slyE7gOhNs1MbjE41R7bQOTxMVoL3aomUJmw==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@tauri-apps/cli-linux-riscv64-gnu@2.11.4": {
|
||||
"integrity": "sha512-qqgNkQ2u1yZHxjhxsZaxUtRDW8dIqIYm33rx/mzwQv0SfY9x1B+iraj8vWeFiXjjSVVhEMepXSOts1TqPzvXNQ==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["riscv64"]
|
||||
},
|
||||
"@tauri-apps/cli-linux-x64-gnu@2.11.4": {
|
||||
"integrity": "sha512-2VRNWl84FOH0m2giiDkO2h0QXlcMJeX+zJDpI5kDIQAx6s+geF3v48F4DXfJez4GS/FdoDGnPnw1C2iYGbQ7bQ==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@tauri-apps/cli-linux-x64-musl@2.11.4": {
|
||||
"integrity": "sha512-o9GyhYor/nc7xarmwDE3ka2szuW3uuZzXjHWh64Q8YX5AtSgxdQkFWzrY4O8KiGtVNvFBI14H3Q49Qj5TOIP/A==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@tauri-apps/cli-win32-arm64-msvc@2.11.4": {
|
||||
"integrity": "sha512-ld5Ehb598m0VkYyylRPNeCFsBe/km0jxis6KgMpl3IGY6I/i1RwQXO05I1AsXUXO2WC6AvB/Lw4qTf/asiuEiQ==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"@tauri-apps/cli-win32-ia32-msvc@2.11.4": {
|
||||
"integrity": "sha512-12Hxi0XX/H5VFxO/bGgHkFWhml9VMgEOu9CidjeCeTNQ1l6fpUlbiGgSP7CLI3PFtW9/FfbeHieZ+kyWK5H7CA==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["ia32"]
|
||||
},
|
||||
"@tauri-apps/cli-win32-x64-msvc@2.11.4": {
|
||||
"integrity": "sha512-+vDiqBIU5dMISg/wNvX3sF+ZHfgJGJ5T0AcO+EHNXV9GGAG+P5fzodlDXD3QdKCRgZxMoCm5PPvj3BqLNjBthw==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"@tauri-apps/cli@2.11.4": {
|
||||
"integrity": "sha512-R8xGtMpwyetawSqm9kYOuMmEqkhUbvcUy8n0aNXIxollKBLESUu5f4Fx+64hgASYm1H+jSWq6jCW6zqTnH6hqQ==",
|
||||
"optionalDependencies": [
|
||||
"@tauri-apps/cli-darwin-arm64",
|
||||
"@tauri-apps/cli-darwin-x64",
|
||||
"@tauri-apps/cli-linux-arm-gnueabihf",
|
||||
"@tauri-apps/cli-linux-arm64-gnu",
|
||||
"@tauri-apps/cli-linux-arm64-musl",
|
||||
"@tauri-apps/cli-linux-riscv64-gnu",
|
||||
"@tauri-apps/cli-linux-x64-gnu",
|
||||
"@tauri-apps/cli-linux-x64-musl",
|
||||
"@tauri-apps/cli-win32-arm64-msvc",
|
||||
"@tauri-apps/cli-win32-ia32-msvc",
|
||||
"@tauri-apps/cli-win32-x64-msvc"
|
||||
],
|
||||
"bin": true
|
||||
},
|
||||
"@tauri-apps/plugin-autostart@2.5.1": {
|
||||
"integrity": "sha512-zS/xx7yzveCcotkA+8TqkI2lysmG2wvQXv2HGAVExITmnFfHAdj1arGsbbfs3o6EktRHf6l34pJxc3YGG2mg7w==",
|
||||
"dependencies": [
|
||||
"@tauri-apps/api"
|
||||
]
|
||||
},
|
||||
"@tauri-apps/plugin-global-shortcut@2.3.2": {
|
||||
"integrity": "sha512-UReHNXrLvpEjylE4jb4oCYiy96uRykPUthoCQCmRXYrd5hs5X9DrW+qOn7GLW57EJN4tdK8bgK5twBTz2NOxzA==",
|
||||
"dependencies": [
|
||||
"@tauri-apps/api"
|
||||
]
|
||||
},
|
||||
"@tauri-apps/plugin-opener@2.5.5": {
|
||||
"integrity": "sha512-xvzGai5aQds8j8R8RsUK/lW6pGG50YgOYIPLzvkqmkwAj7dfySOD7sGtejRzvVdMmv1EQfKVEFh1MvmDp8QR0g==",
|
||||
"dependencies": [
|
||||
"@tauri-apps/api"
|
||||
]
|
||||
},
|
||||
"@types/babel__core@7.20.5": {
|
||||
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
|
||||
"dependencies": [
|
||||
"@babel/parser",
|
||||
"@babel/types",
|
||||
"@types/babel__generator",
|
||||
"@types/babel__template",
|
||||
"@types/babel__traverse"
|
||||
]
|
||||
},
|
||||
"@types/babel__generator@7.27.0": {
|
||||
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
|
||||
"dependencies": [
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"@types/babel__template@7.4.4": {
|
||||
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
|
||||
"dependencies": [
|
||||
"@babel/parser",
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"@types/babel__traverse@7.28.0": {
|
||||
"integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
|
||||
"dependencies": [
|
||||
"@babel/types"
|
||||
]
|
||||
},
|
||||
"babel-plugin-jsx-dom-expressions@0.40.10_@babel+core@7.29.7": {
|
||||
"integrity": "sha512-lxve6Y02YiZTldB7efKpnbf1BH00XCFZNYYW235jSGsYaJNFtHrYlKV6/O+miHbjqpIr9FTe5+0no4hofAMbfA==",
|
||||
"dependencies": [
|
||||
"@babel/core",
|
||||
"@babel/helper-module-imports@7.18.6",
|
||||
"@babel/plugin-syntax-jsx",
|
||||
"@babel/types",
|
||||
"html-entities",
|
||||
"parse5"
|
||||
]
|
||||
},
|
||||
"babel-preset-solid@1.9.15_@babel+core@7.29.7_solid-js@1.9.15": {
|
||||
"integrity": "sha512-GBmg1OiPb+OwcH51XbDAKPtvrPfQW7rCJTJxcp8+yhtWwN+kqnbEJk2SgVybd+uhTxTKAvjaFyiQSr/eUZBwzg==",
|
||||
"dependencies": [
|
||||
"@babel/core",
|
||||
"babel-plugin-jsx-dom-expressions",
|
||||
"solid-js"
|
||||
],
|
||||
"optionalPeers": [
|
||||
"solid-js"
|
||||
]
|
||||
},
|
||||
"baseline-browser-mapping@2.11.12": {
|
||||
"integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==",
|
||||
"bin": true
|
||||
},
|
||||
"browserslist@4.28.7": {
|
||||
"integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==",
|
||||
"dependencies": [
|
||||
"baseline-browser-mapping",
|
||||
"caniuse-lite",
|
||||
"electron-to-chromium",
|
||||
"node-releases",
|
||||
"update-browserslist-db"
|
||||
],
|
||||
"bin": true
|
||||
},
|
||||
"caniuse-lite@1.0.30001806": {
|
||||
"integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="
|
||||
},
|
||||
"convert-source-map@2.0.0": {
|
||||
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
|
||||
},
|
||||
"csstype@3.2.3": {
|
||||
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="
|
||||
},
|
||||
"debug@4.4.3": {
|
||||
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
|
||||
"dependencies": [
|
||||
"ms"
|
||||
]
|
||||
},
|
||||
"detect-libc@2.1.2": {
|
||||
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="
|
||||
},
|
||||
"electron-to-chromium@1.5.400": {
|
||||
"integrity": "sha512-96EWDNjM59SYflgeV5Ylsf4EMiq1a25YjCnJH7cxn/AF2H3pILRweaUnoLax0yKHWdpOzY6JKEu45e8irqZIHA=="
|
||||
},
|
||||
"entities@6.0.1": {
|
||||
"integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="
|
||||
},
|
||||
"escalade@3.2.0": {
|
||||
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="
|
||||
},
|
||||
"fdir@6.5.0_picomatch@4.0.5": {
|
||||
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
|
||||
"dependencies": [
|
||||
"picomatch"
|
||||
],
|
||||
"optionalPeers": [
|
||||
"picomatch"
|
||||
]
|
||||
},
|
||||
"fsevents@2.3.3": {
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"os": ["darwin"],
|
||||
"scripts": true
|
||||
},
|
||||
"gensync@1.0.0-beta.2": {
|
||||
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
|
||||
},
|
||||
"html-entities@2.3.3": {
|
||||
"integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
|
||||
},
|
||||
"is-what@4.1.16": {
|
||||
"integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="
|
||||
},
|
||||
"js-tokens@4.0.0": {
|
||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
|
||||
},
|
||||
"jsesc@3.1.0": {
|
||||
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
|
||||
"bin": true
|
||||
},
|
||||
"json5@2.2.3": {
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"bin": true
|
||||
},
|
||||
"lightningcss-android-arm64@1.33.0": {
|
||||
"integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
|
||||
"os": ["android"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"lightningcss-darwin-arm64@1.33.0": {
|
||||
"integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
|
||||
"os": ["darwin"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"lightningcss-darwin-x64@1.33.0": {
|
||||
"integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
|
||||
"os": ["darwin"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"lightningcss-freebsd-x64@1.33.0": {
|
||||
"integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
|
||||
"os": ["freebsd"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"lightningcss-linux-arm-gnueabihf@1.33.0": {
|
||||
"integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm"]
|
||||
},
|
||||
"lightningcss-linux-arm64-gnu@1.33.0": {
|
||||
"integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"lightningcss-linux-arm64-musl@1.33.0": {
|
||||
"integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"lightningcss-linux-x64-gnu@1.33.0": {
|
||||
"integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"lightningcss-linux-x64-musl@1.33.0": {
|
||||
"integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
|
||||
"os": ["linux"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"lightningcss-win32-arm64-msvc@1.33.0": {
|
||||
"integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["arm64"]
|
||||
},
|
||||
"lightningcss-win32-x64-msvc@1.33.0": {
|
||||
"integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
|
||||
"os": ["win32"],
|
||||
"cpu": ["x64"]
|
||||
},
|
||||
"lightningcss@1.33.0": {
|
||||
"integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
|
||||
"dependencies": [
|
||||
"detect-libc"
|
||||
],
|
||||
"optionalDependencies": [
|
||||
"lightningcss-android-arm64",
|
||||
"lightningcss-darwin-arm64",
|
||||
"lightningcss-darwin-x64",
|
||||
"lightningcss-freebsd-x64",
|
||||
"lightningcss-linux-arm-gnueabihf",
|
||||
"lightningcss-linux-arm64-gnu",
|
||||
"lightningcss-linux-arm64-musl",
|
||||
"lightningcss-linux-x64-gnu",
|
||||
"lightningcss-linux-x64-musl",
|
||||
"lightningcss-win32-arm64-msvc",
|
||||
"lightningcss-win32-x64-msvc"
|
||||
]
|
||||
},
|
||||
"lru-cache@5.1.1": {
|
||||
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||
"dependencies": [
|
||||
"yallist"
|
||||
]
|
||||
},
|
||||
"merge-anything@5.1.7": {
|
||||
"integrity": "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ==",
|
||||
"dependencies": [
|
||||
"is-what"
|
||||
]
|
||||
},
|
||||
"ms@2.1.3": {
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
||||
},
|
||||
"nanoid@3.3.17": {
|
||||
"integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==",
|
||||
"bin": true
|
||||
},
|
||||
"node-releases@2.0.52": {
|
||||
"integrity": "sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A=="
|
||||
},
|
||||
"parse5@7.3.0": {
|
||||
"integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
|
||||
"dependencies": [
|
||||
"entities"
|
||||
]
|
||||
},
|
||||
"picocolors@1.1.1": {
|
||||
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
|
||||
},
|
||||
"picomatch@4.0.5": {
|
||||
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="
|
||||
},
|
||||
"postcss@8.5.25": {
|
||||
"integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
|
||||
"dependencies": [
|
||||
"nanoid",
|
||||
"picocolors",
|
||||
"source-map-js"
|
||||
]
|
||||
},
|
||||
"rolldown@1.2.2": {
|
||||
"integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==",
|
||||
"dependencies": [
|
||||
"@oxc-project/types",
|
||||
"@rolldown/pluginutils"
|
||||
],
|
||||
"optionalDependencies": [
|
||||
"@rolldown/binding-android-arm64",
|
||||
"@rolldown/binding-darwin-arm64",
|
||||
"@rolldown/binding-darwin-x64",
|
||||
"@rolldown/binding-freebsd-x64",
|
||||
"@rolldown/binding-linux-arm-gnueabihf",
|
||||
"@rolldown/binding-linux-arm64-gnu",
|
||||
"@rolldown/binding-linux-arm64-musl",
|
||||
"@rolldown/binding-linux-ppc64-gnu",
|
||||
"@rolldown/binding-linux-s390x-gnu",
|
||||
"@rolldown/binding-linux-x64-gnu",
|
||||
"@rolldown/binding-linux-x64-musl",
|
||||
"@rolldown/binding-openharmony-arm64",
|
||||
"@rolldown/binding-win32-arm64-msvc",
|
||||
"@rolldown/binding-win32-x64-msvc"
|
||||
],
|
||||
"bin": true
|
||||
},
|
||||
"semver@6.3.1": {
|
||||
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
|
||||
"bin": true
|
||||
},
|
||||
"seroval-plugins@1.5.6_seroval@1.5.6": {
|
||||
"integrity": "sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ==",
|
||||
"dependencies": [
|
||||
"seroval"
|
||||
]
|
||||
},
|
||||
"seroval@1.5.6": {
|
||||
"integrity": "sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA=="
|
||||
},
|
||||
"solid-js@1.9.15": {
|
||||
"integrity": "sha512-EeiY2xfpZJqPLjXspVEKjAII4yv8NyG//NxZ3IpOFHdUNnnTyL0uJOeS9LWGvA7cFCz5y94cjFwYlmw5Luncsg==",
|
||||
"dependencies": [
|
||||
"csstype",
|
||||
"seroval",
|
||||
"seroval-plugins"
|
||||
]
|
||||
},
|
||||
"solid-refresh@0.6.3_solid-js@1.9.15": {
|
||||
"integrity": "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==",
|
||||
"dependencies": [
|
||||
"@babel/generator",
|
||||
"@babel/helper-module-imports@7.29.7",
|
||||
"@babel/types",
|
||||
"solid-js"
|
||||
]
|
||||
},
|
||||
"source-map-js@1.2.1": {
|
||||
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
|
||||
},
|
||||
"tinyglobby@0.2.17": {
|
||||
"integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
|
||||
"dependencies": [
|
||||
"fdir",
|
||||
"picomatch"
|
||||
]
|
||||
},
|
||||
"typescript@6.0.3": {
|
||||
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
|
||||
"bin": true
|
||||
},
|
||||
"update-browserslist-db@1.2.3_browserslist@4.28.7": {
|
||||
"integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
|
||||
"dependencies": [
|
||||
"browserslist",
|
||||
"escalade",
|
||||
"picocolors"
|
||||
],
|
||||
"bin": true
|
||||
},
|
||||
"vite-plugin-solid@2.11.14_solid-js@1.9.15_vite@8.2.0": {
|
||||
"integrity": "sha512-7ZVBt8rpoyqmlwin2kRIUveaHoF6/kulY7gsnD+qFh4nS29V4OPAnw+ojoAspXIjObiL9o1xh9a/nTuYHm02Rw==",
|
||||
"dependencies": [
|
||||
"@babel/core",
|
||||
"@types/babel__core",
|
||||
"babel-preset-solid",
|
||||
"merge-anything",
|
||||
"solid-js",
|
||||
"solid-refresh",
|
||||
"vite",
|
||||
"vitefu"
|
||||
]
|
||||
},
|
||||
"vite@8.2.0": {
|
||||
"integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
|
||||
"dependencies": [
|
||||
"lightningcss",
|
||||
"picomatch",
|
||||
"postcss",
|
||||
"rolldown",
|
||||
"tinyglobby"
|
||||
],
|
||||
"optionalDependencies": [
|
||||
"fsevents"
|
||||
],
|
||||
"bin": true
|
||||
},
|
||||
"vitefu@1.1.3_vite@8.2.0": {
|
||||
"integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
|
||||
"dependencies": [
|
||||
"vite"
|
||||
],
|
||||
"optionalPeers": [
|
||||
"vite"
|
||||
]
|
||||
},
|
||||
"yallist@3.1.1": {
|
||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
|
||||
}
|
||||
},
|
||||
"workspace": {
|
||||
"packageJson": {
|
||||
"dependencies": [
|
||||
"npm:@tauri-apps/api@2",
|
||||
"npm:@tauri-apps/cli@2",
|
||||
"npm:@tauri-apps/plugin-autostart@^2.5.1",
|
||||
"npm:@tauri-apps/plugin-global-shortcut@^2.3.2",
|
||||
"npm:@tauri-apps/plugin-opener@2",
|
||||
"npm:solid-js@^1.9.3",
|
||||
"npm:typescript@~6.0.3",
|
||||
"npm:vite-plugin-solid@^2.11.12",
|
||||
"npm:vite@^8.0.16"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<link rel="icon" type="image/svg+xml" href="/src/assets/logo.svg" />
|
||||
<title>Tauri + Solid + Typescript App</title>
|
||||
</head>
|
||||
|
||||
<style>
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
img.icon {
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
-ms-interpolation-mode: nearest-neighbor;
|
||||
}
|
||||
|
||||
html,
|
||||
body,
|
||||
#root {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
background: #1a1a1a;
|
||||
}
|
||||
</style>
|
||||
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
<div id="root"></div>
|
||||
|
||||
<script src="/src/index.tsx" type="module"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "tauri-app",
|
||||
"version": "0.1.0",
|
||||
"description": "",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "vite",
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"serve": "vite preview",
|
||||
"tauri": "tauri"
|
||||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@tauri-apps/plugin-autostart": "^2.5.1",
|
||||
"@tauri-apps/plugin-global-shortcut": "^2.3.2",
|
||||
"solid-js": "^1.9.3",
|
||||
"@tauri-apps/api": "^2",
|
||||
"@tauri-apps/plugin-opener": "^2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "~6.0.3",
|
||||
"vite": "^8.0.16",
|
||||
"vite-plugin-solid": "^2.11.12",
|
||||
"@tauri-apps/cli": "^2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
<svg width="206" height="231" viewBox="0 0 206 231" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M143.143 84C143.143 96.1503 133.293 106 121.143 106C108.992 106 99.1426 96.1503 99.1426 84C99.1426 71.8497 108.992 62 121.143 62C133.293 62 143.143 71.8497 143.143 84Z" fill="#FFC131"/>
|
||||
<ellipse cx="84.1426" cy="147" rx="22" ry="22" transform="rotate(180 84.1426 147)" fill="#24C8DB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M166.738 154.548C157.86 160.286 148.023 164.269 137.757 166.341C139.858 160.282 141 153.774 141 147C141 144.543 140.85 142.121 140.558 139.743C144.975 138.204 149.215 136.139 153.183 133.575C162.73 127.404 170.292 118.608 174.961 108.244C179.63 97.8797 181.207 86.3876 179.502 75.1487C177.798 63.9098 172.884 53.4021 165.352 44.8883C157.82 36.3744 147.99 30.2165 137.042 27.1546C126.095 24.0926 114.496 24.2568 103.64 27.6274C92.7839 30.998 83.1319 37.4317 75.8437 46.1553C74.9102 47.2727 74.0206 48.4216 73.176 49.5993C61.9292 50.8488 51.0363 54.0318 40.9629 58.9556C44.2417 48.4586 49.5653 38.6591 56.679 30.1442C67.0505 17.7298 80.7861 8.57426 96.2354 3.77762C111.685 -1.01901 128.19 -1.25267 143.769 3.10474C159.348 7.46215 173.337 16.2252 184.056 28.3411C194.775 40.457 201.767 55.4101 204.193 71.404C206.619 87.3978 204.374 103.752 197.73 118.501C191.086 133.25 180.324 145.767 166.738 154.548ZM41.9631 74.275L62.5557 76.8042C63.0459 72.813 63.9401 68.9018 65.2138 65.1274C57.0465 67.0016 49.2088 70.087 41.9631 74.275Z" fill="#FFC131"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M38.4045 76.4519C47.3493 70.6709 57.2677 66.6712 67.6171 64.6132C65.2774 70.9669 64 77.8343 64 85.0001C64 87.1434 64.1143 89.26 64.3371 91.3442C60.0093 92.8732 55.8533 94.9092 51.9599 97.4256C42.4128 103.596 34.8505 112.392 30.1816 122.756C25.5126 133.12 23.9357 144.612 25.6403 155.851C27.3449 167.09 32.2584 177.598 39.7906 186.112C47.3227 194.626 57.153 200.784 68.1003 203.846C79.0476 206.907 90.6462 206.743 101.502 203.373C112.359 200.002 122.011 193.568 129.299 184.845C130.237 183.722 131.131 182.567 131.979 181.383C143.235 180.114 154.132 176.91 164.205 171.962C160.929 182.49 155.596 192.319 148.464 200.856C138.092 213.27 124.357 222.426 108.907 227.222C93.458 232.019 76.9524 232.253 61.3736 227.895C45.7948 223.538 31.8055 214.775 21.0867 202.659C10.3679 190.543 3.37557 175.59 0.949823 159.596C-1.47592 143.602 0.768139 127.248 7.41237 112.499C14.0566 97.7497 24.8183 85.2327 38.4045 76.4519ZM163.062 156.711L163.062 156.711C162.954 156.773 162.846 156.835 162.738 156.897C162.846 156.835 162.954 156.773 163.062 156.711Z" fill="#24C8DB"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,7 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
# Generated by Tauri
|
||||
# will have schema files for capabilities auto-completion
|
||||
/gen/schemas
|
||||
@@ -0,0 +1,41 @@
|
||||
[package]
|
||||
name = "tauri-app"
|
||||
version = "0.1.0"
|
||||
description = "A Tauri App"
|
||||
authors = ["you"]
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[lib]
|
||||
# The `_lib` suffix may seem redundant but it is necessary
|
||||
# to make the lib name unique and wouldn't conflict with the bin name.
|
||||
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
|
||||
name = "tauri_app_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2", features = [] }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "2", features = ["tray-icon"] }
|
||||
tauri-plugin-opener = "2"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
dirs = "7.0.0"
|
||||
open = "5.4.4"
|
||||
windows-icons = "0.4.0"
|
||||
base64 = "0.23.1"
|
||||
|
||||
|
||||
# Read the optimization guideline for more details: https://tauri.app/concept/size/#cargo-configuration
|
||||
[profile.release]
|
||||
codegen-units = 1
|
||||
lto = true
|
||||
opt-level = 3
|
||||
panic = "abort"
|
||||
strip = true
|
||||
|
||||
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
||||
tauri-plugin-autostart = "2"
|
||||
tauri-plugin-global-shortcut = "2"
|
||||
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "../gen/schemas/desktop-schema.json",
|
||||
"identifier": "default",
|
||||
"description": "Capability for the main window",
|
||||
"windows": [
|
||||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"opener:default",
|
||||
"core:window:allow-hide",
|
||||
"core:window:allow-show",
|
||||
"core:window:allow-set-focus",
|
||||
"autostart:allow-enable",
|
||||
"autostart:allow-disable",
|
||||
"autostart:allow-is-enabled"
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 567 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 536 B |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 777 B |
|
After Width: | Height: | Size: 1020 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 848 B |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
@@ -0,0 +1,7 @@
|
||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||
pub fn run() {
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_opener::init())
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
use std::fs;
|
||||
use std::path::PathBuf;
|
||||
use tauri::AppHandle;
|
||||
use tauri::{
|
||||
menu::{Menu, MenuItem},
|
||||
tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
|
||||
Manager,
|
||||
};
|
||||
use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, Modifiers, Shortcut, ShortcutState};
|
||||
use windows_icons::{get_icon_base64_by_path_with_size, IconSize};
|
||||
|
||||
#[derive(serde::Serialize)]
|
||||
pub struct AppItem {
|
||||
name: String,
|
||||
path: String,
|
||||
source: String,
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn get_apps() -> Vec<AppItem> {
|
||||
let mut apps = Vec::new();
|
||||
|
||||
if let Some(mut path) = dirs::data_dir() {
|
||||
path.push("Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar");
|
||||
|
||||
if let Ok(entries) = std::fs::read_dir(&path) {
|
||||
for entry in entries.flatten() {
|
||||
let file_path = entry.path();
|
||||
if file_path.extension().unwrap_or_default() == "lnk" {
|
||||
let name = file_path
|
||||
.file_stem()
|
||||
.unwrap_or_default()
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
apps.push(AppItem {
|
||||
name,
|
||||
path: file_path.to_string_lossy().to_string(),
|
||||
source: "Taskbar".to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(mut path) = dirs::data_dir() {
|
||||
path.push("Microsoft\\Windows\\Start Menu\\Programs");
|
||||
if let Ok(entries) = std::fs::read_dir(&path) {
|
||||
for entry in entries.flatten() {
|
||||
let file_path = entry.path();
|
||||
if file_path.extension().unwrap_or_default() == "lnk" {
|
||||
let name = file_path
|
||||
.file_stem()
|
||||
.unwrap_or_default()
|
||||
.to_string_lossy()
|
||||
.to_string();
|
||||
apps.push(AppItem {
|
||||
name,
|
||||
path: file_path.to_string_lossy().to_string(),
|
||||
source: "Start Menu".to_string(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
apps
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn launch_app(path: String) -> Result<(), String> {
|
||||
open::that(path).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
fn pinned_file(app: &AppHandle) -> Result<PathBuf, String> {
|
||||
let dir = app.path().app_data_dir().map_err(|e| e.to_string())?;
|
||||
fs::create_dir_all(&dir).map_err(|e| e.to_string())?;
|
||||
Ok(dir.join("pinned.json"))
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn get_pinned_apps(app: AppHandle) -> Result<Vec<String>, String> {
|
||||
let path = pinned_file(&app)?;
|
||||
if !path.exists() {
|
||||
return Ok(Vec::new());
|
||||
}
|
||||
let data = fs::read_to_string(&path).map_err(|e| e.to_string())?;
|
||||
serde_json::from_str(&data).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn set_pinned_apps(app: AppHandle, paths: Vec<String>) -> Result<(), String> {
|
||||
let path = pinned_file(&app)?;
|
||||
let data = serde_json::to_string_pretty(&paths).map_err(|e| e.to_string())?;
|
||||
fs::write(&path, data).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn get_app_icon(path: String) -> Result<String, String> {
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
let result = get_icon_base64_by_path_with_size(&path, IconSize::Large)
|
||||
.or_else(|_| windows_icons::get_icon_base64_by_path(&path));
|
||||
|
||||
match result {
|
||||
Ok(b64) => {
|
||||
if b64.starts_with("data:") {
|
||||
Ok(b64)
|
||||
} else {
|
||||
Ok(format!("data:image/png;base64,{}", b64))
|
||||
}
|
||||
}
|
||||
Err(_) => Ok(String::new()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
get_apps,
|
||||
launch_app,
|
||||
get_pinned_apps,
|
||||
set_pinned_apps,
|
||||
get_app_icon
|
||||
])
|
||||
.plugin(
|
||||
tauri_plugin_autostart::Builder::new()
|
||||
.args(["--autostart"])
|
||||
.app_name("App Launcher")
|
||||
.build(),
|
||||
)
|
||||
.plugin(
|
||||
tauri_plugin_global_shortcut::Builder::new()
|
||||
.with_handler(|app, shortcut, event| {
|
||||
if event.state == ShortcutState::Pressed {
|
||||
if shortcut.matches(Modifiers::ALT, Code::Space) {
|
||||
if let Some(window) = app.get_webview_window("main") {
|
||||
let is_visible = window.is_visible().unwrap_or(false);
|
||||
if is_visible {
|
||||
window.hide().unwrap();
|
||||
} else {
|
||||
window.show().unwrap();
|
||||
window.set_focus().unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
.build(),
|
||||
)
|
||||
.setup(|app| {
|
||||
let alt_space = Shortcut::new(Some(Modifiers::ALT), Code::Space);
|
||||
app.global_shortcut().register(alt_space)?;
|
||||
|
||||
let show_i = MenuItem::with_id(app, "show", "Показати/Сховати", true, None::<&str>)?;
|
||||
let quit_i = MenuItem::with_id(app, "quit", "Вийти", true, None::<&str>)?;
|
||||
let menu = Menu::with_items(app, &[&show_i, &quit_i])?;
|
||||
|
||||
TrayIconBuilder::new()
|
||||
.icon(app.default_window_icon().unwrap().clone())
|
||||
.menu(&menu)
|
||||
.show_menu_on_left_click(false)
|
||||
.on_tray_icon_event(|tray, event| match event {
|
||||
TrayIconEvent::Click {
|
||||
button: MouseButton::Left,
|
||||
button_state: MouseButtonState::Up,
|
||||
..
|
||||
} => {
|
||||
let app_handle = tray.app_handle();
|
||||
if let Some(window) = app_handle.get_webview_window("main") {
|
||||
let is_visible = window.is_visible().unwrap_or(false);
|
||||
if is_visible {
|
||||
window.hide().unwrap();
|
||||
} else {
|
||||
window.show().unwrap();
|
||||
window.set_focus().unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
})
|
||||
.on_menu_event(|app_handle, event| match event.id.as_ref() {
|
||||
"quit" => std::process::exit(0),
|
||||
"show" => {
|
||||
if let Some(window) = app_handle.get_webview_window("main") {
|
||||
let is_visible = window.is_visible().unwrap_or(false);
|
||||
if is_visible {
|
||||
window.hide().unwrap();
|
||||
} else {
|
||||
window.show().unwrap();
|
||||
window.set_focus().unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
})
|
||||
.build(app)?;
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "tauri-app",
|
||||
"version": "0.1.0",
|
||||
"identifier": "com.tauri-app",
|
||||
"build": {
|
||||
"beforeDevCommand": "deno task dev",
|
||||
"devUrl": "http://localhost:1420",
|
||||
"beforeBuildCommand": "deno task build",
|
||||
"frontendDist": "../dist"
|
||||
},
|
||||
"app": {
|
||||
"windows": [
|
||||
{
|
||||
"title": "Launcher",
|
||||
"width": 700,
|
||||
"height": 400,
|
||||
"visible": false,
|
||||
"decorations": false,
|
||||
"transparent": true,
|
||||
"center": true,
|
||||
"skipTaskbar": true
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"csp": null
|
||||
}
|
||||
},
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,604 @@
|
||||
import {
|
||||
createSignal,
|
||||
createMemo,
|
||||
onMount,
|
||||
Show,
|
||||
For,
|
||||
createEffect,
|
||||
} from "solid-js";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { getCurrentWindow } from "@tauri-apps/api/window";
|
||||
|
||||
type AppItem = {
|
||||
name: string;
|
||||
path: string;
|
||||
source: string;
|
||||
};
|
||||
|
||||
type View = "launcher" | "settings";
|
||||
|
||||
const COLS = 5;
|
||||
|
||||
function App() {
|
||||
const [apps, setApps] = createSignal<AppItem[]>([]);
|
||||
const [pinnedPaths, setPinnedPaths] = createSignal<string[]>([]);
|
||||
const [searchQuery, setSearchQuery] = createSignal("");
|
||||
const [selectedIndex, setSelectedIndex] = createSignal(0);
|
||||
const [view, setView] = createSignal<View>("launcher");
|
||||
const [loading, setLoading] = createSignal(true);
|
||||
const [error, setError] = createSignal<string | null>(null);
|
||||
const [iconCache, setIconCache] = createSignal<Record<string, string>>({});
|
||||
|
||||
const [dragIndex, setDragIndex] = createSignal<number | null>(null);
|
||||
const [dragOverIndex, setDragOverIndex] = createSignal<number | null>(null);
|
||||
|
||||
let inputRef: HTMLInputElement | undefined;
|
||||
let gridRef: HTMLDivElement | undefined;
|
||||
|
||||
onMount(async () => {
|
||||
try {
|
||||
const [loadedApps, pinned] = await Promise.all([
|
||||
invoke<AppItem[]>("get_apps"),
|
||||
invoke<string[]>("get_pinned_apps").catch(() => [] as string[]),
|
||||
]);
|
||||
setApps(loadedApps);
|
||||
setPinnedPaths(pinned);
|
||||
} catch (e) {
|
||||
setError(String(e));
|
||||
console.error(e);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
queueMicrotask(() => inputRef?.focus());
|
||||
}
|
||||
});
|
||||
|
||||
const loadIcon = async (path: string) => {
|
||||
if (iconCache()[path] !== undefined) return;
|
||||
try {
|
||||
const dataUrl = await invoke<string>("get_app_icon", { path });
|
||||
setIconCache((prev) => ({ ...prev, [path]: dataUrl || "" }));
|
||||
} catch {
|
||||
setIconCache((prev) => ({ ...prev, [path]: "" }));
|
||||
}
|
||||
};
|
||||
|
||||
const pinnedApps = createMemo(() => {
|
||||
const order = pinnedPaths();
|
||||
const byPath = new Map(apps().map((a) => [a.path, a]));
|
||||
return order.map((p) => byPath.get(p)).filter((a): a is AppItem => !!a);
|
||||
});
|
||||
|
||||
const filteredApps = createMemo(() => {
|
||||
const query = searchQuery().toLowerCase().trim();
|
||||
const all = apps();
|
||||
const pinnedSet = new Set(pinnedPaths());
|
||||
|
||||
if (!query) return pinnedApps();
|
||||
|
||||
const matched = all.filter((app) =>
|
||||
app.name.toLowerCase().includes(query)
|
||||
);
|
||||
const pinnedMatched = matched.filter((a) => pinnedSet.has(a.path));
|
||||
const rest = matched.filter((a) => !pinnedSet.has(a.path));
|
||||
return [...pinnedMatched, ...rest];
|
||||
});
|
||||
|
||||
createEffect(() => {
|
||||
const list = view() === "settings" ? pinnedApps() : filteredApps();
|
||||
list.forEach((app) => loadIcon(app.path));
|
||||
});
|
||||
|
||||
// Скрол до вибраного елемента
|
||||
createEffect(() => {
|
||||
const idx = selectedIndex();
|
||||
const el = gridRef?.querySelector(`[data-index="${idx}"]`) as HTMLElement | null;
|
||||
el?.scrollIntoView({ block: "nearest", behavior: "smooth" });
|
||||
});
|
||||
|
||||
const launchApp = async (path: string) => {
|
||||
try {
|
||||
await invoke("launch_app", { path });
|
||||
setSearchQuery("");
|
||||
setSelectedIndex(0);
|
||||
await getCurrentWindow().hide();
|
||||
} catch (e) {
|
||||
console.error("Помилка запуску:", e);
|
||||
}
|
||||
};
|
||||
|
||||
const persistPins = async (next: string[]) => {
|
||||
const prev = pinnedPaths();
|
||||
setPinnedPaths(next);
|
||||
try {
|
||||
await invoke("set_pinned_apps", { paths: next });
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
setPinnedPaths(prev);
|
||||
}
|
||||
};
|
||||
|
||||
const togglePin = (path: string) => {
|
||||
const current = pinnedPaths();
|
||||
const next = current.includes(path)
|
||||
? current.filter((p) => p !== path)
|
||||
: [...current, path];
|
||||
persistPins(next);
|
||||
};
|
||||
|
||||
const removePinned = (path: string) => {
|
||||
persistPins(pinnedPaths().filter((p) => p !== path));
|
||||
};
|
||||
|
||||
const onDragStart = (index: number) => setDragIndex(index);
|
||||
const onDragOver = (e: DragEvent, index: number) => {
|
||||
e.preventDefault();
|
||||
setDragOverIndex(index);
|
||||
};
|
||||
const onDrop = (index: number) => {
|
||||
const from = dragIndex();
|
||||
if (from === null || from === index) {
|
||||
setDragIndex(null);
|
||||
setDragOverIndex(null);
|
||||
return;
|
||||
}
|
||||
const list = [...pinnedPaths()];
|
||||
const [item] = list.splice(from, 1);
|
||||
list.splice(index, 0, item);
|
||||
persistPins(list);
|
||||
setDragIndex(null);
|
||||
setDragOverIndex(null);
|
||||
};
|
||||
const onDragEnd = () => {
|
||||
setDragIndex(null);
|
||||
setDragOverIndex(null);
|
||||
};
|
||||
|
||||
const moveSelection = (delta: number) => {
|
||||
const len = filteredApps().length;
|
||||
if (len === 0) return;
|
||||
setSelectedIndex((i) => {
|
||||
const next = i + delta;
|
||||
if (next < 0) return 0;
|
||||
if (next >= len) return len - 1;
|
||||
return next;
|
||||
});
|
||||
};
|
||||
|
||||
const handleKeyDown = (e: KeyboardEvent) => {
|
||||
if (view() === "settings") {
|
||||
if (e.key === "Escape") {
|
||||
setView("launcher");
|
||||
setSelectedIndex(0);
|
||||
queueMicrotask(() => inputRef?.focus());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const list = filteredApps();
|
||||
const len = list.length;
|
||||
|
||||
if (e.key === "Tab") {
|
||||
e.preventDefault();
|
||||
if (document.activeElement === inputRef) {
|
||||
gridRef?.focus();
|
||||
} else {
|
||||
inputRef?.focus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (e.key === "ArrowRight") {
|
||||
e.preventDefault();
|
||||
moveSelection(1);
|
||||
gridRef?.focus();
|
||||
} else if (e.key === "ArrowLeft") {
|
||||
e.preventDefault();
|
||||
moveSelection(-1);
|
||||
gridRef?.focus();
|
||||
} else if (e.key === "ArrowDown") {
|
||||
e.preventDefault();
|
||||
moveSelection(COLS);
|
||||
gridRef?.focus();
|
||||
} else if (e.key === "ArrowUp") {
|
||||
e.preventDefault();
|
||||
moveSelection(-COLS);
|
||||
gridRef?.focus();
|
||||
} else if (e.key === "Enter" && len > 0) {
|
||||
e.preventDefault();
|
||||
launchApp(list[selectedIndex()].path);
|
||||
} else if (e.key === "Escape") {
|
||||
getCurrentWindow().hide();
|
||||
} else if ((e.ctrlKey || e.metaKey) && e.key === ",") {
|
||||
e.preventDefault();
|
||||
setView("settings");
|
||||
} else if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "p") {
|
||||
e.preventDefault();
|
||||
const app = list[selectedIndex()];
|
||||
if (app) togglePin(app.path);
|
||||
} else if (
|
||||
e.key.length === 1 &&
|
||||
!e.ctrlKey &&
|
||||
!e.metaKey &&
|
||||
!e.altKey &&
|
||||
document.activeElement !== inputRef
|
||||
) {
|
||||
inputRef?.focus();
|
||||
}
|
||||
};
|
||||
|
||||
const handleInput = (e: Event) => {
|
||||
setSearchQuery((e.target as HTMLInputElement).value);
|
||||
setSelectedIndex(0);
|
||||
};
|
||||
|
||||
// ---------- стилі ----------
|
||||
const s = {
|
||||
root: {
|
||||
width: "100%",
|
||||
height: "100vh",
|
||||
background: "#1a1a1a",
|
||||
color: "#e8e8e8",
|
||||
"font-family":
|
||||
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
||||
display: "flex",
|
||||
"flex-direction": "column",
|
||||
overflow: "hidden",
|
||||
"user-select": "none",
|
||||
} as const,
|
||||
header: {
|
||||
padding: "12px 12px 8px",
|
||||
"border-bottom": "1px solid #2e2e2e",
|
||||
"flex-shrink": 0,
|
||||
} as const,
|
||||
input: {
|
||||
width: "100%",
|
||||
padding: "11px 14px",
|
||||
"font-size": "16px",
|
||||
"border-radius": "10px",
|
||||
border: "1px solid #3a3a3a",
|
||||
background: "#252525",
|
||||
color: "#fff",
|
||||
outline: "none",
|
||||
"box-sizing": "border-box",
|
||||
} as const,
|
||||
grid: {
|
||||
flex: 1,
|
||||
"overflow-y": "auto",
|
||||
padding: "12px",
|
||||
display: "grid",
|
||||
"grid-template-columns": `repeat(${COLS}, 1fr)`,
|
||||
gap: "10px",
|
||||
"align-content": "start",
|
||||
outline: "none",
|
||||
} as const,
|
||||
tile: (selected: boolean, pinned: boolean) =>
|
||||
({
|
||||
display: "flex",
|
||||
"flex-direction": "column",
|
||||
"align-items": "center",
|
||||
"justify-content": "flex-start",
|
||||
gap: "6px",
|
||||
padding: "10px 6px 8px",
|
||||
"border-radius": "12px",
|
||||
cursor: "pointer",
|
||||
background: selected ? "#2a4060" : "transparent",
|
||||
border: selected
|
||||
? "1px solid #4a9eff"
|
||||
: pinned
|
||||
? "1px solid #2a3a50"
|
||||
: "1px solid transparent",
|
||||
transition: "background 0.08s ease, border-color 0.08s ease",
|
||||
"min-width": 0,
|
||||
position: "relative",
|
||||
}) as const,
|
||||
iconWrap: {
|
||||
width: "48px",
|
||||
height: "48px",
|
||||
"border-radius": "10px",
|
||||
overflow: "hidden",
|
||||
background: "#2a2a2a",
|
||||
display: "flex",
|
||||
"align-items": "center",
|
||||
"justify-content": "center",
|
||||
"flex-shrink": 0,
|
||||
} as const,
|
||||
iconImg: {
|
||||
width: "48px",
|
||||
height: "48px",
|
||||
"object-fit": "contain",
|
||||
} as const,
|
||||
iconFallback: {
|
||||
"font-size": "18px",
|
||||
color: "#888",
|
||||
"font-weight": 600,
|
||||
} as const,
|
||||
tileName: {
|
||||
"font-size": "11px",
|
||||
"font-weight": 500,
|
||||
"text-align": "center",
|
||||
"line-height": 1.25,
|
||||
color: "#ccc",
|
||||
width: "100%",
|
||||
overflow: "hidden",
|
||||
"text-overflow": "ellipsis",
|
||||
"white-space": "nowrap",
|
||||
"padding-left": "2px",
|
||||
"padding-right": "2px",
|
||||
} as const,
|
||||
pinBadge: {
|
||||
position: "absolute",
|
||||
top: "4px",
|
||||
right: "4px",
|
||||
"font-size": "10px",
|
||||
color: "#4a9eff",
|
||||
"line-height": 1,
|
||||
} as const,
|
||||
empty: {
|
||||
"grid-column": `1 / -1`,
|
||||
padding: "40px 16px",
|
||||
"text-align": "center",
|
||||
color: "#666",
|
||||
"font-size": "13px",
|
||||
"line-height": 1.5,
|
||||
"white-space": "pre-line",
|
||||
} as const,
|
||||
settingsHeader: {
|
||||
display: "flex",
|
||||
"align-items": "center",
|
||||
"justify-content": "space-between",
|
||||
padding: "12px 14px",
|
||||
"border-bottom": "1px solid #2e2e2e",
|
||||
"flex-shrink": 0,
|
||||
} as const,
|
||||
backBtn: {
|
||||
background: "transparent",
|
||||
border: "1px solid #444",
|
||||
color: "#ccc",
|
||||
padding: "5px 10px",
|
||||
"border-radius": "6px",
|
||||
cursor: "pointer",
|
||||
"font-size": "12px",
|
||||
} as const,
|
||||
sectionTitle: {
|
||||
padding: "10px 14px 4px",
|
||||
"font-size": "11px",
|
||||
color: "#666",
|
||||
"text-transform": "uppercase",
|
||||
"letter-spacing": "0.06em",
|
||||
} as const,
|
||||
settingsList: {
|
||||
flex: 1,
|
||||
"overflow-y": "auto",
|
||||
padding: "8px",
|
||||
margin: 0,
|
||||
"list-style": "none",
|
||||
} as const,
|
||||
settingsItem: (isDragOver: boolean) =>
|
||||
({
|
||||
display: "flex",
|
||||
"align-items": "center",
|
||||
gap: "10px",
|
||||
padding: "8px 10px",
|
||||
"border-radius": "8px",
|
||||
background: isDragOver ? "#2a3a4a" : "transparent",
|
||||
"border-left": "3px solid #4a9eff",
|
||||
margin: "2px 0",
|
||||
}) as const,
|
||||
settingsName: {
|
||||
flex: 1,
|
||||
"min-width": 0,
|
||||
"font-size": "13px",
|
||||
"font-weight": 500,
|
||||
overflow: "hidden",
|
||||
"text-overflow": "ellipsis",
|
||||
"white-space": "nowrap",
|
||||
} as const,
|
||||
settingsSource: {
|
||||
"font-size": "11px",
|
||||
color: "#777",
|
||||
overflow: "hidden",
|
||||
"text-overflow": "ellipsis",
|
||||
"white-space": "nowrap",
|
||||
} as const,
|
||||
iconBtn: {
|
||||
background: "transparent",
|
||||
border: "none",
|
||||
color: "#666",
|
||||
cursor: "pointer",
|
||||
"font-size": "14px",
|
||||
padding: "4px 6px",
|
||||
"line-height": 1,
|
||||
} as const,
|
||||
footer: {
|
||||
padding: "6px 12px",
|
||||
"border-top": "1px solid #2e2e2e",
|
||||
"font-size": "11px",
|
||||
color: "#555",
|
||||
display: "flex",
|
||||
"justify-content": "space-between",
|
||||
"align-items": "center",
|
||||
"flex-shrink": 0,
|
||||
} as const,
|
||||
dragHandle: {
|
||||
color: "#555",
|
||||
cursor: "grab",
|
||||
"font-size": "14px",
|
||||
padding: "0 4px",
|
||||
} as const,
|
||||
};
|
||||
|
||||
const AppIcon = (props: { path: string; name: string; size?: number }) => {
|
||||
const src = () => iconCache()[props.path];
|
||||
const letter = () => (props.name[0] || "?").toUpperCase();
|
||||
const size = props.size ?? 48;
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
...s.iconWrap,
|
||||
width: `${size}px`,
|
||||
height: `${size}px`,
|
||||
}}
|
||||
>
|
||||
<Show
|
||||
when={src()}
|
||||
fallback={
|
||||
<span style={{ ...s.iconFallback, "font-size": `${size * 0.38}px` }}>
|
||||
{letter()}
|
||||
</span>
|
||||
}
|
||||
>
|
||||
<img
|
||||
src={src()}
|
||||
alt=""
|
||||
draggable={false}
|
||||
style={{
|
||||
width: `${size}px`,
|
||||
height: `${size}px`,
|
||||
"object-fit": "contain",
|
||||
}}
|
||||
/>
|
||||
</Show>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div style={s.root} onKeyDown={handleKeyDown} tabIndex={-1}>
|
||||
{/* ========== LAUNCHER ========== */}
|
||||
<Show when={view() === "launcher"}>
|
||||
<div style={s.header}>
|
||||
<input
|
||||
ref={inputRef}
|
||||
type="text"
|
||||
placeholder="Пошук програм..."
|
||||
value={searchQuery()}
|
||||
onInput={handleInput}
|
||||
autofocus
|
||||
style={s.input}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div ref={gridRef} style={s.grid} tabIndex={0}>
|
||||
<Show when={loading()}>
|
||||
<div style={s.empty}>Завантаження...</div>
|
||||
</Show>
|
||||
|
||||
<Show when={!loading() && error()}>
|
||||
<div style={s.empty}>Помилка: {error()}</div>
|
||||
</Show>
|
||||
|
||||
<Show when={!loading() && !error() && filteredApps().length === 0}>
|
||||
<div style={s.empty}>
|
||||
{searchQuery().trim()
|
||||
? "Нічого не знайдено"
|
||||
: "Немає закріплених програм.\nЗнайдіть програму і натисніть Ctrl+P"}
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
<For each={filteredApps()}>
|
||||
{(app, index) => {
|
||||
const isPinned = () => pinnedPaths().includes(app.path);
|
||||
const isSelected = () => index() === selectedIndex();
|
||||
|
||||
return (
|
||||
<div
|
||||
data-index={index()}
|
||||
style={s.tile(isSelected(), isPinned())}
|
||||
onClick={() => launchApp(app.path)}
|
||||
onMouseEnter={() => setSelectedIndex(index())}
|
||||
onContextMenu={(e) => {
|
||||
e.preventDefault();
|
||||
togglePin(app.path);
|
||||
}}
|
||||
title={app.name}
|
||||
>
|
||||
<Show when={isPinned()}>
|
||||
<span style={s.pinBadge}>★</span>
|
||||
</Show>
|
||||
<AppIcon path={app.path} name={app.name} />
|
||||
<div style={s.tileName}>{app.name}</div>
|
||||
</div>
|
||||
);
|
||||
}}
|
||||
</For>
|
||||
</div>
|
||||
|
||||
<div style={s.footer}>
|
||||
<span>←→↑↓ · Enter · Ctrl+P пін · ПКМ пін</span>
|
||||
<span
|
||||
style={{ cursor: "pointer", color: "#777" }}
|
||||
onClick={() => setView("settings")}
|
||||
>
|
||||
Ctrl+, налаштування
|
||||
</span>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* ========== SETTINGS ========== */}
|
||||
<Show when={view() === "settings"}>
|
||||
<div style={s.settingsHeader}>
|
||||
<button style={s.backBtn} onClick={() => setView("launcher")}>
|
||||
← Назад
|
||||
</button>
|
||||
<span style={{ "font-weight": 600, "font-size": "14px" }}>
|
||||
Закріплені
|
||||
</span>
|
||||
<div style={{ width: "64px" }} />
|
||||
</div>
|
||||
|
||||
<div style={s.sectionTitle}>
|
||||
Перетягни для зміни порядку · {pinnedApps().length}
|
||||
</div>
|
||||
|
||||
<ul style={s.settingsList}>
|
||||
<Show when={pinnedApps().length === 0}>
|
||||
<div style={s.empty}>
|
||||
Немає закріплених.
|
||||
{"\n"}
|
||||
У пошуку натисни Ctrl+P або ПКМ на плитці.
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
<For each={pinnedApps()}>
|
||||
{(app, index) => {
|
||||
const isOver = () => dragOverIndex() === index();
|
||||
|
||||
return (
|
||||
<li
|
||||
draggable={true}
|
||||
style={s.settingsItem(isOver())}
|
||||
onDragStart={() => onDragStart(index())}
|
||||
onDragOver={(e) => onDragOver(e, index())}
|
||||
onDrop={() => onDrop(index())}
|
||||
onDragEnd={onDragEnd}
|
||||
>
|
||||
<span style={s.dragHandle}>⠿</span>
|
||||
<AppIcon path={app.path} name={app.name} size={28} />
|
||||
<div style={{ flex: 1, "min-width": 0 }}>
|
||||
<div style={s.settingsName}>{app.name}</div>
|
||||
<div style={s.settingsSource}>{app.source}</div>
|
||||
</div>
|
||||
<button
|
||||
tabIndex={-1}
|
||||
style={{ ...s.iconBtn, color: "#c55" }}
|
||||
title="Видалити"
|
||||
onClick={() => removePinned(app.path)}
|
||||
>
|
||||
✕
|
||||
</button>
|
||||
</li>
|
||||
);
|
||||
}}
|
||||
</For>
|
||||
</ul>
|
||||
|
||||
<div style={s.footer}>
|
||||
<span>Esc — назад</span>
|
||||
</div>
|
||||
</Show>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 166 155.3"><path d="M163 35S110-4 69 5l-3 1c-6 2-11 5-14 9l-2 3-15 26 26 5c11 7 25 10 38 7l46 9 18-30z" fill="#76b3e1"/><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="27.5" y1="3" x2="152" y2="63.5"><stop offset=".1" stop-color="#76b3e1"/><stop offset=".3" stop-color="#dcf2fd"/><stop offset="1" stop-color="#76b3e1"/></linearGradient><path d="M163 35S110-4 69 5l-3 1c-6 2-11 5-14 9l-2 3-15 26 26 5c11 7 25 10 38 7l46 9 18-30z" opacity=".3" fill="url(#a)"/><path d="M52 35l-4 1c-17 5-22 21-13 35 10 13 31 20 48 15l62-21S92 26 52 35z" fill="#518ac8"/><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="95.8" y1="32.6" x2="74" y2="105.2"><stop offset="0" stop-color="#76b3e1"/><stop offset=".5" stop-color="#4377bb"/><stop offset="1" stop-color="#1f3b77"/></linearGradient><path d="M52 35l-4 1c-17 5-22 21-13 35 10 13 31 20 48 15l62-21S92 26 52 35z" opacity=".3" fill="url(#b)"/><linearGradient id="c" gradientUnits="userSpaceOnUse" x1="18.4" y1="64.2" x2="144.3" y2="149.8"><stop offset="0" stop-color="#315aa9"/><stop offset=".5" stop-color="#518ac8"/><stop offset="1" stop-color="#315aa9"/></linearGradient><path d="M134 80a45 45 0 00-48-15L24 85 4 120l112 19 20-36c4-7 3-15-2-23z" fill="url(#c)"/><linearGradient id="d" gradientUnits="userSpaceOnUse" x1="75.2" y1="74.5" x2="24.4" y2="260.8"><stop offset="0" stop-color="#4377bb"/><stop offset=".5" stop-color="#1a336b"/><stop offset="1" stop-color="#1a336b"/></linearGradient><path d="M114 115a45 45 0 00-48-15L4 120s53 40 94 30l3-1c17-5 23-21 13-34z" fill="url(#d)"/></svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,8 @@
|
||||
/* @refresh reload */
|
||||
import { render } from "solid-js/web";
|
||||
import App from "./App";
|
||||
import { enable } from "@tauri-apps/plugin-autostart";
|
||||
|
||||
await enable();
|
||||
|
||||
render(() => <App />, document.getElementById("root") as HTMLElement);
|
||||
@@ -0,0 +1 @@
|
||||
/// <reference types="vite/client" />
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"useDefineForClassFields": true,
|
||||
"module": "ESNext",
|
||||
"lib": [
|
||||
"ES2020",
|
||||
"DOM"
|
||||
],
|
||||
"skipLibCheck": true,
|
||||
/* Bundler mode */
|
||||
"moduleResolution": "bundler",
|
||||
"allowImportingTsExtensions": true,
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
"jsx": "preserve",
|
||||
"jsxImportSource": "solid-js",
|
||||
/* Linting */
|
||||
"strict": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"paths": {
|
||||
"@/*": [
|
||||
"./src/*"
|
||||
]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"src"
|
||||
],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.node.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"skipLibCheck": true,
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "bundler",
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"include": ["vite.config.ts"]
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
import { defineConfig } from "vite";
|
||||
import solid from "vite-plugin-solid";
|
||||
// @ts-expect-error type error without @types/node package
|
||||
import process from "node:process";
|
||||
const host = process.env.TAURI_DEV_HOST;
|
||||
|
||||
// https://vite.dev/config/
|
||||
export default defineConfig(() => ({
|
||||
plugins: [solid()],
|
||||
|
||||
// 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,
|
||||
host: host || false,
|
||||
hmr: host
|
||||
? {
|
||||
protocol: "ws",
|
||||
host,
|
||||
port: 1421,
|
||||
}
|
||||
: undefined,
|
||||
watch: {
|
||||
// 3. tell Vite to ignore watching `src-tauri`
|
||||
ignored: ["**/src-tauri/**"],
|
||||
},
|
||||
},
|
||||
}));
|
||||