Ä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.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
Zusammenfassung
-
Seiteneigenschaften (1 geändert, 0 hinzugefügt, 0 gelöscht)
Details
- Seiteneigenschaften
-
- Inhalt
-
... ... @@ -384,15 +384,25 @@ 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 + 387 387 </div> 388 388 {{/html}} 389 389 390 -\n\n 391 -\n\n{{html clean="false"}} 392 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_START --> 399 +{{html clean="false"}} 400 +<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START --> 393 393 394 -<style data-sn-horizontal-box-harmonizer="7"> 395 -/* ---------- Typography: never justify headings ---------- */ 402 +<style data-sn-service-navigator-master="1"> 403 +/* ========================================================= 404 + MASTER TYPOGRAPHY 405 + ========================================================= */ 396 396 #xwikicontent h1, 397 397 #xwikicontent h2, 398 398 #xwikicontent h3, ... ... @@ -414,88 +414,105 @@ 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"]{ 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{ 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; 456 + border-left:4px solid #21b6d7!important; 457 + 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, 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, 459 459 #xwikicontent .errormessage{ 460 - --sn-callout-accent:#e94b13; 461 - background:#fff1ec!important; 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; 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; 477 +[data-sn-master-equal-height], 478 +[data-sn-master-first-row]{ 479 + box-sizing:border-box; 470 470 } 471 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; 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; 478 478 } 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; 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; 484 484 } 485 485 </style> 486 486 487 -<script data-sn- horizontal-box-harmonizer="7">515 +<script data-sn-service-navigator-master="1"> 488 488 (function(){ 489 489 "use strict"; 490 490 519 + var PAGE_KIND="detail"; 520 + var PLACEHOLDER=false; 521 + var PLACEHOLDER_LABEL="IN VORBEREITUNG"; 522 + 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(); 535 + var managedHeight=new Set(); 536 + var managedMargin=new Set(); 537 + var originalHeight=new WeakMap(); 538 + 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; 541 + 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; 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 + ] 536 536 } 605 + ]; 537 537 538 - var r=el.getBoundingClientRect(); 539 - 540 - return ( 541 - r.width>=(minW||1)&& 542 - r.height>=(minH||1) 543 - ); 607 + function num(value){ 608 + var n=parseFloat(value); 609 + return Number.isFinite(n)?n:0; 544 544 } 545 545 546 - function normal izeText(text){547 - return String( text||"")612 + function norm(value){ 613 + 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 - } 619 + function visible(el){ 620 + if(!el||el.nodeType!==1)return false; 561 561 562 - /* ---------- Custom coloured callouts ---------- */ 622 + var style=getComputedStyle(el); 623 + 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) 626 + style.display!=="none"&& 627 + style.visibility!=="hidden"&& 628 + rect.width>20&& 629 + 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){ 633 + 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 - ) 637 + value:el.style.getPropertyValue(property), 638 + priority:el.style.getPropertyPriority(property) 640 640 }); 641 641 } 642 642 643 - function restore Original(el,map,property){642 + function restoreStyle(el,map,property){ 644 644 var original=map.get(el); 645 645 646 646 if(original&&original.value){ ... ... @@ -650,770 +650,1069 @@ 650 650 original.priority||"" 651 651 ); 652 652 }else{ 653 - el.style.removeProperty( 654 - property 655 - ); 652 + el.style.removeProperty(property); 656 656 } 657 657 } 658 658 659 659 function resetRuntime(){ 660 - heightManaged.forEach(function(el){661 - restore Original(657 + managedHeight.forEach(function(el){ 658 + restoreStyle( 662 662 el, 663 - original MinHeight,660 + originalHeight, 664 664 "min-height" 665 665 ); 666 - 667 667 el.removeAttribute( 668 - "data-sn-equal-height -managed"664 + "data-sn-master-equal-height" 669 669 ); 670 670 }); 671 671 672 - sectionManaged.forEach(function(el){673 - restore Original(668 + managedMargin.forEach(function(el){ 669 + restoreStyle( 674 674 el, 675 - originalMargin Top,671 + originalMargin, 676 676 "margin-top" 677 677 ); 678 - 679 679 el.removeAttribute( 680 - "data-sn-first- section-aligned"675 + "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 - ); 679 + managedHeight.clear(); 680 + managedMargin.clear(); 681 + } 690 690 691 - el.removeAttribute( 692 - "data-sn-first-content-aligned" 693 - ); 694 - }); 683 + function themeFor(text){ 684 + var value=norm(text); 695 695 696 - heightManaged.clear(); 697 - sectionManaged.clear(); 698 - contentManaged.clear(); 699 - } 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]; 700 700 701 - /* ---------- Card detection ---------- */ 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 + } 702 702 703 - function namedLikeBox(el){ 704 - var c= 705 - typeof el.className==="string" 706 - ? el.className 707 - : ""; 701 + return null; 702 + } 708 708 709 - return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c); 704 + /* ======================================================= 705 + BORDERLESS FILLED RED/ORANGE CTA BUTTONS 706 + ======================================================= */ 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 + ); 710 710 } 711 711 712 - function boxLike(el){ 713 - if( 714 - !visible(el,MIN_W,MIN_H)|| 715 - excluded(el) 716 - ){ 717 - return false; 718 - } 716 + function makeFilledRedOrangeCTAsBorderless(){ 717 + var RED_ORANGE=[233,75,19]; 719 719 720 - var s=getComputedStyle(el); 721 - var r=el.getBoundingClientRect(); 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; 722 722 723 - var border= 724 - num(s.borderTopWidth)+ 725 - num(s.borderRightWidth)+ 726 - num(s.borderBottomWidth)+ 727 - num(s.borderLeftWidth); 726 + var style=getComputedStyle(el); 727 + var rgb=parseRGB(style.backgroundColor); 728 728 729 - var radius=Math.max( 730 - num(s.borderTopLeftRadius), 731 - num(s.borderTopRightRadius), 732 - num(s.borderBottomLeftRadius), 733 - num(s.borderBottomRightRadius) 734 - ); 729 + if(!rgb)return; 735 735 736 - var bg= 737 - s.backgroundColor&& 738 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&& 739 - s.backgroundColor!=="transparent"; 731 + if( 732 + colourDistance( 733 + rgb, 734 + RED_ORANGE 735 + )>55 736 + ){ 737 + return; 738 + } 740 740 741 - var shadow= 742 - s.boxShadow&& 743 - s.boxShadow!=="none"; 740 + var rect=el.getBoundingClientRect(); 744 744 745 - return ( 746 - namedLikeBox(el)|| 747 - border>=1|| 748 - (bg&&radius>=3)|| 749 - (shadow&&r.width>=180) 750 - ); 751 - } 742 + if( 743 + rect.width<80|| 744 + rect.height<24 745 + ){ 746 + return; 747 + } 752 752 753 - function pickTarget(child){ 754 - if(!visible(child,MIN_W,MIN_H))return null; 749 + el.style.setProperty( 750 + "border", 751 + "none", 752 + "important" 753 + ); 755 755 756 - if(boxLike(child))return child; 755 + el.style.setProperty( 756 + "border-left", 757 + "none", 758 + "important" 759 + ); 757 757 758 - var cr=child.getBoundingClientRect(); 759 - var q=[]; 761 + el.style.setProperty( 762 + "border-top", 763 + "none", 764 + "important" 765 + ); 760 760 761 - Array.from(child.children||[]).forEach(function(el){ 762 - q.push({el:el,depth:1}); 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 + ); 763 763 }); 785 + } 764 764 765 - var best=null; 766 - var bestScore=-Infinity; 787 + /* ======================================================= 788 + FULL-WIDTH THREE-LINE AREA LABELS 789 + ======================================================= */ 767 767 768 - while(q.length){ 769 - var item=q.shift(); 770 - var el=item.el; 791 + function compactText(value){ 792 + return String(value||"") 793 + .replace(/\s+/g," ") 794 + .trim(); 795 + } 771 771 772 - if(!visible(el,MIN_W,MIN_H))continue; 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 + } 773 773 774 - var r=el.getBoundingClientRect(); 811 + var number= 812 + label.querySelector( 813 + ":scope > .arsn-area-number" 814 + ); 775 775 816 + var action= 817 + label.querySelector( 818 + ":scope > .arsn-area-action" 819 + ); 820 + 776 776 if( 777 - r .width>=cr.width*.68&&778 - boxLike(el)822 + !number|| 823 + !action 779 779 ){ 780 - var widthFit= 781 - 1-Math.min( 782 - 1, 783 - Math.abs(cr.width-r.width)/ 784 - Math.max(1,cr.width) 785 - ); 825 + return; 826 + } 786 786 787 - var topFit= 788 - 1-Math.min( 789 - 1, 790 - Math.abs(cr.top-r.top)/100 791 - ); 828 + var clone= 829 + label.cloneNode(true); 792 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; 831 + var cloneNumber= 832 + clone.querySelector( 833 + ":scope > .arsn-area-number" 834 + ); 798 798 799 - if(score>bestScore){ 800 - best=el; 801 - bestScore=score; 802 - } 836 + var cloneAction= 837 + clone.querySelector( 838 + ":scope > .arsn-area-action" 839 + ); 840 + 841 + if(cloneNumber){ 842 + cloneNumber.remove(); 803 803 } 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 - }); 845 + if(cloneAction){ 846 + cloneAction.remove(); 812 812 } 813 - } 814 814 815 - return best; 816 - } 849 + var titleText= 850 + compactText( 851 + clone.textContent 852 + ); 817 817 818 - function groupRows(entries){ 819 - var groups=[]; 854 + if(!titleText){ 855 + return; 856 + } 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 858 + var numberNode= 859 + number.cloneNode(true); 860 + 861 + var actionNode= 862 + action.cloneNode(true); 863 + 864 + var titleNode= 865 + document.createElement( 866 + "span" 827 827 ); 828 - }) 829 - .forEach(function(entry){ 830 - var group=null; 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 - } 869 + titleNode.className= 870 + "sn-area-label-title"; 843 843 844 - if(!group){ 845 - group={ 846 - top:entry.rect.top, 847 - entries:[] 848 - }; 849 - groups.push(group); 850 - } 872 + titleNode.textContent= 873 + titleText; 851 851 852 - group.entries.push(entry); 853 - }); 875 + while(label.firstChild){ 876 + label.removeChild( 877 + label.firstChild 878 + ); 879 + } 854 854 855 - return groups; 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 + }); 856 856 } 857 857 858 - function validRow(group){ 859 - if(group.entries.length<2)return false; 925 + /* ======================================================= 926 + PLACEHOLDER BADGE 927 + ======================================================= */ 860 860 861 - var lefts= 862 - group.entries 863 - .map(function(e){return e.rect.left;}) 864 - .sort(function(a,b){return a-b;}); 929 + function applyPlaceholderBadge(){ 930 + if(!PLACEHOLDER)return; 865 865 866 866 if( 867 - lefts[lefts.length-1]-868 - lefts[0]<869 - 80933 + document.querySelector( 934 + ".sn-coming-soon-badge" 935 + ) 870 870 ){ 871 - return false;937 + return; 872 872 } 873 873 874 - var widths= 875 - group.entries 876 - .map(function(e){return e.rect.width;}) 877 - .filter(function(w){return w>0;}); 940 + var title= 941 + document.querySelector( 942 + "#document-title" 943 + )|| 944 + document.querySelector( 945 + "h1" 946 + ); 878 878 879 - if( widths.length<2)returnfalse;948 + if(!title)return; 880 880 881 - var minW= 882 - Math.min.apply(Math,widths); 950 + var badge= 951 + document.createElement( 952 + "span" 953 + ); 883 883 884 - var maxW=885 - Math.max.apply(Math,widths);955 + badge.className= 956 + "sn-coming-soon-badge"; 886 886 887 - return ( 888 - maxW/ 889 - Math.max(1,minW)<= 890 - 1.9 958 + badge.textContent= 959 + PLACEHOLDER_LABEL; 960 + 961 + badge.setAttribute( 962 + "aria-label", 963 + PLACEHOLDER_LABEL 891 891 ); 892 - } 893 893 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" 966 + title.appendChild( 967 + badge 911 911 ); 912 912 } 913 913 914 - functionfindKnownBar(card){915 - varcardRect=916 - card.getBoundingClientRect();971 + /* ======================================================= 972 + DETAIL PAGE OWN-ACCENT PROPAGATION 973 + ======================================================= */ 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; 975 + function parseRGB(value){ 976 + var match=String(value||"").match( 977 + /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i 978 + ); 927 927 928 - varr=el.getBoundingClientRect();980 + if(!match)return null; 929 929 930 - var rel= 931 - r.top- 932 - cardRect.top; 982 + return [ 983 + Number(match[1]), 984 + Number(match[2]), 985 + Number(match[3]) 986 + ]; 987 + } 933 933 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; 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 + ); 948 948 } 949 949 950 - function alignKnownBars(cards){ 951 - var rows= 952 - cards.map(function(card){ 953 - var bar= 954 - findKnownBar(card); 997 + function paletteMatch(cssColor){ 998 + var rgb=parseRGB(cssColor); 955 955 956 - if(!bar)return null;1000 + if(!rgb)return null; 957 957 958 - var cr= 959 - card.getBoundingClientRect(); 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 + ]; 960 960 961 - var br=962 - bar.getBoundingClientRect();1009 + var best=null; 1010 + var bestDistance=Infinity; 963 963 964 - return { 965 - bar:bar, 966 - relativeTop: 967 - br.top- 968 - cr.top 969 - }; 970 - }); 1012 + palette.forEach(function(item){ 1013 + var d=distance(rgb,item.rgb); 971 971 972 - if( 973 - rows.some(function(row){ 974 - return !row; 975 - }) 976 - ){ 977 - return false; 978 - } 1015 + if(d<bestDistance){ 1016 + best=item; 1017 + bestDistance=d; 1018 + } 1019 + }); 979 979 980 - var target= 981 - Math.max.apply( 982 - Math, 983 - rows.map(function(row){ 984 - return row.relativeTop; 985 - }) 986 - ); 1021 + return bestDistance<=30 1022 + ?best 1023 + :null; 1024 + } 987 987 988 - rows.forEach(function(row){ 989 - var delta= 990 - target- 991 - row.relativeTop; 1026 + function propagateDetailAccents(){ 1027 + if(PAGE_KIND!=="detail")return; 992 992 993 - if(delta<=1)return; 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; 994 994 995 - saveOriginal( 996 - row.bar, 997 - originalMarginTop, 998 - "margin-top" 999 - ); 1037 + var style=getComputedStyle(el); 1000 1000 1001 - var current= 1002 - num( 1003 - getComputedStyle( 1004 - row.bar 1005 - ).marginTop 1006 - ); 1039 + if( 1040 + num(style.borderTopWidth)>=2 1041 + ){ 1042 + var match= 1043 + paletteMatch( 1044 + style.borderTopColor 1045 + ); 1007 1007 1008 - row.bar.style.setProperty( 1009 - "margin-top", 1010 - ( 1011 - current+ 1012 - delta 1013 - )+"px" 1014 - ); 1047 + if(match){ 1048 + el.style.setProperty( 1049 + "border-left", 1050 + "4px solid "+match.hex, 1051 + "important" 1052 + ); 1053 + } 1054 + } 1055 + }); 1015 1015 1016 - row.bar.setAttribute( 1017 - "data-sn-first-section-aligned", 1018 - "7" 1019 - ); 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; 1020 1020 1021 - sectionManaged.add( 1022 - row.bar 1066 + el.style.setProperty( 1067 + "border-left", 1068 + "4px solid #e94b13", 1069 + "important" 1023 1023 ); 1024 1024 }); 1025 1025 1026 - return true; 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" 1085 + ); 1086 + }); 1027 1027 } 1028 1028 1029 - /* ---------- Generic first content after heading ---------- */ 1089 + /* ======================================================= 1090 + OVERVIEW SEMANTIC THEME PALETTE 1091 + ======================================================= */ 1030 1030 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 - ) 1093 + function smallestThemeHeaders(){ 1094 + return Array.from( 1095 + root.querySelectorAll( 1096 + "div,span,p,strong,h3,h4,h5,h6" 1040 1040 ) 1041 - .filter(function(el){ 1042 - if(!visible(el,20,8))return false; 1098 + ).filter(function(el){ 1099 + if(!visible(el))return false; 1100 + if(!themeFor(el.textContent))return false; 1043 1043 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 - ) 1102 + return !Array.from( 1103 + el.children||[] 1104 + ).some(function(child){ 1105 + return !!themeFor( 1106 + child.textContent 1057 1057 ); 1058 - }) 1059 - .sort(function(a,b){ 1060 - return ( 1061 - a.getBoundingClientRect().top- 1062 - b.getBoundingClientRect().top 1063 - ); 1064 1064 }); 1065 - 1066 - return rows[0]||null; 1109 + }); 1067 1067 } 1068 1068 1069 - function firstContent(card,h){ 1070 - if(!h)return null; 1112 + function findOverviewCard(header){ 1113 + var node=header.parentElement; 1114 + var candidates=[]; 1071 1071 1072 - var cr= 1073 - card.getBoundingClientRect(); 1116 + while(node&&node!==root){ 1117 + var rect=node.getBoundingClientRect(); 1118 + var style=getComputedStyle(node); 1074 1074 1075 - var hr= 1076 - h.getBoundingClientRect(); 1120 + var border= 1121 + num(style.borderTopWidth)+ 1122 + num(style.borderRightWidth)+ 1123 + num(style.borderBottomWidth)+ 1124 + num(style.borderLeftWidth); 1077 1077 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 - } 1126 + if( 1127 + rect.width>=220&& 1128 + rect.width<=800&& 1129 + rect.height>=120&& 1130 + border>=1 1131 + ){ 1132 + candidates.push(node); 1133 + } 1092 1092 1093 - if(!visible(el,30,8))return false; 1135 + node=node.parentElement; 1136 + } 1094 1094 1095 - var text= 1096 - String(el.textContent||"") 1097 - .replace(/\s+/g," ") 1098 - .trim(); 1138 + if(!candidates.length)return null; 1099 1099 1100 - if(text.length<3)return false; 1140 + candidates.sort(function(a,b){ 1141 + return ( 1142 + b.getBoundingClientRect().height- 1143 + a.getBoundingClientRect().height 1144 + ); 1145 + }); 1101 1101 1102 - var r=el.getBoundingClientRect(); 1147 + return candidates[0]; 1148 + } 1103 1103 1104 - if( 1105 - r.top< 1106 - hr.bottom-1 1107 - ){ 1108 - return false; 1109 - } 1150 + function rowCandidates(link,card){ 1151 + var result=[]; 1152 + var cardRect= 1153 + card.getBoundingClientRect(); 1110 1110 1111 - if( 1112 - r.top-cr.top> 1113 - Math.min( 1114 - 280, 1115 - cr.height*.65 1116 - ) 1117 - ){ 1118 - return false; 1119 - } 1155 + var node=link; 1120 1120 1157 + while(node&&node!==card){ 1158 + if(visible(node)){ 1159 + var rect= 1160 + node.getBoundingClientRect(); 1161 + 1121 1121 if( 1122 - r.height> 1123 - cr.height*.58 1163 + rect.height<=105&& 1164 + rect.width>= 1165 + cardRect.width*.50&& 1166 + rect.width<= 1167 + cardRect.width*1.03 1124 1124 ){ 1125 - re turn false;1169 + result.push(node); 1126 1126 } 1171 + } 1127 1127 1128 - return true; 1129 - }) 1130 - .sort(function(a,b){ 1131 - var ar= 1132 - a.getBoundingClientRect(); 1173 + node=node.parentElement; 1174 + } 1133 1133 1134 - varbr=1135 - b.getBoundingClientRect();1176 + return result; 1177 + } 1136 1136 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){ 1137 1137 return ( 1138 - ar.top-br.top|| 1139 - ar.height-br.height 1190 + num( 1191 + getComputedStyle(el) 1192 + .borderLeftWidth 1193 + )>=1 1140 1140 ); 1141 1141 }); 1142 1142 1143 - return rows[0]||null; 1144 - } 1197 + var pool= 1198 + bordered.length 1199 + ?bordered 1200 + :candidates; 1145 1145 1146 - function alignGeneric(cards){ 1147 - var rows= 1148 - cards.map(function(card){ 1149 - var h= 1150 - heading(card); 1202 + pool.sort(function(a,b){ 1203 + var ar= 1204 + a.getBoundingClientRect(); 1151 1151 1152 - var c= 1153 - firstContent( 1154 - card, 1155 - h 1156 - ); 1206 + var br= 1207 + b.getBoundingClientRect(); 1157 1157 1158 - if(!h||!c)return null; 1209 + return ( 1210 + ar.left-br.left|| 1211 + br.width-ar.width 1212 + ); 1213 + }); 1159 1159 1160 - varcr=1161 - card.getBoundingClientRect();1215 + return pool[0]||link; 1216 + } 1162 1162 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; 1218 + function applyOverviewPalette(){ 1219 + if(PAGE_KIND!=="overview"){ 1220 + return []; 1179 1179 } 1180 1180 1181 - var target= 1182 - Math.max.apply( 1183 - Math, 1184 - rows.map(function(row){ 1185 - return row.relativeTop; 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 + }; 1186 1186 }) 1187 - ); 1238 + .filter(function(row){ 1239 + return !!row.card; 1240 + }); 1188 1188 1189 - rows.forEach(function(row){ 1190 - var delta= 1191 - target- 1192 - row.relativeTop; 1242 + var unique=[]; 1243 + var seenHeaders=new Set(); 1193 1193 1194 - if(delta<=1)return; 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 + ); 1195 1195 1196 - sa veOriginal(1197 - r ow.content,1198 - originalMarginTop,1199 - "margin-top"1200 - );1261 + if(!seenHeaders.has(key)){ 1262 + seenHeaders.add(key); 1263 + unique.push(row); 1264 + } 1265 + }); 1201 1201 1202 - var current= 1203 - num( 1204 - getComputedStyle( 1205 - row.content 1206 - ).marginTop 1207 - ); 1267 + unique.forEach(function(row){ 1268 + var headerRect= 1269 + row.el 1270 + .getBoundingClientRect(); 1208 1208 1209 - row.content.style.setProperty( 1210 - "margin-top", 1211 - ( 1212 - current+ 1213 - delta 1214 - )+"px" 1272 + row.el.style.setProperty( 1273 + "background", 1274 + row.theme.bg, 1275 + "important" 1215 1215 ); 1216 1216 1217 - row.content.setAttribute( 1218 - "data-sn-first-content-aligned", 1219 - "7" 1278 + row.el.style.setProperty( 1279 + "color", 1280 + row.theme.text, 1281 + "important" 1220 1220 ); 1221 1221 1222 - contentManaged.add( 1223 - row.content 1284 + row.el.style.setProperty( 1285 + "text-align", 1286 + "left", 1287 + "important" 1224 1224 ); 1289 + 1290 + row.el.style.setProperty( 1291 + "word-spacing", 1292 + "normal", 1293 + "important" 1294 + ); 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 + }); 1225 1225 }); 1226 1226 1227 - return true;1377 + return unique; 1228 1228 } 1229 1229 1230 - function applyRow(group){ 1231 - if(!validRow(group))return false; 1380 + /* ======================================================= 1381 + OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW 1382 + ======================================================= */ 1232 1232 1384 + function alignOverviewCards(headers){ 1385 + if( 1386 + PAGE_KIND!=="overview"|| 1387 + window.innerWidth<=MOBILE_MAX 1388 + ){ 1389 + return; 1390 + } 1391 + 1233 1233 var cards=[]; 1234 1234 var seen=new Set(); 1235 1235 1236 - group.entries.forEach(function(entry){1237 - if(!seen.has( entry.target)){1238 - seen.add( entry.target);1239 - cards.push( entry.target);1395 + headers.forEach(function(row){ 1396 + if(!seen.has(row.card)){ 1397 + seen.add(row.card); 1398 + cards.push(row.card); 1240 1240 } 1241 1241 }); 1242 1242 1243 - if(cards.length<2)return false; 1244 - 1245 - if( 1246 - !alignKnownBars(cards) 1247 - ){ 1248 - alignGeneric(cards); 1402 + if(cards.length<2){ 1403 + return; 1249 1249 } 1250 1250 1251 - var maxHeight=0; 1406 + // Group cards by actual top position. 1407 + var groups=[]; 1252 1252 1253 1253 cards.forEach(function(card){ 1254 - maxHeight= 1255 - Math.max( 1256 - maxHeight, 1257 - card.getBoundingClientRect().height 1258 - ); 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); 1259 1259 }); 1260 1260 1261 - maxHeight=1262 - Math.ceil(1263 - maxHeight1264 - );1437 + groups.forEach(function(group){ 1438 + if(group.cards.length<2){ 1439 + return; 1440 + } 1265 1265 1266 - if(maxHeight<MIN_H)return false; 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 + }); 1267 1267 1268 - cards.forEach(function(card){ 1269 - saveOriginal( 1270 - card, 1271 - originalMinHeight, 1272 - "min-height" 1273 - ); 1460 + return candidates.length 1461 + ?candidates[0] 1462 + :null; 1463 + }); 1274 1274 1275 - card.style.setProperty( 1276 - "min-height", 1277 - maxHeight+"px" 1278 - ); 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 + ); 1279 1279 1280 - card.setAttribute( 1281 - "data-sn-equal-height-managed", 1282 - "7" 1283 - ); 1485 + firstHeaders.forEach(function(row){ 1486 + var relativeTop= 1487 + row.el 1488 + .getBoundingClientRect() 1489 + .top- 1490 + row.card 1491 + .getBoundingClientRect() 1492 + .top; 1284 1284 1285 - heightManaged.add(card);1286 - });1494 + var delta= 1495 + targetTop-relativeTop; 1287 1287 1288 - return true; 1289 - } 1497 + if(delta>1){ 1498 + saveStyle( 1499 + row.el, 1500 + originalMargin, 1501 + "margin-top" 1502 + ); 1290 1290 1291 - function calculate(force){ 1292 - if(applying)return; 1504 + var current= 1505 + num( 1506 + getComputedStyle( 1507 + row.el 1508 + ).marginTop 1509 + ); 1293 1293 1294 - var width= 1295 - Math.round( 1296 - window.innerWidth 1297 - ); 1511 + row.el.style.setProperty( 1512 + "margin-top", 1513 + ( 1514 + current+delta 1515 + )+"px" 1516 + ); 1298 1298 1299 - var meaningful= 1300 - lastWidth<0|| 1301 - Math.abs( 1302 - width- 1303 - lastWidth 1304 - )>= 1305 - MIN_WIDTH_CHANGE; 1518 + row.el.setAttribute( 1519 + "data-sn-master-first-row", 1520 + "1" 1521 + ); 1306 1306 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(){ 1307 1307 if( 1308 - hasApplied&& 1309 - !force&& 1310 - !meaningful 1575 + PAGE_KIND!=="detail"|| 1576 + window.innerWidth<=MOBILE_MAX 1311 1311 ){ 1312 1312 return; 1313 1313 } 1314 1314 1315 - applying=true; 1581 + var selectors=[ 1582 + ".arsn-grid", 1583 + ".arsn-grid-2", 1584 + ".arsn-grid-3", 1585 + ".dmp-grid", 1586 + ".ido-grid", 1587 + ".pp-grid" 1588 + ]; 1316 1316 1317 - try{ 1318 - harmoniseCustomCallouts(); 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); 1319 1319 1320 - if(width<=MOBILE_MAX){ 1321 - if(hasApplied){ 1322 - resetRuntime(); 1599 + if(children.length<2){ 1600 + return; 1323 1323 } 1324 1324 1325 - hasApplied=false; 1326 - lastWidth=width; 1327 - return; 1328 - } 1603 + var groups=[]; 1329 1329 1330 - if(hasApplied){ 1331 - resetRuntime(); 1332 - } 1605 + children.forEach(function(child){ 1606 + var top= 1607 + child 1608 + .getBoundingClientRect() 1609 + .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 - }); 1611 + var group=null; 1351 1351 1352 - var touched= 1353 - new Set(); 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 + } 1354 1354 1355 - parents.forEach(function(parent){ 1356 - var entries=[]; 1624 + if(!group){ 1625 + group={ 1626 + top:top, 1627 + items:[] 1628 + }; 1629 + groups.push(group); 1630 + } 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 - ){ 1632 + group.items.push(child); 1633 + }); 1634 + 1635 + groups.forEach(function(group){ 1636 + if(group.items.length<2){ 1368 1368 return; 1369 1369 } 1370 1370 1371 - var target= 1372 - pickTarget(child); 1640 + var maxHeight=0; 1373 1373 1374 - if(!target)return; 1375 - 1376 - entries.push({ 1377 - target:target, 1378 - rect: 1379 - target.getBoundingClientRect() 1642 + group.items.forEach(function(item){ 1643 + maxHeight= 1644 + Math.max( 1645 + maxHeight, 1646 + item 1647 + .getBoundingClientRect() 1648 + .height 1649 + ); 1380 1380 }); 1381 - }); 1382 1382 1383 - groupRows( 1384 - entries 1385 - ).forEach(function(group){ 1386 - if(!validRow(group))return; 1652 + maxHeight= 1653 + Math.ceil(maxHeight); 1387 1387 1388 - var targets= 1389 - group.entries.map(function(entry){ 1390 - return entry.target; 1391 - }); 1655 + group.items.forEach(function(item){ 1656 + saveStyle( 1657 + item, 1658 + originalHeight, 1659 + "min-height" 1660 + ); 1392 1392 1393 - if( 1394 - !targets.some(function(el){ 1395 - return !touched.has(el); 1396 - }) 1397 - ){ 1398 - return; 1399 - } 1662 + item.style.setProperty( 1663 + "min-height", 1664 + maxHeight+"px" 1665 + ); 1400 1400 1401 - if(applyRow(group)){ 1402 - targets.forEach(function(el){ 1403 - touched.add(el); 1404 - }); 1405 - } 1667 + item.setAttribute( 1668 + "data-sn-master-equal-height", 1669 + "1" 1670 + ); 1671 + 1672 + managedHeight.add(item); 1673 + }); 1406 1406 }); 1407 1407 }); 1676 + }); 1677 + } 1408 1408 1409 - lastWidth=width; 1410 - hasApplied=true; 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 + } 1411 1411 }finally{ 1412 - applying=false;1710 + running=false; 1413 1413 } 1414 1414 } 1415 1415 1416 - function resize(){1714 + 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);1725 + run(); 1428 1428 }, 1429 1429 RESIZE_DEBOUNCE 1430 1430 ); 1431 1431 } 1432 1432 1433 - function waitImages(){ 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 + 1434 1434 var images= 1435 1435 Array.from( 1436 1436 root.querySelectorAll("img") 1437 1437 ); 1438 1438 1439 - returnPromise.all(1758 + 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); 1784 + run(); 1493 1493 } 1494 1494 1495 - addEventListener( 1787 + window.addEventListener( 1496 1496 "resize", 1497 - resize,1789 + onResize, 1498 1498 {passive:true} 1499 1499 ); 1500 1500 1501 - i nitial();1793 + waitForReady(); 1502 1502 })(); 1503 1503 </script> 1504 1504 1505 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_END --> 1506 -{{/html}}\n 1797 +<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END --> 1798 +{{/html}} 1799 +