Spaces:
Running
User Story 003: Interactive React Demo
Story
As a potential lerobot.js user exploring the library capabilities
I want an interactive web demo with a modern, polished UI
So that I can easily test robot calibration features and understand the library's potential before integrating it into my own projects
Background
While lerobot.js provides platform-agnostic robotics functionality, we need a compelling demo interface to showcase its web capabilities. The current development setup uses Vite with basic HTML/CSS, but lacks the polish needed to demonstrate professional robotics applications.
The Python lerobot ecosystem includes various visualization tools and demos. For lerobot.js, we need a modern web demo that:
- Showcases the existing web calibration functionality from User Story 002
- Provides an intuitive UI for robot setup and calibration
- Demonstrates real-time robot interaction capabilities
- Serves as a reference implementation for web integration
Critical Requirement: React, Tailwind, and shadcn/ui should be development dependencies only - the core lerobot library must remain framework-agnostic so users can integrate it with any frontend framework or vanilla JavaScript.
Acceptance Criteria
Core Demo Features
- Robot Calibration Interface: Modern UI for SO-100 follower/leader calibration
- Port Selection: Intuitive Web Serial API port selection with visual feedback
- Calibration Progress: Real-time progress indicators during calibration procedures
- Configuration Display: View and manage saved calibration configurations
- Error Handling: User-friendly error messages and recovery suggestions
- Responsive Design: Works on desktop, tablet, and mobile devices
UI/UX Requirements
- Modern Design: Clean, professional interface using Tailwind 4 and shadcn/ui
- Brand Consistency: Consistent with Hugging Face design language
- Accessibility: WCAG 2.1 AA compliant interface
- Dark/Light Mode: Theme switching support
- Loading States: Smooth loading and transition animations
- Visual Feedback: Clear status indicators for connection, calibration, and errors
Technical Requirements
- Framework Isolation: React used only for demo, core library remains framework-agnostic
- Development Only: React/Tailwind/shadcn as devDependencies, not regular dependencies
- Vite Integration: Seamless integration with existing Vite development setup
- TypeScript: Full type safety throughout React components
- Build Separation: Demo build separate from library build
- Tree Shaking: Demo dependencies excluded from library builds
Library Integration
- Web API Usage: Demonstrates proper usage of lerobot web APIs
- Error Boundaries: Robust error handling that doesn't break the demo
- Performance: Smooth interaction without blocking the UI thread
- Real Hardware: Demo works with actual SO-100 hardware via Web Serial API
Expected User Flow
Development Experience
# Install demo dependencies (includes React, Tailwind, shadcn/ui as devDependencies)
$ pnpm install
# Start development server with React demo
$ pnpm run dev
# Opens modern React interface at http://localhost:5173
Demo Interface Flow
- Landing Page: Clean introduction to lerobot.js with call-to-action buttons
- Robot Setup: Card-based interface for selecting robot type (SO-100 follower/leader)
- Port Connection:
- Click "Connect Robot" button
- Browser shows Web Serial API port selection dialog
- Visual feedback shows connection status
- Calibration Interface:
- Step-by-step calibration wizard
- Progress indicators and instructions
- Real-time motor position feedback (if applicable)
- Results Display:
- Success confirmation with visual feedback
- Option to download configuration file
- Suggestions for next steps
Error Handling Flow
- No Web Serial Support: Clear message with browser compatibility info
- Connection Failed: Troubleshooting steps with visual aids
- Calibration Errors: Descriptive error messages with retry options
- Permission Denied: Guide user through browser permission setup
Implementation Details
Project Structure Changes
lerobot.js/
βββ src/
β βββ demo/ # Demo-specific React components (new)
β β βββ components/
β β β βββ ui/ # shadcn/ui components
β β β βββ CalibrationWizard.tsx
β β β βββ RobotCard.tsx
β β β βββ ConnectionStatus.tsx
β β β βββ ErrorBoundary.tsx
β β βββ pages/
β β β βββ Home.tsx
β β β βββ Setup.tsx
β β β βββ Calibrate.tsx
β β βββ hooks/
β β β βββ useRobotConnection.ts
β β β βββ useCalibration.ts
β β βββ App.tsx
β β βββ main.tsx
β βββ lerobot/ # Core library (unchanged)
β β βββ web/
β β βββ node/
β βββ main.ts # Original Vite entry (unchanged)
βββ index.html # Updated to load React demo
βββ demo.html # New: Vanilla JS demo option
βββ lib.html # New: Library-only demo
Package.json Changes
{
"scripts": {
"dev": "vite --mode demo", // Runs React demo
"dev:vanilla": "vite --mode vanilla", // Runs vanilla demo
"dev:lib": "vite --mode lib", // Library-only mode
"build": "tsc && vite build --mode lib", // Library build (no React)
"build:demo": "tsc && vite build --mode demo" // Demo build (with React)
},
"devDependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"tailwindcss": "^4.0.0",
"@tailwindcss/typography": "^0.5.0",
"autoprefixer": "^10.4.0",
"postcss": "^8.4.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"tailwind-merge": "^2.0.0",
"lucide-react": "^0.400.0"
}
}
Vite Configuration
// vite.config.ts
export default defineConfig(({ mode }) => {
const baseConfig = {
plugins: [typescript()],
build: {
lib: {
entry: "src/main.ts",
name: "LeRobot",
fileName: "lerobot",
},
},
};
if (mode === "demo") {
return {
...baseConfig,
plugins: [...baseConfig.plugins, react()],
css: {
postcss: {
plugins: [tailwindcss, autoprefixer],
},
},
build: {
// Demo-specific build configuration
outDir: "dist/demo",
rollupOptions: {
input: {
main: "index.html",
},
},
},
};
}
return baseConfig; // Library-only build
});
Key Dependencies
Demo-Only Dependencies (devDependencies)
- React 18: Latest stable React with concurrent features
- Tailwind CSS 4: Latest Tailwind with modern CSS features
- shadcn/ui: High-quality React component library
- Lucide React: Modern icon library
- class-variance-authority: For component variant management
- clsx + tailwind-merge: For conditional class management
Build Tools
- @vitejs/plugin-react: React support for Vite
- PostCSS: CSS processing for Tailwind
- Autoprefixer: CSS vendor prefixing
React Components Architecture
Core Demo Components
// Demo-specific React hooks
function useRobotConnection() {
// Wraps lerobot web APIs in React-friendly hooks
// Manages connection state, error handling
}
function useCalibration() {
// Wraps lerobot calibration APIs
// Provides progress tracking, status updates
}
// Main calibration wizard component
function CalibrationWizard({ robotType }: { robotType: string }) {
const { connect, disconnect, status } = useRobotConnection();
const { calibrate, progress, error } = useCalibration();
// Multi-step wizard UI using shadcn/ui components
}
shadcn/ui Integration
- Button: Primary actions (Connect, Calibrate, Retry)
- Card: Robot selection, status displays, results
- Progress: Calibration progress indicators
- Alert: Error messages and warnings
- Badge: Status indicators (Connected, Calibrating, Error)
- Dialog: Confirmation dialogs and detailed error information
- Toast: Success/error notifications
Technical Considerations
Framework Isolation Strategy
- Separate Entry Points: Demo uses React, library uses vanilla TypeScript
- Build Modes: Vite modes for demo vs library builds
- Dependency Isolation: React in devDependencies, excluded from library bundle
- Type Safety: Shared types between demo and library, but no runtime dependencies
Tailwind 4 Integration
- New CSS Engine: Leverage Tailwind 4's improved performance
- Container Queries: Responsive components using container queries
- Modern CSS: CSS Grid, flexbox, custom properties integration
- Optimization: Automatic unused CSS elimination
Performance Considerations
- Code Splitting: Lazy load calibration components
- Bundle Size: Demo bundle separate from library bundle
- Web Serial API: Non-blocking serial communication
- Error Boundaries: Prevent component crashes from breaking entire demo
Accessibility
- Keyboard Navigation: Full keyboard support for all interactions
- Screen Readers: Proper ARIA labels and descriptions
- Color Contrast: WCAG AA compliant color schemes
- Focus Management: Proper focus handling during async operations
Testing Strategy
Integration Testing
- Library Integration: Verify demo correctly uses lerobot APIs
- Build Testing: Ensure library builds don't include React
- Browser Compatibility: Test Web Serial API across supported browsers
Definition of Done
- Functional Demo: Interactive React demo showcases robot calibration
- Modern UI: Professional interface using Tailwind 4 and shadcn/ui
- Framework Isolation: React isolated to demo only, library remains framework-agnostic
- Build Separation: Library builds exclude React dependencies
- Browser Compatibility: Works in Chrome, Edge, and other Chromium browsers
- Responsive Design: Works across desktop, tablet, and mobile devices
- Accessibility: WCAG 2.1 AA compliant interface
- Error Handling: Graceful error handling with user-friendly messages
- Documentation: Demo usage documented in README
- Performance: Smooth interactions, fast loading times
- Type Safety: Full TypeScript coverage for demo components
- Real Hardware: Successfully calibrates actual SO-100 hardware via Web Serial API