+
+
+
+
+
+ {
+ setDraft(e.target.value)
+ }}
+ onBlur={(e) => {
+ if (draft !== prompt) {
+ onChangePrompt(draft)
+ }
+ }}
+ onKeyDown={({ key }) => {
+ if (key === 'Enter') {
+ if (draft.trim() !== prompt.trim()) {
+ onChangePrompt(draft.trim())
+ }
+ }
+ }}
+ value={draft}
+ />
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..12e2fae0d41e4a6f3967a9f375c56f5fb0f1efcb
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,24 @@
+import './globals.css'
+import type { Metadata } from 'next'
+import { Inter } from 'next/font/google'
+
+const inter = Inter({ subsets: ['latin'] })
+
+export const metadata: Metadata = {
+ title: 'Comic Factory: generate your own comics!',
+ description: 'Comic Factory: generate your own comits!',
+}
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/src/app/main.tsx b/src/app/main.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..5ba7f7fd9f3db05263926695e3ebb000e8c9c215
--- /dev/null
+++ b/src/app/main.tsx
@@ -0,0 +1,112 @@
+"use client"
+
+import { useState, useTransition } from "react"
+import { usePathname, useRouter, useSearchParams } from "next/navigation"
+
+import "react-virtualized/styles.css" // only needs to be imported once
+
+import { Preset, PresetName, defaultPreset, getPreset } from "@/app/engine/presets"
+
+import { cn } from "@/lib/utils"
+import { TopMenu } from "./interface/top-menu"
+import { FontName } from "@/lib/fonts"
+import Panel from "./interface/panel"
+
+export default function Main() {
+ const [_isPending, startTransition] = useTransition()
+ const [isLoading, setLoading] = useState