Frontend Implementation Roadmap¶
ClearPath & FairWins Platform Suite¶
Target Architecture: Fully-featured prediction market and DAO governance platform with complete design system implementation and smart contract integration.
Reference Documents: - DESIGN_GUIDE.md - Design system and brand guidelines - FRONTEND_BUILD_BOOK.md - Technical implementation patterns - UX_REBRANDING_REVIEW.md - UX principles and accessibility requirements
Table of Contents¶
- Asset Inventory
- Phase 1: Design System Foundation
- Phase 2: Core Components
- Phase 3: Page Components
- Phase 4: Advanced Features
- Phase 5: Smart Contract Integration
- Phase 6: Testing & Optimization
Asset Inventory¶
Existing Components ✅¶
Current implementation status:
Application Shells - [x] App.jsx - Root component with wallet connection - [x] App.css - Global styles - [x] ClearPathApp.jsx - ClearPath platform container - [x] ClearPathApp.css - ClearPath styles - [x] FairWinsApp.jsx - FairWins platform container - [x] FairWinsApp.css - FairWins styles
Navigation & Layout - [x] PlatformSelector.jsx - Platform selection screen - [x] PlatformSelector.css - Platform selector styles - [x] LandingPage.jsx - Landing page component - [x] LandingPage.css - Landing page styles - [x] Dashboard.jsx - Dashboard layout - [x] Dashboard.css - Dashboard styles
Proposal Management - [x] ProposalSubmission.jsx - Proposal creation form - [x] ProposalList.jsx - Proposal listing - [x] ProposalDashboard.jsx - Proposal overview - [x] ProposalDashboard.css - Proposal dashboard styles
Market & Trading - [x] MarketTrading.jsx - Market trading interface - [x] WelfareMetrics.jsx - Welfare metrics display - [x] MetricsDashboard.jsx - Metrics overview - [x] MetricsDashboard.css - Metrics dashboard styles
DAO Management - [x] DAOLaunchpad.jsx - DAO creation interface - [x] DAOLaunchpad.css - DAO launchpad styles - [x] DAOList.jsx - DAO listing - [x] DAOList.css - DAO list styles
Components to Create 🔲¶
Base UI Components (Design System) - [ ] Button.jsx - Reusable button component (primary, secondary, danger variants) - [ ] Button.css - Button styles with all states - [ ] Card.jsx - Reusable card component - [ ] Card.css - Card styles with hover effects - [ ] Input.jsx - Form input component - [ ] Input.css - Input styles with validation states - [ ] Select.jsx - Dropdown select component - [ ] Select.css - Select styles - [ ] Badge.jsx - Status badge component - [ ] Badge.css - Badge styles (success, warning, danger) - [ ] Modal.jsx - Modal dialog component - [ ] Modal.css - Modal styles with backdrop - [ ] Tooltip.jsx - Tooltip component - [ ] Tooltip.css - Tooltip styles
Feedback Components - [ ] LoadingSpinner.jsx - Loading indicator - [ ] LoadingSpinner.css - Spinner animation - [ ] SkeletonCard.jsx - Skeleton loading placeholder - [ ] SkeletonCard.css - Skeleton animation - [ ] Toast.jsx - Toast notification component - [ ] Toast.css - Toast styles with animations - [ ] ErrorBoundary.jsx - Error boundary wrapper - [ ] EmptyState.jsx - Empty state display - [ ] EmptyState.css - Empty state styles
Web3 Components - [ ] WalletConnect.jsx - Wallet connection button/modal - [ ] WalletConnect.css - Wallet UI styles - [ ] NetworkIndicator.jsx - Network status indicator - [ ] NetworkIndicator.css - Network indicator styles - [ ] TransactionStatus.jsx - Transaction progress display - [ ] TransactionStatus.css - Transaction status styles - [ ] AddressDisplay.jsx - Formatted address display - [ ] GasEstimate.jsx - Gas fee display - [ ] GasEstimate.css - Gas estimate styles
Form Components - [ ] FormGroup.jsx - Form field wrapper - [ ] FormGroup.css - Form group styles - [ ] FormValidation.jsx - Validation helper - [ ] InlineError.jsx - Inline error message - [ ] InlineError.css - Error message styles - [ ] HelperText.jsx - Helper text component - [ ] CheckboxGroup.jsx - Checkbox group component - [ ] RadioGroup.jsx - Radio button group component
Market Components - [ ] MarketCard.jsx - Individual market display - [ ] MarketCard.css - Market card styles - [ ] TradingPanel.jsx - Trading interface panel - [ ] TradingPanel.css - Trading panel styles - [ ] PriceChart.jsx - Price chart visualization - [ ] PriceChart.css - Chart styles - [ ] OrderBook.jsx - Order book display - [ ] OrderBook.css - Order book styles - [ ] PositionCard.jsx - User position display - [ ] PositionCard.css - Position card styles
Proposal Components - [ ] ProposalCard.jsx - Individual proposal display - [ ] ProposalCard.css - Proposal card styles - [ ] ProposalForm.jsx - Enhanced proposal creation form - [ ] ProposalForm.css - Proposal form styles - [ ] ProposalTimeline.jsx - Proposal lifecycle timeline - [ ] ProposalTimeline.css - Timeline styles - [ ] VotingInterface.jsx - Voting UI component - [ ] VotingInterface.css - Voting interface styles
DAO Components - [ ] DAOCard.jsx - Individual DAO display - [ ] DAOCard.css - DAO card styles - [ ] DAOSettings.jsx - DAO configuration panel - [ ] DAOSettings.css - Settings panel styles - [ ] TreasuryDisplay.jsx - Treasury overview - [ ] TreasuryDisplay.css - Treasury styles - [ ] MemberList.jsx - DAO member listing - [ ] MemberList.css - Member list styles
Analytics Components - [ ] MetricCard.jsx - Individual metric display - [ ] MetricCard.css - Metric card styles - [ ] ChartWidget.jsx - Chart widget component - [ ] ChartWidget.css - Chart widget styles - [ ] StatsSummary.jsx - Statistics summary - [ ] StatsSummary.css - Stats summary styles
Utilities to Create 🔲¶
Helper Functions - [ ] utils/formatAddress.js - Address formatting utility - [ ] utils/formatCurrency.js - Currency formatting - [ ] utils/formatDate.js - Date/time formatting - [ ] utils/validation.js - Form validation helpers - [ ] utils/ethereum.js - Ethereum utility functions - [ ] utils/errors.js - Error handling utilities
Custom Hooks - [ ] hooks/useWallet.js - Wallet connection hook - [ ] hooks/useContract.js - Contract interaction hook - [ ] hooks/useTransaction.js - Transaction state hook - [ ] hooks/useBalance.js - Balance fetching hook - [ ] hooks/usePolling.js - Data polling hook - [ ] hooks/useWindowSize.js - Window size hook - [ ] hooks/useLocalStorage.js - Local storage hook - [ ] hooks/useDebounce.js - Debounce hook
Context Providers - [ ] contexts/Web3Context.js - Web3 provider context - [ ] contexts/ThemeContext.js - Theme management context - [ ] contexts/ToastContext.js - Toast notification context - [ ] contexts/ModalContext.js - Modal management context
Constants & Configuration - [ ] config/contracts.js - Contract addresses and ABIs - [ ] config/networks.js - Network configurations - [ ] config/constants.js - Application constants - [ ] config/theme.js - Theme tokens
Static Assets 🔲¶
Images & Icons - [ ] Icon set (SVG icons for common actions) - [ ] Loading animations - [ ] Illustration assets for empty states - [ ] Platform logo variants
Documentation - [ ] Component usage examples - [ ] Storybook setup (optional) - [ ] API documentation
Phase 1: Design System Foundation¶
Goal: Establish core design tokens and base styles Timeline: Week 1
Tasks¶
1.1 Setup Design Tokens¶
- Create theme.css with CSS custom properties
- Color palette variables
- Typography scale variables
- Spacing scale variables
- Border radius tokens
- Shadow tokens
- Transition tokens
- Test dark/light theme switching
- Document token usage
Acceptance Criteria: - All colors defined as CSS variables - Typography scale matches design guide - Tokens accessible via var(--token-name)
1.2 Base Styles & Reset¶
- Update index.css with modern CSS reset
- Add global typography styles
- Add focus-visible styles for accessibility
- Add prefers-reduced-motion support
- Test across browsers
Acceptance Criteria: - Consistent rendering across Chrome, Firefox, Safari - Keyboard focus indicators visible - Reduced motion respected
1.3 Typography System¶
- Create typography utility classes
- Test type scale at different viewport sizes
- Verify WCAG 2.1 AA contrast ratios
- Document typography patterns
Acceptance Criteria: - All text meets 4.5:1 contrast minimum - Responsive font sizes work on mobile/desktop - Line heights optimize for readability
Phase 2: Core Components¶
Goal: Build reusable base components Timeline: Weeks 2-3
Tasks¶
2.1 Button Component¶
- Create Button.jsx with variants (primary, secondary, danger)
- Create Button.css with all states (hover, active, disabled, loading)
- Add accessibility attributes (aria-label, aria-busy)
- Add loading state with spinner
- Test keyboard navigation
- Write usage documentation
Acceptance Criteria: - All 3 variants render correctly - Loading state shows spinner - Disabled state prevents interaction - Keyboard accessible (Enter/Space activates) - Passes Lighthouse accessibility audit
Integration: Use in all forms (proposal submission, DAO creation, trading)
2.2 Card Component¶
- Create Card.jsx with header/body/footer slots
- Create Card.css with hover elevation effect
- Add optional variants (outlined, filled)
- Test responsive behavior
- Document card patterns
Acceptance Criteria: - Hover effect: translateY(-4px) + shadow - Works with different content types - Responsive on mobile devices
Integration: Use for proposal cards, market cards, DAO cards
2.3 Form Input Components¶
- Create Input.jsx (text, number, email, tel)
- Create Input.css with validation states
- Create Select.jsx for dropdowns
- Create FormGroup.jsx for label/input/help/error layout
- Add validation feedback
- Test with screen readers
Acceptance Criteria: - All input types supported - Validation states: default, error, success - Proper ARIA labels and descriptions - Error messages announced to screen readers
Integration: Use in ProposalSubmission, DAOLaunchpad, TradingPanel
2.4 Modal Component¶
- Create Modal.jsx with backdrop
- Create Modal.css with animations
- Add keyboard trap (focus stays in modal)
- Add ESC key to close
- Test accessibility
Acceptance Criteria: - Focus trapped inside modal when open - ESC key closes modal - Click outside closes modal - Focus returns to trigger element on close
Integration: Use for transaction confirmations, wallet connection
2.5 Toast Notification System¶
- Create Toast.jsx with variants (success, error, warning, info)
- Create Toast.css with enter/exit animations
- Create ToastContext.js for global toast management
- Add auto-dismiss timer
- Test ARIA live regions
Acceptance Criteria: - Toasts announced to screen readers - Multiple toasts stack properly - Auto-dismiss after 5 seconds - Manual dismiss option available
Integration: Use for transaction feedback, error messages
2.6 Loading States¶
- Create LoadingSpinner.jsx
- Create SkeletonCard.jsx for content placeholders
- Create skeleton variants for different content types
- Test with prefers-reduced-motion
Acceptance Criteria: - Spinner animation smooth (60fps) - Skeleton preserves layout during loading - Respects reduced motion preference
Integration: Use in all data-fetching components
Phase 3: Page Components¶
Goal: Enhance existing pages with new components Timeline: Weeks 4-5
Tasks¶
3.1 Enhanced Proposal Pages¶
- Refactor ProposalSubmission.jsx to use new form components
- Create ProposalCard.jsx for list display
- Create ProposalTimeline.jsx for lifecycle visualization
- Add inline validation to proposal form
- Add gas estimate display
- Test proposal creation flow end-to-end
Acceptance Criteria: - Form validates before submission - Gas estimate shown before transaction - Success toast on successful submission - Proposal appears in list immediately (optimistic update)
Smart Contract Integration Points: - ProposalRegistry.submitProposal() - Event: ProposalSubmitted(proposalId, proposer, title)
3.2 Enhanced Market Pages¶
- Create MarketCard.jsx with price display
- Create TradingPanel.jsx with buy/sell interface
- Add PriceChart.jsx for market visualization
- Add PositionCard.jsx for user positions
- Implement real-time price updates (polling)
- Test trading flow
Acceptance Criteria: - Market prices update every 10 seconds - Trading panel shows current positions - Buy/sell buttons disabled when insufficient funds - Transaction status tracked through completion
Smart Contract Integration Points: - ConditionalMarketFactory.createMarket() - MarketMaker.buy() / MarketMaker.sell() - Events: TokenPurchased, TokenSold
3.3 Enhanced DAO Pages¶
- Create DAOCard.jsx for DAO listing
- Refactor DAOLaunchpad.jsx with new form components
- Create TreasuryDisplay.jsx for treasury overview
- Create MemberList.jsx for member display
- Add DAO settings panel
- Test DAO creation flow
Acceptance Criteria: - DAO creation form validates all inputs - Treasury display shows real-time balances - Member list paginated if >20 members - Settings panel allows parameter changes
Smart Contract Integration Points: - FutarchyGovernor.createDAO() - TreasuryManager.getBalance() - Events: DAOCreated, MemberAdded
3.4 Dashboard Enhancements¶
- Create MetricCard.jsx for metric display
- Create StatsSummary.jsx for overview
- Add ChartWidget.jsx for data visualization
- Implement dashboard data polling
- Add "last updated" timestamps
- Test responsive layout
Acceptance Criteria: - Dashboard loads within 2 seconds - All metrics show skeleton loading states - Data refreshes every 30 seconds - Responsive grid works on mobile/tablet/desktop
Smart Contract Integration Points: - WelfareMetricRegistry.getMetrics() - ProposalRegistry.getProposalCount() - MarketMaker.getTotalVolume()
Phase 4: Advanced Features¶
Goal: Implement advanced UX features Timeline: Weeks 6-7
Tasks¶
4.1 Transaction Management¶
- Create TransactionStatus.jsx modal
- Add transaction progress indicator (3 states: submitted, pending, confirmed)
- Create transaction history sidebar
- Add transaction retry mechanism
- Test error scenarios
Acceptance Criteria: - User sees real-time transaction progress - Failed transactions show clear error messages - Transaction history persists in local storage - Retry works for failed transactions
4.2 Web3 Integration Enhancements¶
- Create WalletConnect.jsx modal
- Create NetworkIndicator.jsx with network switching
- Add AddressDisplay.jsx with copy-to-clipboard
- Implement automatic wallet reconnection
- Add network detection and warnings
Acceptance Criteria: - Multiple wallets supported (MetaMask, WalletConnect) - Wrong network shows clear warning - Wallet disconnection handled gracefully - Address shortened: 0x1234...5678
4.3 Real-time Updates¶
- Implement 10-second polling for active markets
- Add WebSocket support for events (if available)
- Create usePolling custom hook
- Add stale data indicators
- Test with multiple browser tabs
Acceptance Criteria: - Proposal list updates when new proposals submitted - Market prices update without page refresh - Polling pauses when tab not active - Stale data indicator shows age > 60 seconds
4.4 Form Validation & UX¶
- Add inline validation to all forms
- Create address validation with checksum
- Add balance checks before transactions
- Implement form autosave (local storage)
- Add field-level error messages
Acceptance Criteria: - Validation triggers on blur and on submit - Invalid Ethereum addresses rejected - Insufficient balance prevents submission - Form state restored after accidental navigation
4.5 Search & Filtering¶
- Add proposal search/filter
- Add market search/filter
- Add DAO search/filter
- Implement client-side sorting
- Add URL query parameters for filters
Acceptance Criteria: - Search works on title, description, creator - Filters: status, date range, category - Sorting: newest, oldest, most active - Filters persist in URL (shareable links)
Phase 5: Smart Contract Integration¶
Goal: Connect all components to blockchain Timeline: Week 8
Tasks¶
5.1 Contract Configuration¶
- Create config/contracts.js with all addresses
- Add contract ABIs to project
- Configure for multiple networks (local, testnet, mainnet)
- Test network switching
Acceptance Criteria: - Contracts load for correct network - ABIs imported correctly - Network switching updates contract addresses
5.2 Proposal Contract Integration¶
- Connect ProposalSubmission to ProposalRegistry.submitProposal()
- Connect ProposalList to ProposalRegistry.getProposal()
- Subscribe to ProposalSubmitted events
- Implement proposal state updates
- Test with real transactions
Acceptance Criteria: - Proposals submitted to blockchain successfully - Event listeners update UI in real-time - Error handling for reverted transactions - Gas estimates shown before submission
Contract Methods:
ProposalRegistry.submitProposal(title, description, amount, recipient, metricId)
ProposalRegistry.getProposal(proposalId)
ProposalRegistry.proposalCount()
event ProposalSubmitted(uint256 proposalId, address proposer, string title)
5.3 Market Contract Integration¶
- Connect TradingPanel to market contracts
- Implement buy/sell token functions
- Subscribe to trade events
- Add liquidity display
- Test trading flow
Acceptance Criteria: - Buy/sell transactions execute successfully - UI updates positions after trades - Price updates reflect trades - Slippage warnings shown
Contract Methods:
ConditionalMarketFactory.createMarket(proposalId, outcome)
MarketMaker.buy(tokenAddress, amount)
MarketMaker.sell(tokenAddress, amount)
event TokenPurchased(address buyer, uint256 amount, uint256 cost)
event TokenSold(address seller, uint256 amount, uint256 payout)
5.4 DAO Contract Integration¶
- Connect DAOLaunchpad to FutarchyGovernor
- Implement treasury balance fetching
- Add member management
- Subscribe to DAO events
- Test DAO lifecycle
Acceptance Criteria: - DAO creation transactions successful - Treasury balances displayed accurately - Member list fetched from blockchain - DAO parameter updates work
Contract Methods:
FutarchyGovernor.createDAO(name, token, votingPeriod)
FutarchyGovernor.addMember(daoId, member)
TreasuryManager.getBalance(daoId)
event DAOCreated(uint256 daoId, string name, address creator)
5.5 Oracle Integration¶
- Connect to OracleResolver for outcome resolution
- Display resolution status
- Add challenge mechanism UI
- Test resolution flow
Acceptance Criteria: - Resolution status displayed correctly - Challenge period countdown shown - Disputes can be submitted
Contract Methods:
OracleResolver.proposeResolution(proposalId, outcome)
OracleResolver.challengeResolution(proposalId, evidence)
event ResolutionProposed(uint256 proposalId, uint8 outcome)
5.6 Privacy Coordinator Integration¶
- Integrate with PrivacyCoordinator for encrypted voting
- Implement key-change mechanism
- Add zkSNARK proof generation (if applicable)
- Test privacy features
Acceptance Criteria: - Votes submitted via encrypted messages - Key changes update voting power - Privacy preserved during voting period
Contract Methods:
PrivacyCoordinator.submitEncryptedVote(proposalId, encryptedMessage)
PrivacyCoordinator.changeKey(oldKey, newKey)
event VoteSubmitted(address voter, bytes32 commitment)
Phase 6: Testing & Optimization¶
Goal: Ensure quality and performance Timeline: Weeks 9-10
Tasks¶
6.1 Accessibility Testing¶
- Run Lighthouse audit on all pages (target: 100 score)
- Test keyboard navigation on all components
- Test with NVDA/JAWS screen reader
- Verify WCAG 2.1 AA compliance
- Test with prefers-reduced-motion enabled
- Test on mobile with TalkBack/VoiceOver
Acceptance Criteria: - Lighthouse accessibility score ≥ 95 - All interactive elements keyboard accessible - No ARIA errors in axe DevTools - All images have alt text - Focus indicators visible on all elements
6.2 Responsive Testing¶
- Test on iPhone SE (375px width)
- Test on iPad (768px width)
- Test on desktop (1920px width)
- Test on ultra-wide (2560px width)
- Verify touch targets ≥ 44x44px on mobile
- Test landscape orientation on mobile
Acceptance Criteria: - No horizontal scrolling on any device - Text readable without zooming - Buttons easily tappable on mobile - Layout adapts gracefully to all sizes
6.3 Performance Testing¶
- Run Lighthouse performance audit (target: >90)
- Measure time to interactive (target: <3s)
- Analyze bundle size
- Implement code splitting for routes
- Add lazy loading for images
- Test on slow 3G connection
Acceptance Criteria: - Lighthouse performance score ≥ 90 - Time to interactive < 3 seconds - JavaScript bundle < 200KB gzipped - Images lazy loaded below fold
6.4 Browser Testing¶
- Test on Chrome (latest)
- Test on Firefox (latest)
- Test on Safari (latest)
- Test on Safari iOS (latest)
- Test on Chrome Android (latest)
- Test on Edge (latest)
Acceptance Criteria: - All features work on all browsers - No console errors on any browser - Consistent rendering across browsers
6.5 Error Handling Testing¶
- Test wallet rejection scenarios
- Test insufficient funds errors
- Test network disconnection
- Test contract revert errors
- Test rate limiting
- Test with ad blockers enabled
Acceptance Criteria: - All errors show user-friendly messages - No uncaught exceptions in console - App remains functional after errors - Error recovery options provided
6.6 Integration Testing¶
- Test full proposal creation → voting → resolution flow
- Test full market creation → trading → settlement flow
- Test full DAO creation → member management → governance flow
- Test wallet connection → transaction → confirmation flow
- Test network switching scenarios
Acceptance Criteria: - All end-to-end flows complete successfully - No data loss during flows - Blockchain state matches UI state - Events trigger UI updates correctly
Progress Tracking¶
Overall Progress¶
- Phase 1: Design System Foundation (0/3 tasks)
- Phase 2: Core Components (0/6 tasks)
- Phase 3: Page Components (0/4 tasks)
- Phase 4: Advanced Features (0/5 tasks)
- Phase 5: Smart Contract Integration (0/6 tasks)
- Phase 6: Testing & Optimization (0/6 tasks)
Total Tasks: 30 major tasks
Completed: 0
In Progress: 0
Remaining: 30
Component Completion¶
- Base UI Components: 0/14
- Feedback Components: 0/8
- Web3 Components: 0/8
- Form Components: 0/8
- Market Components: 0/10
- Proposal Components: 0/8
- DAO Components: 0/8
- Analytics Components: 0/6
Total Components: 70
Completed: 13 (existing)
To Create: 57
Smart Contract API Reference¶
Key Contract Methods¶
ProposalRegistry¶
function submitProposal(
string title,
string description,
uint256 fundingAmount,
address recipient,
uint256 welfareMetricId
) external payable returns (uint256 proposalId)
function getProposal(uint256 proposalId) external view returns (Proposal memory)
function proposalCount() external view returns (uint256)
ConditionalMarketFactory¶
function createMarket(
uint256 proposalId,
uint8 outcome
) external returns (address marketAddress)
function getMarket(uint256 proposalId, uint8 outcome) external view returns (address)
MarketMaker (LMSR)¶
function buy(address tokenAddress, uint256 amount) external payable
function sell(address tokenAddress, uint256 amount) external
function getPrice(address tokenAddress) external view returns (uint256)
FutarchyGovernor¶
function createDAO(
string name,
address governanceToken,
uint256 votingPeriod
) external returns (uint256 daoId)
function executeProposal(uint256 proposalId) external
WelfareMetricRegistry¶
function registerMetric(
string name,
string description,
address oracleAddress
) external returns (uint256 metricId)
function getMetric(uint256 metricId) external view returns (Metric memory)
OracleResolver¶
function proposeResolution(uint256 proposalId, uint8 outcome) external
function challengeResolution(uint256 proposalId, bytes evidence) external
function finalizeResolution(uint256 proposalId) external
PrivacyCoordinator¶
function submitEncryptedVote(uint256 proposalId, bytes encryptedMessage) external
function changeKey(bytes32 oldKeyHash, bytes32 newKeyHash) external
Definition of Done¶
A task is considered complete when: - [ ] Code written and tested locally - [ ] Component follows design system guidelines - [ ] Accessibility requirements met (keyboard nav, ARIA, contrast) - [ ] Responsive on mobile/tablet/desktop - [ ] Error handling implemented - [ ] Smart contract integration working (if applicable) - [ ] Documentation updated - [ ] Code reviewed - [ ] Merged to main branch
Notes & Considerations¶
Design System Compliance¶
All new components must: - Use CSS variables from theme - Follow spacing scale (0.25rem increments) - Use standard transition timing (0.3s) - Include hover/focus/active states - Support keyboard navigation - Work with screen readers
Performance Targets¶
- Time to Interactive: < 3 seconds
- First Contentful Paint: < 1.5 seconds
- Lighthouse Performance Score: ≥ 90
- JavaScript Bundle Size: < 200KB (gzipped)
Accessibility Targets¶
- WCAG 2.1 AA Compliance
- Lighthouse Accessibility Score: ≥ 95
- Keyboard navigation on all features
- Screen reader compatible
- Color contrast ≥ 4.5:1 for text
Browser Support¶
- Chrome (last 2 versions)
- Firefox (last 2 versions)
- Safari (last 2 versions)
- Edge (last 2 versions)
- iOS Safari (last 2 versions)
- Chrome Android (last 2 versions)
Last Updated: December 2024
Version: 1.0
Maintainer: ChipprRobotics Engineering Team