add footer and fix layout
Browse files
src/App.tsx
CHANGED
|
@@ -11,6 +11,7 @@ import ImageClassification from './components/pipelines/ImageClassification'
|
|
| 11 |
import Sidebar from './components/Sidebar'
|
| 12 |
import ModelReadme from './components/ModelReadme'
|
| 13 |
import { PipelineLayout } from './components/PipelineLayout'
|
|
|
|
| 14 |
|
| 15 |
function App() {
|
| 16 |
const [isSidebarOpen, setIsSidebarOpen] = useState(false)
|
|
@@ -39,7 +40,7 @@ function App() {
|
|
| 39 |
<div className="relative min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100">
|
| 40 |
<Header />
|
| 41 |
<PipelineLayout>
|
| 42 |
-
<div className=" flex h-[calc(100vh-
|
| 43 |
{/* Header is h-16 = 4rem */}
|
| 44 |
{/* Main Content */}
|
| 45 |
<main className="flex-1 overflow-auto">
|
|
@@ -76,6 +77,7 @@ function App() {
|
|
| 76 |
/>
|
| 77 |
</div>
|
| 78 |
</PipelineLayout>
|
|
|
|
| 79 |
{modelInfo?.readme && (
|
| 80 |
<ModelReadme
|
| 81 |
readme={modelInfo.readme}
|
|
|
|
| 11 |
import Sidebar from './components/Sidebar'
|
| 12 |
import ModelReadme from './components/ModelReadme'
|
| 13 |
import { PipelineLayout } from './components/PipelineLayout'
|
| 14 |
+
import Footer from './Footer'
|
| 15 |
|
| 16 |
function App() {
|
| 17 |
const [isSidebarOpen, setIsSidebarOpen] = useState(false)
|
|
|
|
| 40 |
<div className="relative min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100">
|
| 41 |
<Header />
|
| 42 |
<PipelineLayout>
|
| 43 |
+
<div className=" flex h-[calc(100vh-8rem)]">
|
| 44 |
{/* Header is h-16 = 4rem */}
|
| 45 |
{/* Main Content */}
|
| 46 |
<main className="flex-1 overflow-auto">
|
|
|
|
| 77 |
/>
|
| 78 |
</div>
|
| 79 |
</PipelineLayout>
|
| 80 |
+
<Footer />
|
| 81 |
{modelInfo?.readme && (
|
| 82 |
<ModelReadme
|
| 83 |
readme={modelInfo.readme}
|
src/Footer.tsx
CHANGED
|
@@ -1,9 +1,19 @@
|
|
| 1 |
function Footer() {
|
| 2 |
return (
|
| 3 |
-
<footer className="bg-white
|
| 4 |
-
<div className="max-w-7xl
|
| 5 |
-
<div className="flex items-center
|
| 6 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
<span>Powered by</span>
|
| 8 |
<a
|
| 9 |
href="https://huggingface.co/docs/transformers.js"
|
|
@@ -14,13 +24,10 @@ function Footer() {
|
|
| 14 |
<span>🤗 Transformers.js</span>
|
| 15 |
</a>
|
| 16 |
</div>
|
| 17 |
-
<div className="text-sm text-gray-500">
|
| 18 |
-
All processing happens in your browser - your data stays private
|
| 19 |
-
</div>
|
| 20 |
</div>
|
| 21 |
</div>
|
| 22 |
</footer>
|
| 23 |
-
)
|
| 24 |
}
|
| 25 |
|
| 26 |
-
export default Footer
|
|
|
|
| 1 |
function Footer() {
|
| 2 |
return (
|
| 3 |
+
<footer className="bg-white w-full">
|
| 4 |
+
<div className="max-w-7xl flex flex-col items-center justify-center text-center px-4 sm:px-6 lg:px-8 py-4 mx-auto">
|
| 5 |
+
<div className="flex flex-row items-center space-x-2 text-sm text-gray-500">
|
| 6 |
+
<a
|
| 7 |
+
href="https://vnavarro.dev"
|
| 8 |
+
target="_blank"
|
| 9 |
+
rel="noopener noreferrer"
|
| 10 |
+
className="text-lg tracking-wide text-transparent bg-clip-text bg-gradient-to-r from-purple-600 to-pink-600 hover:from-purple-700 hover:to-pink-700 transition-all duration-300 "
|
| 11 |
+
>
|
| 12 |
+
vnavarro.dev
|
| 13 |
+
</a>
|
| 14 |
+
{/* vertical inline */}
|
| 15 |
+
<div className="w-[1px] h-4 bg-gray-500" />
|
| 16 |
+
<div className="flex flex-row space-x-2">
|
| 17 |
<span>Powered by</span>
|
| 18 |
<a
|
| 19 |
href="https://huggingface.co/docs/transformers.js"
|
|
|
|
| 24 |
<span>🤗 Transformers.js</span>
|
| 25 |
</a>
|
| 26 |
</div>
|
|
|
|
|
|
|
|
|
|
| 27 |
</div>
|
| 28 |
</div>
|
| 29 |
</footer>
|
| 30 |
+
)
|
| 31 |
}
|
| 32 |
|
| 33 |
+
export default Footer
|
src/components/Sidebar.tsx
CHANGED
|
@@ -50,13 +50,13 @@ const Sidebar = ({ isOpen, onClose, setIsModalOpen }: SidebarProps) => {
|
|
| 50 |
</div>
|
| 51 |
|
| 52 |
{/* Content */}
|
| 53 |
-
<div className="flex-1 overflow-y-auto p-4 space-y-6">
|
| 54 |
{/* Pipeline Selection */}
|
| 55 |
-
<div className="space-y-3
|
| 56 |
-
<h3 className="text-md xl:text-lg font-semibold text-gray-900
|
| 57 |
Choose a Pipeline
|
| 58 |
</h3>
|
| 59 |
-
<div className="w-
|
| 60 |
<PipelineSelector
|
| 61 |
pipeline={pipeline}
|
| 62 |
setPipeline={setPipeline}
|
|
@@ -76,12 +76,12 @@ const Sidebar = ({ isOpen, onClose, setIsModalOpen }: SidebarProps) => {
|
|
| 76 |
<div className="flex flex-col items-center justify-center">
|
| 77 |
<ModelInfo />
|
| 78 |
{/* Model README Button */}
|
| 79 |
-
<div className="mt-4 w-
|
| 80 |
<button
|
| 81 |
onClick={() => setIsModalOpen(true)}
|
| 82 |
-
className="flex items-center w-
|
| 83 |
>
|
| 84 |
-
<FileText className="w-4 h-4 mr-2 shrink-0" />
|
| 85 |
<span className="truncate">View README.md</span>
|
| 86 |
</button>
|
| 87 |
</div>
|
|
|
|
| 50 |
</div>
|
| 51 |
|
| 52 |
{/* Content */}
|
| 53 |
+
<div className="flex-1 overflow-y-auto overflow-x-hidden p-4 space-y-6">
|
| 54 |
{/* Pipeline Selection */}
|
| 55 |
+
<div className="space-y-3">
|
| 56 |
+
<h3 className="text-md xl:text-lg font-semibold text-gray-900 mb-2">
|
| 57 |
Choose a Pipeline
|
| 58 |
</h3>
|
| 59 |
+
<div className="w-full">
|
| 60 |
<PipelineSelector
|
| 61 |
pipeline={pipeline}
|
| 62 |
setPipeline={setPipeline}
|
|
|
|
| 76 |
<div className="flex flex-col items-center justify-center">
|
| 77 |
<ModelInfo />
|
| 78 |
{/* Model README Button */}
|
| 79 |
+
<div className="mt-4 w-full max-w-44 mx-auto">
|
| 80 |
<button
|
| 81 |
onClick={() => setIsModalOpen(true)}
|
| 82 |
+
className="flex items-center w-full px-3 py-2 text-sm text-gray-600 bg-gray-50 rounded-lg border border-gray-200 hover:bg-gray-100 transition-colors"
|
| 83 |
>
|
| 84 |
+
<FileText className="w-4 h-4 mr-2 flex-shrink-0" />
|
| 85 |
<span className="truncate">View README.md</span>
|
| 86 |
</button>
|
| 87 |
</div>
|
src/components/pipelines/ImageClassification.tsx
CHANGED
|
@@ -185,7 +185,7 @@ function ImageClassification() {
|
|
| 185 |
const busy = status !== 'ready' || isClassifying
|
| 186 |
|
| 187 |
return (
|
| 188 |
-
<div className="flex flex-col h-full max-h-[
|
| 189 |
<div className="flex items-center justify-between mb-4">
|
| 190 |
<h1 className="text-2xl font-bold">Image Classification</h1>
|
| 191 |
<div className="flex gap-2">
|
|
|
|
| 185 |
const busy = status !== 'ready' || isClassifying
|
| 186 |
|
| 187 |
return (
|
| 188 |
+
<div className="flex flex-col h-full max-h-[88vh] w-full p-4">
|
| 189 |
<div className="flex items-center justify-between mb-4">
|
| 190 |
<h1 className="text-2xl font-bold">Image Classification</h1>
|
| 191 |
<div className="flex gap-2">
|
src/components/pipelines/TextClassification.tsx
CHANGED
|
@@ -80,10 +80,8 @@ function TextClassification() {
|
|
| 80 |
}
|
| 81 |
|
| 82 |
return (
|
| 83 |
-
<div className="flex flex-col h-full max-h-[
|
| 84 |
-
<h1 className="text-2xl font-bold mb-4 shrink-0">
|
| 85 |
-
Text Classification
|
| 86 |
-
</h1>
|
| 87 |
|
| 88 |
<div className="flex flex-col lg:flex-row gap-4 flex-1 min-h-0">
|
| 89 |
{/* Input Section */}
|
|
|
|
| 80 |
}
|
| 81 |
|
| 82 |
return (
|
| 83 |
+
<div className="flex flex-col h-full max-h-[88vh] w-full p-4">
|
| 84 |
+
<h1 className="text-2xl font-bold mb-4 shrink-0">Text Classification</h1>
|
|
|
|
|
|
|
| 85 |
|
| 86 |
<div className="flex flex-col lg:flex-row gap-4 flex-1 min-h-0">
|
| 87 |
{/* Input Section */}
|
src/components/pipelines/TextGeneration.tsx
CHANGED
|
@@ -153,7 +153,7 @@ function TextGeneration() {
|
|
| 153 |
const hasChatTemplate = modelInfo?.hasChatTemplate
|
| 154 |
|
| 155 |
return (
|
| 156 |
-
<div className="flex flex-col min-h-[70vh] h-full max-h-[
|
| 157 |
<div className="flex items-center justify-between mb-4">
|
| 158 |
<h1 className="text-2xl font-bold">
|
| 159 |
Text Generation {hasChatTemplate ? '(Chat)' : ''}
|
|
|
|
| 153 |
const hasChatTemplate = modelInfo?.hasChatTemplate
|
| 154 |
|
| 155 |
return (
|
| 156 |
+
<div className="flex flex-col min-h-[70vh] h-full max-h-[88vh] w-full p-4">
|
| 157 |
<div className="flex items-center justify-between mb-4">
|
| 158 |
<h1 className="text-2xl font-bold">
|
| 159 |
Text Generation {hasChatTemplate ? '(Chat)' : ''}
|
src/components/pipelines/ZeroShotClassification.tsx
CHANGED
|
@@ -81,7 +81,7 @@ function ZeroShotClassification() {
|
|
| 81 |
const busy: boolean = status !== 'ready'
|
| 82 |
|
| 83 |
return (
|
| 84 |
-
<div className="flex flex-col h-full max-h-[
|
| 85 |
<div className="flex items-center justify-between mb-4">
|
| 86 |
<h1 className="text-2xl font-bold">Zero-Shot Classification</h1>
|
| 87 |
</div>
|
|
|
|
| 81 |
const busy: boolean = status !== 'ready'
|
| 82 |
|
| 83 |
return (
|
| 84 |
+
<div className="flex flex-col h-full max-h-[88vh] w-full p-4">
|
| 85 |
<div className="flex items-center justify-between mb-4">
|
| 86 |
<h1 className="text-2xl font-bold">Zero-Shot Classification</h1>
|
| 87 |
</div>
|