git-subtree-dir: services/pascal-editor git-subtree-split: 312064e6e8122f958d2961e28ea85ad8b9db40c5
119 lines
3.3 KiB
TypeScript
119 lines
3.3 KiB
TypeScript
'use client'
|
|
|
|
import { Editor, ItemsPanel } from '@pascal-app/editor'
|
|
import { Hammer, Layers, Package, Settings } from 'lucide-react'
|
|
import Image from 'next/image'
|
|
import Link from 'next/link'
|
|
import { BuildTab } from '@/components/build-tab'
|
|
import {
|
|
CommunityViewerToolbarLeft,
|
|
CommunityViewerToolbarRight,
|
|
} from '@/components/viewer-toolbar'
|
|
import { withPascalBasePath } from '@/lib/pascal-base-path'
|
|
|
|
// The open-source editor only ships the built-in catalog (no uploaded items),
|
|
// so the Library/Community/Mine source chips and tag filters add nothing —
|
|
// drop them and keep the panel to plain categories.
|
|
function EditorItemsPanel() {
|
|
return <ItemsPanel showSourceFilter={false} showTagFilters={false} />
|
|
}
|
|
|
|
const SIDEBAR_TABS = [
|
|
{
|
|
id: 'site',
|
|
label: '场景',
|
|
component: () => null,
|
|
mobileDefaultSnap: 0.5,
|
|
mobileIcon: <Layers className="h-5 w-5" />,
|
|
icon: (
|
|
<Image
|
|
alt=""
|
|
className="h-8 w-8 object-contain"
|
|
height={32}
|
|
src={withPascalBasePath('/icons/scene.webp')}
|
|
width={32}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'build',
|
|
label: '搭建',
|
|
component: BuildTab,
|
|
mobileDefaultSnap: 0.5,
|
|
mobileIcon: <Hammer className="h-5 w-5" />,
|
|
icon: (
|
|
<Image
|
|
alt=""
|
|
className="h-8 w-8 object-contain"
|
|
height={32}
|
|
src={withPascalBasePath('/icons/build.webp')}
|
|
width={32}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'items',
|
|
label: '物品',
|
|
component: EditorItemsPanel,
|
|
mobileDefaultSnap: 0.5,
|
|
mobileIcon: <Package className="h-5 w-5" />,
|
|
icon: (
|
|
<Image
|
|
alt=""
|
|
className="h-8 w-8 object-contain"
|
|
height={32}
|
|
src={withPascalBasePath('/icons/couch.webp')}
|
|
width={32}
|
|
/>
|
|
),
|
|
},
|
|
{
|
|
id: 'settings',
|
|
label: '设置',
|
|
component: () => null,
|
|
mobileDefaultSnap: 0.5,
|
|
mobileIcon: <Settings className="h-5 w-5" />,
|
|
icon: (
|
|
<Image
|
|
alt=""
|
|
className="h-8 w-8 object-contain"
|
|
height={32}
|
|
src={withPascalBasePath('/icons/settings.webp')}
|
|
width={32}
|
|
/>
|
|
),
|
|
},
|
|
]
|
|
|
|
const PROJECT_ID = 'local-editor'
|
|
|
|
export default function Home() {
|
|
return (
|
|
<div className="relative h-screen w-screen">
|
|
{PROJECT_ID === 'local-editor' && (
|
|
<div className="pointer-events-none absolute top-3 left-1/2 z-40 -translate-x-1/2">
|
|
<div className="pointer-events-auto flex items-center gap-3 rounded-full border border-border/60 bg-background/90 px-4 py-1.5 text-xs shadow-sm backdrop-blur">
|
|
<span className="text-muted-foreground">本地编辑器中的场景不会自动保存。</span>
|
|
<Link className="font-medium text-foreground hover:underline" href="/scenes">
|
|
打开最近场景
|
|
</Link>
|
|
<span aria-hidden className="text-muted-foreground">
|
|
·
|
|
</span>
|
|
<Link className="font-medium text-foreground hover:underline" href="/scenes">
|
|
新建场景
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
)}
|
|
<Editor
|
|
layoutVersion="v2"
|
|
projectId={PROJECT_ID}
|
|
sidebarTabs={SIDEBAR_TABS}
|
|
viewerToolbarLeft={<CommunityViewerToolbarLeft />}
|
|
viewerToolbarRight={<CommunityViewerToolbarRight />}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|