{"version":3,"sources":["scroll_container.ts"],"sourcesContent":["export type scrollContext = {scroll_x?:number, scroll_y?:number, scroll_to_bottom?:boolean, force_scroll_to_bottom?:boolean, element?:HTMLElement};\n\n\nexport function makeScrollContainer(element:HTMLElement, scroll_x = true, scroll_y = true, context:scrollContext = {scroll_x:0,scroll_y:0}) {\n\n\tconst container = document.createElement(\"div\");\n\tcontainer.classList.add('uix-scrollbar-container')\n\tconst content = document.createElement(\"div\");\n\tcontent.classList.add('uix-scrollbar-content')\n\n\tcontent.append(element)\n\tcontainer.append(content);\n\n\tconst scrollbar_y = document.createElement(\"div\");\n\tscrollbar_y.classList.add('uix-scrollbar', 'y');\n\tif (scroll_y) container.append(scrollbar_y)\n\n\tconst scrollbar_x = document.createElement(\"div\");\n\tscrollbar_x.classList.add('uix-scrollbar', 'x');\n\tif (scroll_x) container.append(scrollbar_x)\n\n\tenableScrollContainer(container, scroll_x, scroll_y, context);\n\n\treturn container;\n}\n\n\n// takes element, returns scroll container element\nexport function enableScrollContainer(container:HTMLElement, scroll_x = true, scroll_y = true, context:scrollContext = {scroll_x:0,scroll_y:0}) {\n\n\tconst content = context.element = <HTMLElement>container.querySelector('.uix-scrollbar-content');\n\n\tconst scrollbar_y = <HTMLElement>container.querySelector('.uix-scrollbar.y');\n\tconst scrollbar_x = <HTMLElement>container.querySelector('.uix-scrollbar.x');\n\n\tconst element = <HTMLElement>content.firstChild;\n\n\tconst updateScrollbars = ()=>{\n\t\t// y height\n\t\tlet heightRatioY = content.offsetHeight / content.scrollHeight;\n\t\tif (heightRatioY > 0.99) heightRatioY = 1; // compensate pixel rounding errors\n\t\telse if (heightRatioY < 0.05) heightRatioY = 0.05; // not too small\n\n\t\t// y position\n\t\tconst scrollRatioY = content.scrollTop / (content.scrollHeight-content.offsetHeight); \n\t\tconst topPercent = scrollRatioY * (1-heightRatioY);\n\t\t// remove overflow y position from height\n\t\tif (topPercent < 0) heightRatioY += topPercent;\n\t\tif (topPercent+heightRatioY > 1) heightRatioY = 1 - topPercent;\n\n\t\tscrollbar_y.style.top = Math.max(0, topPercent * 100) + \"%\"\n\t\tscrollbar_y.style.height = \"calc(\" + (heightRatioY * 100) + \"% - 10px)\"\n\t\tif (heightRatioY == 1) scrollbar_y.style.display = \"none\";\n\t\telse scrollbar_y.style.display = \"block\";\n\n\n\t\t// x width\n\t\tlet heightRatioX = content.offsetWidth / content.scrollWidth;\n\t\tif (heightRatioX > 0.99) heightRatioX = 1; // compensate pixel rounding errors\n\t\telse if (heightRatioX < 0.05) heightRatioX = 0.05; // not too small\n\n\t\t// x position\n\t\tconst scrollRatioX = content.scrollLeft / (content.scrollWidth-content.offsetWidth); \n\t\tconst leftPercent = scrollRatioX * (1-heightRatioX);\n\t\t// remove overflow x position from width\n\t\tif (leftPercent < 0) heightRatioX += leftPercent;\n\t\tif (leftPercent+heightRatioX > 1) heightRatioX = 1 - leftPercent;\n\n\t\tscrollbar_x.style.left = Math.max(0, leftPercent * 100) + \"%\"\n\t\tscrollbar_x.style.width = \"calc(\" + (heightRatioX * 100) + \"% - 20px)\"\n\t\tif (heightRatioX == 1) scrollbar_x.style.display = \"none\";\n\t\telse scrollbar_x.style.display = \"block\";\n\t   \n\t\tcontext.scroll_y = content.scrollTop;\n\t\tcontext.scroll_x = content.scrollLeft;\n\t}\n\n\t// scroll listener\n\tlet ticking = false;\n\n\tcontent.addEventListener('scroll', function(e) {          \n\t\tif (!ticking) {\n\t\t  globalThis.requestAnimationFrame(function() {\n\t\t\tupdateScrollbars();\n\t\t\tticking = false;\n\t\t  });\n\t\t  ticking = true;\n\t\t}\n\t});\n\n\t// scrollbar drag listeners\n\tlet scrollingY:boolean;\n\tlet scrollYStart:number;\n\tlet scrollTopStart:number;\n\n\tlet scrollingX:boolean;\n\tlet scrollXStart:number;\n\tlet scrollLeftStart:number;\n\n\tif (scroll_y) {\n\t\tscrollingY = false;\n\t\tscrollYStart = 0;\n\t\tscrollTopStart = 0;\n\t\t\n\t\tscrollbar_y.addEventListener(\"mousedown\", function(e) {\n\t\t\tscrollbar_y.classList.add(\"active\")\n\t\t\tscrollingY = true;\n\t\t\tscrollYStart = e.clientY;\n\t\t\tscrollTopStart = content.scrollTop;\n\t\t})\n\t}\n   \n\tif (scroll_x) {\n\t\tscrollingX = false;\n\t\tscrollXStart = 0;\n\t\tscrollLeftStart = 0;\n\n\t\tscrollbar_x.addEventListener(\"mousedown\", function(e) {\n\t\t\tscrollbar_x.classList.add(\"active\")\n\t\t\tscrollingX = true;\n\t\t\tscrollXStart = e.clientX;\n\t\t\tscrollLeftStart = content.scrollLeft;\n\t\t})\n\t}\n   \n\n\tglobalThis.addEventListener(\"mousemove\", (e) => {\n\t\tif (scrollingY) {\n\t\t\tconst delta = e.clientY - scrollYStart;\n\t\t\tconst deltaPercent = delta / content.offsetHeight;\n\t\t\tconst scrollYRatio = deltaPercent / (1-content.offsetHeight / content.scrollHeight);\n\t\t\tcontent.scrollTop = scrollTopStart + scrollYRatio * (content.scrollHeight-content.offsetHeight);\n\t\t}\n\t\tif (scrollingX) {\n\t\t\tconst delta = e.clientX - scrollXStart;\n\t\t\tconst deltaPercent = delta / content.offsetWidth;\n\t\t\tconst scrollXRatio = deltaPercent / (1-content.offsetWidth / content.scrollWidth);\n\t\t\tcontent.scrollLeft = scrollLeftStart + scrollXRatio * (content.scrollWidth-content.offsetWidth);\n\t\t}\n\t})\n\n\t// reset\n\tdocument.addEventListener(\"mouseup\", function(e) {\n\t\tscrollingY = false;\n\t\tscrollingX = false;\n\t\tscrollbar_y.classList.remove(\"active\")   \n\t\tscrollbar_x.classList.remove(\"active\")\n\t})\n\n\tlet initial_scroll = ((context.scroll_y??0) > content.scrollHeight || (context.scroll_x??0) > content.scrollWidth);\n\n\tif (globalThis.ResizeObserver && !globalThis.Deno) {\n\t\t// dom content resize observers\n\t\tnew ResizeObserver(()=>{\n\t\t\tif (initial_scroll) {\n\t\t\t\tupdateScrollPosition(context);\n\t\t\t\tsetTimeout(()=>updateScrollPosition(context), 20);\n\t\t\t\tsetTimeout(()=>{updateScrollPosition(context);initial_scroll = false;}, 100);\n\t\t\t}\n\t\t\telse updateScrollbars();\n\t\t}).observe(content);\n\n\t\tnew ResizeObserver(()=>{\n\t\t\tupdateScrollbars();\n\t\t\t// scroll to bottom\n\t\t\tif (context.scroll_to_bottom) scrollToBottom(context);\n\t\t}).observe(element);\n\t}\n\t\n\n\tcontent.addEventListener(\"mouseup\", ()=>updateScrollbars())\n\tcontent.addEventListener(\"mousedown\", ()=>updateScrollbars())\n\n\t// move to saved scroll position\n\tupdateScrollPosition(context)\n\n\treturn container;\n}\n\n\nexport function updateScrollPosition(context:scrollContext, x?:number, y?:number) {\n\tif (!context.element) return;\n\n\tif (x!=undefined) context.element.scrollLeft = context.scroll_x = x;\n\telse context.element.scrollLeft = context.scroll_x??0;\n\n\tif (y!=undefined) context.element.scrollTop = context.scroll_y = y;\n\telse context.element.scrollTop = context.scroll_y??0;\n}\n\nexport function scrollToBottom(context:scrollContext, force_scroll = false){\n\tif (!context.element) return;\t\n\n\tif (force_scroll || context.force_scroll_to_bottom || (context.element.scrollHeight - context.element.offsetHeight - context.element.scrollTop < 200))\n\t\tupdateScrollPosition(context, undefined, context.element.scrollHeight-context.element.clientHeight)\n}\n\nexport function scrollToTop(context:scrollContext){\n\tupdateScrollPosition(context, undefined, 0)\n}\n\n"],"names":["makeScrollContainer","element","scroll_x","scroll_y","context","container","document","createElement","classList","add","content","append","scrollbar_y","scrollbar_x","enableScrollContainer","scrollingY","scrollYStart","scrollTopStart","scrollingX","scrollXStart","scrollLeftStart","querySelector","firstChild","updateScrollbars","heightRatioY","offsetHeight","scrollHeight","topPercent","scrollRatioY","scrollTop","style","top","Math","max","height","display","heightRatioX","offsetWidth","scrollWidth","leftPercent","scrollRatioX","scrollLeft","left","width","ticking","addEventListener","e","globalThis","requestAnimationFrame","clientY","clientX","scrollYRatio","deltaPercent","scrollXRatio","remove","initial_scroll","ResizeObserver","Deno","updateScrollPosition","setTimeout","observe","scroll_to_bottom","scrollToBottom","x","y","undefined","force_scroll","force_scroll_to_bottom","clientHeight","scrollToTop"],"mappings":"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","sourceRoot":"/lib/uix-0.4.39/src/standalone/","file":"scroll_container.ts"}