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.check.targets": null,
"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
"prettier.enable": false,
@ -62,7 +54,6 @@
"source.organizeImports": "never"
},
"eslint.runtime": "node",
"eslint.useFlatConfig": true,
// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off", "fixable": true },
@ -87,26 +78,112 @@
"json",
"jsonc",
"yaml",
"xml",
"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.expand": false,
"explorer.fileNesting.patterns": {
"*.ts": "${capture}.js",
"*.js": "${capture}.js.map, ${capture}.min.js, ${capture}.d.ts",
"*.jsx": "${capture}.js",
"*.tsx": "${capture}.ts",
".npmrc": ".nvmrc, .yarnrc.yml",
".gitignore": ".eslintignore, .prettierignore",
"README.md": "CONTRIBUTING.md, CODE_OF_CONDUCT.md, LICENSE",
"Cargo.toml": "Cargo.lock",
".eslintrc.js": ".eslintcache",
".prettierrc.*": ".rustfmt.toml, .gitattributes, .editorconfig, .clippy.toml",
"package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, pnpm-workspace.yaml, .pnp.cjs, .pnp.loader.mjs",
"tsconfig.json": "tsconfig.*.json",
"flake.nix": "shell.nix, flake.lock, Cargo.nix"
".clang-tidy": ".clang-format, .clangd, compile_commands.json",
".env": "*.env, .env.*, .envrc, env.d.ts",
".gitignore": ".gitattributes, .gitmodules, .gitmessage, .mailmap, .git-blame*",
".project": ".classpath",
"+layout.svelte": "+layout.ts,+layout.ts,+layout.js,+layout.server.ts,+layout.server.js,+layout.gql",
"+page.svelte": "+page.server.ts,+page.server.js,+page.ts,+page.js,+page.gql",
"ansible.cfg": "ansible.cfg, .ansible-lint, requirements.yml",
"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.*",
"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.*",
"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.*",
"BUILD.bazel": "*.bzl, *.bazel, *.bazelrc, bazel.rc, .bazelignore, .bazelproject, WORKSPACE",
"Cargo.toml": ".clippy.toml, .rustfmt.toml, cargo.lock, clippy.toml, cross.toml, rust-toolchain.toml, rustfmt.toml",
"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",
"tokio",
"xz2",
"zstd 0.13.2",
"zstd-safe 7.2.1",
"zstd",
"zstd-safe",
]
[[package]]
@ -253,9 +253,9 @@ dependencies = [
[[package]]
name = "async-io"
version = "2.3.3"
version = "2.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964"
checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8"
dependencies = [
"async-lock",
"cfg-if",
@ -267,7 +267,7 @@ dependencies = [
"rustix",
"slab",
"tracing",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -283,9 +283,9 @@ dependencies = [
[[package]]
name = "async-process"
version = "2.2.3"
version = "2.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a"
checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374"
dependencies = [
"async-channel",
"async-io",
@ -298,7 +298,7 @@ dependencies = [
"futures-lite",
"rustix",
"tracing",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -314,9 +314,9 @@ dependencies = [
[[package]]
name = "async-signal"
version = "0.2.9"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32"
checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3"
dependencies = [
"async-io",
"async-lock",
@ -327,7 +327,7 @@ dependencies = [
"rustix",
"signal-hook-registry",
"slab",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -721,9 +721,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.1.7"
version = "1.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc"
checksum = "f87b298677bb2f19f542743f145dd7f1de0fc7798bc41ee54684e4e16778c8a7"
dependencies = [
"jobserver",
"libc",
@ -931,9 +931,9 @@ dependencies = [
[[package]]
name = "core-foundation-sys"
version = "0.8.6"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "core-graphics"
@ -977,6 +977,21 @@ dependencies = [
"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]]
name = "crc32fast"
version = "1.4.2"
@ -1653,14 +1668,14 @@ dependencies = [
[[package]]
name = "filetime"
version = "0.2.23"
version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.4.1",
"windows-sys 0.52.0",
"libredox",
"windows-sys 0.59.0",
]
[[package]]
@ -2388,9 +2403,9 @@ dependencies = [
[[package]]
name = "hyper-util"
version = "0.1.6"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956"
checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9"
dependencies = [
"bytes",
"futures-channel",
@ -2606,7 +2621,7 @@ dependencies = [
"hmac",
"iterator-sorted",
"k256",
"pbkdf2 0.12.2",
"pbkdf2",
"rand 0.8.5",
"scrypt",
"serde",
@ -2902,6 +2917,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
"bitflags 2.6.0",
"libc",
"redox_syscall 0.5.3",
]
[[package]]
@ -2918,7 +2934,7 @@ dependencies = [
"tar",
"ureq",
"vcpkg",
"zip 2.1.6",
"zip",
]
[[package]]
@ -2964,6 +2980,16 @@ dependencies = [
"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]]
name = "lzma-sys"
version = "0.1.20"
@ -3414,9 +3440,9 @@ dependencies = [
[[package]]
name = "object"
version = "0.36.2"
version = "0.36.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e"
checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
dependencies = [
"memchr",
]
@ -3479,7 +3505,7 @@ dependencies = [
"whoami",
"winreg",
"zeroize",
"zip 0.6.6",
"zip",
]
[[package]]
@ -3655,17 +3681,6 @@ dependencies = [
"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]]
name = "paste"
version = "1.0.15"
@ -3678,18 +3693,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "pbkdf2"
version = "0.12.2"
@ -3883,9 +3886,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "piper"
version = "0.2.3"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391"
checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"
dependencies = [
"atomic-waker",
"fastrand",
@ -3936,9 +3939,9 @@ dependencies = [
[[package]]
name = "polling"
version = "3.7.2"
version = "3.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b"
checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511"
dependencies = [
"cfg-if",
"concurrent-queue",
@ -3946,7 +3949,7 @@ dependencies = [
"pin-project-lite",
"rustix",
"tracing",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -4522,9 +4525,9 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
version = "1.7.0"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
[[package]]
name = "rustls-webpki"
@ -4620,7 +4623,7 @@ version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f"
dependencies = [
"pbkdf2 0.12.2",
"pbkdf2",
"salsa20",
"sha2",
]
@ -4693,9 +4696,9 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.204"
version = "1.0.205"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150"
dependencies = [
"serde_derive",
]
@ -4713,9 +4716,9 @@ dependencies = [
[[package]]
name = "serde_derive"
version = "1.0.204"
version = "1.0.205"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1"
dependencies = [
"proc-macro2",
"quote",
@ -5443,9 +5446,9 @@ dependencies = [
[[package]]
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"
checksum = "2407c7d37a491b16e530445c9611d91091cae198eea2ed424913b740215605f2"
checksum = "90a9e63ecd827d57228864764e0234935c9aac230099cf145197c8c08e754ced"
dependencies = [
"base64 0.22.1",
"brotli 3.5.0",
@ -5470,9 +5473,9 @@ dependencies = [
[[package]]
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"
checksum = "d210893b693be00f569b4f54456803debe104b7675f368205f2b6e94bac09b34"
checksum = "a54f5d5b289aa6215ffcfed7d4ff9960a04b7a854436d04519a9fcf911050cba"
dependencies = [
"heck 0.5.0",
"proc-macro2",
@ -5484,9 +5487,9 @@ dependencies = [
[[package]]
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"
checksum = "b352e4478af27bd7c76724bb426ebb32fc51baafb2186afabed4e706dc9e39d4"
checksum = "03ce2ac5e182251ff932750d69c9b240a78e44901a7a6234814d63c595b43660"
dependencies = [
"anyhow",
"glob",
@ -5614,7 +5617,7 @@ dependencies = [
"tokio",
"url",
"windows-sys 0.52.0",
"zip 2.1.6",
"zip",
]
[[package]]
@ -5634,9 +5637,9 @@ dependencies = [
[[package]]
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"
checksum = "6624fdf383ccafc9e8ad9205fe6e5c976b318efcd6b3662dde658c74e4254792"
checksum = "8f01b129b1ebdf09563c354760dbe7c0e96a166b4e33362d9c8d207f527c7ea5"
dependencies = [
"dpi",
"gtk",
@ -5653,9 +5656,9 @@ dependencies = [
[[package]]
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"
checksum = "9fd1a785c4281f8231b091593393b40cb3a800810c407b1ffed52de27ff1640a"
checksum = "fcda27639094ace2bf25f00bc10e35ea4e3af2f92753b1bdd2a174d1fa5a6292"
dependencies = [
"cocoa",
"gtk",
@ -5707,9 +5710,9 @@ dependencies = [
[[package]]
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"
checksum = "6f435eeaae1e69cf93cf19da0f727989eed2e5eb6fc63a8d21432f59dd3ac4ac"
checksum = "28bb83cffa26e9cb7a2b3d0c31ab87bf277f44aaaa90f17159aef4d37aabd051"
dependencies = [
"aes-gcm",
"brotli 3.5.0",
@ -5755,15 +5758,15 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.11.0"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53"
checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
dependencies = [
"cfg-if",
"fastrand",
"once_cell",
"rustix",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -6285,9 +6288,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "ureq"
version = "2.10.0"
version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72139d247e5f97a3eff96229a7ae85ead5328a39efe76f8bf5a06313d505b6ea"
checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a"
dependencies = [
"base64 0.22.1",
"log",
@ -7150,12 +7153,12 @@ dependencies = [
[[package]]
name = "xdg-home"
version = "1.2.0"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8"
checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.59.0",
]
[[package]]
@ -7274,41 +7277,33 @@ dependencies = [
"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]]
name = "zip"
version = "2.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40dd8c92efc296286ce1fbd16657c5dbefff44f1b4ca01cc5f517d8b7b3d3e2e"
dependencies = [
"aes",
"arbitrary",
"bzip2",
"constant_time_eq 0.3.0",
"crc32fast",
"crossbeam-utils",
"deflate64",
"displaydoc",
"flate2",
"hmac",
"indexmap 2.3.0",
"lzma-rs",
"memchr",
"pbkdf2",
"rand 0.8.5",
"sha1",
"thiserror",
"time",
"zeroize",
"zopfli",
"zstd",
]
[[package]]
@ -7325,32 +7320,13 @@ dependencies = [
"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]]
name = "zstd"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
dependencies = [
"zstd-safe 7.2.1",
]
[[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",
"zstd-safe",
]
[[package]]

View file

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

View file

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

View file

@ -23,6 +23,6 @@
"@onelauncher/frontend": "workspace:*"
},
"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?
.ok_or("cluster not found")?;
let screenshots = cluster::content::screenshots::get_screenshots(&cluster.cluster_path())
.await?;
let screenshots =
cluster::content::screenshots::get_screenshots(&cluster.cluster_path()).await?;
Ok(screenshots)
}
@ -207,8 +207,7 @@ pub async fn get_worlds(uuid: Uuid) -> Result<Vec<String>, String> {
.await?
.ok_or("cluster not found")?;
let screenshots = cluster::content::worlds::get_worlds(&cluster.cluster_path())
.await?;
let screenshots = cluster::content::worlds::get_worlds(&cluster.cluster_path()).await?;
Ok(screenshots)
}

View file

@ -1,5 +1,6 @@
use onelauncher::{data::MinecraftCredentials, store::MinecraftLogin};
use onelauncher::data::MinecraftCredentials;
use onelauncher::minecraft;
use onelauncher::store::MinecraftLogin;
use tauri::{AppHandle, Manager};
use uuid::Uuid;
@ -23,7 +24,9 @@ pub async fn remove_user(uuid: Uuid) -> Result<(), String> {
#[specta::specta]
#[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?;
if let Some(fallback) = fallback {
@ -54,7 +57,10 @@ pub async fn auth_login(handle: AppHandle) -> Result<Option<MinecraftCredentials
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();
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())?,
),
)
.title("Log into OneLauncher")
.always_on_top(true)
.center()
.build()
.map_err(|err| err.to_string())?;
.title("Log into OneLauncher")
.always_on_top(true)
.center()
.build()
.map_err(|err| err.to_string())?;
win.request_user_attention(Some(tauri::UserAttentionType::Critical))
.map_err(|err| err.to_string())?;

View file

@ -35,13 +35,13 @@
"overlayscrollbars": "^2.10.0",
"overlayscrollbars-solid": "^0.5.5",
"pathe": "^1.1.2",
"solid-js": "^1.8.19",
"solid-js": "^1.8.20",
"solid-transition-group": "^0.2.3",
"uuid": "^10.0.0"
},
"devDependencies": {
"@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",
"@types/uuid": "^10.0.0",
"jsdom": "^24.1.1",
@ -49,6 +49,6 @@
"unocss": "^0.61.9",
"vite-plugin-solid": "^2.10.2",
"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 (
<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 />
<div class="flex flex-col px-8">
<Navbar />
</div>
<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>
<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>
{props.children}
</AnimatedRoutes>

View file

@ -20,7 +20,7 @@ function NavbarLink(props: NavbarLinkProps) {
return (
<A
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"
activeClass="text-fg-primary"
end
@ -41,9 +41,9 @@ function Navbar() {
let notificationButton!: HTMLButtonElement;
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 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 />
</div>
</div>
@ -52,7 +52,7 @@ function Navbar() {
<NavbarLink path="/browser" label="Browser" />
<NavbarLink path="/updates" label="Updates" />
</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">
<TerminalBrowserIcon />
</Button>
@ -65,7 +65,7 @@ function Navbar() {
<Button
buttonStyle="icon"
ref={notificationButton}
class="[&>div]:absolute relative"
class="relative [&>div]:absolute"
onClick={() => setNotificationMenuOpen(!notificationMenuOpen())}
>
<Bell01Icon />
@ -82,7 +82,7 @@ function Navbar() {
onClick={() => setProfileMenuOpen(!profileMenuOpen())}
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>
</div>

View file

@ -3,9 +3,9 @@ import type { ParentProps } from 'solid-js';
function ScrollableContainer(props: ParentProps) {
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">
<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}
</div>
</OverlayScrollbarsComponent>

View file

@ -10,22 +10,22 @@ export type SettingsRowProps = ParentProps & {
function SettingsRow(props: SettingsRowProps) {
return (
<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={{
'bg-component-bg-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}
</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>
<p class="text-wrap text-sm">{props.description}</p>
</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}
</div>
</div>

View file

@ -31,12 +31,12 @@ function Sidebar(props: SidebarProps) {
}
return (
<div class="flex flex-col w-52">
<div class="w-52 flex flex-col">
<For each={Object.keys(props.links)}>
{section => (
<div class="flex flex-col gap-y-2">
<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">
<For each={props.links[section]}>
{(link) => {

View file

@ -14,8 +14,8 @@ interface TitlebarButtonProps {
function TitlebarButton(props: TitlebarButtonProps) {
return (
<button class="flex items-center justify-center w-8 h-8 group" onClick={e => props.onClick(e)}>
<div class="rounded-lg group-hover:bg-primary p-1">
<button class="group h-8 w-8 flex items-center justify-center" onClick={e => props.onClick(e)}>
<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'}`} />
</div>
</button>
@ -51,7 +51,7 @@ function WindowFrame() {
});
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">
<TitlebarButton icon={ChevronLeftIcon} onClick={() => history.back()} />
</div>

View file

@ -50,7 +50,7 @@ function Dropdown(props: DropdownProps) {
iconRight={<ChevronDownIcon />}
>
<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>
{items()[selected()]}
@ -79,7 +79,7 @@ function Dropdown(props: DropdownProps) {
<Index each={items()}>
{(item, 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()}
<div class={styles.selected! + (selected() === index ? ` ${styles.visible}` : '')} />
</div>

View file

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

View file

@ -23,15 +23,15 @@ function ModCard(props: ManagedPackage) {
}
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 class="relative h-28 overflow-hidden flex justify-center items-center">
<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="relative w-2/5 aspect-ratio-square z-1 rounded-md image-render-auto" src={props.icon_url || ''} alt={`Icon for ${props.title}`} />
<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 flex items-center justify-center overflow-hidden">
<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 z-1 aspect-ratio-square w-2/5 rounded-md image-render-auto" src={props.icon_url || ''} alt={`Icon for ${props.title}`} />
</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">
<h5 class="font-medium text-fg-primary">{props.title}</h5>
<p class="text-fg-secondary text-xs">
<h5 class="text-fg-primary font-medium">{props.title}</h5>
<p class="text-xs text-fg-secondary">
By
{' '}
<span class="text-fg-primary">Author TODO</span>
@ -42,16 +42,16 @@ function ModCard(props: ManagedPackage) {
</p>
</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 items-center gap-2">
<Download01Icon class="w-4 h-4" />
<Download01Icon class="h-4 w-4" />
{abbreviateNumber(props.downloads)}
</div>
<div class="flex flex-row items-center gap-2">
<HeartIcon class="w-4 h-4" />
<HeartIcon class="h-4 w-4" />
{abbreviateNumber(props.followers)}
</div>
</div>

View file

@ -36,7 +36,7 @@ function ContextMenu(props: ContextMenuProps) {
visible={props.visible}
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">
{props.children}
</div>
@ -46,7 +46,7 @@ function ContextMenu(props: ContextMenuProps) {
}
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 {
@ -59,7 +59,7 @@ ContextMenu.Row = function (props: ContextMenuRowProps) {
return (
<div
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.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'}`}
>
<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}
</div>

View file

@ -128,7 +128,7 @@ export type ModalProps = {
function Modal(props: ModalProps) {
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}
</div>
);
@ -154,7 +154,7 @@ Modal.Simple = function (props: ModalSimpleProps) {
<div class="flex flex-col">
{split.children}
</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}>
{button => (
<ModalButton props={button} />
@ -244,19 +244,19 @@ Modal.Delete = function (props: ModalDeleteProps) {
>
{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 class="text-danger uppercase w-82 line-height-normal">
<p class="w-82 text-danger line-height-normal uppercase">
Doing this will
{' '}
<span class="underline font-bold">delete</span>
<span class="font-bold underline">delete</span>
{' '}
your entire
{' '}
<br />
data
{' '}
<span class="underline font-bold">FOREVER</span>
<span class="font-bold underline">FOREVER</span>
.
</p>
</div>

View file

@ -29,11 +29,11 @@ function AccountComponent(props: AccountComponentProps) {
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'}`}
>
<div class="flex flex-row justify-start flex-1 gap-x-3">
<PlayerHead class="w-8 h-8 rounded-md" uuid={props.account!.id} />
<div class="flex flex-1 flex-row justify-start gap-x-3">
<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-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>}
</div>
</div>
@ -60,7 +60,7 @@ function AccountPopup(props: Popup.PopupProps) {
return (
<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">
<Show when={controller.defaultAccount() !== null || controller.defaultAccount() !== undefined}>
<AccountComponent
@ -76,7 +76,7 @@ function AccountPopup(props: Popup.PopupProps) {
)}
</For>
</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>

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>
<Match when={stage() !== ModalStage.LoggingIn}>
<p>

View file

@ -130,7 +130,7 @@ function VersionSelector(props: { setVersion: (version: string) => any }) {
});
return (
<div class="flex flex-row flex-1 gap-2">
<div class="flex flex-1 flex-row gap-2">
<SelectList
class="max-h-40 min-w-3/5"
onChange={setVersion}
@ -144,7 +144,7 @@ function VersionSelector(props: { setVersion: (version: string) => any }) {
</Show>
</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())}>
{name => (
<Checkbox
@ -169,7 +169,7 @@ function Option(props: OptionProps) {
return (
<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"> */}
{props.children}
{/* </div> */}

View file

@ -33,6 +33,8 @@ function ClusterProviderSelection(props: ClusterStepProps) {
const [selected, setSelected] = createSignal<number>();
const check = () => {
// TODO: Add more stages
// eslint-disable-next-line solid/reactivity -- It's fine
props.setCanGoForward(() => {
const isTrue = selected() !== undefined;
@ -73,7 +75,7 @@ function ProviderCard(props: ProviderCardProps) {
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' : ''}`}
>
<div class="[&>svg]:(w-8 h-8)">
<div class="[&>svg]:(h-8 w-8)">
{props.icon}
</div>
<span>{props.name}</span>

View file

@ -122,12 +122,12 @@ function NotificationOverlayComponent(props: NotificationComponentProps) {
</div>
<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
style={{
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>
</Show>
@ -139,31 +139,31 @@ function NotificationOverlayComponent(props: NotificationComponentProps) {
function NotificationPopupComponent(props: NotificationComponentProps) {
return (
<div class="p-2 flex flex-col gap-y-1">
<div class="min-h-10 grid place-items-center grid-cols-[24px_1fr_auto] gap-3">
<div class="flex flex-col gap-y-1 p-2">
<div class="grid grid-cols-[24px_1fr_auto] min-h-10 place-items-center gap-3">
{IconFromNotificationType(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="text-sm text-white/60">{props.message}</span>
</div>
<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">
<TimeAgo timestamp={props.created_at * 1000} />
</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>
</Show>
</div>
<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
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={{
width: `${Math.floor(props.progress! * 100)}%`,
}}

View file

@ -35,19 +35,19 @@ function NotificationPopup(props: Popup.PopupProps) {
return (
<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="flex flex-col justify-start items-stretch text-start gap-2" ref={inner}>
<p class="text-2lg px-2 pt-1">Notifications</p>
<div class="flex flex-col items-stretch justify-start gap-2 text-start" ref={inner}>
<p class="px-2 pt-1 text-2lg">Notifications</p>
<Switch>
<Match when={notifications().length > 0}>
<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()}>
{noti => (
<div class="flex flex-col w-full">
<div class="w-full flex flex-col">
<NotificationComponent {...noti} overlay={false} />
<span class="bg-gray-05 h-px w-full" />
<span class="h-px w-full bg-gray-05" />
</div>
)}
</For>
@ -56,11 +56,11 @@ function NotificationPopup(props: Popup.PopupProps) {
</Match>
<Match when={notifications().length === 0}>
<span class="px-2">You have no notifications</span>
<span class="bg-gray-05 h-px" />
<span class="h-px bg-gray-05" />
</Match>
</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 />}>
Clear Notifications
</Button>

View file

@ -101,17 +101,17 @@ function HomePage() {
// };
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()} />
<div class="flex flex-row justify-between items-center">
<div class="flex flex-row items-center justify-between">
<div>
<TextField iconLeft={<SearchMdIcon />} placeholder="Search for clusters..." />
</div>
<div class="flex flex-row gap-x-4">
<Button
buttonStyle="primary"
iconLeft={<PlusIcon class="!w-5 stroke-[2.2]" />}
iconLeft={<PlusIcon class="stroke-[2.2] !w-5" />}
children="New Cluster"
onClick={newCluster}
/>
@ -138,8 +138,8 @@ function HomePage() {
// </DragDropProvider>
)}
fallback={(
<div class="flex flex-col flex-1 gap-y-4 max-h-64 justify-center items-center">
<span class="text-lg font-bold uppercase text-fg-secondary">No clusters were found.</span>
<div class="max-h-64 flex flex-1 flex-col items-center justify-center gap-y-4">
<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>
</div>
)}
@ -217,9 +217,9 @@ function Banner(props: BannerProps) {
});
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
class="absolute rounded-xl w-full h-52 object-cover"
class="absolute h-52 w-full rounded-xl object-cover"
linearBlur={{
degrees: 270,
blur: 30,
@ -229,7 +229,7 @@ function Banner(props: BannerProps) {
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">
<h1>{cluster()?.meta.name || 'Create a cluster'}</h1>
<Show when={cluster() !== undefined}>
@ -249,7 +249,7 @@ function Banner(props: BannerProps) {
</p>
</Show>
</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">
<Show
when={cluster() !== undefined}
@ -299,22 +299,22 @@ function ClusterCard(props: Cluster) {
ref,
// 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
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)' }}
>
<ClusterCover
cluster={props}
class="object-cover h-full w-full"
class="h-full w-full object-cover"
/>
</div>
</div>
<div class="z-10 p-3 flex flex-row gap-x-3 items-center justify-between">
<div class="flex flex-col gap-1.5 overflow-hidden h-8">
<p class="h-4 font-medium text-ellipsis whitespace-nowrap">{props.meta.name}</p>
<div class="z-10 flex flex-row items-center justify-between gap-x-3 p-3">
<div class="h-8 flex flex-col gap-1.5 overflow-hidden">
<p class="h-4 text-ellipsis whitespace-nowrap font-medium">{props.meta.name}</p>
<p class="h-4 text-xs">
{upperFirst(props.meta.loader)}
{' '}
@ -331,7 +331,7 @@ function ClusterCard(props: Cluster) {
ClusterRoot.launch(navigate, props.uuid);
}}
>
<PlayIcon class="w-4! h-4!" />
<PlayIcon class="h-4! w-4!" />
</Button>
</div>
</div>
@ -354,7 +354,7 @@ function ClusterGroup(props: ClusterGroupProps) {
class="flex flex-col gap-y-4"
>
<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()}> */}
<For each={props.clusters}>{item => <ClusterCard {...item} />}</For>
{/* </SortableProvider> */}

View file

@ -65,9 +65,9 @@ function BrowserMain() {
});
return (
<div class="flex flex-col flex-1 h-full gap-2 relative">
<div class="flex flex-row justify-between sticky top-0 z-10 bg-primary">
<div class="flex flex-row gap-2 h-8">
<div class="relative h-full flex flex-1 flex-col gap-2">
<div class="sticky top-0 z-10 flex flex-row justify-between bg-primary">
<div class="h-8 flex flex-row gap-2">
<TextField
iconLeft={<SearchMdIcon />}
@ -86,7 +86,7 @@ function BrowserMain() {
</Dropdown.Minimal>
</div>
<div class="flex flex-row gap-2 justify-end">
<div class="flex flex-row justify-end gap-2">
<Button
iconLeft={<Download01Icon />}
children="From URL"
@ -119,13 +119,13 @@ interface ModsRowProps {
function ModsRow(props: ModsRowProps) {
return (
<div class="flex flex-col flex-1 gap-3">
<div class="flex flex-row flex-1 justify-between">
<div class="flex flex-1 flex-col gap-3">
<div class="flex flex-1 flex-row justify-between">
<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 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}>
{mod => <ModCard {...mod} />}
</For>

View file

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

View file

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

View file

@ -83,9 +83,9 @@ function ClusterMods() {
return (
<Sidebar.Page>
<div class="flex flex-row justify-between w-full">
<div class="w-full flex flex-row justify-between">
<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
buttonStyle="secondary"
iconLeft={sortingAtoZ() ? <ChevronUpIcon /> : <ChevronDownIcon />}
@ -108,7 +108,7 @@ function ClusterMods() {
</Match>
<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>
</Switch>
</ScrollableContainer>
@ -131,16 +131,16 @@ interface ModEntryProps {
function ModEntry(props: ModEntryProps) {
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>
<img src={props.thumbnail} alt={props.name} class="aspect-ratio-square h-10 rounded-lg" />
</div>
<div class="flex flex-col flex-1">
<div class="flex flex-row justify-between items-center">
<div class="flex flex-1 flex-col">
<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 gap-y-2">
<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}
{/* TODO: Add version checker */}
{/* <Show when={props.version.includes()}> */}
@ -151,7 +151,7 @@ function ModEntry(props: ModEntryProps) {
</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">
<Edit02Icon />
</Button>

View file

@ -263,26 +263,26 @@ function Banner(props: BannerProps) {
}
return (
<div class="flex flex-row bg-component-bg rounded-xl p-2.5 gap-x-2.5 h-37">
<div class="rounded-lg overflow-hidden border border-gray-10 relative h-full w-57 min-w-57 aspect-ratio-video">
<div class="h-37 flex flex-row gap-x-2.5 rounded-xl bg-component-bg p-2.5">
<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()}>
<div
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>
</Show>
<ClusterCover override={props.newCover()} cluster={props.cluster} class="h-full w-full object-cover" />
</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>
<Show
when={props.editMode()}
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
@ -296,7 +296,7 @@ function Banner(props: BannerProps) {
<div class="flex flex-1 flex-row">
<div
class="flex flex-1 flex-col justify-between items-start"
class="flex flex-1 flex-col items-start justify-between"
classList={{
'text-fg-primary-disabled': props.editMode(),
}}

View file

@ -37,12 +37,12 @@ function ClusterRoot(props: ParentProps) {
return (
<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">
<ClusterSidebar />
</div>
<div class="flex flex-col w-full h-full">
<div class="h-full w-full flex flex-col">
<AnimatedRoutes>
<ErrorBoundary>
{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>}
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()!}>
{screenshot => (
<ScreenshotEntry path={screenshot} cluster_path={cluster()?.path || ''} />
@ -38,7 +38,7 @@ function ClusterScreenshots() {
</Show>
</ScrollableContainer>
<div class="flex flex-row justify-end items-end mt-2">
<div class="mt-2 flex flex-row items-end justify-end">
<Button
buttonStyle="primary"
iconLeft={<LinkExternal01Icon />}
@ -65,7 +65,7 @@ function ScreenshotEntry(props: { path: string; cluster_path: string }) {
return (
<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}
>
<img src={pathSrc()} alt={props.path} class="aspect-ratio-video w-full rounded-lg" />

View file

@ -39,7 +39,7 @@ function ClusterWorlds() {
</Show>
</ScrollableContainer>
<div class="flex flex-row justify-end items-end mt-2">
<div class="mt-2 flex flex-row items-end justify-end">
<Button
buttonStyle="primary"
iconLeft={<LinkExternal01Icon />}
@ -83,18 +83,18 @@ function WorldEntry(props: { name: string; cluster_path: string }) {
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 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}
>
<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">
<h3>{props.name}</h3>
<p>Todo</p>
</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
buttonStyle="iconDanger"
children={<Trash01Icon />}

View file

@ -36,7 +36,7 @@ function SettingsRoutes() {
function SettingsRoot(props: ParentProps) {
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">
<Sidebar
base="/settings"
@ -61,7 +61,7 @@ function SettingsRoot(props: ParentProps) {
<Info />
</div>
<div class="flex flex-col w-full h-full">
<div class="h-full w-full flex flex-col">
<AnimatedRoutes>
<ErrorBoundary>
{props.children}
@ -76,10 +76,10 @@ function Info() {
const [copied, setCopied] = createSignal(false);
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'}>
<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) => {
const info = e.target.innerHTML;
writeText(info)

View file

@ -17,7 +17,7 @@ function SettingsChangelog() {
// TODO: Implement markdown support?
function UpdatePost() {
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>
<p class="">
{`

View file

@ -29,8 +29,8 @@ function SettingsAccounts() {
<ScrollableContainer>
<Switch>
<Match when={controller.accounts()?.length === 0}>
<div class="flex flex-col h-full gap-y-4 max-h-64 justify-center items-center">
<span class="text-lg font-bold uppercase text-fg-secondary">No accounts added.</span>
<div class="h-full max-h-64 flex flex-col items-center justify-center gap-y-4">
<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>
</div>
</Match>
@ -50,7 +50,7 @@ function SettingsAccounts() {
</Switch>
</ScrollableContainer>
<div class="flex flex-row justify-end items-end mt-2">
<div class="mt-2 flex flex-row items-end justify-end">
<Button
buttonStyle="primary"
iconLeft={<UserPlus02Icon />}
@ -79,9 +79,9 @@ function AccountRow(props: AccountRowProps) {
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'}`}
>
<div class="flex justify-center items-center h-12 w-12">
<div class="h-12 w-12 flex items-center justify-center">
<PlayerHead
class="w-12 h-12 rounded-md"
class="h-12 w-12 rounded-md"
uuid={props.uuid}
onError={() => setErrored(true)}
/>
@ -94,7 +94,7 @@ function AccountRow(props: AccountRowProps) {
<Tooltip
text="Could not fetch this account's game profile"
>
<InfoCircleIcon class="w-4 h-4" />
<InfoCircleIcon class="h-4 w-4" />
</Tooltip>
</Show>
</div>

View file

@ -89,7 +89,7 @@ function SettingsRow(props: SettingsRowProps & {
<BaseSettingsRow {...rest}>
<Show when={split.isGlobal() === false}>
<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()}
>
Reset
@ -130,7 +130,7 @@ export function GameSettings(props: {
isGlobal={props.resolution.isGlobal}
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
class="text-center"
value={props.resolution.get()[0]}
@ -138,7 +138,7 @@ export function GameSettings(props: {
props.resolution.set([Number.parseInt(value), props.resolution.get()[1]]);
}}
/>
<XIcon class="w-4 h-4" />
<XIcon class="h-4 w-4" />
<TextField.Number
class="text-center"
value={props.resolution.get()[1]}
@ -156,7 +156,7 @@ export function GameSettings(props: {
isGlobal={props.memory.isGlobal}
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">
<span>Min:</span>
<TextField.Number

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -19,12 +19,12 @@
"int:prepare": "pnpm tsx prepare.ts"
},
"dependencies": {
"@flowr/utils": "^3.10.5",
"@flowr/utils": "^3.11.3",
"execa": "^9.3.0",
"mustache": "^4.2.0",
"pathe": "^1.1.2",
"semver": "^7.6.3",
"undici": "^6.19.5"
"undici": "^6.19.7"
},
"devDependencies": {
"@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]
channel = "1.80"
channel = "1.80.1"
profile = "minimal"
components = [
"cargo",

1
uno.config.ts Normal file
View file

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