Skip to content

Commit 0405b29

Browse files
authored
Merge pull request #3 from openpatch/copilot/add-welcome-message-for-empty-roadmap
Add welcome message for empty roadmap
2 parents 4d8893f + 1e9fe25 commit 0405b29

4 files changed

Lines changed: 168 additions & 3 deletions

File tree

packages/learningmap/src/LearningMapEditor.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { Info, Redo, Undo, RotateCw, ShieldAlert } from "lucide-react";
3737
import useUndoable from "./useUndoable";
3838
import { MultiNodePanel } from "./MultiNodePanel";
3939
import { getTranslations } from "./translations";
40+
import { WelcomeMessage } from "./WelcomeMessage";
4041

4142
const nodeTypes = {
4243
topic: TopicNode,
@@ -629,6 +630,14 @@ export function LearningMapEditor({
629630
backgroundColor: settings?.background?.color || "#ffffff",
630631
}}
631632
>
633+
{nodes.length === 0 && edges.filter(e => !e.id.startsWith("debug-")).length === 0 && (
634+
<WelcomeMessage
635+
onOpenFile={handleOpen}
636+
onAddTopic={() => addNewNode("topic")}
637+
onShowHelp={() => setHelpOpen(true)}
638+
language={effectiveLanguage}
639+
/>
640+
)}
632641
<ReactFlow
633642
nodes={nodes.map(n => {
634643
const className = [];
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React from "react";
2+
import { FolderOpen, Plus, Info } from "lucide-react";
3+
import { getTranslations } from "./translations";
4+
5+
interface WelcomeMessageProps {
6+
onOpenFile: () => void;
7+
onAddTopic: () => void;
8+
onShowHelp: () => void;
9+
language?: string;
10+
}
11+
12+
export const WelcomeMessage: React.FC<WelcomeMessageProps> = ({
13+
onOpenFile,
14+
onAddTopic,
15+
onShowHelp,
16+
language = "en",
17+
}) => {
18+
const t = getTranslations(language);
19+
20+
return (
21+
<div className="welcome-message">
22+
<div className="welcome-content">
23+
<h1 className="welcome-title">{t.welcomeTitle}</h1>
24+
<p className="welcome-subtitle">{t.welcomeSubtitle}</p>
25+
<div className="welcome-actions">
26+
<button onClick={onOpenFile} className="primary-button">
27+
<FolderOpen size={18} />
28+
{t.welcomeOpenFile}
29+
</button>
30+
<button onClick={onAddTopic} className="primary-button">
31+
<Plus size={18} />
32+
{t.welcomeAddTopic}
33+
</button>
34+
<button onClick={onShowHelp} className="secondary-button">
35+
<Info size={18} />
36+
{t.welcomeHelp}
37+
</button>
38+
</div>
39+
</div>
40+
</div>
41+
);
42+
};

packages/learningmap/src/index.css

Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
height: 100%;
77
display: flex;
88
flex-direction: column;
9+
overflow: hidden;
10+
font-family: sans-serif;
911
}
1012

1113
/* Toolbar */
@@ -553,13 +555,13 @@ dialog.help[open] {
553555
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
554556
padding: 24px;
555557
background: white;
556-
position: absolute;
558+
position: fixed;
557559
top: 50%;
558-
left: 50%;
559-
transform: translate(-50%, -50%);
560+
transform: translateY(-50%);
560561
gap: 16px;
561562
display: flex;
562563
flex-direction: column;
564+
z-index: 1000;
563565

564566
table {
565567
width: 100%;
@@ -693,3 +695,94 @@ dialog.help[open] {
693695
margin-top: 4px;
694696
}
695697
}
698+
699+
/* Welcome Message */
700+
.welcome-message {
701+
position: absolute;
702+
top: 0;
703+
left: 0;
704+
right: 0;
705+
bottom: 0;
706+
width: 100%;
707+
height: 100%;
708+
display: flex;
709+
align-items: center;
710+
justify-content: center;
711+
z-index: 1;
712+
pointer-events: none;
713+
overflow-y: auto;
714+
overflow-x: hidden;
715+
}
716+
717+
.welcome-content {
718+
text-align: center;
719+
max-width: 500px;
720+
width: 100%;
721+
padding: 40px 20px;
722+
pointer-events: auto;
723+
box-sizing: border-box;
724+
flex-shrink: 0;
725+
}
726+
727+
.welcome-title {
728+
font-size: 48px;
729+
font-weight: 700;
730+
color: #1f2937;
731+
margin: 0 0 16px 0;
732+
}
733+
734+
.welcome-subtitle {
735+
font-size: 16px;
736+
color: #6b7280;
737+
margin: 0 0 32px 0;
738+
}
739+
740+
.welcome-actions {
741+
display: flex;
742+
flex-direction: column;
743+
gap: 12px;
744+
align-items: center;
745+
}
746+
747+
.welcome-actions button {
748+
width: 100%;
749+
max-width: 280px;
750+
justify-content: center;
751+
font-size: 16px;
752+
padding: 12px 24px;
753+
}
754+
755+
/* Responsive adjustments for mobile */
756+
@media (max-width: 640px) {
757+
.editor-toolbar {
758+
padding: 8px 12px;
759+
}
760+
761+
.toolbar-button {
762+
padding: 6px 12px;
763+
font-size: 13px;
764+
}
765+
766+
.toolbar-label {
767+
display: none;
768+
}
769+
770+
.welcome-title {
771+
font-size: 36px;
772+
}
773+
774+
.welcome-content {
775+
padding: 20px 16px;
776+
}
777+
778+
.welcome-subtitle {
779+
font-size: 24px;
780+
margin: 0 0 24px 0;
781+
}
782+
783+
.welcome-actions button {
784+
max-width: 100%;
785+
font-size: 14px;
786+
padding: 10px 20px;
787+
}
788+
}

packages/learningmap/src/translations.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,13 @@ export interface Translations {
158158
languageLabel: string;
159159
languageEnglish: string;
160160
languageGerman: string;
161+
162+
// Welcome message
163+
welcomeTitle: string;
164+
welcomeSubtitle: string;
165+
welcomeOpenFile: string;
166+
welcomeAddTopic: string;
167+
welcomeHelp: string;
161168
}
162169

163170
const en: Translations = {
@@ -321,6 +328,13 @@ const en: Translations = {
321328
languageLabel: "Language",
322329
languageEnglish: "English",
323330
languageGerman: "German",
331+
332+
// Welcome message
333+
welcomeTitle: "Learningmap",
334+
welcomeSubtitle: "All data is stored locally in your browser",
335+
welcomeOpenFile: "Open File",
336+
welcomeAddTopic: "Add Topic",
337+
welcomeHelp: "Help",
324338
};
325339

326340
const de: Translations = {
@@ -486,6 +500,13 @@ const de: Translations = {
486500
languageLabel: "Sprache",
487501
languageEnglish: "Englisch",
488502
languageGerman: "Deutsch",
503+
504+
// Welcome message
505+
welcomeTitle: "Learningmap",
506+
welcomeSubtitle: "Alle Daten werden lokal in Ihrem Browser gespeichert",
507+
welcomeOpenFile: "Datei öffnen",
508+
welcomeAddTopic: "Thema hinzufügen",
509+
welcomeHelp: "Hilfe",
489510
};
490511

491512
export const translations: Record<string, Translations> = {

0 commit comments

Comments
 (0)