The Topical Map Editor is a visual tool for building, editing, and exporting structured content plans. It operates in two modes: Topical mode represents your site architecture as a graph of nodes (pages, sections, FAQs) connected by edges (links). Concept mode represents your subject domain as an entity relationship graph with labelled semantic connections. You can load a generated map, edit it interactively, visualize it in four layouts, and export it as CSV, JSON, PNG, or SVG.
The editor operates in two modes. The mode is detected automatically when you load a JSON file and can be switched at any time using the Mode dropdown in the toolbar.
Every topical map has a hierarchy of node types. Each level has a fixed position, color, and default URL role.
| Node Type | Tier | Color | Purpose | Example |
|---|---|---|---|---|
| Macro | 0 | Rose-red | The broadest category the seed belongs to | Dog Breeds |
| Seed | 1 | Violet | The primary topic the map is built around | Golden Retriever |
| Topic | 2 | Cyan | Main pillar areas under the seed | Golden Retriever Health |
| Subtopic | 3+ | Emerald | Supporting pages under a topic | Hip Dysplasia |
| FAQ | 2–4 | Orange | Question-based section or page | Are Golden Retrievers Hypoallergenic? |
| Comparison | 2–3 | Fuchsia | Versus or comparison content | Golden Retriever vs Labrador |
Every topical node is classified as either a Standalone page (has its own URL) or a Section (lives inside a parent page).
/golden-retriever/health/A Hub page is a standalone page that also acts as a navigation centre for its child pages. Hub nodes are shown with a gold ring.
Golden Retriever Health (Hub)
├── Summary: Hip Dysplasia ──→ /health/hip-dysplasia/
├── Summary: Cancer ──→ /health/cancer/
└── Summary: Lifespan ──→ (section on hub page)
| Edge Type | Visual | Meaning |
|---|---|---|
| Parent → Child (1) | Grey | Hierarchy link — parent page to child page |
| FAQ Attachment (3) | Orange dashed | FAQ node attached to its parent page |
| Related (4) | Purple | Related topic link — optional, not required |
Each node has a confidence score (0–1) reflecting how strongly the AI pipeline believes this topic belongs in the map.
The editor includes two built-in starter maps that demonstrate all node types, edges, entities, aliases, and confidence scores.
Golden Retriever topical map — all node types, hub pages, sections, FAQs, and a full edge set.
Load via File → 🗺 Import Starter Map
Golden Retriever concept map — entity relationship graph with labelled edges, groups, and descriptions.
Load via File → 🧠 Import Concept Starter Map
Node size scales to fit the label inside the circle. Color identifies the concept type at a glance.
| Type | Color | Role | Example |
|---|---|---|---|
| Core | Soft rose | Central subject — always the graph root | Golden Retriever |
| Entity | Cyan | Named real-world entity — org, person, standard | AKC, OFA |
| Condition | Red | Medical condition, risk, or problem | Hip Dysplasia |
| Process | Green | Activity, method, or behaviour | Positive Reinforcement |
| Attribute | Purple | Physical or behavioural characteristic | Double Coat |
| Category | Orange | Classification or group membership | Sporting Dog |
| External | Slate | External context — location, origin | Scotland |
Every edge in a concept map carries a visible label on the connecting line and a relationship type that determines its color.
| Type | Color | Meaning | Example |
|---|---|---|---|
| 0 — Is A | Classification / taxonomy | is a type of Sporting Dog | |
| 1 — Has Part | Composition / anatomy | has Double Coat | |
| 2 — Causes | Causal relationship | causes Hip Dysplasia | |
| 3 — Affects | Impact / susceptibility | is prone to Cancer | |
| 4 — Requires | Dependency / need | requires Daily Exercise | |
| 5 — Diagnosed By | Screening / diagnosis | is screened by OFA | |
| 6 — Treated By | Treatment / remedy | is treated by Surgery | |
| 7 — Performed By | Agency / role | is registered by AKC | |
| 8 — Associated With | General association | originated in Scotland | |
| 9 — Opposite Of | Contrast / antonym | opposite of Aggressive | |
| 10 — Custom | User-defined | Any custom label |
When a concept node is selected the Properties panel shows concept-specific fields instead of topical URL fields.
| Field | Description |
|---|---|
| Concept Type | Core / Entity / Condition / Process / Attribute / Category / External |
| Description | One-sentence definition shown in the hover tooltip |
| Group | Category label for grouping related concepts (e.g. Health Conditions) |
| Label, Slug, Confidence, Entities, Aliases | Shared with topical mode — same fields, same behaviour |
{
"Metadata": {
"Seed": "Golden Retriever",
"MapType": "concept"
},
"Nodes": [
{
"Id": "concept-golden-retriever",
"Label": "Golden Retriever",
"ConceptType": 0,
"Description": "A large-sized retriever-gun dog bred in Scotland.",
"Group": "Core",
"Confidence": 1.0,
"Entities": ["AKC", "UKC"],
"Aliases": ["golden", "goldie"]
}
],
"Edges": [
{
"Id": "rel-gr-hip",
"SourceId": "concept-golden-retriever",
"TargetId": "concept-hip-dysplasia",
"RelationshipLabel": "is prone to",
"RelationshipType": 3,
"Weight": 0.92
}
]
}
| Field | Values |
|---|---|
ConceptType |
0 Core · 1 Entity · 2 Condition · 3 Process · 4 Attribute · 5 Category · 6 External |
RelationshipType |
0 IsA · 1 HasPart · 2 Causes · 3 Affects · 4 Requires · 5 DiagnosedBy · 6 TreatedBy · 7 PerformedBy · 8 AssociatedWith · 9 OppositeOf · 10 Custom |
MapType |
"concept" — triggers concept mode on load |
Switch between four layouts using the buttons in the toolbar. All four show the same data from a different perspective. Press F at any time to fit the full map in the viewport.
A physics-based simulation. Nodes repel each other, edges pull connected nodes together. In concept mode the seed is pinned at the top and nodes fan downward by BFS depth. Nodes with labelled edges are spaced to keep relationship labels readable.
Left-to-right hierarchy. The Macro or Seed node is on the left. Depth maps to horizontal position — Tier 1 leftmost, deeper tiers further right.
Top-to-bottom hierarchy. Root at top, siblings spread horizontally. Each tier row shows all nodes at that depth side by side.
| Horizontal | Vertical | |
|---|---|---|
| Root | Left | Top |
| Tier axis | x = depth | y = depth |
| Spread | Vertical | Horizontal |
| Best for | URL depth audit | Wide maps, org-chart |
Concentric rings per tier. Seed at centre, Topics on the first ring, Subtopics on the second. Faint dashed guide circles with tier labels mark each level.
| Feature | Force | Horizontal Tree | Vertical Tree | Radial Tree |
|---|---|---|---|---|
| Style | Physics simulation | Left-to-right | Top-to-bottom | Concentric rings |
| Tier visible? | Indirectly | Column position | Row position | Ring position |
| Concept mode? | ✓ Best — top-down BFS | ✓ | ✓ | ✓ |
| Best for export? | Moderate | Good (URL depth) | Good (org-chart) | Best (presentations) |
| Edge labels? | ✓ Fully visible | ✓ | ✓ | ✓ |
| Edge style | Straight lines | Horizontal bezier | Vertical bezier | Curved radial |
Switch between Circular and Rectangular styles via View → Circular Nodes / Rectangular Nodes.
When you click a node the editor:
Closing the Properties panel restores the previous viewport position and clears all highlights. The original zoom level and pan position are preserved exactly.
Hover over any node to see a tooltip with full details.
A compact control panel in the top-right corner of the canvas provides navigation controls without using the toolbar.
| Control | Action | Hold? |
|---|---|---|
| + | Zoom in toward centre | ✓ Continuous |
| - | Zoom out from centre | ✓ Continuous |
| ⤢ | Fit full graph in viewport | — |
| ▲ ▼ ◀ ▶ | Pan in that direction | ✓ Continuous |
Click any node to select it. The Properties panel opens on the right. The node is highlighted with a yellow border and the viewport zooms to fit the node and its neighbours.
The edit panel shows all properties of the selected node. Edit any field and click Apply Changes to save. The fields shown depend on the active mode and node type.
| Field | Description |
|---|---|
| Label | Display name shown in the graph |
| Slug | URL-safe version of the label |
| Parent Node | Change to re-parent the node. Triggers full layout redraw. |
| Confidence | 0.00–1.00 AI confidence score |
| Entities | Named entities (pipe-separated) |
| Aliases | Keyword variants (pipe-separated) |
| Field | Description |
|---|---|
| Node Type | Macro / Seed / Topic / Subtopic / FAQ / Comparison |
| URL Role | Standalone = own page with URL · Section Only = no URL |
| Hub Role | Hub Page = gold ring, acts as navigation centre |
| Tier | Hierarchy depth (0 = Macro) |
| Canonical URL | Auto-generated from parent URL + slug |
| Field | Description |
|---|---|
| Concept Type | Core / Entity / Condition / Process / Attribute / Category / External |
| Description | One-sentence definition shown in tooltip |
| Group | Category label for grouping (e.g. Health Conditions) |
When the Canonical URL field is empty, typing a label automatically builds the URL from parent URL + slug:
Parent URL: /dog-breeds/golden-retriever/health/
Slug: hip-dysplasia
Result: /dog-breeds/golden-retriever/health/hip-dysplasia/
Click Node → + Add Child Node to add a node under the selected node.
| Selected | New Type |
|---|---|
| Nothing | Topic (under Seed) |
| Macro | Seed |
| Seed | Topic |
| Topic | Subtopic |
| Subtopic | Subtopic |
Select a node and click Node → Delete Node, the Delete button in the panel, or press Delete.
Change the Parent Node dropdown and click Apply. The old edge is removed, a new edge is created. The dropdown excludes the node itself and all descendants to prevent cycles.
Re-parenting is the only edit that triggers a full layout redraw.
| Key | Action |
|---|---|
| / | Focus the search input |
| F | Fit view to all nodes |
| Escape | Close panel and restore previous zoom · clear search |
| Delete / Backspace | Delete selected node (when not typing in a field) |
| Item | Description |
|---|---|
| 🗺 Import Starter Map | Load the built-in Golden Retriever topical map example |
| 🧠 Import Concept Starter Map | Load the built-in Golden Retriever concept map example |
| 📂 Load JSON | Load any topical or concept map JSON. Mode is auto-detected from MapType field. |
| 📋 Import CSV | Import a CSV file of nodes via the server-side CSV importer (topical mode only) |
| ⬇ Export CSV | Export all nodes as CSV in the browser. Topical and concept modes export different columns. |
| 📋 Copy JSON | Copy the full graph JSON to clipboard. Falls back to download if clipboard unavailable. |
| 🖼 Export PNG — Viewport | Export what is visible on screen at 4× resolution |
| 🖼 Export PNG — Full Map | Export entire graph. Minimum 4800px. Nothing clipped. |
| 📐 Export SVG — Viewport | Vector export of current viewport with inlined styles |
| 📐 Export SVG — Full Map | Vector export of entire graph. Scalable to any size. |
| 💾 Save | Post JSON to server and download a local copy simultaneously |
| Item | Description |
|---|---|
| + Add Child Node | Add a new node under the selected node. Type is inferred in topical mode. Concept mode always creates a generic concept node. |
| ⧉ Duplicate Node | Copy the selected node with all its properties. Gets a new ID, spawns near the original, labelled with "(Copy)". |
| 🗑 Delete Node | Delete the selected node and all its edges. Children become orphaned. |
| Item | Description |
|---|---|
| ↺ Reset Positions | Clear all manual drag offsets and recompute layout from scratch |
| ⤢ Fit View | Zoom and pan to fit all nodes in the viewport. Also F. Accounts for node width and label overhang. |
| 🗺 Toggle Minimap | Show or hide the minimap overview. Hidden by default. |
| 📋 Toggle Legend | Show or hide the color legend overlay. Legend persists across mode switches if visible. |
| ▭ Rectangular Nodes | Switch to pill-shaped rectangular nodes with icon and label |
| ● Circular Nodes | Switch back to circular node style (default) |
| ⟷ Full Labels / Short Labels | Toggle between full label text and truncated labels |
| 🔗 Hide Section-Only Nodes | Hide nodes with urlRole = 0 from the graph. Data preserved — toggle off to restore. (Topical mode only) |
| ☀ Light Theme / 🌙 Dark Theme | Toggle between dark (default) and light canvas themes. Edge label pills update automatically. |
Switch between Topical and Concept mode without clearing the graph data.
| Mode | What Changes |
|---|---|
| Topical Map | Node colors by type, topical fields in panel, topical legend shown, section-only toggle visible |
| Concept Map | Node colors by concept type, inside-circle labels, edge labels rendered, concept fields in panel, concept legend shown, Force layout defaults |
Metadata.MapType field. Set to "topical" or "concept" to control which mode opens automatically.
Press / to focus the search box. Searches label, slug, URL, description, entities, and aliases across all nodes in both modes.
Toggle via View → 🗺 Toggle Minimap. Shows a bird's-eye view of the entire graph with a purple dashed viewport indicator.
Live counts below the toolbar. Stats change depending on the active mode.
topical-map-[seed]-viewport.pngtopical-map-[seed]-full.pngVector format — scalable to any size without quality loss. All styles, colors, and arrow markers are inlined so the file is fully self-contained.
Built entirely in the browser from the current graph data. No server call required. Columns exported differ by mode.
Copy JSON writes the full graph to your clipboard. Save posts to the server and downloads a local copy.
The JSON is compatible with:
MapType field in Metadata controls which mode opens automatically.
| Goal | Layout | Format |
|---|---|---|
| Client presentation — topical map | Radial Tree → F | PNG — Full Map |
| Client presentation — concept map | Force → settle → F | PNG — Full Map |
| Org-chart style image | Vertical Tree → F | PNG — Full Map |
| URL depth audit image | Horizontal Tree → F | PNG — Full Map |
| Print-quality vector | Any → F | SVG — Full Map |
| Figma or Illustrator editing | Any | SVG — Full Map |
| Content calendar spreadsheet | Any | Export CSV |
| Concept entity inventory | Any (concept mode) | Export CSV |
| Reload or continue editing | Any | JSON — Save |
| Neo4j / D3.js import | Any | JSON — Copy |
| Pattern | What to Do |
|---|---|
| Topic with 3+ subtopics | Mark as Hub. Add summary sections for each child on the hub page. |
| FAQ with no parent | Assign to Seed or most relevant Topic using Parent Node dropdown. |
| Low confidence nodes (<0.70) | Review whether the topic genuinely belongs. Delete if off-topic. |
| Concept map missing relationship labels | Every concept edge should have a RelationshipLabel — check JSON and add labels manually if missing. |
| Concept map with too many nodes | Use the Group field to categorise nodes. Filter by group when reviewing to avoid visual overload. |
| Nodes clipped in export | Press F before exporting. Bounding box accounts for node width and label overhang. |
| Force layout still moving on export | Wait 2–3 seconds for simulation to settle before pressing F and exporting. |
| Mistake | Fix |
|---|---|
| Standalone node with no URL | Type a label — URL auto-generates from parent URL + slug |
| Section-only node with a URL | Change URL Role to Section Only — URL field clears automatically |
| Deleting a parent that has children | Re-parent children first or they become orphaned |
| Switching layout without Fit View | Press F immediately after switching — map may be off-screen |
| Exporting before Force layout settles | Wait for simulation to stabilise — nodes still moving = wrong positions in export |
| Concept edge with no RelationshipLabel | No label pill will appear on the line — add via JSON or rebuild the edge |
| All nodes same confidence in concept mode | Review low-confidence entities — they may be too peripheral to the Core topic |