Skip to content

Commit 748f6d0

Browse files
Copilotmikebarkmin
andcommitted
Implement additional UX improvements
1. Use normal font for resource list (not Concert One) 2. Center node labels and add configurable font size 3. Add default edge type and color settings with bulk update Changes: - Resource list now uses system font for better readability - Node labels centered within nodes (flex center) - Added fontSize field to NodeData (configurable per node) - Added defaultEdgeType and defaultEdgeColor to Settings - New controls in Settings drawer for edge defaults - Button to update all edges to default settings - EditorCanvas uses default edge settings from settings Co-authored-by: mikebarkmin <2592379+mikebarkmin@users.noreply.github.com>
1 parent fcd8273 commit 748f6d0

7 files changed

Lines changed: 85 additions & 16 deletions

File tree

packages/learningmap/src/EditorCanvas.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ export const EditorCanvas = memo(({ defaultLanguage = "en" }: EditorCanvasProps)
102102
const defaultEdgeOptions = {
103103
animated: false,
104104
style: {
105-
stroke: "#94a3b8",
105+
stroke: settings?.defaultEdgeColor || "#94a3b8",
106106
strokeWidth: 2,
107107
},
108-
type: "default",
108+
type: settings?.defaultEdgeType || "default",
109109
};
110110

111111
return (

packages/learningmap/src/EditorDrawerTaskContent.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ export function EditorDrawerTaskContent({
9393
placeholder={t.placeholderNodeLabel}
9494
/>
9595
</div>
96+
<div className="form-group">
97+
<label>Font Size (px)</label>
98+
<input
99+
type="number"
100+
value={localNode.data.fontSize || 14}
101+
onChange={(e) => handleFieldChange("fontSize", parseInt(e.target.value) || 14)}
102+
placeholder="14"
103+
min="8"
104+
max="72"
105+
/>
106+
</div>
96107
<div className="form-group">
97108
<label>{t.summary}</label>
98109
<input

packages/learningmap/src/SettingsDrawer.tsx

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export const SettingsDrawer: React.FC<SettingsDrawerProps> = ({
1717
// Get state from store
1818
const isOpen = useEditorStore(state => state.settingsDrawerOpen);
1919
const settings = useEditorStore(state => state.settings);
20+
const edges = useEditorStore(state => state.edges);
21+
const setEdges = useEditorStore(state => state.setEdges);
2022

2123
// Get actions from store
2224
const setSettingsDrawerOpen = useEditorStore(state => state.setSettingsDrawerOpen);
@@ -57,6 +59,22 @@ export const SettingsDrawer: React.FC<SettingsDrawerProps> = ({
5759
}));
5860
};
5961

62+
const handleUpdateAllEdges = () => {
63+
const defaultType = localSettings?.defaultEdgeType || "default";
64+
const defaultColor = localSettings?.defaultEdgeColor || "#94a3b8";
65+
66+
const updatedEdges = edges.map(edge => ({
67+
...edge,
68+
type: defaultType,
69+
style: {
70+
...edge.style,
71+
stroke: defaultColor,
72+
}
73+
}));
74+
75+
setEdges(updatedEdges);
76+
};
77+
6078
return (
6179
<>
6280
<div className="drawer-overlay" onClick={onClose} />
@@ -174,6 +192,39 @@ export const SettingsDrawer: React.FC<SettingsDrawerProps> = ({
174192
{t.useCurrentViewport}
175193
</button>
176194
</div>
195+
196+
<div className="form-group">
197+
<label>Default Edge Type</label>
198+
<select
199+
value={localSettings?.defaultEdgeType || "default"}
200+
onChange={(e) => setLocalSettings(settings => ({ ...settings, defaultEdgeType: e.target.value }))}
201+
>
202+
<option value="default">Default</option>
203+
<option value="straight">Straight</option>
204+
<option value="step">Step</option>
205+
<option value="smoothstep">Smooth Step</option>
206+
<option value="simplebezier">Simple Bezier</option>
207+
</select>
208+
</div>
209+
210+
<div className="form-group">
211+
<ColorSelector
212+
label="Default Edge Color"
213+
value={localSettings?.defaultEdgeColor || "#94a3b8"}
214+
onChange={color => setLocalSettings(settings => ({ ...settings, defaultEdgeColor: color }))}
215+
/>
216+
</div>
217+
218+
<div className="form-group">
219+
<button
220+
onClick={handleUpdateAllEdges}
221+
className="secondary-button"
222+
style={{ width: '100%' }}
223+
type="button"
224+
>
225+
Update All Edges to Default Settings
226+
</button>
227+
</div>
177228
</div>
178229

179230
<div className="drawer-footer">

packages/learningmap/src/index.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,10 @@ header.drawer-header {
233233
padding: 24px;
234234
}
235235

236+
.drawer-resources ul {
237+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
238+
}
239+
236240
.drawer-description {
237241
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
238242
line-height: 1.6;

packages/learningmap/src/nodes/TaskNode.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ export const TaskNode = ({ data, selected, isConnectable, ...props }: Node<NodeD
77
<>
88
{isConnectable && <NodeResizer isVisible={selected} />}
99
<CircleCheck className="icon" />
10-
<div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
11-
<div style={{ fontWeight: 600, fontSize: "14px" }}>
10+
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", width: "100%", height: "100%", textAlign: "center" }}>
11+
<div style={{ fontWeight: 600, fontSize: data.fontSize ? `${data.fontSize}px` : "14px" }}>
1212
{data.label || "Untitled"}
1313
</div>
14+
{data.summary && (
15+
<div style={{ fontSize: "12px", color: "#4b5563", marginTop: "4px" }}>
16+
{data.summary}
17+
</div>
18+
)}
1419
</div>
15-
{data.summary && (
16-
<div style={{ fontSize: "12px", color: "#4b5563", marginTop: "4px" }}>
17-
{data.summary}
18-
</div>
19-
)}
2020

2121
{["Bottom", "Top", "Left", "Right"].map((pos) => (
2222
<Handle

packages/learningmap/src/nodes/TopicNode.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ export const TopicNode = ({ data, selected, isConnectable }: Node<NodeData>) =>
77
<>
88
{isConnectable && <NodeResizer isVisible={selected} />}
99
{data.state === "mastered" && <StarCircle className="icon" />}
10-
<div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
11-
<div style={{ fontWeight: 600, fontSize: "14px" }}>
10+
<div style={{ display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", width: "100%", height: "100%", textAlign: "center" }}>
11+
<div style={{ fontWeight: 600, fontSize: data.fontSize ? `${data.fontSize}px` : "14px" }}>
1212
{data.label || "Untitled"}
1313
</div>
14+
{data.summary && (
15+
<div style={{ fontSize: "12px", color: "#4b5563", marginTop: "4px" }}>
16+
{data.summary}
17+
</div>
18+
)}
1419
</div>
15-
{data.summary && (
16-
<div style={{ fontSize: "12px", color: "#4b5563", marginTop: "4px" }}>
17-
{data.summary}
18-
</div>
19-
)}
2020

2121
{["Bottom", "Top", "Left", "Right"].map((pos) => (
2222
<Handle

packages/learningmap/src/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export interface NodeData {
3333
video?: string;
3434
resources?: Resource[];
3535
summary?: string;
36+
fontSize?: number;
3637
[key: string]: any;
3738
}
3839

@@ -64,6 +65,8 @@ export interface Settings {
6465
y: number;
6566
zoom: number;
6667
};
68+
defaultEdgeType?: string;
69+
defaultEdgeColor?: string;
6770
}
6871

6972
export interface EdgeConfig {

0 commit comments

Comments
 (0)