'use client' import type React from 'react' import { useMemo, useState } from 'react' import { Button } from '../../components/Button' import { Card, CardContent, CardFooter, CardHeader, CardTitle, } from '../../components/Card' import { Checkbox } from '../../components/Checkbox' import { Input } from '../../components/Input' import { Label } from '../../components/Label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../components/Select' import { Textarea } from '../../components/Textarea' import { SvgAddSquare, SvgAiSparkles, SvgDocumentSetting, SvgTools, } from '../../icons' type Step = | 'CHOOSE_GOAL' | 'DEFINE_COMPONENT' | 'SELECT_SOURCE_TYPE' | 'PROVIDE_SOURCE' | 'REFINE_DOCS' | 'REFINE_FIX' | 'ADD_INSPIRATION' | 'ADD_INSTRUCTIONS' | 'GENERATED' const sourceOptions = { SHADCN: 'Shadcn Component Name', URL: 'URL to Source', CODE: 'Pasted Code Snippet', OTHER: 'Local Path or Other', } as const type SourceOptionKey = keyof typeof sourceOptions type SourceOptionValue = (typeof sourceOptions)[SourceOptionKey] const mainGoals = { BUILD: 'Build a new component from scratch', DOCS: 'Create or update documentation (MDX & stories)', FIX: 'Fix an existing component', } as const type MainGoalValue = (typeof mainGoals)[keyof typeof mainGoals] const docOptions = { KEEP_EXAMPLES: 'Keep existing examples', USE_CONTENT: 'Use existing content from MDX', MORE_EXAMPLES: 'Generate additional examples', } as const type DocOptionKey = keyof typeof docOptions interface GoalCardProps { icon: React.ReactNode title: MainGoalValue onClick: () => void } const GoalCard: React.FC = ({ icon, title, onClick }) => ( ) export const PromptGenerator = () => { const [componentName, setComponentName] = useState('') const [sourceType, setSourceType] = useState( sourceOptions.SHADCN, ) const [sourceValue, setSourceValue] = useState('') const [mainGoal, setMainGoal] = useState('') const [docSelections, setDocSelections] = useState< Partial> >({}) const [fixInstructions, setFixInstructions] = useState('') const [inspirationComponents, setInspirationComponents] = useState([ '', ]) const [specificInstructions, setSpecificInstructions] = useState('') const [finalPrompt, setFinalPrompt] = useState('') const [_copyStatus, setCopyStatus] = useState('') const [currentStep, setCurrentStep] = useState('CHOOSE_GOAL') const handleGoalSelection = (goal: MainGoalValue) => { setMainGoal(goal) setCurrentStep('DEFINE_COMPONENT') } const handleDocSelection = (key: DocOptionKey, checked: boolean) => { setDocSelections((prev) => ({ ...prev, [key]: checked })) } const handleInspirationChange = (index: number, value: string) => { const newInspirations = [...inspirationComponents] newInspirations[index] = value setInspirationComponents(newInspirations) } const addInspirationRow = () => { setInspirationComponents([...inspirationComponents, '']) } const resetWizard = () => { setComponentName('') setSourceType(sourceOptions.SHADCN) setSourceValue('') setMainGoal('') setDocSelections({}) setFixInstructions('') setInspirationComponents(['']) setSpecificInstructions('') setFinalPrompt('') setCopyStatus('') setCurrentStep('CHOOSE_GOAL') } const generatePrompt = () => { let prompt = `Component: \`${componentName}\`\n` if (mainGoal === mainGoals.BUILD) { prompt += `Source Type: ${sourceType}\n` prompt += `Source: ${sourceType === sourceOptions.CODE ? `\n\`\`\`\n${sourceValue}\n\`\`\`` : `\`${sourceValue}\``}\n` } prompt += `Goal: ${mainGoal}\n` if (mainGoal === mainGoals.DOCS) { const selected = (Object.keys(docSelections) as DocOptionKey[]) .filter((key) => docSelections[key]) .map((key) => docOptions[key]) if (selected.length > 0) { prompt += `Doc Options: ${selected.join(', ')}\n` } } if (mainGoal === mainGoals.FIX) { prompt += `Fix Instructions: ${fixInstructions}\n` } const inspirations = inspirationComponents .map((s) => s.trim()) .filter(Boolean) if (inspirations.length > 0) { prompt += `Inspiration Components: ${inspirations.map((i) => `\`${i}\``).join(', ')}\n` } if (specificInstructions.trim()) { prompt += `Specific Instructions: ${specificInstructions.trim()}\n` } setFinalPrompt(prompt) void navigator.clipboard.writeText(prompt) setCopyStatus('Copied!') setCurrentStep('GENERATED') setTimeout(() => setCopyStatus(''), 3000) } const renderStep = () => { switch (currentStep) { case 'CHOOSE_GOAL': return ( } title={mainGoals.BUILD} onClick={() => handleGoalSelection(mainGoals.BUILD)} /> } title={mainGoals.DOCS} onClick={() => handleGoalSelection(mainGoals.DOCS)} /> } title={mainGoals.FIX} onClick={() => handleGoalSelection(mainGoals.FIX)} /> ) case 'DEFINE_COMPONENT': return ( setComponentName(e.target.value)} /> ) case 'SELECT_SOURCE_TYPE': return ( ) case 'PROVIDE_SOURCE': return ( {sourceType === sourceOptions.CODE ? (