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..5ce40d98f2b --- /dev/null +++ b/apps/app-frontend/src/features/instances/settings-modal/sandbox-settings.vue @@ -0,0 +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 76249d97009..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 @@ -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', @@ -295,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 new file mode 100644 index 00000000000..9c9ec186fa6 --- /dev/null +++ b/apps/app-frontend/src/features/settings/instance-defaults/sandbox-settings.vue @@ -0,0 +1,314 @@ + + + diff --git a/apps/app-frontend/src/features/settings/settings-actions.ts b/apps/app-frontend/src/features/settings/settings-actions.ts index 615cdf702bf..e7bfa5158e8 100644 --- a/apps/app-frontend/src/features/settings/settings-actions.ts +++ b/apps/app-frontend/src/features/settings/settings-actions.ts @@ -1,6 +1,6 @@ import { createContext } from '@modrinth/ui' -export type InstanceDefaultsTab = 'java' | 'window' | 'hooks' +export type InstanceDefaultsTab = 'sandbox' | 'java' | 'window' | 'hooks' /** * Opens the app settings modal from anywhere in the app, optionally on a specific tab. 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'