Vehicoule's picture
# DeepSite - Complete Project Setup
83cb890 verified
```typescript
import React, { useState, useRef, useEffect } from 'react';
import { Send, Settings, Sparkles, Loader2 } from 'lucide-react';
import { HeaderProps } from '../types';
const Header: React.FC<HeaderProps> = ({
prompt,
setPrompt,
onGenerate,
loading,
onSettingsClick
}) => {
const textareaRef = useRef<HTMLTextAreaElement>(null);
const [isExpanded, setIsExpanded] = useState(false);
// Auto-resize textarea
useEffect(() => {
const textarea = textareaRef.current;
if (textarea) {
textarea.style.height = 'auto';
textarea.style.height = Math.min(textarea.scrollHeight, 120) + 'px';
}
}, [prompt]);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
if (!loading && prompt.trim()) {
onGenerate();
}
};
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
handleSubmit(e);
}
};
const suggestedPrompts = [
"Create a modern landing page with hero section and features",
"Build a portfolio website with dark theme",
"Generate a responsive e-commerce product page",
"Make a blog with modern typography",
"Create a dashboard with charts and analytics"
];
return (
<header className="header">
<div className="header-content">
{/* Logo and Title */}
<div className="logo-section">
<div className="logo-icon">
<Sparkles className="w-8 h-8 text-white" />
</div>
<div className="logo-text">
<h1 className="text-2xl font-bold text-white">DeepSite</h1>
<p className="text-white/80 text-sm">AI-Powered Website Builder</p>
</div>
</div>
{/* Main Input */}
<form onSubmit={handleSubmit} className="input-section">
<div className="input-container">
<div className="input-wrapper">
<textarea
ref={textareaRef}
value={prompt}
onChange={(e) => setPrompt(e.target.value)}
onKeyDown={handleKeyDown}
onFocus={() => setIsExpanded(true)}
onBlur={() => setIsExpanded(false)}
placeholder="Describe the website you want to create... (e.g., 'Create a modern portfolio with dark theme and smooth animations')"
className="main-input"
rows={1}
disabled={loading}
/>
<button
type="submit"
disabled={loading || !prompt.trim()}
className="submit-button"
title="Generate Website (⌘+Enter)"
>
{loading ? (
<Loader2 className="w-5 h-5 animate-spin" />
) : (
<Send className="w-5 h-5" />
)}
</button>
</div>
{/* Suggested Prompts */}
{isExpanded && (
<div className="suggestions fade-in">
<div className="suggestions-header">
<span className="text-sm text-white/60">Try these:</span>
</div>
<div className="suggestions-grid">
{suggestedPrompts.map((suggestion, index) => (
<button
key={index}
type="button"
onClick={() => setPrompt(suggestion)}
className="suggestion-chip"
disabled={loading}
>
{suggestion}
</button>
))}
</div>
</div>
)}
</div>
</form>
{/* Settings Button */}
<button
onClick={onSettingsClick}
className="settings-button"
title="Settings"
>
<Settings className="w-5 h-5" />
</button>
</div>
{/* Quick Stats */}
<div className="header-stats">
<div className="stat-item">
<span className="stat-number">∞</span>
<span className="stat-label">AI Models</span>
</div>
<div className="stat-item">
<span className="stat-number">100%</span>
<span className="stat-label">Free</span>
</div>
<div className="stat-item">
<span className="stat-number">⚡</span>
<span className="stat-label">Fast</span>
</div>
</div>
</header>
);
};
export default Header;
```