--- id: TASK-41 title: Build dynamic Shape Registry to replace hardcoded switch statements status: To Do assignee: [] created_date: '2026-02-18 20:06' labels: - infrastructure - phase-0 - ecosystem milestone: m-1 dependencies: [] references: - rspace-online/lib/folk-shape.ts - rspace-online/website/canvas.html - rspace-online/lib/community-sync.ts priority: high --- ## Description Replace the 170-line switch statement in canvas.html's `createShapeElement()` and the 100-line type-switch in community-sync.ts's `#updateShapeElement()` with a dynamic ShapeRegistry. Create lib/shape-registry.ts with: - ShapeRegistration interface (tagName, elementClass, defaults, category, portDescriptors, eventDescriptors) - ShapeRegistry class with register(), createElement(), updateElement(), listAll(), getByCategory() - Each folk-*.ts gets a static `registration` property and static `fromData()` method This is the prerequisite for all other ecosystem features (pipes, events, groups, nesting, embedding). ## Acceptance Criteria - [ ] #1 ShapeRegistry class created with register/createElement/updateElement methods - [ ] #2 All 30+ folk-*.ts shapes have static registration property - [ ] #3 canvas.html switch statement replaced with registry.createElement() - [ ] #4 community-sync.ts type-switch replaced with registry.updateElement() - [ ] #5 All existing shapes still create and sync correctly - [ ] #6 No regression in shape creation or remote sync