deadhead-space-freight-tycoon/apps/web/src/ui/icons.tsx

151 lines
4.6 KiB
TypeScript

import type { ReactNode } from "react";
/** Line icons on a 24 px grid, drawn in `currentColor` (CR-005). */
const PATHS = {
hq: (
<>
<path d="M3 21h18M5 21V9l7-5 7 5v12" />
<path d="M9.5 21v-5h5v5M9 11.5h.01M15 11.5h.01" />
</>
),
map: (
<>
<circle cx="12" cy="12" r="3" />
<ellipse cx="12" cy="12" rx="10" ry="4.5" transform="rotate(-25 12 12)" />
<circle cx="20" cy="7.5" r="1" fill="currentColor" />
</>
),
jobs: (
<>
<rect x="5" y="4" width="14" height="17" rx="2" />
<path d="M9 4V2.5h6V4M8.5 10h7M8.5 14h7M8.5 18h4" />
</>
),
fleet: (
<>
<path d="M12 2.5c3 2 5 6 5 10l-1.6 3.5H8.6L7 12.5c0-4 2-8 5-10z" />
<circle cx="12" cy="10" r="1.8" />
<path d="M8.6 16 6 18.5V14l1.3-2.5M15.4 16l2.6 2.5V14l-1.3-2.5M10.5 19l1.5 2.5 1.5-2.5" />
</>
),
pilots: (
<>
<path d="M6 11a6 6 0 0 1 12 0v2H6v-2z" />
<path d="M8 13v1.5a4 4 0 0 0 8 0V13M4 21c1.2-2.6 4.2-4 8-4s6.8 1.4 8 4" />
</>
),
market: (
<>
<path d="M5 8h14l-1.2 13H6.2L5 8z" />
<path d="M9 10V6.5a3 3 0 0 1 6 0V10" />
</>
),
places: (
<>
<circle cx="12" cy="12" r="6" />
<path d="M5.2 15.6c-2.3 2-3 3.6-2.2 4.3 1.3 1.1 6.4-1.1 11-5s7.6-8.2 6.4-9.4c-.7-.7-2.4-.3-4.6 1" />
</>
),
credits: (
<>
<circle cx="12" cy="12" r="9" />
<path d="M14.8 9.4A3 3 0 0 0 12 7.8c-2 0-3.3 1.6-3.3 4.2s1.3 4.2 3.3 4.2a3 3 0 0 0 2.8-1.6" />
</>
),
clock: (
<>
<circle cx="12" cy="12" r="9" />
<path d="M12 7v5l3 2" />
</>
),
fuel: <path d="M12 3s6 6.5 6 11a6 6 0 0 1-12 0c0-4.5 6-11 6-11z" />,
cargo: (
<>
<path d="M3 7.5 12 3l9 4.5v9L12 21l-9-4.5v-9z" />
<path d="M3 7.5 12 12l9-4.5M12 12v9" />
</>
),
arrow: <path d="M4 12h15M14 6l6 6-6 6" />,
lock: (
<>
<rect x="5" y="11" width="14" height="10" rx="2" />
<path d="M8 11V7.5a4 4 0 0 1 8 0V11" />
</>
),
check: <path d="M5 12.5 9.5 17 19 7" />,
bolt: <path d="M13 2 4 14h7l-1 8 9-12h-7l1-8z" />,
rest: <path d="M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5z" />,
alert: (
<>
<path d="M12 3 22 21H2L12 3z" />
<path d="M12 10v5M12 18v.01" />
</>
),
close: <path d="M6 6l12 12M18 6 6 18" />,
// A ship's helm: the Bridge (CR-020).
helm: (
<>
<circle cx="12" cy="12" r="6.5" />
<circle cx="12" cy="12" r="2" />
<path d="M12 2v3.5M12 18.5V22M2 12h3.5M18.5 12H22M4.9 4.9l2.5 2.5M16.6 16.6l2.5 2.5M4.9 19.1l2.5-2.5M16.6 7.4l2.5-2.5" />
</>
),
// A cog (outline after Lucide "settings", ISC licence).
gear: (
<>
<path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" />
<circle cx="12" cy="12" r="3" />
</>
),
plus: <path d="M12 5v14M5 12h14" />,
target: (
<>
<circle cx="12" cy="12" r="9" />
<circle cx="12" cy="12" r="5" />
<circle cx="12" cy="12" r="1" fill="currentColor" />
</>
),
send: <path d="M3 11 21 3l-8 18-2-8-8-2z" />,
hire: (
<>
<circle cx="10" cy="8" r="4" />
<path d="M2.5 21c1-3.8 3.9-6 7.5-6 1.8 0 3.4.5 4.7 1.4M19 14v6M16 17h6" />
</>
),
route: (
<>
<circle cx="5" cy="18" r="2.5" />
<circle cx="19" cy="6" r="2.5" />
<path d="M7 16.5C12 14 9 9 17 7.5" strokeDasharray="2 2.5" />
</>
),
speed: <path d="M3 17a9 9 0 0 1 18 0M12 17l4-6M7 13.5h.01M12 10h.01M17 13.5h.01" />,
range: (
<>
<circle cx="12" cy="12" r="9" strokeDasharray="2.5 2.5" />
<circle cx="12" cy="12" r="2" />
</>
),
landing: <path d="M12 3v11M7.5 9.5 12 14l4.5-4.5M4 20h16M6 17h12" />,
star: <path d="m12 3 2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9L12 3z" />,
} satisfies Record<string, ReactNode>;
export type IconName = keyof typeof PATHS;
export function Icon({ name, className = "size-5" }: { name: IconName; className?: string }) {
return (
<svg
aria-hidden="true"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={1.8}
strokeLinecap="round"
strokeLinejoin="round"
className={className}
>
{PATHS[name]}
</svg>
);
}