| 41-diagrams-icons-theme-engine |
01 |
api |
| culori |
| resvg |
| svgo |
| wcag-contrast |
| playwright-core |
| shadcn |
| sse |
| content-jobs |
|
| phase |
provides |
| 40-job-infrastructure |
content_jobs table, renderContent stub, SSE events, contentJobRunner.dispatch, content-job routes |
|
|
| culori, @resvg/resvg-js, wcag-contrast, svgo, playwright-core installed in server |
| server/src/services/renderers/types.ts — RenderResult, DiagramBundle, IconSetBundle, ThemePaletteBundle, PaletteRole, ContentBundle |
| content-job-runner switch dispatching diagram/icon-set/theme-palette to renderer imports |
| stub renderer files |
| diagram-renderer.ts, icon-renderer.ts, theme-renderer.ts (ready for Phase 41 plans 02-04) |
|
| ui/src/api/contentJobs.ts — submitContentJob, getContentJob, getContentJobAsset |
| ui/src/hooks/useContentJob.ts — submit, reset, SSE progress tracking |
| ui/src/components/ui/progress.tsx and toggle.tsx (shadcn) |
|
| 41-02-diagram |
| 41-03-icon |
| 41-04-theme |
| 41-05-ui-generator |
| 41-06-ui-theme |
|
| added |
patterns |
| culori |
| @resvg/resvg-js |
| wcag-contrast |
| svgo |
| playwright-core@1.58.2 |
|
| Dynamic import renderer dispatch: switch(jobType) { case 'x': const { fn } = await import('./renderers/x-renderer.js') } |
| useContentJob hook: companyId parameter, submit/reset, EventSource SSE, progress = queued:5% / running:50% / done:100% |
| culori ESM (converter/formatHex) works directly under NodeNext — no fn/ import needed |
|
|
| created |
modified |
| server/src/services/renderers/types.ts |
| server/src/services/renderers/diagram-renderer.ts |
| server/src/services/renderers/icon-renderer.ts |
| server/src/services/renderers/theme-renderer.ts |
| ui/src/api/contentJobs.ts |
| ui/src/hooks/useContentJob.ts |
| ui/src/components/ui/progress.tsx |
| ui/src/components/ui/toggle.tsx |
|
| server/src/services/content-job-runner.ts |
| server/package.json |
| pnpm-lock.yaml |
|
|
| Renderer stub files created to satisfy tsc module resolution — plans 02-04 replace with real implementations |
| playwright-core@1.58.2 pinned to match @playwright/test version in root |
| culori ESM import confirmed working under NodeNext — no workaround needed |
|
| Renderer pattern: each renderer in server/src/services/renderers/{name}-renderer.ts, exports async function with RenderResult return type |
| UI hook pattern: useContentJob(companyId) — accept companyId as parameter (not from context) matching other hooks in codebase |
|
| DIAG-01 |
| DIAG-02 |
| ICON-01 |
| THEME-01 |
|
15min |
2026-04-04 |