* chore: run Tailwind v4 upgrade tool (Phase 1) - Upgraded tailwindcss v3 → v4.2.1, postcss plugin to @tailwindcss/postcss - Deleted tailwind.config.js, migrated theme to CSS @theme block in index.css - Replaced @tailwind directives with @import 'tailwindcss' - Added @custom-variant dark, @utility blocks for custom utilities - Updated class names across 128 files (shadow-sm → shadow-xs, etc.) - Removed autoprefixer (built into v4) - Added migration plan doc Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: switch from @tailwindcss/postcss to @tailwindcss/vite (Phase 2) - Replaced @tailwindcss/postcss with @tailwindcss/vite plugin - Deleted postcss.config.js (no longer needed) - Tailwind now runs as a native Vite plugin for faster HMR Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: convert to OKLCH colors, move keyframes into @theme (Phase 3-4) - Replaced all HSL color indirection with direct OKLCH values in @theme - Moved all keyframes inside @theme block (v4 pattern) - Eliminated hsl(var(--x)) double-indirection across 17 component files - Replaced hsl() inline styles with var(--color-*) theme references - Cleaned up redundant rdp-* utility blocks - Fixed @custom-variant dark syntax to use :where() - Added sidebar/glass/shadow vars as OKLCH in :root Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import { HelpCircle, Zap, CheckCircle, FileText, Layout } from 'lucide-react'
|
|
|
|
interface NodeSummaryProps {
|
|
node?: { id: string; type: string; question?: string; title?: string; description?: string } | null
|
|
flowName?: string
|
|
flowType?: string
|
|
nodeCount?: number
|
|
}
|
|
|
|
const NODE_ICONS: Record<string, typeof HelpCircle> = {
|
|
decision: HelpCircle,
|
|
action: Zap,
|
|
solution: CheckCircle,
|
|
}
|
|
|
|
const NODE_COLORS: Record<string, string> = {
|
|
decision: 'text-blue-400',
|
|
action: 'text-yellow-400',
|
|
solution: 'text-green-400',
|
|
}
|
|
|
|
export function NodeSummary({ node, flowName, flowType, nodeCount }: NodeSummaryProps) {
|
|
if (!node) {
|
|
return (
|
|
<div className="border-b px-3 py-2.5" style={{ borderColor: 'var(--glass-border)' }}>
|
|
<div className="flex items-center gap-2">
|
|
<Layout className="h-3.5 w-3.5 text-muted-foreground" />
|
|
<span className="text-xs font-medium text-foreground truncate">
|
|
{flowName || 'Untitled Flow'}
|
|
</span>
|
|
</div>
|
|
<div className="mt-1 flex items-center gap-3 font-label text-[0.625rem] uppercase tracking-widest text-muted-foreground">
|
|
<span>{flowType || 'flow'}</span>
|
|
{nodeCount !== undefined && <span>{nodeCount} nodes</span>}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
const Icon = NODE_ICONS[node.type] || FileText
|
|
const colorClass = NODE_COLORS[node.type] || 'text-muted-foreground'
|
|
|
|
return (
|
|
<div className="border-b px-3 py-2.5" style={{ borderColor: 'var(--glass-border)' }}>
|
|
<div className="flex items-center gap-2">
|
|
<Icon className={`h-3.5 w-3.5 ${colorClass}`} />
|
|
<span className="font-label text-[0.625rem] uppercase tracking-widest text-muted-foreground">
|
|
{node.type}
|
|
</span>
|
|
</div>
|
|
<p className="mt-1 text-sm font-medium text-foreground truncate">
|
|
{node.question || node.title || node.id}
|
|
</p>
|
|
{node.description && (
|
|
<p className="mt-0.5 text-xs text-muted-foreground truncate">{node.description}</p>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|