const MIN_WIDTH = 240; const addDraggable = (tabId: string) => { const settings = document.querySelector(`#${tabId}_settings`) as HTMLDivElement; const checkDraggableLine = document.querySelector( `#tab_${tabId} .draggable-line`, ) as HTMLDivElement; if (!settings || checkDraggableLine) return; settings.style.minWidth = `min(${MIN_WIDTH}px, 100%)`; const lineWrapper = document.createElement('div'); lineWrapper.classList.add('draggable-line'); settings.after(lineWrapper); const container: HTMLElement | any = settings.parentElement; container.classList.add('draggable-container'); let results: HTMLDivElement = document.querySelector(`#${tabId}_results`) as HTMLDivElement; if (!results) return; if (tabId === 'extras') results = results.parentElement as HTMLDivElement; results.style.minWidth = `${MIN_WIDTH}px`; let linePosition = 50; settings.style.flexBasis = `${linePosition}%`; results.style.flexBasis = `${100 - linePosition}%`; let isDragging = false; lineWrapper.addEventListener('mousedown', (e) => { isDragging = true; e.preventDefault(); }); document.addEventListener('mousemove', (event) => { if (!isDragging) return; const tab = document.querySelector(`#tab_${tabId}`) as HTMLDivElement; if (!tab) return; let offsetX = tab.offsetLeft; let parent = tab.offsetParent as HTMLDivElement; while (parent) { offsetX += parent.offsetLeft; parent = parent.offsetParent as HTMLDivElement; } const containerWidth = container.offsetWidth; const mouseX = event.clientX; const linePosition = ((mouseX - offsetX) / containerWidth) * 100; if (linePosition <= (MIN_WIDTH / containerWidth) * 100) return; if (linePosition >= (1 - MIN_WIDTH / containerWidth) * 100) return; settings.style.flexBasis = `${linePosition}%`; results.style.flexBasis = `${100 - linePosition}%`; }); document.addEventListener('mouseup', () => { isDragging = false; }); }; export default () => { console.time('🤯 [layout] inject - DraggablePanel'); addDraggable('txt2img'); addDraggable('img2img'); const extrasSetting = document.querySelector('#extras_results')?.parentElement ?.previousElementSibling as HTMLDivElement; if (extrasSetting) { extrasSetting.id = 'extras_settings'; addDraggable('extras'); } console.timeEnd('🤯 [layout] inject - DraggablePanel'); };