From 75998757e39caf4b851665fc53752a7d53a3580f Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Fri, 2 Oct 2026 15:47:06 +0100 Subject: [PATCH 1/3] feat: sandboxing settings tab --- .../instances/settings-modal/index.vue | 11 + .../settings-modal/sandbox-settings.vue | 7 + .../settings/app-settings-modal/index.vue | 11 + .../instance-defaults/sandbox-settings.vue | 270 ++++++++++++++++++ packages/ui/src/components/base/index.ts | 1 + 5 files changed, 300 insertions(+) create mode 100644 apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue create mode 100644 apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue diff --git a/apps/app-frontend/src/features/instances/settings-modal/index.vue b/apps/app-frontend/src/features/instances/settings-modal/index.vue index e1d3d86d760..0ce229db9af 100644 --- a/apps/app-frontend/src/features/instances/settings-modal/index.vue +++ b/apps/app-frontend/src/features/instances/settings-modal/index.vue @@ -6,6 +6,7 @@ import { CoffeeIcon, InfoIcon, Settings2Icon, + ShieldIcon, UsersIcon, WindowIcon, WrenchIcon, @@ -34,6 +35,7 @@ import HooksSettings from './hooks-settings.vue' import InstallationSettings from './installation-settings.vue' import { provideInstanceSettings } from './instance-settings-context.ts' import JavaSettings from './java-settings.vue' +import SandboxSettings from './sandbox-settings.vue' import SharingSettings from './sharing-settings.vue' import SyncedOptionsSettings from './synced-options-settings.vue' import WindowSettings from './window-settings.vue' @@ -132,6 +134,15 @@ const tabs = computed(() => [ content: SharingSettings, shown: props.instance.shared_instance?.role === 'owner' && !props.instance.quarantined, }, + { + name: defineMessage({ + id: 'instance.settings.tabs.sandbox', + defaultMessage: 'Sandboxing', + }), + icon: ShieldIcon, + category: tabCategories.game, + content: SandboxSettings, + }, { name: defineMessage({ id: 'instance.settings.tabs.java.label', diff --git a/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue b/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue new file mode 100644 index 00000000000..90c4a22f073 --- /dev/null +++ b/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue @@ -0,0 +1,7 @@ + + + diff --git a/apps/app-frontend/src/features/settings/app-settings-modal/index.vue b/apps/app-frontend/src/features/settings/app-settings-modal/index.vue index 76249d97009..d17890115d8 100644 --- a/apps/app-frontend/src/features/settings/app-settings-modal/index.vue +++ b/apps/app-frontend/src/features/settings/app-settings-modal/index.vue @@ -11,6 +11,7 @@ import { PaintbrushIcon, RefreshCwIcon, Settings2Icon, + ShieldIcon, ToggleRightIcon, UserIcon, WindowIcon, @@ -43,6 +44,7 @@ import FeaturesSettings from '@/features/settings/display/features-settings.vue' import LanguageSettings from '@/features/settings/display/language-settings.vue' import JavaAndMemorySettings from '@/features/settings/instance-defaults/java-and-memory-settings/index.vue' import LaunchHooksSettings from '@/features/settings/instance-defaults/launch-hooks-settings.vue' +import SandboxSettings from '@/features/settings/instance-defaults/sandbox-settings.vue' import WindowSettings from '@/features/settings/instance-defaults/window-settings.vue' import type { InstanceDefaultsTab } from '@/features/settings/settings-actions' import SyncingSettings from '@/features/settings/syncing/syncing-settings.vue' @@ -152,6 +154,15 @@ const tabs = [ icon: EyeOffIcon, content: PrivacySettings, }, + { + name: defineMessage({ + id: 'app.settings.tabs.sandbox', + defaultMessage: 'Sandboxing', + }), + category: tabCategories.instanceDefaults, + icon: ShieldIcon, + content: SandboxSettings, + }, { name: defineMessage({ id: 'app.settings.tabs.java-and-memory', diff --git a/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue b/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue new file mode 100644 index 00000000000..c6c3506317a --- /dev/null +++ b/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue @@ -0,0 +1,270 @@ + + + diff --git a/packages/ui/src/components/base/index.ts b/packages/ui/src/components/base/index.ts index 99e2e1bdc32..c61212afea4 100644 --- a/packages/ui/src/components/base/index.ts +++ b/packages/ui/src/components/base/index.ts @@ -86,6 +86,7 @@ export { Textarea, } from './inputs' export { default as IntlFormatted } from './IntlFormatted.vue' +export { default as LargeRadioButton } from './LargeRadioButton.vue' export { default as LoadingBar } from './LoadingBar.vue' export { default as LoadingIndicator } from './LoadingIndicator.vue' export { default as ManySelect } from './ManySelect.vue' From 55f4eb846f9eb5bce296327f238adfd4af6271c4 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Fri, 2 Oct 2026 17:05:44 +0100 Subject: [PATCH 2/3] refactor: settings overhaul --- .../settings-modal/sandbox-settings.vue | 15 +- .../settings/app-settings-modal/index.vue | 1 + .../instance-defaults/sandbox-settings.vue | 215 ++++++++++-------- .../src/features/settings/settings-actions.ts | 2 +- 4 files changed, 131 insertions(+), 102 deletions(-) diff --git a/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue b/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue index 90c4a22f073..5ce40d98f2b 100644 --- a/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue +++ b/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue @@ -1,7 +1,20 @@ diff --git a/apps/app-frontend/src/features/settings/app-settings-modal/index.vue b/apps/app-frontend/src/features/settings/app-settings-modal/index.vue index d17890115d8..4b4da509d37 100644 --- a/apps/app-frontend/src/features/settings/app-settings-modal/index.vue +++ b/apps/app-frontend/src/features/settings/app-settings-modal/index.vue @@ -306,6 +306,7 @@ function showSyncedOptions(): void { function showInstanceDefaults(tab: InstanceDefaultsTab): void { const content = { + sandbox: SandboxSettings, java: JavaAndMemorySettings, window: WindowSettings, hooks: LaunchHooksSettings, diff --git a/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue b/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue index c6c3506317a..3ce3afd7a75 100644 --- a/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue +++ b/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue @@ -27,6 +27,10 @@ const canAddFolder = computed(() => { }) const messages = defineMessages({ + customDescription: { + id: 'app.settings.sandbox.custom-description', + defaultMessage: 'Override app sandbox settings for this instance.', + }, custom: { id: 'app.settings.sandbox.custom', defaultMessage: 'Custom sandbox settings', @@ -149,120 +153,131 @@ function selectAdjacentMode(event: KeyboardEvent, index: number) {