Vokturz's picture
Add StyleTTS2 support with KokoroTTS integration
79eafc9
import { CircleQuestionMark, Code2, FileText, X } from 'lucide-react'
import PipelineSelector from './PipelineSelector'
import ModelSelector from './ModelSelector'
import ModelInfo from './ModelInfo'
import { useModel } from '../contexts/ModelContext'
import TextGenerationConfig from './pipelines/TextGenerationConfig'
import FeatureExtractionConfig from './pipelines/FeatureExtractionConfig'
import ZeroShotClassificationConfig from './pipelines/ZeroShotClassificationConfig'
import ImageClassificationConfig from './pipelines/ImageClassificationConfig'
import TextClassificationConfig from './pipelines/TextClassificationConfig'
import TextToSpeechConfig from './pipelines/TextToSpeechConfig'
import { Button } from '@/components/ui/button'
import Tooltip from './Tooltip'
interface SidebarProps {
isOpen: boolean
onClose: () => void
setIsModalOpen: (isOpen: boolean) => void
setIsCodeModalOpen: (isOpen: boolean) => void
}
const Sidebar = ({
isOpen,
onClose,
setIsModalOpen,
setIsCodeModalOpen
}: SidebarProps) => {
const { pipeline, setPipeline, modelInfo } = useModel()
return (
<>
{/* Overlay */}
{isOpen && (
<div
className="fixed inset-0 bg-black opacity-50 z-40 lg:hidden"
onClick={onClose}
/>
)}
{/* Sidebar */}
<div
className={`
fixed top-0 right-0 h-full w-full sm:w-[600px] lg:w-1/5 2xl:w-2/5 min-w-[400px] max-w-[500px] bg-white shadow-xl z-40 transform transition-transform duration-300 ease-in-out
${isOpen ? 'translate-x-0' : 'translate-x-full'}
lg:translate-x-0 lg:static lg:shadow-none lg:border-l lg:border-gray-200
`}
>
<div className="flex flex-col h-full">
{/* Header */}
<div className="flex items-center justify-between p-4 border-b border-gray-200 lg:hidden">
<h2 className="text-lg font-semibold text-foreground">
Configuration
</h2>
<button
onClick={onClose}
className="p-2 text-gray-400 hover:text-gray-600 rounded-lg hover:bg-gray-100"
>
<X className="w-5 h-5" />
</button>
</div>
{/* Content */}
<div className="flex-1 overflow-y-auto overflow-x-hidden p-4 space-y-6">
{/* Pipeline Selection */}
<div className="space-x-3 flex flex-row justify-center align-center">
<div>
<h3 className="text-md xl:text-lg font-semibold text-foreground text-nowrap mt-1">
Choose a Pipeline
</h3>
{(pipeline === 'feature-extraction' ||
pipeline === 'image-classification') && (
<span className="flex text-xs text-red-500 justify-center text-center">
WebGPU disabled{' '}
<Tooltip
content="onnxruntime-web seems not to support this pipeline"
className="transform -translate-x-1/3 break-keep max-w-12"
>
<CircleQuestionMark className="inline w-4 h-4 ml-1" />
</Tooltip>
</span>
)}
</div>
<PipelineSelector pipeline={pipeline} setPipeline={setPipeline} />
</div>
{/* Model Selection */}
<div className="space-y-3">
<h3 className="text-lg font-semibold text-foreground">
Select Model
</h3>
<ModelSelector />
</div>
{/* Model Info */}
<div className="flex flex-col items-center justify-center">
<ModelInfo />
{/* Model README Button */}
<div className="flex flex-row mt-2 space-x-4 ">
<Button
variant="outline"
onClick={() => setIsModalOpen(true)}
disabled={!modelInfo}
>
<FileText className="w-4 h-4 flex-shrink-0" />
<span>View README.md</span>
</Button>
<Button
variant="outline"
onClick={() => setIsCodeModalOpen(true)}
disabled={!modelInfo}
>
<Code2 className="w-4 h-4 flex-shrink-0" />
<span>See Code</span>
</Button>
</div>
</div>
<hr className="border-gray-200" />
{pipeline === 'text-generation' && <TextGenerationConfig />}
{pipeline === 'feature-extraction' && <FeatureExtractionConfig />}
{pipeline === 'zero-shot-classification' && (
<ZeroShotClassificationConfig />
)}
{pipeline === 'image-classification' && (
<ImageClassificationConfig />
)}
{pipeline === 'text-classification' && <TextClassificationConfig />}
{pipeline === 'text-to-speech' && <TextToSpeechConfig />}
</div>
</div>
</div>
</>
)
}
export default Sidebar