cfahlgren1 HF staff commited on
Commit
d5fd068
1 Parent(s): b73b7f6

improve svgs

Browse files
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 200 100" className={`w-full h-auto max-h-28 ${className}`}>
10
- <rect x="0" y="0" width="200" height="100" fill="#a855f7" rx="10" ry="10" />
11
 
12
- {/* Input text */}
13
  <rect x="10" y="10" width="80" height="80" fill="#faf5ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
14
- <text x="20" y="30" fill="#7e22ce" fontSize="10" fontWeight="bold">Unclassified</text>
15
- <text x="20" y="45" fill="#7e22ce" fontSize="10" fontWeight="bold">Text or</text>
16
- <text x="20" y="60" fill="#7e22ce" fontSize="10" fontWeight="bold">Image</text>
17
 
18
  {/* Arrow */}
19
- <line x1="95" y1="50" x2="105" y2="50" stroke="#fff" strokeWidth="2" />
20
- <polygon points="105,46 113,50 105,54" fill="#fff" />
21
 
22
- {/* Classification result */}
23
- <rect x="110" y="10" width="80" height="80" fill="#faf5ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
24
- <rect x="115" y="20" width="70" height="15" fill="#d8b4fe" rx="3" ry="3" />
25
- <text x="120" y="31" fill="#6b21a8" fontSize="10">Category A</text>
26
- <rect x="115" y="40" width="70" height="15" fill="#d8b4fe" rx="3" ry="3" />
27
- <text x="120" y="51" fill="#6b21a8" fontSize="10">Category B</text>
28
- <rect x="115" y="60" width="70" height="15" fill="#d8b4fe" rx="3" ry="3" />
29
- <text x="120" y="71" fill="#6b21a8" fontSize="10">Category C</text>
 
 
 
 
 
 
 
 
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 200 100" className={`w-full h-auto max-h-28 ${className}`}>
10
- <rect x="0" y="0" width="200" height="100" fill="#5eead4" rx="10" ry="10" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  {/* Text representation */}
13
- <rect x="10" y="10" width="80" height="80" fill="#f0fdfa" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
14
- <text x="20" y="40" fill="#f472b6" fontSize="14" fontWeight="bold">Hello</text>
15
- <text x="20" y="70" fill="#60a5fa" fontSize="14" fontWeight="bold">World</text>
 
 
 
 
 
 
16
 
17
- {/* Arrow */}
18
- <line x1="95" y1="50" x2="105" y2="50" stroke="#fff" strokeWidth="2" />
19
- <polygon points="105,46 113,50 105,54" fill="#fff" />
 
 
 
 
20
 
21
  {/* 3D space representation */}
22
- <rect x="110" y="10" width="80" height="80" fill="#f0fdfa" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
23
 
24
  {/* Improved 3D axes with reduced opacity */}
25
- <line x1="115" y1="85" x2="185" y2="85" stroke="#0f766e" strokeWidth="1" opacity="0.3" />
26
- <polygon points="185,85 181,83 181,87" fill="#0f766e" opacity="0.3" />
27
- <text x="187" y="89" fill="#0f766e" fontSize="8" opacity="0.3">x</text>
 
28
 
29
- <line x1="115" y1="85" x2="115" y2="15" stroke="#0f766e" strokeWidth="1" opacity="0.3" />
30
- <polygon points="115,15 113,19 117,19" fill="#0f766e" opacity="0.3" />
31
- <text x="111" y="13" fill="#0f766e" fontSize="8" opacity="0.3">y</text>
32
 
33
- <line x1="115" y1="85" x2="145" y2="65" stroke="#0f766e" strokeWidth="1" opacity="0.3" />
34
- <polygon points="145,65 141,67 143,70" fill="#0f766e" opacity="0.3" />
35
- <text x="147" y="64" fill="#0f766e" fontSize="8" opacity="0.3">z</text>
 
36
 
37
- {/* 3D points */}
38
- <circle cx="150" cy="40" r="4" fill="#f472b6" />
39
- <text x="157" y="44" fill="#f472b6" fontSize="10" fontWeight="bold">Hello</text>
40
- <circle cx="155" cy="70" r="4" fill="#60a5fa" />
41
- <text x="120" y="74" fill="#60a5fa" fontSize="10" fontWeight="bold">World</text>
 
 
 
 
 
 
 
 
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 200 100" className={`w-full h-auto max-h-28 ${className}`}>
10
- <rect x="0" y="0" width="200" height="100" fill="#818cf8" rx="10" ry="10" />
11
 
12
  {/* Original Image */}
13
- <rect x="10" y="10" width="80" height="80" fill="#e0e0e0" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
14
- <circle cx="35" cy="35" r="15" fill="#fbbf24" />
15
- <rect x="55" y="45" width="25" height="35" fill="#34d399" />
16
 
17
  {/* Arrow */}
18
- <line x1="95" y1="50" x2="105" y2="50" stroke="#fff" strokeWidth="2" />
19
- <polygon points="105,46 113,50 105,54" fill="#fff" />
20
 
21
  {/* Segmented Image */}
