Files
personotes/static/sidebar-resize.js
2025-11-12 09:31:09 +01:00

177 lines
4.4 KiB
JavaScript

/**
* Sidebar Resizable
* Allows users to resize the sidebar by dragging the right edge
*/
(function() {
'use strict';
const STORAGE_KEY = 'sidebar-width';
const DEFAULT_WIDTH = 300;
const MIN_WIDTH = 200;
const MAX_WIDTH = 600;
let sidebar = null;
let resizeHandle = null;
let isResizing = false;
let startX = 0;
let startWidth = 0;
/**
* Initialize sidebar resize functionality
*/
function init() {
sidebar = document.querySelector('#sidebar');
if (!sidebar) {
console.warn('Sidebar not found');
return;
}
console.log('Sidebar resize initialized');
// Create resize handle
createResizeHandle();
// Restore saved width
restoreSidebarWidth();
// Add event listeners
setupEventListeners();
}
/**
* Create the resize handle element
*/
function createResizeHandle() {
resizeHandle = document.createElement('div');
resizeHandle.className = 'sidebar-resize-handle';
resizeHandle.title = 'Drag to resize sidebar / Glisser pour redimensionner';
sidebar.appendChild(resizeHandle);
console.log('Resize handle created and appended');
}
/**
* Setup event listeners for resizing
*/
function setupEventListeners() {
resizeHandle.addEventListener('mousedown', startResize);
document.addEventListener('mousemove', handleResize);
document.addEventListener('mouseup', stopResize);
// Prevent text selection while resizing
resizeHandle.addEventListener('selectstart', (e) => e.preventDefault());
}
/**
* Start resizing
*/
function startResize(e) {
isResizing = true;
startX = e.clientX;
startWidth = sidebar.offsetWidth;
resizeHandle.classList.add('resizing');
document.body.style.cursor = 'col-resize';
document.body.style.userSelect = 'none';
console.log('Started resizing from:', startX, 'width:', startWidth);
e.preventDefault();
e.stopPropagation();
}
/**
* Handle resize dragging
*/
function handleResize(e) {
if (!isResizing) return;
const delta = e.clientX - startX;
const newWidth = Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, startWidth + delta));
applySidebarWidth(newWidth);
e.preventDefault();
e.stopPropagation();
}
/**
* Stop resizing
*/
function stopResize(e) {
if (!isResizing) return;
isResizing = false;
resizeHandle.classList.remove('resizing');
document.body.style.cursor = '';
document.body.style.userSelect = '';
console.log('Stopped resizing at width:', sidebar.offsetWidth);
// Save the new width
saveSidebarWidth();
}
/**
* Save sidebar width to localStorage
*/
function saveSidebarWidth() {
const width = sidebar.offsetWidth;
try {
localStorage.setItem(STORAGE_KEY, width.toString());
} catch (e) {
console.warn('Failed to save sidebar width:', e);
}
}
/**
* Restore sidebar width from localStorage
*/
function restoreSidebarWidth() {
try {
const savedWidth = localStorage.getItem(STORAGE_KEY);
if (savedWidth) {
const width = parseInt(savedWidth, 10);
if (width >= MIN_WIDTH && width <= MAX_WIDTH) {
applySidebarWidth(width);
}
}
} catch (e) {
console.warn('Failed to restore sidebar width:', e);
}
}
/**
* Apply sidebar width to both sidebar and main content
*/
function applySidebarWidth(width) {
sidebar.style.width = `${width}px`;
// Update main content margin
const main = document.querySelector('main');
if (main) {
main.style.marginLeft = `${width}px`;
}
}
/**
* Reset sidebar to default width
*/
function resetSidebarWidth() {
applySidebarWidth(DEFAULT_WIDTH);
saveSidebarWidth();
}
// Initialize on DOM ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
// DOM already loaded
init();
}
// Expose reset function globally for debugging
window.resetSidebarWidth = resetSidebarWidth;
})();