|
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 |
|
|