2026-07-17 18:50:58 +08:00
|
|
|
import { useState } from 'react'
|
|
|
|
|
import type { AppLocale, TranslationKey } from '../lib/i18n'
|
|
|
|
|
import { translate } from '../lib/i18n'
|
|
|
|
|
import { trackEvent } from '../lib/telemetry'
|
|
|
|
|
import { openExternalUrl } from '../utils/url'
|
|
|
|
|
import { Button } from './ui/button'
|
|
|
|
|
import {
|
|
|
|
|
Dialog,
|
|
|
|
|
DialogContent,
|
|
|
|
|
DialogDescription,
|
|
|
|
|
DialogHeader,
|
|
|
|
|
DialogTitle,
|
|
|
|
|
} from './ui/dialog'
|
|
|
|
|
|
|
|
|
|
export const HOLOLAKE_DEVELOPMENT_REPOSITORY_URL =
|
|
|
|
|
'https://guanghulab.com/fifth-domain/bingshuo/hololake-platform'
|
|
|
|
|
|
2026-07-13 23:33:23 +08:00
|
|
|
type HoloLakeHomeProps = {
|
2026-07-17 18:50:58 +08:00
|
|
|
locale: AppLocale
|
2026-07-13 23:33:23 +08:00
|
|
|
onEnterKnowledgeBase: () => void
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-17 18:50:58 +08:00
|
|
|
const modules: Array<{
|
|
|
|
|
title: TranslationKey
|
|
|
|
|
description: TranslationKey
|
|
|
|
|
action: TranslationKey
|
|
|
|
|
kind: 'knowledge' | 'architecture' | 'repository' | 'authorization'
|
|
|
|
|
}> = [
|
|
|
|
|
{ title: 'hololake.home.moduleKnowledgeTitle', description: 'hololake.home.moduleKnowledgeDescription', action: 'hololake.home.enterKnowledge', kind: 'knowledge' },
|
|
|
|
|
{ title: 'hololake.home.moduleArchitectureTitle', description: 'hololake.home.moduleArchitectureDescription', action: 'hololake.home.openArchitecture', kind: 'architecture' },
|
|
|
|
|
{ title: 'hololake.home.moduleRepositoryTitle', description: 'hololake.home.moduleRepositoryDescription', action: 'hololake.home.openRepository', kind: 'repository' },
|
|
|
|
|
{ title: 'hololake.home.moduleAuthorizationTitle', description: 'hololake.home.moduleAuthorizationDescription', action: 'hololake.home.authorizationStatus', kind: 'authorization' },
|
2026-07-13 23:33:23 +08:00
|
|
|
]
|
|
|
|
|
|
2026-07-17 18:50:58 +08:00
|
|
|
const architectureRoutes: Array<[string, TranslationKey, TranslationKey]> = [
|
|
|
|
|
['GLW-ENTRY-001', 'hololake.architecture.worldEntry', 'hololake.architecture.worldEntryDescription'],
|
|
|
|
|
['FD-LANGUAGE-001', 'hololake.architecture.fifthDomain', 'hololake.architecture.fifthDomainDescription'],
|
|
|
|
|
['TCS-ROOT-001', 'hololake.architecture.tcs', 'hololake.architecture.tcsDescription'],
|
|
|
|
|
['GLS-SYS-ARCH-001', 'hololake.architecture.gls', 'hololake.architecture.glsDescription'],
|
|
|
|
|
['ELH-LAMP-001', 'hololake.architecture.lakeLamp', 'hololake.architecture.lakeLampDescription'],
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
export function HoloLakeHome({ locale, onEnterKnowledgeBase }: HoloLakeHomeProps) {
|
|
|
|
|
const [architectureOpen, setArchitectureOpen] = useState(false)
|
|
|
|
|
const t = (key: TranslationKey) => translate(locale, key)
|
|
|
|
|
|
|
|
|
|
const openArchitecture = () => {
|
|
|
|
|
trackEvent('guanghu_architecture_opened', { route: 'GLS-SYS-ARCH-001' })
|
|
|
|
|
setArchitectureOpen(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const openDevelopmentRepository = () => {
|
|
|
|
|
trackEvent('hololake_development_repository_opened', { route: 'REPO-008' })
|
|
|
|
|
void openExternalUrl(HOLOLAKE_DEVELOPMENT_REPOSITORY_URL)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const runModuleAction = (kind: typeof modules[number]['kind']) => {
|
|
|
|
|
if (kind === 'knowledge') onEnterKnowledgeBase()
|
|
|
|
|
if (kind === 'architecture') openArchitecture()
|
|
|
|
|
if (kind === 'repository') openDevelopmentRepository()
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-13 23:33:23 +08:00
|
|
|
return (
|
2026-07-17 18:50:58 +08:00
|
|
|
<main className="hololake-home" aria-label={t('hololake.home.ariaLabel')}>
|
2026-07-13 23:33:23 +08:00
|
|
|
<section className="hololake-home__hero">
|
|
|
|
|
<div className="hololake-home__halo" aria-hidden="true" />
|
2026-07-17 18:50:58 +08:00
|
|
|
<p className="hololake-home__eyebrow">{t('hololake.home.eyebrow')}</p>
|
2026-07-13 23:33:23 +08:00
|
|
|
<h1>HoloLake <em>Era</em></h1>
|
2026-07-17 18:50:58 +08:00
|
|
|
<p className="hololake-home__lead">{t('hololake.home.lead')}</p>
|
|
|
|
|
<p className="hololake-home__copy">{t('hololake.home.copy')}</p>
|
2026-07-13 23:33:23 +08:00
|
|
|
<div className="hololake-home__actions">
|
2026-07-17 18:50:58 +08:00
|
|
|
<Button className="hololake-home__primary" onClick={onEnterKnowledgeBase}>{t('hololake.home.enterKnowledge')} <span>→</span></Button>
|
|
|
|
|
<span className="hololake-home__status"><i /> {t('hololake.home.status')}</span>
|
2026-07-13 23:33:23 +08:00
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
2026-07-17 18:50:58 +08:00
|
|
|
<section className="hololake-home__signal-grid" aria-label={t('hololake.home.systemStatus')}>
|
|
|
|
|
<article><span>{t('hololake.home.worldRoot')}</span><strong>SYS-GLW-0001</strong><small>{t('hololake.home.resolved')}</small></article>
|
|
|
|
|
<article><span>{t('hololake.home.domesticNode')}</span><strong>JD-FD-PRIMARY</strong><small>{t('hololake.home.primaryRoute')}</small></article>
|
|
|
|
|
<article><span>{t('hololake.home.executionSafety')}</span><strong>{t('hololake.home.humanInLoop')}</strong><small>{t('hololake.home.noExecutionWithoutAuthorization')}</small></article>
|
2026-07-13 23:33:23 +08:00
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section className="hololake-home__modules">
|
2026-07-17 18:50:58 +08:00
|
|
|
<div className="hololake-home__section-head"><span>01 / {t('hololake.home.systemEntry')}</span><p>{t('hololake.home.sectionCopy')}</p></div>
|
2026-07-13 23:33:23 +08:00
|
|
|
<div className="hololake-home__module-grid">
|
2026-07-17 18:50:58 +08:00
|
|
|
{modules.map(({ title, description, action, kind }, index) => (
|
|
|
|
|
<article className="hololake-module" key={kind}>
|
2026-07-13 23:33:23 +08:00
|
|
|
<span className="hololake-module__number">0{index + 1}</span>
|
2026-07-17 18:50:58 +08:00
|
|
|
<h2>{t(title)}</h2>
|
|
|
|
|
<p>{t(description)}</p>
|
|
|
|
|
{kind === 'authorization'
|
|
|
|
|
? <span className="hololake-module__soon">{t(action)}</span>
|
|
|
|
|
: <Button variant="link" onClick={() => runModuleAction(kind)}>{t(action)} <span>↗</span></Button>}
|
2026-07-13 23:33:23 +08:00
|
|
|
</article>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
2026-07-17 18:50:58 +08:00
|
|
|
|
|
|
|
|
<Dialog open={architectureOpen} onOpenChange={setArchitectureOpen}>
|
|
|
|
|
<DialogContent className="guanghu-architecture" aria-label={t('hololake.architecture.title')}>
|
|
|
|
|
<DialogHeader>
|
|
|
|
|
<DialogTitle>{t('hololake.architecture.title')}</DialogTitle>
|
|
|
|
|
<DialogDescription>{t('hololake.architecture.description')}</DialogDescription>
|
|
|
|
|
</DialogHeader>
|
|
|
|
|
<ol className="guanghu-architecture__routes">
|
|
|
|
|
{architectureRoutes.map(([id, title, description]) => (
|
|
|
|
|
<li key={id}>
|
|
|
|
|
<code>{id}</code>
|
|
|
|
|
<div><strong>{t(title)}</strong><p>{t(description)}</p></div>
|
|
|
|
|
</li>
|
|
|
|
|
))}
|
|
|
|
|
</ol>
|
|
|
|
|
<p className="guanghu-architecture__route">GLW-ENTRY-001 → FD-LANGUAGE-001 → TCS-ROOT-001 → GLS-SYS-ARCH-001 → ELH-LAMP-001</p>
|
|
|
|
|
</DialogContent>
|
|
|
|
|
</Dialog>
|
2026-07-13 23:33:23 +08:00
|
|
|
</main>
|
|
|
|
|
)
|
|
|
|
|
}
|