resizableSidebar.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. export const AI_WRITING_SIDEBAR_SIZE = Object.freeze({
  2. min: 360,
  3. default: 520,
  4. max: 900,
  5. minMain: 360,
  6. keyboardStep: 32
  7. })
  8. function toFiniteNumber(value, fallback) {
  9. const numberValue = Number(value)
  10. return Number.isFinite(numberValue) ? numberValue : fallback
  11. }
  12. function clamp(value, min, max) {
  13. return Math.min(Math.max(value, min), max)
  14. }
  15. export function calculateResizableSidebarWidth({
  16. pointerX,
  17. containerRight,
  18. containerWidth,
  19. minWidth = AI_WRITING_SIDEBAR_SIZE.min,
  20. maxWidth = AI_WRITING_SIDEBAR_SIZE.max,
  21. minMainWidth = AI_WRITING_SIDEBAR_SIZE.minMain
  22. } = {}) {
  23. const safeMinWidth = Math.max(0, toFiniteNumber(minWidth, AI_WRITING_SIDEBAR_SIZE.min))
  24. const safeMaxWidth = Math.max(safeMinWidth, toFiniteNumber(maxWidth, AI_WRITING_SIDEBAR_SIZE.max))
  25. const safeMainWidth = Math.max(0, toFiniteNumber(minMainWidth, AI_WRITING_SIDEBAR_SIZE.minMain))
  26. const safeContainerWidth = Math.max(0, toFiniteNumber(containerWidth, safeMaxWidth + safeMainWidth))
  27. const availableMaxWidth = Math.max(
  28. safeMinWidth,
  29. Math.min(safeMaxWidth, safeContainerWidth - safeMainWidth)
  30. )
  31. const rawWidth = toFiniteNumber(containerRight, 0) - toFiniteNumber(pointerX, 0)
  32. return Math.round(clamp(rawWidth, safeMinWidth, availableMaxWidth))
  33. }