# Fakemui Architecture & Design Decisions
## Overview
Fakemui is a Material Design 3 UI component library providing consistent component APIs across multiple platforms: React/TypeScript (web) and QML (desktop/embedded).
## Philosophy & Core Design Decisions
### 1. Platform Parity, Not Code Sharing
Fakemui maintains **separate implementations** for React and QML rather than attempting code sharing:
**React/TypeScript** (`/fakemui`):
- 98 components
- Full TypeScript support
- Browser/Node.js targeting
- React hooks for state management
- CSS-in-JS styling with `sx` prop
**QML** (`/qml/components`):
- 104 components (mirrors React structure)
- Modern Qt 6.x (versionless imports)
- Declarative QML syntax
- Centralized singleton theme system
- SCSS-style styling patterns
**Why separate?** Different platforms have different constraints:
- React: Hooks, JSX, modern JavaScript
- QML: Declarative syntax, C++ integration, event system
- Code sharing attempts created maintenance overhead
### 2. Material Design 3 as Foundation
All components implement Material Design 3 specifications:
**Design Tokens**:
- Color system (primary, secondary, tertiary, error, warning, info, success)
- Typography hierarchy (h1-h6 headings, body sizes)
- Spacing system (8px-based increments)
- Elevation system (5 levels with shadow definitions)
- Motion speeds (short, medium, long)
**Benefits**:
- Consistent visual language across platforms
- Accessibility compliance (WCAG AA+)
- Future-proof design system
- User familiarity with Material Design
### 3. Component Naming Conventions
**React Components**:
```typescript
Button, Card, TextField, Select, Dialog // PascalCase, semantic names
```
**QML Components**:
```qml
CButton, CCard, CTextField, CSelect, CDialog // C prefix + PascalCase
```
**Rationale**: C prefix in QML prevents naming conflicts with Qt built-ins (Button, Card, etc.)
### 4. Common Props Across All Components
Standardized prop interface for consistency:
```typescript
interface CommonProps {
// Variants
variant?: "text" | "outlined" | "contained"
color?: "primary" | "secondary" | "error" | "warning" | "info" | "success"
size?: "small" | "medium" | "large"
// States
disabled?: boolean
loading?: boolean
fullWidth?: boolean
// Styling
sx?: SxProp // Material Design theme-aware styles
className?: string
// Accessibility
"aria-label"?: string
"aria-describedby"?: string
role?: string
}
```
**Benefits**:
- Predictable API surface
- Easy learning curve
- Consistent user experience
- Faster development
### 5. Intentional Component Duplication
Two components exist in different categories for different use cases:
**TreeView** (Intentional Duplicates):
```typescript
// data-display/TreeView - Array-based API for JSON trees
// lab/TreeViewComponent - Composition-based with TreeItem children
```
**DatePicker** (Intentional Duplicates):
```typescript
// inputs/DatePicker - Simple HTML input (string values)
// x/DatePickerAdvanced - Advanced calendar UI (Date objects)
```
**Why duplicates?** Different scenarios:
- Simple date inputs vs. rich calendar interfaces
- Array-based data vs. JSX composition
- Performance vs. features
### 6. Theming System
**Multi-tier Theme Architecture**:
```
Theme Provider (React)
↓
Theme Context/Hooks
↓
Individual Components
↓
sx Prop (Material-UI compatible)
```
**Built-in Themes** (9 variants):
- default (primary blue)
- light (light mode)
- dark (dark mode)
- ocean, forest, sunset, lavender, midnight, rose (color variations)
**Dynamic Theming**:
```typescript
const { theme, setTheme } = useTheme()
// Switch theme at runtime
setTheme('dark')
```
**Custom Themes**: Extend from base theme
```typescript
const customTheme = {
palette: {
primary: { main: '#custom-color' },
// ...
},
typography: { /* ... */ }
}
```
### 7. Styling Approach
**Material-UI Compatible `sx` Prop**:
```typescript
Content
```
**No Tailwind or Utility Classes**: Follows MetaBuilder standards:
- ✅ Material-UI sx prop
- ❌ Tailwind className utilities
- ❌ Radix UI (use Fakemui instead)
**Why sx prop?**
- Theme-aware by default
- Type-safe (TypeScript support)
- Responsive utilities built-in
- Consistent with MUI ecosystem
- Easier to maintain
### 8. Accessibility First
All components implement accessibility standards:
**ARIA Attributes**:
```typescript
```
**Keyboard Navigation**:
- Tab order
- Enter/Space for activation
- Arrow keys for navigation
- Escape for dismissal
**Screen Reader Support**:
- Semantic HTML
- Proper heading hierarchy
- Alt text for images
- Form labels
**Testing**:
- Role-based selectors: `screen.getByRole('button')`
- Accessibility audit tools
- WCAG AA compliance target
### 9. Component Organization
**Directory Structure Rationale**:
```
atoms/ # Lowest level (Text, Label, Icon)
↓
inputs/ # Form controls (Button, TextField)
↓
surfaces/ # Containers (Card, AppBar)
↓
layout/ # Spatial arrangement (Box, Grid)
↓
data-display/ # Data rendering (Table, List)
↓
feedback/ # User feedback (Alert, Progress)
↓
navigation/ # Navigation patterns (Tabs, Menu)
↓
utils/ # Helper components (Modal, Portal)
↓
lab/ # Experimental (Timeline, Masonry)
↓
x/ # Advanced features (DataGrid)
```
**Benefits**:
- Clear dependency hierarchy
- Reduced circular imports
- Easier to find components
- Scalable organization
### 10. Performance Considerations
**Memoization Strategy**:
```typescript
const Button = React.memo(ButtonComponent, (prev, next) => {
// Custom comparison for props
return prev.disabled === next.disabled && prev.onClick === next.onClick
})
```
**Virtualization for Lists**:
```typescript
{largeDataSet.map(item => {item})}
```
**Bundle Optimization**:
- Tree-shaking support (ES modules)
- Named exports (avoid default exports)
- Minimal dependencies (Material-UI foundation only)
**Code Splitting**:
```typescript
// Lazy load heavy components
const DataGrid = React.lazy(() => import('./x/DataGrid'))
}>
```
## Component Categories
### Atoms (Basic Building Blocks)
```
Text, Label, Icon, Badge, Divider, Spacer
```
- Lowest level components
- No complex logic
- Composable foundation
### Inputs (Form Controls)
```
Button, TextField, Select, Checkbox, RadioButton, Switch,
DatePicker, FileUpload, Slider, Autocomplete
```
- User interaction
- Form handling
- Input validation hooks
- Accessibility: labels, aria-describedby
### Surfaces (Containers)
```
Card, AppBar, Drawer, Paper, Background
```
- Content grouping
- Navigation surfaces
- Elevation/shadow system
### Layout (Spatial Arrangement)
```
Box, Stack, Grid, Flex, Container
```
- Responsive grids (xs, sm, md, lg, xl)
- Spacing utilities
- Flexbox/Grid layout
### Data Display (Rendering Data)
```
Table, List, Avatar, Chip, Progress, Rating
```
- Tabular data
- Lists and collections
- Data visualization primitives
### Feedback (User Feedback)
```
Alert, Dialog, Progress, Skeleton, Toast, Tooltip
```
- Communicate state
- System feedback
- Loading states
- Help/hints
### Navigation (Navigation Patterns)
```
Tabs, Menu, Breadcrumbs, Pagination, Stepper
```
- Page navigation
- Menu systems
- Progress indication
### Utilities (Helper Components)
```
Modal, Portal, Popover, Popper
```
- Position management
- Overlay handling
- Portal rendering
### Lab (Experimental)
```
Timeline, Masonry, Carousel, Autocomplete variants
```
- Experimental components
- May move to core
- Breaking changes possible
### X (Advanced/Pro Features)
```
DataGrid, DatePickerAdvanced, TreeViewComponent
```
- Complex features
- Performance optimized
- Rich interactions
## Integration Points
### With State Management
**Redux Integration**:
```typescript
const { isOpen } = useSelector(state => state.modals)
const dispatch = useDispatch()
```
### With Validation Libraries
**React Hook Form**:
```typescript
const { register, errors } = useForm()
```
### With i18n
**Internationalization**:
```typescript
const { t } = useTranslation()
```
## Maintenance & Evolution
### Adding New Components
1. **Design first**: Verify Material Design 3 compliance
2. **Create in appropriate category**: Follow directory structure
3. **Implement React version**: Full TypeScript, tests
4. **Mirror in QML**: Maintain parity
5. **Update exports**: Add to index.ts
6. **Document**: JSDoc + GETTING_STARTED.md
### Breaking Changes
- Semantic versioning: MAJOR.MINOR.PATCH
- Notice period: Deprecation phase before removal
- Migration guides: Help developers upgrade
### Deprecation Process
```typescript
/**
* @deprecated Use NewComponent instead. Will be removed in v3.0
* @example
* // Before
*
*
* // After
*
*/
export const OldComponent = () => { /* ... */ }
```
## Future Roadmap
1. **More Component Variations**: Time picker, color picker, rich text editor
2. **Performance Enhancements**: React 19 transitions, streaming SSR
3. **QML Performance**: C++ backing for heavy components
4. **Visual Regression Testing**: Automated screenshot comparison
5. **Storybook Integration**: Interactive component documentation
6. **Design Tokens Export**: Figma integration
## File Structure Overview
```
fakemui/
├── atoms/ # Basic components
├── inputs/ # Form controls (28 components)
├── surfaces/ # Containers
├── layout/ # Spacing & arrangement
├── data-display/ # Data rendering
├── feedback/ # User feedback
├── navigation/ # Navigation patterns
├── utils/ # Helper components
├── lab/ # Experimental
├── x/ # Advanced features
├── theming/ # Theme system & providers
├── workflows/ # Workflow-specific components
├── styles/ # SCSS mixins, tokens
├── hooks/ # React hooks
├── types/ # TypeScript interfaces
├── icons/ # Material Design icons
├── index.ts # Main export file
├── README.md # Overview
└── docs/ # Documentation
qml/components/
├── atoms/ # QML atoms (C-prefixed)
├── inputs/ # QML inputs
├── ... (mirrors React structure)
├── Theming/ # Theme singletons
└── Responsive/ # Responsive utilities
```
## Key Statistics
| Metric | Value |
|--------|-------|
| React Components | 98 |
| QML Components | 104 |
| Type Coverage | 100% |
| Accessibility Level | WCAG AA+ |
| Design System Version | Material Design 3 |
| Built-in Themes | 9 variants |
| Code Review Grade | A- |