Skip to content

Commit 0aa965d

Browse files
committed
feat(apps): add procedural Map Builder
Document-based fantasy/modern map editor: paint terrain, draw splines (coast, river, road, rail, wall, zone), stamp 1000+ procedural Canvas2D sprites across nature, medieval, modern, transit, symbols and decoration, and place text labels. Includes layers, live themes, undo/redo, autosave and PNG export. Wires the /apps/map-builder route and adds the apps.json registry entry.
1 parent 5d5c1cb commit 0aa965d

31 files changed

Lines changed: 15182 additions & 0 deletions

public/apps/apps.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,14 @@
603603
"icon": "MapTrifoldIcon",
604604
"created_at": "2025-12-25T14:00:00+03:00"
605605
},
606+
{
607+
"slug": "map-builder",
608+
"to": "/apps/map-builder",
609+
"title": "Map Builder",
610+
"description": "Hands-on builder for modern & medieval maps: paint terrain, draw coastlines, roads & walls, and stamp 1000+ procedural sprites onto an infinite canvas. Export PNG.",
611+
"icon": "MapTrifoldIcon",
612+
"created_at": "2026-06-28T12:00:00+03:00"
613+
},
606614
{
607615
"slug": "fractal-flora",
608616
"to": "/apps/fractal-flora",

src/components/AnimatedRoutes.jsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,9 @@ const FantasyMapGeneratorPage = lazy(
200200
const CRTTacticalMapPage = lazy(
201201
() => import('../pages/apps/CRTTacticalMapPage'),
202202
);
203+
const MapBuilderPage = lazy(
204+
() => import('../pages/apps/map-builder/MapBuilderPage'),
205+
);
203206
const PosterLoomPage = lazy(() => import('../pages/apps/PosterLoomPage'));
204207
const MagazinerPage = lazy(() => import('../pages/apps/MagazinerPage'));
205208
const WallpaperEnginePage = lazy(
@@ -2816,6 +2819,22 @@ const AnimatedRoutes = ({
28162819
</motion.div>
28172820
}
28182821
/>
2822+
<Route
2823+
path="/apps/map-builder"
2824+
element={
2825+
<motion.div
2826+
initial="initial"
2827+
animate="in"
2828+
exit="out"
2829+
variants={pageVariants}
2830+
transition={pageTransition}
2831+
>
2832+
<Suspense fallback={<Loading />}>
2833+
<MapBuilderPage />
2834+
</Suspense>
2835+
</motion.div>
2836+
}
2837+
/>
28192838
<Route
28202839
path="/apps/poster-loom"
28212840
element={

0 commit comments

Comments
 (0)