Files
units-ui/components/converter/VisualComparison.tsx
Sebastian Krüger 7f7bc69d04 feat: implement Phase 4 - Command palette, visual comparison, and polish
Add final layer of advanced features for spectacular UX:

⌨️ Command Palette (CommandPalette.tsx):
- Trigger with Ctrl/Cmd+K keyboard shortcut
- Search and execute commands instantly
- Quick access to all 23 measurement categories
- Theme switching commands (light/dark/system)
- Keyboard navigation (↑/↓ arrows, Enter to select)
- Escape to close
- Color-coded category commands
- Backdrop blur overlay
- Animated scale-in entrance
- Footer with keyboard hints
- Smart filtering by keywords

📊 Visual Comparison (VisualComparison.tsx):
- Toggle between grid and chart view
- Horizontal bar chart showing magnitude differences
- Animated bars with 500ms transitions
- Auto-calculated percentages relative to max value
- Color-coded bars matching category colors
- Tabular number formatting
- Clean, minimal design

🔄 Unit Swap Functionality:
- Swap button between From/To units
- ArrowLeftRight icon
- Automatically converts value on swap
- Two-unit quick converter mode
- Large result display with color accent
- Responsive layout

📱 Footer Component (Footer.tsx):
- Three-column grid layout (About, Features, Links)
- GitHub repository link
- convert-units library attribution
- Keyboard shortcuts reference
- Feature highlights
- Made with ❤️ message
- Responsive design (stacks on mobile)
- Copyright notice with current year
- Smooth hover transitions

🎨 Enhanced MainConverter:
- From/To unit selector with swap button
- Quick result display between selectors
- Toggle between grid and chart views
- BarChart3 icon for view switcher
- Integrated command palette
- Better spacing and layout
- Target unit state management
- Auto-update target unit on measure change

 Enhanced Page Layout:
- Sticky header with backdrop blur
- Flexbox layout for footer at bottom
- Keyboard shortcuts hint (/ and Ctrl+K)
- Improved header spacing
- Better visual hierarchy

Features Now Complete:
 Command palette with Ctrl+K
 Visual comparison bar charts
 Unit swap functionality
 Professional footer
 From/To quick converter
 Chart/Grid view toggle
 Sticky navigation header
 Full keyboard navigation

The app is now feature-complete with:
- 23 measurement categories
- 187 individual units
- Real-time conversion
- Fuzzy search (/)
- Command palette (Ctrl+K)
- Dark mode
- Conversion history
- Favorites & copy
- Visual comparisons
- Unit swapping
- Complete footer

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 10:20:32 +01:00

61 lines
1.7 KiB
TypeScript

'use client';
import { useMemo } from 'react';
import { type ConversionResult } from '@/lib/units';
import { formatNumber, cn } from '@/lib/utils';
interface VisualComparisonProps {
conversions: ConversionResult[];
color: string;
}
export default function VisualComparison({
conversions,
color,
}: VisualComparisonProps) {
// Calculate percentages for visual bars
const withPercentages = useMemo(() => {
if (conversions.length === 0) return [];
const maxValue = Math.max(...conversions.map(c => Math.abs(c.value)));
if (maxValue === 0) return conversions.map(c => ({ ...c, percentage: 0 }));
return conversions.map(c => ({
...c,
percentage: (Math.abs(c.value) / maxValue) * 100,
}));
}, [conversions]);
if (conversions.length === 0) {
return (
<div className="text-center py-8 text-muted-foreground">
Enter a value to see conversions
</div>
);
}
return (
<div className="space-y-3">
{withPercentages.map(item => (
<div key={item.unit} className="space-y-1">
<div className="flex items-center justify-between text-sm">
<span className="font-medium">{item.unitInfo.plural}</span>
<span className="tabular-nums">
{formatNumber(item.value)} {item.unit}
</span>
</div>
<div className="h-2 bg-muted rounded-full overflow-hidden">
<div
className="h-full rounded-full transition-all duration-500 ease-out"
style={{
width: `${item.percentage}%`,
backgroundColor: `var(--color-${color})`,
}}
/>
</div>
</div>
))}
</div>
);
}