Spaces:
Runtime error
Runtime error
(function() { | |
const GRADIO_MIN_WIDTH = 320; | |
const PAD = 16; | |
const DEBOUNCE_TIME = 100; | |
const DOUBLE_TAP_DELAY = 200; //ms | |
const R = { | |
tracking: false, | |
parent: null, | |
parentWidth: null, | |
leftCol: null, | |
leftColStartWidth: null, | |
screenX: null, | |
lastTapTime: null, | |
}; | |
let resizeTimer; | |
let parents = []; | |
function setLeftColGridTemplate(el, width) { | |
el.style.gridTemplateColumns = `${width}px 16px 1fr`; | |
} | |
function displayResizeHandle(parent) { | |
if (!parent.needHideOnMoblie) { | |
return true; | |
} | |
if (window.innerWidth < GRADIO_MIN_WIDTH * 2 + PAD * 4) { | |
parent.style.display = 'flex'; | |
parent.resizeHandle.style.display = "none"; | |
return false; | |
} else { | |
parent.style.display = 'grid'; | |
parent.resizeHandle.style.display = "block"; | |
return true; | |
} | |
} | |
function afterResize(parent) { | |
if (displayResizeHandle(parent) && parent.style.gridTemplateColumns != parent.style.originalGridTemplateColumns) { | |
const oldParentWidth = R.parentWidth; | |
const newParentWidth = parent.offsetWidth; | |
const widthL = parseInt(parent.style.gridTemplateColumns.split(' ')[0]); | |
const ratio = newParentWidth / oldParentWidth; | |
const newWidthL = Math.max(Math.floor(ratio * widthL), parent.minLeftColWidth); | |
setLeftColGridTemplate(parent, newWidthL); | |
R.parentWidth = newParentWidth; | |
} | |
} | |
function setup(parent) { | |
function onDoubleClick(evt) { | |
evt.preventDefault(); | |
evt.stopPropagation(); | |
parent.style.gridTemplateColumns = parent.style.originalGridTemplateColumns; | |
} | |
const leftCol = parent.firstElementChild; | |
const rightCol = parent.lastElementChild; | |
parents.push(parent); | |
parent.style.display = 'grid'; | |
parent.style.gap = '0'; | |
let leftColTemplate = ""; | |
if (parent.children[0].style.flexGrow) { | |
leftColTemplate = `${parent.children[0].style.flexGrow}fr`; | |
parent.minLeftColWidth = GRADIO_MIN_WIDTH; | |
parent.minRightColWidth = GRADIO_MIN_WIDTH; | |
parent.needHideOnMoblie = true; | |
} else { | |
leftColTemplate = parent.children[0].style.flexBasis; | |
parent.minLeftColWidth = parent.children[0].style.flexBasis.slice(0, -2) / 2; | |
parent.minRightColWidth = 0; | |
parent.needHideOnMoblie = false; | |
} | |
if (!leftColTemplate) { | |
leftColTemplate = '1fr'; | |
} | |
const gridTemplateColumns = `${leftColTemplate} ${PAD}px ${parent.children[1].style.flexGrow}fr`; | |
parent.style.gridTemplateColumns = gridTemplateColumns; | |
parent.style.originalGridTemplateColumns = gridTemplateColumns; | |
const resizeHandle = document.createElement('div'); | |
resizeHandle.classList.add('resize-handle'); | |
parent.insertBefore(resizeHandle, rightCol); | |
parent.resizeHandle = resizeHandle; | |
['mousedown', 'touchstart'].forEach((eventType) => { | |
resizeHandle.addEventListener(eventType, (evt) => { | |
if (eventType.startsWith('mouse')) { | |
if (evt.button !== 0) return; | |
} else { | |
if (evt.changedTouches.length !== 1) return; | |
const currentTime = new Date().getTime(); | |
if (R.lastTapTime && currentTime - R.lastTapTime <= DOUBLE_TAP_DELAY) { | |
onDoubleClick(evt); | |
return; | |
} | |
R.lastTapTime = currentTime; | |
} | |
evt.preventDefault(); | |
evt.stopPropagation(); | |
document.body.classList.add('resizing'); | |
R.tracking = true; | |
R.parent = parent; | |
R.parentWidth = parent.offsetWidth; | |
R.leftCol = leftCol; | |
R.leftColStartWidth = leftCol.offsetWidth; | |
if (eventType.startsWith('mouse')) { | |
R.screenX = evt.screenX; | |
} else { | |
R.screenX = evt.changedTouches[0].screenX; | |
} | |
}); | |
}); | |
resizeHandle.addEventListener('dblclick', onDoubleClick); | |
afterResize(parent); | |
} | |
['mousemove', 'touchmove'].forEach((eventType) => { | |
window.addEventListener(eventType, (evt) => { | |
if (eventType.startsWith('mouse')) { | |
if (evt.button !== 0) return; | |
} else { | |
if (evt.changedTouches.length !== 1) return; | |
} | |
if (R.tracking) { | |
if (eventType.startsWith('mouse')) { | |
evt.preventDefault(); | |
} | |
evt.stopPropagation(); | |
let delta = 0; | |
if (eventType.startsWith('mouse')) { | |
delta = R.screenX - evt.screenX; | |
} else { | |
delta = R.screenX - evt.changedTouches[0].screenX; | |
} | |
const leftColWidth = Math.max(Math.min(R.leftColStartWidth - delta, R.parent.offsetWidth - R.parent.minRightColWidth - PAD), R.parent.minLeftColWidth); | |
setLeftColGridTemplate(R.parent, leftColWidth); | |
} | |
}); | |
}); | |
['mouseup', 'touchend'].forEach((eventType) => { | |
window.addEventListener(eventType, (evt) => { | |
if (eventType.startsWith('mouse')) { | |
if (evt.button !== 0) return; | |
} else { | |
if (evt.changedTouches.length !== 1) return; | |
} | |
if (R.tracking) { | |
evt.preventDefault(); | |
evt.stopPropagation(); | |
R.tracking = false; | |
document.body.classList.remove('resizing'); | |
} | |
}); | |
}); | |
window.addEventListener('resize', () => { | |
clearTimeout(resizeTimer); | |
resizeTimer = setTimeout(function() { | |
for (const parent of parents) { | |
afterResize(parent); | |
} | |
}, DEBOUNCE_TIME); | |
}); | |
setupResizeHandle = setup; | |
})(); | |
function setupAllResizeHandles() { | |
for (var elem of gradioApp().querySelectorAll('.resize-handle-row')) { | |
if (!elem.querySelector('.resize-handle') && !elem.children[0].classList.contains("hidden")) { | |
setupResizeHandle(elem); | |
} | |
} | |
} | |
onUiLoaded(setupAllResizeHandles); | |