From fbc8a3fb03fe6a6c36453e2c57e8d6f1532f96bc Mon Sep 17 00:00:00 2001 From: a2nr Date: Fri, 21 Aug 2026 23:27:37 +0700 Subject: [PATCH] feat(content-editor): dynamic tabs for C/Python/circuit preview Add dynamic chrome tabs based on previewActiveTabs from markdown parsing. When teacher writes ---INITIAL_CODE--- or ---INITIAL_PYTHON--- blocks, the corresponding C/Python tab appears with read-only code preview. - Widen activeTab type to string for dynamic tab IDs - Extract code blocks client-side from raw markdown body - Render chrome tabs dynamically from allTabs derived state - Auto-switch away from invalid tabs when preview updates --- .../src/lib/services/contentEditor.svelte.ts | 3 + .../src/routes/teacher/content/+page.svelte | 438 ++++++++++++++---- 2 files changed, 340 insertions(+), 101 deletions(-) diff --git a/frontend/src/lib/services/contentEditor.svelte.ts b/frontend/src/lib/services/contentEditor.svelte.ts index 857b501..765dd30 100644 --- a/frontend/src/lib/services/contentEditor.svelte.ts +++ b/frontend/src/lib/services/contentEditor.svelte.ts @@ -24,6 +24,9 @@ export class ContentEditorManager { mobileMode = $state<'hidden' | 'h30' | 'h50' | 'h70' | 'full'>('hidden'); isMobile = $state(false); + // Tab state — 'editor' | 'preview' | 'exercise' | 'quiz' | dynamic tabs from active_tabs ('c', 'python', 'circuit', 'velxio', 'flowchart') + activeTab = $state('editor'); + // Tree state contentTree = $state([]); assetsTree = $state([]); diff --git a/frontend/src/routes/teacher/content/+page.svelte b/frontend/src/routes/teacher/content/+page.svelte index 52728cf..c1886cb 100644 --- a/frontend/src/routes/teacher/content/+page.svelte +++ b/frontend/src/routes/teacher/content/+page.svelte @@ -1,6 +1,6 @@