Files
2026-07-01 17:56:31 +08:00

391 lines
15 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* SVG icon set — geometry derived from Lucide (https://lucide.dev), MIT.
*
* We inline the paths instead of pulling in `lucide-react` to keep the
* production bundle tight. The icons follow Lucide conventions:
* - 24×24 design grid
* - 2px stroke (1.5 for very small chrome icons)
* - round caps & joins
* - currentColor everywhere so CSS controls tone
*
* When adding a new icon, copy the geometry from the official Lucide
* source (https://github.com/lucide-icons/lucide/tree/main/icons) so the
* whole set stays visually consistent.
*/
import React from 'react'
export function IconBrain() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M12 2C9.5 2 7.5 3.5 7 5.5C5 5.5 3 7.5 3 10C3 12 4.5 13.5 6 14V20C6 21.1 6.9 22 8 22H16C17.1 22 18 21.1 18 20V14C19.5 13.5 21 12 21 10C21 7.5 19 5.5 17 5.5C16.5 3.5 14.5 2 12 2Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M12 2V8M8 6H16M12 14V18" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconTool() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94L6.73 20.15a2.12 2.12 0 0 1-3-3l6.72-6.72a6 6 0 0 1 7.94-7.94L14.7 6.3z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconStop() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<rect x="4" y="4" width="16" height="16" rx="3" stroke="currentColor" strokeWidth="1.5" />
<rect x="8" y="8" width="8" height="8" rx="1.5" fill="currentColor" />
</svg>
)
}
export function IconSend() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M5 12L3 3L21 12L3 21L5 12ZM5 12H13" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconCopy() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<rect x="9" y="9" width="13" height="13" rx="2" stroke="currentColor" strokeWidth="1.5" />
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconCheck() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M20 6L9 17L4 12" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
/**
* Welcome-state chat icon. Lucide `message-square-text`: a squared bubble
* with two transcript lines, which reads as "a real conversation" much
* better than a generic empty bubble at large sizes.
*/
export function IconChat() {
return (
<svg width="28" height="28" viewBox="0 0 24 24" fill="none">
<path
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
stroke="currentColor"
strokeWidth="1.6"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path d="M13 8H7" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M17 12H7" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
</svg>
)
}
export function IconPaperclip() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66L9.41 17.41a2 2 0 0 1-2.83-2.83l8.49-8.49" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconChevron({ down }: { down?: boolean }) {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" style={{ transition: 'transform 200ms', transform: down ? 'rotate(90deg)' : 'none' }}>
<path d="M9 18L15 12L9 6" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconPlus() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M12 5V19M5 12H19" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconSearch() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<circle cx="11" cy="11" r="8" stroke="currentColor" strokeWidth="1.5" />
<path d="M21 21L16.65 16.65" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconTrash() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M3 6H5H21" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6L18.13 20.11A2 2 0 0 1 16.14 22H7.86a2 2 0 0 1-2-1.89L5 6" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconBoard() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<rect x="3" y="3" width="7" height="9" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
<rect x="14" y="3" width="7" height="5" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
<rect x="14" y="12" width="7" height="9" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
<rect x="3" y="16" width="7" height="5" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
</svg>
)
}
export function IconActivity() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M22 12H18L15 21L9 3L6 12H2" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconShield() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
/**
* Agent-avatar sparkle. Lucide `sparkles`: one large 4-point burst plus
* two small accent sparks — reads as "AI/magic" without the generic
* single-star look.
*/
export function IconSparkle() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path
d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .962 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.582a.5.5 0 0 1 0 .962L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.962 0z"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path d="M20 3v4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M22 5h-4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M4 17v2" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M5 18H3" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
/** Lucide `arrow-right` — two crisp strokes, no diagonal artifacts. */
export function IconArrowRight() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M5 12h14" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round" />
<path d="m12 5 7 7-7 7" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconGate() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M9 11L12 14L22 4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M21 12V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconZap() {
return (
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path d="M13 2L3 14H12L11 22L21 10H12L13 2Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
// ── Work Item / Runtime Panel icons ──────────────────────────────────────
export function IconWorkItem() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M4 18H10V14H4V18Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M8 14H14V10H8V14Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M12 10H18V6H12V10Z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M18 8L21 8" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconGatePass() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M9 12L11 14L15 10" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
export function IconGateReject() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M15 9L9 15M9 9L15 15" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconClock() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="1.5" />
<path d="M12 6V12L16 14" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconHandoff() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M7 17L2 12L7 7" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M17 7L22 12L17 17" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
<path d="M2 12H22" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconTimeline() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M12 2V22" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<circle cx="12" cy="6" r="2" stroke="currentColor" strokeWidth="1.5" />
<circle cx="12" cy="12" r="2" stroke="currentColor" strokeWidth="1.5" />
<circle cx="12" cy="18" r="2" stroke="currentColor" strokeWidth="1.5" />
<path d="M14 6H20" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M14 12H18" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
<path d="M14 18H20" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" />
</svg>
)
}
export function IconClose() {
return (
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path d="M18 6L6 18M6 6L18 18" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)
}
// ── Mode / lock icons (shared by the composer mode chip) ─────────────────
/**
* Lucide `lock` — the classic shackle + body. Size defaults to 12px so it
* tucks nicely inside a chip; pass a size prop to scale.
*/
export function IconLock({ size = 12 }: { size?: number } = {}) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none">
<rect
x="3"
y="11"
width="18"
height="11"
rx="2"
stroke="currentColor"
strokeWidth="1.7"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M7 11V7a5 5 0 0 1 10 0v4"
stroke="currentColor"
strokeWidth="1.7"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
)
}
/** Lucide `user-round` — proportional head + shoulders, perfect for Task mode. */
export function IconUserRound({ size = 14 }: { size?: number } = {}) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none">
<circle
cx="12"
cy="8"
r="5"
stroke="currentColor"
strokeWidth="1.7"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M20 21a8 8 0 0 0-16 0"
stroke="currentColor"
strokeWidth="1.7"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
)
}
/** Lucide `building-2` — multi-story office building, reads as "company". */
export function IconBuilding({ size = 14 }: { size?: number } = {}) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none">
<path
d="M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z"
stroke="currentColor"
strokeWidth="1.6"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2"
stroke="currentColor"
strokeWidth="1.6"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path
d="M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2"
stroke="currentColor"
strokeWidth="1.6"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path d="M10 6h4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M10 10h4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M10 14h4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M10 18h4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
</svg>
)
}
/**
* Compact 3-spark "Sparkles" for the Org mode tile. We reuse the full
* `sparkles` geometry but at a smaller default size — same family, less
* visual weight than the agent avatar usage.
*/
export function IconSparkles({ size = 14 }: { size?: number } = {}) {
return (
<svg width={size} height={size} viewBox="0 0 24 24" fill="none">
<path
d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .962 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.582a.5.5 0 0 1 0 .962L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.962 0z"
stroke="currentColor"
strokeWidth="1.6"
strokeLinecap="round"
strokeLinejoin="round"
/>
<path d="M20 3v4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M22 5h-4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M4 17v2" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
<path d="M5 18H3" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" />
</svg>
)
}