Files
vnidrop/docs/components/icons.tsx

141 lines
3.5 KiB
TypeScript

import type { SVGProps } from "react";
export type IconName =
| "arrow"
| "check"
| "chevron"
| "close"
| "code"
| "devices"
| "file"
| "folder"
| "github"
| "globe"
| "lock"
| "menu"
| "nfc"
| "qr"
| "shield"
| "spark"
| "stop"
| "verified"
| "x";
type IconProps = SVGProps<SVGSVGElement> & {
name: IconName;
};
export function Icon({ name, ...props }: IconProps) {
const paths: Record<IconName, React.ReactNode> = {
arrow: (
<>
<path d="M5 12h14" />
<path d="m14 7 5 5-5 5" />
</>
),
check: <path d="m5 12 4 4L19 6" />,
chevron: <path d="m9 18 6-6-6-6" />,
close: (
<>
<path d="M6 6l12 12" />
<path d="M18 6 6 18" />
</>
),
code: (
<>
<path d="m8 9-4 3 4 3" />
<path d="m16 9 4 3-4 3" />
<path d="m14 5-4 14" />
</>
),
devices: (
<>
<rect x="3" y="5" width="13" height="10" rx="2" />
<path d="M7 19h5M9.5 15v4" />
<rect x="17" y="8" width="4" height="10" rx="1" />
</>
),
file: (
<>
<path d="M6 3h8l4 4v14H6z" />
<path d="M14 3v5h4M9 13h6M9 17h4" />
</>
),
folder: (
<path d="M3 7.5A2.5 2.5 0 0 1 5.5 5H10l2 2h6.5A2.5 2.5 0 0 1 21 9.5v7a2.5 2.5 0 0 1-2.5 2.5h-13A2.5 2.5 0 0 1 3 16.5z" />
),
github: (
<path d="M12 2a10 10 0 0 0-3.2 19.5c.5.1.7-.2.7-.5v-1.9c-2.8.6-3.4-1.2-3.4-1.2-.5-1.1-1.1-1.4-1.1-1.4-.9-.6.1-.6.1-.6 1 0 1.5 1 1.5 1 .9 1.5 2.3 1.1 2.9.8.1-.6.3-1.1.6-1.3-2.2-.3-4.6-1.1-4.6-5a3.9 3.9 0 0 1 1-2.7c-.1-.3-.4-1.3.1-2.7 0 0 .9-.3 2.8 1a9.6 9.6 0 0 1 5.1 0c2-1.3 2.8-1 2.8-1 .6 1.4.2 2.4.1 2.7a3.9 3.9 0 0 1 1 2.7c0 3.9-2.4 4.7-4.6 5 .4.3.7.9.7 1.8V21c0 .3.2.6.7.5A10 10 0 0 0 12 2Z" />
),
globe: (
<>
<circle cx="12" cy="12" r="9" />
<path d="M3 12h18M12 3a15 15 0 0 1 0 18M12 3a15 15 0 0 0 0 18" />
</>
),
lock: (
<>
<rect x="5" y="10" width="14" height="11" rx="3" />
<path d="M8 10V7a4 4 0 0 1 8 0v3M12 14v3" />
</>
),
menu: (
<>
<path d="M4 7h16M4 12h16M4 17h16" />
</>
),
nfc: (
<>
<path d="M8 7a7 7 0 0 1 0 10M5 4a11 11 0 0 1 0 16" />
<path d="M16 7a7 7 0 0 0 0 10M19 4a11 11 0 0 0 0 16" />
<circle cx="12" cy="12" r="1" />
</>
),
qr: (
<>
<rect x="3" y="3" width="7" height="7" rx="1" />
<rect x="14" y="3" width="7" height="7" rx="1" />
<rect x="3" y="14" width="7" height="7" rx="1" />
<path d="M14 14h3v3h-3zM18 18h3v3h-3zM18 13h3M13 19h3v2" />
</>
),
shield: (
<>
<path d="M12 3 4.5 6v5.5c0 4.8 3.2 8.1 7.5 9.5 4.3-1.4 7.5-4.7 7.5-9.5V6z" />
<path d="m8.5 12 2.2 2.2 4.8-5" />
</>
),
spark: (
<path d="m12 2 1.6 6.4L20 10l-6.4 1.6L12 18l-1.6-6.4L4 10l6.4-1.6z" />
),
stop: <rect x="5" y="5" width="14" height="14" rx="3" />,
verified: (
<>
<path d="m12 3 2 2.1 2.9-.1.1 2.9 2 2.1-2 2.1-.1 2.9-2.9-.1-2 2.1-2-2.1-2.9.1-.1-2.9-2-2.1 2-2.1.1-2.9 2.9.1z" />
<path d="m9 10 2 2 4-4" />
</>
),
x: (
<>
<path d="M6 6l12 12" />
<path d="M18 6 6 18" />
</>
),
};
return (
<svg
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="1.8"
strokeLinecap="round"
strokeLinejoin="round"
aria-hidden="true"
{...props}
>
{paths[name]}
</svg>
);
}