- {group.items.map((item) => {
- const isActive = pathname === item.href || (item.href !== '/' && pathname.startsWith(item.href));
-
- return (
-
-
{ if (window.innerWidth < 1024) close(); }}
- className={cn(
- "flex items-center px-3 py-1.5 rounded-lg text-sm font-medium transition-all duration-300 relative group/item",
- isActive
- ? "bg-primary/10 text-primary border-l-2 border-primary"
- : "text-foreground/80 hover:bg-accent/50 hover:text-foreground",
- isCollapsed ? "justify-center" : "justify-between"
- )}
- title={isCollapsed ? item.title : undefined}
- >
-
-
- {React.isValidElement(item.icon) ? item.icon : null}
-
- {!isCollapsed && {item.title}}
-
-
- {!isCollapsed && item.items && (
-
- )}
-
-
- {item.items && pathname.startsWith(item.href) && !isCollapsed && (
-
- {item.items.map((subItem) => (
-
{ if (window.innerWidth < 1024) close(); }}
- className={cn(
- "block px-3 py-1.5 rounded-lg text-xs font-medium transition-all duration-200",
- pathname === subItem.href
- ? "text-primary bg-primary/5 font-semibold"
- : "text-muted-foreground hover:text-foreground hover:bg-accent/50"
- )}
- >
- {subItem.title}
-
- ))}
+
+ );
+ })}
+
- {/* Sidebar Footer / Desktop Toggle */}
-
-
-
>
);
diff --git a/lib/tools.tsx b/lib/tools.tsx
new file mode 100644
index 0000000..354bb68
--- /dev/null
+++ b/lib/tools.tsx
@@ -0,0 +1,97 @@
+import { ColorIcon, UnitsIcon, ASCIIIcon, MediaIcon, FaviconIcon } from '@/components/AppIcons';
+
+export interface Tool {
+ /** Short display name (e.g. "Color") */
+ shortTitle: string;
+ /** Full display name (e.g. "Color Manipulation") */
+ title: string;
+ /** Sidebar / nav label (may differ from title) */
+ navTitle: string;
+ /** Route path, e.g. '/color' */
+ href: string;
+ /** One-liner shown in page header */
+ description: string;
+ /** Longer description for the landing-page card */
+ summary: string;
+ /** Icon component */
+ icon: React.ElementType;
+ /** Tailwind gradient utility class for the landing card */
+ gradient: string;
+ /** Hex accent color for the landing card */
+ accentColor: string;
+ /** Badge labels for the landing card */
+ badges: string[];
+}
+
+export const tools: Tool[] = [
+ {
+ shortTitle: 'Color',
+ title: 'Color Manipulation',
+ navTitle: 'Color Manipulation',
+ href: '/color',
+ description: 'Interactive color manipulation and analysis tool',
+ summary:
+ 'Modern color manipulation toolkit with palette generation, accessibility testing, and format conversion. Supports hex, RGB, HSL, Lab, and more.',
+ icon: ColorIcon,
+ gradient: 'gradient-indigo-purple',
+ accentColor: '#a855f7',
+ badges: ['Open Source', 'WCAG', 'Free'],
+ },
+ {
+ shortTitle: 'Units',
+ title: 'Units Converter',
+ navTitle: 'Units Converter',
+ href: '/units',
+ description: 'Smart unit converter with 187 units across 23 categories',
+ summary:
+ 'Smart unit converter with 187 units across 23 categories. Real-time bidirectional conversion with fuzzy search.',
+ icon: UnitsIcon,
+ gradient: 'gradient-cyan-purple',
+ accentColor: '#2dd4bf',
+ badges: ['Open Source', 'Real-time', 'Free'],
+ },
+ {
+ shortTitle: 'ASCII',
+ title: 'ASCII Art Generator',
+ navTitle: 'ASCII Art',
+ href: '/ascii',
+ description: 'ASCII Art Text Generator with 373 Fonts',
+ summary:
+ 'ASCII art text generator with 373 fonts. Create stunning text banners, terminal art, and retro designs with live preview and multiple export formats.',
+ icon: ASCIIIcon,
+ gradient: 'gradient-yellow-amber',
+ accentColor: '#eab308',
+ badges: ['Open Source', 'ASCII Art', 'Free'],
+ },
+ {
+ shortTitle: 'Media',
+ title: 'Media Converter',
+ navTitle: 'Media Converter',
+ href: '/media',
+ description: 'Professional browser-based media conversion for video, audio, and images',
+ summary:
+ 'Modern browser-based file converter powered by WebAssembly. Convert videos, images, and audio locally without server uploads. Privacy-first with no file size limits.',
+ icon: MediaIcon,
+ gradient: 'gradient-green-teal',
+ accentColor: '#10b981',
+ badges: ['Open Source', 'Converter', 'Free'],
+ },
+ {
+ shortTitle: 'Favicon',
+ title: 'Favicon Generator',
+ navTitle: 'Favicon Generator',
+ href: '/favicon',
+ description: 'Create a complete set of icons for your website including PWA manifest and HTML code.',
+ summary:
+ 'Generate a complete set of favicons for your website. Includes PWA manifest and HTML embed code. All processing happens locally in your browser.',
+ icon: FaviconIcon,
+ gradient: 'gradient-blue-cyan',
+ accentColor: '#3b82f6',
+ badges: ['Open Source', 'Generator', 'Free'],
+ },
+];
+
+/** Look up a tool by its href path */
+export function getToolByHref(href: string): Tool | undefined {
+ return tools.find((t) => t.href === href);
+}