Commit
•
d5fd068
1
Parent(s):
b73b7f6
improve svgs
Browse files- README.md +1 -1
- components/CategoryRow.tsx +1 -2
- lib/categories.tsx +18 -18
- lib/icons/ClassificationIcon.tsx +23 -16
- lib/icons/EmbeddingIcon.tsx +59 -23
- lib/icons/SegmentationIcon.tsx +10 -10
- lib/icons/SentimentAnalysisIcon.tsx +13 -13
- lib/icons/TextGenerationIcon.tsx +15 -15
- lib/icons/TranscriptionIcon.tsx +20 -13
README.md
CHANGED
@@ -8,7 +8,7 @@ pinned: false
|
|
8 |
---
|
9 |
# Transformers.js Playground
|
10 |
|
11 |
-
![Transformers.js Playground](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/webllm/shot.png)
|
12 |
|
13 |
## Getting Started
|
14 |
|
|
|
8 |
---
|
9 |
# Transformers.js Playground
|
10 |
|
11 |
+
![Transformers.js Playground](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/webllm/shot.png?)
|
12 |
|
13 |
## Getting Started
|
14 |
|
components/CategoryRow.tsx
CHANGED
@@ -12,9 +12,8 @@ export default function CategoryRow({ categories }: CategoryRowProps) {
|
|
12 |
{categories.map((category, index) => (
|
13 |
<motion.div
|
14 |
key={category.title}
|
15 |
-
whileInView={{ opacity: 1, y: 0 }}
|
16 |
-
viewport={{ once: false }}
|
17 |
initial={{ opacity: 0, y: 20 }}
|
|
|
18 |
transition={{ duration: 0.5, delay: index * 0.1 }}
|
19 |
>
|
20 |
<CategoryCard {...category} />
|
|
|
12 |
{categories.map((category, index) => (
|
13 |
<motion.div
|
14 |
key={category.title}
|
|
|
|
|
15 |
initial={{ opacity: 0, y: 20 }}
|
16 |
+
animate={{ opacity: 1, y: 0 }}
|
17 |
transition={{ duration: 0.5, delay: index * 0.1 }}
|
18 |
>
|
19 |
<CategoryCard {...category} />
|
lib/categories.tsx
CHANGED
@@ -9,6 +9,24 @@ import ClassificationIcon from './icons/ClassificationIcon';
|
|
9 |
import TextGenerationIcon from './icons/TextGenerationIcon';
|
10 |
|
11 |
export const categories: Category[] = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
{
|
13 |
title: "Segment",
|
14 |
slug: "segment",
|
@@ -27,15 +45,6 @@ export const categories: Category[] = [
|
|
27 |
colorName: "teal",
|
28 |
graphic: EmbeddingIcon
|
29 |
},
|
30 |
-
{
|
31 |
-
title: "Transcribe",
|
32 |
-
slug: "transcribe",
|
33 |
-
icon: Mic,
|
34 |
-
description: "AI that hears all and forgets nothing (except the 'uhms').",
|
35 |
-
status: "Available",
|
36 |
-
colorName: "rose",
|
37 |
-
graphic: TranscriptionIcon
|
38 |
-
},
|
39 |
{
|
40 |
title: "Sentiment",
|
41 |
slug: "sentiment",
|
@@ -54,13 +63,4 @@ export const categories: Category[] = [
|
|
54 |
colorName: "purple",
|
55 |
graphic: ClassificationIcon
|
56 |
},
|
57 |
-
{
|
58 |
-
title: "Generate Text",
|
59 |
-
slug: "generate-text",
|
60 |
-
icon: Type,
|
61 |
-
description: "Llama. Qwen. Enough said.",
|
62 |
-
status: "Available",
|
63 |
-
colorName: "blue",
|
64 |
-
graphic: TextGenerationIcon
|
65 |
-
}
|
66 |
];
|
|
|
9 |
import TextGenerationIcon from './icons/TextGenerationIcon';
|
10 |
|
11 |
export const categories: Category[] = [
|
12 |
+
{
|
13 |
+
title: "Generate Text",
|
14 |
+
slug: "generate-text",
|
15 |
+
icon: Type,
|
16 |
+
description: "Llama. Qwen. Enough said.",
|
17 |
+
status: "Available",
|
18 |
+
colorName: "blue",
|
19 |
+
graphic: TextGenerationIcon
|
20 |
+
},
|
21 |
+
{
|
22 |
+
title: "Transcribe",
|
23 |
+
slug: "transcribe",
|
24 |
+
icon: Mic,
|
25 |
+
description: "AI that hears all and forgets nothing (except the 'uhms').",
|
26 |
+
status: "Available",
|
27 |
+
colorName: "rose",
|
28 |
+
graphic: TranscriptionIcon
|
29 |
+
},
|
30 |
{
|
31 |
title: "Segment",
|
32 |
slug: "segment",
|
|
|
45 |
colorName: "teal",
|
46 |
graphic: EmbeddingIcon
|
47 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
{
|
49 |
title: "Sentiment",
|
50 |
slug: "sentiment",
|
|
|
63 |
colorName: "purple",
|
64 |
graphic: ClassificationIcon
|
65 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
];
|
lib/icons/ClassificationIcon.tsx
CHANGED
@@ -6,27 +6,34 @@ interface ClassificationIconProps {
|
|
6 |
|
7 |
const ClassificationIcon: React.FC<ClassificationIconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
10 |
-
<rect x="0" y="0" width="
|
11 |
|
12 |
-
{/* Input
|
13 |
<rect x="10" y="10" width="80" height="80" fill="#faf5ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
14 |
-
<text x="
|
15 |
-
<text x="
|
16 |
-
<text x="20" y="60" fill="#7e22ce" fontSize="10" fontWeight="bold">Image</text>
|
17 |
|
18 |
{/* Arrow */}
|
19 |
-
<line x1="95" y1="50" x2="
|
20 |
-
<polygon points="
|
21 |
|
22 |
-
{/*
|
23 |
-
<rect x="
|
24 |
-
<
|
25 |
-
|
26 |
-
|
27 |
-
<
|
28 |
-
<
|
29 |
-
<text x="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
</svg>
|
31 |
);
|
32 |
};
|
|
|
6 |
|
7 |
const ClassificationIcon: React.FC<ClassificationIconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 100" className={`w-full h-auto max-h-28 ${className}`}>
|
10 |
+
<rect x="0" y="0" width="220" height="100" fill="#a855f7" rx="10" ry="10" />
|
11 |
|
12 |
+
{/* Input */}
|
13 |
<rect x="10" y="10" width="80" height="80" fill="#faf5ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
14 |
+
<text x="15" y="30" fill="#7e22ce" fontSize="12" fontWeight="bold">Inputs</text>
|
15 |
+
<text x="15" y="50" fill="#7e22ce" fontSize="10" fontWeight="bold">Basketball</text>
|
|
|
16 |
|
17 |
{/* Arrow */}
|
18 |
+
<line x1="95" y1="50" x2="115" y2="50" stroke="#fff" strokeWidth="2" />
|
19 |
+
<polygon points="115,46 123,50 115,54" fill="#fff" />
|
20 |
|
21 |
+
{/* Output */}
|
22 |
+
<rect x="120" y="10" width="90" height="80" fill="#faf5ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
23 |
+
<text x="125" y="25" fill="#7e22ce" fontSize="12" fontWeight="bold">Output</text>
|
24 |
+
|
25 |
+
{/* Classification bars */}
|
26 |
+
<rect x="125" y="35" width="75" height="14" fill="#d8b4fe" rx="3" ry="3" />
|
27 |
+
<text x="130" y="45" fill="#6b21a8" fontSize="10" fontWeight="bold">Sport</text>
|
28 |
+
<text x="193" y="45" fill="#6b21a8" fontSize="10" textAnchor="end">0.800</text>
|
29 |
+
|
30 |
+
<rect x="125" y="53" width="30" height="14" fill="#d8b4fe" rx="3" ry="3" />
|
31 |
+
<text x="130" y="63" fill="#6b21a8" fontSize="10" fontWeight="bold">Food</text>
|
32 |
+
<text x="193" y="63" fill="#6b21a8" fontSize="10" textAnchor="end">0.150</text>
|
33 |
+
|
34 |
+
<rect x="125" y="71" width="10" height="14" fill="#d8b4fe" rx="3" ry="3" />
|
35 |
+
<text x="130" y="81" fill="#6b21a8" fontSize="10" fontWeight="bold">Music</text>
|
36 |
+
<text x="193" y="81" fill="#6b21a8" fontSize="10" textAnchor="end">0.050</text>
|
37 |
</svg>
|
38 |
);
|
39 |
};
|
lib/icons/EmbeddingIcon.tsx
CHANGED
@@ -6,39 +6,75 @@ interface IconProps {
|
|
6 |
|
7 |
const EmbeddingIcon: React.FC<IconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
10 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
{/* Text representation */}
|
13 |
-
<rect x="
|
14 |
-
<text x="
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
-
{/* Arrow */}
|
18 |
-
<line x1="
|
19 |
-
|
|
|
|
|
|
|
|
|
20 |
|
21 |
{/* 3D space representation */}
|
22 |
-
<rect x="
|
23 |
|
24 |
{/* Improved 3D axes with reduced opacity */}
|
25 |
-
<
|
26 |
-
|
27 |
-
|
|
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
36 |
|
37 |
-
{/* 3D points */}
|
38 |
-
<
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
</svg>
|
43 |
);
|
44 |
};
|
|
|
6 |
|
7 |
const EmbeddingIcon: React.FC<IconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 100" className={`w-full h-auto max-h-28 ${className}`}>
|
10 |
+
<defs>
|
11 |
+
<linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
12 |
+
<stop offset="0%" stopColor="#5eead4" />
|
13 |
+
<stop offset="100%" stopColor="#2dd4bf" />
|
14 |
+
</linearGradient>
|
15 |
+
<filter id="glow">
|
16 |
+
<feGaussianBlur stdDeviation="2" result="coloredBlur"/>
|
17 |
+
<feMerge>
|
18 |
+
<feMergeNode in="coloredBlur"/>
|
19 |
+
<feMergeNode in="SourceGraphic"/>
|
20 |
+
</feMerge>
|
21 |
+
</filter>
|
22 |
+
</defs>
|
23 |
+
|
24 |
+
<rect x="0" y="0" width="220" height="100" fill="url(#bgGradient)" rx="10" ry="10">
|
25 |
+
<animate attributeName="opacity" values="0.8;1;0.8" dur="3s" repeatCount="indefinite" />
|
26 |
+
</rect>
|
27 |
|
28 |
{/* Text representation */}
|
29 |
+
<rect x="15" y="10" width="80" height="80" fill="#f0fdfa" stroke="#fff" strokeWidth="1" rx="5" ry="5" filter="url(#glow)" />
|
30 |
+
<text x="25" y="40" fill="#f472b6" fontSize="14" fontWeight="bold">
|
31 |
+
<tspan>Hello</tspan>
|
32 |
+
<animate attributeName="opacity" values="0.5;1;0.5" dur="2s" repeatCount="indefinite" />
|
33 |
+
</text>
|
34 |
+
<text x="25" y="70" fill="#60a5fa" fontSize="14" fontWeight="bold">
|
35 |
+
<tspan>World</tspan>
|
36 |
+
<animate attributeName="opacity" values="0.5;1;0.5" dur="2s" repeatCount="indefinite" begin="1s" />
|
37 |
+
</text>
|
38 |
|
39 |
+
{/* Animated Arrow */}
|
40 |
+
<line x1="105" y1="50" x2="115" y2="50" stroke="#fff" strokeWidth="3">
|
41 |
+
<animate attributeName="x2" values="115;120;115" dur="1.5s" repeatCount="indefinite" />
|
42 |
+
</line>
|
43 |
+
<polygon points="115,45 122,50 115,55" fill="#fff">
|
44 |
+
<animate attributeName="points" values="115,45 122,50 115,55;120,45 127,50 120,55;115,45 122,50 115,55" dur="1.5s" repeatCount="indefinite" />
|
45 |
+
</polygon>
|
46 |
|
47 |
{/* 3D space representation */}
|
48 |
+
<rect x="125" y="10" width="80" height="80" fill="#f0fdfa" stroke="#fff" strokeWidth="1" rx="5" ry="5" filter="url(#glow)" />
|
49 |
|
50 |
{/* Improved 3D axes with reduced opacity */}
|
51 |
+
<g opacity="0.3">
|
52 |
+
<line x1="130" y1="85" x2="200" y2="85" stroke="#0f766e" strokeWidth="1" />
|
53 |
+
<polygon points="200,85 196,83 196,87" fill="#0f766e" />
|
54 |
+
<text x="202" y="89" fill="#0f766e" fontSize="8">x</text>
|
55 |
|
56 |
+
<line x1="130" y1="85" x2="130" y2="15" stroke="#0f766e" strokeWidth="1" />
|
57 |
+
<polygon points="130,15 128,19 132,19" fill="#0f766e" />
|
58 |
+
<text x="126" y="13" fill="#0f766e" fontSize="8">y</text>
|
59 |
|
60 |
+
<line x1="130" y1="85" x2="160" y2="65" stroke="#0f766e" strokeWidth="1" />
|
61 |
+
<polygon points="160,65 156,67 158,70" fill="#0f766e" />
|
62 |
+
<text x="162" y="64" fill="#0f766e" fontSize="8">z</text>
|
63 |
+
</g>
|
64 |
|
65 |
+
{/* Animated 3D points */}
|
66 |
+
<g>
|
67 |
+
<circle cx="165" cy="40" r="4" fill="#f472b6">
|
68 |
+
<animate attributeName="r" values="3;5;3" dur="2s" repeatCount="indefinite" />
|
69 |
+
</circle>
|
70 |
+
<text x="172" y="44" fill="#f472b6" fontSize="10" fontWeight="bold">Hello</text>
|
71 |
+
</g>
|
72 |
+
<g>
|
73 |
+
<circle cx="170" cy="70" r="4" fill="#60a5fa">
|
74 |
+
<animate attributeName="r" values="3;5;3" dur="2s" repeatCount="indefinite" begin="1s" />
|
75 |
+
</circle>
|
76 |
+
<text x="135" y="74" fill="#60a5fa" fontSize="10" fontWeight="bold">World</text>
|
77 |
+
</g>
|
78 |
</svg>
|
79 |
);
|
80 |
};
|
lib/icons/SegmentationIcon.tsx
CHANGED
@@ -6,22 +6,22 @@ interface IconProps {
|
|
6 |
|
7 |
const SegmentationIcon: React.FC<IconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
10 |
-
<rect x="0" y="0" width="
|
11 |
|
12 |
{/* Original Image */}
|
13 |
-
<rect x="
|
14 |
-
<circle cx="
|
15 |
-
<rect x="
|
16 |
|
17 |
{/* Arrow */}
|
18 |
-
<line x1="
|
19 |
-
<polygon points="
|
20 |
|
21 |
{/* Segmented Image */}
|
22 |
-
<rect x="
|
23 |
-
<circle cx="
|
24 |
-
<rect x="
|
25 |
</svg>
|
26 |
);
|
27 |
};
|
|
|
6 |
|
7 |
const SegmentationIcon: React.FC<IconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 100" className={`w-full h-auto max-h-28 ${className}`}>
|
10 |
+
<rect x="0" y="0" width="220" height="100" fill="#818cf8" rx="10" ry="10" />
|
11 |
|
12 |
{/* Original Image */}
|
13 |
+
<rect x="15" y="10" width="80" height="80" fill="#e0e0e0" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
14 |
+
<circle cx="40" cy="35" r="15" fill="#fbbf24" />
|
15 |
+
<rect x="60" y="45" width="25" height="35" fill="#34d399" />
|
16 |
|
17 |
{/* Arrow */}
|
18 |
+
<line x1="105" y1="50" x2="115" y2="50" stroke="#fff" strokeWidth="3" />
|
19 |
+
<polygon points="115,45 122,50 115,55" fill="#fff" />
|
20 |
|
21 |
{/* Segmented Image */}
|
22 |
+
<rect x="125" y="10" width="80" height="80" fill="#e0e0e0" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
23 |
+
<circle cx="150" cy="35" r="15" fill="#fbbf24" stroke="#e11d48" strokeWidth="2" strokeDasharray="4 2" />
|
24 |
+
<rect x="170" y="45" width="25" height="35" fill="#34d399" stroke="#e11d48" strokeWidth="2" strokeDasharray="4 2" />
|
25 |
</svg>
|
26 |
);
|
27 |
};
|
lib/icons/SentimentAnalysisIcon.tsx
CHANGED
@@ -8,33 +8,33 @@ const SentimentAnalysisIcon: React.FC<IconProps> = ({ className = '' }) => {
|
|
8 |
return (
|
9 |
<svg
|
10 |
xmlns="http://www.w3.org/2000/svg"
|
11 |
-
viewBox="0 0
|
12 |
className={`w-full h-auto max-h-28 ${className}`}
|
13 |
>
|
14 |
-
<rect x="0" y="0" width="
|
15 |
|
16 |
{/* Input text */}
|
17 |
-
<rect x="
|
18 |
-
<text x="
|
19 |
-
<text x="
|
20 |
-
<text x="
|
21 |
|
22 |
{/* Arrow */}
|
23 |
-
<line x1="
|
24 |
-
<polygon points="
|
25 |
|
26 |
{/* Sentiment analysis result */}
|
27 |
-
<rect x="
|
28 |
|
29 |
{/* Sentiment gauge background */}
|
30 |
-
<rect x="
|
31 |
|
32 |
{/* Sentiment gauge fill (80% positive) */}
|
33 |
-
<rect x="
|
34 |
|
35 |
{/* Sentiment score text */}
|
36 |
-
<text x="
|
37 |
-
<text x="
|
38 |
</svg>
|
39 |
);
|
40 |
};
|
|
|
8 |
return (
|
9 |
<svg
|
10 |
xmlns="http://www.w3.org/2000/svg"
|
11 |
+
viewBox="0 0 220 100"
|
12 |
className={`w-full h-auto max-h-28 ${className}`}
|
13 |
>
|
14 |
+
<rect x="0" y="0" width="220" height="100" fill="#fbbf24" rx="10" ry="10" />
|
15 |
|
16 |
{/* Input text */}
|
17 |
+
<rect x="15" y="10" width="80" height="80" fill="#fffbeb" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
18 |
+
<text x="20" y="35" fill="#92400e" fontSize="10" fontWeight="bold">Great product!</text>
|
19 |
+
<text x="20" y="50" fill="#92400e" fontSize="10" fontWeight="bold">Highly</text>
|
20 |
+
<text x="20" y="65" fill="#92400e" fontSize="10" fontWeight="bold">recommended.</text>
|
21 |
|
22 |
{/* Arrow */}
|
23 |
+
<line x1="105" y1="50" x2="115" y2="50" stroke="#fff" strokeWidth="3" />
|
24 |
+
<polygon points="115,45 122,50 115,55" fill="#fff" />
|
25 |
|
26 |
{/* Sentiment analysis result */}
|
27 |
+
<rect x="125" y="10" width="80" height="80" fill="#fffbeb" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
28 |
|
29 |
{/* Sentiment gauge background */}
|
30 |
+
<rect x="135" y="30" width="60" height="20" fill="#e5e7eb" rx="10" ry="10" />
|
31 |
|
32 |
{/* Sentiment gauge fill (80% positive) */}
|
33 |
+
<rect x="135" y="30" width="48" height="20" fill="#4ade80" rx="10" ry="10" />
|
34 |
|
35 |
{/* Sentiment score text */}
|
36 |
+
<text x="165" y="70" fill="#4ade80" fontSize="14" fontWeight="bold" textAnchor="middle">80%</text>
|
37 |
+
<text x="165" y="85" fill="#92400e" fontSize="10" textAnchor="middle">Positive</text>
|
38 |
</svg>
|
39 |
);
|
40 |
};
|
lib/icons/TextGenerationIcon.tsx
CHANGED
@@ -6,27 +6,27 @@ interface TextGenerationIconProps {
|
|
6 |
|
7 |
const TextGenerationIcon: React.FC<TextGenerationIconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
10 |
-
<rect x="0" y="0" width="
|
11 |
|
12 |
{/* Input prompt */}
|
13 |
-
<rect x="
|
14 |
-
<text x="20" y="
|
15 |
-
<text x="20" y="
|
16 |
-
<text x="20" y="
|
17 |
|
18 |
{/* Arrow */}
|
19 |
-
<line x1="
|
20 |
-
<polygon points="
|
21 |
|
22 |
{/* Generated text */}
|
23 |
-
<rect x="
|
24 |
-
<text x="
|
25 |
-
<text x="
|
26 |
-
<text x="
|
27 |
-
<text x="
|
28 |
-
<line x1="
|
29 |
-
<line x1="
|
30 |
</svg>
|
31 |
);
|
32 |
};
|
|
|
6 |
|
7 |
const TextGenerationIcon: React.FC<TextGenerationIconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 100" className={`w-full h-auto max-h-28 ${className}`}>
|
10 |
+
<rect x="0" y="0" width="220" height="100" fill="#3b82f6" rx="10" ry="10" />
|
11 |
|
12 |
{/* Input prompt */}
|
13 |
+
<rect x="15" y="10" width="80" height="80" fill="#eff6ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
14 |
+
<text x="20" y="30" fill="#1d4ed8" fontSize="9" fontWeight="bold">Prompt:</text>
|
15 |
+
<text x="20" y="45" fill="#1d4ed8" fontSize="9" fontWeight="bold">Generate a</text>
|
16 |
+
<text x="20" y="60" fill="#1d4ed8" fontSize="9" fontWeight="bold">story about...</text>
|
17 |
|
18 |
{/* Arrow */}
|
19 |
+
<line x1="105" y1="50" x2="115" y2="50" stroke="#fff" strokeWidth="3" />
|
20 |
+
<polygon points="115,45 122,50 115,55" fill="#fff" />
|
21 |
|
22 |
{/* Generated text */}
|
23 |
+
<rect x="125" y="10" width="80" height="80" fill="#eff6ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
24 |
+
<text x="130" y="30" fill="#1e40af" fontSize="8">Once upon a time,</text>
|
25 |
+
<text x="130" y="42" fill="#1e40af" fontSize="8">in a land far away,</text>
|
26 |
+
<text x="130" y="54" fill="#1e40af" fontSize="8">there was a brave</text>
|
27 |
+
<text x="130" y="66" fill="#1e40af" fontSize="8">knight who...</text>
|
28 |
+
<line x1="130" y1="75" x2="190" y2="75" stroke="#93c5fd" strokeWidth="1" />
|
29 |
+
<line x1="130" y1="80" x2="180" y2="80" stroke="#93c5fd" strokeWidth="1" />
|
30 |
</svg>
|
31 |
);
|
32 |
};
|
lib/icons/TranscriptionIcon.tsx
CHANGED
@@ -6,25 +6,32 @@ interface TranscriptionIconProps {
|
|
6 |
|
7 |
const TranscriptionIcon: React.FC<TranscriptionIconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0
|
10 |
-
<rect x="0" y="0" width="
|
11 |
|
12 |
{/* Audio waveform */}
|
13 |
-
<rect x="
|
14 |
-
<
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
|
17 |
{/* Arrow */}
|
18 |
-
<line x1="
|
19 |
-
<polygon points="
|
20 |
|
21 |
{/* Transcribed text */}
|
22 |
-
<rect x="
|
23 |
-
<text x="
|
24 |
-
<text x="
|
25 |
-
<text x="
|
26 |
-
<line x1="
|
27 |
-
<line x1="
|
28 |
</svg>
|
29 |
);
|
30 |
};
|
|
|
6 |
|
7 |
const TranscriptionIcon: React.FC<TranscriptionIconProps> = ({ className = '' }) => {
|
8 |
return (
|
9 |
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 100" className={`w-full h-auto max-h-28 ${className}`}>
|
10 |
+
<rect x="0" y="0" width="220" height="100" fill="#fb7185" rx="10" ry="10" />
|
11 |
|
12 |
{/* Audio waveform */}
|
13 |
+
<rect x="15" y="10" width="80" height="80" fill="#fff1f2" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
14 |
+
<g fill="#e11d48">
|
15 |
+
<rect x="25" y="35" width="5" height="30" />
|
16 |
+
<rect x="35" y="25" width="5" height="50" />
|
17 |
+
<rect x="45" y="15" width="5" height="70" />
|
18 |
+
<rect x="55" y="30" width="5" height="40" />
|
19 |
+
<rect x="65" y="20" width="5" height="60" />
|
20 |
+
<rect x="75" y="40" width="5" height="20" />
|
21 |
+
<rect x="85" y="35" width="5" height="30" />
|
22 |
+
</g>
|
23 |
|
24 |
{/* Arrow */}
|
25 |
+
<line x1="105" y1="50" x2="115" y2="50" stroke="#fff" strokeWidth="3" />
|
26 |
+
<polygon points="115,45 122,50 115,55" fill="#fff" />
|
27 |
|
28 |
{/* Transcribed text */}
|
29 |
+
<rect x="125" y="10" width="80" height="80" fill="#fff1f2" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
|
30 |
+
<text x="130" y="35" fill="#be123c" fontSize="9" fontWeight="bold">Hello, how</text>
|
31 |
+
<text x="130" y="50" fill="#be123c" fontSize="9" fontWeight="bold">are you</text>
|
32 |
+
<text x="130" y="65" fill="#be123c" fontSize="9" fontWeight="bold">today?</text>
|
33 |
+
<line x1="130" y1="75" x2="190" y2="75" stroke="#fda4af" strokeWidth="1" />
|
34 |
+
<line x1="130" y1="80" x2="180" y2="80" stroke="#fda4af" strokeWidth="1" />
|
35 |
</svg>
|
36 |
);
|
37 |
};
|