Implement M1 authoring loop: library, editor, live preview, persistence

M1 MVP from docs/IMPLEMENTATION-PLAN.md, with the /alignment pass applied.

- core: Snippet model + factory; prepareSpecForRender (copy-not-mutate); per-theme Vega chart config
- state/orchestration: SnippetStore with debounced auto-save; IndexedDB adapter + read-time migration; startup hydration + write-through persistence
- ui: SnippetLibrary, SpecEditor (Monaco edcore.main — full editor features, JSON-only languages), LivePreview
- build: Monaco/Vega manual chunks; raised PWA precache ceiling
- alignment: flush a valid draft on snippet switch (+regression tests); TODO breadcrumbs for the preview render race and the window.confirm delete
- housekeeping: gitignore .claude/projects/
This commit is contained in:
2026-06-05 00:16:24 +03:00
parent 056644450c
commit ca54bb66b1
34 changed files with 1557 additions and 74 deletions
+6
View File
@@ -1,5 +1,6 @@
import { createRoot } from 'react-dom/client';
import { App } from './app/App';
import { initApp } from './app/orchestration/startup';
import { useAppStore } from './app/stores/AppStore';
import '../styles/base.css';
@@ -13,4 +14,9 @@ useAppStore.subscribe((state, prev) => {
if (state.uiTheme !== prev.uiTheme) applyTheme(state.uiTheme);
});
// Load the library from IndexedDB (seeding a sample on first run) and wire
// persistence. Fire-and-forget: the UI renders immediately and fills in when
// hydration resolves.
void initApp();
createRoot(document.getElementById('app')!).render(<App />);