> For: Front-end developers and AI coding agents
> Feature branch: 048-hotspot-editor
> Companion spec: spec.md
> Platform IA reference: INFORMATION_ARCHITECTURE.md
> Date: 2026-05-05
The hotspot editor is an authoring tool for creating interactive regions on graphics. It is not a new top-level page — it extends the existing Object Authoring page (/ws/:workspaceId/object-authoring) which already renders different adapters based on object type (DITA → XML editor, Markdown → text editor, Graphics → asset preview).
The hotspot editor becomes a new mode or adapter for graphics objects, activated when an author wants to add interactive regions to an image.
┌────────────────────────────────────────────────────────────┐
│ [Object Authoring Shell] │
│ ─ Object name / breadcrumb │
│ ─ Action bar (save, check-in, check-out, close) │
├────────────────────────────────────────────────────────────┤
│ │
│ [Adapter renders based on object type:] │
│ │
│ DITA: XML structured editor │
│ Markdown: Text editor + live preview pane │
│ Graphics: Asset preview + replace/upload controls │
│ │
└────────────────────────────────────────────────────────────┘
The hotspot editor will extend or replace the Graphics adapter when the graphic has (or is being given) hotspot configurations.
Five alternative UX approaches are evaluated below. They are not mutually exclusive — the final design will likely combine elements.
Concept: The hotspot editor is a full-page experience within Object Authoring. When an author opens a graphic's hotspot configuration, the Object Authoring shell renders a canvas editor: the graphic fills the main area with a drawing overlay on top, and a properties sidebar sits to the right.
┌────────────────────────────────────────────────────────────────────┐
│ Hotspot Editor: engine-diagram.png [Save] [✕] │
│ Configuration: "Service Manual 2025" │
├────────────────────────────────────────────────┬───────────────────┤
│ │ │
│ ┌──────────────────────────────────────────┐ │ HOTSPOT PANEL │
│ │ │ │ ─────────────── │
│ │ [GRAPHIC with overlay] │ │ │
│ │ │ │ Selected: #3 │
│ │ ┌─────┐ │ │ Shape: Rectangle │
│ │ │ HS1 │ ○ HS2 │ │ │
│ │ └─────┘ ╱╲ │ │ ── Content ── │
│ │ ╱HS3╲ │ │ [Rich text area] │
│ │ ╱────╲ │ │ │
│ │ │ │ ── Target ── │
│ │ │ │ [Type ▾] [Pick…] │
│ │ │ │ │
│ └──────────────────────────────────────────┘ │ ── Profiling ── │
│ │ [Add profile…] │
│ ──────────────────────────────────────────── │ │
│ Tools: [▲ Point] [○ Circle] [▬ Rect] │ [Delete Hotspot] │
│ [⬠ Polygon] [⊙ SVG Select] │ │
├────────────────────────────────────────────────┴───────────────────┤
│ [Status bar] │
└────────────────────────────────────────────────────────────────────┘
Interaction flow:
Concept: The hotspot editor renders inside Zone C of the Author View — the same zone where Preview and Versions panels live. The graphic fills the panel with an overlay. A collapsible section below the canvas handles hotspot properties.
┌──────┬──────────────┬──────────────────┬───────────────────────────┐
│ S │ ZONE A │ ZONE B │ ZONE C │
│ I │ Folder │ Object List │ ┌───────────────────┐ │
│ D │ Explorer │ │ │ Hotspot Editor │ │
│ E │ │ │ │ │ │
│ B │ │ │ │ [GRAPHIC] │ │
│ A │ │ │ │ ┌──┐ ○ │ │
│ R │ │ │ │ │H1│ ╱╲ │ │
│ │ ├──────────────────┤ │ └──┘ ╱H3╲ │ │
│ │ │ Properties │ │ ╱──╲ │ │
│ │ │ │ ├───────────────────┤ │
│ │ ├──────────────────┤ │ Tools: [▲][○][▬] │ │
│ │ │ Change History │ │ [⬠][⊙ SVG] │ │
│ │ │ │ ├───────────────────┤ │
│ │ │ │ │ ▾ Selected: H1 │ │
│ │ │ │ │ Content: [___] │ │
│ │ │ │ │ Target: [___] │ │
│ │ │ │ │ Profile: [___] │ │
│ │ │ │ └───────────────────┘ │
├──────┴──────────────┴──────────────────┴───────────────────────────┤
│ [Status bar] │
└────────────────────────────────────────────────────────────────────┘
Interaction flow:
Concept: The hotspot editor opens as a large modal dialog (Radix Dialog, ~90% viewport) overlaying the Author View. This is the same pattern used for the Comparison View in the content comparison spec. The Author View remains behind, dimmed.
┌─────────────────────────────────────────────────────────────────────┐
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ Hotspot Editor: engine-diagram.png [Preview] [↗] [✕] │ │
│ │ Configuration: "Service Manual 2025" │ │
│ ├──────────────────────────────────────────┬────────────────────┤ │
│ │ │ │ │
│ │ [GRAPHIC with overlay] │ HOTSPOT DETAILS │ │
│ │ │ ────────────── │ │
│ │ ┌─────┐ │ │ │
│ │ │ HS1 │ ○ HS2 │ ▾ Content │ │
│ │ └─────┘ ╱╲ │ [Rich text area] │ │
│ │ ╱HS3╲ │ │ │
│ │ ╱────╲ │ ▾ Target │ │
│ │ │ [Type▾] [Pick…] │ │
│ │ ─ Tools: [▲ Pt][○ Circ][▬ Rect] │ │ │
│ │ [⬠ Poly][⊙ SVG] │ ▾ Profiling │ │
│ │ │ [Add profile…] │ │
│ ├──────────────────────────────────────────┤ │ │
│ │ Hotspot List │ │ │
│ │ [H1: Oil filter] [H2: Drain plug] │ [Delete] │ │
│ │ [H3: Gasket] [H4: Torque spec] │ │ │
│ └──────────────────────────────────────────┴────────────────────┘ │
│ │
│ [Author View — dimmed behind] │
└─────────────────────────────────────────────────────────────────────┘
Interaction flow:
[Preview] toggles into preview mode within the same dialog.[↗] pops out to a separate window. [✕] saves and closes.Concept: Within the Object Authoring page, the Graphics adapter extends to a horizontal split: the top pane renders the graphic with its overlay, and the bottom pane shows a tabbed area for hotspot list, selected hotspot properties, and preview. The drawing tools float on the canvas.
┌────────────────────────────────────────────────────────────────────┐
│ Object Authoring: engine-diagram.png [Save] [✕] │
│ Config: [Service Manual 2025 ▾] Mode: [Edit | Preview] │
├────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │
│ ┌────────────────────┐ │
│ │ │ ▲ Pt ○ Circ │ [GRAPHIC with overlay] │ │
│ │ ▬ Rect ⬠ Poly │ │
│ │ │ ⊙ SVG ↕ Select │ ┌──┐ ╱╲ │ │
│ └────────────────────┘ │H1│ ╱H3╲ │
│ │ floating tools └──┘ ○H2 ╱──╲ │ │
│ │
│ └─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │
│ ═══════════════════ drag to resize ═══════════════════════════ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ [Hotspot List | Properties | Profiling] tabs │ │
│ ├────────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ Hotspot List tab: │ │
│ │ # │ Label │ Shape │ Target │ Status │ │
│ │ 1 │ Oil filter │ Rect │ obj:abc123 │ ✓ Complete │ │
│ │ 2 │ Drain plug │ Circle │ — │ ⚠ No target│ │
│ │ 3 │ Gasket area │ Polygon │ search:gasket… │ ✓ Complete │ │
│ │ │ │
│ │ Properties tab (selected hotspot): │ │
│ │ Content: [Rich text editor] │ │
│ │ Target: [Type ▾] [Pick/Enter…] │ │
│ │ │ │
│ │ Profiling tab (selected hotspot): │ │
│ │ [Profile picker — reuse existing platform component] │ │
│ │ │ │
│ └────────────────────────────────────────────────────────────┘ │
├────────────────────────────────────────────────────────────────────┤
│ [Status bar] │
└────────────────────────────────────────────────────────────────────┘
Interaction flow:
Concept: The lightest-touch approach. The hotspot editor is just an enhanced Preview panel in Zone C. Drawing tools appear as an action bar above the preview. Hotspot properties go in the existing Properties panel in Zone B. No new pages, no new panels — only enhanced existing ones.
┌──────┬──────────────┬──────────────────┬───────────────────────────┐
│ S │ ZONE A │ ZONE B │ ZONE C │
│ I │ Folder │ Object List │ ┌───────────────────┐ │
│ D │ Explorer │ │ │ [▲][○][▬][⬠][⊙] │ │
│ E │ │ │ │ [Edit|Preview] │ │
│ B │ │ │ │ ─────────────── │ │
│ A │ │ │ │ │ │
│ R │ │ │ │ [GRAPHIC] │ │
│ │ ├──────────────────┤ │ ┌──┐ ○ │ │
│ │ │ Properties │ │ │H1│ ╱╲ │ │
│ │ │ ── Hotspot ── │ │ └──┘ ╱H3╲ │ │
│ │ │ Content: [___] │ │ │ │
│ │ │ Target: [___] │ │ │ │
│ │ │ Profile: [___] │ │ │ │
│ │ ├──────────────────┤ ├───────────────────┤ │
│ │ │ Hotspot List │ │ Versions │ │
│ │ │ H1, H2, H3… │ │ │ │
│ │ │ │ │ │ │
├──────┴──────────────┴──────────────────┴───────────────────────────┤
│ [Status bar] │
└────────────────────────────────────────────────────────────────────┘
Interaction flow:
The author reaches the hotspot editor via the same path they reach any Object Authoring page:
Author View → double-click graphic object (or click Edit)
→ /ws/:workspaceId/object-authoring?objectId=...
→ Object Authoring Shell detects object type = graphic with hotspot capability
→ Renders the Hotspot Editor adapter (Split Pane)
If the graphic has no hotspot configurations yet, the editor shows the graphic with a clear empty state:
┌────────────────────────────────────────────────────────────────────┐
│ [GRAPHIC displayed at full width] │
│ │
│ No hotspots configured yet │
│ [+ Create Hotspot Configuration] │
│ │
└────────────────────────────────────────────────────────────────────┘
The Object Authoring shell renders the same top bar for all object types. For the hotspot adapter, it adds a configuration selector.
┌────────────────────────────────────────────────────────────────────┐
│ Object Authoring: engine-diagram.png [Save] [✕] │
│ Config: [Service Manual 2025 ▾] [+ New Config] │
│ Mode: [Edit | Preview] │
├────────────────────────────────────────────────────────────────────┤
│ ... │
Configuration selector:
[+ New Config] creates a blank configuration for the same graphic.The top pane contains the graphic and the drawing overlay.
Viewport controls:
Ctrl+0 / double-click empty space: fit-to-view (reset zoom)[75%]Drawing tools — floating palette, anchored to the top-left of the canvas:
┌────────────────────────────────────┐
│ ↕ Select ▲ Point ○ Circle │
│ ▬ Rect ⬠ Polygon ⊙ SVG Sel │
└────────────────────────────────────┘
SVG Select tool is only available (enabled) when the graphic is an SVG. For raster graphics, it is greyed out with a tooltip: "Only available for SVG graphics."
Hotspot rendering on canvas:
Overlapping hotspots: When hotspots overlap, the author can cycle through overlapping regions at a click location via Tab key or a small disambiguation popup:
┌──────────────────────┐
│ Multiple hotspots: │
│ ▸ H1: Oil filter │
│ ▸ H3: Gasket area │
└──────────────────────┘
The bottom pane is separated from the canvas by a drag-to-resize handle. Default height: 35% of the available space. Min: 100px (collapsed to tab bar only). Max: 60%.
Three tabs:
#### Tab: Hotspot List
A table showing all hotspots for the current configuration. This is the structured overview (FR-011).
┌────────────────────────────────────────────────────────────────┐
│ # │ Label │ Shape │ Target │ Profile │ Status │
│ 1 │ Oil filter │ Rect │ obj:abc123 │ — │ ✓ Complete │
│ 2 │ Drain plug │ Circle │ — │ — │ ⚠ No target │
│ 3 │ Gasket area │ Polygon │ search:gasket… │ Audience │ ✓ Complete │
│ 4 │ Hydraulic port│ SVG path │ ext:https://… │ — │ ✓ Complete │
│ 5 │ Torque ref │ Point │ drill:config-2 │ Market │ ✓ Complete │
└────────────────────────────────────────────────────────────────┘
#### Tab: Properties (Selected Hotspot)
Shows content and target configuration for the currently selected hotspot. If no hotspot is selected, shows an empty state: "Select a hotspot on the graphic or from the list."
┌────────────────────────────────────────────────────────────────┐
│ Hotspot: H3 — "Gasket area" │
│ ───────────────────────────── │
│ │
│ Label: [Gasket area________________] │
│ │
│ Content: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ [Rich text editor — paragraph-level, no full DITA] │ │
│ │ The gasket must be replaced every 10,000 km… │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Target: │
│ Type: [Platform Object ▾] │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 🔍 [Search objects…________________________] │ │
│ │ Selected: gasket-replacement-procedure.dita [✕ clear] │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ — OR no target (informational only): [☐ No navigation] │
│ │
│ [Delete Hotspot] │
└────────────────────────────────────────────────────────────────┘
Target type selector:
When target type is "Drill-down", the picker shows available hotspot configurations:
┌────────────────────────────────────────────┐
│ Select drill-down target: │
│ ───────────────────── │
│ Same graphic: │
│ ▸ Parts Catalog (this graphic) │
│ Other graphics: │
│ ▸ engine-cutaway.svg → Assembly View │
│ ▸ hydraulic-system.png → Service View │
│ ───────────────────── │
│ [Cancel] [Select] │
└────────────────────────────────────────────┘
#### Tab: Profiling (Selected Hotspot)
Shows and edits the applicability rules for the currently selected hotspot. Reuses the platform's existing profile picker component.
┌────────────────────────────────────────────────────────────────┐
│ Profiling for: H3 — "Gasket area" │
│ ───────────────────────────── │
│ │
│ This hotspot is visible when: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Audience: [Technician ▾] │ │
│ │ Market: [All ▾] │ │
│ │ Product: [All ▾] │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ [Remove all profiling] (makes hotspot always visible) │
│ │
└────────────────────────────────────────────────────────────────┘
When no profiling is applied: "This hotspot is always visible. [+ Add profiling]"
Toggled via [Edit | Preview] in the header. In Preview mode:
┌───────────────────────────────────┐
│ Gasket area │
│ ───────────── │
│ The gasket must be replaced │
│ every 10,000 km or when… │
│ │
│ [→ Go to: gasket-replacement…] │ ← shown only if target is configured
└───────────────────────────────────┘
[↓ Drill down: Assembly View] — clicking it does not navigate (authoring preview) but shows a toast: "Would navigate to: Assembly View."Escape or clicking [Edit] returns to edit mode.When the graphic is an SVG and the SVG Select tool (⊙) is active:
┌────────────────────────────┐
│ SVG shape selected: │
│ Type: <path> │
│ ID: "oil-filter-shape" │
│ │
│ [Make Hotspot] [Cancel] │
└────────────────────────────┘
<g>), the editor shows a disambiguation list of the group and its children, letting the author pick the intended element.