mirror of
				https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
				synced 2025-10-31 02:05:33 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			222 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Script for auto collapsing marginal boxes
 | |
| const startup_marginals = function () {
 | |
|   let debounce_resize;
 | |
|   let collapsedboxes = [];
 | |
| 
 | |
|   const getLineHeight = function (element) {
 | |
|     var temp = document.createElement(element.nodeName),
 | |
|       ret;
 | |
|     temp.setAttribute("class", element.className);
 | |
|     temp.innerHTML = "Üj";
 | |
|     element.parentNode.appendChild(temp);
 | |
|     ret = temp.getBoundingClientRect().height;
 | |
|     temp.parentNode.removeChild(temp);
 | |
|     return ret;
 | |
|   };
 | |
| 
 | |
|   const collapsebox = function (element, height, lineheight) {
 | |
|     element.style.maxHeight = height + "px";
 | |
|     element.classList.add("ha-collapsed-box");
 | |
|     element.classList.remove("ha-expanded-box");
 | |
|     setTimeout(function () {
 | |
|       element.classList.remove("transition-all");
 | |
|     }, 130);
 | |
|     element.style.bottom = "unset";
 | |
|   };
 | |
| 
 | |
|   const uncollapsebox = function (element, topmove = false) {
 | |
|     element.classList.add("transition-all");
 | |
|     element.classList.remove("ha-collapsed-box");
 | |
|     element.classList.add("ha-expanded-box");
 | |
|     if (topmove > 0) element.style.bottom = "5px";
 | |
|   };
 | |
| 
 | |
|   const addbuttoncaollapsebox = function (
 | |
|     element,
 | |
|     height,
 | |
|     hoverfunction,
 | |
|     topmove = false,
 | |
|   ) {
 | |
|     let btn = document.createElement("div");
 | |
|     btn.classList.add("ha-btn-collapsed-box");
 | |
| 
 | |
|     if (element.classList.contains("ha-collapsed-box")) {
 | |
|       btn.classList.add("ha-open-btn-collapsed-box");
 | |
|     } else {
 | |
|       btn.classList.add("ha-close-btn-collapsed-box");
 | |
|     }
 | |
| 
 | |
|     btn.addEventListener("click", function (ev) {
 | |
|       ev.stopPropagation();
 | |
|       if (element.classList.contains("ha-collapsed-box")) {
 | |
|         uncollapsebox(element, topmove);
 | |
|         btn.classList.add("ha-close-btn-collapsed-box");
 | |
|         btn.classList.add("ha-collapsed-box-manually-toggled");
 | |
|       } else {
 | |
|         collapsebox(element, height, 0);
 | |
|         btn.classList.remove("ha-close-btn-collapsed-box");
 | |
|         btn.classList.remove("ha-collapsed-box-manually-toggled");
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     if (hoverfunction) {
 | |
|       let timer = null;
 | |
| 
 | |
|       element.addEventListener("mouseenter", function (ev) {
 | |
|         ev.stopPropagation();
 | |
|         if (timer != null) {
 | |
|           clearTimeout(timer);
 | |
|         }
 | |
|         if (element.classList.contains("ha-collapsed-box")) {
 | |
|           uncollapsebox(element, topmove);
 | |
|           btn.classList.add("ha-close-btn-collapsed-box");
 | |
|         }
 | |
|       });
 | |
| 
 | |
|       element.addEventListener("mouseleave", function (ev) {
 | |
|         ev.stopPropagation();
 | |
|         timer = setTimeout(function () {
 | |
|           if (
 | |
|             element.classList.contains("ha-expanded-box") &&
 | |
|             !btn.classList.contains("ha-collapsed-box-manually-toggled")
 | |
|           ) {
 | |
|             collapsebox(element, height, 0);
 | |
|             btn.classList.remove("ha-close-btn-collapsed-box");
 | |
|           }
 | |
|         }, 200);
 | |
|       });
 | |
|     }
 | |
|     element.parentNode.insertBefore(btn, element);
 | |
|   };
 | |
| 
 | |
|   const overlappingcollapsebox = function (
 | |
|     selector,
 | |
|     hoverfunction,
 | |
|     containerid,
 | |
|   ) {
 | |
|     let container = document.getElementById(containerid);
 | |
|     if (!container) return;
 | |
|     let containerrect = document
 | |
|       .getElementById(containerid)
 | |
|       .getBoundingClientRect();
 | |
|     let boxes = document.querySelectorAll(selector);
 | |
|     let lineheight = 1;
 | |
| 
 | |
|     if (boxes.length >= 1) {
 | |
|       lineheight = getLineHeight(boxes[0]);
 | |
|     }
 | |
| 
 | |
|     for (var i = 0; i < boxes.length; i++) {
 | |
|       let element = boxes[i];
 | |
|       let thisrect = element.getBoundingClientRect();
 | |
|       let overlap = -2;
 | |
|       let topmove = false;
 | |
|       // Check if this works
 | |
| 
 | |
|       if (i < boxes.length - 1) {
 | |
|         let nextrect = boxes[i + 1].getBoundingClientRect();
 | |
|         overlap = thisrect.bottom - nextrect.top;
 | |
|       } else if (thisrect.bottom > containerrect.bottom) {
 | |
|         overlap = thisrect.bottom - containerrect.bottom;
 | |
|       }
 | |
| 
 | |
|       if (thisrect.bottom > containerrect.bottom) {
 | |
|         topmove = true;
 | |
|       }
 | |
| 
 | |
|       if (
 | |
|         // -1 for catching lines that perfectly close up on each other
 | |
|         overlap >= -1 &&
 | |
|         !(window.getComputedStyle(element).display === "none")
 | |
|       ) {
 | |
|         let newlength = 0;
 | |
|         if (overlap >= 0) newlength = thisrect.height - overlap;
 | |
|         else newlength = thisrect.height - lineheight;
 | |
|         if (newlength % (lineheight * 3) <= 2) newlength -= lineheight;
 | |
|         let remainder = newlength % lineheight;
 | |
|         newlength = newlength - remainder;
 | |
| 
 | |
|         // Line clamping for Marginals
 | |
|         if (element.classList.contains("ha-marginalbox")) {
 | |
|           let marginals = element.querySelectorAll(".ha-marginal");
 | |
|           let h = 0;
 | |
|           for (let m of marginals) {
 | |
|             let cr = m.getBoundingClientRect();
 | |
|             let eh = cr.bottom - cr.top;
 | |
|             h += eh;
 | |
|             if (h >= newlength) {
 | |
|               let lines = Math.floor(eh / lineheight);
 | |
|               let cutoff = Math.floor((h - newlength) / lineheight);
 | |
|               m.style.cssText +=
 | |
|                 "-webkit-line-clamp: " + (lines - cutoff) + ";";
 | |
|               m.style.cssText += "line-clamp: " + (lines - cutoff) + ";";
 | |
|             }
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         requestAnimationFrame(() => {
 | |
|           collapsedboxes.push(element);
 | |
|           collapsebox(element, newlength, lineheight);
 | |
|           addbuttoncaollapsebox(element, newlength, hoverfunction, topmove);
 | |
|         });
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   const marginalboxwidthset = function (containerid, classes) {
 | |
|     let lt = document.getElementById(containerid);
 | |
|     if (lt !== null) {
 | |
|       let mg = lt.querySelectorAll(classes);
 | |
|       if (mg.length > 0) {
 | |
|         let ltbcr = lt.getBoundingClientRect();
 | |
|         let mgbcr = mg[0].getBoundingClientRect();
 | |
|         let nw = ltbcr.right - mgbcr.left - 20;
 | |
| 
 | |
|         for (let element of mg) {
 | |
|           element.style.width = nw + "px";
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   const clearcollapsedboxes = function () {
 | |
|     let elements = document.querySelectorAll(".ha-marginalbox");
 | |
|     elements.forEach((element) => {
 | |
|       element.removeAttribute("style");
 | |
|     });
 | |
|     collapsedboxes.forEach((element) => {
 | |
|       element.classList.remove("ha-expanded-box");
 | |
|       element.classList.remove("ha-collapsed-box");
 | |
|       element.outerHTML = element.outerHTML;
 | |
|     });
 | |
|     collapsedboxes = [];
 | |
|     elements = document.querySelectorAll(".ha-btn-collapsed-box");
 | |
|     elements.forEach((element) => {
 | |
|       element.remove();
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   const resetall = function () {
 | |
|     clearcollapsedboxes();
 | |
|     marginalboxwidthset("ha-letterbody", ".ha-marginalbox");
 | |
|     marginalboxwidthset("ha-register-body", ".ha-letlinks");
 | |
|     startup_marginals();
 | |
|   };
 | |
| 
 | |
|   const collapseboxes = function () {
 | |
|     overlappingcollapsebox(".ha-letlinks", true, "ha-register-body");
 | |
|     overlappingcollapsebox(".ha-marginalbox", true, "ha-letterbody");
 | |
|   };
 | |
| 
 | |
|   window.addEventListener("resize", function () {
 | |
|     clearTimeout(debounce_resize);
 | |
|     debounce_resize = setTimeout(resetall, 17);
 | |
|   });
 | |
| 
 | |
|   marginalboxwidthset("ha-letterbody", ".ha-marginalbox");
 | |
|   marginalboxwidthset("ha-register-body", ".ha-letlinks");
 | |
|   collapseboxes();
 | |
| };
 | |
| 
 | |
| export { startup_marginals };
 | 
