Commit
•
0d21acd
1
Parent(s):
3aaa41e
add a couple categories, improve look and feel
Browse files- components/CategoryCard.tsx +17 -9
- components/CategoryPage.tsx +53 -0
- components/PillLink.tsx +16 -10
- lib/categories.tsx +25 -1
- lib/icons/ClassificationIcon.tsx +34 -0
- lib/icons/EmbeddingIcon.tsx +12 -4
- lib/icons/SentimentAnalysisIcon.tsx +10 -4
- lib/icons/TextGenerationIcon.tsx +34 -0
- lib/segment/index.tsx +0 -0
- lib/utils.ts +48 -12
- types/categories.ts +1 -0
components/CategoryCard.tsx
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
import React from 'react';
|
|
|
2 |
import type { Category } from '../types/categories';
|
3 |
import { getColorConfig } from '../lib/utils';
|
4 |
|
@@ -10,7 +11,8 @@ const CategoryCard: React.FC<CategoryCardProps> = ({
|
|
10 |
colorName,
|
11 |
description,
|
12 |
status,
|
13 |
-
graphic: Graphic
|
|
|
14 |
}) => {
|
15 |
const { bg, text, gradient, iconBg } = getColorConfig(colorName);
|
16 |
const isComingSoon = status === 'Coming Soon';
|
@@ -32,14 +34,20 @@ const CategoryCard: React.FC<CategoryCardProps> = ({
|
|
32 |
<Graphic />
|
33 |
</div>
|
34 |
<p className="text-sm font-medium mb-3 leading-tight">{description}</p>
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
</div>
|
44 |
);
|
45 |
};
|
|
|
1 |
import React from 'react';
|
2 |
+
import Link from 'next/link';
|
3 |
import type { Category } from '../types/categories';
|
4 |
import { getColorConfig } from '../lib/utils';
|
5 |
|
|
|
11 |
colorName,
|
12 |
description,
|
13 |
status,
|
14 |
+
graphic: Graphic,
|
15 |
+
slug
|
16 |
}) => {
|
17 |
const { bg, text, gradient, iconBg } = getColorConfig(colorName);
|
18 |
const isComingSoon = status === 'Coming Soon';
|
|
|
34 |
<Graphic />
|
35 |
</div>
|
36 |
<p className="text-sm font-medium mb-3 leading-tight">{description}</p>
|
37 |
+
{isComingSoon ? (
|
38 |
+
<button
|
39 |
+
className="w-full bg-white opacity-50 cursor-not-allowed py-2 px-3 rounded-lg text-sm transition-colors mt-auto text-black font-extrabold"
|
40 |
+
disabled
|
41 |
+
>
|
42 |
+
Coming Soon
|
43 |
+
</button>
|
44 |
+
) : (
|
45 |
+
<Link href={`/categories/${slug}`} passHref>
|
46 |
+
<a className={`w-full bg-white ${text} py-2 px-3 rounded-lg text-sm font-semibold transition-colors mt-auto text-center hover:bg-opacity-90`}>
|
47 |
+
View Tools
|
48 |
+
</a>
|
49 |
+
</Link>
|
50 |
+
)}
|
51 |
</div>
|
52 |
);
|
53 |
};
|
components/CategoryPage.tsx
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"use client"
|
2 |
+
|
3 |
+
import React from 'react';
|
4 |
+
import Link from 'next/link';
|
5 |
+
import { getColorConfig, cn } from '@/lib/utils';
|
6 |
+
|
7 |
+
interface CategoryPageProps {
|
8 |
+
category: {
|
9 |
+
title: string;
|
10 |
+
description: string;
|
11 |
+
colorName: string;
|
12 |
+
};
|
13 |
+
}
|
14 |
+
|
15 |
+
const CategoryPage: React.FC<CategoryPageProps> = ({ category }) => {
|
16 |
+
const { title, description, colorName } = category;
|
17 |
+
const colorConfig = getColorConfig(colorName);
|
18 |
+
|
19 |
+
return (
|
20 |
+
<div className={cn('min-h-screen', colorConfig.bg, colorConfig.text)}>
|
21 |
+
<div className="container mx-auto px-4 py-8">
|
22 |
+
<nav className="mb-8">
|
23 |
+
<ol className="flex items-center space-x-3 text-sm sm:text-base">
|
24 |
+
<li className="flex items-center">
|
25 |
+
<Link href="/" className="hover:underline transition-colors duration-200 flex items-center">
|
26 |
+
<svg className="w-4 h-4 mr-2" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
|
27 |
+
<path d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z" />
|
28 |
+
</svg>
|
29 |
+
Home
|
30 |
+
</Link>
|
31 |
+
</li>
|
32 |
+
<li className="flex items-center">
|
33 |
+
<svg className="w-5 h-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
|
34 |
+
<path fillRule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clipRule="evenodd" />
|
35 |
+
</svg>
|
36 |
+
<span className="ml-2 font-medium">{title}</span>
|
37 |
+
</li>
|
38 |
+
</ol>
|
39 |
+
</nav>
|
40 |
+
<div className="text-center">
|
41 |
+
<h1 className="text-4xl sm:text-5xl md:text-6xl font-extrabold tracking-tighter mb-4">
|
42 |
+
{title}
|
43 |
+
</h1>
|
44 |
+
<p className="font-bold font-mono italic text-lg mb-10">
|
45 |
+
{description}
|
46 |
+
</p>
|
47 |
+
</div>
|
48 |
+
</div>
|
49 |
+
</div>
|
50 |
+
);
|
51 |
+
};
|
52 |
+
|
53 |
+
export default CategoryPage;
|
components/PillLink.tsx
CHANGED
@@ -10,21 +10,27 @@ interface PillLinkProps {
|
|
10 |
|
11 |
const PillLink: React.FC<PillLinkProps> = ({ text, link, isNew = false, newText = 'NEW' }) => {
|
12 |
return (
|
13 |
-
<Link href={link}>
|
14 |
<Badge
|
15 |
className="
|
16 |
-
mb-4 bg-
|
17 |
-
transition-all duration-200
|
18 |
-
hover:bg-
|
19 |
transform hover:scale-105
|
|
|
|
|
|
|
20 |
"
|
21 |
>
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
|
|
|
|
|
|
28 |
</Badge>
|
29 |
</Link>
|
30 |
);
|
|
|
10 |
|
11 |
const PillLink: React.FC<PillLinkProps> = ({ text, link, isNew = false, newText = 'NEW' }) => {
|
12 |
return (
|
13 |
+
<Link target="_blank" href={link}>
|
14 |
<Badge
|
15 |
className="
|
16 |
+
mb-4 bg-gray-900 px-3 py-1.5 text-xs font-medium text-white
|
17 |
+
shadow-md transition-all duration-200
|
18 |
+
hover:bg-gray-800 hover:shadow-lg
|
19 |
transform hover:scale-105
|
20 |
+
rounded-full relative
|
21 |
+
overflow-hidden
|
22 |
+
group
|
23 |
"
|
24 |
>
|
25 |
+
<span className="relative z-10">
|
26 |
+
{(isNew || newText) && (
|
27 |
+
<span className="mr-2 rounded-full bg-white px-1.5 py-0.5 text-[10px] font-bold text-gray-900">
|
28 |
+
{newText}
|
29 |
+
</span>
|
30 |
+
)}
|
31 |
+
{text}
|
32 |
+
</span>
|
33 |
+
<span className="absolute inset-0 bg-gradient-to-r from-white to-gray-300 opacity-0 group-hover:opacity-20 transition-opacity duration-200"></span>
|
34 |
</Badge>
|
35 |
</Link>
|
36 |
);
|
lib/categories.tsx
CHANGED
@@ -1,14 +1,17 @@
|
|
1 |
"use client"
|
2 |
-
import { Scissors, Sparkles, Mic, Smile } from 'lucide-react';
|
3 |
import type { Category } from '../types/categories';
|
4 |
import SegmentationIcon from './icons/SegmentationIcon';
|
5 |
import TranscriptionIcon from './icons/TranscriptionIcon';
|
6 |
import SentimentAnalysisIcon from './icons/SentimentAnalysisIcon';
|
7 |
import EmbeddingIcon from './icons/EmbeddingIcon';
|
|
|
|
|
8 |
|
9 |
export const categories: Category[] = [
|
10 |
{
|
11 |
title: "Segment",
|
|
|
12 |
icon: Scissors,
|
13 |
description: "Break down images into distinct segments based on the object or background.",
|
14 |
status: "Coming Soon",
|
@@ -17,6 +20,7 @@ export const categories: Category[] = [
|
|
17 |
},
|
18 |
{
|
19 |
title: "Embed",
|
|
|
20 |
icon: Sparkles,
|
21 |
description: "Create vector embeddings for text and images.",
|
22 |
status: "Coming Soon",
|
@@ -25,6 +29,7 @@ export const categories: Category[] = [
|
|
25 |
},
|
26 |
{
|
27 |
title: "Transcribe",
|
|
|
28 |
icon: Mic,
|
29 |
description: "Convert speech to text with high accuracy using advanced AI-powered transcription (Whisper).",
|
30 |
status: "Coming Soon",
|
@@ -33,10 +38,29 @@ export const categories: Category[] = [
|
|
33 |
},
|
34 |
{
|
35 |
title: "Sentiment",
|
|
|
36 |
icon: Smile,
|
37 |
description: "Analyze text to determine the emotional tone and attitude, classifying it as positive, negative, or neutral.",
|
38 |
status: "Coming Soon",
|
39 |
colorName: "amber",
|
40 |
graphic: SentimentAnalysisIcon
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
}
|
42 |
];
|
|
|
1 |
"use client"
|
2 |
+
import { Scissors, Sparkles, Mic, Smile, Tags, Type } from 'lucide-react';
|
3 |
import type { Category } from '../types/categories';
|
4 |
import SegmentationIcon from './icons/SegmentationIcon';
|
5 |
import TranscriptionIcon from './icons/TranscriptionIcon';
|
6 |
import SentimentAnalysisIcon from './icons/SentimentAnalysisIcon';
|
7 |
import EmbeddingIcon from './icons/EmbeddingIcon';
|
8 |
+
import ClassificationIcon from './icons/ClassificationIcon';
|
9 |
+
import TextGenerationIcon from './icons/TextGenerationIcon';
|
10 |
|
11 |
export const categories: Category[] = [
|
12 |
{
|
13 |
title: "Segment",
|
14 |
+
slug: "segment",
|
15 |
icon: Scissors,
|
16 |
description: "Break down images into distinct segments based on the object or background.",
|
17 |
status: "Coming Soon",
|
|
|
20 |
},
|
21 |
{
|
22 |
title: "Embed",
|
23 |
+
slug: "embed",
|
24 |
icon: Sparkles,
|
25 |
description: "Create vector embeddings for text and images.",
|
26 |
status: "Coming Soon",
|
|
|
29 |
},
|
30 |
{
|
31 |
title: "Transcribe",
|
32 |
+
slug: "transcribe",
|
33 |
icon: Mic,
|
34 |
description: "Convert speech to text with high accuracy using advanced AI-powered transcription (Whisper).",
|
35 |
status: "Coming Soon",
|
|
|
38 |
},
|
39 |
{
|
40 |
title: "Sentiment",
|
41 |
+
slug: "sentiment",
|
42 |
icon: Smile,
|
43 |
description: "Analyze text to determine the emotional tone and attitude, classifying it as positive, negative, or neutral.",
|
44 |
status: "Coming Soon",
|
45 |
colorName: "amber",
|
46 |
graphic: SentimentAnalysisIcon
|
47 |
+
},
|
48 |
+
{
|
49 |
+
title: "Classify",
|
50 |
+
slug: "classify",
|
51 |
+
icon: Tags,
|
52 |
+
description: "Categorize text or images into predefined classes using machine learning algorithms.",
|
53 |
+
status: "Coming Soon",
|
54 |
+
colorName: "purple",
|
55 |
+
graphic: ClassificationIcon
|
56 |
+
},
|
57 |
+
{
|
58 |
+
title: "Generate Text",
|
59 |
+
slug: "generate-text",
|
60 |
+
icon: Type,
|
61 |
+
description: "Create human-like text based on prompts or context using advanced language models.",
|
62 |
+
status: "Coming Soon",
|
63 |
+
colorName: "blue",
|
64 |
+
graphic: TextGenerationIcon
|
65 |
}
|
66 |
];
|
lib/icons/ClassificationIcon.tsx
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from 'react';
|
2 |
+
|
3 |
+
interface ClassificationIconProps {
|
4 |
+
className?: string;
|
5 |
+
}
|
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 |
+
};
|
33 |
+
|
34 |
+
export default ClassificationIcon;
|
lib/icons/EmbeddingIcon.tsx
CHANGED
@@ -21,10 +21,18 @@ const EmbeddingIcon: React.FC<IconProps> = ({ className = '' }) => {
|
|
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 |
-
{/* 3D axes */}
|
25 |
-
<line x1="115" y1="85" x2="185" y2="85" stroke="#0f766e" strokeWidth="1" opacity="0.
|
26 |
-
<
|
27 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
|
29 |
{/* 3D points */}
|
30 |
<circle cx="150" cy="40" r="4" fill="#f472b6" />
|
|
|
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" />
|
lib/icons/SentimentAnalysisIcon.tsx
CHANGED
@@ -25,10 +25,16 @@ const SentimentAnalysisIcon: React.FC<IconProps> = ({ className = '' }) => {
|
|
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 |
-
|
30 |
-
<
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
</svg>
|
33 |
);
|
34 |
};
|
|
|
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 |
};
|
lib/icons/TextGenerationIcon.tsx
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React from 'react';
|
2 |
+
|
3 |
+
interface TextGenerationIconProps {
|
4 |
+
className?: string;
|
5 |
+
}
|
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 |
+
};
|
33 |
+
|
34 |
+
export default TextGenerationIcon;
|
lib/segment/index.tsx
ADDED
File without changes
|
lib/utils.ts
CHANGED
@@ -14,29 +14,65 @@ export type ColorConfig = {
|
|
14 |
|
15 |
export const colorConfigs: Record<string, ColorConfig> = {
|
16 |
indigo: {
|
17 |
-
bg: 'bg-indigo-
|
18 |
-
text: 'text-indigo-
|
19 |
-
gradient: 'bg-gradient-to-br from-indigo-500 to-
|
20 |
iconBg: 'bg-indigo-200',
|
21 |
},
|
22 |
teal: {
|
23 |
-
bg: 'bg-teal-
|
24 |
-
text: 'text-teal-
|
25 |
-
gradient: 'bg-gradient-to-br from-teal-
|
26 |
iconBg: 'bg-teal-200',
|
27 |
},
|
28 |
rose: {
|
29 |
-
bg: 'bg-rose-
|
30 |
-
text: 'text-rose-
|
31 |
-
gradient: 'bg-gradient-to-br from-rose-
|
32 |
iconBg: 'bg-rose-200',
|
33 |
},
|
34 |
amber: {
|
35 |
-
bg: 'bg-amber-
|
36 |
-
text: 'text-amber-
|
37 |
-
gradient: 'bg-gradient-to-br from-amber-
|
38 |
iconBg: 'bg-amber-200',
|
39 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
};
|
41 |
|
42 |
export const getColorConfig = (colorName: string): ColorConfig => {
|
|
|
14 |
|
15 |
export const colorConfigs: Record<string, ColorConfig> = {
|
16 |
indigo: {
|
17 |
+
bg: 'bg-indigo-50',
|
18 |
+
text: 'text-indigo-900',
|
19 |
+
gradient: 'bg-gradient-to-br from-indigo-500 to-purple-600',
|
20 |
iconBg: 'bg-indigo-200',
|
21 |
},
|
22 |
teal: {
|
23 |
+
bg: 'bg-teal-50',
|
24 |
+
text: 'text-teal-900',
|
25 |
+
gradient: 'bg-gradient-to-br from-teal-400 to-emerald-600',
|
26 |
iconBg: 'bg-teal-200',
|
27 |
},
|
28 |
rose: {
|
29 |
+
bg: 'bg-rose-50',
|
30 |
+
text: 'text-rose-900',
|
31 |
+
gradient: 'bg-gradient-to-br from-rose-400 to-pink-600',
|
32 |
iconBg: 'bg-rose-200',
|
33 |
},
|
34 |
amber: {
|
35 |
+
bg: 'bg-amber-50',
|
36 |
+
text: 'text-amber-900',
|
37 |
+
gradient: 'bg-gradient-to-br from-amber-400 to-orange-500',
|
38 |
iconBg: 'bg-amber-200',
|
39 |
},
|
40 |
+
purple: {
|
41 |
+
bg: 'bg-purple-50',
|
42 |
+
text: 'text-purple-900',
|
43 |
+
gradient: 'bg-gradient-to-br from-purple-400 to-indigo-600',
|
44 |
+
iconBg: 'bg-purple-200',
|
45 |
+
},
|
46 |
+
blue: {
|
47 |
+
bg: 'bg-blue-50',
|
48 |
+
text: 'text-blue-900',
|
49 |
+
gradient: 'bg-gradient-to-br from-blue-400 to-cyan-600',
|
50 |
+
iconBg: 'bg-blue-200',
|
51 |
+
},
|
52 |
+
emerald: {
|
53 |
+
bg: 'bg-emerald-50',
|
54 |
+
text: 'text-emerald-900',
|
55 |
+
gradient: 'bg-gradient-to-br from-emerald-400 to-green-600',
|
56 |
+
iconBg: 'bg-emerald-200',
|
57 |
+
},
|
58 |
+
fuchsia: {
|
59 |
+
bg: 'bg-fuchsia-50',
|
60 |
+
text: 'text-fuchsia-900',
|
61 |
+
gradient: 'bg-gradient-to-br from-fuchsia-400 to-pink-600',
|
62 |
+
iconBg: 'bg-fuchsia-200',
|
63 |
+
},
|
64 |
+
lime: {
|
65 |
+
bg: 'bg-lime-50',
|
66 |
+
text: 'text-lime-900',
|
67 |
+
gradient: 'bg-gradient-to-br from-lime-400 to-green-500',
|
68 |
+
iconBg: 'bg-lime-200',
|
69 |
+
},
|
70 |
+
sky: {
|
71 |
+
bg: 'bg-sky-50',
|
72 |
+
text: 'text-sky-900',
|
73 |
+
gradient: 'bg-gradient-to-br from-sky-400 to-blue-600',
|
74 |
+
iconBg: 'bg-sky-200',
|
75 |
+
},
|
76 |
};
|
77 |
|
78 |
export const getColorConfig = (colorName: string): ColorConfig => {
|
types/categories.ts
CHANGED
@@ -4,6 +4,7 @@ export type CategoryStatus = 'New' | 'Coming Soon' | 'Available';
|
|
4 |
|
5 |
export interface Category {
|
6 |
title: string;
|
|
|
7 |
icon: LucideIcon;
|
8 |
description: string;
|
9 |
status: CategoryStatus;
|
|
|
4 |
|
5 |
export interface Category {
|
6 |
title: string;
|
7 |
+
slug: string;
|
8 |
icon: LucideIcon;
|
9 |
description: string;
|
10 |
status: CategoryStatus;
|