chore: Merge main branch

This commit is contained in:
LynithDev 2024-08-14 10:15:44 +02:00
commit 7185361b65
49 changed files with 892 additions and 1104 deletions

129
.vscode/settings.json vendored
View file

@ -44,14 +44,6 @@
"rust-analyzer.cargo.extraEnv": {}, "rust-analyzer.cargo.extraEnv": {},
"rust-analyzer.check.targets": null, "rust-analyzer.check.targets": null,
"rust-analyzer.showUnlinkedFileNotification": false, "rust-analyzer.showUnlinkedFileNotification": false,
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.code-search": true,
"**/pnpm-lock.yaml": true,
"**/.gitignore": true,
"**/dist": true
},
// Disable the default formatter // Disable the default formatter
"prettier.enable": false, "prettier.enable": false,
@ -62,7 +54,6 @@
"source.organizeImports": "never" "source.organizeImports": "never"
}, },
"eslint.runtime": "node", "eslint.runtime": "node",
"eslint.useFlatConfig": true,
// Silent the stylistic rules in you IDE, but still auto fix them // Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [ "eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off", "fixable": true }, { "rule": "style/*", "severity": "off", "fixable": true },
@ -87,26 +78,112 @@
"json", "json",
"jsonc", "jsonc",
"yaml", "yaml",
"xml",
"astro", "astro",
"toml" "toml",
"graphql",
"gql",
"xml",
"css",
"less",
"scss",
"pcss",
"postcss"
], ],
"eslint.lintTask.enable": true,
"eslint.workingDirectories": [], "eslint.options": {
"flags": ["unstable_ts_config"]
},
// updated 2024-08-03 17:32
// https://github.com/antfu/vscode-file-nesting-config
"explorer.fileNesting.enabled": true, "explorer.fileNesting.enabled": true,
"explorer.fileNesting.expand": false,
"explorer.fileNesting.patterns": { "explorer.fileNesting.patterns": {
"*.ts": "${capture}.js", ".clang-tidy": ".clang-format, .clangd, compile_commands.json",
"*.js": "${capture}.js.map, ${capture}.min.js, ${capture}.d.ts", ".env": "*.env, .env.*, .envrc, env.d.ts",
"*.jsx": "${capture}.js", ".gitignore": ".gitattributes, .gitmodules, .gitmessage, .mailmap, .git-blame*",
"*.tsx": "${capture}.ts", ".project": ".classpath",
".npmrc": ".nvmrc, .yarnrc.yml", "+layout.svelte": "+layout.ts,+layout.ts,+layout.js,+layout.server.ts,+layout.server.js,+layout.gql",
".gitignore": ".eslintignore, .prettierignore", "+page.svelte": "+page.server.ts,+page.server.js,+page.ts,+page.js,+page.gql",
"README.md": "CONTRIBUTING.md, CODE_OF_CONDUCT.md, LICENSE", "ansible.cfg": "ansible.cfg, .ansible-lint, requirements.yml",
"Cargo.toml": "Cargo.lock", "app.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
".eslintrc.js": ".eslintcache", "artisan": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, server.php, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, webpack.mix.js, windi.config.*",
".prettierrc.*": ".rustfmt.toml, .gitattributes, .editorconfig, .clippy.toml", "astro.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, pnpm-workspace.yaml, .pnp.cjs, .pnp.loader.mjs", "BUILD.bazel": "*.bzl, *.bazel, *.bazelrc, bazel.rc, .bazelignore, .bazelproject, WORKSPACE",
"tsconfig.json": "tsconfig.*.json", "Cargo.toml": ".clippy.toml, .rustfmt.toml, cargo.lock, clippy.toml, cross.toml, rust-toolchain.toml, rustfmt.toml",
"flake.nix": "shell.nix, flake.lock, Cargo.nix" "CMakeLists.txt": "*.cmake, *.cmake.in, .cmake-format.yaml, CMakePresets.json, CMakeCache.txt",
"composer.json": ".php*.cache, composer.lock, phpunit.xml*, psalm*.xml",
"default.nix": "shell.nix",
"deno.json*": "*.env, .env.*, .envrc, api-extractor.json, deno.lock, env.d.ts, import-map.json, import_map.json, jsconfig.*, tsconfig.*, tsdoc.*",
"Dockerfile": "*.dockerfile, .devcontainer.*, .dockerignore, captain-definition, compose.*, docker-compose.*, dockerfile*",
"flake.nix": "flake.lock",
"gatsby-config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, gatsby-browser.*, gatsby-node.*, gatsby-ssr.*, gatsby-transformer.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"gemfile": ".ruby-version, gemfile.lock",
"go.mod": ".air*, go.sum",
"go.work": "go.work.sum",
"hatch.toml": ".editorconfig, .flake8, .isort.cfg, .python-version, hatch.toml, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
"I*.cs": "$(capture).cs",
"Makefile": "*.mk",
"mix.exs": ".credo.exs, .dialyzer_ignore.exs, .formatter.exs, .iex.exs, .tool-versions, mix.lock",
"next.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, next-env.d.ts, next-i18next.config.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"nuxt.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .nuxtignore, .nuxtrc, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"package.json": ".browserslist*, .circleci*, .commitlint*, .cz-config.js, .czrc, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .firebase*, .flowconfig, .github*, .gitlab*, .gitmojirc.json, .gitpod*, .huskyrc*, .jslint*, .knip.*, .lintstagedrc*, .markdownlint*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .pylintrc, .release-please*.json, .releaserc*, .ruff.toml, .sentry*, .simple-git-hooks*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, apollo.config.*, appveyor*, azure-pipelines*, biome.json*, bower.json, build.config.*, bun.lockb, bunfig.toml, commitlint*, crowdin*, dangerfile*, dlint.json, dprint.json*, electron-builder.*, eslint*, firebase.json, grunt*, gulp*, jenkins*, knip.*, lerna*, lint-staged*, nest-cli.*, netlify*, nodemon*, npm-shrinkwrap.json, nx.*, package-lock.json, package.nls*.json, phpcs.xml, pm2.*, pnpm*, prettier*, pullapprove*, pyrightconfig.json, release-please*.json, release-tasks.sh, release.config.*, renovate*, rollup.config.*, rspack*, ruff.toml, simple-git-hooks*, sonar-project.properties, stylelint*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, webpack*, workspace.json, wrangler.toml, xo.config.*, yarn*",
"Pipfile": ".editorconfig, .flake8, .isort.cfg, .python-version, Pipfile, Pipfile.lock, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
"pubspec.yaml": ".metadata, .packages, all_lint_rules.yaml, analysis_options.yaml, build.yaml, pubspec.lock, pubspec_overrides.yaml",
"pyproject.toml": ".commitlint*, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .flake8, .flowconfig, .isort.cfg, .jslint*, .lintstagedrc*, .markdownlint*, .pdm-python, .pdm.toml, .prettier*, .pylintrc, .python-version, .ruff.toml, .stylelint*, .textlint*, .xo-config*, .yamllint*, MANIFEST.in, Pipfile, Pipfile.lock, biome.json*, commitlint*, dangerfile*, dlint.json, dprint.json*, eslint*, hatch.toml, lint-staged*, pdm.lock, phpcs.xml, poetry.lock, poetry.toml, prettier*, pyproject.toml, pyrightconfig.json, requirements*.in, requirements*.pip, requirements*.txt, ruff.toml, setup.cfg, setup.py, stylelint*, tox.ini, tslint*, xo.config.*",
"quasar.conf.js": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, quasar.extensions.json, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"readme*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README-*, README_*, RELEASE_NOTES*, Readme-*, Readme_*, Release_Notes*, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme-*, readme_*, release_notes*, security.md, sponsors*",
"Readme*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README-*, README_*, RELEASE_NOTES*, Readme-*, Readme_*, Release_Notes*, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme-*, readme_*, release_notes*, security.md, sponsors*",
"README*": "AUTHORS, Authors, BACKERS*, Backers*, CHANGELOG*, CITATION*, CODEOWNERS, CODE_OF_CONDUCT*, CONTRIBUTING*, CONTRIBUTORS, COPYING*, CREDITS, Changelog*, Citation*, Code_Of_Conduct*, Codeowners, Contributing*, Contributors, Copying*, Credits, GOVERNANCE.MD, Governance.md, HISTORY.MD, History.md, LICENSE*, License*, MAINTAINERS, Maintainers, README-*, README_*, RELEASE_NOTES*, Readme-*, Readme_*, Release_Notes*, SECURITY.MD, SPONSORS*, Security.md, Sponsors*, authors, backers*, changelog*, citation*, code_of_conduct*, codeowners, contributing*, contributors, copying*, credits, governance.md, history.md, license*, maintainers, readme-*, readme_*, release_notes*, security.md, sponsors*",
"remix.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, remix.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"requirements.txt": ".editorconfig, .flake8, .isort.cfg, .python-version, requirements*.in, requirements*.pip, requirements*.txt, tox.ini",
"rush.json": ".browserslist*, .circleci*, .commitlint*, .cz-config.js, .czrc, .dlint.json, .dprint.json*, .editorconfig, .eslint*, .firebase*, .flowconfig, .github*, .gitlab*, .gitmojirc.json, .gitpod*, .huskyrc*, .jslint*, .knip.*, .lintstagedrc*, .markdownlint*, .node-version, .nodemon*, .npm*, .nvmrc, .pm2*, .pnp.*, .pnpm*, .prettier*, .pylintrc, .release-please*.json, .releaserc*, .ruff.toml, .sentry*, .simple-git-hooks*, .stackblitz*, .styleci*, .stylelint*, .tazerc*, .textlint*, .tool-versions, .travis*, .versionrc*, .vscode*, .watchman*, .xo-config*, .yamllint*, .yarnrc*, Procfile, apollo.config.*, appveyor*, azure-pipelines*, biome.json*, bower.json, build.config.*, bun.lockb, bunfig.toml, commitlint*, crowdin*, dangerfile*, dlint.json, dprint.json*, electron-builder.*, eslint*, firebase.json, grunt*, gulp*, jenkins*, knip.*, lerna*, lint-staged*, nest-cli.*, netlify*, nodemon*, npm-shrinkwrap.json, nx.*, package-lock.json, package.nls*.json, phpcs.xml, pm2.*, pnpm*, prettier*, pullapprove*, pyrightconfig.json, release-please*.json, release-tasks.sh, release.config.*, renovate*, rollup.config.*, rspack*, ruff.toml, simple-git-hooks*, sonar-project.properties, stylelint*, tslint*, tsup.config.*, turbo*, typedoc*, unlighthouse*, vercel*, vetur.config.*, webpack*, workspace.json, wrangler.toml, xo.config.*, yarn*",
"sanity.config.*": "sanity.cli.*, sanity.types.ts, schema.json",
"setup.cfg": ".editorconfig, .flake8, .isort.cfg, .python-version, MANIFEST.in, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, tox.ini",
"setup.py": ".editorconfig, .flake8, .isort.cfg, .python-version, MANIFEST.in, requirements*.in, requirements*.pip, requirements*.txt, setup.cfg, setup.py, tox.ini",
"shims.d.ts": "*.d.ts",
"svelte.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, houdini.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, mdsvex.config.js, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vite.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"vite.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, capacitor.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, i18n.config.*, ionic.config.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, panda.config.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, sst.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, vuetify.config.*, webpack.config.*, windi.config.*",
"*.asax": "$(capture).*.cs, $(capture).*.vb",
"*.ascx": "$(capture).*.cs, $(capture).*.vb",
"*.ashx": "$(capture).*.cs, $(capture).*.vb",
"*.aspx": "$(capture).*.cs, $(capture).*.vb",
"*.axaml": "$(capture).axaml.cs",
"*.bloc.dart": "$(capture).event.dart, $(capture).state.dart",
"*.c": "$(capture).h",
"*.cc": "$(capture).hpp, $(capture).h, $(capture).hxx, $(capture).hh",
"*.cjs": "$(capture).cjs.map, $(capture).*.cjs, $(capture)_*.cjs",
"*.component.ts": "$(capture).component.html, $(capture).component.spec.ts, $(capture).component.css, $(capture).component.scss, $(capture).component.sass, $(capture).component.less",
"*.cpp": "$(capture).hpp, $(capture).h, $(capture).hxx, $(capture).hh",
"*.cs": "$(capture).*.cs",
"*.cshtml": "$(capture).cshtml.cs",
"*.csproj": "*.config, *proj.user, appsettings.*, bundleconfig.json",
"*.css": "$(capture).css.map, $(capture).*.css",
"*.cxx": "$(capture).hpp, $(capture).h, $(capture).hxx, $(capture).hh",
"*.dart": "$(capture).freezed.dart, $(capture).g.dart",
"*.db": "*.db-shm, *.db-wal",
"*.ex": "$(capture).html.eex, $(capture).html.heex, $(capture).html.leex",
"*.fs": "$(capture).fs.js, $(capture).fs.js.map, $(capture).fs.jsx, $(capture).fs.ts, $(capture).fs.tsx, $(capture).fs.rs, $(capture).fs.php, $(capture).fs.dart",
"*.go": "$(capture)_test.go",
"*.java": "$(capture).class",
"*.js": "$(capture).js.map, $(capture).*.js, $(capture)_*.js",
"*.jsx": "$(capture).js, $(capture).*.jsx, $(capture)_*.js, $(capture)_*.jsx, $(capture).less, $(capture).module.less, $(capture).module.less.d.ts, $(capture).scss, $(capture).module.scss, $(capture).module.scss.d.ts",
"*.master": "$(capture).*.cs, $(capture).*.vb",
"*.md": "$(capture).*",
"*.mjs": "$(capture).mjs.map, $(capture).*.mjs, $(capture)_*.mjs",
"*.module.ts": "$(capture).resolver.ts, $(capture).controller.ts, $(capture).service.ts",
"*.mts": "$(capture).mts.map, $(capture).*.mts, $(capture)_*.mts",
"*.pubxml": "$(capture).pubxml.user",
"*.py": "$(capture).pyi",
"*.razor": "$(capture).razor.cs, $(capture).razor.css, $(capture).razor.scss",
"*.resx": "$(capture).*.resx, $(capture).designer.cs, $(capture).designer.vb",
"*.tex": "$(capture).acn, $(capture).acr, $(capture).alg, $(capture).aux, $(capture).bbl, $(capture).blg, $(capture).fdb_latexmk, $(capture).fls, $(capture).glg, $(capture).glo, $(capture).gls, $(capture).idx, $(capture).ind, $(capture).ist, $(capture).lof, $(capture).log, $(capture).lot, $(capture).out, $(capture).pdf, $(capture).synctex.gz, $(capture).toc, $(capture).xdv",
"*.ts": "$(capture).js, $(capture).d.ts.map, $(capture).*.ts, $(capture)_*.js, $(capture)_*.ts",
"*.tsx": "$(capture).ts, $(capture).*.tsx, $(capture)_*.ts, $(capture)_*.tsx, $(capture).less, $(capture).module.less, $(capture).module.less.d.ts, $(capture).scss, $(capture).module.scss, $(capture).module.scss.d.ts, $(capture).css.ts",
"*.vbproj": "*.config, *proj.user, appsettings.*, bundleconfig.json",
"*.vue": "$(capture).*.ts, $(capture).*.js, $(capture).story.vue",
"*.w": "$(capture).*.w, I$(capture).w",
"*.xaml": "$(capture).xaml.cs"
} }
} }

