391 lines
15 KiB
TypeScript
391 lines
15 KiB
TypeScript
/**
|
||
* 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>
|
||
)
|
||
}
|