22
- <rect x="110" y="10" width="80" height="80" fill="#e0e0e0" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
23
- <circle cx="135" cy="35" r="15" fill="#fbbf24" stroke="#e11d48" strokeWidth="2" strokeDasharray="4 2" />
24
- <rect x="155" y="45" width="25" height="35" fill="#34d399" stroke="#e11d48" strokeWidth="2" strokeDasharray="4 2" />
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 200 100"
12
  className={`w-full h-auto max-h-28 ${className}`}
13
  >
14
- <rect x="0" y="0" width="200" height="100" fill="#fbbf24" rx="10" ry="10" />
15
 
16
  {/* Input text */}
17
- <rect x="10" y="10" width="80" height="80" fill="#fffbeb" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
18
- <text x="15" y="35" fill="#92400e" fontSize="8" fontWeight="bold">Great product!</text>
19
- <text x="15" y="50" fill="#92400e" fontSize="8" fontWeight="bold">Highly</text>
20
- <text x="15" y="65" fill="#92400e" fontSize="8" fontWeight="bold">recommended.</text>
21
 
22
  {/* Arrow */}
23
- <line x1="95" y1="50" x2="105" y2="50" stroke="#fff" strokeWidth="2" />
24
- <polygon points="105,46 113,50 105,54" fill="#fff" />
25
 
26
  {/* Sentiment analysis result */}
27
- <rect x="110" y="10" width="80" height="80" fill="#fffbeb" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
28
 
29
  {/* Sentiment gauge background */}
30
- <rect x="120" y="30" width="60" height="20" fill="#e5e7eb" rx="10" ry="10" />
31
 
32
  {/* Sentiment gauge fill (80% positive) */}
33
- <rect x="120" y="30" width="48" height="20" fill="#4ade80" rx="10" ry="10" />
34
 
35
  {/* Sentiment score text */}
36
- <text x="150" y="70" fill="#4ade80" fontSize="14" fontWeight="bold" textAnchor="middle">80%</text>
37
- <text x="150" y="85" fill="#92400e" fontSize="10" textAnchor="middle">Positive</text>
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 200 100" className={`w-full h-auto max-h-28 ${className}`}>
10
- <rect x="0" y="0" width="200" height="100" fill="#3b82f6" rx="10" ry="10" />
11
 
12
  {/* Input prompt */}
13
- <rect x="10" y="10" width="80" height="80" fill="#eff6ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
14
- <text x="20" y="40" fill="#1d4ed8" fontSize="10" fontWeight="bold">Prompt:</text>
15
- <text x="20" y="55" fill="#1d4ed8" fontSize="10" fontWeight="bold">Generate a</text>
16
- <text x="20" y="70" fill="#1d4ed8" fontSize="10" fontWeight="bold">story about...</text>
17
 
18
  {/* Arrow */}
19
- <line x1="95" y1="50" x2="105" y2="50" stroke="#fff" strokeWidth="2" />
20
- <polygon points="105,46 113,50 105,54" fill="#fff" />
21
 
22
  {/* Generated text */}
23
- <rect x="110" y="10" width="80" height="80" fill="#eff6ff" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
24
- <text x="120" y="25" fill="#1e40af" fontSize="8">Once upon a time,</text>
25
- <text x="120" y="35" fill="#1e40af" fontSize="8">in a land far away,</text>
26
- <text x="120" y="45" fill="#1e40af" fontSize="8">there was a brave</text>
27
- <text x="120" y="55" fill="#1e40af" fontSize="8">knight who...</text>
28
- <line x1="120" y1="65" x2="180" y2="65" stroke="#93c5fd" strokeWidth="1" />
29
- <line x1="120" y1="75" x2="170" y2="75" stroke="#93c5fd" strokeWidth="1" />
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 200 100" className={`w-full h-auto max-h-28 ${className}`}>
10
- <rect x="0" y="0" width="200" height="100" fill="#fb7185" rx="10" ry="10" />
11
 
12
  {/* Audio waveform */}
13
- <rect x="10" y="10" width="80" height="80" fill="#fff1f2" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
14
- <path d="M15 50 Q 25 20, 35 50 Q 45 80, 55 50 Q 65 20, 75 50 Q 85 80, 95 50"
15
- fill="none" stroke="#e11d48" strokeWidth="2" />
 
 
 
 
 
 
 
16
 
17
  {/* Arrow */}
18
- <line x1="95" y1="50" x2="105" y2="50" stroke="#fff" strokeWidth="2" />
19
- <polygon points="105,46 113,50 105,54" fill="#fff" />
20
 
21
  {/* Transcribed text */}
22
- <rect x="110" y="10" width="80" height="80" fill="#fff1f2" stroke="#fff" strokeWidth="1" rx="5" ry="5" />
23
- <text x="120" y="30" fill="#be123c" fontSize="10" fontWeight="bold">Hello, how</text>
24
- <text x="120" y="45" fill="#be123c" fontSize="10" fontWeight="bold">are you</text>
25
- <text x="120" y="60" fill="#be123c" fontSize="10" fontWeight="bold">today?</text>
26
- <line x1="120" y1="70" x2="180" y2="70" stroke="#fda4af" strokeWidth="1" />
27
- <line x1="120" y1="80" x2="170" y2="80" stroke="#fda4af" strokeWidth="1" />
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
  };