mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-18 06:17:21 +00:00
6.6 KiB
6.6 KiB
Platform-Specific UI Guide
Overview
AeThex OS now supports platform-adaptive UI that automatically adjusts for mobile, desktop, and web environments while maintaining the same core functionality.
Quick Start
1. Use the Platform Layout Hook
import { usePlatformLayout, usePlatformClasses } from '@/hooks/use-platform-layout';
function MyComponent() {
const layout = usePlatformLayout();
const classes = usePlatformClasses();
return (
<div className={classes.container}>
{layout.isMobile ? (
<MobileView />
) : (
<DesktopView />
)}
</div>
);
}
2. Platform-Specific Rendering
import { PlatformSwitch } from '@/hooks/use-platform-layout';
<PlatformSwitch
mobile={<MobileNavigation />}
desktop={<DesktopNavigation />}
web={<WebNavigation />}
fallback={<DefaultNavigation />}
/>
3. Adaptive Styling
const classes = usePlatformClasses();
<Button className={classes.button}>
{/* Automatically h-12 on mobile, h-10 on desktop/web */}
Click Me
</Button>
Platform Detection
The app automatically detects:
- Mobile: Capacitor native apps (iOS/Android)
- Desktop: Tauri desktop apps (Windows/macOS/Linux)
- Web: Browser-based access
Detection is done via the existing lib/platform.ts.
Layout Patterns
Mobile-First Approach
// Mobile: Bottom navigation, full-width cards, larger touch targets
<div className="grid grid-cols-1 gap-3 px-4">
<Card className="rounded-lg p-4">
<Button className="h-12 text-base w-full">
Large Touch Target
</Button>
</Card>
</div>
Desktop Optimization
// Desktop: Top navigation, multi-column layout, compact controls
<div className="grid grid-cols-3 gap-6 px-8">
<Card className="rounded-xl p-6">
<Button className="h-10 text-sm">
Compact Button
</Button>
</Card>
</div>
Responsive Design Strategy
1. Layout Changes
- Mobile: Single column, bottom navigation, full-screen modals
- Desktop: Multi-column, top/side navigation, floating dialogs
- Web: Adaptive columns, sticky navigation, responsive dialogs
2. Typography
- Mobile: Larger base font (16px+) for readability
- Desktop: Standard font (14px) for information density
- Web: Medium font (15px) for balance
3. Spacing
- Mobile: Tighter spacing (12px-16px) to maximize screen space
- Desktop: Generous spacing (24px-32px) for clarity
- Web: Balanced spacing (16px-24px)
4. Touch Targets
- Mobile: Minimum 44px height for buttons and interactive elements
- Desktop: Standard 40px height
- Web: 40px height
Example Implementation
See PlatformAdaptiveExample.tsx for a complete example showing:
- Platform-specific headers
- Adaptive grids
- Conditional navigation styles
- Touch-optimized controls
Common Patterns
Adaptive Navigation
function Navigation() {
const { isMobile } = usePlatformLayout();
if (isMobile) {
return (
<nav className="fixed bottom-0 left-0 right-0 border-t">
<BottomTabBar />
</nav>
);
}
return (
<nav className="fixed top-0 left-0 right-0 border-b">
<TopMenuBar />
</nav>
);
}
Responsive Cards
function CardGrid() {
const { isMobile, isDesktop } = usePlatformLayout();
const columns = isMobile ? 'grid-cols-1' :
isDesktop ? 'grid-cols-4' :
'grid-cols-2';
return <div className={`grid ${columns} gap-4`}>
{/* Cards */}
</div>;
}
Adaptive Forms
function Form() {
const classes = usePlatformClasses();
return (
<form className={classes.spacing}>
<Input className={classes.input} placeholder="Name" />
<Button className={classes.button} type="submit">
Submit
</Button>
</form>
);
}
Mobile-Specific Features
Safe Area Support (iOS)
/* In your CSS */
.mobile-container {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
}
Pull-to-Refresh
import { isMobile } from '@/lib/platform';
if (isMobile()) {
// Enable pull-to-refresh gesture
window.addEventListener('touchstart', handlePullToRefresh);
}
Native Gestures
// Swipe navigation on mobile
if (isMobile()) {
<SwipeableViews onChangeIndex={handleSwipe}>
<Page1 />
<Page2 />
</SwipeableViews>
}
Desktop-Specific Features
Window Controls
import { isDesktop } from '@/lib/platform';
if (isDesktop()) {
// Custom title bar, minimize/maximize/close
<TauriTitleBar />
}
Keyboard Shortcuts
if (isDesktop()) {
useEffect(() => {
// Ctrl+N for new item, etc.
const handler = (e: KeyboardEvent) => {
if (e.ctrlKey && e.key === 'n') {
createNew();
}
};
window.addEventListener('keydown', handler);
return () => window.removeEventListener('keydown', handler);
}, []);
}
Testing Platform Variants
In Development
// Force platform detection for testing
if (import.meta.env.DEV) {
window.Capacitor = {}; // Test as mobile
// or
window.__TAURI__ = {}; // Test as desktop
}
Chrome DevTools
- Open DevTools → Device Toolbar
- Select mobile device
- The app will detect as web but use mobile viewport
Best Practices
- Design Mobile-First: Start with mobile constraints, enhance for larger screens
- Use Touch-Friendly Sizes: Minimum 44px tap targets on mobile
- Optimize Navigation: Bottom tabs on mobile, top/side on desktop
- Adapt Typography: Larger on mobile, more compact on desktop
- Test on Real Devices: Emulators are good, but test on actual hardware
- Progressive Enhancement: Core functionality works everywhere, enhancements per platform
Migration Guide
To update existing components:
- Import the hooks:
import { usePlatformClasses } from '@/hooks/use-platform-layout';
- Replace hardcoded classes:
// Before
<div className="px-6 py-4">
// After
const classes = usePlatformClasses();
<div className={classes.container}>
- Add platform switches where needed:
<PlatformSwitch
mobile={<MobileComponent />}
fallback={<DesktopComponent />}
/>