cfahlgren1 HF staff commited on
Commit
0d21acd
1 Parent(s): 3aaa41e

add a couple categories, improve look and feel

Browse files
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
- <button
36
- className={`w-full bg-white ${text} py-2 px-3 rounded-lg text-sm font-semibold transition-colors mt-auto ${
37
- isComingSoon ? 'opacity-50 cursor-not-allowed' : 'hover:bg-opacity-90'
38
- }`}
39
- disabled={isComingSoon}
40
- >
41
- {isComingSoon ? 'Coming Soon' : 'View Tools'}
42
- </button>
 
 
 
 
 
 
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-red-500 px-2 py-1 text-xs font-medium text-white shadow-sm
17
- transition-all duration-200
18
- hover:bg-red-600
19
  transform hover:scale-105
 
 
 
20
  "
21
  >
22
- {isNew || newText && (
23
- <span className="mr-1 rounded bg-white px-1 py-0.5 text-[10px] font-bold text-red-500">
24
- {newText}
25
- </span>
26
- )}
27
- {text}
 
 
 
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.5" />
26
- <line x1="115" y1="85" x2="115" y2="15" stroke="#0f766e" strokeWidth="1" opacity="0.5" />
27
- <line x1="115" y1="85" x2="145" y2="65" stroke="#0f766e" strokeWidth="1" opacity="0.5" />
 
 
 
 
 
 
 
 
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
- <circle cx="150" cy="50" r="22" fill="#4ade80" />
29
- <path d="M140 50 Q 150 60, 160 50" fill="none" stroke="#fffbeb" strokeWidth="2" />
30
- <circle cx="143" cy="43" r="2" fill="#fffbeb" />
31
- <circle cx="157" cy="43" r="2" fill="#fffbeb" />
 
 
 
 
 
 
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-200',
18
- text: 'text-indigo-800',
19
- gradient: 'bg-gradient-to-br from-indigo-500 to-indigo-700',
20
  iconBg: 'bg-indigo-200',
21
  },
22
  teal: {
23
- bg: 'bg-teal-200',
24
- text: 'text-teal-800',
25
- gradient: 'bg-gradient-to-br from-teal-500 to-teal-700',
26
  iconBg: 'bg-teal-200',
27
  },
28
  rose: {
29
- bg: 'bg-rose-200',
30
- text: 'text-rose-800',
31
- gradient: 'bg-gradient-to-br from-rose-500 to-rose-700',
32
  iconBg: 'bg-rose-200',
33
  },
34
  amber: {
35
- bg: 'bg-amber-200',
36
- text: 'text-amber-800',
37
- gradient: 'bg-gradient-to-br from-amber-500 to-amber-700',
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;