import { forwardRef, useEffect, useRef, useState } from "react"; import { Bot, Sparkles, FileText, Wand2, SlidersHorizontal, ListChecks, MessageSquareText, } from "lucide-react"; import { Dialog, DialogContent } from "@/components/ui/dialog"; import { Terminal, AnimatedStep } from "@/components/ui/terminal"; import { TypingAnimation } from "@/components/ui/typing-animation"; import { AnimatedBeam } from "@/components/ui/animated-beam"; import { cn } from "@/lib/utils"; const PROMPT_CREATE_STEPS = [ "Interpretando instruções e contexto...", "Definindo objetivo, público e tom...", "Organizando estrutura do prompt (seções e regras)...", "Especificando formato de saída e restrições...", "Adicionando critérios de qualidade e validações...", "Incluindo exemplos e casos de borda...", "Revisando clareza e consistência...", "Finalizando prompt...", ] as const; const PROMPT_REFINE_STEPS = [ "Lendo o prompt atual...", "Identificando ambiguidades e pontos fracos...", "Removendo redundâncias e ruído...", "Aprimorando instruções e critérios de sucesso...", "Ajustando tom, voz e consistência...", "Fortalecendo formato de saída e validações...", "Adicionando exemplos e casos de borda...", "Consolidando melhorias e finalizando...", ] as const; const STEP_INTERVAL_MS = 1500; export type PromptGeneratingMode = "create" | "refine"; export interface PromptGeneratingScreenProps { mode: PromptGeneratingMode; progress?: number; message?: string; } function visibleLineCount(progress: number, stepCount: number): number { if (progress <= 0) return 1; const phase = (progress / 100) * stepCount; const stepInCycle = Math.floor(phase) % stepCount; return Math.min(stepInCycle + 1, stepCount); } const BeamCircle = forwardRef< HTMLDivElement, { className?: string; children?: React.ReactNode } >(({ className, children }, ref) => (