Files
wehub-resource-sync c48612c494
CI / E2E Tests (push) Has been cancelled
CI / Lint, Typecheck & Unit Tests (push) Has been cancelled
Docs Build / Build docs site (push) Has been cancelled
Publish @openmaic packages / Build, validate & publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:23 +08:00

63 lines
2.0 KiB
TypeScript

'use client';
import { Info, Lightbulb, AlertTriangle } from 'lucide-react';
import type { EditorHint } from '@/lib/edit/scene-editor-surface';
interface HintRailProps {
readonly hints?: readonly EditorHint[];
}
/**
* Reserved AI inline-coach surface. Renders nothing in Phase 1 (surfaces
* return [] for hints). Layout slot is wired so future phases can populate
* it without restructuring the shell.
*/
export function HintRail({ hints }: HintRailProps) {
if (!hints || hints.length === 0) return null;
return (
<div className="pointer-events-none absolute bottom-4 left-1/2 z-20 -translate-x-1/2">
<div className="pointer-events-auto flex max-w-md flex-col gap-2">
{hints.map((hint) => (
<HintCard key={hint.id} hint={hint} />
))}
</div>
</div>
);
}
const ICONS = {
info: Info,
suggestion: Lightbulb,
warning: AlertTriangle,
} as const;
const SEVERITY_STYLES = {
info: 'border-zinc-200 bg-white text-zinc-700 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-200',
suggestion:
'border-amber-200 bg-amber-50 text-amber-900 dark:border-amber-900/40 dark:bg-amber-950/40 dark:text-amber-100',
warning:
'border-rose-200 bg-rose-50 text-rose-900 dark:border-rose-900/40 dark:bg-rose-950/40 dark:text-rose-100',
} as const;
function HintCard({ hint }: { readonly hint: EditorHint }) {
const Icon = ICONS[hint.severity];
return (
<div
className={`flex items-start gap-3 rounded-xl border px-4 py-3 shadow-md shadow-zinc-900/5 ${SEVERITY_STYLES[hint.severity]}`}
>
<Icon className="mt-0.5 h-4 w-4 shrink-0" />
<div className="min-w-0 flex-1 text-sm">{hint.message}</div>
{hint.action && (
<button
type="button"
onClick={hint.action.onInvoke}
className="shrink-0 rounded-md bg-white/60 px-2.5 py-1 text-xs font-medium hover:bg-white dark:bg-zinc-800/60 dark:hover:bg-zinc-800"
>
{hint.action.label}
</button>
)}
</div>
);
}