|
|
|
|
@@ -1,50 +1,90 @@
|
|
|
|
|
type IconName = "dashboard" | "books" | "libraries" | "jobs" | "tokens" | "series" | "settings";
|
|
|
|
|
type IconName =
|
|
|
|
|
| "dashboard"
|
|
|
|
|
| "books"
|
|
|
|
|
| "libraries"
|
|
|
|
|
| "jobs"
|
|
|
|
|
| "tokens"
|
|
|
|
|
| "series"
|
|
|
|
|
| "settings"
|
|
|
|
|
| "image"
|
|
|
|
|
| "cache"
|
|
|
|
|
| "performance"
|
|
|
|
|
| "folder"
|
|
|
|
|
| "folderOpen"
|
|
|
|
|
| "search"
|
|
|
|
|
| "plus"
|
|
|
|
|
| "edit"
|
|
|
|
|
| "trash"
|
|
|
|
|
| "check"
|
|
|
|
|
| "x"
|
|
|
|
|
| "chevronLeft"
|
|
|
|
|
| "chevronRight"
|
|
|
|
|
| "chevronUp"
|
|
|
|
|
| "chevronDown"
|
|
|
|
|
| "arrowLeft"
|
|
|
|
|
| "arrowRight"
|
|
|
|
|
| "refresh"
|
|
|
|
|
| "sun"
|
|
|
|
|
| "moon"
|
|
|
|
|
| "externalLink"
|
|
|
|
|
| "key"
|
|
|
|
|
| "play"
|
|
|
|
|
| "stop"
|
|
|
|
|
| "spinner"
|
|
|
|
|
| "warning";
|
|
|
|
|
|
|
|
|
|
interface PageIconProps {
|
|
|
|
|
type IconSize = "sm" | "md" | "lg" | "xl";
|
|
|
|
|
|
|
|
|
|
interface IconProps {
|
|
|
|
|
name: IconName;
|
|
|
|
|
size?: IconSize;
|
|
|
|
|
className?: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const icons: Record<IconName, React.ReactNode> = {
|
|
|
|
|
dashboard: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
books: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
libraries: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
jobs: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
tokens: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
series: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
settings: (
|
|
|
|
|
<svg className="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
const sizeClasses: Record<IconSize, string> = {
|
|
|
|
|
sm: "w-4 h-4",
|
|
|
|
|
md: "w-5 h-5",
|
|
|
|
|
lg: "w-6 h-6",
|
|
|
|
|
xl: "w-8 h-8",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const colors: Record<IconName, string> = {
|
|
|
|
|
const icons: Record<IconName, string> = {
|
|
|
|
|
dashboard: "M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6",
|
|
|
|
|
books: "M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253",
|
|
|
|
|
libraries: "M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z",
|
|
|
|
|
jobs: "M13 10V3L4 14h7v7l9-11h-7z",
|
|
|
|
|
tokens: "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z",
|
|
|
|
|
series: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10",
|
|
|
|
|
settings: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z",
|
|
|
|
|
image: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z",
|
|
|
|
|
cache: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10",
|
|
|
|
|
performance: "M13 10V3L4 14h7v7l9-11h-7z",
|
|
|
|
|
folder: "M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z",
|
|
|
|
|
folderOpen: "M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z",
|
|
|
|
|
search: "M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z",
|
|
|
|
|
plus: "M12 4v16m8-8H4",
|
|
|
|
|
edit: "M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z",
|
|
|
|
|
trash: "M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16",
|
|
|
|
|
check: "M5 13l4 4L19 7",
|
|
|
|
|
x: "M6 18L18 6M6 6l12 12",
|
|
|
|
|
chevronLeft: "M15 19l-7-7 7-7",
|
|
|
|
|
chevronRight: "M9 5l7 7-7 7",
|
|
|
|
|
chevronUp: "M5 15l7-7 7 7",
|
|
|
|
|
chevronDown: "M19 9l-7 7-7-7",
|
|
|
|
|
arrowLeft: "M10 19l-7-7m0 0l7-7m-7 7h18",
|
|
|
|
|
arrowRight: "M14 5l7 7m0 0l-7 7m7-7H3",
|
|
|
|
|
refresh: "M4 4v5h.582m15.582 0A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15",
|
|
|
|
|
sun: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z",
|
|
|
|
|
moon: "M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z",
|
|
|
|
|
externalLink: "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14",
|
|
|
|
|
key: "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z",
|
|
|
|
|
play: "M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z M21 12a9 9 0 11-18 0 9 9 0 0118 0z",
|
|
|
|
|
stop: "M21 12a9 9 0 11-18 0 9 9 0 0118 0z M9 10a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4z",
|
|
|
|
|
spinner: "M4 4v5h.582m15.582 0A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15",
|
|
|
|
|
warning: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const colorClasses: Partial<Record<IconName, string>> = {
|
|
|
|
|
dashboard: "text-primary",
|
|
|
|
|
books: "text-success",
|
|
|
|
|
libraries: "text-primary",
|
|
|
|
|
@@ -52,56 +92,32 @@ const colors: Record<IconName, string> = {
|
|
|
|
|
tokens: "text-error",
|
|
|
|
|
series: "text-primary",
|
|
|
|
|
settings: "text-muted-foreground",
|
|
|
|
|
image: "text-primary",
|
|
|
|
|
cache: "text-warning",
|
|
|
|
|
performance: "text-success",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function PageIcon({ name, className = "" }: PageIconProps) {
|
|
|
|
|
export function Icon({ name, size = "md", className = "" }: IconProps) {
|
|
|
|
|
const sizeClass = sizeClasses[size];
|
|
|
|
|
const colorClass = colorClasses[name];
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<span className={`${colors[name]} ${className}`}>
|
|
|
|
|
{icons[name]}
|
|
|
|
|
</span>
|
|
|
|
|
<svg
|
|
|
|
|
className={`${sizeClass} ${colorClass || ""} ${className}`}
|
|
|
|
|
fill="none"
|
|
|
|
|
stroke="currentColor"
|
|
|
|
|
viewBox="0 0 24 24"
|
|
|
|
|
>
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d={icons[name]} />
|
|
|
|
|
</svg>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Nav icons (smaller)
|
|
|
|
|
export function NavIcon({ name, className = "" }: { name: IconName; className?: string }) {
|
|
|
|
|
const navIcons: Record<IconName, React.ReactNode> = {
|
|
|
|
|
dashboard: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
books: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
libraries: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
jobs: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
tokens: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
series: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
settings: (
|
|
|
|
|
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
|
|
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
|
|
|
|
</svg>
|
|
|
|
|
),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return <span className={className}>{navIcons[name]}</span>;
|
|
|
|
|
// Backwards compatibility aliases
|
|
|
|
|
export function PageIcon({ name, className = "" }: { name: IconName; className?: string }) {
|
|
|
|
|
return <Icon name={name} size="xl" className={className} />;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function NavIcon({ name, className = "" }: { name: IconName; className?: string }) {
|
|
|
|
|
return <Icon name={name} size="sm" className={className} />;
|
|
|
|
|
}
|
|
|
|
|
|