mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-11 12:09:53 +08:00
The canvas now fills the window and the chat floats on its right. draw.io is served from our own origin (public/drawio, downloaded at build time and checked against the release's SHA-256), so the app can drive the editor directly: - every AI change becomes a version card with a thumbnail; compare, restore or undo it, and Ctrl+Z on the canvas takes an AI change back in one step - shapes the AI just changed are highlighted on the canvas - selected shapes appear as a chip and are sent to the model - draw.io's own simple UI: its toolbar, menus (auto layout, Mermaid, CSV import) and page tabs; the shape library starts closed - new start screen, session rename and switcher, open .drawio files - settings split into Models & keys, Appearance, Advanced and About - Bedrock in the model settings also takes an API key instead of access keys - phones switch between canvas and chat - dark mode uses draw.io's own dark mode, with neutral greys around it With an external draw.io (NEXT_PUBLIC_DRAWIO_BASE_URL) the features above that need same origin are off. The chat logic moved from the 1500-line chat panel into a chat engine plus small UI components; zustand holds canvas, versions, settings and UI state.
197 lines
6.8 KiB
TypeScript
197 lines
6.8 KiB
TypeScript
import { GoogleAnalytics } from "@next/third-parties/google"
|
|
import type { Metadata, Viewport } from "next"
|
|
import { Instrument_Sans, JetBrains_Mono } from "next/font/google"
|
|
import { notFound } from "next/navigation"
|
|
import Script from "next/script"
|
|
import { AppToaster } from "@/components/workspace/app-toaster"
|
|
import { DiagramProvider } from "@/contexts/diagram-context"
|
|
import { DictionaryProvider } from "@/hooks/use-dictionary"
|
|
import type { Locale } from "@/lib/i18n/config"
|
|
import { i18n } from "@/lib/i18n/config"
|
|
import { getDictionary, hasLocale } from "@/lib/i18n/dictionaries"
|
|
import { THEME_INIT_SCRIPT } from "@/stores/settings-store"
|
|
|
|
import "../globals.css"
|
|
|
|
const instrumentSans = Instrument_Sans({
|
|
variable: "--font-latin",
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600", "700"],
|
|
// Chinese and Japanese text falls through to system fonts, in the
|
|
// order globals.css picks for the page's language
|
|
fallback: [],
|
|
})
|
|
|
|
const jetbrainsMono = JetBrains_Mono({
|
|
variable: "--font-mono",
|
|
subsets: ["latin"],
|
|
weight: ["400", "500"],
|
|
})
|
|
|
|
export const viewport: Viewport = {
|
|
width: "device-width",
|
|
initialScale: 1,
|
|
maximumScale: 1,
|
|
userScalable: false,
|
|
}
|
|
|
|
// Generate static params for all locales
|
|
export async function generateStaticParams() {
|
|
return i18n.locales.map((locale) => ({ lang: locale }))
|
|
}
|
|
|
|
// Generate metadata per locale
|
|
export async function generateMetadata({
|
|
params,
|
|
}: {
|
|
params: Promise<{ lang: string }>
|
|
}): Promise<Metadata> {
|
|
const { lang: rawLang } = await params
|
|
const lang = (
|
|
rawLang in { en: 1, zh: 1, ja: 1, "zh-Hant": 1 } ? rawLang : "en"
|
|
) as Locale
|
|
|
|
// Default to English metadata
|
|
const titles: Record<Locale, string> = {
|
|
en: "Next AI Draw.io - AI-Powered Diagram Generator",
|
|
zh: "Next AI Draw.io - AI powered diagram generator",
|
|
ja: "Next AI Draw.io - AI-powered diagram generator",
|
|
"zh-Hant": "Next AI Draw.io - AI 驅動的圖表產生器",
|
|
}
|
|
|
|
const descriptions: Record<Locale, string> = {
|
|
en: "Create AWS architecture diagrams, flowcharts, and technical diagrams using AI. Free online tool integrating draw.io with AI assistance for professional diagram creation.",
|
|
zh: "Use AI to create AWS architecture diagrams, flowcharts, and technical diagrams. Free online tool integrated with draw.io and AI assistance for professional diagram creation.",
|
|
ja: "Create AWS architecture diagrams, flowcharts, and technical diagrams using AI. Create professional diagrams with a free online tool that integrates draw.io with an AI assistant.",
|
|
"zh-Hant":
|
|
"使用 AI 建立 AWS 架構圖、流程圖和技術圖表。免費線上工具整合 draw.io 與 AI 輔助,輕鬆建立專業圖表。",
|
|
}
|
|
|
|
return {
|
|
title: titles[lang],
|
|
description: descriptions[lang],
|
|
keywords: [
|
|
"AI diagram generator",
|
|
"AWS architecture",
|
|
"flowchart creator",
|
|
"draw.io",
|
|
"AI drawing tool",
|
|
"technical diagrams",
|
|
"diagram automation",
|
|
"free diagram generator",
|
|
"online diagram maker",
|
|
],
|
|
authors: [{ name: "Next AI Draw.io" }],
|
|
creator: "Next AI Draw.io",
|
|
publisher: "Next AI Draw.io",
|
|
metadataBase: new URL("https://next-ai-drawio.jiang.jp"),
|
|
openGraph: {
|
|
title: titles[lang],
|
|
description: descriptions[lang],
|
|
type: "website",
|
|
url: "https://next-ai-drawio.jiang.jp",
|
|
siteName: "Next AI Draw.io",
|
|
locale:
|
|
lang === "zh"
|
|
? "zh_CN"
|
|
: lang === "zh-Hant"
|
|
? "zh_HK"
|
|
: lang === "ja"
|
|
? "ja_JP"
|
|
: "en_US",
|
|
images: [
|
|
{
|
|
url: "/architecture.png",
|
|
width: 1200,
|
|
height: 630,
|
|
alt: "Next AI Draw.io - AI-powered diagram creation tool",
|
|
},
|
|
],
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: titles[lang],
|
|
description: descriptions[lang],
|
|
images: ["/architecture.png"],
|
|
},
|
|
robots: {
|
|
index: true,
|
|
follow: true,
|
|
googleBot: {
|
|
index: true,
|
|
follow: true,
|
|
"max-video-preview": -1,
|
|
"max-image-preview": "large",
|
|
"max-snippet": -1,
|
|
},
|
|
},
|
|
icons: {
|
|
icon: "/favicon.ico",
|
|
},
|
|
alternates: {
|
|
languages: {
|
|
en: "/en",
|
|
zh: "/zh",
|
|
ja: "/ja",
|
|
"zh-Hant": "/zh-Hant",
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
export default async function RootLayout({
|
|
children,
|
|
params,
|
|
}: Readonly<{
|
|
children: React.ReactNode
|
|
params: Promise<{ lang: string }>
|
|
}>) {
|
|
const { lang } = await params
|
|
if (!hasLocale(lang)) notFound()
|
|
const validLang = lang as Locale
|
|
const dictionary = await getDictionary(validLang)
|
|
|
|
const jsonLd = {
|
|
"@context": "https://schema.org",
|
|
"@type": "SoftwareApplication",
|
|
name: "Next AI Draw.io",
|
|
applicationCategory: "DesignApplication",
|
|
operatingSystem: "Web Browser",
|
|
description:
|
|
"AI-powered diagram generator with targeted XML editing capabilities that integrates with draw.io for creating AWS architecture diagrams, flowcharts, and technical diagrams. Features diagram history, multi-provider AI support, and real-time collaboration.",
|
|
url: "https://next-ai-drawio.jiang.jp",
|
|
inLanguage: validLang,
|
|
offers: {
|
|
"@type": "Offer",
|
|
price: "0",
|
|
priceCurrency: "USD",
|
|
},
|
|
}
|
|
|
|
return (
|
|
<html lang={validLang} suppressHydrationWarning>
|
|
<head>
|
|
{/* Apply dark mode before the first paint (no white flash) */}
|
|
<Script id="theme-init" strategy="beforeInteractive">
|
|
{THEME_INIT_SCRIPT}
|
|
</Script>
|
|
<script
|
|
type="application/ld+json"
|
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
|
/>
|
|
</head>
|
|
<body
|
|
className={`${instrumentSans.variable} ${jetbrainsMono.variable} antialiased`}
|
|
>
|
|
<DictionaryProvider dictionary={dictionary}>
|
|
<DiagramProvider>{children}</DiagramProvider>
|
|
</DictionaryProvider>
|
|
<AppToaster />
|
|
</body>
|
|
{process.env.NEXT_PUBLIC_GA_ID && (
|
|
<GoogleAnalytics gaId={process.env.NEXT_PUBLIC_GA_ID} />
|
|
)}
|
|
</html>
|
|
)
|
|
}
|