220
Cargo.lock generated
View file

@ -223,8 +223,8 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
"tokio", "tokio",
"xz2", "xz2",
"zstd 0.13.2", "zstd",
"zstd-safe 7.2.1", "zstd-safe",
] ]
[[package]] [[package]]
@ -253,9 +253,9 @@ dependencies = [
[[package]] [[package]]
name = "async-io" name = "async-io"
version = "2.3.3" version = "2.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8"
dependencies = [ dependencies = [
"async-lock", "async-lock",
"cfg-if", "cfg-if",
@ -267,7 +267,7 @@ dependencies = [
"rustix", "rustix",
"slab", "slab",
"tracing", "tracing",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -283,9 +283,9 @@ dependencies = [
[[package]] [[package]]
name = "async-process" name = "async-process"
version = "2.2.3" version = "2.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374"
dependencies = [ dependencies = [
"async-channel", "async-channel",
"async-io", "async-io",
@ -298,7 +298,7 @@ dependencies = [
"futures-lite", "futures-lite",
"rustix", "rustix",
"tracing", "tracing",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -314,9 +314,9 @@ dependencies = [
[[package]] [[package]]
name = "async-signal" name = "async-signal"
version = "0.2.9" version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32" checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3"
dependencies = [ dependencies = [
"async-io", "async-io",
"async-lock", "async-lock",
@ -327,7 +327,7 @@ dependencies = [
"rustix", "rustix",
"signal-hook-registry", "signal-hook-registry",
"slab", "slab",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -721,9 +721,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.1.7" version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" checksum = "f87b298677bb2f19f542743f145dd7f1de0fc7798bc41ee54684e4e16778c8a7"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@ -931,9 +931,9 @@ dependencies = [
[[package]] [[package]]
name = "core-foundation-sys" name = "core-foundation-sys"
version = "0.8.6" version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]] [[package]]
name = "core-graphics" name = "core-graphics"
@ -977,6 +977,21 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "crc"
version = "3.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
dependencies = [
"crc-catalog",
]
[[package]]
name = "crc-catalog"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
version = "1.4.2" version = "1.4.2"
@ -1653,14 +1668,14 @@ dependencies = [
[[package]] [[package]]
name = "filetime" name = "filetime"
version = "0.2.23" version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"redox_syscall 0.4.1", "libredox",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -2388,9 +2403,9 @@ dependencies = [
[[package]] [[package]]
name = "hyper-util" name = "hyper-util"
version = "0.1.6" version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -2606,7 +2621,7 @@ dependencies = [
"hmac", "hmac",
"iterator-sorted", "iterator-sorted",
"k256", "k256",
"pbkdf2 0.12.2", "pbkdf2",
"rand 0.8.5", "rand 0.8.5",
"scrypt", "scrypt",
"serde", "serde",
@ -2902,6 +2917,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"libc", "libc",
"redox_syscall 0.5.3",
] ]
[[package]] [[package]]
@ -2918,7 +2934,7 @@ dependencies = [
"tar", "tar",
"ureq", "ureq",
"vcpkg", "vcpkg",
"zip 2.1.6", "zip",
] ]
[[package]] [[package]]
@ -2964,6 +2980,16 @@ dependencies = [
"tracing-subscriber", "tracing-subscriber",
] ]
[[package]]
name = "lzma-rs"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e"
dependencies = [
"byteorder",
"crc",
]
[[package]] [[package]]
name = "lzma-sys" name = "lzma-sys"
version = "0.1.20" version = "0.1.20"
@ -3414,9 +3440,9 @@ dependencies = [
[[package]] [[package]]
name = "object" name = "object"
version = "0.36.2" version = "0.36.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@ -3479,7 +3505,7 @@ dependencies = [
"whoami", "whoami",
"winreg", "winreg",
"zeroize", "zeroize",
"zip 0.6.6", "zip",
] ]
[[package]] [[package]]
@ -3655,17 +3681,6 @@ dependencies = [
"windows-targets 0.52.6", "windows-targets 0.52.6",
] ]
[[package]]
name = "password-hash"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
dependencies = [
"base64ct",
"rand_core 0.6.4",
"subtle",
]
[[package]] [[package]]
name = "paste" name = "paste"
version = "1.0.15" version = "1.0.15"
@ -3678,18 +3693,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
[[package]]
name = "pbkdf2"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
dependencies = [
"digest 0.10.7",
"hmac",
"password-hash",
"sha2",
]
[[package]] [[package]]
name = "pbkdf2" name = "pbkdf2"
version = "0.12.2" version = "0.12.2"
@ -3883,9 +3886,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]] [[package]]
name = "piper" name = "piper"
version = "0.2.3" version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
dependencies = [ dependencies = [
"atomic-waker", "atomic-waker",
"fastrand", "fastrand",
@ -3936,9 +3939,9 @@ dependencies = [
[[package]] [[package]]
name = "polling" name = "polling"
version = "3.7.2" version = "3.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"concurrent-queue", "concurrent-queue",
@ -3946,7 +3949,7 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
"rustix", "rustix",
"tracing", "tracing",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -4522,9 +4525,9 @@ dependencies = [
[[package]] [[package]]
name = "rustls-pki-types" name = "rustls-pki-types"
version = "1.7.0" version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
@ -4620,7 +4623,7 @@ version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"
dependencies = [ dependencies = [
"pbkdf2 0.12.2", "pbkdf2",
"salsa20", "salsa20",
"sha2", "sha2",
] ]
@ -4693,9 +4696,9 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.204" version = "1.0.205"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -4713,9 +4716,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.204" version = "1.0.205"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -5443,9 +5446,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-codegen" name = "tauri-codegen"
version = "2.0.0-rc.0" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2407c7d37a491b16e530445c9611d91091cae198eea2ed424913b740215605f2" checksum = "90a9e63ecd827d57228864764e0234935c9aac230099cf145197c8c08e754ced"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"brotli 3.5.0", "brotli 3.5.0",
@ -5470,9 +5473,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-macros" name = "tauri-macros"
version = "2.0.0-rc.0" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d210893b693be00f569b4f54456803debe104b7675f368205f2b6e94bac09b34" checksum = "a54f5d5b289aa6215ffcfed7d4ff9960a04b7a854436d04519a9fcf911050cba"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
@ -5484,9 +5487,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin" name = "tauri-plugin"
version = "2.0.0-rc.0" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b352e4478af27bd7c76724bb426ebb32fc51baafb2186afabed4e706dc9e39d4" checksum = "03ce2ac5e182251ff932750d69c9b240a78e44901a7a6234814d63c595b43660"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"glob", "glob",
@ -5614,7 +5617,7 @@ dependencies = [
"tokio", "tokio",
"url", "url",
"windows-sys 0.52.0", "windows-sys 0.52.0",
"zip 2.1.6", "zip",
] ]
[[package]] [[package]]
@ -5634,9 +5637,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime" name = "tauri-runtime"
version = "2.0.0-rc.0" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6624fdf383ccafc9e8ad9205fe6e5c976b318efcd6b3662dde658c74e4254792" checksum = "8f01b129b1ebdf09563c354760dbe7c0e96a166b4e33362d9c8d207f527c7ea5"
dependencies = [ dependencies = [
"dpi", "dpi",
"gtk", "gtk",
@ -5653,9 +5656,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime-wry" name = "tauri-runtime-wry"
version = "2.0.0-rc.0" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fd1a785c4281f8231b091593393b40cb3a800810c407b1ffed52de27ff1640a" checksum = "fcda27639094ace2bf25f00bc10e35ea4e3af2f92753b1bdd2a174d1fa5a6292"
dependencies = [ dependencies = [
"cocoa", "cocoa",
"gtk", "gtk",
@ -5707,9 +5710,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-utils" name = "tauri-utils"
version = "2.0.0-rc.0" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f435eeaae1e69cf93cf19da0f727989eed2e5eb6fc63a8d21432f59dd3ac4ac" checksum = "28bb83cffa26e9cb7a2b3d0c31ab87bf277f44aaaa90f17159aef4d37aabd051"
dependencies = [ dependencies = [
"aes-gcm", "aes-gcm",
"brotli 3.5.0", "brotli 3.5.0",
@ -5755,15 +5758,15 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.11.0" version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand", "fastrand",
"once_cell", "once_cell",
"rustix", "rustix",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -6285,9 +6288,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]] [[package]]
name = "ureq" name = "ureq"
version = "2.10.0" version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72139d247e5f97a3eff96229a7ae85ead5328a39efe76f8bf5a06313d505b6ea" checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"log", "log",
@ -7150,12 +7153,12 @@ dependencies = [
[[package]] [[package]]
name = "xdg-home" name = "xdg-home"
version = "1.2.0" version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -7274,41 +7277,33 @@ dependencies = [
"syn 2.0.72", "syn 2.0.72",
] ]
[[package]]
name = "zip"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
dependencies = [
"aes",
"byteorder",
"bzip2",
"constant_time_eq 0.1.5",
"crc32fast",
"crossbeam-utils",
"flate2",
"hmac",
"pbkdf2 0.11.0",
"sha1",
"time",
"zstd 0.11.2+zstd.1.5.2",
]
[[package]] [[package]]
name = "zip" name = "zip"
version = "2.1.6" version = "2.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e" checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e"
dependencies = [ dependencies = [
"aes",
"arbitrary", "arbitrary",
"bzip2",
"constant_time_eq 0.3.0",
"crc32fast", "crc32fast",
"crossbeam-utils", "crossbeam-utils",
"deflate64",
"displaydoc", "displaydoc",
"flate2", "flate2",
"hmac",
"indexmap 2.3.0", "indexmap 2.3.0",
"lzma-rs",
"memchr", "memchr",
"pbkdf2",
"rand 0.8.5",
"sha1",
"thiserror", "thiserror",
"time",
"zeroize",
"zopfli", "zopfli",
"zstd",
] ]
[[package]] [[package]]
@ -7325,32 +7320,13 @@ dependencies = [
"simd-adler32", "simd-adler32",
] ]
[[package]]
name = "zstd"
version = "0.11.2+zstd.1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
dependencies = [
"zstd-safe 5.0.2+zstd.1.5.2",
]
[[package]] [[package]]
name = "zstd" name = "zstd"
version = "0.13.2" version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
dependencies = [ dependencies = [
"zstd-safe 7.2.1", "zstd-safe",
]
[[package]]
name = "zstd-safe"
version = "5.0.2+zstd.1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
dependencies = [
"libc",
"zstd-sys",
] ]
[[package]] [[package]]

View file

@ -136,7 +136,6 @@ rand = { version = "0.8.5" }
byteorder = { version = "1.5.0" } byteorder = { version = "1.5.0" }
base64 = { version = "0.22" } base64 = { version = "0.22" }
p256 = { version = "0.13.2", features = [ "ecdsa" ] } p256 = { version = "0.13.2", features = [ "ecdsa" ] }
uuid = { version = "1.8", features = [ uuid = { version = "1.8", features = [
"serde", "serde",
"v4" "v4"
@ -164,10 +163,9 @@ tokio = { version = "1.38", features = [ "full" ] }
tokio-stream = { version = "0.1.15", features = [ "fs" ] } tokio-stream = { version = "0.1.15", features = [ "fs" ] }
notify = { version = "6.1", default-features = false } notify = { version = "6.1", default-features = false }
notify-debouncer-mini = { version = "0.4", default-features = false } notify-debouncer-mini = { version = "0.4", default-features = false }
tempfile = { version = "3.10" } tempfile = { version = "3.10" }
dunce = { version = "1.0.4" } dunce = { version = "1.0.4" }
zip = { version = "0.6" } zip = { version = "2.1.6" }
dirs = { version = "5.0" } dirs = { version = "5.0" }
async_zip = { version = "0.0.17", features = [ "full" ] } async_zip = { version = "0.0.17", features = [ "full" ] }
async-compression = { version = "0.4.12", features = [ async-compression = { version = "0.4.12", features = [

View file

@ -25,14 +25,12 @@ tauri-build = { workspace = true, features = [ "isolation" ] }
[dependencies] [dependencies]
onelauncher = { workspace = true, features = [ "tauri" ] } onelauncher = { workspace = true, features = [ "tauri" ] }
onelauncher_macros = { workspace = true } onelauncher_macros = { workspace = true }
tauri-plugin-shell = { workspace = true } tauri-plugin-shell = { workspace = true }
tauri-plugin-window-state = { workspace = true } tauri-plugin-window-state = { workspace = true }
tauri-plugin-single-instance = { workspace = true } tauri-plugin-single-instance = { workspace = true }
tauri-plugin-updater = { workspace = true } tauri-plugin-updater = { workspace = true }
tauri-plugin-clipboard-manager = { workspace = true } tauri-plugin-clipboard-manager = { workspace = true }
tauri-plugin-dialog = { workspace = true } tauri-plugin-dialog = { workspace = true }
tauri-specta = { workspace = true } tauri-specta = { workspace = true }
specta = { workspace = true } specta = { workspace = true }
specta-typescript = { workspace = true } specta-typescript = { workspace = true }
@ -48,7 +46,6 @@ thiserror = { workspace = true }
anyhow = { workspace = true } anyhow = { workspace = true }
chrono = { workspace = true } chrono = { workspace = true }
uuid = { workspace = true } uuid = { workspace = true }
tracing = { workspace = true } tracing = { workspace = true }
tracing-error = { workspace = true } tracing-error = { workspace = true }
@ -69,6 +66,7 @@ features = [ "test" ]
[target.'cfg(target_os = "macos")'.dependencies] [target.'cfg(target_os = "macos")'.dependencies]
cocoa.workspace = true cocoa.workspace = true
objc.workspace = true objc.workspace = true
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(target_os = "linux")'.dependencies]

View file

@ -23,6 +23,6 @@
"@onelauncher/frontend": "workspace:*" "@onelauncher/frontend": "workspace:*"
}, },
"devDependencies": { "devDependencies": {
"@tauri-apps/cli": "2.0.0-rc.0" "@tauri-apps/cli": "2.0.0-rc.3"
} }
} }

View file

@ -194,8 +194,8 @@ pub async fn get_screenshots(uuid: Uuid) -> Result<Vec<String>, String> {
.await? .await?
.ok_or("cluster not found")?; .ok_or("cluster not found")?;
let screenshots = cluster::content::screenshots::get_screenshots(&cluster.cluster_path()) let screenshots =
.await?; cluster::content::screenshots::get_screenshots(&cluster.cluster_path()).await?;
Ok(screenshots) Ok(screenshots)
} }
@ -207,8 +207,7 @@ pub async fn get_worlds(uuid: Uuid) -> Result<Vec<String>, String> {
.await? .await?
.ok_or("cluster not found")?; .ok_or("cluster not found")?;
let screenshots = cluster::content::worlds::get_worlds(&cluster.cluster_path()) let screenshots = cluster::content::worlds::get_worlds(&cluster.cluster_path()).await?;
.await?;
Ok(screenshots) Ok(screenshots)
} }

View file

@ -1,5 +1,6 @@
use onelauncher::{data::MinecraftCredentials, store::MinecraftLogin}; use onelauncher::data::MinecraftCredentials;
use onelauncher::minecraft; use onelauncher::minecraft;
use onelauncher::store::MinecraftLogin;
use tauri::{AppHandle, Manager}; use tauri::{AppHandle, Manager};
use uuid::Uuid; use uuid::Uuid;
@ -23,7 +24,9 @@ pub async fn remove_user(uuid: Uuid) -> Result<(), String> {
#[specta::specta] #[specta::specta]
#[tauri::command] #[tauri::command]
pub async fn get_default_user(fallback: Option<bool>) -> Result<Option<MinecraftCredentials>, String> { pub async fn get_default_user(
fallback: Option<bool>,
) -> Result<Option<MinecraftCredentials>, String> {
let uuid = minecraft::get_default_user().await?; let uuid = minecraft::get_default_user().await?;
if let Some(fallback) = fallback { if let Some(fallback) = fallback {
@ -54,7 +57,10 @@ pub async fn auth_login(handle: AppHandle) -> Result<Option<MinecraftCredentials
Ok(result) Ok(result)
} }
async fn spawn_webview(handle: AppHandle, flow: MinecraftLogin) -> Result<Option<MinecraftCredentials>, String> { async fn spawn_webview(
handle: AppHandle,
flow: MinecraftLogin,
) -> Result<Option<MinecraftCredentials>, String> {
let now = chrono::Utc::now(); let now = chrono::Utc::now();
if let Some(win) = handle.get_webview_window("login") { if let Some(win) = handle.get_webview_window("login") {
@ -71,11 +77,11 @@ async fn spawn_webview(handle: AppHandle, flow: MinecraftLogin) -> Result<Option
.map_err(|err| err.to_string())?, .map_err(|err| err.to_string())?,
), ),
) )
.title("Log into OneLauncher") .title("Log into OneLauncher")
.always_on_top(true) .always_on_top(true)
.center() .center()
.build() .build()
.map_err(|err| err.to_string())?; .map_err(|err| err.to_string())?;
win.request_user_attention(Some(tauri::UserAttentionType::Critical)) win.request_user_attention(Some(tauri::UserAttentionType::Critical))
.map_err(|err| err.to_string())?; .map_err(|err| err.to_string())?;

View file

@ -35,13 +35,13 @@
"overlayscrollbars": "^2.10.0", "overlayscrollbars": "^2.10.0",
"overlayscrollbars-solid": "^0.5.5", "overlayscrollbars-solid": "^0.5.5",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"solid-js": "^1.8.19", "solid-js": "^1.8.20",
"solid-transition-group": "^0.2.3", "solid-transition-group": "^0.2.3",
"uuid": "^10.0.0" "uuid": "^10.0.0"
}, },
"devDependencies": { "devDependencies": {
"@solidjs/testing-library": "^0.8.9", "@solidjs/testing-library": "^0.8.9",
"@tauri-apps/cli": "2.0.0-rc.0", "@tauri-apps/cli": "2.0.0-rc.3",
"@testing-library/jest-dom": "^6.4.8", "@testing-library/jest-dom": "^6.4.8",
"@types/uuid": "^10.0.0", "@types/uuid": "^10.0.0",
"jsdom": "^24.1.1", "jsdom": "^24.1.1",
@ -49,6 +49,6 @@
"unocss": "^0.61.9", "unocss": "^0.61.9",
"vite-plugin-solid": "^2.10.2", "vite-plugin-solid": "^2.10.2",
"vite-plugin-solid-svg": "^0.8.1", "vite-plugin-solid-svg": "^0.8.1",
"vite-tsconfig-paths": "^4.3.2" "vite-tsconfig-paths": "^5.0.1"
} }
} }

View file

@ -18,16 +18,16 @@ function App(props: ParentProps) {
return ( return (
<GlobalContexts> <GlobalContexts>
<main class="flex flex-col bg-primary w-full min-h-screen overflow-hidden h-screen max-h-screen text-fg-primary"> <main class="h-screen max-h-screen min-h-screen w-full flex flex-col overflow-hidden bg-primary text-fg-primary">
<WindowFrame /> <WindowFrame />
<div class="flex flex-col px-8"> <div class="flex flex-col px-8">
<Navbar /> <Navbar />
</div> </div>
<div class="relative h-full w-full overflow-hidden"> <div class="relative h-full w-full overflow-hidden">
<div class="absolute top-0 left-0 flex flex-col h-full w-full overflow-x-hidden"> <div class="absolute left-0 top-0 h-full w-full flex flex-col overflow-x-hidden">
<ErrorBoundary> <ErrorBoundary>
<OverlayScrollbarsComponent class="os-hide-horizontal-scrollbar absolute top-0 left-0 flex flex-col h-full w-full overflow-x-hidden overflow-y-auto px-8 pb-8"> <OverlayScrollbarsComponent class="os-hide-horizontal-scrollbar absolute left-0 top-0 h-full w-full flex flex-col overflow-x-hidden overflow-y-auto px-8 pb-8">
<AnimatedRoutes> <AnimatedRoutes>
{props.children} {props.children}
</AnimatedRoutes> </AnimatedRoutes>

View file

@ -20,7 +20,7 @@ function NavbarLink(props: NavbarLinkProps) {
return ( return (
<A <A
href={props.path} href={props.path}
class="text-lg px-4 py-2 hover:bg-component-bg-hover rounded-lg hover:text-fg-primary-hover" class="rounded-lg px-4 py-2 text-lg hover:bg-component-bg-hover hover:text-fg-primary-hover"
inactiveClass="text-fg-secondary" inactiveClass="text-fg-secondary"
activeClass="text-fg-primary" activeClass="text-fg-primary"
end end
@ -41,9 +41,9 @@ function Navbar() {
let notificationButton!: HTMLButtonElement; let notificationButton!: HTMLButtonElement;
return ( return (
<div class="flex flex-row *:flex-1 items-center min-h-[60px] h-15"> <div class="h-15 min-h-[60px] flex flex-row items-center *:flex-1">
<div> <div>
<div onClick={() => open(WEBSITE)} class="flex items-center justify-center active:scale-90 transition-transform w-min"> <div onClick={() => open(WEBSITE)} class="w-min flex items-center justify-center transition-transform active:scale-90">
<PolyfrostFull /> <PolyfrostFull />
</div> </div>
</div> </div>
@ -52,7 +52,7 @@ function Navbar() {
<NavbarLink path="/browser" label="Browser" /> <NavbarLink path="/browser" label="Browser" />
<NavbarLink path="/updates" label="Updates" /> <NavbarLink path="/updates" label="Updates" />
</div> </div>
<div class="flex flex-row justify-end items-center gap-x-2 relative"> <div class="relative flex flex-row items-center justify-end gap-x-2">
<Button buttonStyle="icon"> <Button buttonStyle="icon">
<TerminalBrowserIcon /> <TerminalBrowserIcon />
</Button> </Button>
@ -65,7 +65,7 @@ function Navbar() {
<Button <Button
buttonStyle="icon" buttonStyle="icon"
ref={notificationButton} ref={notificationButton}
class="[&>div]:absolute relative" class="relative [&>div]:absolute"
onClick={() => setNotificationMenuOpen(!notificationMenuOpen())} onClick={() => setNotificationMenuOpen(!notificationMenuOpen())}
> >
<Bell01Icon /> <Bell01Icon />
@ -82,7 +82,7 @@ function Navbar() {
onClick={() => setProfileMenuOpen(!profileMenuOpen())} onClick={() => setProfileMenuOpen(!profileMenuOpen())}
class="hover:opacity-70" class="hover:opacity-70"
> >
<PlayerHead class="min-w-8 min-h-8 w-8 h-8 max-w-8 max-h-8 rounded-md" uuid={controller.defaultAccount()?.id} /> <PlayerHead class="h-8 max-h-8 max-w-8 min-h-8 min-w-8 w-8 rounded-md" uuid={controller.defaultAccount()?.id} />
</button> </button>
</div> </div>

View file

@ -3,9 +3,9 @@ import type { ParentProps } from 'solid-js';
function ScrollableContainer(props: ParentProps) { function ScrollableContainer(props: ParentProps) {
return ( return (
<div class="flex flex-col flex-1 overflow-hidden w-[calc(100%+14px)]"> <div class="w-[calc(100%+14px)] flex flex-1 flex-col overflow-hidden">
<OverlayScrollbarsComponent class="os-hide-horizontal-scrollbar relative flex-1"> <OverlayScrollbarsComponent class="os-hide-horizontal-scrollbar relative flex-1">
<div class="flex flex-col absolute w-[calc(100%-14px)] h-full gap-1"> <div class="absolute h-full w-[calc(100%-14px)] flex flex-col gap-1">
{props.children} {props.children}
</div> </div>
</OverlayScrollbarsComponent> </OverlayScrollbarsComponent>

View file

@ -10,22 +10,22 @@ export type SettingsRowProps = ParentProps & {
function SettingsRow(props: SettingsRowProps) { function SettingsRow(props: SettingsRowProps) {
return ( return (
<div <div
class="flex flex-row bg-component-bg rounded-xl gap-3.5 p-4 items-center" class="flex flex-row items-center gap-3.5 rounded-xl bg-component-bg p-4"
classList={{ classList={{
'bg-component-bg-disabled': props.disabled, 'bg-component-bg-disabled': props.disabled,
'text-fg-primary-disabled': props.disabled, 'text-fg-primary-disabled': props.disabled,
}} }}
> >
<div class="flex justify-center items-center h-8 w-8"> <div class="h-8 w-8 flex items-center justify-center">
{props.icon} {props.icon}
</div> </div>
<div class="flex flex-col gap-2 flex-1"> <div class="flex flex-1 flex-col gap-2">
<h3 class="text-lg">{props.title}</h3> <h3 class="text-lg">{props.title}</h3>
<p class="text-wrap text-sm">{props.description}</p> <p class="text-wrap text-sm">{props.description}</p>
</div> </div>
<div class="flex h-9 flex-row justify-center items-center gap-2"> <div class="h-9 flex flex-row items-center justify-center gap-2">
{props.children} {props.children}
</div> </div>
</div> </div>

View file

@ -31,12 +31,12 @@ function Sidebar(props: SidebarProps) {
} }
return ( return (
<div class="flex flex-col w-52"> <div class="w-52 flex flex-col">
<For each={Object.keys(props.links)}> <For each={Object.keys(props.links)}>
{section => ( {section => (
<div class="flex flex-col gap-y-2"> <div class="flex flex-col gap-y-2">
<div> <div>
<h3 class="text-fg-secondary text-xs font-medium m-1.5 mt-5">{section.toUpperCase()}</h3> <h3 class="m-1.5 mt-5 text-xs text-fg-secondary font-medium">{section.toUpperCase()}</h3>
<div class="flex flex-col gap-y-1 fill-fg-primary text-fg-primary font-medium"> <div class="flex flex-col gap-y-1 fill-fg-primary text-fg-primary font-medium">
<For each={props.links[section]}> <For each={props.links[section]}>
{(link) => { {(link) => {

View file

@ -14,8 +14,8 @@ interface TitlebarButtonProps {
function TitlebarButton(props: TitlebarButtonProps) { function TitlebarButton(props: TitlebarButtonProps) {
return ( return (
<button class="flex items-center justify-center w-8 h-8 group" onClick={e => props.onClick(e)}> <button class="group h-8 w-8 flex items-center justify-center" onClick={e => props.onClick(e)}>
<div class="rounded-lg group-hover:bg-primary p-1"> <div class="rounded-lg p-1 group-hover:bg-primary">
<props.icon class={`w-[18px] h-[18px] stroke-slate ${props.danger ? 'group-hover:stroke-danger' : 'group-hover:stroke-white'}`} /> <props.icon class={`w-[18px] h-[18px] stroke-slate ${props.danger ? 'group-hover:stroke-danger' : 'group-hover:stroke-white'}`} />
</div> </div>
</button> </button>
@ -51,7 +51,7 @@ function WindowFrame() {
}); });
return ( return (
<div data-tauri-drag-region class="z-[99999] flex flex-row justify-between items-center w-screen h-8 bg-secondary gap-0.5 pr-0.5"> <div data-tauri-drag-region class="z-[99999] h-8 w-screen flex flex-row items-center justify-between gap-0.5 bg-secondary pr-0.5">
<div class="flex flex-row items-center"> <div class="flex flex-row items-center">
<TitlebarButton icon={ChevronLeftIcon} onClick={() => history.back()} /> <TitlebarButton icon={ChevronLeftIcon} onClick={() => history.back()} />
</div> </div>

View file

@ -50,7 +50,7 @@ function Dropdown(props: DropdownProps) {
iconRight={<ChevronDownIcon />} iconRight={<ChevronDownIcon />}
> >
<div <div
class="flex-1 flex flex-row items-center text-nowrap gap-1 h-full overflow-hidden" class="h-full flex flex-1 flex-row items-center gap-1 overflow-hidden text-nowrap"
> >
<span>{split.text}</span> <span>{split.text}</span>
{items()[selected()]} {items()[selected()]}
@ -79,7 +79,7 @@ function Dropdown(props: DropdownProps) {
<Index each={items()}> <Index each={items()}>
{(item, index) => ( {(item, index) => (
<div onClick={() => select(index)}> <div onClick={() => select(index)}>
<div class="hover:bg-gray-05 p-2 rounded-lg flex flex-row gap-2 justify-between items-center"> <div class="flex flex-row items-center justify-between gap-2 rounded-lg p-2 hover:bg-gray-05">
{item()} {item()}
<div class={styles.selected! + (selected() === index ? ` ${styles.visible}` : '')} /> <div class={styles.selected! + (selected() === index ? ` ${styles.visible}` : '')} />
</div> </div>

View file

@ -10,8 +10,8 @@ function FormattedLog(props: FormattedLogProps) {
const lines = createMemo(() => props.log.split('\n')); const lines = createMemo(() => props.log.split('\n'));
return ( return (
<div class="bg-component-bg flex flex-1 h-full font-mono font-medium overflow-auto p-2 rounded-md mt-2"> <div class="mt-2 h-full flex flex-1 overflow-auto rounded-md bg-component-bg p-2 font-medium font-mono">
<OverlayScrollbarsComponent class="flex-1 h-full relative"> <OverlayScrollbarsComponent class="relative h-full flex-1">
<code class={styles.log}> <code class={styles.log}>
<For each={lines()}> <For each={lines()}>
{line => <Line line={line} />} {line => <Line line={line} />}

View file

@ -23,15 +23,15 @@ function ModCard(props: ManagedPackage) {
} }
return ( return (
<div onClick={redirect} class="flex flex-col overflow-hidden rounded-lg bg-component-bg max-w-53 min-w-53 w-full max-h-68 min-h-68 h-full"> <div onClick={redirect} class="h-full max-h-68 max-w-53 min-h-68 min-w-53 w-full flex flex-col overflow-hidden rounded-lg bg-component-bg">
<div class="relative h-28 overflow-hidden flex justify-center items-center"> <div class="relative h-28 flex items-center justify-center overflow-hidden">
<img class="absolute filter-blur-xl z-0 max-w-none w-7/6" src={props.icon_url || ''} alt={`Icon for ${props.title}`} /> <img class="absolute z-0 max-w-none w-7/6 filter-blur-xl" src={props.icon_url || ''} alt={`Icon for ${props.title}`} />
<img class="relative w-2/5 aspect-ratio-square z-1 rounded-md image-render-auto" src={props.icon_url || ''} alt={`Icon for ${props.title}`} /> <img class="relative z-1 aspect-ratio-square w-2/5 rounded-md image-render-auto" src={props.icon_url || ''} alt={`Icon for ${props.title}`} />
</div> </div>
<div class="flex flex-col flex-1 p-3 gap-4"> <div class="flex flex-1 flex-col gap-4 p-3">
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<h5 class="font-medium text-fg-primary">{props.title}</h5> <h5 class="text-fg-primary font-medium">{props.title}</h5>
<p class="text-fg-secondary text-xs"> <p class="text-xs text-fg-secondary">
By By
{' '} {' '}
<span class="text-fg-primary">Author TODO</span> <span class="text-fg-primary">Author TODO</span>
@ -42,16 +42,16 @@ function ModCard(props: ManagedPackage) {
</p> </p>
</div> </div>
<p class="text-fg-secondary text-sm flex-1 max-h-13 overflow-hidden line-height-snug">{props.description}</p> <p class="max-h-13 flex-1 overflow-hidden text-sm text-fg-secondary line-height-snug">{props.description}</p>
<div class="flex flex-row gap-4 text-xs"> <div class="flex flex-row gap-4 text-xs">
<div class="flex flex-row items-center gap-2"> <div class="flex flex-row items-center gap-2">
<Download01Icon class="w-4 h-4" /> <Download01Icon class="h-4 w-4" />
{abbreviateNumber(props.downloads)} {abbreviateNumber(props.downloads)}
</div> </div>
<div class="flex flex-row items-center gap-2"> <div class="flex flex-row items-center gap-2">
<HeartIcon class="w-4 h-4" /> <HeartIcon class="h-4 w-4" />
{abbreviateNumber(props.followers)} {abbreviateNumber(props.followers)}
</div> </div>
</div> </div>

View file

@ -36,7 +36,7 @@ function ContextMenu(props: ContextMenuProps) {
visible={props.visible} visible={props.visible}
setVisible={props.setVisible} setVisible={props.setVisible}
> >
<div ref={setRef} class="bg-secondary rounded-xl border border-gray-05 p-1 shadow-md shadow-black/30"> <div ref={setRef} class="border border-gray-05 rounded-xl bg-secondary p-1 shadow-black/30 shadow-md">
<div class="flex flex-col gap-y-1 text-fg-primary"> <div class="flex flex-col gap-y-1 text-fg-primary">
{props.children} {props.children}
</div> </div>
@ -46,7 +46,7 @@ function ContextMenu(props: ContextMenuProps) {
} }
ContextMenu.Seperator = function () { ContextMenu.Seperator = function () {
return <div class="border-b mx-1 border-gray-05" />; return <div class="mx-1 border-b border-gray-05" />;
}; };
interface ContextMenuRowProps { interface ContextMenuRowProps {
@ -59,7 +59,7 @@ ContextMenu.Row = function (props: ContextMenuRowProps) {
return ( return (
<div <div
onClick={e => props.onClick?.(e)} onClick={e => props.onClick?.(e)}
class="flex items-center gap-x-2 m-px px-1.5 py-0.5 rounded-lg hover:bg-gray-05 active:bg-gray-10 [&>svg]:w-[18px]" class="m-px flex items-center gap-x-2 rounded-lg px-1.5 py-0.5 [&>svg]:w-[18px] active:bg-gray-10 hover:bg-gray-05"
> >
{props.icon} {props.icon}
{props.text} {props.text}

View file

@ -26,7 +26,7 @@ function FullscreenOverlay(props: FullscreenOverlayProps) {
class={`fixed top-0 left-0 w-screen h-screen bg-black/60 backdrop-blur-sm backdrop-grayscale transition-opacity ${props.visible() ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'}`} class={`fixed top-0 left-0 w-screen h-screen bg-black/60 backdrop-blur-sm backdrop-grayscale transition-opacity ${props.visible() ? 'opacity-100 pointer-events-auto' : 'opacity-0 pointer-events-none'}`}
> >
<div class="absolute top-0 left-0 w-screen h-screen flex justify-center items-center" onClick={onBackdropClick}> <div class="absolute left-0 top-0 h-screen w-screen flex items-center justify-center" onClick={onBackdropClick}>
{props.children} {props.children}
</div> </div>

View file

@ -128,7 +128,7 @@ export type ModalProps = {
function Modal(props: ModalProps) { function Modal(props: ModalProps) {
return ( return (
<div ref={mergeRefs(props.ref)} class="bg-primary border border-white/5 p-4 rounded-lg text-center flex flex-col gap-y-2 min-w-xs"> <div ref={mergeRefs(props.ref)} class="min-w-xs flex flex-col gap-y-2 border border-white/5 rounded-lg bg-primary p-4 text-center">
{props.children} {props.children}
</div> </div>
); );
@ -154,7 +154,7 @@ Modal.Simple = function (props: ModalSimpleProps) {
<div class="flex flex-col"> <div class="flex flex-col">
{split.children} {split.children}
</div> </div>
<div class="flex flex-row gap-x-4 [&>*]:flex-1 mt-2"> <div class="mt-2 flex flex-row gap-x-4 [&>*]:flex-1">
<For each={split.buttons}> <For each={split.buttons}>
{button => ( {button => (
<ModalButton props={button} /> <ModalButton props={button} />
@ -244,19 +244,19 @@ Modal.Delete = function (props: ModalDeleteProps) {
> >
{split.children || ( {split.children || (
<> <>
<div class="flex flex-col justify-center items-center gap-y-3"> <div class="flex flex-col items-center justify-center gap-y-3">
<p>Are you sure you want to delete this item?</p> <p>Are you sure you want to delete this item?</p>
<p class="text-danger uppercase w-82 line-height-normal"> <p class="w-82 text-danger line-height-normal uppercase">
Doing this will Doing this will
{' '} {' '}
<span class="underline font-bold">delete</span> <span class="font-bold underline">delete</span>
{' '} {' '}
your entire your entire
{' '} {' '}
<br /> <br />
data data
{' '} {' '}
<span class="underline font-bold">FOREVER</span> <span class="font-bold underline">FOREVER</span>
. .
</p> </p>
</div> </div>

View file

@ -29,11 +29,11 @@ function AccountComponent(props: AccountComponentProps) {
onClick={login} onClick={login}
class={`flex flex-row justify-between p-2 rounded-lg ${props.loggedIn !== true && 'hover:bg-gray-05 active:bg-gray-10 hover:text-fg-primary-hover'}`} class={`flex flex-row justify-between p-2 rounded-lg ${props.loggedIn !== true && 'hover:bg-gray-05 active:bg-gray-10 hover:text-fg-primary-hover'}`}
> >
<div class="flex flex-row justify-start flex-1 gap-x-3"> <div class="flex flex-1 flex-row justify-start gap-x-3">
<PlayerHead class="w-8 h-8 rounded-md" uuid={props.account!.id} /> <PlayerHead class="h-8 w-8 rounded-md" uuid={props.account!.id} />
<div class="flex flex-col items-center justify-center"> <div class="flex flex-col items-center justify-center">
<div class="flex flex-col items-start justify-between"> <div class="flex flex-col items-start justify-between">
<p class="font-semibold h-[18px]">{props.account!.username}</p> <p class="h-[18px] font-semibold">{props.account!.username}</p>
{props.loggedIn && <p class="text-xs">Logged in</p>} {props.loggedIn && <p class="text-xs">Logged in</p>}
</div> </div>
</div> </div>
@ -60,7 +60,7 @@ function AccountPopup(props: Popup.PopupProps) {
return ( return (
<Popup {...props}> <Popup {...props}>
<div class="bg-secondary rounded-xl border border-gray-10 w-72 p-2 shadow-md shadow-black/30"> <div class="w-72 border border-gray-10 rounded-xl bg-secondary p-2 shadow-black/30 shadow-md">
<div class="flex flex-col gap-y-2 text-fg-primary"> <div class="flex flex-col gap-y-2 text-fg-primary">
<Show when={controller.defaultAccount() !== null || controller.defaultAccount() !== undefined}> <Show when={controller.defaultAccount() !== null || controller.defaultAccount() !== undefined}>
<AccountComponent <AccountComponent
@ -76,7 +76,7 @@ function AccountPopup(props: Popup.PopupProps) {
)} )}
</For> </For>
</Show> </Show>
<div class="w-full h-px bg-gray-05 rounded-md" /> <div class="h-px w-full rounded-md bg-gray-05" />
<div class="flex flex-row justify-between"> <div class="flex flex-row justify-between">
<div> <div>

View file

@ -122,7 +122,7 @@ function AddAccountModal(p: AddAccountModalProps) {
/>, />,
]} ]}
> >
<div class="flex flex-col gap-y-3 max-w-120 line-height-normal"> <div class="max-w-120 flex flex-col gap-y-3 line-height-normal">
<Switch> <Switch>
<Match when={stage() !== ModalStage.LoggingIn}> <Match when={stage() !== ModalStage.LoggingIn}>
<p> <p>

View file

@ -130,7 +130,7 @@ function VersionSelector(props: { setVersion: (version: string) => any }) {
}); });
return ( return (
<div class="flex flex-row flex-1 gap-2"> <div class="flex flex-1 flex-row gap-2">
<SelectList <SelectList
class="max-h-40 min-w-3/5" class="max-h-40 min-w-3/5"
onChange={setVersion} onChange={setVersion}
@ -144,7 +144,7 @@ function VersionSelector(props: { setVersion: (version: string) => any }) {
</Show> </Show>
</SelectList> </SelectList>
<div class="bg-component-bg rounded-lg overflow-hidden border border-gray-05 flex-1 p-2 flex flex-col gap-y-2"> <div class="flex flex-1 flex-col gap-y-2 overflow-hidden border border-gray-05 rounded-lg bg-component-bg p-2">
<For each={Object.keys(filters())}> <For each={Object.keys(filters())}>
{name => ( {name => (
<Checkbox <Checkbox
@ -169,7 +169,7 @@ function Option(props: OptionProps) {
return ( return (
<div {...rest} class={`flex flex-col gap-y-2 items-stretch ${split.class || ''}`}> <div {...rest} class={`flex flex-col gap-y-2 items-stretch ${split.class || ''}`}>
<h3 class="text-md font-semibold uppercase text-fg-secondary text-left">{props.header}</h3> <h3 class="text-left text-md text-fg-secondary font-semibold uppercase">{props.header}</h3>
{/* <div class="max-h-8"> */} {/* <div class="max-h-8"> */}
{props.children} {props.children}
{/* </div> */} {/* </div> */}

View file

@ -33,6 +33,8 @@ function ClusterProviderSelection(props: ClusterStepProps) {
const [selected, setSelected] = createSignal<number>(); const [selected, setSelected] = createSignal<number>();
const check = () => { const check = () => {
// TODO: Add more stages
// eslint-disable-next-line solid/reactivity -- It's fine
props.setCanGoForward(() => { props.setCanGoForward(() => {
const isTrue = selected() !== undefined; const isTrue = selected() !== undefined;
@ -73,7 +75,7 @@ function ProviderCard(props: ProviderCardProps) {
onClick={() => props.setSelected()} onClick={() => props.setSelected()}
class={`flex flex-col justify-center items-center gap-y-2 py-2 px-4 hover:bg-component-bg-hover active:bg-component-bg-pressed rounded-lg ${props.selected ? 'bg-component-bg' : ''}`} class={`flex flex-col justify-center items-center gap-y-2 py-2 px-4 hover:bg-component-bg-hover active:bg-component-bg-pressed rounded-lg ${props.selected ? 'bg-component-bg' : ''}`}
> >
<div class="[&>svg]:(w-8 h-8)"> <div class="[&>svg]:(h-8 w-8)">
{props.icon} {props.icon}
</div> </div>
<span>{props.name}</span> <span>{props.name}</span>

View file

@ -122,12 +122,12 @@ function NotificationOverlayComponent(props: NotificationComponentProps) {
</div> </div>
<Show when={disappearing() === true && props.progress === undefined}> <Show when={disappearing() === true && props.progress === undefined}>
<div class="w-full h-1.5 bg-brand-disabled"> <div class="h-1.5 w-full bg-brand-disabled">
<div <div
style={{ style={{
width: `${(secondsLeft() / TOTAL_SECONDS) * 100}%`, width: `${(secondsLeft() / TOTAL_SECONDS) * 100}%`,
}} }}
class="transition-width h-1.5 bg-brand rounded-lg" class="h-1.5 rounded-lg bg-brand transition-width"
/> />
</div> </div>
</Show> </Show>
@ -139,31 +139,31 @@ function NotificationOverlayComponent(props: NotificationComponentProps) {
function NotificationPopupComponent(props: NotificationComponentProps) { function NotificationPopupComponent(props: NotificationComponentProps) {
return ( return (
<div class="p-2 flex flex-col gap-y-1"> <div class="flex flex-col gap-y-1 p-2">
<div class="min-h-10 grid place-items-center grid-cols-[24px_1fr_auto] gap-3"> <div class="grid grid-cols-[24px_1fr_auto] min-h-10 place-items-center gap-3">
{IconFromNotificationType(props.notification_type)({ {IconFromNotificationType(props.notification_type)({
class: `w-6 h-6 ${ColorFromNotificationType(props.notification_type)}`, class: `w-6 h-6 ${ColorFromNotificationType(props.notification_type)}`,
})} })}
<div class="flex flex-col w-full"> <div class="w-full flex flex-col">
<span class={`font-medium ${ColorFromNotificationType(props.notification_type)}`}>{props.title}</span> <span class={`font-medium ${ColorFromNotificationType(props.notification_type)}`}>{props.title}</span>
<span class="text-sm text-white/60">{props.message}</span> <span class="text-sm text-white/60">{props.message}</span>
</div> </div>
<Show when={props.overlay !== true}> <Show when={props.overlay !== true}>
<div class="flex flex-row justify-end items-center gap-1"> <div class="flex flex-row items-center justify-end gap-1">
<span class="text-sm text-white/40"> <span class="text-sm text-white/40">
<TimeAgo timestamp={props.created_at * 1000} /> <TimeAgo timestamp={props.created_at * 1000} />
</span> </span>
<span class="w-1.5 h-1.5 rounded-full bg-brand" /> <span class="h-1.5 w-1.5 rounded-full bg-brand" />
</div> </div>
</Show> </Show>
</div> </div>
<Show when={props.progress !== undefined}> <Show when={props.progress !== undefined}>
<div class="rounded-full overflow-hidden h-1.5 bg-brand-disabled w-full"> <div class="h-1.5 w-full overflow-hidden rounded-full bg-brand-disabled">
<div <div
class="rounded-full h-full min-w-0 max-w-full bg-brand transition-width" class="h-full max-w-full min-w-0 rounded-full bg-brand transition-width"
style={{ style={{
width: `${Math.floor(props.progress! * 100)}%`, width: `${Math.floor(props.progress! * 100)}%`,
}} }}

View file

@ -35,19 +35,19 @@ function NotificationPopup(props: Popup.PopupProps) {
return ( return (
<Popup {...props}> <Popup {...props}>
<div class="bg-secondary rounded-xl border border-gray-10 w-96 p-2 shadow-md shadow-black/30"> <div class="w-96 border border-gray-10 rounded-xl bg-secondary p-2 shadow-black/30 shadow-md">
<div class="overflow-hidden transition-height" ref={parent}> <div class="overflow-hidden transition-height" ref={parent}>
<div class="flex flex-col justify-start items-stretch text-start gap-2" ref={inner}> <div class="flex flex-col items-stretch justify-start gap-2 text-start" ref={inner}>
<p class="text-2lg px-2 pt-1">Notifications</p> <p class="px-2 pt-1 text-2lg">Notifications</p>
<Switch> <Switch>
<Match when={notifications().length > 0}> <Match when={notifications().length > 0}>
<OverlayScrollbarsComponent class="max-h-[min(500px,60vh)] overflow-auto"> <OverlayScrollbarsComponent class="max-h-[min(500px,60vh)] overflow-auto">
<div class="flex flex-col-reverse justify-center items-stretch "> <div class="flex flex-col-reverse items-stretch justify-center">
<For each={notifications()}> <For each={notifications()}>
{noti => ( {noti => (
<div class="flex flex-col w-full"> <div class="w-full flex flex-col">
<NotificationComponent {...noti} overlay={false} /> <NotificationComponent {...noti} overlay={false} />
<span class="bg-gray-05 h-px w-full" /> <span class="h-px w-full bg-gray-05" />
</div> </div>
)} )}
</For> </For>
@ -56,11 +56,11 @@ function NotificationPopup(props: Popup.PopupProps) {
</Match> </Match>
<Match when={notifications().length === 0}> <Match when={notifications().length === 0}>
<span class="px-2">You have no notifications</span> <span class="px-2">You have no notifications</span>
<span class="bg-gray-05 h-px" /> <span class="h-px bg-gray-05" />
</Match> </Match>
</Switch> </Switch>
<div class="flex flex-row justify-between items-end"> <div class="flex flex-row items-end justify-between">
<Button onClick={() => {}} buttonStyle="ghost" iconLeft={<Trash01Icon />}> <Button onClick={() => {}} buttonStyle="ghost" iconLeft={<Trash01Icon />}>
Clear Notifications Clear Notifications
</Button> </Button>

View file

@ -101,17 +101,17 @@ function HomePage() {
// }; // };
return ( return (
<div class="flex flex-col h-full gap-y-4 text-fg-primary"> <div class="h-full flex flex-col gap-y-4 text-fg-primary">
<Banner clusters={clusters()} /> <Banner clusters={clusters()} />
<div class="flex flex-row justify-between items-center"> <div class="flex flex-row items-center justify-between">
<div> <div>
<TextField iconLeft={<SearchMdIcon />} placeholder="Search for clusters..." /> <TextField iconLeft={<SearchMdIcon />} placeholder="Search for clusters..." />
</div> </div>
<div class="flex flex-row gap-x-4"> <div class="flex flex-row gap-x-4">
<Button <Button
buttonStyle="primary" buttonStyle="primary"
iconLeft={<PlusIcon class="!w-5 stroke-[2.2]" />} iconLeft={<PlusIcon class="stroke-[2.2] !w-5" />}
children="New Cluster" children="New Cluster"
onClick={newCluster} onClick={newCluster}
/> />
@ -138,8 +138,8 @@ function HomePage() {
// </DragDropProvider> // </DragDropProvider>
)} )}
fallback={( fallback={(
<div class="flex flex-col flex-1 gap-y-4 max-h-64 justify-center items-center"> <div class="max-h-64 flex flex-1 flex-col items-center justify-center gap-y-4">
<span class="text-lg font-bold uppercase text-fg-secondary">No clusters were found.</span> <span class="text-lg text-fg-secondary font-bold uppercase">No clusters were found.</span>
<span class="text-xl font-bold">Create one now with the New Cluster button.</span> <span class="text-xl font-bold">Create one now with the New Cluster button.</span>
</div> </div>
)} )}
@ -217,9 +217,9 @@ function Banner(props: BannerProps) {
}); });
return ( return (
<div class="relative w-full h-52 min-h-52 overflow-hidden rounded-xl"> <div class="relative h-52 min-h-52 w-full overflow-hidden rounded-xl">
<ClusterCover <ClusterCover
class="absolute rounded-xl w-full h-52 object-cover" class="absolute h-52 w-full rounded-xl object-cover"
linearBlur={{ linearBlur={{
degrees: 270, degrees: 270,
blur: 30, blur: 30,
@ -229,7 +229,7 @@ function Banner(props: BannerProps) {
fallback={BannerBackground} fallback={BannerBackground}
/> />
<div class="relative z-10 h-full px-8 py-6 text-fg-primary flex flex-col justify-between items-start"> <div class="relative z-10 h-full flex flex-col items-start justify-between px-8 py-6 text-fg-primary">
<div class="flex flex-col gap-y-2"> <div class="flex flex-col gap-y-2">
<h1>{cluster()?.meta.name || 'Create a cluster'}</h1> <h1>{cluster()?.meta.name || 'Create a cluster'}</h1>
<Show when={cluster() !== undefined}> <Show when={cluster() !== undefined}>
@ -249,7 +249,7 @@ function Banner(props: BannerProps) {
</p> </p>
</Show> </Show>
</div> </div>
<div class="flex w-full flex-row justify-between items-end"> <div class="w-full flex flex-row items-end justify-between">
<div class="flex flex-row items-center gap-x-4"> <div class="flex flex-row items-center gap-x-4">
<Show <Show
when={cluster() !== undefined} when={cluster() !== undefined}
@ -299,22 +299,22 @@ function ClusterCard(props: Cluster) {
ref, ref,
// sortable // sortable
)} )}
class="relative h-[152px] group flex flex-col rounded-xl bg-component-bg hover:bg-component-bg-hover active:bg-component-bg-pressed border border-gray-05" class="group relative h-[152px] flex flex-col border border-gray-05 rounded-xl bg-component-bg active:bg-component-bg-pressed hover:bg-component-bg-hover"
> >
<div class="flex-1 relative overflow-hidden rounded-t-xl"> <div class="relative flex-1 overflow-hidden rounded-t-xl">
<div <div
class="absolute h-full w-full group-hover:!scale-110 transition-transform" class="absolute h-full w-full transition-transform group-hover:!scale-110"
style={{ '-webkit-transform': 'translateZ(0)' }} style={{ '-webkit-transform': 'translateZ(0)' }}
> >
<ClusterCover <ClusterCover
cluster={props} cluster={props}
class="object-cover h-full w-full" class="h-full w-full object-cover"
/> />
</div> </div>
</div> </div>
<div class="z-10 p-3 flex flex-row gap-x-3 items-center justify-between"> <div class="z-10 flex flex-row items-center justify-between gap-x-3 p-3">
<div class="flex flex-col gap-1.5 overflow-hidden h-8"> <div class="h-8 flex flex-col gap-1.5 overflow-hidden">
<p class="h-4 font-medium text-ellipsis whitespace-nowrap">{props.meta.name}</p> <p class="h-4 text-ellipsis whitespace-nowrap font-medium">{props.meta.name}</p>
<p class="h-4 text-xs"> <p class="h-4 text-xs">
{upperFirst(props.meta.loader)} {upperFirst(props.meta.loader)}
{' '} {' '}
@ -331,7 +331,7 @@ function ClusterCard(props: Cluster) {
ClusterRoot.launch(navigate, props.uuid); ClusterRoot.launch(navigate, props.uuid);
}} }}
> >
<PlayIcon class="w-4! h-4!" /> <PlayIcon class="h-4! w-4!" />
</Button> </Button>
</div> </div>
</div> </div>
@ -354,7 +354,7 @@ function ClusterGroup(props: ClusterGroupProps) {
class="flex flex-col gap-y-4" class="flex flex-col gap-y-4"
> >
<h4>{props.title}</h4> <h4>{props.title}</h4>
<div class="grid grid-cols-4 2xl:grid-cols-6 gap-4 min-h-38"> <div class="grid grid-cols-4 min-h-38 gap-4 2xl:grid-cols-6">
{/* <SortableProvider ids={ids()}> */} {/* <SortableProvider ids={ids()}> */}
<For each={props.clusters}>{item => <ClusterCard {...item} />}</For> <For each={props.clusters}>{item => <ClusterCard {...item} />}</For>
{/* </SortableProvider> */} {/* </SortableProvider> */}

View file

@ -65,9 +65,9 @@ function BrowserMain() {
}); });
return ( return (
<div class="flex flex-col flex-1 h-full gap-2 relative"> <div class="relative h-full flex flex-1 flex-col gap-2">
<div class="flex flex-row justify-between sticky top-0 z-10 bg-primary"> <div class="sticky top-0 z-10 flex flex-row justify-between bg-primary">
<div class="flex flex-row gap-2 h-8"> <div class="h-8 flex flex-row gap-2">
<TextField <TextField
iconLeft={<SearchMdIcon />} iconLeft={<SearchMdIcon />}
@ -86,7 +86,7 @@ function BrowserMain() {
</Dropdown.Minimal> </Dropdown.Minimal>
</div> </div>
<div class="flex flex-row gap-2 justify-end"> <div class="flex flex-row justify-end gap-2">
<Button <Button
iconLeft={<Download01Icon />} iconLeft={<Download01Icon />}
children="From URL" children="From URL"
@ -119,13 +119,13 @@ interface ModsRowProps {
function ModsRow(props: ModsRowProps) { function ModsRow(props: ModsRowProps) {
return ( return (
<div class="flex flex-col flex-1 gap-3"> <div class="flex flex-1 flex-col gap-3">
<div class="flex flex-row flex-1 justify-between"> <div class="flex flex-1 flex-row justify-between">
<h4>{props.header}</h4> <h4>{props.header}</h4>
<A class="text-fg-secondary hover:text-fg-secondary-hover active:text-fg-secondary-pressed" href={`category?category=${props.category}`}>See all</A> <A class="text-fg-secondary active:text-fg-secondary-pressed hover:text-fg-secondary-hover" href={`category?category=${props.category}`}>See all</A>
</div> </div>
<div class="flex flex-row gap-2 max-w-full flex-wrap"> <div class="max-w-full flex flex-row flex-wrap gap-2">
<For each={props.packages}> <For each={props.packages}>
{mod => <ModCard {...mod} />} {mod => <ModCard {...mod} />}
</For> </For>

View file

@ -44,8 +44,8 @@ function BrowserMod() {
<> <>
<div class="flex flex-row gap-x-12"> <div class="flex flex-row gap-x-12">
<ModCard {...pkg()!} /> <ModCard {...pkg()!} />
<div class="flex flex-1 flex-col justify-between items-start bg-component-bg rounded-lg p-4 px-6"> <div class="flex flex-1 flex-col items-start justify-between rounded-lg bg-component-bg p-4 px-6">
<div class="flex w-full flex-row justify-between items-center"> <div class="w-full flex flex-row items-center justify-between">
<h1>{pkg()?.title}</h1> <h1>{pkg()?.title}</h1>
<Button <Button
buttonStyle="primary" buttonStyle="primary"

View file

@ -64,9 +64,9 @@ function ClusterLogs() {
}); });
return ( return (
<div class="flex flex-col flex-1"> <div class="flex flex-1 flex-col">
<div class="flex flex-col flex-1 gap-y-2"> <div class="flex flex-1 flex-col gap-y-2">
<div class="flex flex-row justify-between items-center gap-x-1 h-10"> <div class="h-10 flex flex-row items-center justify-between gap-x-1">
<h1>Logs</h1> <h1>Logs</h1>
<div class="flex flex-row gap-x-2"> <div class="flex flex-row gap-x-2">
<Button <Button

View file

@ -83,9 +83,9 @@ function ClusterMods() {
return ( return (
<Sidebar.Page> <Sidebar.Page>
<div class="flex flex-row justify-between w-full"> <div class="w-full flex flex-row justify-between">
<h1>Mods</h1> <h1>Mods</h1>
<div class="flex flex-row justify-end items-center gap-x-2"> <div class="flex flex-row items-center justify-end gap-x-2">
<Button <Button
buttonStyle="secondary" buttonStyle="secondary"
iconLeft={sortingAtoZ() ? <ChevronUpIcon /> : <ChevronDownIcon />} iconLeft={sortingAtoZ() ? <ChevronUpIcon /> : <ChevronDownIcon />}
@ -108,7 +108,7 @@ function ClusterMods() {
</Match> </Match>
<Match when={displayedMods().length === 0}> <Match when={displayedMods().length === 0}>
<p class="text-2lg text-center my-4">No mods were found</p> <p class="my-4 text-center text-2lg">No mods were found</p>
</Match> </Match>
</Switch> </Switch>
</ScrollableContainer> </ScrollableContainer>
@ -131,16 +131,16 @@ interface ModEntryProps {
function ModEntry(props: ModEntryProps) { function ModEntry(props: ModEntryProps) {
return ( return (
<div class="bg-component-bg hover:bg-component-bg-hover active:bg-component-bg-pressed p-3 gap-3 rounded-xl flex flex-row items-center"> <div class="flex flex-row items-center gap-3 rounded-xl bg-component-bg p-3 active:bg-component-bg-pressed hover:bg-component-bg-hover">
<div> <div>
<img src={props.thumbnail} alt={props.name} class="aspect-ratio-square h-10 rounded-lg" /> <img src={props.thumbnail} alt={props.name} class="aspect-ratio-square h-10 rounded-lg" />
</div> </div>
<div class="flex flex-col flex-1"> <div class="flex flex-1 flex-col">
<div class="flex flex-row justify-between items-center"> <div class="flex flex-row items-center justify-between">
<div class="flex flex-col items-start justify-center"> <div class="flex flex-col items-start justify-center">
<div class="flex flex-col items-start justify-center gap-y-2"> <div class="flex flex-col items-start justify-center gap-y-2">
<h4>{props.name}</h4> <h4>{props.name}</h4>
<span class="h-2 flex flex-row items-center justify-start text-xs font-600 text-fg-secondary/50"> <span class="h-2 flex flex-row items-center justify-start text-xs text-fg-secondary/50 font-600">
{props.version} {props.version}
{/* TODO: Add version checker */} {/* TODO: Add version checker */}
{/* <Show when={props.version.includes()}> */} {/* <Show when={props.version.includes()}> */}
@ -151,7 +151,7 @@ function ModEntry(props: ModEntryProps) {
</div> </div>
</div> </div>
<div class="flex flex-row gap-2 items-end justify-center"> <div class="flex flex-row items-end justify-center gap-2">
<Button buttonStyle="iconSecondary"> <Button buttonStyle="iconSecondary">
<Edit02Icon /> <Edit02Icon />
</Button> </Button>

View file

@ -263,26 +263,26 @@ function Banner(props: BannerProps) {
} }
return ( return (
<div class="flex flex-row bg-component-bg rounded-xl p-2.5 gap-x-2.5 h-37"> <div class="h-37 flex flex-row gap-x-2.5 rounded-xl bg-component-bg p-2.5">
<div class="rounded-lg overflow-hidden border border-gray-10 relative h-full w-57 min-w-57 aspect-ratio-video"> <div class="relative aspect-ratio-video h-full min-w-57 w-57 overflow-hidden border border-gray-10 rounded-lg">
<Show when={props.editMode()}> <Show when={props.editMode()}>
<div <div
onClick={launchFilePicker} onClick={launchFilePicker}
class="bg-black/50 opacity-50 hover:opacity-100 w-full h-full absolute flex justify-center items-center" class="absolute h-full w-full flex items-center justify-center bg-black/50 opacity-50 hover:opacity-100"
> >
<ImagePlusIcon class="w-12 h-12" /> <ImagePlusIcon class="h-12 w-12" />
</div> </div>
</Show> </Show>
<ClusterCover override={props.newCover()} cluster={props.cluster} class="h-full w-full object-cover" /> <ClusterCover override={props.newCover()} cluster={props.cluster} class="h-full w-full object-cover" />
</div> </div>
<div class="flex flex-col w-full overflow-hidden gap-y-.5 justify-between text-fg-primary"> <div class="w-full flex flex-col justify-between gap-y-.5 overflow-hidden text-fg-primary">
<div> <div>
<Show <Show
when={props.editMode()} when={props.editMode()}
fallback={ fallback={
<h2 class="text-2xl break-words text-wrap">{props.cluster.meta.name}</h2> <h2 class="break-words text-wrap text-2xl">{props.cluster.meta.name}</h2>
} }
> >
<TextField <TextField
@ -296,7 +296,7 @@ function Banner(props: BannerProps) {
<div class="flex flex-1 flex-row"> <div class="flex flex-1 flex-row">
<div <div
class="flex flex-1 flex-col justify-between items-start" class="flex flex-1 flex-col items-start justify-between"
classList={{ classList={{
'text-fg-primary-disabled': props.editMode(), 'text-fg-primary-disabled': props.editMode(),
}} }}

View file

@ -37,12 +37,12 @@ function ClusterRoot(props: ParentProps) {
return ( return (
<ClusterProvider uuid={searchParams.id}> <ClusterProvider uuid={searchParams.id}>
<div class="flex flex-row flex-1 h-full gap-x-7"> <div class="h-full flex flex-1 flex-row gap-x-7">
<div class="mt-8"> <div class="mt-8">
<ClusterSidebar /> <ClusterSidebar />
</div> </div>
<div class="flex flex-col w-full h-full"> <div class="h-full w-full flex flex-col">
<AnimatedRoutes> <AnimatedRoutes>
<ErrorBoundary> <ErrorBoundary>
{props.children} {props.children}

View file

@ -28,7 +28,7 @@ function ClusterScreenshots() {
fallback={<div class="text-gray-400">No screenshots found. Press F2 in game to take a screenshot!</div>} fallback={<div class="text-gray-400">No screenshots found. Press F2 in game to take a screenshot!</div>}
when={list() !== undefined && list()!.length > 0} when={list() !== undefined && list()!.length > 0}
> >
<div class="grid grid-cols-[repeat(auto-fill,minmax(350px,1fr))] w-full gap-2 transform-gpu"> <div class="grid grid-cols-[repeat(auto-fill,minmax(350px,1fr))] w-full transform-gpu gap-2">
<For each={list()!}> <For each={list()!}>
{screenshot => ( {screenshot => (
<ScreenshotEntry path={screenshot} cluster_path={cluster()?.path || ''} /> <ScreenshotEntry path={screenshot} cluster_path={cluster()?.path || ''} />
@ -38,7 +38,7 @@ function ClusterScreenshots() {
</Show> </Show>
</ScrollableContainer> </ScrollableContainer>
<div class="flex flex-row justify-end items-end mt-2"> <div class="mt-2 flex flex-row items-end justify-end">
<Button <Button
buttonStyle="primary" buttonStyle="primary"
iconLeft={<LinkExternal01Icon />} iconLeft={<LinkExternal01Icon />}
@ -65,7 +65,7 @@ function ScreenshotEntry(props: { path: string; cluster_path: string }) {
return ( return (
<div <div
class="bg-component-bg hover:bg-component-bg-hover hover:opacity-80 active:bg-component-bg-pressed p-3 gap-3 rounded-xl flex flex-col items-center" class="flex flex-col items-center gap-3 rounded-xl bg-component-bg p-3 active:bg-component-bg-pressed hover:bg-component-bg-hover hover:opacity-80"
onClick={onClick} onClick={onClick}
> >
<img src={pathSrc()} alt={props.path} class="aspect-ratio-video w-full rounded-lg" /> <img src={pathSrc()} alt={props.path} class="aspect-ratio-video w-full rounded-lg" />

View file

@ -39,7 +39,7 @@ function ClusterWorlds() {
</Show> </Show>
</ScrollableContainer> </ScrollableContainer>
<div class="flex flex-row justify-end items-end mt-2"> <div class="mt-2 flex flex-row items-end justify-end">
<Button <Button
buttonStyle="primary" buttonStyle="primary"
iconLeft={<LinkExternal01Icon />} iconLeft={<LinkExternal01Icon />}
@ -83,18 +83,18 @@ function WorldEntry(props: { name: string; cluster_path: string }) {
return ( return (
<div <div
class="bg-component-bg hover:bg-component-bg-hover active:bg-component-bg-pressed p-3 gap-3 rounded-xl flex flex-row justify-between items-center" class="flex flex-row items-center justify-between gap-3 rounded-xl bg-component-bg p-3 active:bg-component-bg-pressed hover:bg-component-bg-hover"
onClick={onClick} onClick={onClick}
> >
<div class="flex flex-row items-center gap-x-3"> <div class="flex flex-row items-center gap-x-3">
<WorldIcon cluster_name={props.cluster_path} world_name={props.name} class="w-16 h-16 aspect-ratio-square" /> <WorldIcon cluster_name={props.cluster_path} world_name={props.name} class="aspect-ratio-square h-16 w-16" />
<div class="flex flex-col gap-y-2"> <div class="flex flex-col gap-y-2">
<h3>{props.name}</h3> <h3>{props.name}</h3>
<p>Todo</p> <p>Todo</p>
</div> </div>
</div> </div>
<div class="flex flex-row justify-end items-center gap-x-3"> <div class="flex flex-row items-center justify-end gap-x-3">
<Button <Button
buttonStyle="iconDanger" buttonStyle="iconDanger"
children={<Trash01Icon />} children={<Trash01Icon />}

View file

@ -36,7 +36,7 @@ function SettingsRoutes() {
function SettingsRoot(props: ParentProps) { function SettingsRoot(props: ParentProps) {
return ( return (
<div class="flex flex-row flex-1 h-full gap-x-7"> <div class="h-full flex flex-1 flex-row gap-x-7">
<div class="mt-8 flex flex-col justify-between"> <div class="mt-8 flex flex-col justify-between">
<Sidebar <Sidebar
base="/settings" base="/settings"
@ -61,7 +61,7 @@ function SettingsRoot(props: ParentProps) {
<Info /> <Info />
</div> </div>
<div class="flex flex-col w-full h-full"> <div class="h-full w-full flex flex-col">
<AnimatedRoutes> <AnimatedRoutes>
<ErrorBoundary> <ErrorBoundary>
{props.children} {props.children}
@ -76,10 +76,10 @@ function Info() {
const [copied, setCopied] = createSignal(false); const [copied, setCopied] = createSignal(false);
return ( return (
<div class="mx-1 my-2 flex flex-col justify-center items-center relative"> <div class="relative mx-1 my-2 flex flex-col items-center justify-center">
<Tooltip text={copied() ? 'Copied to clipboard!' : 'Copy to clipboard'}> <Tooltip text={copied() ? 'Copied to clipboard!' : 'Copy to clipboard'}>
<div <div
class="whitespace-pre-line line-height-normal text-sm text-fg-secondary" class="whitespace-pre-line text-sm text-fg-secondary line-height-normal"
onClick={(e) => { onClick={(e) => {
const info = e.target.innerHTML; const info = e.target.innerHTML;
writeText(info) writeText(info)

View file

@ -17,7 +17,7 @@ function SettingsChangelog() {
// TODO: Implement markdown support? // TODO: Implement markdown support?
function UpdatePost() { function UpdatePost() {
return ( return (
<div class="bg-component-bg p-4 rounded-xl flex-1 flex flex-col gap-2 line-height-relaxed whitespace-pre-line"> <div class="flex flex-1 flex-col gap-2 whitespace-pre-line rounded-xl bg-component-bg p-4 line-height-relaxed">
<h2>New Feature</h2> <h2>New Feature</h2>
<p class=""> <p class="">
{` {`

View file

@ -29,8 +29,8 @@ function SettingsAccounts() {
<ScrollableContainer> <ScrollableContainer>
<Switch> <Switch>
<Match when={controller.accounts()?.length === 0}> <Match when={controller.accounts()?.length === 0}>
<div class="flex flex-col h-full gap-y-4 max-h-64 justify-center items-center"> <div class="h-full max-h-64 flex flex-col items-center justify-center gap-y-4">
<span class="text-lg font-bold uppercase text-fg-secondary">No accounts added.</span> <span class="text-lg text-fg-secondary font-bold uppercase">No accounts added.</span>
<span class="text-xl font-bold">Add one with the Add Account button.</span> <span class="text-xl font-bold">Add one with the Add Account button.</span>
</div> </div>
</Match> </Match>
@ -50,7 +50,7 @@ function SettingsAccounts() {
</Switch> </Switch>
</ScrollableContainer> </ScrollableContainer>
<div class="flex flex-row justify-end items-end mt-2"> <div class="mt-2 flex flex-row items-end justify-end">
<Button <Button
buttonStyle="primary" buttonStyle="primary"
iconLeft={<UserPlus02Icon />} iconLeft={<UserPlus02Icon />}
@ -79,9 +79,9 @@ function AccountRow(props: AccountRowProps) {
onClick={() => props.onClick(props.uuid)} onClick={() => props.onClick(props.uuid)}
class={`flex flex-row bg-component-bg hover:bg-component-bg-hover active:bg-component-bg-pressed rounded-xl gap-3.5 p-4 items-center box-border border ${defaultProps.current ? 'border-brand' : 'border-transparent'}`} class={`flex flex-row bg-component-bg hover:bg-component-bg-hover active:bg-component-bg-pressed rounded-xl gap-3.5 p-4 items-center box-border border ${defaultProps.current ? 'border-brand' : 'border-transparent'}`}
> >
<div class="flex justify-center items-center h-12 w-12"> <div class="h-12 w-12 flex items-center justify-center">
<PlayerHead <PlayerHead
class="w-12 h-12 rounded-md" class="h-12 w-12 rounded-md"
uuid={props.uuid} uuid={props.uuid}
onError={() => setErrored(true)} onError={() => setErrored(true)}
/> />
@ -94,7 +94,7 @@ function AccountRow(props: AccountRowProps) {
<Tooltip <Tooltip
text="Could not fetch this account's game profile" text="Could not fetch this account's game profile"
> >
<InfoCircleIcon class="w-4 h-4" /> <InfoCircleIcon class="h-4 w-4" />
</Tooltip> </Tooltip>
</Show> </Show>
</div> </div>

View file

@ -89,7 +89,7 @@ function SettingsRow(props: SettingsRowProps & {
<BaseSettingsRow {...rest}> <BaseSettingsRow {...rest}>
<Show when={split.isGlobal() === false}> <Show when={split.isGlobal() === false}>
<div <div
class="px-2 py-1 text-xs text-white bg-brand hover:bg-brand-hover active:bg-brand-pressed rounded-md font-italic font-medium" class="rounded-md bg-brand px-2 py-1 text-xs text-white font-medium font-italic active:bg-brand-pressed hover:bg-brand-hover"
onClick={() => split.reset()} onClick={() => split.reset()}
> >
Reset Reset
@ -130,7 +130,7 @@ export function GameSettings(props: {
isGlobal={props.resolution.isGlobal} isGlobal={props.resolution.isGlobal}
reset={props.resolution.resetToFallback} reset={props.resolution.resetToFallback}
> >
<div class="grid grid-justify-center grid-items-center gap-2 grid-cols-[70px_16px_70px]"> <div class="grid grid-cols-[70px_16px_70px] gap-2 grid-justify-center grid-items-center">
<TextField.Number <TextField.Number
class="text-center" class="text-center"
value={props.resolution.get()[0]} value={props.resolution.get()[0]}
@ -138,7 +138,7 @@ export function GameSettings(props: {
props.resolution.set([Number.parseInt(value), props.resolution.get()[1]]); props.resolution.set([Number.parseInt(value), props.resolution.get()[1]]);
}} }}
/> />
<XIcon class="w-4 h-4" /> <XIcon class="h-4 w-4" />
<TextField.Number <TextField.Number
class="text-center" class="text-center"
value={props.resolution.get()[1]} value={props.resolution.get()[1]}
@ -156,7 +156,7 @@ export function GameSettings(props: {
isGlobal={props.memory.isGlobal} isGlobal={props.memory.isGlobal}
reset={props.memory.resetToFallback} reset={props.memory.resetToFallback}
> >
<div class="flex flex-justify-center items-center gap-x-4"> <div class="flex items-center gap-x-4 flex-justify-center">
<div class="flex flex-row items-center gap-x-2"> <div class="flex flex-row items-center gap-x-2">
<span>Min:</span> <span>Min:</span>
<TextField.Number <TextField.Number

View file

@ -12,7 +12,6 @@ authors = { workspace = true }
[dependencies] [dependencies]
onelauncher = { workspace = true, features = [ "cli" ] } onelauncher = { workspace = true, features = [ "cli" ] }
tokio = { workspace = true } tokio = { workspace = true }
webbrowser = { workspace = true } webbrowser = { workspace = true }
url = { workspace = true } url = { workspace = true }

View file

@ -1,26 +1,16 @@
// @ts-check
import { defineConfig } from '@flowr/eslint-config'; import { defineConfig } from '@flowr/eslint-config';
export default defineConfig({ export default defineConfig({
typescript: true, typescript: true,
solid: true, solid: true,
unocss: false, unocss: true,
toml: { toml: true,
overrides: {
'toml/padding-line-between-pairs': 'off',
},
},
gitignore: true, gitignore: true,
ignores: [ ignores: [
'**/target',
'**/dist',
'**/types', '**/types',
'**/cache', '**/cache',
'**/.temp',
'**/*.svg', '**/*.svg',
'**/gen', '**/gen',
'*.rs', '*.rs',
'pnpm-lock.yaml',
'**/node_modules',
], ],
}); });

View file

@ -4,7 +4,7 @@
"version": "1.0.0-alpha.1", "version": "1.0.0-alpha.1",
"private": true, "private": true,
"engineStrict": true, "engineStrict": true,
"packageManager": "pnpm@9.6.0", "packageManager": "pnpm@9.7.0",
"description": "Next-generation open source Minecraft launcher and tools for interacting with Polyfrost", "description": "Next-generation open source Minecraft launcher and tools for interacting with Polyfrost",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"homepage": "https://polyfrost.org", "homepage": "https://polyfrost.org",
@ -16,7 +16,7 @@
"bugs": "https://github.com/polyfrost/onelauncher/issues", "bugs": "https://github.com/polyfrost/onelauncher/issues",
"sideEffects": false, "sideEffects": false,
"engines": { "engines": {
"pnpm": "9.6.0", "pnpm": "9.7.0",
"npm": "pnpm", "npm": "pnpm",
"yarn": "pnpm", "yarn": "pnpm",
"node": ">=18" "node": ">=18"
@ -39,7 +39,7 @@
"test:vi": "pnpm vitest run", "test:vi": "pnpm vitest run",
"test:update": "pnpm vitest -u", "test:update": "pnpm vitest -u",
"test:ui": "pnpm vitest --ui", "test:ui": "pnpm vitest --ui",
"lint:es": "eslint . --cache", "lint:es": "eslint . --cache --flag unstable_ts_config",
"format:es": "pnpm lint:es --fix", "format:es": "pnpm lint:es --fix",
"lint:rs": "cargo +nightly fmt --check && cargo clippy -- -D warnings", "lint:rs": "cargo +nightly fmt --check && cargo clippy -- -D warnings",
"format:rs": "cargo +nightly fmt && cargo clippy --fix", "format:rs": "cargo +nightly fmt && cargo clippy --fix",
@ -52,17 +52,18 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@flowr/eslint-config": "^3.10.5", "@flowr/eslint-config": "^3.11.3",
"@types/node": "^22.1.0", "@types/node": "^22.2.0",
"@unocss/eslint-plugin": "^0.61.9",
"@vitest/ui": "^2.0.5", "@vitest/ui": "^2.0.5",
"bumpp": "^9.4.2", "bumpp": "^9.4.2",
"changelogen": "^0.5.5", "eslint": "^9.9.0",
"eslint": "^9.8.0",
"eslint-plugin-solid": "^0.14.1", "eslint-plugin-solid": "^0.14.1",
"jiti": "^1.21.6",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tsx": "~4.16.5", "tsx": "~4.17.0",
"typescript": "^5.5.4", "typescript": "^5.5.4",
"vite": "^5.3.5", "vite": "^5.4.0",
"vitest": "^2.0.5" "vitest": "^2.0.5"
} }
} }

View file

@ -20,7 +20,7 @@
"@tanstack/solid-query": "^5.51.21", "@tanstack/solid-query": "^5.51.21",
"fast-equals": "^5.0.1", "fast-equals": "^5.0.1",
"plausible-tracker": "^0.3.9", "plausible-tracker": "^0.3.9",
"solid-js": "^1.8.19", "solid-js": "^1.8.20",
"zod": "^3.23.8" "zod": "^3.23.8"
} }
} }

View file

@ -32,9 +32,7 @@ specta = { workspace = true, optional = true }
# CLI-only deps # CLI-only deps
indicatif = { workspace = true, optional = true } indicatif = { workspace = true, optional = true }
interpulse = { workspace = true } interpulse = { workspace = true }
tracing = { workspace = true } tracing = { workspace = true }
tracing-subscriber = { workspace = true } tracing-subscriber = { workspace = true }
tracing-error = { workspace = true } tracing-error = { workspace = true }
@ -44,7 +42,6 @@ tracing-appender = { workspace = true }
notify = { workspace = true } notify = { workspace = true }
notify-debouncer-mini = { workspace = true } notify-debouncer-mini = { workspace = true }
iota_stronghold = { workspace = true } iota_stronghold = { workspace = true }
zeroize = { workspace = true } zeroize = { workspace = true }
tokio = { workspace = true } tokio = { workspace = true }
serde = { workspace = true } serde = { workspace = true }

View file

@ -1,3 +1,3 @@
pub mod logger; pub mod logger;
pub mod screenshots; pub mod screenshots;
pub mod worlds; pub mod worlds;

View file

@ -19,12 +19,12 @@
"int:prepare": "pnpm tsx prepare.ts" "int:prepare": "pnpm tsx prepare.ts"
}, },
"dependencies": { "dependencies": {
"@flowr/utils": "^3.10.5", "@flowr/utils": "^3.11.3",
"execa": "^9.3.0", "execa": "^9.3.0",
"mustache": "^4.2.0", "mustache": "^4.2.0",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"semver": "^7.6.3", "semver": "^7.6.3",
"undici": "^6.19.5" "undici": "^6.19.7"
}, },
"devDependencies": { "devDependencies": {
"@types/iarna__toml": "^2.0.5", "@types/iarna__toml": "^2.0.5",

1270
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
[toolchain] [toolchain]
channel = "1.80" channel = "1.80.1"
profile = "minimal" profile = "minimal"
components = [ components = [
"cargo", "cargo",

1
uno.config.ts Normal file
View file

@ -0,0 +1 @@
export { default } from './apps/frontend/uno.config';