From ddbd08bc8c754fc8ccb7784ae2fdef50176bebc0 Mon Sep 17 00:00:00 2001 From: "Adrian O.V" <83074853+CodexAdrian@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:07:35 -0400 Subject: [PATCH] Onboarding changes (#347) * modal * Finish tutorial phase * Finish onboarding, tutorial, and url front end handlng * Run lint * Update pnpm-lock.yaml * Fixed bad refactor * Fixed #341 * lint * Fixes #315 * Update ModInstallModal.vue * Initial onboarding changes * importing card * Run lint * Update ImportingCard.vue * Fixed home page errors * Fixes * Linter * Login page * Tweaks * Update ImportingCard.vue * Onboarding finishing changes * Linter * update to new auth * bump version * backend for linking --------- Co-authored-by: Jai A Co-authored-by: Geometrically <18202329+Geometrically@users.noreply.github.com> --- Cargo.lock | 6 +- theseus/Cargo.toml | 2 +- theseus/src/api/mod.rs | 7 +- theseus/src/launcher/auth.rs | 19 +- theseus/src/state/settings.rs | 4 +- theseus_cli/Cargo.toml | 2 +- theseus_gui/package.json | 3 +- theseus_gui/pnpm-lock.yaml | 9 +- theseus_gui/src-tauri/Cargo.toml | 2 +- theseus_gui/src-tauri/src/api/profile.rs | 2 + theseus_gui/src-tauri/tauri.conf.json | 2 +- theseus_gui/src/App.vue | 57 +- .../src/assets/external/atlauncher.svg | 1 + .../src/assets/external/gdlauncher.png | Bin 0 -> 26843 bytes theseus_gui/src/assets/external/github.svg | 5 +- theseus_gui/src/assets/external/gitlab.svg | 10 + theseus_gui/src/assets/external/google.svg | 21 + theseus_gui/src/assets/external/index.js | 8 + theseus_gui/src/assets/external/microsoft.svg | 6 + theseus_gui/src/assets/external/multimc.webp | Bin 0 -> 1146 bytes theseus_gui/src/assets/external/prism.svg | 80 +++ theseus_gui/src/assets/external/steam.svg | 14 + theseus_gui/src/assets/profile_icon.png | Bin 0 -> 9396694 bytes .../src/assets/stylesheets/global.scss | 16 +- theseus_gui/src/assets/video.mp4 | Bin 0 -> 3538527 bytes theseus_gui/src/components/RowDisplay.vue | 4 +- .../src/components/ui/AccountsCard.vue | 6 +- theseus_gui/src/components/ui/ExportModal.vue | 1 + theseus_gui/src/components/ui/Instance.vue | 4 +- .../components/ui/InstanceCreationModal.vue | 239 +++++++- ...ceInstallModal.vue => ModInstallModal.vue} | 24 +- theseus_gui/src/components/ui/SearchCard.vue | 21 +- .../src/components/ui/URLConfirmModal.vue | 136 +++++ .../ui/tutorial/FakeAccountsCard.vue | 183 +++++++ .../src/components/ui/tutorial/FakeAppBar.vue | 250 +++++++++ .../ui/tutorial/FakeGridDisplay.vue | 219 ++++++++ .../components/ui/tutorial/FakeRowDisplay.vue | 376 +++++++++++++ .../src/components/ui/tutorial/FakeSearch.vue | 496 +++++++++++++++++ .../components/ui/tutorial/FakeSettings.vue | 247 +++++++++ .../components/ui/tutorial/GalleryImage.vue | 197 +++++++ .../components/ui/tutorial/ImportingCard.vue | 268 +++++++++ .../src/components/ui/tutorial/LoginCard.vue | 219 ++++++++ .../ui/tutorial/ModrinthLoginScreen.vue | 182 +++++++ .../{ => ui/tutorial}/OnboardingModal.vue | 19 +- .../ui/tutorial/OnboardingScreen.vue | 513 ++++++++++++++++++ .../ui/tutorial/PreImportScreen.vue | 184 +++++++ .../components/ui/tutorial/StickyTitleBar.vue | 80 +++ .../components/ui/tutorial/TutorialTip.vue | 72 +++ theseus_gui/src/pages/Browse.vue | 4 +- theseus_gui/src/pages/instance/Mods.vue | 1 + theseus_gui/src/pages/instance/Options.vue | 1 + theseus_gui/src/pages/project/Index.vue | 4 +- 52 files changed, 4151 insertions(+), 75 deletions(-) create mode 100644 theseus_gui/src/assets/external/atlauncher.svg create mode 100644 theseus_gui/src/assets/external/gdlauncher.png create mode 100644 theseus_gui/src/assets/external/gitlab.svg create mode 100644 theseus_gui/src/assets/external/google.svg create mode 100644 theseus_gui/src/assets/external/microsoft.svg create mode 100644 theseus_gui/src/assets/external/multimc.webp create mode 100644 theseus_gui/src/assets/external/prism.svg create mode 100644 theseus_gui/src/assets/external/steam.svg create mode 100644 theseus_gui/src/assets/profile_icon.png create mode 100644 theseus_gui/src/assets/video.mp4 rename theseus_gui/src/components/ui/{InstanceInstallModal.vue => ModInstallModal.vue} (93%) create mode 100644 theseus_gui/src/components/ui/URLConfirmModal.vue create mode 100644 theseus_gui/src/components/ui/tutorial/FakeAccountsCard.vue create mode 100644 theseus_gui/src/components/ui/tutorial/FakeAppBar.vue create mode 100644 theseus_gui/src/components/ui/tutorial/FakeGridDisplay.vue create mode 100644 theseus_gui/src/components/ui/tutorial/FakeRowDisplay.vue create mode 100644 theseus_gui/src/components/ui/tutorial/FakeSearch.vue create mode 100644 theseus_gui/src/components/ui/tutorial/FakeSettings.vue create mode 100644 theseus_gui/src/components/ui/tutorial/GalleryImage.vue create mode 100644 theseus_gui/src/components/ui/tutorial/ImportingCard.vue create mode 100644 theseus_gui/src/components/ui/tutorial/LoginCard.vue create mode 100644 theseus_gui/src/components/ui/tutorial/ModrinthLoginScreen.vue rename theseus_gui/src/components/{ => ui/tutorial}/OnboardingModal.vue (98%) create mode 100644 theseus_gui/src/components/ui/tutorial/OnboardingScreen.vue create mode 100644 theseus_gui/src/components/ui/tutorial/PreImportScreen.vue create mode 100644 theseus_gui/src/components/ui/tutorial/StickyTitleBar.vue create mode 100644 theseus_gui/src/components/ui/tutorial/TutorialTip.vue diff --git a/Cargo.lock b/Cargo.lock index d649b21ae..1c0adccd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4609,7 +4609,7 @@ dependencies = [ [[package]] name = "theseus" -version = "0.3.0" +version = "0.3.1" dependencies = [ "async-recursion", "async-tungstenite", @@ -4654,7 +4654,7 @@ dependencies = [ [[package]] name = "theseus_cli" -version = "0.3.0" +version = "0.3.1" dependencies = [ "argh", "color-eyre", @@ -4681,7 +4681,7 @@ dependencies = [ [[package]] name = "theseus_gui" -version = "0.3.0" +version = "0.3.1" dependencies = [ "chrono", "cocoa", diff --git a/theseus/Cargo.toml b/theseus/Cargo.toml index cd1a8019d..429db24b7 100644 --- a/theseus/Cargo.toml +++ b/theseus/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "theseus" -version = "0.3.0" +version = "0.3.1" authors = ["Jai A "] edition = "2018" diff --git a/theseus/src/api/mod.rs b/theseus/src/api/mod.rs index 4bc94b5e1..9b585f945 100644 --- a/theseus/src/api/mod.rs +++ b/theseus/src/api/mod.rs @@ -13,9 +13,10 @@ pub mod tags; pub mod data { pub use crate::state::{ - DirectoryInfo, Hooks, JavaSettings, MemorySettings, ModLoader, - ModrinthProject, ModrinthTeamMember, ModrinthUser, ModrinthVersion, - ProfileMetadata, ProjectMetadata, Settings, Theme, WindowSize, + DirectoryInfo, Hooks, JavaSettings, LinkedData, MemorySettings, + ModLoader, ModrinthProject, ModrinthTeamMember, ModrinthUser, + ModrinthVersion, ProfileMetadata, ProjectMetadata, Settings, Theme, + WindowSize, }; } diff --git a/theseus/src/launcher/auth.rs b/theseus/src/launcher/auth.rs index 4fb1f71be..b91889289 100644 --- a/theseus/src/launcher/auth.rs +++ b/theseus/src/launcher/auth.rs @@ -9,8 +9,9 @@ use serde::{Deserialize, Serialize}; use url::Url; lazy_static! { - static ref HYDRA_URL: Url = Url::parse("https://hydra.modrinth.com") - .expect("Hydra URL parse failed"); + static ref HYDRA_URL: Url = + Url::parse("https://staging-api.modrinth.com/v2/auth/minecraft/") + .expect("Hydra URL parse failed"); } // Socket messages @@ -39,6 +40,7 @@ struct TokenJSON { token: String, refresh_token: String, expires_after: u32, + flow: String, } #[derive(Deserialize)] @@ -65,11 +67,10 @@ pub struct HydraAuthFlow { impl HydraAuthFlow { pub async fn new() -> crate::Result { - let sock_url = wrap_ref_builder!( - it = HYDRA_URL.clone() => - { it.set_scheme("wss").ok() } - ); - let (socket, _) = ws::tokio::connect_async(sock_url.clone()).await?; + let (socket, _) = ws::tokio::connect_async( + "wss://staging-api.modrinth.com/v2/auth/minecraft/ws", + ) + .await?; Ok(Self { socket }) } @@ -87,7 +88,7 @@ impl HydraAuthFlow { .into_data(); let code = ErrorJSON::unwrap::(&code_resp)?; Ok(wrap_ref_builder!( - it = HYDRA_URL.join("login")? => + it = HYDRA_URL.join("init")? => { it.query_pairs_mut().append_pair("id", &code.login_code); } )) } @@ -133,7 +134,7 @@ pub async fn refresh_credentials( ) -> crate::Result<()> { let resp = fetch_json::( Method::POST, - HYDRA_URL.join("/refresh")?.as_str(), + "https://staging-api.modrinth.com/v2/auth/minecraft/refresh", None, Some(serde_json::json!({ "refresh_token": credentials.refresh_token })), semaphore, diff --git a/theseus/src/state/settings.rs b/theseus/src/state/settings.rs index 2886901b0..ab55b3aac 100644 --- a/theseus/src/state/settings.rs +++ b/theseus/src/state/settings.rs @@ -41,7 +41,7 @@ pub struct Settings { #[serde(default)] pub advanced_rendering: bool, #[serde(default)] - pub onboarded: bool, + pub onboarded_new: bool, #[serde(default = "DirectoryInfo::get_initial_settings_dir")] pub loaded_config_dir: Option, } @@ -82,7 +82,7 @@ impl Settings { developer_mode: false, opt_out_analytics: false, advanced_rendering: true, - onboarded: false, + onboarded_new: false, // By default, the config directory is the same as the settings directory loaded_config_dir: DirectoryInfo::get_initial_settings_dir(), diff --git a/theseus_cli/Cargo.toml b/theseus_cli/Cargo.toml index 94f6ef654..622e84012 100644 --- a/theseus_cli/Cargo.toml +++ b/theseus_cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "theseus_cli" -version = "0.3.0" +version = "0.3.1" authors = ["Jai A "] edition = "2018" diff --git a/theseus_gui/package.json b/theseus_gui/package.json index 6797f2b76..9f9f6ece2 100644 --- a/theseus_gui/package.json +++ b/theseus_gui/package.json @@ -1,7 +1,7 @@ { "name": "theseus_gui", "private": true, - "version": "0.2.1", + "version": "0.3.1", "type": "module", "scripts": { "dev": "vite", @@ -20,6 +20,7 @@ "ofetch": "^1.0.1", "omorphia": "^0.4.33", "pinia": "^2.1.3", + "qrcode.vue": "^3.4.0", "tauri-plugin-window-state-api": "github:tauri-apps/tauri-plugin-window-state#v1", "vite-svg-loader": "^4.0.0", "vue": "^3.3.4", diff --git a/theseus_gui/pnpm-lock.yaml b/theseus_gui/pnpm-lock.yaml index 1051f77d7..9198fc0ba 100644 --- a/theseus_gui/pnpm-lock.yaml +++ b/theseus_gui/pnpm-lock.yaml @@ -1,8 +1,4 @@ -lockfileVersion: '6.1' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false +lockfileVersion: '6.0' dependencies: '@tauri-apps/api': @@ -26,6 +22,9 @@ dependencies: pinia: specifier: ^2.1.3 version: 2.1.3(vue@3.3.4) + qrcode.vue: + specifier: ^3.4.0 + version: 3.4.0(vue@3.3.4) tauri-plugin-window-state-api: specifier: github:tauri-apps/tauri-plugin-window-state#v1 version: github.com/tauri-apps/tauri-plugin-window-state/347c792535d2623fc21f66590d06f4c8dadd85ba diff --git a/theseus_gui/src-tauri/Cargo.toml b/theseus_gui/src-tauri/Cargo.toml index 6b5acb09f..2fc2b24ec 100644 --- a/theseus_gui/src-tauri/Cargo.toml +++ b/theseus_gui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "theseus_gui" -version = "0.3.0" +version = "0.3.1" description = "A Tauri App" authors = ["you"] license = "" diff --git a/theseus_gui/src-tauri/src/api/profile.rs b/theseus_gui/src-tauri/src/api/profile.rs index da86f7629..6c5776802 100644 --- a/theseus_gui/src-tauri/src/api/profile.rs +++ b/theseus_gui/src-tauri/src/api/profile.rs @@ -294,6 +294,7 @@ pub struct EditProfileMetadata { pub game_version: Option, pub loader: Option, pub loader_version: Option, + pub linked_data: Option, pub groups: Option>, } @@ -316,6 +317,7 @@ pub async fn profile_edit( prof.metadata.loader = loader; } prof.metadata.loader_version = metadata.loader_version; + prof.metadata.linked_data = metadata.linked_data; if let Some(groups) = metadata.groups { prof.metadata.groups = groups; diff --git a/theseus_gui/src-tauri/tauri.conf.json b/theseus_gui/src-tauri/tauri.conf.json index 302f9ed5b..06f5bc6ef 100644 --- a/theseus_gui/src-tauri/tauri.conf.json +++ b/theseus_gui/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Modrinth App", - "version": "0.3.0" + "version": "0.3.1" }, "tauri": { "allowlist": { diff --git a/theseus_gui/src/App.vue b/theseus_gui/src/App.vue index e7999348c..5a0d210c8 100644 --- a/theseus_gui/src/App.vue +++ b/theseus_gui/src/App.vue @@ -20,30 +20,39 @@ import RunningAppBar from '@/components/ui/RunningAppBar.vue' import SplashScreen from '@/components/ui/SplashScreen.vue' import ModrinthLoadingIndicator from '@/components/modrinth-loading-indicator' import { useNotifications } from '@/store/notifications.js' -import { warning_listener } from '@/helpers/events.js' +import { command_listener, warning_listener } from '@/helpers/events.js' import { MinimizeIcon, MaximizeIcon } from '@/assets/icons' import { type } from '@tauri-apps/api/os' import { appWindow } from '@tauri-apps/api/window' import { isDev } from '@/helpers/utils.js' import mixpanel from 'mixpanel-browser' import { saveWindowState, StateFlags } from 'tauri-plugin-window-state-api' -import OnboardingModal from '@/components/OnboardingModal.vue' import { getVersion } from '@tauri-apps/api/app' import { window as TauriWindow } from '@tauri-apps/api' import { TauriEvent } from '@tauri-apps/api/event' import { await_sync, check_safe_loading_bars_complete } from './helpers/state' import { confirm } from '@tauri-apps/api/dialog' +import URLConfirmModal from '@/components/ui/URLConfirmModal.vue' +// import OnboardingScreen from '@/components/ui/tutorial/OnboardingScreen.vue' +import StickyTitleBar from '@/components/ui/tutorial/StickyTitleBar.vue' +import OnboardingScreen from '@/components/ui/tutorial/OnboardingScreen.vue' const themeStore = useTheming() - +const urlModal = ref(null) const isLoading = ref(true) +const videoPlaying = ref(true) +const showOnboarding = ref(false) + +const onboardingVideo = ref() + defineExpose({ initialize: async () => { isLoading.value = false - const { theme, opt_out_analytics, collapsed_navigation, advanced_rendering, onboarded } = + const { theme, opt_out_analytics, collapsed_navigation, advanced_rendering, onboarded_new } = await get() const dev = await isDev() const version = await getVersion() + showOnboarding.value = !onboarded_new themeStore.setThemeState(theme) themeStore.collapsedNavigation = collapsed_navigation @@ -53,7 +62,7 @@ defineExpose({ if (opt_out_analytics) { mixpanel.opt_out_tracking() } - mixpanel.track('Launched', { version, dev, onboarded }) + mixpanel.track('Launched', { version, dev, onboarded_new }) if (!dev) document.addEventListener('contextmenu', (event) => event.preventDefault()) @@ -70,6 +79,10 @@ defineExpose({ type: 'warn', }) ) + + if (showOnboarding.value) { + onboardingVideo.value.play() + } }, }) @@ -145,14 +158,26 @@ document.querySelector('body').addEventListener('click', function (e) { }) const accounts = ref(null) + +command_listener((e) => { + console.log(e) + urlModal.value.show(e) +}) diff --git a/theseus_gui/src/components/ui/Instance.vue b/theseus_gui/src/components/ui/Instance.vue index 3a13032ee..5a27bcdee 100644 --- a/theseus_gui/src/components/ui/Instance.vue +++ b/theseus_gui/src/components/ui/Instance.vue @@ -15,7 +15,7 @@ import { process_listener } from '@/helpers/events' import { useFetch } from '@/helpers/fetch.js' import { handleError } from '@/store/state.js' import { showProfileInFolder } from '@/helpers/utils.js' -import InstanceInstallModal from '@/components/ui/InstanceInstallModal.vue' +import ModInstallModal from '@/components/ui/ModInstallModal.vue' import mixpanel from 'mixpanel-browser' const props = defineProps({ @@ -227,7 +227,7 @@ onUnmounted(() => unlisten())
- + diff --git a/theseus_gui/src/components/ui/InstanceCreationModal.vue b/theseus_gui/src/components/ui/InstanceCreationModal.vue index 9f99cc1c1..183617c50 100644 --- a/theseus_gui/src/components/ui/InstanceCreationModal.vue +++ b/theseus_gui/src/components/ui/InstanceCreationModal.vue @@ -1,8 +1,9 @@ @@ -102,6 +199,8 @@ import { Checkbox, FolderOpenIcon, InfoIcon, + FolderSearchIcon, + UpdatedIcon, } from 'omorphia' import { computed, ref, shallowRef } from 'vue' import { get_loaders } from '@/helpers/tags' @@ -120,6 +219,7 @@ import mixpanel from 'mixpanel-browser' import { useTheming } from '@/store/state.js' import { listen } from '@tauri-apps/api/event' import { install_from_file } from '@/helpers/pack.js' +import { get_importable_instances, import_instance } from '@/helpers/import.js' const themeStore = useTheming() @@ -284,6 +384,68 @@ listen('tauri://file-drop', async (event) => { }) } }) + +const profiles = ref( + new Map([ + ['MultiMC', []], + ['GDLauncher', []], + ['ATLauncher', []], + ['Curseforge', []], + ['PrismLauncher', []], + ]) +) + +const loading = ref(false) + +const selectedProfileType = ref('MultiMC') +const profileOptions = ref([ + { name: 'MultiMC', path: '' }, + { name: 'GDLauncher', path: '' }, + { name: 'ATLauncher', path: '' }, + { name: 'Curseforge', path: '' }, + { name: 'PrismLauncher', path: '' }, +]) + +const selectLauncherPath = async () => { + selectedProfileType.value.path = await open({ multiple: false, directory: true }) + + if (selectedProfileType.value.path) { + await reload() + } +} + +const reload = async () => { + const instances = await get_importable_instances( + selectedProfileType.value.name, + selectedProfileType.value.path + ).catch(handleError) + profiles.value.set( + selectedProfileType.value.name, + instances.map((name) => ({ name, selected: false })) + ) +} + +const setPath = () => { + profileOptions.value.find((profile) => profile.name === selectedProfileType.value.name).path = + selectedProfileType.value.path +} + +const next = async () => { + loading.value = true + for (const launcher of Array.from(profiles.value.entries()).map(([launcher, profiles]) => ({ + launcher, + path: profileOptions.value.find((option) => option.name === launcher).path, + profiles, + }))) { + for (const profile of launcher.profiles.filter((profile) => profile.selected)) { + await import_instance(launcher.launcher, launcher.path, profile.name) + .catch(handleError) + .then(() => console.log(`Successfully Imported ${profile.name} from ${launcher.launcher}`)) + profile.selected = false + } + } + loading.value = false +} diff --git a/theseus_gui/src/components/ui/InstanceInstallModal.vue b/theseus_gui/src/components/ui/ModInstallModal.vue similarity index 93% rename from theseus_gui/src/components/ui/InstanceInstallModal.vue rename to theseus_gui/src/components/ui/ModInstallModal.vue index 1534d05df..3db24d713 100644 --- a/theseus_gui/src/components/ui/InstanceInstallModal.vue +++ b/theseus_gui/src/components/ui/ModInstallModal.vue @@ -24,9 +24,11 @@ import { installVersionDependencies } from '@/helpers/utils' import { handleError } from '@/store/notifications.js' import mixpanel from 'mixpanel-browser' import { useTheming } from '@/store/theme.js' +import { useRouter } from 'vue-router' import { tauri } from '@tauri-apps/api' const themeStore = useTheming() +const router = useRouter() const versions = ref([]) const project = ref('') @@ -63,13 +65,23 @@ const profiles = ref([]) async function install(instance) { instance.installing = true + console.log(versions.value) const version = versions.value.find((v) => { return ( v.game_versions.includes(instance.metadata.game_version) && - (v.loaders.includes(instance.metadata.loader) || v.loaders.includes('minecraft')) + (v.loaders.includes(instance.metadata.loader) || + v.loaders.includes('minecraft') || + v.loaders.includes('iris') || + v.loaders.includes('optifine')) ) }) + if (!version) { + instance.installing = false + handleError('No compatible version found') + return + } + await installMod(instance.path, version.id).catch(handleError) await installVersionDependencies(instance, version) @@ -153,11 +165,11 @@ const createInstance = async () => { creatingInstance.value = true const loader = - versions.value[0].loaders[0] !== 'forge' || - versions.value[0].loaders[0] !== 'fabric' || + versions.value[0].loaders[0] !== 'forge' && + versions.value[0].loaders[0] !== 'fabric' && versions.value[0].loaders[0] !== 'quilt' - ? versions.value[0].loaders[0] - : 'vanilla' + ? 'vanilla' + : versions.value[0].loaders[0] const id = await create( name.value, @@ -169,6 +181,8 @@ const createInstance = async () => { await installMod(id, versions.value[0].id).catch(handleError) + await router.push(`/instance/${encodeURIComponent(id)}/`) + const instance = await get(id, true) await installVersionDependencies(instance, versions.value) diff --git a/theseus_gui/src/components/ui/SearchCard.vue b/theseus_gui/src/components/ui/SearchCard.vue index 3a95c3760..029258415 100644 --- a/theseus_gui/src/components/ui/SearchCard.vue +++ b/theseus_gui/src/components/ui/SearchCard.vue @@ -2,10 +2,13 @@
@@ -14,7 +17,7 @@

{{ project.title }}

- by {{ project.author }} + by {{ project.author }}
{{ project.description }} @@ -42,14 +45,14 @@
- {{ formatNumber(project.follows) }} + {{ formatNumber(project.follows ?? project.followers) }}
- {{ formatCategory(dayjs(project.date_modified).fromNow()) }} + {{ formatCategory(dayjs(project.date_modified ?? project.updated).fromNow()) }}
-
+
- + diff --git a/theseus_gui/src/pages/instance/Mods.vue b/theseus_gui/src/pages/instance/Mods.vue index 13c133f66..0e67f8a9d 100644 --- a/theseus_gui/src/pages/instance/Mods.vue +++ b/theseus_gui/src/pages/instance/Mods.vue @@ -993,6 +993,7 @@ listen('tauri://file-drop', async (event) => { .select-checkbox { button.checkbox { border: none; + margin: 0; } } diff --git a/theseus_gui/src/pages/instance/Options.vue b/theseus_gui/src/pages/instance/Options.vue index ee61d4f4e..fc1b25dbc 100644 --- a/theseus_gui/src/pages/instance/Options.vue +++ b/theseus_gui/src/pages/instance/Options.vue @@ -478,6 +478,7 @@ watch( name: title.value.trim().substring(0, 16) ?? 'Instance', groups: groups.value.map((x) => x.trim().substring(0, 32)).filter((x) => x.length > 0), loader_version: props.instance.metadata.loader_version, + linked_data: props.instance.metadata.linked_data, }, java: {}, } diff --git a/theseus_gui/src/pages/project/Index.vue b/theseus_gui/src/pages/project/Index.vue index 82029a8e0..156420869 100644 --- a/theseus_gui/src/pages/project/Index.vue +++ b/theseus_gui/src/pages/project/Index.vue @@ -213,7 +213,7 @@
- + @@ -269,7 +269,7 @@ import { useRoute } from 'vue-router' import { ref, shallowRef, watch } from 'vue' import { installVersionDependencies } from '@/helpers/utils' import InstallConfirmModal from '@/components/ui/InstallConfirmModal.vue' -import InstanceInstallModal from '@/components/ui/InstanceInstallModal.vue' +import ModInstallModal from '@/components/ui/ModInstallModal.vue' import { useBreadcrumbs } from '@/store/breadcrumbs' import IncompatibilityWarningModal from '@/components/ui/IncompatibilityWarningModal.vue' import { useFetch } from '@/helpers/fetch.js'