diff --git a/apps/app-frontend/src/components/ui/onboarding/OnboardingDialogue.vue b/apps/app-frontend/src/components/ui/onboarding/OnboardingDialogue.vue
index f7777bb..ad78802 100644
--- a/apps/app-frontend/src/components/ui/onboarding/OnboardingDialogue.vue
+++ b/apps/app-frontend/src/components/ui/onboarding/OnboardingDialogue.vue
@@ -35,7 +35,7 @@ const progressWidth = computed(() => `${Math.min(100, (props.current / props.tot
{{ formatMessage(step.title) }}
-
diff --git a/apps/app-frontend/src/components/ui/onboarding/onboardingConfig.ts b/apps/app-frontend/src/components/ui/onboarding/onboardingConfig.ts
index de0ae0e..78f40d8 100644
--- a/apps/app-frontend/src/components/ui/onboarding/onboardingConfig.ts
+++ b/apps/app-frontend/src/components/ui/onboarding/onboardingConfig.ts
@@ -252,6 +252,42 @@ export const onboardingMessages = defineMessages({
id: 'app.onboarding.instance-tabs.description',
defaultMessage: 'Use these tabs for content, files, screenshots, worlds, and logs. Tidy chaos.',
},
+ instanceContentTabTitle: {
+ id: 'app.onboarding.instance-content-tab.title',
+ defaultMessage: 'Content',
+ },
+ instanceContentTabDescription: {
+ id: 'app.onboarding.instance-content-tab.description',
+ defaultMessage:
+ 'Manage this instance’s mods, resource packs, and shaders here. Search, enable or disable entries, check for updates, and browse for more.',
+ },
+ instanceFilesTabTitle: {
+ id: 'app.onboarding.instance-files-tab.title',
+ defaultMessage: 'Files',
+ },
+ instanceFilesTabDescription: {
+ id: 'app.onboarding.instance-files-tab.description',
+ defaultMessage:
+ 'Browse the instance folder and open configs or logs in the built-in editor without leaving the launcher.',
+ },
+ instanceWorldsTabTitle: {
+ id: 'app.onboarding.instance-worlds-tab.title',
+ defaultMessage: 'Worlds',
+ },
+ instanceWorldsTabDescription: {
+ id: 'app.onboarding.instance-worlds-tab.description',
+ defaultMessage:
+ 'Manage saved worlds: back them up, rename, edit world settings, and open the world folder.',
+ },
+ instanceLogsTabTitle: {
+ id: 'app.onboarding.instance-logs-tab.title',
+ defaultMessage: 'Logs',
+ },
+ instanceLogsTabDescription: {
+ id: 'app.onboarding.instance-logs-tab.description',
+ defaultMessage:
+ 'Read the instance’s live logs to trace crashes and errors without digging through files.',
+ },
labTitle: {
id: 'app.onboarding.lab.title',
defaultMessage: 'Useful tools, built in',
@@ -509,15 +545,29 @@ export const onboardingTours: Record = {
onboardingMessages.instanceActionsTitle,
onboardingMessages.instanceActionsDescription,
),
- step(
- 'instance-tabs',
- 'inspect',
- copy(
- onboardingMessages.instanceTabsTitle,
- onboardingMessages.instanceTabsDescription,
- onboardingMessages.finishArea,
- ),
- { targetId: 'instance-tabs' },
+ inspect(
+ 'instance-content-tab',
+ 'instance-tab-content',
+ onboardingMessages.instanceContentTabTitle,
+ onboardingMessages.instanceContentTabDescription,
+ ),
+ inspect(
+ 'instance-files-tab',
+ 'instance-tab-files',
+ onboardingMessages.instanceFilesTabTitle,
+ onboardingMessages.instanceFilesTabDescription,
+ ),
+ inspect(
+ 'instance-worlds-tab',
+ 'instance-tab-worlds',
+ onboardingMessages.instanceWorldsTabTitle,
+ onboardingMessages.instanceWorldsTabDescription,
+ ),
+ inspect(
+ 'instance-logs-tab',
+ 'instance-tab-logs',
+ onboardingMessages.instanceLogsTabTitle,
+ onboardingMessages.instanceLogsTabDescription,
),
],
}
diff --git a/apps/app-frontend/src/components/ui/onboarding/useOnboardingTour.ts b/apps/app-frontend/src/components/ui/onboarding/useOnboardingTour.ts
index 750502a..f86f69f 100644
--- a/apps/app-frontend/src/components/ui/onboarding/useOnboardingTour.ts
+++ b/apps/app-frontend/src/components/ui/onboarding/useOnboardingTour.ts
@@ -279,8 +279,11 @@ export function useOnboardingTour(
function handleDocumentClick(event: MouseEvent) {
if (!visible.value) return
const clickedElement = event.target instanceof Element ? event.target : null
- if (clickedElement?.closest('[data-onboarding-overlay-ui]')) return
+ // 跳过/关闭按钮由其自身处理,不在全局点击里推进
+ if (clickedElement?.closest('[data-onboarding-skip]')) return
+
+ // inspect 步:点击任意位置(含导览气泡本身)都继续下一步
if (step.value.interaction === 'inspect') {
event.preventDefault()
event.stopImmediatePropagation()
@@ -288,6 +291,9 @@ export function useOnboardingTour(
return
}
+ // 非 inspect 步:点在导览 UI 自身时不处理
+ if (clickedElement?.closest('[data-onboarding-overlay-ui]')) return
+
if (!step.value.targetId || !['navigate', 'activate'].includes(step.value.interaction)) return
if (clickedElement && handleBranchClick(clickedElement)) return
if (!targetElement.value?.contains(event.target as Node)) return
diff --git a/apps/app-frontend/src/locales/zh-CN/index.json b/apps/app-frontend/src/locales/zh-CN/index.json
index aa381e9..3a0bbc0 100644
--- a/apps/app-frontend/src/locales/zh-CN/index.json
+++ b/apps/app-frontend/src/locales/zh-CN/index.json
@@ -5995,6 +5995,30 @@
"app.onboarding.instance-actions.title": {
"message": "主操作台"
},
+ "app.onboarding.instance-content-tab.title": {
+ "message": "内容"
+ },
+ "app.onboarding.instance-content-tab.description": {
+ "message": "在这里管理实例的 Mod、资源包与光影。可搜索、启用或禁用条目、检查更新,也能继续浏览安装新内容。"
+ },
+ "app.onboarding.instance-files-tab.title": {
+ "message": "文件"
+ },
+ "app.onboarding.instance-files-tab.description": {
+ "message": "浏览实例目录,用内置编辑器直接打开配置文件或日志,无需离开启动器。"
+ },
+ "app.onboarding.instance-worlds-tab.title": {
+ "message": "世界"
+ },
+ "app.onboarding.instance-worlds-tab.description": {
+ "message": "管理存档世界:备份、重命名、编辑世界设置,或打开世界所在文件夹。"
+ },
+ "app.onboarding.instance-logs-tab.title": {
+ "message": "日志"
+ },
+ "app.onboarding.instance-logs-tab.description": {
+ "message": "查看实例的实时日志,排查崩溃与报错,不必再翻找文件。"
+ },
"app.onboarding.instance-tabs.description": {
"message": "内容、文件、截图、世界和日志都在这些标签里。乱中有序。"
},
diff --git a/apps/app-frontend/src/pages/instance/Index.vue b/apps/app-frontend/src/pages/instance/Index.vue
index 7f18b54..43454c1 100644
--- a/apps/app-frontend/src/pages/instance/Index.vue
+++ b/apps/app-frontend/src/pages/instance/Index.vue
@@ -688,11 +688,13 @@ const tabs = computed(() => [
label: formatMessage(messages.contentTab),
href: `${basePath.value}`,
icon: BoxesIcon,
+ onboardingId: 'instance-tab-content',
},
{
label: formatMessage(messages.filesTab),
href: `${basePath.value}/files`,
icon: FolderOpenIcon,
+ onboardingId: 'instance-tab-files',
},
{
label: formatMessage(messages.screenshotsTab),
@@ -703,11 +705,13 @@ const tabs = computed(() => [
label: formatMessage(messages.worldsTab),
href: `${basePath.value}/worlds`,
icon: GlobeIcon,
+ onboardingId: 'instance-tab-worlds',
},
{
label: formatMessage(messages.logsTab),
href: `${basePath.value}/logs`,
icon: TerminalSquareIcon,
+ onboardingId: 'instance-tab-logs',
},
])