English
Monorepo Structure
NavSlides Editor uses npm workspaces. Each top-level package owns one concern. For the annotated codebase tour, see docs/codebase-summary.md.
Workspace map
NavSlidesEditor/
├── client/ # React SPA (Vite) → client/dist/ in production
├── server/ # Express REST API + Socket.IO
├── shared/ # Pure Node.js utilities (client + server)
└── electron/ # Desktop shell embedding the serverWhere things live
client/src/
pages/— route components:EditorPage,HomePage,LiveViewPage,SpeakerViewPage, settings, explore, game joincomponents/—SlideCanvas,PropertiesPanel,SlidePanel, theribbon/UI, and modalsstores/— Zustand state:editor-store,presentation-store,ui-storehooks/—use-keyboard,use-clipboard,use-live-presentation, and moreextensions/— TipTap extensions (FontSize, FontFamily, MathExtension, …)data/—element-defaults.jsis the canonical list of the 19 element types
server/
index.js— wires up Express and imports modular routesroutes/—presentations,templates,share,upload,github,sync,history,media,live,pptx-import,ai, game endpoints, …services/—storage(file-based JSON),socket-handler,live-rooms,pptx-exporter, thepptx-import/pipeline, AI provider + guarddata/+uploads/— runtime storage (JSON files + media), created on first run
shared/src/
htmlGenerator.js+element-renderers.js— JSON → reveal.js HTMLshapeUtils.js,presenterTools.js,content-safety.js, andshared-*color/text/PPTX helperstheme-presets.js— the 39 design presets;fx/— the 8 animated backgrounds
The shared symlink
Because shared is an npm workspace, client and server import it as a normal dependency (revealjs-shared). Any logic used by both sides belongs here — never copy it into one package.
See also: Architecture · Contributing.