import { STATE, removeBookmark } from '../../core/State.js';
let updateCallback = null;
/**
* Build the Bookmarks list card.
* @param {import('../types.js').PanelContext} ctx
* @returns {HTMLDivElement}
*/
export function buildBookmarksPanel(ctx) {
const card = document.createElement('div');
card.className = 'section-card';
card.innerHTML = `
📌 Navigation Bookmarks
`;
updateCallback = () => {
const ul = card.querySelector('#bookmarks-list-ul');
if (!ul) return;
ul.innerHTML = '';
if (!STATE.bookmarks || STATE.bookmarks.length === 0) {
ul.innerHTML = `
No bookmarks yet. Point at a relief and press 'B' to save
`;
return;
}
STATE.bookmarks.forEach(bm => {
const li = document.createElement('li');
li.className = 'list-item';
li.style.cssText = 'cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: var(--spacing-xs);';
// User name, metadata badges (chunk index, dimension), and a delete icon.
li.innerHTML = `
${bm.name}
${bm.docId}
Chunk: ${bm.chunkIndex}
Dim: ${bm.dimIndex}
Val: ${bm.value.toFixed(4)}
`;
// Click handlers
li.onclick = (e) => {
// If clicked on delete button, do not navigate
if (e.target.closest('.btn-delete')) return;
// On click on the item body: Set STATE.comparisonMode = 'C', set STATE.reliefInspectDim = dimIndex,
// and open the fullscreen Mode C inspector, focusing directly on the marked dimension.
STATE.comparisonMode = 'C';
STATE.reliefInspectDim = bm.dimIndex;
// Add the dimension to comparison dims if not already there
if (!STATE.reliefInspectDims) STATE.reliefInspectDims = [];
if (!STATE.reliefInspectDims.some(d => d.dim === bm.dimIndex)) {
STATE.reliefInspectDims.push({ dim: bm.dimIndex, visible: true });
}
// Call applyComparison
if (typeof ctx.applyComparison === 'function') {
ctx.applyComparison();
} else if (typeof window.applyComparison === 'function') {
window.applyComparison();
}
};
const btnDelete = li.querySelector('.btn-delete');
if (btnDelete) {
btnDelete.onclick = (e) => {
e.stopPropagation();
removeBookmark(bm.id);
updateBookmarksUI();
};
}
ul.appendChild(li);
});
};
// Register refresh
ctx.refresh.bookmarks = updateCallback;
// Render initially
setTimeout(() => {
updateBookmarksUI();
}, 0);
return card;
}
export function updateBookmarksUI() {
if (typeof updateCallback === 'function') {
updateCallback();
}
}