Änderungen von Dokument Art & Research Services Navigator
Zuletzt geändert von Veronika Kocher am Freitag, 18 Sep. 2026 16:47
Von Version 9.3
bearbeitet von Veronika Kocher
am Donnerstag, 03 Sep. 2026 9:34
am Donnerstag, 03 Sep. 2026 9:34
Änderungskommentar:
Es gibt keinen Kommentar für diese Version
Auf Version 7.1
bearbeitet von Veronika Kocher
am Donnerstag, 03 Sep. 2026 8:58
am Donnerstag, 03 Sep. 2026 8:58
Änderungskommentar:
Es gibt keinen Kommentar für diese Version
Zusammenfassung
-
Seiteneigenschaften (1 geändert, 0 hinzugefügt, 0 gelöscht)
Details
- Seiteneigenschaften
-
- Inhalt
-
... ... @@ -2,9 +2,8 @@ 2 2 3 3 Der **Service-Navigator Kunst & Forschung** hilft dir, für jede Phase deines Projekts die passende Orientierung, Services und Ressourcen zu finden. 4 4 5 -{{info title="Unterstützung für dein Projekt :"}}5 +{{info title="Unterstützung für dein Projekt"}} 6 6 7 - 8 8 **Support Kunst und Forschung (SKF)** begleitet Projekt- und Fördervorhaben und arbeitet je nach Bedarf mit den passenden Services der Universität zusammen. 9 9 10 10 Der Navigator führt dich entlang der Projektphasen zu den Angeboten und Ansprechstellen, die für dein Vorhaben relevant sind. ... ... @@ -635,698 +635,3 @@ 635 635 {{/info}} 636 636 ))) 637 637 638 -{{html clean="false"}} 639 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_START --> 640 -<style data-sn-horizontal-box-harmonizer="4"> 641 -[data-sn-equal-height-managed], 642 -[data-sn-first-section-aligned]{ 643 - box-sizing:border-box; 644 -} 645 -</style> 646 -<script data-sn-horizontal-box-harmonizer="4"> 647 -(function(){ 648 - "use strict"; 649 - 650 - var MOBILE_MAX=767; 651 - var ROW_TOLERANCE=6; 652 - var MIN_W=150; 653 - var MIN_H=36; 654 - var MAX_PARENT_CHILDREN=16; 655 - var SEARCH_DEPTH=5; 656 - 657 - var root= 658 - document.getElementById("xwikicontent")|| 659 - document.querySelector(".xwiki-rendering-content")|| 660 - document.querySelector("main")|| 661 - document.body; 662 - 663 - if(!root)return; 664 - 665 - var heightManaged=new Set(); 666 - var sectionManaged=new Set(); 667 - var originalMinHeight=new WeakMap(); 668 - var originalMarginTop=new WeakMap(); 669 - var raf=0; 670 - 671 - function num(v){ 672 - var n=parseFloat(v); 673 - return Number.isFinite(n)?n:0; 674 - } 675 - 676 - function visible(el,minW,minH){ 677 - if(!el||el.nodeType!==1)return false; 678 - 679 - var s=getComputedStyle(el); 680 - 681 - if( 682 - s.display==="none"|| 683 - s.visibility==="hidden"|| 684 - Number(s.opacity)===0 685 - ){ 686 - return false; 687 - } 688 - 689 - var r=el.getBoundingClientRect(); 690 - 691 - return ( 692 - r.width>=(minW||1)&& 693 - r.height>=(minH||1) 694 - ); 695 - } 696 - 697 - function excluded(el){ 698 - return ( 699 - !el.matches|| 700 - el.matches( 701 - "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]" 702 - ) 703 - ); 704 - } 705 - 706 - function namedLikeBox(el){ 707 - var c= 708 - typeof el.className==="string" 709 - ? el.className 710 - : ""; 711 - 712 - return /(^|[s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([s_-]|$)/i.test(c); 713 - } 714 - 715 - function boxLike(el){ 716 - if(!visible(el,MIN_W,MIN_H)||excluded(el))return false; 717 - 718 - var s=getComputedStyle(el); 719 - var r=el.getBoundingClientRect(); 720 - 721 - var border= 722 - num(s.borderTopWidth)+ 723 - num(s.borderRightWidth)+ 724 - num(s.borderBottomWidth)+ 725 - num(s.borderLeftWidth); 726 - 727 - var radius=Math.max( 728 - num(s.borderTopLeftRadius), 729 - num(s.borderTopRightRadius), 730 - num(s.borderBottomLeftRadius), 731 - num(s.borderBottomRightRadius) 732 - ); 733 - 734 - var bg= 735 - s.backgroundColor&& 736 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&& 737 - s.backgroundColor!=="transparent"; 738 - 739 - var shadow= 740 - s.boxShadow&& 741 - s.boxShadow!=="none"; 742 - 743 - return ( 744 - namedLikeBox(el)|| 745 - border>=1|| 746 - (bg&&radius>=3)|| 747 - (shadow&&r.width>=180) 748 - ); 749 - } 750 - 751 - function saveOriginal(el,map,property){ 752 - if(map.has(el))return; 753 - 754 - map.set(el,{ 755 - value:el.style.getPropertyValue(property), 756 - priority:el.style.getPropertyPriority(property) 757 - }); 758 - } 759 - 760 - function restoreOriginal(el,map,property){ 761 - var original=map.get(el); 762 - 763 - if(original&&original.value){ 764 - el.style.setProperty( 765 - property, 766 - original.value, 767 - original.priority||"" 768 - ); 769 - }else{ 770 - el.style.removeProperty(property); 771 - } 772 - } 773 - 774 - function reset(){ 775 - heightManaged.forEach(function(el){ 776 - restoreOriginal( 777 - el, 778 - originalMinHeight, 779 - "min-height" 780 - ); 781 - 782 - el.removeAttribute( 783 - "data-sn-equal-height-managed" 784 - ); 785 - }); 786 - 787 - sectionManaged.forEach(function(el){ 788 - restoreOriginal( 789 - el, 790 - originalMarginTop, 791 - "margin-top" 792 - ); 793 - 794 - el.removeAttribute( 795 - "data-sn-first-section-aligned" 796 - ); 797 - }); 798 - 799 - heightManaged.clear(); 800 - sectionManaged.clear(); 801 - } 802 - 803 - function pickTarget(child){ 804 - if(!visible(child,MIN_W,MIN_H))return null; 805 - 806 - if(boxLike(child)){ 807 - return child; 808 - } 809 - 810 - var cr=child.getBoundingClientRect(); 811 - var q=[]; 812 - 813 - Array.from(child.children||[]).forEach(function(el){ 814 - q.push({el:el,depth:1}); 815 - }); 816 - 817 - var best=null; 818 - var bestScore=-Infinity; 819 - 820 - while(q.length){ 821 - var item=q.shift(); 822 - var el=item.el; 823 - 824 - if(!visible(el,MIN_W,MIN_H))continue; 825 - 826 - var r=el.getBoundingClientRect(); 827 - 828 - if( 829 - r.width>=cr.width*.68&& 830 - boxLike(el) 831 - ){ 832 - var widthFit= 833 - 1-Math.min( 834 - 1, 835 - Math.abs(cr.width-r.width)/ 836 - Math.max(1,cr.width) 837 - ); 838 - 839 - var topFit= 840 - 1-Math.min( 841 - 1, 842 - Math.abs(cr.top-r.top)/100 843 - ); 844 - 845 - var score= 846 - widthFit*6+ 847 - topFit*3+ 848 - Math.min(r.height,900)/450+ 849 - Math.min(r.width*r.height,900000)/900000; 850 - 851 - if(score>bestScore){ 852 - best=el; 853 - bestScore=score; 854 - } 855 - } 856 - 857 - if(item.depth<SEARCH_DEPTH){ 858 - Array.from(el.children||[]).forEach(function(next){ 859 - q.push({ 860 - el:next, 861 - depth:item.depth+1 862 - }); 863 - }); 864 - } 865 - } 866 - 867 - return best; 868 - } 869 - 870 - function groupsByVisualRow(entries){ 871 - var groups=[]; 872 - 873 - entries 874 - .slice() 875 - .sort(function(a,b){ 876 - return ( 877 - a.rect.top-b.rect.top|| 878 - a.rect.left-b.rect.left 879 - ); 880 - }) 881 - .forEach(function(entry){ 882 - var group=null; 883 - 884 - for(var i=0;i<groups.length;i++){ 885 - if( 886 - Math.abs( 887 - groups[i].top- 888 - entry.rect.top 889 - )<=ROW_TOLERANCE 890 - ){ 891 - group=groups[i]; 892 - break; 893 - } 894 - } 895 - 896 - if(!group){ 897 - group={ 898 - top:entry.rect.top, 899 - entries:[] 900 - }; 901 - groups.push(group); 902 - } 903 - 904 - group.entries.push(entry); 905 - }); 906 - 907 - return groups; 908 - } 909 - 910 - function validHorizontalGroup(group){ 911 - if(group.entries.length<2)return false; 912 - 913 - var lefts= 914 - group.entries 915 - .map(function(e){return e.rect.left;}) 916 - .sort(function(a,b){return a-b;}); 917 - 918 - if( 919 - lefts[lefts.length-1]- 920 - lefts[0]< 921 - 80 922 - ){ 923 - return false; 924 - } 925 - 926 - var widths= 927 - group.entries 928 - .map(function(e){return e.rect.width;}) 929 - .filter(function(w){return w>0;}); 930 - 931 - if(widths.length<2)return false; 932 - 933 - var minWidth=Math.min.apply(Math,widths); 934 - var maxWidth=Math.max.apply(Math,widths); 935 - 936 - return ( 937 - maxWidth/ 938 - Math.max(1,minWidth)<= 939 - 1.9 940 - ); 941 - } 942 - 943 - function normalizeText(text){ 944 - return String(text||"") 945 - .replace(/s+/g," ") 946 - .trim() 947 - .toUpperCase(); 948 - } 949 - 950 - function exactKnownFirstSection(el){ 951 - var text=normalizeText(el.textContent); 952 - 953 - return ( 954 - text==="HIER STARTEN"|| 955 - text==="ORGANISIEREN & DOKUMENTIEREN"|| 956 - text==="ENTSCHEIDEN"|| 957 - text==="START HERE"|| 958 - text==="GET STARTED"|| 959 - text==="ORGANISE & DOCUMENT"|| 960 - text==="ORGANIZE & DOCUMENT"|| 961 - text==="DECIDE" 962 - ); 963 - } 964 - 965 - function visuallyFirstSectionBar(card){ 966 - var cardRect=card.getBoundingClientRect(); 967 - var candidates=[]; 968 - 969 - Array.from( 970 - card.querySelectorAll( 971 - "div,p,span,strong,h3,h4,h5,h6" 972 - ) 973 - ).forEach(function(el){ 974 - if(!visible(el,20,6))return; 975 - if(excluded(el))return; 976 - 977 - var r=el.getBoundingClientRect(); 978 - var relativeTop=r.top-cardRect.top; 979 - 980 - if( 981 - relativeTop<45|| 982 - relativeTop>cardRect.height*.72 983 - ){ 984 - return; 985 - } 986 - 987 - var widthRatio= 988 - r.width/ 989 - Math.max(1,cardRect.width); 990 - 991 - if( 992 - widthRatio<.55|| 993 - widthRatio>1.05|| 994 - r.height>54 995 - ){ 996 - return; 997 - } 998 - 999 - var text=normalizeText(el.textContent); 1000 - 1001 - if( 1002 - text.length<2|| 1003 - text.length>90 1004 - ){ 1005 - return; 1006 - } 1007 - 1008 - var style=getComputedStyle(el); 1009 - 1010 - var bg= 1011 - style.backgroundColor&& 1012 - style.backgroundColor!=="rgba(0, 0, 0, 0)"&& 1013 - style.backgroundColor!=="transparent"; 1014 - 1015 - var border= 1016 - num(style.borderTopWidth)+ 1017 - num(style.borderRightWidth)+ 1018 - num(style.borderBottomWidth)+ 1019 - num(style.borderLeftWidth); 1020 - 1021 - var mostlyUpper= 1022 - text.length>=3&& 1023 - text===text.toUpperCase(); 1024 - 1025 - var exact=exactKnownFirstSection(el); 1026 - 1027 - var score= 1028 - (exact?20:0)+ 1029 - (bg?6:0)+ 1030 - (border>=1?2:0)+ 1031 - (mostlyUpper?4:0)+ 1032 - (num(style.fontWeight)>=600?1:0); 1033 - 1034 - if(score>=7){ 1035 - candidates.push({ 1036 - el:el, 1037 - relativeTop:relativeTop, 1038 - width:r.width, 1039 - score:score 1040 - }); 1041 - } 1042 - }); 1043 - 1044 - if(!candidates.length)return null; 1045 - 1046 - candidates.sort(function(a,b){ 1047 - if(a.score!==b.score)return b.score-a.score; 1048 - if(Math.abs(a.relativeTop-b.relativeTop)>3){ 1049 - return a.relativeTop-b.relativeTop; 1050 - } 1051 - return b.width-a.width; 1052 - }); 1053 - 1054 - // For exact known labels always prefer the earliest exact match. 1055 - var exacts=candidates.filter(function(c){ 1056 - return exactKnownFirstSection(c.el); 1057 - }); 1058 - 1059 - if(exacts.length){ 1060 - exacts.sort(function(a,b){ 1061 - return a.relativeTop-b.relativeTop||b.width-a.width; 1062 - }); 1063 - return exacts[0].el; 1064 - } 1065 - 1066 - // Generic fallback: earliest high-confidence bar. 1067 - candidates.sort(function(a,b){ 1068 - return a.relativeTop-b.relativeTop||b.score-a.score||b.width-a.width; 1069 - }); 1070 - 1071 - return candidates[0].el; 1072 - } 1073 - 1074 - function alignFirstSections(cards){ 1075 - var rows= 1076 - cards.map(function(card){ 1077 - var bar= 1078 - visuallyFirstSectionBar(card); 1079 - 1080 - if(!bar)return null; 1081 - 1082 - var cardRect= 1083 - card.getBoundingClientRect(); 1084 - 1085 - var barRect= 1086 - bar.getBoundingClientRect(); 1087 - 1088 - return { 1089 - card:card, 1090 - bar:bar, 1091 - relativeTop: 1092 - barRect.top-cardRect.top, 1093 - label: 1094 - normalizeText(bar.textContent) 1095 - }; 1096 - }); 1097 - 1098 - // Conservative: only align when every card in the horizontal row 1099 - // has a reliable first section bar. 1100 - if( 1101 - rows.some(function(row){ 1102 - return !row; 1103 - }) 1104 - ){ 1105 - return null; 1106 - } 1107 - 1108 - var targetTop= 1109 - Math.max.apply( 1110 - Math, 1111 - rows.map(function(row){ 1112 - return row.relativeTop; 1113 - }) 1114 - ); 1115 - 1116 - rows.forEach(function(row){ 1117 - var delta= 1118 - targetTop- 1119 - row.relativeTop; 1120 - 1121 - if(delta<=1)return; 1122 - 1123 - saveOriginal( 1124 - row.bar, 1125 - originalMarginTop, 1126 - "margin-top" 1127 - ); 1128 - 1129 - var currentMargin= 1130 - num( 1131 - getComputedStyle( 1132 - row.bar 1133 - ).marginTop 1134 - ); 1135 - 1136 - row.bar.style.setProperty( 1137 - "margin-top", 1138 - ( 1139 - currentMargin+ 1140 - delta 1141 - )+"px" 1142 - ); 1143 - 1144 - row.bar.setAttribute( 1145 - "data-sn-first-section-aligned", 1146 - "4" 1147 - ); 1148 - 1149 - sectionManaged.add(row.bar); 1150 - }); 1151 - 1152 - return { 1153 - labels: 1154 - rows.map(function(row){ 1155 - return row.label; 1156 - }), 1157 - targetRelativeTop: 1158 - Math.round(targetTop) 1159 - }; 1160 - } 1161 - 1162 - function applyGroup(group){ 1163 - if(!validHorizontalGroup(group)){ 1164 - return null; 1165 - } 1166 - 1167 - var cards=[]; 1168 - var seen=new Set(); 1169 - 1170 - group.entries.forEach(function(entry){ 1171 - if(!seen.has(entry.target)){ 1172 - seen.add(entry.target); 1173 - cards.push(entry.target); 1174 - } 1175 - }); 1176 - 1177 - if(cards.length<2)return null; 1178 - 1179 - var firstSection= 1180 - alignFirstSections(cards); 1181 - 1182 - // The section alignment can change natural card heights. 1183 - // Measure only afterwards. 1184 - var maxHeight=0; 1185 - 1186 - cards.forEach(function(card){ 1187 - maxHeight=Math.max( 1188 - maxHeight, 1189 - card.getBoundingClientRect().height 1190 - ); 1191 - }); 1192 - 1193 - maxHeight=Math.ceil(maxHeight); 1194 - 1195 - if(maxHeight<MIN_H)return null; 1196 - 1197 - cards.forEach(function(card){ 1198 - saveOriginal( 1199 - card, 1200 - originalMinHeight, 1201 - "min-height" 1202 - ); 1203 - 1204 - card.style.setProperty( 1205 - "min-height", 1206 - maxHeight+"px" 1207 - ); 1208 - 1209 - card.setAttribute( 1210 - "data-sn-equal-height-managed", 1211 - "4" 1212 - ); 1213 - 1214 - heightManaged.add(card); 1215 - }); 1216 - 1217 - return { 1218 - cards:cards.length, 1219 - height:maxHeight, 1220 - firstSection:firstSection 1221 - }; 1222 - } 1223 - 1224 - function run(){ 1225 - reset(); 1226 - 1227 - if( 1228 - window.innerWidth<=MOBILE_MAX 1229 - ){ 1230 - return; 1231 - } 1232 - 1233 - var parents= 1234 - Array.from( 1235 - root.querySelectorAll("*") 1236 - ).filter(function(parent){ 1237 - return ( 1238 - visible(parent,MIN_W,MIN_H)&& 1239 - parent.children&& 1240 - parent.children.length>=2&& 1241 - parent.children.length<=MAX_PARENT_CHILDREN 1242 - ); 1243 - }); 1244 - 1245 - var touched=new Set(); 1246 - 1247 - parents.forEach(function(parent){ 1248 - var entries=[]; 1249 - 1250 - Array.from(parent.children).forEach(function(child){ 1251 - if(!visible(child,MIN_W,MIN_H))return; 1252 - 1253 - var target=pickTarget(child); 1254 - if(!target)return; 1255 - 1256 - entries.push({ 1257 - target:target, 1258 - rect:target.getBoundingClientRect() 1259 - }); 1260 - }); 1261 - 1262 - if(entries.length<2)return; 1263 - 1264 - groupsByVisualRow(entries).forEach(function(group){ 1265 - if(!validHorizontalGroup(group))return; 1266 - 1267 - var signature= 1268 - group.entries.map(function(entry){ 1269 - return entry.target; 1270 - }); 1271 - 1272 - if( 1273 - !signature.some(function(el){ 1274 - return !touched.has(el); 1275 - }) 1276 - ){ 1277 - return; 1278 - } 1279 - 1280 - var applied= 1281 - applyGroup(group); 1282 - 1283 - if(applied){ 1284 - signature.forEach(function(el){ 1285 - touched.add(el); 1286 - }); 1287 - } 1288 - }); 1289 - }); 1290 - } 1291 - 1292 - function schedule(){ 1293 - if(raf)cancelAnimationFrame(raf); 1294 - 1295 - raf=requestAnimationFrame(function(){ 1296 - raf=requestAnimationFrame(function(){ 1297 - raf=0; 1298 - run(); 1299 - }); 1300 - }); 1301 - } 1302 - 1303 - addEventListener("resize",schedule,{passive:true}); 1304 - addEventListener("load",schedule,{once:true}); 1305 - 1306 - root.addEventListener( 1307 - "click", 1308 - function(){ 1309 - setTimeout(schedule,0); 1310 - }, 1311 - true 1312 - ); 1313 - 1314 - Array.from(root.querySelectorAll("img")).forEach(function(img){ 1315 - if(!img.complete){ 1316 - img.addEventListener("load",schedule,{once:true}); 1317 - } 1318 - }); 1319 - 1320 - if(document.fonts&&document.fonts.ready){ 1321 - document.fonts.ready.then(schedule); 1322 - } 1323 - 1324 - schedule(); 1325 - setTimeout(schedule,200); 1326 - setTimeout(schedule,650); 1327 - setTimeout(schedule,1400); 1328 -})(); 1329 -</script> 1330 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_END --> 1331 -{{/html}} 1332 -