"use client"; import { Blocks, CheckCircle2, LayoutTemplate, Layers3 } from "lucide-react"; import { countUiSurfaceComponents, getUiSurfaceChildren, getUiSurfaceScreenComponents, resolveUiSurfaceTextBinding, type UiSurfaceSnapshot, } from "@/lib/ui-surface-protocol"; import { cn } from "@/lib/utils"; type DetailSurfaceInspectorReviewState = { screenIndex: number; action?: "pass" | "protocol_patch" | "regenerate_image"; passed?: boolean; }; function getActionLabel(action?: DetailSurfaceInspectorReviewState["action"]) { if (action === "protocol_patch") return "协议修正"; if (action === "regenerate_image") return "重生图"; return "通过"; } function getActionClassName(action?: DetailSurfaceInspectorReviewState["action"]) { if (action === "protocol_patch") { return "bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-500/20 dark:bg-blue-500/10 dark:text-blue-300"; } if (action === "regenerate_image") { return "bg-red-50 text-red-700 ring-1 ring-inset ring-red-500/20 dark:bg-red-500/10 dark:text-red-300"; } return "bg-emerald-50 text-emerald-700 ring-1 ring-inset ring-emerald-500/20 dark:bg-emerald-500/10 dark:text-emerald-300"; } function collectRenderableScreenComponents(surface: UiSurfaceSnapshot, parentId: string) { const result = [] as typeof surface.components; const queue = [...getUiSurfaceChildren(surface, parentId)]; while (queue.length > 0) { const component = queue.shift(); if (!component) continue; if ( component.type === "detail_text_block" || component.type === "detail_card" || component.type === "detail_badge" || component.type === "detail_feature_card" || component.type === "detail_feature_tag" || component.type === "detail_spec_table" || component.type === "detail_table_label" || component.type === "detail_table_value" || component.type === "detail_comparison_strip" || component.type === "detail_compare_before" || component.type === "detail_compare_after" || component.type === "detail_proof_bar" || component.type === "detail_cta_banner" || component.type === "detail_cta_button" || component.type === "detail_cta_support" ) { result.push(component); continue; } queue.push(...getUiSurfaceChildren(surface, component.id)); } return result; } export function DetailSurfaceInspectorPanel(params: { surface: UiSurfaceSnapshot | null; latestScreenValidation?: DetailSurfaceInspectorReviewState | null; }) { if (!params.surface) return null; const surface = params.surface; const screenComponents = getUiSurfaceScreenComponents(surface); const totalRenderableBlocks = countUiSurfaceComponents(surface, "detail_text_block") + countUiSurfaceComponents(surface, "detail_card") + countUiSurfaceComponents(surface, "detail_badge") + countUiSurfaceComponents(surface, "detail_feature_card") + countUiSurfaceComponents(surface, "detail_feature_tag") + countUiSurfaceComponents(surface, "detail_spec_table") + countUiSurfaceComponents(surface, "detail_table_label") + countUiSurfaceComponents(surface, "detail_table_value") + countUiSurfaceComponents(surface, "detail_comparison_strip") + countUiSurfaceComponents(surface, "detail_compare_before") + countUiSurfaceComponents(surface, "detail_compare_after") + countUiSurfaceComponents(surface, "detail_proof_bar") + countUiSurfaceComponents(surface, "detail_cta_banner") + countUiSurfaceComponents(surface, "detail_cta_button") + countUiSurfaceComponents(surface, "detail_cta_support"); const totalSections = countUiSurfaceComponents(surface, "detail_section"); const totalScreens = screenComponents.length; return (
Detail Surface Inspector
{surface.surfaceId}