Add centralized icon factory (icons.ts) with 36 Lucide SVG icons
using createIcon() that returns properly attributed SVGSVGElements
with currentColor stroke for CSS color inheritance.
Replace all Unicode emoji characters across 25+ component files with
clean, consistent Lucide stroke icons. Add icon toggle states for
voice controls (mic/mic-off, headphones/headphones-off, camera/
camera-off). Show camera status icon in voice user rows.
Fix pre-existing XSS in DeleteChannelModal (innerHTML with channel
name). Migrate inline SVG in CertMismatchModal to createIcon().
Update CSS: add .icon base class, .icon-spin animation for loader,
remove obsolete .vu-icon-crossed styles, adjust containers for SVG
children. Add .vu-status class for camera indicator in voice rows.
Update 3 broken test assertions, add icons.ts unit tests (all 1089
tests pass).
Server:
- Enforce category-type validation: text/announcement only under text categories,
voice only under voice categories (400 on mismatch)
- Admin panel category field changed to dropdown with auto-filtered type options
- Default setup creates both Text Channels and Voice Channels categories
Client:
- Add create/edit/delete channel modals (admin/owner only)
- "+" button on category headers to create channels with pre-filled category
- Right-click context menu on channels for edit/delete
- Mouse-based drag-and-drop reordering within categories
- Admin API methods: adminCreateChannel, adminUpdateChannel, adminDeleteChannel
- Immediate local store update on reorder for instant feedback
Tests: 7 server integration tests, 31 client unit tests (create/edit/delete modals)