/** * 内联 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 ( ); }