Files
wehub-resource-sync 2114b14ee0
Sync main into demo / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:26 +08:00

611 lines
21 KiB
TypeScript

import type { NavigationDeclaration, ScrollContainerDeclaration } from './navigation.types';
const MAIN_SCROLL: ScrollContainerDeclaration[] = [
{ name: 'main', direction: 'vertical', description: '主内容区' },
];
const NO_SCROLL: ScrollContainerDeclaration[] = [];
// Query params are defined per-route to avoid over-expansion in graph generation
export const NAVIGATION_DECLARATION = {
app: 'file_manager',
routes: [
// =========================
// Main tabs (using pathname routing)
// =========================
{
path: '/',
component: 'BrowseHomePage',
params: {},
entryPoint: 'home',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'browse.base', search: {}, description: '浏览主页' },
{ id: 'browse.modal.details', search: { modal: 'details' }, description: '浏览主页 - 详情弹窗' },
{ id: 'browse.modal.rename', search: { modal: 'rename' }, description: '浏览主页 - 重命名弹窗' },
{ id: 'browse.select', search: { mode: 'select' }, description: '浏览主页 - 选择模式' },
{ id: 'browse.select.modal.delete', search: { mode: 'select', modal: 'delete' }, description: '浏览主页 - 选择模式 - 删除确认' },
{ id: 'browse.select.modal.more', search: { mode: 'select', modal: 'more' }, description: '浏览主页 - 选择模式 - 更多菜单' },
{ id: 'browse.select.modal.transfer', search: { mode: 'select', modal: 'transfer' }, description: '浏览主页 - 选择模式 - 复制/移动目标选择' },
{ id: 'browse.select.modal.transfer.newFolder', search: { mode: 'select', modal: 'transfer', transferDialog: 'newFolder' }, description: '浏览主页 - 选择模式 - 复制/移动目标选择 - 新建文件夹' },
],
queryParams: {},
description: '浏览主页',
},
{
path: '/recent',
component: 'RecentPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'recent.base', search: {}, description: '最近文件' },
{ id: 'recent.modal.details', search: { modal: 'details' }, description: '最近文件 - 详情弹窗' },
{ id: 'recent.modal.rename', search: { modal: 'rename' }, description: '最近文件 - 重命名弹窗' },
{ id: 'recent.select', search: { mode: 'select' }, description: '最近文件 - 选择模式' },
{ id: 'recent.select.modal.delete', search: { mode: 'select', modal: 'delete' }, description: '最近文件 - 选择模式 - 删除确认' },
{ id: 'recent.select.modal.more', search: { mode: 'select', modal: 'more' }, description: '最近文件 - 选择模式 - 更多菜单' },
{ id: 'recent.select.modal.transfer', search: { mode: 'select', modal: 'transfer' }, description: '最近文件 - 选择模式 - 复制/移动目标选择' },
{ id: 'recent.select.modal.transfer.newFolder', search: { mode: 'select', modal: 'transfer', transferDialog: 'newFolder' }, description: '最近文件 - 选择模式 - 复制/移动目标选择 - 新建文件夹' },
],
queryParams: {},
description: '最近文件',
},
{
path: '/cloud',
component: 'CloudPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'cloud.base', search: {}, description: '云盘' },
],
queryParams: {},
description: '云盘',
},
// =========================
// Folder browser
// =========================
{
path: '/folder',
component: 'FolderPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'folder.base', search: {}, description: '文件夹浏览' },
{ id: 'folder.modal.details', search: { modal: 'details' }, description: '文件夹浏览 - 详情弹窗' },
{ id: 'folder.modal.rename', search: { modal: 'rename' }, description: '文件夹浏览 - 重命名弹窗' },
{ id: 'folder.modal.newFolder', search: { modal: 'newFolder' }, description: '文件夹浏览 - 新建文件夹' },
{ id: 'folder.select', search: { mode: 'select' }, description: '文件夹浏览 - 选择模式' },
{ id: 'folder.select.modal.delete', search: { mode: 'select', modal: 'delete' }, description: '文件夹浏览 - 选择模式 - 删除确认' },
{ id: 'folder.select.modal.more', search: { mode: 'select', modal: 'more' }, description: '文件夹浏览 - 选择模式 - 更多菜单' },
{ id: 'folder.select.modal.transfer', search: { mode: 'select', modal: 'transfer' }, description: '文件夹浏览 - 选择模式 - 复制/移动目标选择' },
{ id: 'folder.select.modal.transfer.newFolder', search: { mode: 'select', modal: 'transfer', transferDialog: 'newFolder' }, description: '文件夹浏览 - 选择模式 - 复制/移动目标选择 - 新建文件夹' },
],
queryParams: { path: 'string' },
description: '文件夹浏览',
},
{
path: '/text',
component: 'TextPreviewPage',
params: {},
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'textPreview.base', search: {}, description: '文本文件预览' },
],
queryParams: { path: 'string' },
description: '文本文件预览',
},
{
path: '/pdf',
component: 'PdfPreviewPage',
params: {},
entryPoint: 'none',
scrollContainers: NO_SCROLL,
uiStates: [
{ id: 'pdfPreview.base', search: {}, description: 'PDF 文件预览' },
],
queryParams: { path: 'string' },
description: 'PDF 文件预览',
},
// =========================
// Category views
// =========================
{
path: '/category/:category',
component: 'CategoryPage',
params: { category: 'string' },
entryPoint: 'none',
scrollContainers: MAIN_SCROLL,
uiStates: [
{ id: 'category.base', search: {}, description: '分类文件' },
],
queryParams: {},
description: '分类文件(图片/视频/音频/文档)',
},
],
transitions: [
// =========================
// 选择模式 - 浏览页
// =========================
{
id: 'browse.select.enter',
from: { path: '/', search: { mode: null } },
to: '/',
search: { mode: 'select' },
searchParams: { selected: 'string' },
mode: 'push',
params: {},
label: '进入浏览选择模式',
ui: { placement: 'content', icon: 'select_enter', gesture: 'longPress' },
},
{
id: 'browse.select.exit',
from: { path: '/', search: { mode: 'select' } },
to: '/',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '退出浏览选择模式',
ui: { placement: 'content', icon: 'select_exit', gesture: 'tap' },
},
{
id: 'browse.modal.delete.open',
from: { path: '/', search: { mode: 'select', modal: null } },
to: '/',
search: { mode: 'select', modal: 'delete' },
searchParams: {},
preserveParams: ['selected'],
mode: 'push',
params: {},
label: '打开删除确认弹窗',
ui: { placement: 'content', icon: 'modal_delete', gesture: 'tap' },
},
{
id: 'browse.modal.more.open',
from: { path: '/', search: { mode: 'select', modal: null } },
to: '/',
search: { mode: 'select', modal: 'more' },
searchParams: {},
preserveParams: ['selected'],
mode: 'push',
params: {},
label: '打开更多菜单',
ui: { placement: 'content', icon: 'modal_more', gesture: 'tap' },
},
{
id: 'browse.modal.transfer.open',
from: { path: '/', search: { mode: 'select' } },
to: '/',
search: { mode: 'select', modal: 'transfer' },
searchParams: { operation: 'string' },
preserveParams: ['selected'],
mode: 'push',
params: {},
label: '打开复制/移动目标选择弹窗',
ui: { placement: 'content', icon: 'modal_transfer', gesture: 'tap' },
},
{
id: 'browse.modal.transfer.newFolder.open',
from: { path: '/', search: { mode: 'select', modal: 'transfer', transferDialog: null } },
to: '/',
search: { mode: 'select', modal: 'transfer', transferDialog: 'newFolder' },
searchParams: {},
preserveParams: ['selected', 'operation'],
mode: 'push',
params: {},
label: '在复制/移动目标选择中打开新建文件夹弹窗',
ui: { placement: 'topbar', icon: 'modal_new_folder', gesture: 'tap' },
},
{
id: 'browse.modal.details.open',
from: { path: '/', search: { mode: 'select' } },
to: '/',
search: { modal: 'details' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'replace',
params: {},
label: '打开详情弹窗',
ui: { placement: 'content', icon: 'modal_details', gesture: 'tap' },
},
{
id: 'browse.modal.rename.open',
from: { path: '/', search: { mode: 'select' } },
to: '/',
search: { modal: 'rename' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'replace',
params: {},
label: '打开重命名弹窗',
ui: { placement: 'content', icon: 'modal_rename', gesture: 'tap' },
},
{
id: 'browse.modal.details.open.fromBase',
from: '/',
to: '/',
search: { modal: 'details' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'push',
params: {},
label: '从基础状态打开详情弹窗',
ui: { placement: 'content', icon: 'modal_details', gesture: 'tap' },
},
{
id: 'browse.modal.rename.open.fromBase',
from: '/',
to: '/',
search: { modal: 'rename' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'push',
params: {},
label: '从基础状态打开重命名弹窗',
ui: { placement: 'content', icon: 'modal_rename', gesture: 'tap' },
},
// =========================
// 选择模式 - 最近页
// =========================
{
id: 'recent.select.enter',
from: { path: '/recent', search: { mode: null } },
to: '/recent',
search: { mode: 'select' },
searchParams: { selected: 'string' },
mode: 'push',
params: {},
label: '进入最近选择模式',
ui: { placement: 'content', icon: 'select_enter', gesture: 'longPress' },
},
{
id: 'recent.select.exit',
from: { path: '/recent', search: { mode: 'select' } },
to: '/recent',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '退出最近选择模式',
ui: { placement: 'content', icon: 'select_exit', gesture: 'tap' },
},
{
id: 'recent.modal.delete.open',
from: { path: '/recent', search: { mode: 'select', modal: null } },
to: '/recent',
search: { mode: 'select', modal: 'delete' },
searchParams: {},
preserveParams: ['selected'],
mode: 'push',
params: {},
label: '打开删除确认弹窗',
ui: { placement: 'content', icon: 'modal_delete', gesture: 'tap' },
},
{
id: 'recent.modal.more.open',
from: { path: '/recent', search: { mode: 'select', modal: null } },
to: '/recent',
search: { mode: 'select', modal: 'more' },
searchParams: {},
preserveParams: ['selected'],
mode: 'push',
params: {},
label: '打开更多菜单',
ui: { placement: 'content', icon: 'modal_more', gesture: 'tap' },
},
{
id: 'recent.modal.transfer.open',
from: { path: '/recent', search: { mode: 'select' } },
to: '/recent',
search: { mode: 'select', modal: 'transfer' },
searchParams: { operation: 'string' },
preserveParams: ['selected'],
mode: 'push',
params: {},
label: '打开复制/移动目标选择弹窗',
ui: { placement: 'content', icon: 'modal_transfer', gesture: 'tap' },
},
{
id: 'recent.modal.transfer.newFolder.open',
from: { path: '/recent', search: { mode: 'select', modal: 'transfer', transferDialog: null } },
to: '/recent',
search: { mode: 'select', modal: 'transfer', transferDialog: 'newFolder' },
searchParams: {},
preserveParams: ['selected', 'operation'],
mode: 'push',
params: {},
label: '在复制/移动目标选择中打开新建文件夹弹窗',
ui: { placement: 'topbar', icon: 'modal_new_folder', gesture: 'tap' },
},
{
id: 'recent.modal.details.open',
from: { path: '/recent', search: { mode: 'select' } },
to: '/recent',
search: { modal: 'details' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'replace',
params: {},
label: '打开详情弹窗',
ui: { placement: 'content', icon: 'modal_details', gesture: 'tap' },
},
{
id: 'recent.modal.rename.open',
from: { path: '/recent', search: { mode: 'select' } },
to: '/recent',
search: { modal: 'rename' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'replace',
params: {},
label: '打开重命名弹窗',
ui: { placement: 'content', icon: 'modal_rename', gesture: 'tap' },
},
{
id: 'recent.modal.details.open.fromBase',
from: '/recent',
to: '/recent',
search: { modal: 'details' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'push',
params: {},
label: '从基础状态打开详情弹窗',
ui: { placement: 'content', icon: 'modal_details', gesture: 'tap' },
},
{
id: 'recent.modal.rename.open.fromBase',
from: '/recent',
to: '/recent',
search: { modal: 'rename' },
searchParams: { itemId: 'string' },
preserveParams: [],
mode: 'push',
params: {},
label: '从基础状态打开重命名弹窗',
ui: { placement: 'content', icon: 'modal_rename', gesture: 'tap' },
},
// =========================
// 选择模式 - 文件夹页
// =========================
{
id: 'folder.select.enter',
from: { path: '/folder', search: { mode: null } },
to: '/folder',
search: { mode: 'select' },
searchParams: { selected: 'string' },
preserveParams: ['path'],
mode: 'push',
params: {},
label: '进入文件夹选择模式',
ui: { placement: 'content', icon: 'select_enter', gesture: 'longPress' },
},
{
id: 'folder.select.exit',
from: { path: '/folder', search: { mode: 'select' } },
to: '/folder',
search: {},
searchParams: {},
preserveParams: ['path'],
mode: 'replace',
params: {},
label: '退出文件夹选择模式',
ui: { placement: 'content', icon: 'select_exit', gesture: 'tap' },
},
{
id: 'folder.modal.delete.open',
from: { path: '/folder', search: { mode: 'select', modal: null } },
to: '/folder',
search: { mode: 'select', modal: 'delete' },
searchParams: {},
preserveParams: ['path', 'selected'],
mode: 'push',
params: {},
label: '打开删除确认弹窗',
ui: { placement: 'content', icon: 'modal_delete', gesture: 'tap' },
},
{
id: 'folder.modal.more.open',
from: { path: '/folder', search: { mode: 'select', modal: null } },
to: '/folder',
search: { mode: 'select', modal: 'more' },
searchParams: {},
preserveParams: ['path', 'selected'],
mode: 'push',
params: {},
label: '打开更多菜单',
ui: { placement: 'content', icon: 'modal_more', gesture: 'tap' },
},
{
id: 'folder.modal.transfer.open',
from: { path: '/folder', search: { mode: 'select' } },
to: '/folder',
search: { mode: 'select', modal: 'transfer' },
searchParams: { operation: 'string' },
preserveParams: ['path', 'selected'],
mode: 'push',
params: {},
label: '打开复制/移动目标选择弹窗',
ui: { placement: 'content', icon: 'modal_transfer', gesture: 'tap' },
},
{
id: 'folder.modal.transfer.newFolder.open',
from: { path: '/folder', search: { mode: 'select', modal: 'transfer', transferDialog: null } },
to: '/folder',
search: { mode: 'select', modal: 'transfer', transferDialog: 'newFolder' },
searchParams: {},
preserveParams: ['path', 'selected', 'operation'],
mode: 'push',
params: {},
label: '在复制/移动目标选择中打开新建文件夹弹窗',
ui: { placement: 'topbar', icon: 'modal_new_folder', gesture: 'tap' },
},
{
id: 'folder.modal.newFolder.open',
from: { path: '/folder', search: { modal: null } },
to: '/folder',
search: { modal: 'newFolder' },
searchParams: {},
preserveParams: ['path', 'mode', 'selected'],
mode: 'push',
params: {},
label: '打开新建文件夹弹窗',
ui: { placement: 'topbar', icon: 'modal_new_folder', gesture: 'tap' },
},
{
id: 'folder.modal.details.open',
from: { path: '/folder', search: { mode: 'select' } },
to: '/folder',
search: { modal: 'details' },
searchParams: { itemId: 'string' },
preserveParams: ['path'],
mode: 'replace',
params: {},
label: '打开详情弹窗',
ui: { placement: 'content', icon: 'modal_details', gesture: 'tap' },
},
{
id: 'folder.modal.rename.open',
from: { path: '/folder', search: { mode: 'select' } },
to: '/folder',
search: { modal: 'rename' },
searchParams: { itemId: 'string' },
preserveParams: ['path'],
mode: 'replace',
params: {},
label: '打开重命名弹窗',
ui: { placement: 'content', icon: 'modal_rename', gesture: 'tap' },
},
{
id: 'folder.modal.details.open.fromBase',
from: '/folder',
to: '/folder',
search: { modal: 'details' },
searchParams: { itemId: 'string' },
preserveParams: ['path'],
mode: 'push',
params: {},
label: '从基础状态打开详情弹窗',
ui: { placement: 'content', icon: 'modal_details', gesture: 'tap' },
},
{
id: 'folder.modal.rename.open.fromBase',
from: '/folder',
to: '/folder',
search: { modal: 'rename' },
searchParams: { itemId: 'string' },
preserveParams: ['path'],
mode: 'push',
params: {},
label: '从基础状态打开重命名弹窗',
ui: { placement: 'content', icon: 'modal_rename', gesture: 'tap' },
},
// =========================
// 底部 Tab 切换
// =========================
{
id: 'tab.browse',
from: ['/recent', '/cloud'],
to: '/',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '切换到浏览',
ui: { placement: 'tabbar', icon: 'tab_browse', gesture: 'tap' },
},
{
id: 'tab.recent',
from: ['/', '/cloud'],
to: '/recent',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '切换到最近',
ui: { placement: 'tabbar', icon: 'tab_recent', gesture: 'tap' },
},
{
id: 'tab.cloud',
from: ['/', '/recent'],
to: '/cloud',
search: {},
searchParams: {},
mode: 'replace',
params: {},
label: '切换到云盘',
ui: { placement: 'tabbar', icon: 'tab_cloud', gesture: 'tap' },
},
// =========================
// 分类入口
// =========================
{
id: 'category.open',
from: ['/'],
to: '/category/:category',
search: {},
searchParams: {},
mode: 'push',
params: { category: 'string' },
label: '打开分类',
ui: { placement: 'content', icon: 'category', gesture: 'tap' },
},
// =========================
// 文件夹浏览
// =========================
{
id: 'folder.open',
from: ['/', '/folder'],
to: '/folder',
search: {},
searchParams: { path: 'string' },
mode: 'push',
params: {},
label: '打开文件夹',
ui: { placement: 'content', icon: 'folder', gesture: 'tap' },
},
{
id: 'file.text.open',
from: ['/', '/folder'],
to: '/text',
search: {},
searchParams: { path: 'string' },
mode: 'push',
params: {},
label: '打开文本文件',
ui: { placement: 'content', icon: 'file_text', gesture: 'tap' },
},
{
id: 'file.pdf.open',
from: ['/', '/folder'],
to: '/pdf',
search: {},
searchParams: { path: 'string' },
mode: 'push',
params: {},
label: '打开 PDF 文件',
ui: { placement: 'content', icon: 'file_pdf', gesture: 'tap' },
},
],
capabilities: {
historyBack: true,
},
} as const satisfies NavigationDeclaration;
export type TransitionId = (typeof NAVIGATION_DECLARATION.transitions)[number]['id'];