/**
* 内联 SVG 图标集(Phosphor 风格线性图标,1.6px 描边,stroke=currentColor)。
* 不引入第三方图标库(离线可用),禁止用 emoji 作结构图标。
*
* 用法: 或
*/
import type { ReactNode, SVGProps } from "react";
export type IconName =
| "logo"
| "grid"
| "candles"
| "flask"
| "layers"
| "gauge"
| "archive"
| "search"
| "x"
| "chevDown"
| "chevRight"
| "arrowUpRight"
| "arrowUp"
| "arrowDown"
| "play"
| "refresh"
| "spinner"
| "alert"
| "check"
| "info"
| "database"
| "calendar"
| "target"
| "chartLine"
| "scale"
| "book"
| "link"
| "spark"
| "clock"
| "filter";
const P: Record<
IconName,
(p: { filled?: boolean }) => ReactNode
> = {
logo: () => (
<>
>
),
grid: () => (
<>
>
),
candles: () => (
<>
>
),
flask: () => (
<>
>
),
layers: () => (
<>
>
),
gauge: () => (
<>
>
),
archive: () => (
<>
>
),
search: () => (
<>
>
),
x: () => (
<>
>
),
chevDown: () => ,
chevRight: () => ,
arrowUpRight: () => (
<>
>
),
arrowUp: () => ,
arrowDown: () => ,
play: ({ filled }) =>
filled ? (
) : (
),
refresh: () => (
<>
>
),
spinner: () => (
<>
>
),
alert: ({ filled }) =>
filled ? (
) : (
<>
>
),
check: () => ,
info: () => (
<>
>
),
database: () => (
<>
>
),
calendar: () => (
<>
>
),
target: () => (
<>
>
),
chartLine: () => (
<>
>
),
scale: () => (
<>
>
),
book: () => (
<>
>
),
link: () => (
<>
>
),
spark: () => (
<>
>
),
clock: () => (
<>
>
),
filter: () => (
<>
>
),
};
interface IconProps extends Omit, "name"> {
name: IconName;
size?: number;
/** 填充态(部分图标支持实心强调) */
filled?: boolean;
}
export function Icon({ name, size = 18, filled = false, ...rest }: IconProps) {
return (
);
}