diff --git a/src/components/Dashboard/PersonalDashboard.tsx b/src/components/Dashboard/PersonalDashboard.tsx
index fb4c65b44..7bba9a0b0 100644
--- a/src/components/Dashboard/PersonalDashboard.tsx
+++ b/src/components/Dashboard/PersonalDashboard.tsx
@@ -299,7 +299,10 @@ export function PersonalDashboard(props: PersonalDashboardProps) {
-
+
Role Based Roadmaps
diff --git a/src/components/HeroSection/FavoriteRoadmaps.tsx b/src/components/HeroSection/FavoriteRoadmaps.tsx
index 91563ef79..785338e1b 100644
--- a/src/components/HeroSection/FavoriteRoadmaps.tsx
+++ b/src/components/HeroSection/FavoriteRoadmaps.tsx
@@ -5,6 +5,8 @@ import {
Sparkle,
Eye,
EyeOff,
+ Square,
+ SquareCheckBig,
} from 'lucide-react';
import { useState } from 'react';
import type { ProjectStatusDocument } from '../Projects/ListProjectSolutions.tsx';
@@ -14,6 +16,7 @@ import { HeroProject } from './HeroProject';
import { HeroRoadmap } from './HeroRoadmap';
import { CreateRoadmapButton } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapButton.tsx';
import { HeroItemsGroup } from './HeroItemsGroup';
+import { CreateRoadmapModal } from '../CustomRoadmap/CreateRoadmap/CreateRoadmapModal.tsx';
export type AIRoadmapType = {
id: string;
@@ -34,6 +37,7 @@ type FavoriteRoadmapsProps = {
export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
const { progress, isLoading, customRoadmaps, aiRoadmaps, projects } = props;
const [showCompleted, setShowCompleted] = useState(false);
+ const [isCreatingCustomRoadmap, setIsCreatingCustomRoadmap] = useState(false);
const completedProjects = projects.filter(
(project) => project.submittedAt && project.repositoryUrl,
@@ -49,10 +53,31 @@ export function FavoriteRoadmaps(props: FavoriteRoadmapsProps) {
return (
+ {isCreatingCustomRoadmap && (
+
{
+ setIsCreatingCustomRoadmap(false);
+ }}
+ />
+ )}
+
}
isLoading={isLoading}
title="Your progress and bookmarks"
+ isEmpty={progress.length === 0}
+ emptyTitle={
+ <>
+ No bookmarked roadmaps yet
+
+
+ Bookmark a roadmap
+
+ >
+ }
>
{progress.map((resource) => (
))}
-
}
isLoading={isLoading}
title="Your custom roadmaps"
+ isEmpty={customRoadmaps.length === 0}
+ emptyTitle={
+ <>
+ No custom roadmaps found
+
+ >
+ }
>
{customRoadmaps.map((customRoadmap) => (
}
isLoading={isLoading}
title="Your AI roadmaps"
+ isEmpty={aiRoadmaps.length === 0}
+ emptyTitle={
+ <>
+ No AI roadmaps found
+
+ >
+ }
>
{aiRoadmaps.map((aiRoadmap) => (
}
isLoading={isLoading}
title="Your active projects"
+ isEmpty={projectsToShow.length === 0}
+ emptyTitle={
+ <>
+ No active projects found
+
+
+ Start a new project
+
+ >
+ }
rightContent={
completedProjects.length > 0 && (
- {!isLoadingOrCollapsed && (
+ {!isLoadingOrCollapsedOrEmpty && (
{children}
diff --git a/src/components/HeroSection/HeroTitle.tsx b/src/components/HeroSection/HeroTitle.tsx
index 7a5bf0801..7b2173f27 100644
--- a/src/components/HeroSection/HeroTitle.tsx
+++ b/src/components/HeroSection/HeroTitle.tsx
@@ -10,6 +10,8 @@ type HeroTitleProps = {
rightContent?: ReactNode;
isCollapsed?: boolean;
onToggleCollapse?: () => void;
+ isEmpty?: boolean;
+ emptyTitle?: ReactNode;
};
export function HeroTitle(props: HeroTitleProps) {
@@ -20,6 +22,8 @@ export function HeroTitle(props: HeroTitleProps) {
rightContent,
isCollapsed = false,
onToggleCollapse,
+ isEmpty = false,
+ emptyTitle,
} = props;
return (
@@ -32,13 +36,13 @@ export function HeroTitle(props: HeroTitleProps) {
)}
- {title}
+ {!isEmpty ? title : emptyTitle || title}
{!isCollapsed && rightContent}
- {!isLoading && (
+ {!isLoading && !isEmpty && (