word-to-code / components /GenerationForm.js
tinazone's picture
character limit
57d523a verified
import Image from 'next/image';
import ExampleChip from './ExampleChip';
import SystemPrompt from './SystemPrompt';
import { examples } from '../sketches';
export default function GenerationForm({
word,
setWord,
instructions,
setInstructions,
isGenerating,
showSystemPrompt,
setShowSystemPrompt,
showExamples,
setShowExamples,
activeExample,
handleExampleClick,
onSubmit
}) {
return (
<div className="w-full max-w-[500px]">
<button
onClick={() => setShowExamples(!showExamples)}
className="flex items-center mt-4 gap-2 text-sm text-black hover:text-black"
>
<svg
className={`w-4 h-4 transition-transform ${showExamples ? 'rotate-180' : ''}`}
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
See examples we used to teach the model
</button>
{showExamples && (
<div className="flex gap-2 flex-wrap mt-4">
{Object.keys(examples).map((example) => (
<ExampleChip
key={example}
label={example}
onClick={() => handleExampleClick(example)}
active={activeExample === example}
/>
))}
</div>
)}
{showSystemPrompt && (
<SystemPrompt onExampleClick={handleExampleClick} />
)}
<form onSubmit={onSubmit} className="w-full max-w-[500px] flex flex-col gap-4 items-center mt-4">
<div className="relative w-full">
<input
type="text"
value={word}
onChange={(e) => setWord(e.target.value)}
maxLength={20}
placeholder='Type a word like "float" ...'
className="w-full p-3 sm:p-4 bg-transparent border-[1.5px] border-gray-200 rounded-[26px] text-black placeholder-gray-400 focus:outline-none focus:border-black text-xs sm:text-base"
/>
<button
type="button"
className={`group absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 hover:text-black transition-colors p-1.5 rounded-full ${showSystemPrompt ? 'bg-gray-200' : 'hover:bg-gray-100'} active:bg-gray-200`}
onClick={() => setShowSystemPrompt(!showSystemPrompt)}
>
<Image
src="/info_spark.png"
alt="show system prompt"
width={20}
height={20}
className="opacity-100"
priority={false}
/>
<div className="absolute bottom-full mb-1 right-0 scale-0 transition-all rounded bg-gray-100 p-2 text-xs text-black group-hover:scale-100 whitespace-nowrap">
{showSystemPrompt ? 'Hide' : 'Show'} system prompt
</div>
</button>
</div>
<textarea
value={instructions}
onChange={(e) => setInstructions(e.target.value)}
placeholder="Optional: add additional instructions for your animation."
rows={1}
className="w-full p-3 sm:p-4 bg-transparent border-[1.5px] border-gray-200 resize-none rounded-[26px] text-black placeholder-gray-400 focus:outline-none focus:border-black text-xs sm:text-base"
style={{
height: 'auto',
}}
onInput={(e) => {
e.target.style.height = 'auto';
e.target.style.height = Math.min(e.target.scrollHeight, 120) + 'px';
}}
/>
<button
type="submit"
disabled={isGenerating || !word.trim()}
className={`w-44 py-3 rounded-[32px] font-medium transition-colors ${
isGenerating
? 'bg-[#EEEEEE] text-black'
: !word.trim()
? 'bg-gray-100 text-gray-400'
: 'bg-black text-white hover:bg-gray-900'
}`}
>
{isGenerating ? 'Generating...' : 'Generate'}
</button>
</form>
</div>
);
}