Änderungen von Dokument Get Started
Zuletzt geändert von Veronika Kocher am Freitag, 04 Sep. 2026 14:45
Von Version 2.10
bearbeitet von Veronika Kocher
am Freitag, 04 Sep. 2026 14:23
am Freitag, 04 Sep. 2026 14:23
Änderungskommentar:
Es gibt keinen Kommentar für diese Version
Auf 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
Zusammenfassung
-
Seiteneigenschaften (1 geändert, 0 hinzugefügt, 0 gelöscht)
Details
- Seiteneigenschaften
-
- Inhalt
-
... ... @@ -384,25 +384,15 @@ 384 384 <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Project%20Planning%20%26%20Organisation/">Projektplanung & Organisation</a>, 385 385 <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Funding%20%26%20Funder%20Requirements/">Förderung & Förderbedingungen</a> und <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Plan%20Your%20Data%20Management/">Datenmanagement planen</a>. 386 386 </div> 387 - 388 -<!-- ARSN_TRAINING_WORKSHOPS_INCLUDE_V1_START --> 389 -{{include reference="Service Navigator.Art & Research Services Navigator.Code.TrainingWorkshopsBlock" author="target" /}} 390 -<!-- ARSN_TRAINING_WORKSHOPS_INCLUDE_V1_END --> 391 - 392 -<!-- ARSN_PRACTICAL_RESOURCES_FALLBACK_V1_START --> 393 -{{include reference="Service Navigator.Art & Research Services Navigator.Code.PracticalResourcesFallbackBlock" author="target" /}} 394 -<!-- ARSN_PRACTICAL_RESOURCES_FALLBACK_V1_END --> 395 - 396 396 </div> 397 397 {{/html}} 398 398 399 -{{html clean="false"}} 400 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START --> 390 +\n\n 391 +\n\n{{html clean="false"}} 392 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_START --> 401 401 402 -<style data-sn-service-navigator-master="1"> 403 -/* ========================================================= 404 - MASTER TYPOGRAPHY 405 - ========================================================= */ 394 +<style data-sn-horizontal-box-harmonizer="7"> 395 +/* ---------- Typography: never justify headings ---------- */ 406 406 #xwikicontent h1, 407 407 #xwikicontent h2, 408 408 #xwikicontent h3, ... ... @@ -424,105 +424,88 @@ 424 424 word-spacing:normal!important; 425 425 } 426 426 427 -/* ========================================================= 428 - COMING SOON / IN VORBEREITUNG 429 - ========================================================= */ 430 -.sn-coming-soon-badge{ 431 - display:inline-block; 432 - vertical-align:middle; 433 - margin-left:10px; 434 - padding:4px 8px; 435 - border-radius:14px; 436 - border:1px solid #efd9cc; 437 - background:#fff4ee; 438 - color:#8a4d36; 439 - font-size:11px; 440 - font-weight:700; 441 - letter-spacing:.055em; 442 - line-height:1.2; 443 - white-space:nowrap; 444 -} 445 - 446 -/* ========================================================= 447 - NATIVE / DETAIL CALLOUT GEOMETRY 448 - Preserve existing backgrounds. 449 - ========================================================= */ 450 -#xwikicontent .arsn-info, 451 -#xwikicontent .dmp-info, 452 -#xwikicontent .ido-info, 453 -#xwikicontent .pp-info, 454 -#xwikicontent .infomessage{ 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"]{ 455 455 box-sizing:border-box!important; 456 - border-left:4px solid #21b6d7!important; 457 - border-radius:8px; 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; 458 458 text-align:left!important; 435 + text-justify:auto!important; 459 459 word-spacing:normal!important; 437 + box-shadow:none!important; 460 460 } 461 461 462 -#xwikicontent .arsn-warn, 463 -#xwikicontent .dmp-warn, 464 -#xwikicontent .ido-warn, 465 -#xwikicontent .pp-warn, 466 -#xwikicontent .warn, 467 -#xwikicontent .warning, 468 -#xwikicontent .warningmessage, 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, 469 469 #xwikicontent .errormessage{ 470 - box-sizing:border-box!important; 471 - border-left:4px solid #e94b13!important; 472 - border-radius:8px; 473 - text-align:left!important; 474 - word-spacing:normal!important; 460 + --sn-callout-accent:#e94b13; 461 + background:#fff1ec!important; 475 475 } 476 476 477 -[data-sn-master-equal-height], 478 -[data-sn-master-first-row]{ 479 - box-sizing:border-box; 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; 480 480 } 481 481 482 -/* ========================================================= 483 - FULL-WIDTH THREE-LINE NUMBER / TITLE / SUBTITLE BLOCKS 484 - ========================================================= */ 485 -#xwikicontent .arsn-area-label[data-sn-three-line="1"]{ 486 - display:grid!important; 487 - grid-template-columns:minmax(0,1fr)!important; 488 - grid-auto-rows:auto!important; 489 - width:100%!important; 490 - max-width:none!important; 491 - box-sizing:border-box!important; 492 - justify-items:start!important; 493 - align-items:start!important; 494 - gap:2px!important; 495 - text-align:left!important; 496 - text-align-last:left!important; 497 - text-justify:auto!important; 498 - word-spacing:normal!important; 499 - white-space:normal!important; 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; 500 500 } 501 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-number, 502 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .sn-area-label-title, 503 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-action{ 504 - display:block!important; 505 - width:100%!important; 506 - margin:0!important; 507 - text-align:left!important; 508 - text-align-last:left!important; 509 - text-justify:auto!important; 510 - word-spacing:normal!important; 511 - white-space:normal!important; 479 + 480 +#xwikicontent [data-sn-equal-height-managed], 481 +#xwikicontent [data-sn-first-section-aligned], 482 +#xwikicontent [data-sn-first-content-aligned]{ 483 + box-sizing:border-box; 512 512 } 513 513 </style> 514 514 515 -<script data-sn- service-navigator-master="1">487 +<script data-sn-horizontal-box-harmonizer="7"> 516 516 (function(){ 517 517 "use strict"; 518 518 519 - var PAGE_KIND="detail"; 520 - var PLACEHOLDER=false; 521 - var PLACEHOLDER_LABEL="IN VORBEREITUNG"; 522 - 523 523 var MOBILE_MAX=767; 524 524 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; 525 525 var RESIZE_DEBOUNCE=220; 498 + var MIN_WIDTH_CHANGE=2; 526 526 527 527 var root= 528 528 document.getElementById("xwikicontent")|| ... ... @@ -532,114 +532,142 @@ 532 532 533 533 if(!root)return; 534 534 535 - var managedHeight=new Set(); 536 - var managedMargin=new Set(); 537 - var originalHeight=new WeakMap(); 538 - var originalMargin=new WeakMap(); 508 + var heightManaged=new Set(); 509 + var sectionManaged=new Set(); 510 + var contentManaged=new Set(); 539 539 512 + var originalMinHeight=new WeakMap(); 513 + var originalMarginTop=new WeakMap(); 514 + 540 540 var resizeTimer=0; 541 - var running=false; 516 + var lastWidth=-1; 517 + var hasApplied=false; 518 + var applying=false; 542 542 543 - var THEMES=[ 544 - { 545 - name:"BLUE", 546 - accent:"#21b6d7", 547 - bg:"#eaf7fb", 548 - text:"#315d68", 549 - labels:[ 550 - "HIER STARTEN", 551 - "ENTSCHEIDEN", 552 - "ÜBERPRÜFEN & ANPASSEN", 553 - "START HERE", 554 - "DECIDE", 555 - "REVIEW & ADAPT" 556 - ] 557 - }, 558 - { 559 - name:"RED", 560 - accent:"#e94b13", 561 - bg:"#fff1ec", 562 - text:"#8a4d36", 563 - labels:[ 564 - "PLANEN & ORGANISIEREN", 565 - "ORGANISIEREN & DOKUMENTIEREN", 566 - "PUBLIZIEREN & PRÄSENTIEREN", 567 - "PLAN & ORGANISE", 568 - "PLAN & ORGANIZE", 569 - "ORGANISE & DOCUMENT", 570 - "ORGANIZE & DOCUMENT", 571 - "PUBLISH & PRESENT" 572 - ] 573 - }, 574 - { 575 - name:"YELLOW", 576 - accent:"#f0aa00", 577 - bg:"#fff8e7", 578 - text:"#785b17", 579 - labels:[ 580 - "SCHÜTZEN & KLÄREN", 581 - "STANDARDISIEREN & IDENTIFIZIEREN", 582 - "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN", 583 - "PROTECT & CLARIFY", 584 - "STANDARDISE & IDENTIFY", 585 - "STANDARDIZE & IDENTIFY", 586 - "OPEN, REUSE & MAKE FINDABLE" 587 - ] 588 - }, 589 - { 590 - name:"GREEN", 591 - accent:"#38b76a", 592 - bg:"#edf9f1", 593 - text:"#3f7451", 594 - labels:[ 595 - "INFRASTRUKTUR EINRICHTEN", 596 - "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN", 597 - "SPEICHERN & ZUGRIFF STEUERN", 598 - "REPOSITORIUM, ERHALTEN & ÜBERGEBEN", 599 - "SET UP INFRASTRUCTURE", 600 - "SET UP INFRASTRUCTURE & COLLABORATION", 601 - "STORE & CONTROL ACCESS", 602 - "REPOSITORY, PRESERVE & HAND OVER" 603 - ] 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; 604 604 } 605 - ]; 606 606 607 - function num(value){ 608 - var n=parseFloat(value); 609 - return Number.isFinite(n)?n:0; 538 + var r=el.getBoundingClientRect(); 539 + 540 + return ( 541 + r.width>=(minW||1)&& 542 + r.height>=(minH||1) 543 + ); 610 610 } 611 611 612 - function norm (value){613 - return String( value||"")546 + function normalizeText(text){ 547 + return String(text||"") 614 614 .replace(/\s+/g," ") 615 615 .trim() 616 616 .toUpperCase(); 617 617 } 618 618 619 - function visible(el){ 620 - if(!el||el.nodeType!==1)return false; 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 + } 621 621 622 - var style=getComputedStyle(el); 623 - var rect=el.getBoundingClientRect(); 562 + /* ---------- Custom coloured callouts ---------- */ 624 624 564 + function nativeCallout(el){ 565 + var c= 566 + typeof el.className==="string" 567 + ? el.className.toLowerCase() 568 + : ""; 569 + 625 625 return ( 626 - style.display!=="none"&& 627 - style.visibility!=="hidden"&& 628 - rect.width>20&& 629 - rect.height>4 571 + /(^|\s)(infomessage|warningmessage|successmessage|errormessage)(\s|$)/.test(c) 630 630 ); 631 631 } 632 632 633 - function saveStyle(el,map,property){ 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){ 634 634 if(map.has(el))return; 635 635 636 636 map.set(el,{ 637 - value:el.style.getPropertyValue(property), 638 - priority:el.style.getPropertyPriority(property) 632 + value: 633 + el.style.getPropertyValue( 634 + property 635 + ), 636 + priority: 637 + el.style.getPropertyPriority( 638 + property 639 + ) 639 639 }); 640 640 } 641 641 642 - function restore Style(el,map,property){643 + function restoreOriginal(el,map,property){ 643 643 var original=map.get(el); 644 644 645 645 if(original&&original.value){ ... ... @@ -649,1069 +649,770 @@ 649 649 original.priority||"" 650 650 ); 651 651 }else{ 652 - el.style.removeProperty(property); 653 + el.style.removeProperty( 654 + property 655 + ); 653 653 } 654 654 } 655 655 656 656 function resetRuntime(){ 657 - managedHeight.forEach(function(el){658 - restore Style(660 + heightManaged.forEach(function(el){ 661 + restoreOriginal( 659 659 el, 660 - originalHeight, 663 + originalMinHeight, 661 661 "min-height" 662 662 ); 666 + 663 663 el.removeAttribute( 664 - "data-sn- master-equal-height"668 + "data-sn-equal-height-managed" 665 665 ); 666 666 }); 667 667 668 - managedMargin.forEach(function(el){669 - restore Style(672 + sectionManaged.forEach(function(el){ 673 + restoreOriginal( 670 670 el, 671 - originalMargin, 675 + originalMarginTop, 672 672 "margin-top" 673 673 ); 678 + 674 674 el.removeAttribute( 675 - "data-sn- master-first-row"680 + "data-sn-first-section-aligned" 676 676 ); 677 677 }); 678 678 679 - managedHeight.clear(); 680 - managedMargin.clear(); 681 - } 684 + contentManaged.forEach(function(el){ 685 + restoreOriginal( 686 + el, 687 + originalMarginTop, 688 + "margin-top" 689 + ); 682 682 683 - function themeFor(text){ 684 - var value=norm(text); 691 + el.removeAttribute( 692 + "data-sn-first-content-aligned" 693 + ); 694 + }); 685 685 686 - for(var i=0;i<THEMES.length;i++){ 687 - for(var j=0;j<THEMES[i].labels.length;j++){ 688 - var label=THEMES[i].labels[j]; 689 - 690 - if( 691 - value===label|| 692 - value.indexOf(label+" ")===0|| 693 - value.indexOf(label+" -")===0|| 694 - value.indexOf(label+" ·")===0 695 - ){ 696 - return THEMES[i]; 697 - } 698 - } 699 - } 700 - 701 - return null; 696 + heightManaged.clear(); 697 + sectionManaged.clear(); 698 + contentManaged.clear(); 702 702 } 703 703 704 - /* ======================================================= 705 - BORDERLESS FILLED RED/ORANGE CTA BUTTONS 706 - ======================================================= */ 701 + /* ---------- Card detection ---------- */ 707 707 708 - function colourDistance(a,b){ 709 - return Math.sqrt( 710 - Math.pow(a[0]-b[0],2)+ 711 - Math.pow(a[1]-b[1],2)+ 712 - Math.pow(a[2]-b[2],2) 713 - ); 703 + function namedLikeBox(el){ 704 + var c= 705 + typeof el.className==="string" 706 + ? el.className 707 + : ""; 708 + 709 + return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c); 714 714 } 715 715 716 - function makeFilledRedOrangeCTAsBorderless(){ 717 - var RED_ORANGE=[233,75,19]; 712 + function boxLike(el){ 713 + if( 714 + !visible(el,MIN_W,MIN_H)|| 715 + excluded(el) 716 + ){ 717 + return false; 718 + } 718 718 719 - Array.from( 720 - root.querySelectorAll( 721 - 'a,button,[role="button"],input[type="submit"],input[type="button"]' 722 - ) 723 - ).forEach(function(el){ 724 - if(!visible(el))return; 720 + var s=getComputedStyle(el); 721 + var r=el.getBoundingClientRect(); 725 725 726 - var style=getComputedStyle(el); 727 - var rgb=parseRGB(style.backgroundColor); 723 + var border= 724 + num(s.borderTopWidth)+ 725 + num(s.borderRightWidth)+ 726 + num(s.borderBottomWidth)+ 727 + num(s.borderLeftWidth); 728 728 729 - if(!rgb)return; 729 + var radius=Math.max( 730 + num(s.borderTopLeftRadius), 731 + num(s.borderTopRightRadius), 732 + num(s.borderBottomLeftRadius), 733 + num(s.borderBottomRightRadius) 734 + ); 730 730 731 - if( 732 - colourDistance( 733 - rgb, 734 - RED_ORANGE 735 - )>55 736 - ){ 737 - return; 738 - } 736 + var bg= 737 + s.backgroundColor&& 738 + s.backgroundColor!=="rgba(0, 0, 0, 0)"&& 739 + s.backgroundColor!=="transparent"; 739 739 740 - var rect=el.getBoundingClientRect(); 741 + var shadow= 742 + s.boxShadow&& 743 + s.boxShadow!=="none"; 741 741 742 - if( 743 - rect.width<80|| 744 - rect.height<24 745 - ){ 746 - return; 747 - } 745 + return ( 746 + namedLikeBox(el)|| 747 + border>=1|| 748 + (bg&&radius>=3)|| 749 + (shadow&&r.width>=180) 750 + ); 751 + } 748 748 749 - el.style.setProperty( 750 - "border", 751 - "none", 752 - "important" 753 - ); 753 + function pickTarget(child){ 754 + if(!visible(child,MIN_W,MIN_H))return null; 754 754 755 - el.style.setProperty( 756 - "border-left", 757 - "none", 758 - "important" 759 - ); 756 + if(boxLike(child))return child; 760 760 761 - el.style.setProperty( 762 - "border-top", 763 - "none", 764 - "important" 765 - ); 758 + var cr=child.getBoundingClientRect(); 759 + var q=[]; 766 766 767 - el.style.setProperty( 768 - "border-right", 769 - "none", 770 - "important" 771 - ); 772 - 773 - el.style.setProperty( 774 - "border-bottom", 775 - "none", 776 - "important" 777 - ); 778 - 779 - el.style.setProperty( 780 - "box-shadow", 781 - "none", 782 - "important" 783 - ); 761 + Array.from(child.children||[]).forEach(function(el){ 762 + q.push({el:el,depth:1}); 784 784 }); 785 - } 786 786 787 - /* ======================================================= 788 - FULL-WIDTH THREE-LINE AREA LABELS 789 - ======================================================= */ 765 + var best=null; 766 + var bestScore=-Infinity; 790 790 791 - function compactText(value){ 792 - return String(value||"") 793 - .replace(/\s+/g," ") 794 - .trim(); 795 - } 768 + while(q.length){ 769 + var item=q.shift(); 770 + var el=item.el; 796 796 797 - function makeThreeLineAreaLabels(){ 798 - Array.from( 799 - root.querySelectorAll( 800 - ".arsn-area-label" 801 - ) 802 - ).forEach(function(label){ 803 - if( 804 - label.getAttribute( 805 - "data-sn-three-line" 806 - )==="1" 807 - ){ 808 - return; 809 - } 772 + if(!visible(el,MIN_W,MIN_H))continue; 810 810 811 - var number= 812 - label.querySelector( 813 - ":scope > .arsn-area-number" 814 - ); 774 + var r=el.getBoundingClientRect(); 815 815 816 - var action= 817 - label.querySelector( 818 - ":scope > .arsn-area-action" 819 - ); 820 - 821 821 if( 822 - !number||823 - !action777 + r.width>=cr.width*.68&& 778 + boxLike(el) 824 824 ){ 825 - return; 826 - } 780 + var widthFit= 781 + 1-Math.min( 782 + 1, 783 + Math.abs(cr.width-r.width)/ 784 + Math.max(1,cr.width) 785 + ); 827 827 828 - var clone= 829 - label.cloneNode(true); 787 + var topFit= 788 + 1-Math.min( 789 + 1, 790 + Math.abs(cr.top-r.top)/100 791 + ); 830 830 831 - var cloneNumber= 832 - clone.querySelector( 833 - ":scope > .arsn-area-number" 834 - ); 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; 835 835 836 - var cloneAction= 837 - clone.querySelector( 838 - ":scope > .arsn-area-action" 839 - ); 840 - 841 - if(cloneNumber){ 842 - cloneNumber.remove(); 799 + if(score>bestScore){ 800 + best=el; 801 + bestScore=score; 802 + } 843 843 } 844 844 845 - if(cloneAction){ 846 - cloneAction.remove(); 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 + }); 847 847 } 813 + } 848 848 849 - var titleText= 850 - compactText( 851 - clone.textContent 852 - ); 815 + return best; 816 + } 853 853 854 - if(!titleText){ 855 - return; 856 - } 818 + function groupRows(entries){ 819 + var groups=[]; 857 857 858 - var numberNode= 859 - number.cloneNode(true); 860 - 861 - var actionNode= 862 - action.cloneNode(true); 863 - 864 - var titleNode= 865 - document.createElement( 866 - "span" 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 867 867 ); 828 + }) 829 + .forEach(function(entry){ 830 + var group=null; 868 868 869 - titleNode.className= 870 - "sn-area-label-title"; 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 + } 871 871 872 - titleNode.textContent= 873 - titleText; 844 + if(!group){ 845 + group={ 846 + top:entry.rect.top, 847 + entries:[] 848 + }; 849 + groups.push(group); 850 + } 874 874 875 - while(label.firstChild){ 876 - label.removeChild( 877 - label.firstChild 878 - ); 879 - } 852 + group.entries.push(entry); 853 + }); 880 880 881 - label.appendChild( 882 - numberNode 883 - ); 884 - 885 - label.appendChild( 886 - titleNode 887 - ); 888 - 889 - label.appendChild( 890 - actionNode 891 - ); 892 - 893 - label.setAttribute( 894 - "data-sn-three-line", 895 - "1" 896 - ); 897 - 898 - var head= 899 - label.closest( 900 - ".arsn-area-head" 901 - ); 902 - 903 - if(head){ 904 - head.style.setProperty( 905 - "width", 906 - "100%", 907 - "important" 908 - ); 909 - 910 - head.style.setProperty( 911 - "max-width", 912 - "100%", 913 - "important" 914 - ); 915 - 916 - head.style.setProperty( 917 - "box-sizing", 918 - "border-box", 919 - "important" 920 - ); 921 - } 922 - }); 855 + return groups; 923 923 } 924 924 925 - /* ======================================================= 926 - PLACEHOLDER BADGE 927 - ======================================================= */ 858 + function validRow(group){ 859 + if(group.entries.length<2)return false; 928 928 929 - function applyPlaceholderBadge(){ 930 - if(!PLACEHOLDER)return; 861 + var lefts= 862 + group.entries 863 + .map(function(e){return e.rect.left;}) 864 + .sort(function(a,b){return a-b;}); 931 931 932 932 if( 933 - document.querySelector(934 - ".sn-coming-soon-badge"935 - )867 + lefts[lefts.length-1]- 868 + lefts[0]< 869 + 80 936 936 ){ 937 - return; 871 + return false; 938 938 } 939 939 940 - var title= 941 - document.querySelector( 942 - "#document-title" 943 - )|| 944 - document.querySelector( 945 - "h1" 946 - ); 874 + var widths= 875 + group.entries 876 + .map(function(e){return e.rect.width;}) 877 + .filter(function(w){return w>0;}); 947 947 948 - if( !title)return;879 + if(widths.length<2)return false; 949 949 950 - var badge= 951 - document.createElement( 952 - "span" 953 - ); 881 + var minW= 882 + Math.min.apply(Math,widths); 954 954 955 - badge.className=956 - "sn-coming-soon-badge";884 + var maxW= 885 + Math.max.apply(Math,widths); 957 957 958 - badge.textContent= 959 - PLACEHOLDER_LABEL; 960 - 961 - badge.setAttribute( 962 - "aria-label", 963 - PLACEHOLDER_LABEL 887 + return ( 888 + maxW/ 889 + Math.max(1,minW)<= 890 + 1.9 964 964 ); 892 + } 965 965 966 - title.appendChild( 967 - badge 894 + /* ---------- Known ARSN first section bars ---------- */ 895 + 896 + function knownBar(el){ 897 + var text= 898 + normalizeText( 899 + el.textContent 900 + ); 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" 968 968 ); 969 969 } 970 970 971 - /*=======================================================972 - DETAIL PAGE OWN-ACCENT PROPAGATION973 - =======================================================*/914 + function findKnownBar(card){ 915 + var cardRect= 916 + card.getBoundingClientRect(); 974 974 975 - function parseRGB(value){ 976 - var match=String(value||"").match( 977 - /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i 978 - ); 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; 979 979 980 - if(!match)returnnull;928 + var r=el.getBoundingClientRect(); 981 981 982 - return [ 983 - Number(match[1]), 984 - Number(match[2]), 985 - Number(match[3]) 986 - ]; 987 - } 930 + var rel= 931 + r.top- 932 + cardRect.top; 988 988 989 - function distance(a,b){ 990 - return Math.sqrt( 991 - Math.pow(a[0]-b[0],2)+ 992 - Math.pow(a[1]-b[1],2)+ 993 - Math.pow(a[2]-b[2],2) 994 - ); 934 + return ( 935 + rel>=35&& 936 + rel<= 937 + cardRect.height*.75 938 + ); 939 + }) 940 + .sort(function(a,b){ 941 + return ( 942 + a.getBoundingClientRect().top- 943 + b.getBoundingClientRect().top 944 + ); 945 + }); 946 + 947 + return rows[0]||null; 995 995 } 996 996 997 - function paletteMatch(cssColor){ 998 - var rgb=parseRGB(cssColor); 950 + function alignKnownBars(cards){ 951 + var rows= 952 + cards.map(function(card){ 953 + var bar= 954 + findKnownBar(card); 999 999 1000 - if(! rgb)return null;956 + if(!bar)return null; 1001 1001 1002 - var palette=[ 1003 - {hex:"#21b6d7",rgb:[33,182,215]}, 1004 - {hex:"#e94b13",rgb:[233,75,19]}, 1005 - {hex:"#f0aa00",rgb:[240,170,0]}, 1006 - {hex:"#38b76a",rgb:[56,183,106]} 1007 - ]; 958 + var cr= 959 + card.getBoundingClientRect(); 1008 1008 1009 - var b est=null;1010 - varbestDistance=Infinity;961 + var br= 962 + bar.getBoundingClientRect(); 1011 1011 1012 - palette.forEach(function(item){ 1013 - var d=distance(rgb,item.rgb); 964 + return { 965 + bar:bar, 966 + relativeTop: 967 + br.top- 968 + cr.top 969 + }; 970 + }); 1014 1014 1015 - if(d<bestDistance){ 1016 - best=item; 1017 - bestDistance=d; 1018 - } 1019 - }); 972 + if( 973 + rows.some(function(row){ 974 + return !row; 975 + }) 976 + ){ 977 + return false; 978 + } 1020 1020 1021 - return bestDistance<=30 1022 - ?best 1023 - :null; 1024 - } 980 + var target= 981 + Math.max.apply( 982 + Math, 983 + rows.map(function(row){ 984 + return row.relativeTop; 985 + }) 986 + ); 1025 1025 1026 - function propagateDetailAccents(){ 1027 - if(PAGE_KIND!=="detail")return; 988 + rows.forEach(function(row){ 989 + var delta= 990 + target- 991 + row.relativeTop; 1028 1028 1029 - Array.from( 1030 - root.querySelectorAll( 1031 - ".arsn-call,.dmp-call,.ido-call,.pp-call,"+ 1032 - ".arsn-source,.dmp-source,.ido-source,.pp-source" 1033 - ) 1034 - ).forEach(function(el){ 1035 - if(!visible(el))return; 993 + if(delta<=1)return; 1036 1036 1037 - var style=getComputedStyle(el); 995 + saveOriginal( 996 + row.bar, 997 + originalMarginTop, 998 + "margin-top" 999 + ); 1038 1038 1039 - if( 1040 - num(style.borderTopWidth)>=2 1041 - ){ 1042 - var match= 1043 - paletteMatch( 1044 - style.borderTopColor 1045 - ); 1001 + var current= 1002 + num( 1003 + getComputedStyle( 1004 + row.bar 1005 + ).marginTop 1006 + ); 1046 1046 1047 - if(match){ 1048 - el.style.setProperty( 1049 - "border-left", 1050 - "4px solid "+match.hex, 1051 - "important" 1052 - ); 1053 - } 1054 - } 1055 - }); 1008 + row.bar.style.setProperty( 1009 + "margin-top", 1010 + ( 1011 + current+ 1012 + delta 1013 + )+"px" 1014 + ); 1056 1056 1057 - // Warning families: explicit safety override. 1058 - Array.from( 1059 - root.querySelectorAll( 1060 - ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+ 1061 - ".warn,.warning,.warningmessage,.errormessage" 1062 - ) 1063 - ).forEach(function(el){ 1064 - if(!visible(el))return; 1065 - 1066 - el.style.setProperty( 1067 - "border-left", 1068 - "4px solid #e94b13", 1069 - "important" 1016 + row.bar.setAttribute( 1017 + "data-sn-first-section-aligned", 1018 + "7" 1070 1070 ); 1071 - }); 1072 1072 1073 - // Info families: explicit orientation override. 1074 - Array.from( 1075 - root.querySelectorAll( 1076 - ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage" 1077 - ) 1078 - ).forEach(function(el){ 1079 - if(!visible(el))return; 1080 - 1081 - el.style.setProperty( 1082 - "border-left", 1083 - "4px solid #21b6d7", 1084 - "important" 1021 + sectionManaged.add( 1022 + row.bar 1085 1085 ); 1086 1086 }); 1025 + 1026 + return true; 1087 1087 } 1088 1088 1089 - /* ======================================================= 1090 - OVERVIEW SEMANTIC THEME PALETTE 1091 - ======================================================= */ 1029 + /* ---------- Generic first content after heading ---------- */ 1092 1092 1093 - function smallestThemeHeaders(){ 1094 - return Array.from( 1095 - root.querySelectorAll( 1096 - "div,span,p,strong,h3,h4,h5,h6" 1031 + function heading(card){ 1032 + var cr= 1033 + card.getBoundingClientRect(); 1034 + 1035 + var rows= 1036 + Array.from( 1037 + card.querySelectorAll( 1038 + "h1,h2,h3,h4,h5,h6,.box-title,[role=heading]" 1039 + ) 1097 1097 ) 1098 - ).filter(function(el){ 1099 - if(!visible(el))return false; 1100 - if(!themeFor(el.textContent))return false; 1041 + .filter(function(el){ 1042 + if(!visible(el,20,8))return false; 1101 1101 1102 - return !Array.from( 1103 - el.children||[] 1104 - ).some(function(child){ 1105 - return !!themeFor( 1106 - child.textContent 1044 + var r=el.getBoundingClientRect(); 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 + ) 1107 1107 ); 1058 + }) 1059 + .sort(function(a,b){ 1060 + return ( 1061 + a.getBoundingClientRect().top- 1062 + b.getBoundingClientRect().top 1063 + ); 1108 1108 }); 1109 - }); 1065 + 1066 + return rows[0]||null; 1110 1110 } 1111 1111 1112 - function findOverviewCard(header){ 1113 - var node=header.parentElement; 1114 - var candidates=[]; 1069 + function firstContent(card,h){ 1070 + if(!h)return null; 1115 1115 1116 - while(node&&node!==root){ 1117 - var rect=node.getBoundingClientRect(); 1118 - var style=getComputedStyle(node); 1072 + var cr= 1073 + card.getBoundingClientRect(); 1119 1119 1120 - var border= 1121 - num(style.borderTopWidth)+ 1122 - num(style.borderRightWidth)+ 1123 - num(style.borderBottomWidth)+ 1124 - num(style.borderLeftWidth); 1075 + var hr= 1076 + h.getBoundingClientRect(); 1125 1125 1126 - if( 1127 - rect.width>=220&& 1128 - rect.width<=800&& 1129 - rect.height>=120&& 1130 - border>=1 1131 - ){ 1132 - candidates.push(node); 1133 - } 1078 + var rows= 1079 + Array.from( 1080 + card.querySelectorAll( 1081 + "p,div,ul,ol,dl,blockquote" 1082 + ) 1083 + ) 1084 + .filter(function(el){ 1085 + if( 1086 + el===h|| 1087 + h.contains(el)|| 1088 + el.contains(h) 1089 + ){ 1090 + return false; 1091 + } 1134 1134 1135 - node=node.parentElement; 1136 - } 1093 + if(!visible(el,30,8))return false; 1137 1137 1138 - if(!candidates.length)return null; 1095 + var text= 1096 + String(el.textContent||"") 1097 + .replace(/\s+/g," ") 1098 + .trim(); 1139 1139 1140 - candidates.sort(function(a,b){ 1141 - return ( 1142 - b.getBoundingClientRect().height- 1143 - a.getBoundingClientRect().height 1144 - ); 1145 - }); 1100 + if(text.length<3)return false; 1146 1146 1147 - return candidates[0]; 1148 - } 1102 + var r=el.getBoundingClientRect(); 1149 1149 1150 - function rowCandidates(link,card){ 1151 - var result=[]; 1152 - var cardRect= 1153 - card.getBoundingClientRect(); 1104 + if( 1105 + r.top< 1106 + hr.bottom-1 1107 + ){ 1108 + return false; 1109 + } 1154 1154 1155 - var node=link; 1111 + if( 1112 + r.top-cr.top> 1113 + Math.min( 1114 + 280, 1115 + cr.height*.65 1116 + ) 1117 + ){ 1118 + return false; 1119 + } 1156 1156 1157 - while(node&&node!==card){ 1158 - if(visible(node)){ 1159 - var rect= 1160 - node.getBoundingClientRect(); 1161 - 1162 1162 if( 1163 - rect.height<=105&& 1164 - rect.width>= 1165 - cardRect.width*.50&& 1166 - rect.width<= 1167 - cardRect.width*1.03 1122 + r.height> 1123 + cr.height*.58 1168 1168 ){ 1169 - re sult.push(node);1125 + return false; 1170 1170 } 1171 - } 1172 1172 1173 - node=node.parentElement; 1174 - } 1128 + return true; 1129 + }) 1130 + .sort(function(a,b){ 1131 + var ar= 1132 + a.getBoundingClientRect(); 1175 1175 1176 - r eturnresult;1177 - }1134 + var br= 1135 + b.getBoundingClientRect(); 1178 1178 1179 - function chooseOuterRow( 1180 - candidates, 1181 - link 1182 - ){ 1183 - if(!candidates.length){ 1184 - return link; 1185 - } 1186 - 1187 - var bordered= 1188 - candidates.filter(function(el){ 1189 1189 return ( 1190 - num( 1191 - getComputedStyle(el) 1192 - .borderLeftWidth 1193 - )>=1 1138 + ar.top-br.top|| 1139 + ar.height-br.height 1194 1194 ); 1195 1195 }); 1196 1196 1197 - var pool= 1198 - bordered.length 1199 - ?bordered 1200 - :candidates; 1143 + return rows[0]||null; 1144 + } 1201 1201 1202 - pool.sort(function(a,b){ 1203 - var ar= 1204 - a.getBoundingClientRect(); 1146 + function alignGeneric(cards){ 1147 + var rows= 1148 + cards.map(function(card){ 1149 + var h= 1150 + heading(card); 1205 1205 1206 - var br= 1207 - b.getBoundingClientRect(); 1152 + var c= 1153 + firstContent( 1154 + card, 1155 + h 1156 + ); 1208 1208 1209 - return ( 1210 - ar.left-br.left|| 1211 - br.width-ar.width 1212 - ); 1213 - }); 1158 + if(!h||!c)return null; 1214 1214 1215 - r eturnpool[0]||link;1216 - }1160 + var cr= 1161 + card.getBoundingClientRect(); 1217 1217 1218 - function applyOverviewPalette(){ 1219 - if(PAGE_KIND!=="overview"){ 1220 - return []; 1163 + var rr= 1164 + c.getBoundingClientRect(); 1165 + 1166 + return { 1167 + content:c, 1168 + relativeTop: 1169 + rr.top-cr.top 1170 + }; 1171 + }); 1172 + 1173 + if( 1174 + rows.some(function(row){ 1175 + return !row; 1176 + }) 1177 + ){ 1178 + return false; 1221 1221 } 1222 1222 1223 - var headers= 1224 - smallestThemeHeaders() 1225 - .map(function(el){ 1226 - return { 1227 - el:el, 1228 - theme: 1229 - themeFor( 1230 - el.textContent 1231 - ), 1232 - card: 1233 - findOverviewCard( 1234 - el 1235 - ) 1236 - }; 1181 + var target= 1182 + Math.max.apply( 1183 + Math, 1184 + rows.map(function(row){ 1185 + return row.relativeTop; 1237 1237 }) 1238 - .filter(function(row){ 1239 - return !!row.card; 1240 - }); 1187 + ); 1241 1241 1242 - var unique=[]; 1243 - var seenHeaders=new Set(); 1189 + rows.forEach(function(row){ 1190 + var delta= 1191 + target- 1192 + row.relativeTop; 1244 1244 1245 - headers.forEach(function(row){ 1246 - var key= 1247 - row.theme.name+ 1248 - "|"+ 1249 - Math.round( 1250 - row.card 1251 - .getBoundingClientRect() 1252 - .left 1253 - )+ 1254 - "|"+ 1255 - Math.round( 1256 - row.el 1257 - .getBoundingClientRect() 1258 - .top 1259 - ); 1194 + if(delta<=1)return; 1260 1260 1261 - if(!seenHeaders.has(key)){ 1262 - seenHeaders.add(key); 1263 - unique.push(row); 1264 - } 1265 - }); 1266 - 1267 - unique.forEach(function(row){ 1268 - var headerRect= 1269 - row.el 1270 - .getBoundingClientRect(); 1271 - 1272 - row.el.style.setProperty( 1273 - "background", 1274 - row.theme.bg, 1275 - "important" 1196 + saveOriginal( 1197 + row.content, 1198 + originalMarginTop, 1199 + "margin-top" 1276 1276 ); 1277 1277 1278 - row.el.style.setProperty( 1279 - "color", 1280 - row.theme.text, 1281 - "important" 1282 - ); 1202 + var current= 1203 + num( 1204 + getComputedStyle( 1205 + row.content 1206 + ).marginTop 1207 + ); 1283 1283 1284 - row.el.style.setProperty( 1285 - "text-align", 1286 - "left", 1287 - "important" 1209 + row.content.style.setProperty( 1210 + "margin-top", 1211 + ( 1212 + current+ 1213 + delta 1214 + )+"px" 1288 1288 ); 1289 1289 1290 - row.el.style.setProperty( 1291 - "word-spacing", 1292 - "normal", 1293 - "important" 1217 + row.content.setAttribute( 1218 + "data-sn-first-content-aligned", 1219 + "7" 1294 1294 ); 1295 1295 1296 - var later= 1297 - unique 1298 - .filter(function(other){ 1299 - return ( 1300 - other.card===row.card&& 1301 - other.el 1302 - .getBoundingClientRect() 1303 - .top> 1304 - headerRect.top+2 1305 - ); 1306 - }) 1307 - .sort(function(a,b){ 1308 - return ( 1309 - a.el 1310 - .getBoundingClientRect() 1311 - .top- 1312 - b.el 1313 - .getBoundingClientRect() 1314 - .top 1315 - ); 1316 - }); 1317 - 1318 - var stopTop= 1319 - later.length 1320 - ?later[0].el 1321 - .getBoundingClientRect() 1322 - .top 1323 - :Infinity; 1324 - 1325 - Array.from( 1326 - row.card.querySelectorAll("a") 1327 - ).forEach(function(link){ 1328 - if(!visible(link))return; 1329 - 1330 - var rect= 1331 - link.getBoundingClientRect(); 1332 - 1333 - if( 1334 - rect.top<= 1335 - headerRect.bottom-2|| 1336 - rect.top>= 1337 - stopTop-2 1338 - ){ 1339 - return; 1340 - } 1341 - 1342 - var candidates= 1343 - rowCandidates( 1344 - link, 1345 - row.card 1346 - ); 1347 - 1348 - var target= 1349 - chooseOuterRow( 1350 - candidates, 1351 - link 1352 - ); 1353 - 1354 - candidates.forEach(function(el){ 1355 - el.style.setProperty( 1356 - "border-left", 1357 - "0 solid transparent", 1358 - "important" 1359 - ); 1360 - }); 1361 - 1362 - target.style.setProperty( 1363 - "border-left", 1364 - "3px solid "+ 1365 - row.theme.accent, 1366 - "important" 1367 - ); 1368 - 1369 - target.style.setProperty( 1370 - "box-sizing", 1371 - "border-box", 1372 - "important" 1373 - ); 1374 - }); 1222 + contentManaged.add( 1223 + row.content 1224 + ); 1375 1375 }); 1376 1376 1377 - return u nique;1227 + return true; 1378 1378 } 1379 1379 1380 - /* ======================================================= 1381 - OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW 1382 - ======================================================= */ 1230 + function applyRow(group){ 1231 + if(!validRow(group))return false; 1383 1383 1384 - function alignOverviewCards(headers){ 1385 - if( 1386 - PAGE_KIND!=="overview"|| 1387 - window.innerWidth<=MOBILE_MAX 1388 - ){ 1389 - return; 1390 - } 1391 - 1392 1392 var cards=[]; 1393 1393 var seen=new Set(); 1394 1394 1395 - headers.forEach(function(row){1396 - if(!seen.has(r ow.card)){1397 - seen.add(r ow.card);1398 - cards.push(r ow.card);1236 + group.entries.forEach(function(entry){ 1237 + if(!seen.has(entry.target)){ 1238 + seen.add(entry.target); 1239 + cards.push(entry.target); 1399 1399 } 1400 1400 }); 1401 1401 1402 - if(cards.length<2){ 1403 - return; 1243 + if(cards.length<2)return false; 1244 + 1245 + if( 1246 + !alignKnownBars(cards) 1247 + ){ 1248 + alignGeneric(cards); 1404 1404 } 1405 1405 1406 - // Group cards by actual top position. 1407 - var groups=[]; 1251 + var maxHeight=0; 1408 1408 1409 1409 cards.forEach(function(card){ 1410 - var top= 1411 - card.getBoundingClientRect().top; 1412 - 1413 - var group=null; 1414 - 1415 - for(var i=0;i<groups.length;i++){ 1416 - if( 1417 - Math.abs( 1418 - groups[i].top-top 1419 - )<=ROW_TOLERANCE 1420 - ){ 1421 - group=groups[i]; 1422 - break; 1423 - } 1424 - } 1425 - 1426 - if(!group){ 1427 - group={ 1428 - top:top, 1429 - cards:[] 1430 - }; 1431 - groups.push(group); 1432 - } 1433 - 1434 - group.cards.push(card); 1254 + maxHeight= 1255 + Math.max( 1256 + maxHeight, 1257 + card.getBoundingClientRect().height 1258 + ); 1435 1435 }); 1436 1436 1437 - groups.forEach(function(group){1438 - if(group.cards.length<2){1439 - return;1440 - }1261 + maxHeight= 1262 + Math.ceil( 1263 + maxHeight 1264 + ); 1441 1441 1442 - var firstHeaders= 1443 - group.cards.map(function(card){ 1444 - var candidates= 1445 - headers 1446 - .filter(function(row){ 1447 - return row.card===card; 1448 - }) 1449 - .sort(function(a,b){ 1450 - return ( 1451 - a.el 1452 - .getBoundingClientRect() 1453 - .top- 1454 - b.el 1455 - .getBoundingClientRect() 1456 - .top 1457 - ); 1458 - }); 1266 + if(maxHeight<MIN_H)return false; 1459 1459 1460 - return candidates.length 1461 - ?candidates[0] 1462 - :null; 1463 - }); 1268 + cards.forEach(function(card){ 1269 + saveOriginal( 1270 + card, 1271 + originalMinHeight, 1272 + "min-height" 1273 + ); 1464 1464 1465 - if( 1466 - !firstHeaders.some(function(row){ 1467 - return !row; 1468 - }) 1469 - ){ 1470 - var targetTop= 1471 - Math.max.apply( 1472 - Math, 1473 - firstHeaders.map(function(row){ 1474 - return ( 1475 - row.el 1476 - .getBoundingClientRect() 1477 - .top- 1478 - row.card 1479 - .getBoundingClientRect() 1480 - .top 1481 - ); 1482 - }) 1483 - ); 1275 + card.style.setProperty( 1276 + "min-height", 1277 + maxHeight+"px" 1278 + ); 1484 1484 1485 - firstHeaders.forEach(function(row){ 1486 - var relativeTop= 1487 - row.el 1488 - .getBoundingClientRect() 1489 - .top- 1490 - row.card 1491 - .getBoundingClientRect() 1492 - .top; 1280 + card.setAttribute( 1281 + "data-sn-equal-height-managed", 1282 + "7" 1283 + ); 1493 1493 1494 - var delta=1495 - targetTop-relativeTop;1285 + heightManaged.add(card); 1286 + }); 1496 1496 1497 - if(delta>1){ 1498 - saveStyle( 1499 - row.el, 1500 - originalMargin, 1501 - "margin-top" 1502 - ); 1288 + return true; 1289 + } 1503 1503 1504 - var current= 1505 - num( 1506 - getComputedStyle( 1507 - row.el 1508 - ).marginTop 1509 - ); 1291 + function calculate(force){ 1292 + if(applying)return; 1510 1510 1511 - row.el.style.setProperty( 1512 - "margin-top", 1513 - ( 1514 - current+delta 1515 - )+"px" 1516 - ); 1294 + var width= 1295 + Math.round( 1296 + window.innerWidth 1297 + ); 1517 1517 1518 - row.el.setAttribute( 1519 - "data-sn-master-first-row", 1520 - "1" 1521 - ); 1299 + var meaningful= 1300 + lastWidth<0|| 1301 + Math.abs( 1302 + width- 1303 + lastWidth 1304 + )>= 1305 + MIN_WIDTH_CHANGE; 1522 1522 1523 - managedMargin.add( 1524 - row.el 1525 - ); 1526 - } 1527 - }); 1528 - } 1529 - 1530 - var maxHeight=0; 1531 - 1532 - group.cards.forEach(function(card){ 1533 - maxHeight= 1534 - Math.max( 1535 - maxHeight, 1536 - card 1537 - .getBoundingClientRect() 1538 - .height 1539 - ); 1540 - }); 1541 - 1542 - maxHeight= 1543 - Math.ceil(maxHeight); 1544 - 1545 - group.cards.forEach(function(card){ 1546 - saveStyle( 1547 - card, 1548 - originalHeight, 1549 - "min-height" 1550 - ); 1551 - 1552 - card.style.setProperty( 1553 - "min-height", 1554 - maxHeight+"px" 1555 - ); 1556 - 1557 - card.setAttribute( 1558 - "data-sn-master-equal-height", 1559 - "1" 1560 - ); 1561 - 1562 - managedHeight.add( 1563 - card 1564 - ); 1565 - }); 1566 - }); 1567 - } 1568 - 1569 - /* ======================================================= 1570 - DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY 1571 - ======================================================= */ 1572 - 1573 - function equaliseDetailGrids(){ 1574 1574 if( 1575 - PAGE_KIND!=="detail"|| 1576 - window.innerWidth<=MOBILE_MAX 1308 + hasApplied&& 1309 + !force&& 1310 + !meaningful 1577 1577 ){ 1578 1578 return; 1579 1579 } 1580 1580 1581 - var selectors=[ 1582 - ".arsn-grid", 1583 - ".arsn-grid-2", 1584 - ".arsn-grid-3", 1585 - ".dmp-grid", 1586 - ".ido-grid", 1587 - ".pp-grid" 1588 - ]; 1315 + applying=true; 1589 1589 1590 - selectors.forEach(function(selector){ 1591 - Array.from( 1592 - root.querySelectorAll(selector) 1593 - ).forEach(function(grid){ 1594 - var children= 1595 - Array.from( 1596 - grid.children||[] 1597 - ).filter(visible); 1317 + try{ 1318 + harmoniseCustomCallouts(); 1598 1598 1599 - if(children.length<2){ 1600 - return; 1320 + if(width<=MOBILE_MAX){ 1321 + if(hasApplied){ 1322 + resetRuntime(); 1601 1601 } 1602 1602 1603 - var groups=[]; 1325 + hasApplied=false; 1326 + lastWidth=width; 1327 + return; 1328 + } 1604 1604 1605 - children.forEach(function(child){ 1606 - var top= 1607 - child 1608 - .getBoundingClientRect() 1609 - .top; 1330 + if(hasApplied){ 1331 + resetRuntime(); 1332 + } 1610 1610 1611 - var group=null; 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 + }); 1612 1612 1613 - for(var i=0;i<groups.length;i++){ 1614 - if( 1615 - Math.abs( 1616 - groups[i].top-top 1617 - )<=ROW_TOLERANCE 1618 - ){ 1619 - group=groups[i]; 1620 - break; 1621 - } 1622 - } 1352 + var touched= 1353 + new Set(); 1623 1623 1624 - if(!group){ 1625 - group={ 1626 - top:top, 1627 - items:[] 1628 - }; 1629 - groups.push(group); 1630 - } 1355 + parents.forEach(function(parent){ 1356 + var entries=[]; 1631 1631 1632 - group.items.push(child); 1633 - }); 1634 - 1635 - groups.forEach(function(group){ 1636 - if(group.items.length<2){ 1358 + Array.from( 1359 + parent.children 1360 + ).forEach(function(child){ 1361 + if( 1362 + !visible( 1363 + child, 1364 + MIN_W, 1365 + MIN_H 1366 + ) 1367 + ){ 1637 1637 return; 1638 1638 } 1639 1639 1640 - var maxHeight=0; 1371 + var target= 1372 + pickTarget(child); 1641 1641 1642 - group.items.forEach(function(item){ 1643 - maxHeight= 1644 - Math.max( 1645 - maxHeight, 1646 - item 1647 - .getBoundingClientRect() 1648 - .height 1649 - ); 1374 + if(!target)return; 1375 + 1376 + entries.push({ 1377 + target:target, 1378 + rect: 1379 + target.getBoundingClientRect() 1650 1650 }); 1381 + }); 1651 1651 1652 - maxHeight= 1653 - Math.ceil(maxHeight); 1383 + groupRows( 1384 + entries 1385 + ).forEach(function(group){ 1386 + if(!validRow(group))return; 1654 1654 1655 - group.items.forEach(function(item){ 1656 - saveStyle( 1657 - item, 1658 - originalHeight, 1659 - "min-height" 1660 - ); 1388 + var targets= 1389 + group.entries.map(function(entry){ 1390 + return entry.target; 1391 + }); 1661 1661 1662 - item.style.setProperty( 1663 - "min-height", 1664 - maxHeight+"px" 1665 - ); 1393 + if( 1394 + !targets.some(function(el){ 1395 + return !touched.has(el); 1396 + }) 1397 + ){ 1398 + return; 1399 + } 1666 1666 1667 - item.setAttribute( 1668 - "data-sn-master-equal-height", 1669 - "1" 1670 - ); 1671 - 1672 - managedHeight.add(item); 1673 - }); 1401 + if(applyRow(group)){ 1402 + targets.forEach(function(el){ 1403 + touched.add(el); 1404 + }); 1405 + } 1674 1674 }); 1675 1675 }); 1676 - }); 1677 - } 1678 1678 1679 - /* ======================================================= 1680 - RUN / RESPONSIVE SCHEDULING 1681 - ======================================================= */ 1682 - 1683 - function run(){ 1684 - if(running)return; 1685 - 1686 - running=true; 1687 - 1688 - try{ 1689 - resetRuntime(); 1690 - applyPlaceholderBadge(); 1691 - propagateDetailAccents(); 1692 - 1693 - var headers= 1694 - applyOverviewPalette(); 1695 - 1696 - makeThreeLineAreaLabels(); 1697 - makeFilledRedOrangeCTAsBorderless(); 1698 - 1699 - if( 1700 - window.innerWidth> 1701 - MOBILE_MAX 1702 - ){ 1703 - alignOverviewCards( 1704 - headers 1705 - ); 1706 - 1707 - equaliseDetailGrids(); 1708 - } 1409 + lastWidth=width; 1410 + hasApplied=true; 1709 1709 }finally{ 1710 - running=false;1412 + applying=false; 1711 1711 } 1712 1712 } 1713 1713 1714 - function onResize(){1416 + function resize(){ 1715 1715 if(resizeTimer){ 1716 1716 clearTimeout( 1717 1717 resizeTimer ... ... @@ -1722,40 +1722,19 @@ 1722 1722 setTimeout( 1723 1723 function(){ 1724 1724 resizeTimer=0; 1725 - run();1427 + calculate(false); 1726 1726 }, 1727 1727 RESIZE_DEBOUNCE 1728 1728 ); 1729 1729 } 1730 1730 1731 - async function waitForReady(){ 1732 - if( 1733 - document.readyState!=="complete" 1734 - ){ 1735 - await new Promise(function(resolve){ 1736 - window.addEventListener( 1737 - "load", 1738 - resolve, 1739 - {once:true} 1740 - ); 1741 - }); 1742 - } 1743 - 1744 - if( 1745 - document.fonts&& 1746 - document.fonts.ready 1747 - ){ 1748 - try{ 1749 - await document.fonts.ready; 1750 - }catch(error){} 1751 - } 1752 - 1433 + function waitImages(){ 1753 1753 var images= 1754 1754 Array.from( 1755 1755 root.querySelectorAll("img") 1756 1756 ); 1757 1757 1758 - await Promise.all(1439 + return Promise.all( 1759 1759 images.map(function(img){ 1760 1760 if(img.complete){ 1761 1761 return Promise.resolve(); ... ... @@ -1780,20 +1780,46 @@ 1780 1780 }); 1781 1781 }) 1782 1782 ); 1464 + } 1783 1783 1784 - run(); 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); 1785 1785 } 1786 1786 1787 - window.addEventListener(1495 + addEventListener( 1788 1788 "resize", 1789 - onResize,1497 + resize, 1790 1790 {passive:true} 1791 1791 ); 1792 1792 1793 - waitForReady();1501 + initial(); 1794 1794 })(); 1795 1795 </script> 1796 1796 1797 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END --> 1798 -{{/html}} 1799 - 1505 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_END --> 1506 +{{/html}}\n