Changes for page Prepare
Last modified by Veronika Kocher on Friday, 18 Sep 2026 16:47
From version 30.4
edited by Veronika Kocher
on Friday, 04 Sep 2026 14:45
on Friday, 04 Sep 2026 14:45
Change comment:
There is no comment for this version
To version 29.7
edited by Veronika Kocher
on Thursday, 03 Sep 2026 9:18
on Thursday, 03 Sep 2026 9:18
Change comment:
There is no comment for this version
Summary
-
Page properties (2 modified, 0 added, 0 removed)
Details
- Page properties
-
- Title
-
... ... @@ -1,1 +1,1 @@ 1 - Prepare1 +Enable - Content
-
... ... @@ -317,7 +317,7 @@ 317 317 <img src="https://xwiki.uni-ak.ac.at/bin/download/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/WebHome/enable.png" alt="Enable — planning and setting up an artistic or research project" /> 318 318 </div> 319 319 <div style="padding:18px 22px 21px 22px;"> 320 - <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:6px;">PROJECT PHASE 1 · PREPARE</div>320 + <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:6px;">PROJECT PHASE 1 · ENABLE</div> 321 321 <h2 style="font-size:28px;line-height:1.18;margin:0 0 9px 0;color:#2c2926;">I develop my project idea — I plan, fund & set up my project</h2> 322 322 <p style="font-size:15px;line-height:1.58;color:#5e5953;max-width:1080px;margin:0;"> 323 323 Before active project work begins, clarify how the project will be organised, funded and supported, ... ... @@ -331,7 +331,7 @@ 331 331 332 332 <div class="arsn-step active"> 333 333 <div class="arsn-step-dot"></div> 334 - <div class="arsn-step-label">1 · PREPARE</div>334 + <div class="arsn-step-label">1 · ENABLE</div> 335 335 <div class="arsn-step-desc">Plan & set up</div> 336 336 </div> 337 337 ... ... @@ -464,18 +464,7 @@ 464 464 <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Work%20%26%20Manage/" class="btn btn-default" style="background:#fff7f1;border-color:#e4cabc;color:#493a34;">Continue to Work & Manage</a> 465 465 </section> 466 466 467 -<!-- ARSN_TRAINING_WORKSHOPS_V2_START --> 468 -<section class="arsn-training-workshops" data-arsn-training-workshops="v2" style="margin:27px 0 22px 0;"> 469 - <div style="padding:16px 18px;background:#eef8fa;border:1px solid #cfe8ef;border-left:5px solid #21b6d7;border-radius:9px;"> 470 - <div style="font-size:12px;font-weight:700;letter-spacing:.075em;text-transform:uppercase;color:#3f6871;margin-bottom:5px;">TRAINING & WORKSHOPS</div> 471 - <h3 style="font-size:20px;line-height:1.3;margin:0 0 7px;color:#35312d;text-align:left;">Training, workshops & consultation sessions</h3> 472 - <p style="margin:0 0 10px;color:#5e5953;line-height:1.55;">Relevant opportunities for this topic will be shown here automatically from the central calendar.</p> 473 - <span data-arsn-coming-soon="true" style="display:inline-block;padding:4px 9px;border-radius:14px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:11px;font-weight:700;letter-spacing:.065em;line-height:1.2;">COMING SOON</span> 474 - </div> 475 -</section> 476 -<!-- ARSN_TRAINING_WORKSHOPS_V2_END --> 477 - 478 -<div style="margin:0 0 13px 0;"> 467 + <div style="margin:0 0 13px 0;"> 479 479 <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:4px;">USEFUL MATERIALS</div> 480 480 <h3 style="font-size:22px;margin:0 0 4px 0;color:#35312d;">Practical resources</h3> 481 481 </div> ... ... @@ -497,132 +497,21 @@ 497 497 {{/html}} 498 498 499 499 {{html clean="false"}} 500 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START --> 501 - 502 -<style data-sn-service-navigator-master="1"> 503 -/* ========================================================= 504 - MASTER TYPOGRAPHY 505 - ========================================================= */ 506 -#xwikicontent h1, 507 -#xwikicontent h2, 508 -#xwikicontent h3, 509 -#xwikicontent h4, 510 -#xwikicontent h5, 511 -#xwikicontent h6, 512 -#xwikicontent .box-title, 513 -#xwikicontent [role="heading"], 514 -#xwikicontent h1 a, 515 -#xwikicontent h2 a, 516 -#xwikicontent h3 a, 517 -#xwikicontent h4 a, 518 -#xwikicontent h5 a, 519 -#xwikicontent h6 a, 520 -#xwikicontent .box-title a, 521 -#xwikicontent [role="heading"] a{ 522 - text-align:left!important; 523 - text-justify:auto!important; 524 - word-spacing:normal!important; 489 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_START --> 490 +<style data-sn-horizontal-box-harmonizer="1"> 491 +[data-sn-equal-height-managed="1"]{box-sizing:border-box} 492 +@media(max-width:767px){ 493 + [data-sn-equal-height-managed="1"]{min-height:0!important} 525 525 } 526 - 527 -/* ========================================================= 528 - COMING SOON / IN VORBEREITUNG 529 - ========================================================= */ 530 -.sn-coming-soon-badge{ 531 - display:inline-block; 532 - vertical-align:middle; 533 - margin-left:10px; 534 - padding:4px 8px; 535 - border-radius:14px; 536 - border:1px solid #efd9cc; 537 - background:#fff4ee; 538 - color:#8a4d36; 539 - font-size:11px; 540 - font-weight:700; 541 - letter-spacing:.055em; 542 - line-height:1.2; 543 - white-space:nowrap; 544 -} 545 - 546 -/* ========================================================= 547 - NATIVE / DETAIL CALLOUT GEOMETRY 548 - Preserve existing backgrounds. 549 - ========================================================= */ 550 -#xwikicontent .arsn-info, 551 -#xwikicontent .dmp-info, 552 -#xwikicontent .ido-info, 553 -#xwikicontent .pp-info, 554 -#xwikicontent .infomessage{ 555 - box-sizing:border-box!important; 556 - border-left:4px solid #21b6d7!important; 557 - border-radius:8px; 558 - text-align:left!important; 559 - word-spacing:normal!important; 560 -} 561 - 562 -#xwikicontent .arsn-warn, 563 -#xwikicontent .dmp-warn, 564 -#xwikicontent .ido-warn, 565 -#xwikicontent .pp-warn, 566 -#xwikicontent .warn, 567 -#xwikicontent .warning, 568 -#xwikicontent .warningmessage, 569 -#xwikicontent .errormessage{ 570 - box-sizing:border-box!important; 571 - border-left:4px solid #e94b13!important; 572 - border-radius:8px; 573 - text-align:left!important; 574 - word-spacing:normal!important; 575 -} 576 - 577 -[data-sn-master-equal-height], 578 -[data-sn-master-first-row]{ 579 - box-sizing:border-box; 580 -} 581 - 582 -/* ========================================================= 583 - FULL-WIDTH THREE-LINE NUMBER / TITLE / SUBTITLE BLOCKS 584 - ========================================================= */ 585 -#xwikicontent .arsn-area-label[data-sn-three-line="1"]{ 586 - display:grid!important; 587 - grid-template-columns:minmax(0,1fr)!important; 588 - grid-auto-rows:auto!important; 589 - width:100%!important; 590 - max-width:none!important; 591 - box-sizing:border-box!important; 592 - justify-items:start!important; 593 - align-items:start!important; 594 - gap:2px!important; 595 - text-align:left!important; 596 - text-align-last:left!important; 597 - text-justify:auto!important; 598 - word-spacing:normal!important; 599 - white-space:normal!important; 600 -} 601 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-number, 602 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .sn-area-label-title, 603 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-action{ 604 - display:block!important; 605 - width:100%!important; 606 - margin:0!important; 607 - text-align:left!important; 608 - text-align-last:left!important; 609 - text-justify:auto!important; 610 - word-spacing:normal!important; 611 - white-space:normal!important; 612 -} 613 613 </style> 614 - 615 -<script data-sn-service-navigator-master="1"> 496 +<script data-sn-horizontal-box-harmonizer="1"> 616 616 (function(){ 617 617 "use strict"; 618 618 619 - var PAGE_KIND="overview"; 620 - var PLACEHOLDER=false; 621 - var PLACEHOLDER_LABEL="COMING SOON"; 622 - 623 623 var MOBILE_MAX=767; 624 - var ROW_TOLERANCE=6; 625 - var RESIZE_DEBOUNCE=220; 501 + var ROW_TOLERANCE=4; 502 + var MIN_W=150; 503 + var MIN_H=36; 626 626 627 627 var root= 628 628 document.getElementById("xwikicontent")|| ... ... @@ -632,1267 +632,212 @@ 632 632 633 633 if(!root)return; 634 634 635 - var managedHeight=new Set(); 636 - var managedMargin=new Set(); 637 - var originalHeight=new WeakMap(); 638 - var originalMargin=new WeakMap(); 513 + var managed=new Set(); 514 + var raf=0; 639 639 640 - var resizeTimer=0; 641 - var running=false; 642 - 643 - var THEMES=[ 644 - { 645 - name:"BLUE", 646 - accent:"#21b6d7", 647 - bg:"#eaf7fb", 648 - text:"#315d68", 649 - labels:[ 650 - "HIER STARTEN", 651 - "ENTSCHEIDEN", 652 - "ÜBERPRÜFEN & ANPASSEN", 653 - "START HERE", 654 - "DECIDE", 655 - "REVIEW & ADAPT" 656 - ] 657 - }, 658 - { 659 - name:"RED", 660 - accent:"#e94b13", 661 - bg:"#fff1ec", 662 - text:"#8a4d36", 663 - labels:[ 664 - "PLANEN & ORGANISIEREN", 665 - "ORGANISIEREN & DOKUMENTIEREN", 666 - "PUBLIZIEREN & PRÄSENTIEREN", 667 - "PLAN & ORGANISE", 668 - "PLAN & ORGANIZE", 669 - "ORGANISE & DOCUMENT", 670 - "ORGANIZE & DOCUMENT", 671 - "PUBLISH & PRESENT" 672 - ] 673 - }, 674 - { 675 - name:"YELLOW", 676 - accent:"#f0aa00", 677 - bg:"#fff8e7", 678 - text:"#785b17", 679 - labels:[ 680 - "SCHÜTZEN & KLÄREN", 681 - "STANDARDISIEREN & IDENTIFIZIEREN", 682 - "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN", 683 - "PROTECT & CLARIFY", 684 - "STANDARDISE & IDENTIFY", 685 - "STANDARDIZE & IDENTIFY", 686 - "OPEN, REUSE & MAKE FINDABLE" 687 - ] 688 - }, 689 - { 690 - name:"GREEN", 691 - accent:"#38b76a", 692 - bg:"#edf9f1", 693 - text:"#3f7451", 694 - labels:[ 695 - "INFRASTRUKTUR EINRICHTEN", 696 - "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN", 697 - "SPEICHERN & ZUGRIFF STEUERN", 698 - "REPOSITORIUM, ERHALTEN & ÜBERGEBEN", 699 - "SET UP INFRASTRUCTURE", 700 - "SET UP INFRASTRUCTURE & COLLABORATION", 701 - "STORE & CONTROL ACCESS", 702 - "REPOSITORY, PRESERVE & HAND OVER" 703 - ] 704 - } 705 - ]; 706 - 707 - function num(value){ 708 - var n=parseFloat(value); 516 + function num(v){ 517 + var n=parseFloat(v); 709 709 return Number.isFinite(n)?n:0; 710 710 } 711 711 712 - function norm(value){ 713 - return String(value||"") 714 - .replace(/\s+/g," ") 715 - .trim() 716 - .toUpperCase(); 717 - } 718 - 719 719 function visible(el){ 720 720 if(!el||el.nodeType!==1)return false; 721 - 722 - var style=getComputedStyle(el); 723 - var rect=el.getBoundingClientRect(); 724 - 725 - return ( 726 - style.display!=="none"&& 727 - style.visibility!=="hidden"&& 728 - rect.width>20&& 729 - rect.height>4 730 - ); 523 + var s=getComputedStyle(el); 524 + if(s.display==="none"||s.visibility==="hidden"||Number(s.opacity)===0)return false; 525 + var r=el.getBoundingClientRect(); 526 + return r.width>=MIN_W&&r.height>=MIN_H; 731 731 } 732 732 733 - function saveStyle(el,map,property){ 734 - if(map.has(el))return; 735 - 736 - map.set(el,{ 737 - value:el.style.getPropertyValue(property), 738 - priority:el.style.getPropertyPriority(property) 739 - }); 740 - } 741 - 742 - function restoreStyle(el,map,property){ 743 - var original=map.get(el); 744 - 745 - if(original&&original.value){ 746 - el.style.setProperty( 747 - property, 748 - original.value, 749 - original.priority||"" 750 - ); 751 - }else{ 752 - el.style.removeProperty(property); 753 - } 754 - } 755 - 756 - function resetRuntime(){ 757 - managedHeight.forEach(function(el){ 758 - restoreStyle( 759 - el, 760 - originalHeight, 761 - "min-height" 762 - ); 763 - el.removeAttribute( 764 - "data-sn-master-equal-height" 765 - ); 766 - }); 767 - 768 - managedMargin.forEach(function(el){ 769 - restoreStyle( 770 - el, 771 - originalMargin, 772 - "margin-top" 773 - ); 774 - el.removeAttribute( 775 - "data-sn-master-first-row" 776 - ); 777 - }); 778 - 779 - managedHeight.clear(); 780 - managedMargin.clear(); 781 - } 782 - 783 - function themeFor(text){ 784 - var value=norm(text); 785 - 786 - for(var i=0;i<THEMES.length;i++){ 787 - for(var j=0;j<THEMES[i].labels.length;j++){ 788 - var label=THEMES[i].labels[j]; 789 - 790 - if( 791 - value===label|| 792 - value.indexOf(label+" ")===0|| 793 - value.indexOf(label+" -")===0|| 794 - value.indexOf(label+" ·")===0 795 - ){ 796 - return THEMES[i]; 797 - } 798 - } 799 - } 800 - 801 - return null; 802 - } 803 - 804 - /* ======================================================= 805 - BORDERLESS FILLED RED/ORANGE CTA BUTTONS 806 - ======================================================= */ 807 - 808 - function colourDistance(a,b){ 809 - return Math.sqrt( 810 - Math.pow(a[0]-b[0],2)+ 811 - Math.pow(a[1]-b[1],2)+ 812 - Math.pow(a[2]-b[2],2) 529 + function excluded(el){ 530 + return !el.matches||el.matches( 531 + "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]" 813 813 ); 814 814 } 815 815 816 - function makeFilledRedOrangeCTAsBorderless(){ 817 - var RED_ORANGE=[233,75,19]; 818 - 819 - Array.from( 820 - root.querySelectorAll( 821 - 'a,button,[role="button"],input[type="submit"],input[type="button"]' 822 - ) 823 - ).forEach(function(el){ 824 - if(!visible(el))return; 825 - 826 - var style=getComputedStyle(el); 827 - var rgb=parseRGB(style.backgroundColor); 828 - 829 - if(!rgb)return; 830 - 831 - if( 832 - colourDistance( 833 - rgb, 834 - RED_ORANGE 835 - )>55 836 - ){ 837 - return; 838 - } 839 - 840 - var rect=el.getBoundingClientRect(); 841 - 842 - if( 843 - rect.width<80|| 844 - rect.height<24 845 - ){ 846 - return; 847 - } 848 - 849 - el.style.setProperty( 850 - "border", 851 - "none", 852 - "important" 853 - ); 854 - 855 - el.style.setProperty( 856 - "border-left", 857 - "none", 858 - "important" 859 - ); 860 - 861 - el.style.setProperty( 862 - "border-top", 863 - "none", 864 - "important" 865 - ); 866 - 867 - el.style.setProperty( 868 - "border-right", 869 - "none", 870 - "important" 871 - ); 872 - 873 - el.style.setProperty( 874 - "border-bottom", 875 - "none", 876 - "important" 877 - ); 878 - 879 - el.style.setProperty( 880 - "box-shadow", 881 - "none", 882 - "important" 883 - ); 884 - }); 535 + function namedLikeBox(el){ 536 + var c=typeof el.className==="string"?el.className:""; 537 + return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c); 885 885 } 886 886 887 - /* ======================================================= 888 - FULL-WIDTH THREE-LINE AREA LABELS 889 - ======================================================= */ 890 - 891 - function compactText(value){ 892 - return String(value||"") 893 - .replace(/\s+/g," ") 894 - .trim(); 895 - } 896 - 897 - function makeThreeLineAreaLabels(){ 898 - Array.from( 899 - root.querySelectorAll( 900 - ".arsn-area-label" 901 - ) 902 - ).forEach(function(label){ 903 - if( 904 - label.getAttribute( 905 - "data-sn-three-line" 906 - )==="1" 907 - ){ 908 - return; 909 - } 910 - 911 - var number= 912 - label.querySelector( 913 - ":scope > .arsn-area-number" 914 - ); 915 - 916 - var action= 917 - label.querySelector( 918 - ":scope > .arsn-area-action" 919 - ); 920 - 921 - if( 922 - !number|| 923 - !action 924 - ){ 925 - return; 926 - } 927 - 928 - var clone= 929 - label.cloneNode(true); 930 - 931 - var cloneNumber= 932 - clone.querySelector( 933 - ":scope > .arsn-area-number" 934 - ); 935 - 936 - var cloneAction= 937 - clone.querySelector( 938 - ":scope > .arsn-area-action" 939 - ); 940 - 941 - if(cloneNumber){ 942 - cloneNumber.remove(); 943 - } 944 - 945 - if(cloneAction){ 946 - cloneAction.remove(); 947 - } 948 - 949 - var titleText= 950 - compactText( 951 - clone.textContent 952 - ); 953 - 954 - if(!titleText){ 955 - return; 956 - } 957 - 958 - var numberNode= 959 - number.cloneNode(true); 960 - 961 - var actionNode= 962 - action.cloneNode(true); 963 - 964 - var titleNode= 965 - document.createElement( 966 - "span" 967 - ); 968 - 969 - titleNode.className= 970 - "sn-area-label-title"; 971 - 972 - titleNode.textContent= 973 - titleText; 974 - 975 - while(label.firstChild){ 976 - label.removeChild( 977 - label.firstChild 978 - ); 979 - } 980 - 981 - label.appendChild( 982 - numberNode 983 - ); 984 - 985 - label.appendChild( 986 - titleNode 987 - ); 988 - 989 - label.appendChild( 990 - actionNode 991 - ); 992 - 993 - label.setAttribute( 994 - "data-sn-three-line", 995 - "1" 996 - ); 997 - 998 - var head= 999 - label.closest( 1000 - ".arsn-area-head" 1001 - ); 1002 - 1003 - if(head){ 1004 - head.style.setProperty( 1005 - "width", 1006 - "100%", 1007 - "important" 1008 - ); 1009 - 1010 - head.style.setProperty( 1011 - "max-width", 1012 - "100%", 1013 - "important" 1014 - ); 1015 - 1016 - head.style.setProperty( 1017 - "box-sizing", 1018 - "border-box", 1019 - "important" 1020 - ); 1021 - } 1022 - }); 1023 - } 1024 - 1025 - /* ======================================================= 1026 - PLACEHOLDER BADGE 1027 - ======================================================= */ 1028 - 1029 - function applyPlaceholderBadge(){ 1030 - if(!PLACEHOLDER)return; 1031 - 1032 - if( 1033 - document.querySelector( 1034 - ".sn-coming-soon-badge" 1035 - ) 1036 - ){ 1037 - return; 1038 - } 1039 - 1040 - var title= 1041 - document.querySelector( 1042 - "#document-title" 1043 - )|| 1044 - document.querySelector( 1045 - "h1" 1046 - ); 1047 - 1048 - if(!title)return; 1049 - 1050 - var badge= 1051 - document.createElement( 1052 - "span" 1053 - ); 1054 - 1055 - badge.className= 1056 - "sn-coming-soon-badge"; 1057 - 1058 - badge.textContent= 1059 - PLACEHOLDER_LABEL; 1060 - 1061 - badge.setAttribute( 1062 - "aria-label", 1063 - PLACEHOLDER_LABEL 540 + function boxLike(el){ 541 + if(!visible(el)||excluded(el))return false; 542 + var s=getComputedStyle(el); 543 + var r=el.getBoundingClientRect(); 544 + var border= 545 + num(s.borderTopWidth)+num(s.borderRightWidth)+ 546 + num(s.borderBottomWidth)+num(s.borderLeftWidth); 547 + var radius=Math.max( 548 + num(s.borderTopLeftRadius),num(s.borderTopRightRadius), 549 + num(s.borderBottomLeftRadius),num(s.borderBottomRightRadius) 1064 1064 ); 1065 - 1066 - title.appendChild( 1067 - badge 1068 - ); 551 + var bg=s.backgroundColor&&s.backgroundColor!=="rgba(0, 0, 0, 0)"&&s.backgroundColor!=="transparent"; 552 + var shadow=s.boxShadow&&s.boxShadow!=="none"; 553 + return namedLikeBox(el)||border>=1||(bg&&radius>=3)||(shadow&&r.width>=180); 1069 1069 } 1070 1070 1071 - /*=======================================================1072 - DETAIL PAGE OWN-ACCENT PROPAGATION1073 - ======================================================= */556 + function pickTarget(child){ 557 + if(!visible(child))return null; 558 + if(boxLike(child))return child; 1074 1074 1075 - function parseRGB(value){ 1076 - var match=String(value||"").match( 1077 - /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i 1078 - ); 1079 - 1080 - if(!match)return null; 1081 - 1082 - return [ 1083 - Number(match[1]), 1084 - Number(match[2]), 1085 - Number(match[3]) 1086 - ]; 1087 - } 1088 - 1089 - function distance(a,b){ 1090 - return Math.sqrt( 1091 - Math.pow(a[0]-b[0],2)+ 1092 - Math.pow(a[1]-b[1],2)+ 1093 - Math.pow(a[2]-b[2],2) 1094 - ); 1095 - } 1096 - 1097 - function paletteMatch(cssColor){ 1098 - var rgb=parseRGB(cssColor); 1099 - 1100 - if(!rgb)return null; 1101 - 1102 - var palette=[ 1103 - {hex:"#21b6d7",rgb:[33,182,215]}, 1104 - {hex:"#e94b13",rgb:[233,75,19]}, 1105 - {hex:"#f0aa00",rgb:[240,170,0]}, 1106 - {hex:"#38b76a",rgb:[56,183,106]} 1107 - ]; 1108 - 1109 - var best=null; 1110 - var bestDistance=Infinity; 1111 - 1112 - palette.forEach(function(item){ 1113 - var d=distance(rgb,item.rgb); 1114 - 1115 - if(d<bestDistance){ 1116 - best=item; 1117 - bestDistance=d; 1118 - } 560 + var cr=child.getBoundingClientRect(); 561 + var q=[]; 562 + Array.from(child.children||[]).forEach(function(el){ 563 + q.push({el:el,depth:1}); 1119 1119 }); 1120 1120 1121 - return bestDistance<=30 1122 - ?best 1123 - :null; 1124 - } 566 + var best=null,bestScore=-1; 1125 1125 1126 - function propagateDetailAccents(){ 1127 - if(PAGE_KIND!=="detail")return; 568 + while(q.length){ 569 + var item=q.shift(); 570 + var el=item.el; 571 + if(!visible(el))continue; 1128 1128 1129 - Array.from( 1130 - root.querySelectorAll( 1131 - ".arsn-call,.dmp-call,.ido-call,.pp-call,"+ 1132 - ".arsn-source,.dmp-source,.ido-source,.pp-source" 1133 - ) 1134 - ).forEach(function(el){ 1135 - if(!visible(el))return; 573 + var r=el.getBoundingClientRect(); 1136 1136 1137 - var style=getComputedStyle(el); 1138 - 1139 - if( 1140 - num(style.borderTopWidth)>=2 1141 - ){ 1142 - var match= 1143 - paletteMatch( 1144 - style.borderTopColor 1145 - ); 1146 - 1147 - if(match){ 1148 - el.style.setProperty( 1149 - "border-left", 1150 - "4px solid "+match.hex, 1151 - "important" 1152 - ); 575 + if(r.width>=cr.width*.72&&boxLike(el)){ 576 + var widthFit=1-Math.min(1,Math.abs(cr.width-r.width)/Math.max(1,cr.width)); 577 + var topFit=1-Math.min(1,Math.abs(cr.top-r.top)/80); 578 + var score=widthFit*5+topFit*2+Math.min(r.height,600)/600; 579 + if(score>bestScore){ 580 + best=el; 581 + bestScore=score; 1153 1153 } 1154 1154 } 1155 - }); 1156 1156 1157 - // Warning families: explicit safety override. 1158 - Array.from( 1159 - root.querySelectorAll( 1160 - ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+ 1161 - ".warn,.warning,.warningmessage,.errormessage" 1162 - ) 1163 - ).forEach(function(el){ 1164 - if(!visible(el))return; 1165 - 1166 - el.style.setProperty( 1167 - "border-left", 1168 - "4px solid #e94b13", 1169 - "important" 1170 - ); 1171 - }); 1172 - 1173 - // Info families: explicit orientation override. 1174 - Array.from( 1175 - root.querySelectorAll( 1176 - ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage" 1177 - ) 1178 - ).forEach(function(el){ 1179 - if(!visible(el))return; 1180 - 1181 - el.style.setProperty( 1182 - "border-left", 1183 - "4px solid #21b6d7", 1184 - "important" 1185 - ); 1186 - }); 1187 - } 1188 - 1189 - /* ======================================================= 1190 - OVERVIEW SEMANTIC THEME PALETTE 1191 - ======================================================= */ 1192 - 1193 - function smallestThemeHeaders(){ 1194 - // Phase overview rule: 1195 - // only explicit three-line area-label blocks carry semantic colour. 1196 - // Ordinary h4 and focus-card headings stay neutral. 1197 - return Array.from( 1198 - root.querySelectorAll( 1199 - ".arsn-area-label" 1200 - ) 1201 - ).filter(function(el){ 1202 - return ( 1203 - visible(el)&& 1204 - !!themeFor( 1205 - el.textContent 1206 - ) 1207 - ); 1208 - }); 1209 - } 1210 - 1211 - function findOverviewCard(header){ 1212 - var node=header.parentElement; 1213 - var candidates=[]; 1214 - 1215 - while(node&&node!==root){ 1216 - var rect=node.getBoundingClientRect(); 1217 - var style=getComputedStyle(node); 1218 - 1219 - var border= 1220 - num(style.borderTopWidth)+ 1221 - num(style.borderRightWidth)+ 1222 - num(style.borderBottomWidth)+ 1223 - num(style.borderLeftWidth); 1224 - 1225 - if( 1226 - rect.width>=220&& 1227 - rect.width<=800&& 1228 - rect.height>=120&& 1229 - border>=1 1230 - ){ 1231 - candidates.push(node); 585 + if(item.depth<3){ 586 + Array.from(el.children||[]).forEach(function(next){ 587 + q.push({el:next,depth:item.depth+1}); 588 + }); 1232 1232 } 1233 - 1234 - node=node.parentElement; 1235 1235 } 1236 1236 1237 - if(!candidates.length)return null; 1238 - 1239 - candidates.sort(function(a,b){ 1240 - return ( 1241 - b.getBoundingClientRect().height- 1242 - a.getBoundingClientRect().height 1243 - ); 1244 - }); 1245 - 1246 - return candidates[0]; 592 + return best; 1247 1247 } 1248 1248 1249 - function rowCandidates(link,card){ 1250 - var result=[]; 1251 - var cardRect= 1252 - card.getBoundingClientRect(); 1253 - 1254 - var node=link; 1255 - 1256 - while(node&&node!==card){ 1257 - if(visible(node)){ 1258 - var rect= 1259 - node.getBoundingClientRect(); 1260 - 1261 - if( 1262 - rect.height<=105&& 1263 - rect.width>= 1264 - cardRect.width*.50&& 1265 - rect.width<= 1266 - cardRect.width*1.03 1267 - ){ 1268 - result.push(node); 1269 - } 1270 - } 1271 - 1272 - node=node.parentElement; 1273 - } 1274 - 1275 - return result; 1276 - } 1277 - 1278 - function chooseOuterRow( 1279 - candidates, 1280 - link 1281 - ){ 1282 - if(!candidates.length){ 1283 - return link; 1284 - } 1285 - 1286 - var bordered= 1287 - candidates.filter(function(el){ 1288 - return ( 1289 - num( 1290 - getComputedStyle(el) 1291 - .borderLeftWidth 1292 - )>=1 1293 - ); 1294 - }); 1295 - 1296 - var pool= 1297 - bordered.length 1298 - ?bordered 1299 - :candidates; 1300 - 1301 - pool.sort(function(a,b){ 1302 - var ar= 1303 - a.getBoundingClientRect(); 1304 - 1305 - var br= 1306 - b.getBoundingClientRect(); 1307 - 1308 - return ( 1309 - ar.left-br.left|| 1310 - br.width-ar.width 1311 - ); 595 + function reset(){ 596 + managed.forEach(function(el){ 597 + el.style.removeProperty("min-height"); 598 + el.removeAttribute("data-sn-equal-height-managed"); 1312 1312 }); 1313 - 1314 - return pool[0]||link; 600 + managed.clear(); 1315 1315 } 1316 1316 1317 - function applyOverviewPalette(){ 1318 - if(PAGE_KIND!=="overview"){ 1319 - return []; 603 + function horizontalLayout(parent){ 604 + if(!visible(parent))return false; 605 + var s=getComputedStyle(parent); 606 + if(s.display==="grid"||s.display==="inline-grid")return true; 607 + if(s.display==="flex"||s.display==="inline-flex"){ 608 + return s.flexDirection==="row"||s.flexDirection==="row-reverse"; 1320 1320 } 1321 - 1322 - var headers= 1323 - smallestThemeHeaders() 1324 - .map(function(el){ 1325 - return { 1326 - el:el, 1327 - theme: 1328 - themeFor( 1329 - el.textContent 1330 - ), 1331 - card: 1332 - findOverviewCard( 1333 - el 1334 - ) 1335 - }; 1336 - }) 1337 - .filter(function(row){ 1338 - return !!row.card; 1339 - }); 1340 - 1341 - var unique=[]; 1342 - var seenHeaders=new Set(); 1343 - 1344 - headers.forEach(function(row){ 1345 - var key= 1346 - row.theme.name+ 1347 - "|"+ 1348 - Math.round( 1349 - row.card 1350 - .getBoundingClientRect() 1351 - .left 1352 - )+ 1353 - "|"+ 1354 - Math.round( 1355 - row.el 1356 - .getBoundingClientRect() 1357 - .top 1358 - ); 1359 - 1360 - if(!seenHeaders.has(key)){ 1361 - seenHeaders.add(key); 1362 - unique.push(row); 1363 - } 1364 - }); 1365 - 1366 - unique.forEach(function(row){ 1367 - var headerRect= 1368 - row.el 1369 - .getBoundingClientRect(); 1370 - 1371 - row.el.style.setProperty( 1372 - "background", 1373 - row.theme.bg, 1374 - "important" 1375 - ); 1376 - 1377 - row.el.style.setProperty( 1378 - "color", 1379 - row.theme.text, 1380 - "important" 1381 - ); 1382 - 1383 - row.el.style.setProperty( 1384 - "text-align", 1385 - "left", 1386 - "important" 1387 - ); 1388 - 1389 - row.el.style.setProperty( 1390 - "word-spacing", 1391 - "normal", 1392 - "important" 1393 - ); 1394 - 1395 - var later= 1396 - unique 1397 - .filter(function(other){ 1398 - return ( 1399 - other.card===row.card&& 1400 - other.el 1401 - .getBoundingClientRect() 1402 - .top> 1403 - headerRect.top+2 1404 - ); 1405 - }) 1406 - .sort(function(a,b){ 1407 - return ( 1408 - a.el 1409 - .getBoundingClientRect() 1410 - .top- 1411 - b.el 1412 - .getBoundingClientRect() 1413 - .top 1414 - ); 1415 - }); 1416 - 1417 - var stopTop= 1418 - later.length 1419 - ?later[0].el 1420 - .getBoundingClientRect() 1421 - .top 1422 - :Infinity; 1423 - 1424 - Array.from( 1425 - row.card.querySelectorAll("a") 1426 - ).forEach(function(link){ 1427 - if(!visible(link))return; 1428 - 1429 - var rect= 1430 - link.getBoundingClientRect(); 1431 - 1432 - if( 1433 - rect.top<= 1434 - headerRect.bottom-2|| 1435 - rect.top>= 1436 - stopTop-2 1437 - ){ 1438 - return; 1439 - } 1440 - 1441 - var candidates= 1442 - rowCandidates( 1443 - link, 1444 - row.card 1445 - ); 1446 - 1447 - var target= 1448 - chooseOuterRow( 1449 - candidates, 1450 - link 1451 - ); 1452 - 1453 - candidates.forEach(function(el){ 1454 - el.style.setProperty( 1455 - "border-left", 1456 - "0 solid transparent", 1457 - "important" 1458 - ); 1459 - }); 1460 - 1461 - target.style.setProperty( 1462 - "border-left", 1463 - "3px solid "+ 1464 - row.theme.accent, 1465 - "important" 1466 - ); 1467 - 1468 - target.style.setProperty( 1469 - "box-sizing", 1470 - "border-box", 1471 - "important" 1472 - ); 1473 - }); 1474 - }); 1475 - 1476 - return unique; 610 + return false; 1477 1477 } 1478 1478 1479 - /* ======================================================= 1480 - OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW 1481 - ======================================================= */ 1482 - 1483 - function alignOverviewCards(headers){ 1484 - if( 1485 - PAGE_KIND!=="overview"|| 1486 - window.innerWidth<=MOBILE_MAX 1487 - ){ 1488 - return; 1489 - } 1490 - 1491 - var cards=[]; 1492 - var seen=new Set(); 1493 - 1494 - headers.forEach(function(row){ 1495 - if(!seen.has(row.card)){ 1496 - seen.add(row.card); 1497 - cards.push(row.card); 1498 - } 1499 - }); 1500 - 1501 - if(cards.length<2){ 1502 - return; 1503 - } 1504 - 1505 - // Group cards by actual top position. 613 + function rowGroups(entries){ 1506 1506 var groups=[]; 1507 - 1508 - cards.forEach(function(card){ 1509 - var top= 1510 - card.getBoundingClientRect().top; 1511 - 615 + entries.slice().sort(function(a,b){ 616 + return a.rect.top-b.rect.top||a.rect.left-b.rect.left; 617 + }).forEach(function(entry){ 1512 1512 var group=null; 1513 - 1514 1514 for(var i=0;i<groups.length;i++){ 1515 - if( 1516 - Math.abs( 1517 - groups[i].top-top 1518 - )<=ROW_TOLERANCE 1519 - ){ 620 + if(Math.abs(groups[i].top-entry.rect.top)<=ROW_TOLERANCE){ 1520 1520 group=groups[i]; 1521 1521 break; 1522 1522 } 1523 1523 } 1524 - 1525 1525 if(!group){ 1526 - group={ 1527 - top:top, 1528 - cards:[] 1529 - }; 626 + group={top:entry.rect.top,entries:[]}; 1530 1530 groups.push(group); 1531 1531 } 1532 - 1533 - group.cards.push(card); 629 + group.entries.push(entry); 1534 1534 }); 631 + return groups; 632 + } 1535 1535 1536 - groups.forEach(function(group){ 1537 - if(group.cards.length<2){ 1538 - return; 1539 - } 634 + function run(){ 635 + reset(); 1540 1540 1541 - var firstHeaders= 1542 - group.cards.map(function(card){ 1543 - var candidates= 1544 - headers 1545 - .filter(function(row){ 1546 - return row.card===card; 1547 - }) 1548 - .sort(function(a,b){ 1549 - return ( 1550 - a.el 1551 - .getBoundingClientRect() 1552 - .top- 1553 - b.el 1554 - .getBoundingClientRect() 1555 - .top 1556 - ); 1557 - }); 637 + if(window.innerWidth<=MOBILE_MAX)return; 1558 1558 1559 - return candidates.length 1560 - ?candidates[0] 1561 - :null; 1562 - }); 639 + var parents=Array.from(root.querySelectorAll("*")).filter(function(el){ 640 + return el.children&&el.children.length>=2&&horizontalLayout(el); 641 + }); 1563 1563 1564 - if( 1565 - !firstHeaders.some(function(row){ 1566 - return !row; 1567 - }) 1568 - ){ 1569 - var targetTop= 1570 - Math.max.apply( 1571 - Math, 1572 - firstHeaders.map(function(row){ 1573 - return ( 1574 - row.el 1575 - .getBoundingClientRect() 1576 - .top- 1577 - row.card 1578 - .getBoundingClientRect() 1579 - .top 1580 - ); 1581 - }) 1582 - ); 643 + parents.forEach(function(parent){ 644 + var entries=[]; 1583 1583 1584 - firstHeaders.forEach(function(row){ 1585 - var relativeTop= 1586 - row.el 1587 - .getBoundingClientRect() 1588 - .top- 1589 - row.card 1590 - .getBoundingClientRect() 1591 - .top; 1592 - 1593 - var delta= 1594 - targetTop-relativeTop; 1595 - 1596 - if(delta>1){ 1597 - saveStyle( 1598 - row.el, 1599 - originalMargin, 1600 - "margin-top" 1601 - ); 1602 - 1603 - var current= 1604 - num( 1605 - getComputedStyle( 1606 - row.el 1607 - ).marginTop 1608 - ); 1609 - 1610 - row.el.style.setProperty( 1611 - "margin-top", 1612 - ( 1613 - current+delta 1614 - )+"px" 1615 - ); 1616 - 1617 - row.el.setAttribute( 1618 - "data-sn-master-first-row", 1619 - "1" 1620 - ); 1621 - 1622 - managedMargin.add( 1623 - row.el 1624 - ); 1625 - } 646 + Array.from(parent.children).forEach(function(child){ 647 + if(!visible(child))return; 648 + var target=pickTarget(child); 649 + if(!target)return; 650 + entries.push({ 651 + target:target, 652 + rect:target.getBoundingClientRect() 1626 1626 }); 1627 - } 1628 - 1629 - var maxHeight=0; 1630 - 1631 - group.cards.forEach(function(card){ 1632 - maxHeight= 1633 - Math.max( 1634 - maxHeight, 1635 - card 1636 - .getBoundingClientRect() 1637 - .height 1638 - ); 1639 1639 }); 1640 1640 1641 - maxHeight= 1642 - Math.ceil(maxHeight); 656 + if(entries.length<2)return; 1643 1643 1644 - group.cards.forEach(function(card){ 1645 - saveStyle( 1646 - card, 1647 - originalHeight, 1648 - "min-height" 1649 - ); 658 + rowGroups(entries).forEach(function(group){ 659 + if(group.entries.length<2)return; 1650 1650 1651 - card.style.setProperty( 1652 - "min-height", 1653 - maxHeight+"px" 1654 - ); 661 + var lefts=group.entries.map(function(e){return e.rect.left;}).sort(function(a,b){return a-b;}); 662 + if(lefts[lefts.length-1]-lefts[0]<80)return; 1655 1655 1656 - card.setAttribute( 1657 - "data-sn-master-equal-height", 1658 - "1" 1659 - ); 664 + var targets=[]; 665 + var seen=new Set(); 1660 1660 1661 - managedHeight.add( 1662 - card 1663 - ); 1664 - }); 1665 - }); 1666 - } 1667 - 1668 - /* ======================================================= 1669 - DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY 1670 - ======================================================= */ 1671 - 1672 - function equaliseDetailGrids(){ 1673 - if( 1674 - PAGE_KIND!=="detail"|| 1675 - window.innerWidth<=MOBILE_MAX 1676 - ){ 1677 - return; 1678 - } 1679 - 1680 - var selectors=[ 1681 - ".arsn-grid", 1682 - ".arsn-grid-2", 1683 - ".arsn-grid-3", 1684 - ".dmp-grid", 1685 - ".ido-grid", 1686 - ".pp-grid" 1687 - ]; 1688 - 1689 - selectors.forEach(function(selector){ 1690 - Array.from( 1691 - root.querySelectorAll(selector) 1692 - ).forEach(function(grid){ 1693 - var children= 1694 - Array.from( 1695 - grid.children||[] 1696 - ).filter(visible); 1697 - 1698 - if(children.length<2){ 1699 - return; 1700 - } 1701 - 1702 - var groups=[]; 1703 - 1704 - children.forEach(function(child){ 1705 - var top= 1706 - child 1707 - .getBoundingClientRect() 1708 - .top; 1709 - 1710 - var group=null; 1711 - 1712 - for(var i=0;i<groups.length;i++){ 1713 - if( 1714 - Math.abs( 1715 - groups[i].top-top 1716 - )<=ROW_TOLERANCE 1717 - ){ 1718 - group=groups[i]; 1719 - break; 1720 - } 667 + group.entries.forEach(function(e){ 668 + if(!seen.has(e.target)){ 669 + seen.add(e.target); 670 + targets.push(e.target); 1721 1721 } 672 + }); 1722 1722 1723 - if(!group){ 1724 - group={ 1725 - top:top, 1726 - items:[] 1727 - }; 1728 - groups.push(group); 1729 - } 674 + if(targets.length<2)return; 1730 1730 1731 - group.items.push(child); 676 + var max=0; 677 + targets.forEach(function(el){ 678 + max=Math.max(max,el.getBoundingClientRect().height); 1732 1732 }); 1733 1733 1734 - groups.forEach(function(group){ 1735 - if(group.items.length<2){ 1736 - return; 1737 - } 681 + max=Math.ceil(max); 682 + if(max<MIN_H)return; 1738 1738 1739 - var maxHeight=0; 1740 - 1741 - group.items.forEach(function(item){ 1742 - maxHeight= 1743 - Math.max( 1744 - maxHeight, 1745 - item 1746 - .getBoundingClientRect() 1747 - .height 1748 - ); 1749 - }); 1750 - 1751 - maxHeight= 1752 - Math.ceil(maxHeight); 1753 - 1754 - group.items.forEach(function(item){ 1755 - saveStyle( 1756 - item, 1757 - originalHeight, 1758 - "min-height" 1759 - ); 1760 - 1761 - item.style.setProperty( 1762 - "min-height", 1763 - maxHeight+"px" 1764 - ); 1765 - 1766 - item.setAttribute( 1767 - "data-sn-master-equal-height", 1768 - "1" 1769 - ); 1770 - 1771 - managedHeight.add(item); 1772 - }); 684 + targets.forEach(function(el){ 685 + el.style.setProperty("min-height",max+"px"); 686 + el.setAttribute("data-sn-equal-height-managed","1"); 687 + managed.add(el); 1773 1773 }); 1774 1774 }); 1775 1775 }); 1776 1776 } 1777 1777 1778 - /* ======================================================= 1779 - RUN / RESPONSIVE SCHEDULING 1780 - ======================================================= */ 1781 - 1782 - function run(){ 1783 - if(running)return; 1784 - 1785 - running=true; 1786 - 1787 - try{ 1788 - resetRuntime(); 1789 - applyPlaceholderBadge(); 1790 - propagateDetailAccents(); 1791 - 1792 - var headers= 1793 - applyOverviewPalette(); 1794 - 1795 - makeThreeLineAreaLabels(); 1796 - makeFilledRedOrangeCTAsBorderless(); 1797 - 1798 - if( 1799 - window.innerWidth> 1800 - MOBILE_MAX 1801 - ){ 1802 - alignOverviewCards( 1803 - headers 1804 - ); 1805 - 1806 - equaliseDetailGrids(); 1807 - } 1808 - }finally{ 1809 - running=false; 1810 - } 693 + function schedule(){ 694 + if(raf)cancelAnimationFrame(raf); 695 + raf=requestAnimationFrame(function(){ 696 + raf=requestAnimationFrame(function(){ 697 + raf=0; 698 + run(); 699 + }); 700 + }); 1811 1811 } 1812 1812 1813 - function onResize(){ 1814 - if(resizeTimer){ 1815 - clearTimeout( 1816 - resizeTimer 1817 - ); 1818 - } 703 + addEventListener("resize",schedule,{passive:true}); 704 + addEventListener("load",schedule,{once:true}); 1819 1819 1820 - resizeTimer= 1821 - setTimeout( 1822 - function(){ 1823 - resizeTimer=0; 1824 - run(); 1825 - }, 1826 - RESIZE_DEBOUNCE 1827 - ); 1828 - } 706 + root.addEventListener("click",function(){ 707 + setTimeout(schedule,0); 708 + },true); 1829 1829 1830 - async function waitForReady(){ 1831 - if( 1832 - document.readyState!=="complete" 1833 - ){ 1834 - await new Promise(function(resolve){ 1835 - window.addEventListener( 1836 - "load", 1837 - resolve, 1838 - {once:true} 1839 - ); 1840 - }); 1841 - } 1842 - 1843 - if( 1844 - document.fonts&& 1845 - document.fonts.ready 1846 - ){ 1847 - try{ 1848 - await document.fonts.ready; 1849 - }catch(error){} 1850 - } 1851 - 1852 - var images= 1853 - Array.from( 1854 - root.querySelectorAll("img") 1855 - ); 1856 - 1857 - await Promise.all( 1858 - images.map(function(img){ 1859 - if(img.complete){ 1860 - return Promise.resolve(); 1861 - } 1862 - 1863 - return new Promise(function(resolve){ 1864 - var done=function(){ 1865 - resolve(); 1866 - }; 1867 - 1868 - img.addEventListener( 1869 - "load", 1870 - done, 1871 - {once:true} 1872 - ); 1873 - 1874 - img.addEventListener( 1875 - "error", 1876 - done, 1877 - {once:true} 1878 - ); 1879 - }); 1880 - }) 1881 - ); 1882 - 1883 - run(); 710 + if(document.fonts&&document.fonts.ready){ 711 + document.fonts.ready.then(schedule); 1884 1884 } 1885 1885 1886 - window.addEventListener( 1887 - "resize", 1888 - onResize, 1889 - {passive:true} 1890 - ); 1891 - 1892 - waitForReady(); 714 + schedule(); 715 + setTimeout(schedule,250); 716 + setTimeout(schedule,900); 1893 1893 })(); 1894 1894 </script> 1895 - 1896 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END --> 719 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_END --> 1897 1897 {{/html}} 1898 1898