- Sidebar becomes off-canvas drawer on mobile (<lg), slides in/out
- Mobile top bar with hamburger menu and current page title
- Backdrop overlay when drawer is open, ESC to close
- All tables wrapped in overflow-x-auto with min-width for scroll
- Search/filter bars stack vertically on small screens
- Content padding scales: p-4 (mobile) → p-6 (tablet) → p-8 (desktop)
- Body scroll locked when mobile drawer is open
- Custom color system (surface-0..4, accent, mint) replacing raw gray-xxx
- Inter + JetBrains Mono fonts via Google Fonts
- Refined sidebar: compact logo, geometric icons, subtle active states
- Fixed bg-gray-850 bug (invalid Tailwind class) in 9 components
- Polished login page with centered card + gradient logo
- Unified card/table/button/input styling across all components
- Subtle grain texture overlay for depth
- Smoother animations (fade-in, slide-up)
- RefCombobox infers object_type from param name when not explicitly set
- e.g. param 'agent' automatically shows only agent-type objects
- Also fixed engine type signature to preserve object_type in params
小橘 🍊(NEKO Team)
- Add ValidationError class for client-side input errors
- POST /events: ref format, type mismatch, nonexistent type → 400
- POST /objects: undefined type → 400
- POST /event-defs: schema validation → 400
- POST /projection-defs: value_schema, initial_value, source validation → 400
- All API handlers: catch ValidationError → 400 INVALID_INPUT
- Update 10 test cases to expect 400 + INVALID_INPUT