Sidebar Options
The sidebar can be collapsed by default depending on screen size or user preference.
Determines whether the sidebar is collapsed by default.
'auto'default: Keeps the sidebar open unless there isn't enough screen space, in which case it collapses automatically.trueSidebar starts collapsed.falseSidebar starts expanded.
The sidebar displays contextual information for graph elements. It has three customizable components:
- Main Header as
mainHeader - Properties Panel as
propertiesPanel - Extra Panels as
extraPanels
Click to see the code
UI: {
mode: 'full',
sidebar: {
collapsed: false,
},
mainHeader: {
render: (element) => {
const div = document.createElement('div')
div.textContent = 'Main Header'
div.style.fontWeight = 'bold'
div.style.color = 'darkred'
div.style.background = 'var(--pvt-bg-color-8)'
div.style.padding = '4px 8px'
div.style.borderRadius = '4px'
return div
}
},
propertiesPanel: {
render: (element) => {
const div = document.createElement('div')
div.textContent = 'Properties Panel'
div.style.fontWeight = 'bold'
div.style.color = 'darkred'
div.style.background = 'var(--pvt-bg-color-8)'
div.style.padding = '4px 8px'
div.style.borderRadius = '4px'
return div
}
},
extraPanels: [
{
title: 'Extra panel #1',
render: (node) => {
const div = document.createElement('div')
div.textContent = 'Extra Panel #1'
div.style.fontWeight = 'bold'
div.style.color = 'darkred'
div.style.background = 'var(--pvt-bg-color-8)'
div.style.padding = '4px 8px'
div.style.borderRadius = '4px'
return div
},
},
{
title: 'Extra panel #2',
render: (node) => {
const div = document.createElement('div')
div.textContent = 'Extra Panel #2'
div.style.fontWeight = 'bold'
div.style.color = 'darkred'
div.style.background = 'var(--pvt-bg-color-8)'
div.style.padding = '4px 8px'
div.style.borderRadius = '4px'
return div
},
},
],
tooltip: {
enabled: false,
},
contextMenu: {
enabled: false,
},
},Main Header interface
Shows a concise summary of the selected node or edge, such as title and subtitle. It helps users quickly identify the current selected element.
The main header panel can be customized through mapping functions. The default mapping for a node is
{
title: node => node.data.label ?? "Could not resolve title"
subtitle: node => node.data.description ?? ""
}You can change this mapping by overriding the parts you need:
const options = {
UI: {
mainHeader: {
nodeHeaderMap: {
title: node => `Node ${node.id}`,
subtitle: node => node.data.type ?? "",
}
}
}
}const options = {
UI: {
mainHeader: {
edgeHeaderMap: {
title: node => `Node ${node.id}`,
subtitle: node => node.data.type ?? "",
}
}
}
}const options = {
UI: {
mainHeader: {
render: (element) => {
const div = document.createElement('div')
div.textContent = 'Main Header'
return div
}
}
}
}WARNING
When render() is provided, Pivotick skips all default mapping logic.
Properties Panel interface
Displays detailed properties of the selected node or edge in the sidebar. Each property has a name and value that can be static or computed dynamically.
The default behavior is to show all key/value pairs from the node or edge's getData().
You can customize which properties are displayed and how they are rendered using mapping functions (nodePropertiesMap and edgePropertiesMap) or a full custom renderer.
const options = {
UI: {
propertiesPanel: {
nodePropertiesMap: (node: Node) => {
return [
{
name: 'Node ID',
value: node.id,
},
{
name: (node) => `Type of node`,
value: (node) => el ? el.type : 'Unknown'
},
{
name: 'Custom HTML',
value: document.createElement('div')
}
]
}
}
}
}const options = {
UI: {
propertiesPanel: {
edgePropertiesMap: (node: Node) => {
return [
{
name: 'Edge ID',
value: node.id,
},
{
name: (node) => `Type of edge`,
value: (node) => el ? el.type : 'Unknown'
},
{
name: 'Custom HTML',
value: document.createElement('div')
}
]
}
}
}
}const options = {
UI: {
propertiesPanel: {
render: (element: Node | Edge | Node[] | Edge[] | null) => {
const div = document.createElement('div')
div.textContent = `Element ID: ${element?.id}`
div.style.fontWeight = 'bold'
return div
}
}
}
}const options = {
UI: {
propertiesPanel: {
nodePropertiesMap: (node: Node) => {
return Object.entries(node.getData())
.filter(([key, value]) => key && value)
.map(([key, value]) => ({ name: key, value }))
}
}
}
}Extra Panels interface
Allows adding fully custom panels with dynamic or static content. These panels are ideal for showing additional contextual information, custom controls, or interactive widgets related to the selected element.
Each extra panel has a title and a render() function, both of which can be static (string/HTMLElement) or dynamic (function returning string/HTMLElement).
const options = {
UI: {
extraPanels: [
{
title: "Info",
render: "This is a static extra panel content"
}
]
}
}const options = {
UI: {
extraPanels: [
{
title: (node) => `Node #${node?.id}`,
render: (node) => {
const div = document.createElement('div')
div.textContent = node?.description ?? 'No description'
return div
}
}
]
}
}