Änderungen von Dokument Get Started
Zuletzt geändert von Veronika Kocher am Freitag, 04 Sep. 2026 14:45
Von Version 2.7
bearbeitet von Veronika Kocher
am Donnerstag, 03 Sep. 2026 10:09
am Donnerstag, 03 Sep. 2026 10:09
Änderungskommentar:
Es gibt keinen Kommentar für diese Version
Auf Version 2.8
bearbeitet von Veronika Kocher
am Donnerstag, 03 Sep. 2026 13:04
am Donnerstag, 03 Sep. 2026 13:04
Änderungskommentar:
Es gibt keinen Kommentar für diese Version
Zusammenfassung
-
Seiteneigenschaften (1 geändert, 0 hinzugefügt, 0 gelöscht)
Details
- Seiteneigenschaften
-
- Inhalt
-
... ... @@ -387,12 +387,13 @@ 387 387 </div> 388 388 {{/html}} 389 389 390 -\n\n 391 -\n\n{{html clean="false"}} 392 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_START --> 390 +{{html clean="false"}} 391 +<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START --> 393 393 394 -<style data-sn-horizontal-box-harmonizer="7"> 395 -/* ---------- Typography: never justify headings ---------- */ 393 +<style data-sn-service-navigator-master="1"> 394 +/* ========================================================= 395 + MASTER TYPOGRAPHY 396 + ========================================================= */ 396 396 #xwikicontent h1, 397 397 #xwikicontent h2, 398 398 #xwikicontent h3, ... ... @@ -414,88 +414,73 @@ 414 414 word-spacing:normal!important; 415 415 } 416 416 417 -/* ---------- Native XWiki semantic callouts ---------- */ 418 -#xwikicontent .box.infomessage, 419 -#xwikicontent .infomessage, 420 -#xwikicontent .box.warningmessage, 421 -#xwikicontent .warningmessage, 422 -#xwikicontent .box.successmessage, 423 -#xwikicontent .successmessage, 424 -#xwikicontent .box.errormessage, 425 -#xwikicontent .errormessage, 426 -#xwikicontent [data-sn-callout-harmonized="1"]{ 418 +/* ========================================================= 419 + COMING SOON / IN VORBEREITUNG 420 + ========================================================= */ 421 +.sn-coming-soon-badge{ 422 + display:inline-block; 423 + vertical-align:middle; 424 + margin-left:10px; 425 + padding:4px 8px; 426 + border-radius:14px; 427 + border:1px solid #efd9cc; 428 + background:#fff4ee; 429 + color:#8a4d36; 430 + font-size:11px; 431 + font-weight:700; 432 + letter-spacing:.055em; 433 + line-height:1.2; 434 + white-space:nowrap; 435 +} 436 + 437 +/* ========================================================= 438 + NATIVE / DETAIL CALLOUT GEOMETRY 439 + Preserve existing backgrounds. 440 + ========================================================= */ 441 +#xwikicontent .arsn-info, 442 +#xwikicontent .dmp-info, 443 +#xwikicontent .ido-info, 444 +#xwikicontent .pp-info, 445 +#xwikicontent .infomessage{ 427 427 box-sizing:border-box!important; 428 - border-radius:8px!important; 429 - border-top:1px solid rgba(0,0,0,.08)!important; 430 - border-right:1px solid rgba(0,0,0,.08)!important; 431 - border-bottom:1px solid rgba(0,0,0,.08)!important; 432 - border-left:4px solid var(--sn-callout-accent,#21b6d7)!important; 433 - padding:14px 16px!important; 447 + border-left:4px solid #21b6d7!important; 448 + border-radius:8px; 434 434 text-align:left!important; 435 - text-justify:auto!important; 436 436 word-spacing:normal!important; 437 - box-shadow:none!important; 438 438 } 439 439 440 -#xwikicontent .box.infomessage, 441 -#xwikicontent .infomessage{ 442 - --sn-callout-accent:#21b6d7; 443 - background:#eaf7fb!important; 444 -} 445 - 446 -#xwikicontent .box.warningmessage, 447 -#xwikicontent .warningmessage{ 448 - --sn-callout-accent:#f0aa00; 449 - background:#fff8e7!important; 450 -} 451 - 452 -#xwikicontent .box.successmessage, 453 -#xwikicontent .successmessage{ 454 - --sn-callout-accent:#38b76a; 455 - background:#edf9f1!important; 456 -} 457 - 458 -#xwikicontent .box.errormessage, 453 +#xwikicontent .arsn-warn, 454 +#xwikicontent .dmp-warn, 455 +#xwikicontent .ido-warn, 456 +#xwikicontent .pp-warn, 457 +#xwikicontent .warn, 458 +#xwikicontent .warning, 459 +#xwikicontent .warningmessage, 459 459 #xwikicontent .errormessage{ 460 - --sn-callout-accent:#e94b13; 461 - background:#fff1ec!important; 461 + box-sizing:border-box!important; 462 + border-left:4px solid #e94b13!important; 463 + border-radius:8px; 464 + text-align:left!important; 465 + word-spacing:normal!important; 462 462 } 463 463 464 -#xwikicontent [data-sn-callout-harmonized="1"] > :first-child, 465 -#xwikicontent .infomessage > :first-child, 466 -#xwikicontent .warningmessage > :first-child, 467 -#xwikicontent .successmessage > :first-child, 468 -#xwikicontent .errormessage > :first-child{ 469 - margin-top:0!important; 470 -} 471 - 472 -#xwikicontent [data-sn-callout-harmonized="1"] > :last-child, 473 -#xwikicontent .infomessage > :last-child, 474 -#xwikicontent .warningmessage > :last-child, 475 -#xwikicontent .successmessage > :last-child, 476 -#xwikicontent .errormessage > :last-child{ 477 - margin-bottom:0!important; 478 -} 479 - 480 -#xwikicontent [data-sn-equal-height-managed], 481 -#xwikicontent [data-sn-first-section-aligned], 482 -#xwikicontent [data-sn-first-content-aligned]{ 468 +[data-sn-master-equal-height], 469 +[data-sn-master-first-row]{ 483 483 box-sizing:border-box; 484 484 } 485 485 </style> 486 486 487 -<script data-sn- horizontal-box-harmonizer="7">474 +<script data-sn-service-navigator-master="1"> 488 488 (function(){ 489 489 "use strict"; 490 490 478 + var PAGE_KIND="detail"; 479 + var PLACEHOLDER=false; 480 + var PLACEHOLDER_LABEL="IN VORBEREITUNG"; 481 + 491 491 var MOBILE_MAX=767; 492 492 var ROW_TOLERANCE=6; 493 - var MIN_W=150; 494 - var MIN_H=36; 495 - var MAX_PARENT_CHILDREN=18; 496 - var SEARCH_DEPTH=5; 497 497 var RESIZE_DEBOUNCE=220; 498 - var MIN_WIDTH_CHANGE=2; 499 499 500 500 var root= 501 501 document.getElementById("xwikicontent")|| ... ... @@ -505,142 +505,114 @@ 505 505 506 506 if(!root)return; 507 507 508 - var heightManaged=new Set(); 509 - var sectionManaged=new Set(); 510 - var contentManaged=new Set(); 494 + var managedHeight=new Set(); 495 + var managedMargin=new Set(); 496 + var originalHeight=new WeakMap(); 497 + var originalMargin=new WeakMap(); 511 511 512 - var originalMinHeight=new WeakMap(); 513 - var originalMarginTop=new WeakMap(); 514 - 515 515 var resizeTimer=0; 516 - var lastWidth=-1; 517 - var hasApplied=false; 518 - var applying=false; 500 + var running=false; 519 519 520 - function num(v){ 521 - var n=parseFloat(v); 522 - return Number.isFinite(n)?n:0; 523 - } 524 - 525 - function visible(el,minW,minH){ 526 - if(!el||el.nodeType!==1)return false; 527 - 528 - var s=getComputedStyle(el); 529 - 530 - if( 531 - s.display==="none"|| 532 - s.visibility==="hidden"|| 533 - Number(s.opacity)===0 534 - ){ 535 - return false; 502 + var THEMES=[ 503 + { 504 + name:"BLUE", 505 + accent:"#21b6d7", 506 + bg:"#eaf7fb", 507 + text:"#315d68", 508 + labels:[ 509 + "HIER STARTEN", 510 + "ENTSCHEIDEN", 511 + "ÜBERPRÜFEN & ANPASSEN", 512 + "START HERE", 513 + "DECIDE", 514 + "REVIEW & ADAPT" 515 + ] 516 + }, 517 + { 518 + name:"RED", 519 + accent:"#e94b13", 520 + bg:"#fff1ec", 521 + text:"#8a4d36", 522 + labels:[ 523 + "PLANEN & ORGANISIEREN", 524 + "ORGANISIEREN & DOKUMENTIEREN", 525 + "PUBLIZIEREN & PRÄSENTIEREN", 526 + "PLAN & ORGANISE", 527 + "PLAN & ORGANIZE", 528 + "ORGANISE & DOCUMENT", 529 + "ORGANIZE & DOCUMENT", 530 + "PUBLISH & PRESENT" 531 + ] 532 + }, 533 + { 534 + name:"YELLOW", 535 + accent:"#f0aa00", 536 + bg:"#fff8e7", 537 + text:"#785b17", 538 + labels:[ 539 + "SCHÜTZEN & KLÄREN", 540 + "STANDARDISIEREN & IDENTIFIZIEREN", 541 + "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN", 542 + "PROTECT & CLARIFY", 543 + "STANDARDISE & IDENTIFY", 544 + "STANDARDIZE & IDENTIFY", 545 + "OPEN, REUSE & MAKE FINDABLE" 546 + ] 547 + }, 548 + { 549 + name:"GREEN", 550 + accent:"#38b76a", 551 + bg:"#edf9f1", 552 + text:"#3f7451", 553 + labels:[ 554 + "INFRASTRUKTUR EINRICHTEN", 555 + "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN", 556 + "SPEICHERN & ZUGRIFF STEUERN", 557 + "REPOSITORIUM, ERHALTEN & ÜBERGEBEN", 558 + "SET UP INFRASTRUCTURE", 559 + "SET UP INFRASTRUCTURE & COLLABORATION", 560 + "STORE & CONTROL ACCESS", 561 + "REPOSITORY, PRESERVE & HAND OVER" 562 + ] 536 536 } 564 + ]; 537 537 538 - var r=el.getBoundingClientRect(); 539 - 540 - return ( 541 - r.width>=(minW||1)&& 542 - r.height>=(minH||1) 543 - ); 566 + function num(value){ 567 + var n=parseFloat(value); 568 + return Number.isFinite(n)?n:0; 544 544 } 545 545 546 - function normal izeText(text){547 - return String( text||"")571 + function norm(value){ 572 + return String(value||"") 548 548 .replace(/\s+/g," ") 549 549 .trim() 550 550 .toUpperCase(); 551 551 } 552 552 553 - function excluded(el){ 554 - return ( 555 - !el.matches|| 556 - el.matches( 557 - "button,input,select,textarea,option,label,img,svg,canvas,table,thead,tbody,tfoot,tr,td,th,summary,script,style,noscript,template,.btn,.chip,[role=button]" 558 - ) 559 - ); 560 - } 578 + function visible(el){ 579 + if(!el||el.nodeType!==1)return false; 561 561 562 - /* ---------- Custom coloured callouts ---------- */ 581 + var style=getComputedStyle(el); 582 + var rect=el.getBoundingClientRect(); 563 563 564 - function nativeCallout(el){ 565 - var c= 566 - typeof el.className==="string" 567 - ? el.className.toLowerCase() 568 - : ""; 569 - 570 570 return ( 571 - /(^|\s)(infomessage|warningmessage|successmessage|errormessage)(\s|$)/.test(c) 585 + style.display!=="none"&& 586 + style.visibility!=="hidden"&& 587 + rect.width>20&& 588 + rect.height>4 572 572 ); 573 573 } 574 574 575 - function customCallout(el){ 576 - if(!visible(el,220,42)||excluded(el))return false; 577 - 578 - var r=el.getBoundingClientRect(); 579 - 580 - if(r.height>520)return false; 581 - 582 - var s=getComputedStyle(el); 583 - 584 - var bg= 585 - s.backgroundColor&& 586 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&& 587 - s.backgroundColor!=="transparent"&& 588 - s.backgroundColor!=="rgb(255, 255, 255)"; 589 - 590 - var left= 591 - num(s.borderLeftWidth); 592 - 593 - return ( 594 - bg&& 595 - left>=2 596 - ); 597 - } 598 - 599 - function harmoniseCustomCallouts(){ 600 - Array.from( 601 - root.querySelectorAll( 602 - "div,aside,section" 603 - ) 604 - ).forEach(function(el){ 605 - if(nativeCallout(el))return; 606 - if(!customCallout(el))return; 607 - 608 - var s=getComputedStyle(el); 609 - 610 - el.setAttribute( 611 - "data-sn-callout-harmonized", 612 - "1" 613 - ); 614 - 615 - if( 616 - s.borderLeftColor 617 - ){ 618 - el.style.setProperty( 619 - "--sn-callout-accent", 620 - s.borderLeftColor 621 - ); 622 - } 623 - }); 624 - } 625 - 626 - /* ---------- Restore only values V7 itself changed ---------- */ 627 - 628 - function saveOriginal(el,map,property){ 592 + function saveStyle(el,map,property){ 629 629 if(map.has(el))return; 630 630 631 631 map.set(el,{ 632 - value: 633 - el.style.getPropertyValue( 634 - property 635 - ), 636 - priority: 637 - el.style.getPropertyPriority( 638 - property 639 - ) 596 + value:el.style.getPropertyValue(property), 597 + priority:el.style.getPropertyPriority(property) 640 640 }); 641 641 } 642 642 643 - function restore Original(el,map,property){601 + function restoreStyle(el,map,property){ 644 644 var original=map.get(el); 645 645 646 646 if(original&&original.value){ ... ... @@ -650,770 +650,845 @@ 650 650 original.priority||"" 651 651 ); 652 652 }else{ 653 - el.style.removeProperty( 654 - property 655 - ); 611 + el.style.removeProperty(property); 656 656 } 657 657 } 658 658 659 659 function resetRuntime(){ 660 - heightManaged.forEach(function(el){661 - restore Original(616 + managedHeight.forEach(function(el){ 617 + restoreStyle( 662 662 el, 663 - original MinHeight,619 + originalHeight, 664 664 "min-height" 665 665 ); 666 - 667 667 el.removeAttribute( 668 - "data-sn-equal-height -managed"623 + "data-sn-master-equal-height" 669 669 ); 670 670 }); 671 671 672 - sectionManaged.forEach(function(el){673 - restore Original(627 + managedMargin.forEach(function(el){ 628 + restoreStyle( 674 674 el, 675 - originalMargin Top,630 + originalMargin, 676 676 "margin-top" 677 677 ); 678 - 679 679 el.removeAttribute( 680 - "data-sn-first- section-aligned"634 + "data-sn-master-first-row" 681 681 ); 682 682 }); 683 683 684 - contentManaged.forEach(function(el){ 685 - restoreOriginal( 686 - el, 687 - originalMarginTop, 688 - "margin-top" 689 - ); 690 - 691 - el.removeAttribute( 692 - "data-sn-first-content-aligned" 693 - ); 694 - }); 695 - 696 - heightManaged.clear(); 697 - sectionManaged.clear(); 698 - contentManaged.clear(); 638 + managedHeight.clear(); 639 + managedMargin.clear(); 699 699 } 700 700 701 - /* ---------- Card detection ---------- */ 642 + function themeFor(text){ 643 + var value=norm(text); 702 702 703 - function namedLikeBox(el){ 704 - var c= 705 - typeof el.className==="string" 706 - ? el.className 707 - : ""; 645 + for(var i=0;i<THEMES.length;i++){ 646 + for(var j=0;j<THEMES[i].labels.length;j++){ 647 + var label=THEMES[i].labels[j]; 708 708 709 - return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c); 649 + if( 650 + value===label|| 651 + value.indexOf(label+" ")===0|| 652 + value.indexOf(label+" -")===0|| 653 + value.indexOf(label+" ·")===0 654 + ){ 655 + return THEMES[i]; 656 + } 657 + } 658 + } 659 + 660 + return null; 710 710 } 711 711 712 - function boxLike(el){ 663 + /* ======================================================= 664 + PLACEHOLDER BADGE 665 + ======================================================= */ 666 + 667 + function applyPlaceholderBadge(){ 668 + if(!PLACEHOLDER)return; 669 + 713 713 if( 714 - !visible(el,MIN_W,MIN_H)|| 715 - excluded(el) 671 + document.querySelector( 672 + ".sn-coming-soon-badge" 673 + ) 716 716 ){ 717 - return false;675 + return; 718 718 } 719 719 720 - var s=getComputedStyle(el); 721 - var r=el.getBoundingClientRect(); 678 + var title= 679 + document.querySelector( 680 + "#document-title" 681 + )|| 682 + document.querySelector( 683 + "h1" 684 + ); 722 722 723 - var border= 724 - num(s.borderTopWidth)+ 725 - num(s.borderRightWidth)+ 726 - num(s.borderBottomWidth)+ 727 - num(s.borderLeftWidth); 686 + if(!title)return; 728 728 729 - var radius=Math.max( 730 - num(s.borderTopLeftRadius), 731 - num(s.borderTopRightRadius), 732 - num(s.borderBottomLeftRadius), 733 - num(s.borderBottomRightRadius) 688 + var badge= 689 + document.createElement( 690 + "span" 691 + ); 692 + 693 + badge.className= 694 + "sn-coming-soon-badge"; 695 + 696 + badge.textContent= 697 + PLACEHOLDER_LABEL; 698 + 699 + badge.setAttribute( 700 + "aria-label", 701 + PLACEHOLDER_LABEL 734 734 ); 735 735 736 - var bg=737 - s.backgroundColor&&738 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&&739 - s.backgroundColor!=="transparent";704 + title.appendChild( 705 + badge 706 + ); 707 + } 740 740 741 - var shadow=742 - s.boxShadow&&743 - s.boxShadow!=="none";709 + /* ======================================================= 710 + DETAIL PAGE OWN-ACCENT PROPAGATION 711 + ======================================================= */ 744 744 745 - return ( 746 - namedLikeBox(el)|| 747 - border>=1|| 748 - (bg&&radius>=3)|| 749 - (shadow&&r.width>=180) 713 + function parseRGB(value){ 714 + var match=String(value||"").match( 715 + /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i 750 750 ); 717 + 718 + if(!match)return null; 719 + 720 + return [ 721 + Number(match[1]), 722 + Number(match[2]), 723 + Number(match[3]) 724 + ]; 751 751 } 752 752 753 - function pickTarget(child){ 754 - if(!visible(child,MIN_W,MIN_H))return null; 727 + function distance(a,b){ 728 + return Math.sqrt( 729 + Math.pow(a[0]-b[0],2)+ 730 + Math.pow(a[1]-b[1],2)+ 731 + Math.pow(a[2]-b[2],2) 732 + ); 733 + } 755 755 756 - if(boxLike(child))return child; 735 + function paletteMatch(cssColor){ 736 + var rgb=parseRGB(cssColor); 757 757 758 - var cr=child.getBoundingClientRect(); 759 - var q=[]; 738 + if(!rgb)return null; 760 760 761 - Array.from(child.children||[]).forEach(function(el){ 762 - q.push({el:el,depth:1}); 763 - }); 740 + var palette=[ 741 + {hex:"#21b6d7",rgb:[33,182,215]}, 742 + {hex:"#e94b13",rgb:[233,75,19]}, 743 + {hex:"#f0aa00",rgb:[240,170,0]}, 744 + {hex:"#38b76a",rgb:[56,183,106]} 745 + ]; 764 764 765 765 var best=null; 766 - var best Score=-Infinity;748 + var bestDistance=Infinity; 767 767 768 - while(q.length){ 769 - var item=q.shift(); 770 - var el=item.el; 750 + palette.forEach(function(item){ 751 + var d=distance(rgb,item.rgb); 771 771 772 - if(!visible(el,MIN_W,MIN_H))continue; 753 + if(d<bestDistance){ 754 + best=item; 755 + bestDistance=d; 756 + } 757 + }); 773 773 774 - var r=el.getBoundingClientRect(); 759 + return bestDistance<=30 760 + ?best 761 + :null; 762 + } 775 775 764 + function propagateDetailAccents(){ 765 + if(PAGE_KIND!=="detail")return; 766 + 767 + Array.from( 768 + root.querySelectorAll( 769 + ".arsn-call,.dmp-call,.ido-call,.pp-call,"+ 770 + ".arsn-source,.dmp-source,.ido-source,.pp-source" 771 + ) 772 + ).forEach(function(el){ 773 + if(!visible(el))return; 774 + 775 + var style=getComputedStyle(el); 776 + 776 776 if( 777 - r.width>=cr.width*.68&& 778 - boxLike(el) 778 + num(style.borderTopWidth)>=2 779 779 ){ 780 - var widthFit= 781 - 1-Math.min( 782 - 1, 783 - Math.abs(cr.width-r.width)/ 784 - Math.max(1,cr.width) 780 + var match= 781 + paletteMatch( 782 + style.borderTopColor 785 785 ); 786 786 787 - var topFit= 788 - 1-Math.min( 789 - 1, 790 - Math.abs(cr.top-r.top)/100 785 + if(match){ 786 + el.style.setProperty( 787 + "border-left", 788 + "4px solid "+match.hex, 789 + "important" 791 791 ); 792 - 793 - var score= 794 - widthFit*6+ 795 - topFit*3+ 796 - Math.min(r.height,900)/450+ 797 - Math.min(r.width*r.height,900000)/900000; 798 - 799 - if(score>bestScore){ 800 - best=el; 801 - bestScore=score; 802 802 } 803 803 } 793 + }); 804 804 805 - if(item.depth<SEARCH_DEPTH){ 806 - Array.from(el.children||[]).forEach(function(next){ 807 - q.push({ 808 - el:next, 809 - depth:item.depth+1 810 - }); 811 - }); 812 - } 813 - } 795 + // Warning families: explicit safety override. 796 + Array.from( 797 + root.querySelectorAll( 798 + ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+ 799 + ".warn,.warning,.warningmessage,.errormessage" 800 + ) 801 + ).forEach(function(el){ 802 + if(!visible(el))return; 814 814 815 - return best; 816 - } 804 + el.style.setProperty( 805 + "border-left", 806 + "4px solid #e94b13", 807 + "important" 808 + ); 809 + }); 817 817 818 - function groupRows(entries){ 819 - var groups=[]; 811 + // Info families: explicit orientation override. 812 + Array.from( 813 + root.querySelectorAll( 814 + ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage" 815 + ) 816 + ).forEach(function(el){ 817 + if(!visible(el))return; 820 820 821 - entries 822 - .slice() 823 - .sort(function(a,b){ 824 - return ( 825 - a.rect.top-b.rect.top|| 826 - a.rect.left-b.rect.left 827 - ); 828 - }) 829 - .forEach(function(entry){ 830 - var group=null; 819 + el.style.setProperty( 820 + "border-left", 821 + "4px solid #21b6d7", 822 + "important" 823 + ); 824 + }); 825 + } 831 831 832 - for(var i=0;i<groups.length;i++){ 833 - if( 834 - Math.abs( 835 - groups[i].top- 836 - entry.rect.top 837 - )<=ROW_TOLERANCE 838 - ){ 839 - group=groups[i]; 840 - break; 841 - } 842 - } 827 + /* ======================================================= 828 + OVERVIEW SEMANTIC THEME PALETTE 829 + ======================================================= */ 843 843 844 - if(!group){ 845 - group={ 846 - top:entry.rect.top, 847 - entries:[] 848 - }; 849 - groups.push(group); 850 - } 831 + function smallestThemeHeaders(){ 832 + return Array.from( 833 + root.querySelectorAll( 834 + "div,span,p,strong,h3,h4,h5,h6" 835 + ) 836 + ).filter(function(el){ 837 + if(!visible(el))return false; 838 + if(!themeFor(el.textContent))return false; 851 851 852 - group.entries.push(entry); 840 + return !Array.from( 841 + el.children||[] 842 + ).some(function(child){ 843 + return !!themeFor( 844 + child.textContent 845 + ); 853 853 }); 854 - 855 - return groups; 847 + }); 856 856 } 857 857 858 - function validRow(group){ 859 - if(group.entries.length<2)return false; 850 + function findOverviewCard(header){ 851 + var node=header.parentElement; 852 + var candidates=[]; 860 860 861 - var lefts= 862 - group.entries 863 - .map(function(e){return e.rect.left;}) 864 - .sort(function(a,b){return a-b;}); 854 + while(node&&node!==root){ 855 + var rect=node.getBoundingClientRect(); 856 + var style=getComputedStyle(node); 865 865 866 - if( 867 - lefts[lefts.length-1]- 868 - lefts[0]< 869 - 80 870 - ){ 871 - return false; 872 - } 858 + var border= 859 + num(style.borderTopWidth)+ 860 + num(style.borderRightWidth)+ 861 + num(style.borderBottomWidth)+ 862 + num(style.borderLeftWidth); 873 873 874 - var widths= 875 - group.entries 876 - .map(function(e){return e.rect.width;}) 877 - .filter(function(w){return w>0;}); 864 + if( 865 + rect.width>=220&& 866 + rect.width<=800&& 867 + rect.height>=120&& 868 + border>=1 869 + ){ 870 + candidates.push(node); 871 + } 878 878 879 - if(widths.length<2)return false; 873 + node=node.parentElement; 874 + } 880 880 881 - var minW= 882 - Math.min.apply(Math,widths); 876 + if(!candidates.length)return null; 883 883 884 - var maxW= 885 - Math.max.apply(Math,widths); 886 - 887 - return ( 888 - maxW/ 889 - Math.max(1,minW)<= 890 - 1.9 891 - ); 892 - } 893 - 894 - /* ---------- Known ARSN first section bars ---------- */ 895 - 896 - function knownBar(el){ 897 - var text= 898 - normalizeText( 899 - el.textContent 878 + candidates.sort(function(a,b){ 879 + return ( 880 + b.getBoundingClientRect().height- 881 + a.getBoundingClientRect().height 900 900 ); 883 + }); 901 901 902 - return ( 903 - text==="HIER STARTEN"|| 904 - text==="ORGANISIEREN & DOKUMENTIEREN"|| 905 - text==="ENTSCHEIDEN"|| 906 - text==="START HERE"|| 907 - text==="GET STARTED"|| 908 - text==="ORGANISE & DOCUMENT"|| 909 - text==="ORGANIZE & DOCUMENT"|| 910 - text==="DECIDE" 911 - ); 885 + return candidates[0]; 912 912 } 913 913 914 - function findKnownBar(card){ 888 + function rowCandidates(link,card){ 889 + var result=[]; 915 915 var cardRect= 916 916 card.getBoundingClientRect(); 917 917 918 - var rows= 919 - Array.from( 920 - card.querySelectorAll( 921 - "div,p,span,strong,h3,h4,h5,h6" 922 - ) 923 - ) 924 - .filter(function(el){ 925 - if(!visible(el,20,6))return false; 926 - if(!knownBar(el))return false; 893 + var node=link; 927 927 928 - var r=el.getBoundingClientRect(); 895 + while(node&&node!==card){ 896 + if(visible(node)){ 897 + var rect= 898 + node.getBoundingClientRect(); 929 929 930 - var rel= 931 - r.top- 932 - cardRect.top; 900 + if( 901 + rect.height<=105&& 902 + rect.width>= 903 + cardRect.width*.50&& 904 + rect.width<= 905 + cardRect.width*1.03 906 + ){ 907 + result.push(node); 908 + } 909 + } 933 933 911 + node=node.parentElement; 912 + } 913 + 914 + return result; 915 + } 916 + 917 + function chooseOuterRow( 918 + candidates, 919 + link 920 + ){ 921 + if(!candidates.length){ 922 + return link; 923 + } 924 + 925 + var bordered= 926 + candidates.filter(function(el){ 934 934 return ( 935 - rel>=35&& 936 - rel<= 937 - cardRect.height*.75 928 + num( 929 + getComputedStyle(el) 930 + .borderLeftWidth 931 + )>=1 938 938 ); 939 - }) 940 - .sort(function(a,b){ 941 - return ( 942 - a.getBoundingClientRect().top- 943 - b.getBoundingClientRect().top 944 - ); 945 945 }); 946 946 947 - return rows[0]||null; 948 - } 935 + var pool= 936 + bordered.length 937 + ?bordered 938 + :candidates; 949 949 950 - function alignKnownBars(cards){ 951 - var rows= 952 - cards.map(function(card){ 953 - var bar= 954 - findKnownBar(card); 940 + pool.sort(function(a,b){ 941 + var ar= 942 + a.getBoundingClientRect(); 955 955 956 - if(!bar)return null; 944 + var br= 945 + b.getBoundingClientRect(); 957 957 958 - var cr= 959 - card.getBoundingClientRect(); 947 + return ( 948 + ar.left-br.left|| 949 + br.width-ar.width 950 + ); 951 + }); 960 960 961 - varbr=962 - bar.getBoundingClientRect();953 + return pool[0]||link; 954 + } 963 963 964 - return { 965 - bar:bar, 966 - relativeTop: 967 - br.top- 968 - cr.top 969 - }; 970 - }); 971 - 972 - if( 973 - rows.some(function(row){ 974 - return !row; 975 - }) 976 - ){ 977 - return false; 956 + function applyOverviewPalette(){ 957 + if(PAGE_KIND!=="overview"){ 958 + return []; 978 978 } 979 979 980 - var target= 981 - Math.max.apply( 982 - Math, 983 - rows.map(function(row){ 984 - return row.relativeTop; 961 + var headers= 962 + smallestThemeHeaders() 963 + .map(function(el){ 964 + return { 965 + el:el, 966 + theme: 967 + themeFor( 968 + el.textContent 969 + ), 970 + card: 971 + findOverviewCard( 972 + el 973 + ) 974 + }; 985 985 }) 986 - ); 976 + .filter(function(row){ 977 + return !!row.card; 978 + }); 987 987 988 - rows.forEach(function(row){ 989 - var delta= 990 - target- 991 - row.relativeTop; 980 + var unique=[]; 981 + var seenHeaders=new Set(); 992 992 993 - if(delta<=1)return; 983 + headers.forEach(function(row){ 984 + var key= 985 + row.theme.name+ 986 + "|"+ 987 + Math.round( 988 + row.card 989 + .getBoundingClientRect() 990 + .left 991 + )+ 992 + "|"+ 993 + Math.round( 994 + row.el 995 + .getBoundingClientRect() 996 + .top 997 + ); 994 994 995 - sa veOriginal(996 - r ow.bar,997 - originalMarginTop,998 - "margin-top"999 - );999 + if(!seenHeaders.has(key)){ 1000 + seenHeaders.add(key); 1001 + unique.push(row); 1002 + } 1003 + }); 1000 1000 1001 - var current= 1002 - num( 1003 - getComputedStyle( 1004 - row.bar 1005 - ).marginTop 1006 - ); 1005 + unique.forEach(function(row){ 1006 + var headerRect= 1007 + row.el 1008 + .getBoundingClientRect(); 1007 1007 1008 - row.bar.style.setProperty( 1009 - "margin-top", 1010 - ( 1011 - current+ 1012 - delta 1013 - )+"px" 1010 + row.el.style.setProperty( 1011 + "background", 1012 + row.theme.bg, 1013 + "important" 1014 1014 ); 1015 1015 1016 - row.bar.setAttribute( 1017 - "data-sn-first-section-aligned", 1018 - "7" 1016 + row.el.style.setProperty( 1017 + "color", 1018 + row.theme.text, 1019 + "important" 1019 1019 ); 1020 1020 1021 - sectionManaged.add( 1022 - row.bar 1022 + row.el.style.setProperty( 1023 + "text-align", 1024 + "left", 1025 + "important" 1023 1023 ); 1024 - }); 1025 1025 1026 - return true; 1027 - } 1028 + row.el.style.setProperty( 1029 + "word-spacing", 1030 + "normal", 1031 + "important" 1032 + ); 1028 1028 1029 - /* ---------- Generic first content after heading ---------- */ 1034 + var later= 1035 + unique 1036 + .filter(function(other){ 1037 + return ( 1038 + other.card===row.card&& 1039 + other.el 1040 + .getBoundingClientRect() 1041 + .top> 1042 + headerRect.top+2 1043 + ); 1044 + }) 1045 + .sort(function(a,b){ 1046 + return ( 1047 + a.el 1048 + .getBoundingClientRect() 1049 + .top- 1050 + b.el 1051 + .getBoundingClientRect() 1052 + .top 1053 + ); 1054 + }); 1030 1030 1031 - function heading(card){ 1032 - var cr= 1033 - card.getBoundingClientRect(); 1056 + var stopTop= 1057 + later.length 1058 + ?later[0].el 1059 + .getBoundingClientRect() 1060 + .top 1061 + :Infinity; 1034 1034 1035 - var rows= 1036 1036 Array.from( 1037 - card.querySelectorAll( 1038 - "h1,h2,h3,h4,h5,h6,.box-title,[role=heading]" 1039 - ) 1040 - ) 1041 - .filter(function(el){ 1042 - if(!visible(el,20,8))return false; 1064 + row.card.querySelectorAll("a") 1065 + ).forEach(function(link){ 1066 + if(!visible(link))return; 1043 1043 1044 - var r=el.getBoundingClientRect(); 1068 + var rect= 1069 + link.getBoundingClientRect(); 1045 1045 1046 - var rel= 1047 - r.top- 1048 - cr.top; 1049 - 1050 - return ( 1051 - rel>=0&& 1052 - rel<= 1053 - Math.min( 1054 - 160, 1055 - cr.height*.45 1056 - ) 1057 - ); 1058 - }) 1059 - .sort(function(a,b){ 1060 - return ( 1061 - a.getBoundingClientRect().top- 1062 - b.getBoundingClientRect().top 1063 - ); 1064 - }); 1065 - 1066 - return rows[0]||null; 1067 - } 1068 - 1069 - function firstContent(card,h){ 1070 - if(!h)return null; 1071 - 1072 - var cr= 1073 - card.getBoundingClientRect(); 1074 - 1075 - var hr= 1076 - h.getBoundingClientRect(); 1077 - 1078 - var rows= 1079 - Array.from( 1080 - card.querySelectorAll( 1081 - "p,div,ul,ol,dl,blockquote" 1082 - ) 1083 - ) 1084 - .filter(function(el){ 1085 1085 if( 1086 - el===h|| 1087 - h.contains(el)|| 1088 - el.contains(h) 1072 + rect.top<= 1073 + headerRect.bottom-2|| 1074 + rect.top>= 1075 + stopTop-2 1089 1089 ){ 1090 - return false;1077 + return; 1091 1091 } 1092 1092 1093 - if(!visible(el,30,8))return false; 1080 + var candidates= 1081 + rowCandidates( 1082 + link, 1083 + row.card 1084 + ); 1094 1094 1095 - var text= 1096 - String(el.textContent||"") 1097 - .replace(/\s+/g," ") 1098 - .trim(); 1086 + var target= 1087 + chooseOuterRow( 1088 + candidates, 1089 + link 1090 + ); 1099 1099 1100 - if(text.length<3)return false; 1092 + candidates.forEach(function(el){ 1093 + el.style.setProperty( 1094 + "border-left", 1095 + "0 solid transparent", 1096 + "important" 1097 + ); 1098 + }); 1101 1101 1102 - var r=el.getBoundingClientRect(); 1100 + target.style.setProperty( 1101 + "border-left", 1102 + "3px solid "+ 1103 + row.theme.accent, 1104 + "important" 1105 + ); 1103 1103 1104 - if( 1105 - r.top< 1106 - hr.bottom-1 1107 - ){ 1108 - return false; 1109 - } 1110 - 1111 - if( 1112 - r.top-cr.top> 1113 - Math.min( 1114 - 280, 1115 - cr.height*.65 1116 - ) 1117 - ){ 1118 - return false; 1119 - } 1120 - 1121 - if( 1122 - r.height> 1123 - cr.height*.58 1124 - ){ 1125 - return false; 1126 - } 1127 - 1128 - return true; 1129 - }) 1130 - .sort(function(a,b){ 1131 - var ar= 1132 - a.getBoundingClientRect(); 1133 - 1134 - var br= 1135 - b.getBoundingClientRect(); 1136 - 1137 - return ( 1138 - ar.top-br.top|| 1139 - ar.height-br.height 1107 + target.style.setProperty( 1108 + "box-sizing", 1109 + "border-box", 1110 + "important" 1140 1140 ); 1141 1141 }); 1113 + }); 1142 1142 1143 - return rows[0]||null;1115 + return unique; 1144 1144 } 1145 1145 1146 - function alignGeneric(cards){ 1147 - var rows= 1148 - cards.map(function(card){ 1149 - var h= 1150 - heading(card); 1118 + /* ======================================================= 1119 + OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW 1120 + ======================================================= */ 1151 1151 1152 - var c= 1153 - firstContent( 1154 - card, 1155 - h 1156 - ); 1157 - 1158 - if(!h||!c)return null; 1159 - 1160 - var cr= 1161 - card.getBoundingClientRect(); 1162 - 1163 - var rr= 1164 - c.getBoundingClientRect(); 1165 - 1166 - return { 1167 - content:c, 1168 - relativeTop: 1169 - rr.top-cr.top 1170 - }; 1171 - }); 1172 - 1122 + function alignOverviewCards(headers){ 1173 1173 if( 1174 - rows.some(function(row){ 1175 - return !row; 1176 - }) 1124 + PAGE_KIND!=="overview"|| 1125 + window.innerWidth<=MOBILE_MAX 1177 1177 ){ 1178 - return false;1127 + return; 1179 1179 } 1180 1180 1181 - var target= 1182 - Math.max.apply( 1183 - Math, 1184 - rows.map(function(row){ 1185 - return row.relativeTop; 1186 - }) 1187 - ); 1130 + var cards=[]; 1131 + var seen=new Set(); 1188 1188 1189 - rows.forEach(function(row){ 1190 - var delta= 1191 - target- 1192 - row.relativeTop; 1133 + headers.forEach(function(row){ 1134 + if(!seen.has(row.card)){ 1135 + seen.add(row.card); 1136 + cards.push(row.card); 1137 + } 1138 + }); 1193 1193 1194 - if(delta<=1)return; 1140 + if(cards.length<2){ 1141 + return; 1142 + } 1195 1195 1196 - saveOriginal( 1197 - row.content, 1198 - originalMarginTop, 1199 - "margin-top" 1200 - ); 1144 + // Group cards by actual top position. 1145 + var groups=[]; 1201 1201 1202 - var current= 1203 - num( 1204 - getComputedStyle( 1205 - row.content 1206 - ).marginTop 1207 - ); 1147 + cards.forEach(function(card){ 1148 + var top= 1149 + card.getBoundingClientRect().top; 1208 1208 1209 - row.content.style.setProperty( 1210 - "margin-top", 1211 - ( 1212 - current+ 1213 - delta 1214 - )+"px" 1215 - ); 1151 + var group=null; 1216 1216 1217 - row.content.setAttribute( 1218 - "data-sn-first-content-aligned", 1219 - "7" 1220 - ); 1153 + for(var i=0;i<groups.length;i++){ 1154 + if( 1155 + Math.abs( 1156 + groups[i].top-top 1157 + )<=ROW_TOLERANCE 1158 + ){ 1159 + group=groups[i]; 1160 + break; 1161 + } 1162 + } 1221 1221 1222 - contentManaged.add( 1223 - row.content 1224 - ); 1164 + if(!group){ 1165 + group={ 1166 + top:top, 1167 + cards:[] 1168 + }; 1169 + groups.push(group); 1170 + } 1171 + 1172 + group.cards.push(card); 1225 1225 }); 1226 1226 1227 - return true; 1228 - } 1175 + groups.forEach(function(group){ 1176 + if(group.cards.length<2){ 1177 + return; 1178 + } 1229 1229 1230 - function applyRow(group){ 1231 - if(!validRow(group))return false; 1180 + var firstHeaders= 1181 + group.cards.map(function(card){ 1182 + var candidates= 1183 + headers 1184 + .filter(function(row){ 1185 + return row.card===card; 1186 + }) 1187 + .sort(function(a,b){ 1188 + return ( 1189 + a.el 1190 + .getBoundingClientRect() 1191 + .top- 1192 + b.el 1193 + .getBoundingClientRect() 1194 + .top 1195 + ); 1196 + }); 1232 1232 1233 - var cards=[]; 1234 - var seen=new Set(); 1198 + return candidates.length 1199 + ?candidates[0] 1200 + :null; 1201 + }); 1235 1235 1236 - group.entries.forEach(function(entry){ 1237 - if(!seen.has(entry.target)){ 1238 - seen.add(entry.target); 1239 - cards.push(entry.target); 1240 - } 1241 - }); 1203 + if( 1204 + !firstHeaders.some(function(row){ 1205 + return !row; 1206 + }) 1207 + ){ 1208 + var targetTop= 1209 + Math.max.apply( 1210 + Math, 1211 + firstHeaders.map(function(row){ 1212 + return ( 1213 + row.el 1214 + .getBoundingClientRect() 1215 + .top- 1216 + row.card 1217 + .getBoundingClientRect() 1218 + .top 1219 + ); 1220 + }) 1221 + ); 1242 1242 1243 - if(cards.length<2)return false; 1223 + firstHeaders.forEach(function(row){ 1224 + var relativeTop= 1225 + row.el 1226 + .getBoundingClientRect() 1227 + .top- 1228 + row.card 1229 + .getBoundingClientRect() 1230 + .top; 1244 1244 1245 - if( 1246 - !alignKnownBars(cards) 1247 - ){ 1248 - alignGeneric(cards); 1249 - } 1232 + var delta= 1233 + targetTop-relativeTop; 1250 1250 1251 - var maxHeight=0; 1235 + if(delta>1){ 1236 + saveStyle( 1237 + row.el, 1238 + originalMargin, 1239 + "margin-top" 1240 + ); 1252 1252 1253 - cards.forEach(function(card){ 1254 - maxHeight= 1255 - Math.max( 1256 - maxHeight, 1257 - card.getBoundingClientRect().height 1258 - ); 1259 - }); 1242 + var current= 1243 + num( 1244 + getComputedStyle( 1245 + row.el 1246 + ).marginTop 1247 + ); 1260 1260 1261 - maxHeight= 1262 - Math.ceil( 1263 - maxHeight 1264 - ); 1249 + row.el.style.setProperty( 1250 + "margin-top", 1251 + ( 1252 + current+delta 1253 + )+"px" 1254 + ); 1265 1265 1266 - if(maxHeight<MIN_H)return false; 1256 + row.el.setAttribute( 1257 + "data-sn-master-first-row", 1258 + "1" 1259 + ); 1267 1267 1268 - cards.forEach(function(card){1269 - saveOriginal(1270 - card,1271 - originalMinHeight,1272 - "min-height"1273 - );1261 + managedMargin.add( 1262 + row.el 1263 + ); 1264 + } 1265 + }); 1266 + } 1274 1274 1275 - card.style.setProperty( 1276 - "min-height", 1277 - maxHeight+"px" 1278 - ); 1268 + var maxHeight=0; 1279 1279 1280 - card.setAttribute( 1281 - "data-sn-equal-height-managed", 1282 - "7" 1283 - ); 1270 + group.cards.forEach(function(card){ 1271 + maxHeight= 1272 + Math.max( 1273 + maxHeight, 1274 + card 1275 + .getBoundingClientRect() 1276 + .height 1277 + ); 1278 + }); 1284 1284 1285 - heightManaged.add(card);1286 - });1280 + maxHeight= 1281 + Math.ceil(maxHeight); 1287 1287 1288 - return true; 1289 - } 1283 + group.cards.forEach(function(card){ 1284 + saveStyle( 1285 + card, 1286 + originalHeight, 1287 + "min-height" 1288 + ); 1290 1290 1291 - function calculate(force){ 1292 - if(applying)return; 1290 + card.style.setProperty( 1291 + "min-height", 1292 + maxHeight+"px" 1293 + ); 1293 1293 1294 - varwidth=1295 - Math.round(1296 - window.innerWidth1297 - ); 1295 + card.setAttribute( 1296 + "data-sn-master-equal-height", 1297 + "1" 1298 + ); 1298 1298 1299 - var meaningful= 1300 - lastWidth<0|| 1301 - Math.abs( 1302 - width- 1303 - lastWidth 1304 - )>= 1305 - MIN_WIDTH_CHANGE; 1300 + managedHeight.add( 1301 + card 1302 + ); 1303 + }); 1304 + }); 1305 + } 1306 1306 1307 + /* ======================================================= 1308 + DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY 1309 + ======================================================= */ 1310 + 1311 + function equaliseDetailGrids(){ 1307 1307 if( 1308 - hasApplied&& 1309 - !force&& 1310 - !meaningful 1313 + PAGE_KIND!=="detail"|| 1314 + window.innerWidth<=MOBILE_MAX 1311 1311 ){ 1312 1312 return; 1313 1313 } 1314 1314 1315 - applying=true; 1319 + var selectors=[ 1320 + ".arsn-grid", 1321 + ".arsn-grid-2", 1322 + ".arsn-grid-3", 1323 + ".dmp-grid", 1324 + ".ido-grid", 1325 + ".pp-grid" 1326 + ]; 1316 1316 1317 - try{ 1318 - harmoniseCustomCallouts(); 1328 + selectors.forEach(function(selector){ 1329 + Array.from( 1330 + root.querySelectorAll(selector) 1331 + ).forEach(function(grid){ 1332 + var children= 1333 + Array.from( 1334 + grid.children||[] 1335 + ).filter(visible); 1319 1319 1320 - if(width<=MOBILE_MAX){ 1321 - if(hasApplied){ 1322 - resetRuntime(); 1337 + if(children.length<2){ 1338 + return; 1323 1323 } 1324 1324 1325 - hasApplied=false; 1326 - lastWidth=width; 1327 - return; 1328 - } 1341 + var groups=[]; 1329 1329 1330 - if(hasApplied){ 1331 - resetRuntime(); 1332 - } 1343 + children.forEach(function(child){ 1344 + var top= 1345 + child 1346 + .getBoundingClientRect() 1347 + .top; 1333 1333 1334 - var parents= 1335 - Array.from( 1336 - root.querySelectorAll("*") 1337 - ) 1338 - .filter(function(parent){ 1339 - return ( 1340 - visible( 1341 - parent, 1342 - MIN_W, 1343 - MIN_H 1344 - )&& 1345 - parent.children&& 1346 - parent.children.length>=2&& 1347 - parent.children.length<= 1348 - MAX_PARENT_CHILDREN 1349 - ); 1350 - }); 1349 + var group=null; 1351 1351 1352 - var touched= 1353 - new Set(); 1351 + for(var i=0;i<groups.length;i++){ 1352 + if( 1353 + Math.abs( 1354 + groups[i].top-top 1355 + )<=ROW_TOLERANCE 1356 + ){ 1357 + group=groups[i]; 1358 + break; 1359 + } 1360 + } 1354 1354 1355 - parents.forEach(function(parent){ 1356 - var entries=[]; 1362 + if(!group){ 1363 + group={ 1364 + top:top, 1365 + items:[] 1366 + }; 1367 + groups.push(group); 1368 + } 1357 1357 1358 - Array.from( 1359 - parent.children 1360 - ).forEach(function(child){ 1361 - if( 1362 - !visible( 1363 - child, 1364 - MIN_W, 1365 - MIN_H 1366 - ) 1367 - ){ 1370 + group.items.push(child); 1371 + }); 1372 + 1373 + groups.forEach(function(group){ 1374 + if(group.items.length<2){ 1368 1368 return; 1369 1369 } 1370 1370 1371 - var target= 1372 - pickTarget(child); 1378 + var maxHeight=0; 1373 1373 1374 - if(!target)return; 1375 - 1376 - entries.push({ 1377 - target:target, 1378 - rect: 1379 - target.getBoundingClientRect() 1380 + group.items.forEach(function(item){ 1381 + maxHeight= 1382 + Math.max( 1383 + maxHeight, 1384 + item 1385 + .getBoundingClientRect() 1386 + .height 1387 + ); 1380 1380 }); 1381 - }); 1382 1382 1383 - groupRows( 1384 - entries 1385 - ).forEach(function(group){ 1386 - if(!validRow(group))return; 1390 + maxHeight= 1391 + Math.ceil(maxHeight); 1387 1387 1388 - var targets= 1389 - group.entries.map(function(entry){ 1390 - return entry.target; 1391 - }); 1393 + group.items.forEach(function(item){ 1394 + saveStyle( 1395 + item, 1396 + originalHeight, 1397 + "min-height" 1398 + ); 1392 1392 1393 - if( 1394 - !targets.some(function(el){ 1395 - return !touched.has(el); 1396 - }) 1397 - ){ 1398 - return; 1399 - } 1400 + item.style.setProperty( 1401 + "min-height", 1402 + maxHeight+"px" 1403 + ); 1400 1400 1401 - if(applyRow(group)){ 1402 - targets.forEach(function(el){ 1403 - touched.add(el); 1404 - }); 1405 - } 1405 + item.setAttribute( 1406 + "data-sn-master-equal-height", 1407 + "1" 1408 + ); 1409 + 1410 + managedHeight.add(item); 1411 + }); 1406 1406 }); 1407 1407 }); 1414 + }); 1415 + } 1408 1408 1409 - lastWidth=width; 1410 - hasApplied=true; 1417 + /* ======================================================= 1418 + RUN / RESPONSIVE SCHEDULING 1419 + ======================================================= */ 1420 + 1421 + function run(){ 1422 + if(running)return; 1423 + 1424 + running=true; 1425 + 1426 + try{ 1427 + resetRuntime(); 1428 + applyPlaceholderBadge(); 1429 + propagateDetailAccents(); 1430 + 1431 + var headers= 1432 + applyOverviewPalette(); 1433 + 1434 + if( 1435 + window.innerWidth> 1436 + MOBILE_MAX 1437 + ){ 1438 + alignOverviewCards( 1439 + headers 1440 + ); 1441 + 1442 + equaliseDetailGrids(); 1443 + } 1411 1411 }finally{ 1412 - applying=false;1445 + running=false; 1413 1413 } 1414 1414 } 1415 1415 1416 - function resize(){1449 + function onResize(){ 1417 1417 if(resizeTimer){ 1418 1418 clearTimeout( 1419 1419 resizeTimer ... ... @@ -1424,19 +1424,40 @@ 1424 1424 setTimeout( 1425 1425 function(){ 1426 1426 resizeTimer=0; 1427 - calculate(false);1460 + run(); 1428 1428 }, 1429 1429 RESIZE_DEBOUNCE 1430 1430 ); 1431 1431 } 1432 1432 1433 - function waitImages(){ 1466 + async function waitForReady(){ 1467 + if( 1468 + document.readyState!=="complete" 1469 + ){ 1470 + await new Promise(function(resolve){ 1471 + window.addEventListener( 1472 + "load", 1473 + resolve, 1474 + {once:true} 1475 + ); 1476 + }); 1477 + } 1478 + 1479 + if( 1480 + document.fonts&& 1481 + document.fonts.ready 1482 + ){ 1483 + try{ 1484 + await document.fonts.ready; 1485 + }catch(error){} 1486 + } 1487 + 1434 1434 var images= 1435 1435 Array.from( 1436 1436 root.querySelectorAll("img") 1437 1437 ); 1438 1438 1439 - returnPromise.all(1493 + await Promise.all( 1440 1440 images.map(function(img){ 1441 1441 if(img.complete){ 1442 1442 return Promise.resolve(); ... ... @@ -1461,46 +1461,20 @@ 1461 1461 }); 1462 1462 }) 1463 1463 ); 1464 - } 1465 1465 1466 - async function initial(){ 1467 - if( 1468 - document.readyState!== 1469 - "complete" 1470 - ){ 1471 - await new Promise(function(resolve){ 1472 - addEventListener( 1473 - "load", 1474 - resolve, 1475 - {once:true} 1476 - ); 1477 - }); 1478 - } 1479 - 1480 - if( 1481 - document.fonts&& 1482 - document.fonts.ready 1483 - ){ 1484 - try{ 1485 - await document.fonts.ready; 1486 - }catch(error){} 1487 - } 1488 - 1489 - await waitImages(); 1490 - 1491 - // Exactly one initial layout calculation. 1492 - calculate(true); 1519 + run(); 1493 1493 } 1494 1494 1495 - addEventListener( 1522 + window.addEventListener( 1496 1496 "resize", 1497 - resize,1524 + onResize, 1498 1498 {passive:true} 1499 1499 ); 1500 1500 1501 - i nitial();1528 + waitForReady(); 1502 1502 })(); 1503 1503 </script> 1504 1504 1505 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_END --> 1506 -{{/html}}\n 1532 +<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END --> 1533 +{{/html}} 1534 +