diff --git a/src/app/(app)/layout.tsx b/src/app/(app)/layout.tsx
index f733425..e80c5f2 100644
--- a/src/app/(app)/layout.tsx
+++ b/src/app/(app)/layout.tsx
@@ -1,35 +1,4 @@
-import type { Metadata, Viewport } from "next";
-import { Geist, Geist_Mono } from "next/font/google";
-import "./globals.css";
import Header from "@/components/Header";
-import { ConfigProvider } from "@/components/ConfigContext";
-import { QueryProvider } from "@/components/QueryProvider";
-
-const geistSans = Geist({
- variable: "--font-geist-sans",
- subsets: ["latin"],
-});
-
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
- subsets: ["latin"],
-});
-
-export const metadata: Metadata = {
- title: "MeshExplorer",
- description: "A real-time map, chat client, and packet analysis tool for mesh networks using MeshCore and Meshtastic.",
- icons: {
- icon: { url: "/favicon.svg", type: "image/svg+xml" },
- apple: { url: "/favicon.svg", type: "image/svg+xml" }
- },
-};
-
-export const viewport: Viewport = {
- themeColor: [
- { media: "(prefers-color-scheme: light)", color: "oklch(92.2% 0 0)" }, // neutral-200
- { media: "(prefers-color-scheme: dark)", color: "oklch(26.9% 0 0)" }, //neutral-800
- ],
-};
export default function RootLayout({
children,
@@ -37,20 +6,11 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
-
-
-
-
-
- {children}
-
-
-
-
-
+ <>
+
+
+ {children}
+
+ >
);
}
diff --git a/src/app/(embed)/embed/map/page.tsx b/src/app/(embed)/embed/map/page.tsx
new file mode 100644
index 0000000..d433ad7
--- /dev/null
+++ b/src/app/(embed)/embed/map/page.tsx
@@ -0,0 +1,24 @@
+"use client";
+import dynamic from "next/dynamic";
+import { ExternalLink } from "lucide-react";
+
+const MapView = dynamic(() => import("@/components/MapView"), { ssr: false });
+
+export default function EmbedMapPage() {
+ return (
+
+ );
+}
diff --git a/src/app/(embed)/layout.tsx b/src/app/(embed)/layout.tsx
new file mode 100644
index 0000000..9d34957
--- /dev/null
+++ b/src/app/(embed)/layout.tsx
@@ -0,0 +1,11 @@
+export default function EmbedLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/app/(app)/api/chat/route.ts b/src/app/api/chat/route.ts
similarity index 100%
rename from src/app/(app)/api/chat/route.ts
rename to src/app/api/chat/route.ts
diff --git a/src/app/(app)/api/map/route.ts b/src/app/api/map/route.ts
similarity index 100%
rename from src/app/(app)/api/map/route.ts
rename to src/app/api/map/route.ts
diff --git a/src/app/(app)/api/meshcore/node/[publicKey]/neighbors/route.ts b/src/app/api/meshcore/node/[publicKey]/neighbors/route.ts
similarity index 100%
rename from src/app/(app)/api/meshcore/node/[publicKey]/neighbors/route.ts
rename to src/app/api/meshcore/node/[publicKey]/neighbors/route.ts
diff --git a/src/app/(app)/api/meshcore/node/[publicKey]/route.ts b/src/app/api/meshcore/node/[publicKey]/route.ts
similarity index 100%
rename from src/app/(app)/api/meshcore/node/[publicKey]/route.ts
rename to src/app/api/meshcore/node/[publicKey]/route.ts
diff --git a/src/app/(app)/api/meshcore/search/route.ts b/src/app/api/meshcore/search/route.ts
similarity index 100%
rename from src/app/(app)/api/meshcore/search/route.ts
rename to src/app/api/meshcore/search/route.ts
diff --git a/src/app/(app)/api/stats/nodes-over-time/route.ts b/src/app/api/stats/nodes-over-time/route.ts
similarity index 100%
rename from src/app/(app)/api/stats/nodes-over-time/route.ts
rename to src/app/api/stats/nodes-over-time/route.ts
diff --git a/src/app/(app)/api/stats/popular-channels/route.ts b/src/app/api/stats/popular-channels/route.ts
similarity index 100%
rename from src/app/(app)/api/stats/popular-channels/route.ts
rename to src/app/api/stats/popular-channels/route.ts
diff --git a/src/app/(app)/api/stats/repeater-prefixes/route.ts b/src/app/api/stats/repeater-prefixes/route.ts
similarity index 100%
rename from src/app/(app)/api/stats/repeater-prefixes/route.ts
rename to src/app/api/stats/repeater-prefixes/route.ts
diff --git a/src/app/(app)/api/stats/total-nodes/route.ts b/src/app/api/stats/total-nodes/route.ts
similarity index 100%
rename from src/app/(app)/api/stats/total-nodes/route.ts
rename to src/app/api/stats/total-nodes/route.ts
diff --git a/src/app/(app)/globals.css b/src/app/globals.css
similarity index 100%
rename from src/app/(app)/globals.css
rename to src/app/globals.css
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..90da1d5
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,54 @@
+import type { Metadata, Viewport } from "next";
+import { Geist, Geist_Mono } from "next/font/google";
+import "./globals.css";
+import { ConfigProvider } from "@/components/ConfigContext";
+import { QueryProvider } from "@/components/QueryProvider";
+
+const geistSans = Geist({
+ variable: "--font-geist-sans",
+ subsets: ["latin"],
+});
+
+const geistMono = Geist_Mono({
+ variable: "--font-geist-mono",
+ subsets: ["latin"],
+});
+
+export const metadata: Metadata = {
+ title: "MeshExplorer",
+ description: "A real-time map, chat client, and packet analysis tool for mesh networks using MeshCore and Meshtastic.",
+ icons: {
+ icon: { url: "/favicon.svg", type: "image/svg+xml" },
+ apple: { url: "/favicon.svg", type: "image/svg+xml" }
+ },
+};
+
+export const viewport: Viewport = {
+ themeColor: [
+ { media: "(prefers-color-scheme: light)", color: "oklch(92.2% 0 0)" }, // neutral-200
+ { media: "(prefers-color-scheme: dark)", color: "oklch(26.9% 0 0)" }, //neutral-800
+ ],
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+
+ {children}
+
+
+
+
+
+ );
+}
diff --git a/src/app/(app)/not-found.tsx b/src/app/not-found.tsx
similarity index 100%
rename from src/app/(app)/not-found.tsx
rename to src/app/not-found.tsx