Änderungen von Dokument Art & Research Services Navigator

Zuletzt geändert von Veronika Kocher am Freitag, 18 Sep. 2026 16:47

Von Version 9.4
bearbeitet von Veronika Kocher
am Donnerstag, 03 Sep. 2026 10:09
Änderungskommentar: Es gibt keinen Kommentar für diese Version
Auf Version 1.5
bearbeitet von Veronika Kocher
am Mittwoch, 02 Sep. 2026 11:49
Änderungskommentar: Es gibt keinen Kommentar für diese Version

Zusammenfassung

Details

Seiteneigenschaften
Inhalt
... ... @@ -2,18 +2,12 @@
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 +(% style="margin:20px 0 26px 0;" %)
6 +(((
7 +{{box title="Service-Navigator Kunst & Forschung durchsuchen"}}
8 +Gib ein Thema, Synonym oder eine typische Suchanfrage ein. Passende Seiten werden sofort vorgeschlagen. Die Suchbegriffe auf den Themenseiten verwenden dasselbe kontrollierte Vokabular.
6 6  
7 -
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 -
10 - Der Navigator führt dich entlang der Projektphasen zu den Angeboten und Ansprechstellen, die für dein Vorhaben relevant sind.
11 -{{/info}}
12 -
13 13  {{html clean="false"}}
14 -<section data-arsn-search-block-fix="v5" style="margin:20px 0 26px 0;padding:16px 18px;border:1px solid #e3ded6;border-radius:10px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);">
15 - <h2 style="font-size:20px;margin:0 0 6px 0;color:#35312d;">Service-Navigator Kunst &amp; Forschung durchsuchen</h2>
16 - <p style="margin:0 0 12px 0;color:#6a655e;">Gib ein Thema, Synonym oder eine typische Suchanfrage ein. Passende Seiten werden sofort vorgeschlagen. Die Suchbegriffe auf den Themenseiten verwenden dasselbe kontrollierte Vokabular.</p>
17 17  <form
18 18   id="arsn-search-form"
19 19   action="https://xwiki.uni-ak.ac.at/bin/view/Main/SolrSearch"
... ... @@ -336,8 +336,9 @@
336 336   }
337 337  })();
338 338  </script>
339 -</section>
340 340  {{/html}}
334 +{{/box}}
335 +)))
341 341  
342 342  (% style="margin:10px 0 16px 0;color:#6a655e;font-size:13px;" %)
343 343  (((
... ... @@ -626,1129 +626,14 @@
626 626  
627 627  (% style="margin-top:30px;" %)
628 628  (((
629 -== Brauchst du Hilfe beim richtigen Weg? ==
624 +== Brauchst du Unterstützung? ==
630 630  
631 -{{info title="Mit der passenden Stelle starten"}}
632 -Bei **Projektentwicklung, Förderung, Anträgen und der Koordination geförderter Kunst- und Forschungsprojekte** ist **Support Kunst und Forschung** ein guter erster Anlaufpunkt.
626 +{{info title="Services für Kunst & Forschung kontaktieren"}}
627 +Nicht sicher, welche Anforderungen, Services oder nächsten Schritte für dein Projekt gelten?
633 633  
634 -Bei spezifischen Fachfragen führen die Themenseiten direkt zu den passenden Services der Universität. Wenn mehrere Bereiche zusammenkommen, hilft dir der Navigator dabei, die nächsten sinnvollen Schritte einzuordnen.
629 +Nutze das zentrale Kontaktformular für projektspezifische Unterstützung oder kontaktiere den jeweils zuständigen institutionellen Service.
630 +
631 +{{html}}<!-- Redaktion: zentralen Kontaktformular-Link ergänzen, sobald verfügbar. -->{{/html}}
635 635  {{/info}}
636 636  )))
637 637  
638 -\n\n
639 -\n\n{{html clean="false"}}
640 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_START -->
641 -
642 -<style data-sn-horizontal-box-harmonizer="7">
643 -/* ---------- Typography: never justify headings ---------- */
644 -#xwikicontent h1,
645 -#xwikicontent h2,
646 -#xwikicontent h3,
647 -#xwikicontent h4,
648 -#xwikicontent h5,
649 -#xwikicontent h6,
650 -#xwikicontent .box-title,
651 -#xwikicontent [role="heading"],
652 -#xwikicontent h1 a,
653 -#xwikicontent h2 a,
654 -#xwikicontent h3 a,
655 -#xwikicontent h4 a,
656 -#xwikicontent h5 a,
657 -#xwikicontent h6 a,
658 -#xwikicontent .box-title a,
659 -#xwikicontent [role="heading"] a{
660 - text-align:left!important;
661 - text-justify:auto!important;
662 - word-spacing:normal!important;
663 -}
664 -
665 -/* ---------- Native XWiki semantic callouts ---------- */
666 -#xwikicontent .box.infomessage,
667 -#xwikicontent .infomessage,
668 -#xwikicontent .box.warningmessage,
669 -#xwikicontent .warningmessage,
670 -#xwikicontent .box.successmessage,
671 -#xwikicontent .successmessage,
672 -#xwikicontent .box.errormessage,
673 -#xwikicontent .errormessage,
674 -#xwikicontent [data-sn-callout-harmonized="1"]{
675 - box-sizing:border-box!important;
676 - border-radius:8px!important;
677 - border-top:1px solid rgba(0,0,0,.08)!important;
678 - border-right:1px solid rgba(0,0,0,.08)!important;
679 - border-bottom:1px solid rgba(0,0,0,.08)!important;
680 - border-left:4px solid var(--sn-callout-accent,#21b6d7)!important;
681 - padding:14px 16px!important;
682 - text-align:left!important;
683 - text-justify:auto!important;
684 - word-spacing:normal!important;
685 - box-shadow:none!important;
686 -}
687 -
688 -#xwikicontent .box.infomessage,
689 -#xwikicontent .infomessage{
690 - --sn-callout-accent:#21b6d7;
691 - background:#eaf7fb!important;
692 -}
693 -
694 -#xwikicontent .box.warningmessage,
695 -#xwikicontent .warningmessage{
696 - --sn-callout-accent:#f0aa00;
697 - background:#fff8e7!important;
698 -}
699 -
700 -#xwikicontent .box.successmessage,
701 -#xwikicontent .successmessage{
702 - --sn-callout-accent:#38b76a;
703 - background:#edf9f1!important;
704 -}
705 -
706 -#xwikicontent .box.errormessage,
707 -#xwikicontent .errormessage{
708 - --sn-callout-accent:#e94b13;
709 - background:#fff1ec!important;
710 -}
711 -
712 -#xwikicontent [data-sn-callout-harmonized="1"] > :first-child,
713 -#xwikicontent .infomessage > :first-child,
714 -#xwikicontent .warningmessage > :first-child,
715 -#xwikicontent .successmessage > :first-child,
716 -#xwikicontent .errormessage > :first-child{
717 - margin-top:0!important;
718 -}
719 -
720 -#xwikicontent [data-sn-callout-harmonized="1"] > :last-child,
721 -#xwikicontent .infomessage > :last-child,
722 -#xwikicontent .warningmessage > :last-child,
723 -#xwikicontent .successmessage > :last-child,
724 -#xwikicontent .errormessage > :last-child{
725 - margin-bottom:0!important;
726 -}
727 -
728 -#xwikicontent [data-sn-equal-height-managed],
729 -#xwikicontent [data-sn-first-section-aligned],
730 -#xwikicontent [data-sn-first-content-aligned]{
731 - box-sizing:border-box;
732 -}
733 -</style>
734 -
735 -<script data-sn-horizontal-box-harmonizer="7">
736 -(function(){
737 - "use strict";
738 -
739 - var MOBILE_MAX=767;
740 - var ROW_TOLERANCE=6;
741 - var MIN_W=150;
742 - var MIN_H=36;
743 - var MAX_PARENT_CHILDREN=18;
744 - var SEARCH_DEPTH=5;
745 - var RESIZE_DEBOUNCE=220;
746 - var MIN_WIDTH_CHANGE=2;
747 -
748 - var root=
749 - document.getElementById("xwikicontent")||
750 - document.querySelector(".xwiki-rendering-content")||
751 - document.querySelector("main")||
752 - document.body;
753 -
754 - if(!root)return;
755 -
756 - var heightManaged=new Set();
757 - var sectionManaged=new Set();
758 - var contentManaged=new Set();
759 -
760 - var originalMinHeight=new WeakMap();
761 - var originalMarginTop=new WeakMap();
762 -
763 - var resizeTimer=0;
764 - var lastWidth=-1;
765 - var hasApplied=false;
766 - var applying=false;
767 -
768 - function num(v){
769 - var n=parseFloat(v);
770 - return Number.isFinite(n)?n:0;
771 - }
772 -
773 - function visible(el,minW,minH){
774 - if(!el||el.nodeType!==1)return false;
775 -
776 - var s=getComputedStyle(el);
777 -
778 - if(
779 - s.display==="none"||
780 - s.visibility==="hidden"||
781 - Number(s.opacity)===0
782 - ){
783 - return false;
784 - }
785 -
786 - var r=el.getBoundingClientRect();
787 -
788 - return (
789 - r.width>=(minW||1)&&
790 - r.height>=(minH||1)
791 - );
792 - }
793 -
794 - function normalizeText(text){
795 - return String(text||"")
796 - .replace(/\s+/g," ")
797 - .trim()
798 - .toUpperCase();
799 - }
800 -
801 - function excluded(el){
802 - return (
803 - !el.matches||
804 - el.matches(
805 - "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]"
806 - )
807 - );
808 - }
809 -
810 - /* ---------- Custom coloured callouts ---------- */
811 -
812 - function nativeCallout(el){
813 - var c=
814 - typeof el.className==="string"
815 - ? el.className.toLowerCase()
816 - : "";
817 -
818 - return (
819 - /(^|\s)(infomessage|warningmessage|successmessage|errormessage)(\s|$)/.test(c)
820 - );
821 - }
822 -
823 - function customCallout(el){
824 - if(!visible(el,220,42)||excluded(el))return false;
825 -
826 - var r=el.getBoundingClientRect();
827 -
828 - if(r.height>520)return false;
829 -
830 - var s=getComputedStyle(el);
831 -
832 - var bg=
833 - s.backgroundColor&&
834 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&&
835 - s.backgroundColor!=="transparent"&&
836 - s.backgroundColor!=="rgb(255, 255, 255)";
837 -
838 - var left=
839 - num(s.borderLeftWidth);
840 -
841 - return (
842 - bg&&
843 - left>=2
844 - );
845 - }
846 -
847 - function harmoniseCustomCallouts(){
848 - Array.from(
849 - root.querySelectorAll(
850 - "div,aside,section"
851 - )
852 - ).forEach(function(el){
853 - if(nativeCallout(el))return;
854 - if(!customCallout(el))return;
855 -
856 - var s=getComputedStyle(el);
857 -
858 - el.setAttribute(
859 - "data-sn-callout-harmonized",
860 - "1"
861 - );
862 -
863 - if(
864 - s.borderLeftColor
865 - ){
866 - el.style.setProperty(
867 - "--sn-callout-accent",
868 - s.borderLeftColor
869 - );
870 - }
871 - });
872 - }
873 -
874 - /* ---------- Restore only values V7 itself changed ---------- */
875 -
876 - function saveOriginal(el,map,property){
877 - if(map.has(el))return;
878 -
879 - map.set(el,{
880 - value:
881 - el.style.getPropertyValue(
882 - property
883 - ),
884 - priority:
885 - el.style.getPropertyPriority(
886 - property
887 - )
888 - });
889 - }
890 -
891 - function restoreOriginal(el,map,property){
892 - var original=map.get(el);
893 -
894 - if(original&&original.value){
895 - el.style.setProperty(
896 - property,
897 - original.value,
898 - original.priority||""
899 - );
900 - }else{
901 - el.style.removeProperty(
902 - property
903 - );
904 - }
905 - }
906 -
907 - function resetRuntime(){
908 - heightManaged.forEach(function(el){
909 - restoreOriginal(
910 - el,
911 - originalMinHeight,
912 - "min-height"
913 - );
914 -
915 - el.removeAttribute(
916 - "data-sn-equal-height-managed"
917 - );
918 - });
919 -
920 - sectionManaged.forEach(function(el){
921 - restoreOriginal(
922 - el,
923 - originalMarginTop,
924 - "margin-top"
925 - );
926 -
927 - el.removeAttribute(
928 - "data-sn-first-section-aligned"
929 - );
930 - });
931 -
932 - contentManaged.forEach(function(el){
933 - restoreOriginal(
934 - el,
935 - originalMarginTop,
936 - "margin-top"
937 - );
938 -
939 - el.removeAttribute(
940 - "data-sn-first-content-aligned"
941 - );
942 - });
943 -
944 - heightManaged.clear();
945 - sectionManaged.clear();
946 - contentManaged.clear();
947 - }
948 -
949 - /* ---------- Card detection ---------- */
950 -
951 - function namedLikeBox(el){
952 - var c=
953 - typeof el.className==="string"
954 - ? el.className
955 - : "";
956 -
957 - return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c);
958 - }
959 -
960 - function boxLike(el){
961 - if(
962 - !visible(el,MIN_W,MIN_H)||
963 - excluded(el)
964 - ){
965 - return false;
966 - }
967 -
968 - var s=getComputedStyle(el);
969 - var r=el.getBoundingClientRect();
970 -
971 - var border=
972 - num(s.borderTopWidth)+
973 - num(s.borderRightWidth)+
974 - num(s.borderBottomWidth)+
975 - num(s.borderLeftWidth);
976 -
977 - var radius=Math.max(
978 - num(s.borderTopLeftRadius),
979 - num(s.borderTopRightRadius),
980 - num(s.borderBottomLeftRadius),
981 - num(s.borderBottomRightRadius)
982 - );
983 -
984 - var bg=
985 - s.backgroundColor&&
986 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&&
987 - s.backgroundColor!=="transparent";
988 -
989 - var shadow=
990 - s.boxShadow&&
991 - s.boxShadow!=="none";
992 -
993 - return (
994 - namedLikeBox(el)||
995 - border>=1||
996 - (bg&&radius>=3)||
997 - (shadow&&r.width>=180)
998 - );
999 - }
1000 -
1001 - function pickTarget(child){
1002 - if(!visible(child,MIN_W,MIN_H))return null;
1003 -
1004 - if(boxLike(child))return child;
1005 -
1006 - var cr=child.getBoundingClientRect();
1007 - var q=[];
1008 -
1009 - Array.from(child.children||[]).forEach(function(el){
1010 - q.push({el:el,depth:1});
1011 - });
1012 -
1013 - var best=null;
1014 - var bestScore=-Infinity;
1015 -
1016 - while(q.length){
1017 - var item=q.shift();
1018 - var el=item.el;
1019 -
1020 - if(!visible(el,MIN_W,MIN_H))continue;
1021 -
1022 - var r=el.getBoundingClientRect();
1023 -
1024 - if(
1025 - r.width>=cr.width*.68&&
1026 - boxLike(el)
1027 - ){
1028 - var widthFit=
1029 - 1-Math.min(
1030 - 1,
1031 - Math.abs(cr.width-r.width)/
1032 - Math.max(1,cr.width)
1033 - );
1034 -
1035 - var topFit=
1036 - 1-Math.min(
1037 - 1,
1038 - Math.abs(cr.top-r.top)/100
1039 - );
1040 -
1041 - var score=
1042 - widthFit*6+
1043 - topFit*3+
1044 - Math.min(r.height,900)/450+
1045 - Math.min(r.width*r.height,900000)/900000;
1046 -
1047 - if(score>bestScore){
1048 - best=el;
1049 - bestScore=score;
1050 - }
1051 - }
1052 -
1053 - if(item.depth<SEARCH_DEPTH){
1054 - Array.from(el.children||[]).forEach(function(next){
1055 - q.push({
1056 - el:next,
1057 - depth:item.depth+1
1058 - });
1059 - });
1060 - }
1061 - }
1062 -
1063 - return best;
1064 - }
1065 -
1066 - function groupRows(entries){
1067 - var groups=[];
1068 -
1069 - entries
1070 - .slice()
1071 - .sort(function(a,b){
1072 - return (
1073 - a.rect.top-b.rect.top||
1074 - a.rect.left-b.rect.left
1075 - );
1076 - })
1077 - .forEach(function(entry){
1078 - var group=null;
1079 -
1080 - for(var i=0;i<groups.length;i++){
1081 - if(
1082 - Math.abs(
1083 - groups[i].top-
1084 - entry.rect.top
1085 - )<=ROW_TOLERANCE
1086 - ){
1087 - group=groups[i];
1088 - break;
1089 - }
1090 - }
1091 -
1092 - if(!group){
1093 - group={
1094 - top:entry.rect.top,
1095 - entries:[]
1096 - };
1097 - groups.push(group);
1098 - }
1099 -
1100 - group.entries.push(entry);
1101 - });
1102 -
1103 - return groups;
1104 - }
1105 -
1106 - function validRow(group){
1107 - if(group.entries.length<2)return false;
1108 -
1109 - var lefts=
1110 - group.entries
1111 - .map(function(e){return e.rect.left;})
1112 - .sort(function(a,b){return a-b;});
1113 -
1114 - if(
1115 - lefts[lefts.length-1]-
1116 - lefts[0]<
1117 - 80
1118 - ){
1119 - return false;
1120 - }
1121 -
1122 - var widths=
1123 - group.entries
1124 - .map(function(e){return e.rect.width;})
1125 - .filter(function(w){return w>0;});
1126 -
1127 - if(widths.length<2)return false;
1128 -
1129 - var minW=
1130 - Math.min.apply(Math,widths);
1131 -
1132 - var maxW=
1133 - Math.max.apply(Math,widths);
1134 -
1135 - return (
1136 - maxW/
1137 - Math.max(1,minW)<=
1138 - 1.9
1139 - );
1140 - }
1141 -
1142 - /* ---------- Known ARSN first section bars ---------- */
1143 -
1144 - function knownBar(el){
1145 - var text=
1146 - normalizeText(
1147 - el.textContent
1148 - );
1149 -
1150 - return (
1151 - text==="HIER STARTEN"||
1152 - text==="ORGANISIEREN & DOKUMENTIEREN"||
1153 - text==="ENTSCHEIDEN"||
1154 - text==="START HERE"||
1155 - text==="GET STARTED"||
1156 - text==="ORGANISE & DOCUMENT"||
1157 - text==="ORGANIZE & DOCUMENT"||
1158 - text==="DECIDE"
1159 - );
1160 - }
1161 -
1162 - function findKnownBar(card){
1163 - var cardRect=
1164 - card.getBoundingClientRect();
1165 -
1166 - var rows=
1167 - Array.from(
1168 - card.querySelectorAll(
1169 - "div,p,span,strong,h3,h4,h5,h6"
1170 - )
1171 - )
1172 - .filter(function(el){
1173 - if(!visible(el,20,6))return false;
1174 - if(!knownBar(el))return false;
1175 -
1176 - var r=el.getBoundingClientRect();
1177 -
1178 - var rel=
1179 - r.top-
1180 - cardRect.top;
1181 -
1182 - return (
1183 - rel>=35&&
1184 - rel<=
1185 - cardRect.height*.75
1186 - );
1187 - })
1188 - .sort(function(a,b){
1189 - return (
1190 - a.getBoundingClientRect().top-
1191 - b.getBoundingClientRect().top
1192 - );
1193 - });
1194 -
1195 - return rows[0]||null;
1196 - }
1197 -
1198 - function alignKnownBars(cards){
1199 - var rows=
1200 - cards.map(function(card){
1201 - var bar=
1202 - findKnownBar(card);
1203 -
1204 - if(!bar)return null;
1205 -
1206 - var cr=
1207 - card.getBoundingClientRect();
1208 -
1209 - var br=
1210 - bar.getBoundingClientRect();
1211 -
1212 - return {
1213 - bar:bar,
1214 - relativeTop:
1215 - br.top-
1216 - cr.top
1217 - };
1218 - });
1219 -
1220 - if(
1221 - rows.some(function(row){
1222 - return !row;
1223 - })
1224 - ){
1225 - return false;
1226 - }
1227 -
1228 - var target=
1229 - Math.max.apply(
1230 - Math,
1231 - rows.map(function(row){
1232 - return row.relativeTop;
1233 - })
1234 - );
1235 -
1236 - rows.forEach(function(row){
1237 - var delta=
1238 - target-
1239 - row.relativeTop;
1240 -
1241 - if(delta<=1)return;
1242 -
1243 - saveOriginal(
1244 - row.bar,
1245 - originalMarginTop,
1246 - "margin-top"
1247 - );
1248 -
1249 - var current=
1250 - num(
1251 - getComputedStyle(
1252 - row.bar
1253 - ).marginTop
1254 - );
1255 -
1256 - row.bar.style.setProperty(
1257 - "margin-top",
1258 - (
1259 - current+
1260 - delta
1261 - )+"px"
1262 - );
1263 -
1264 - row.bar.setAttribute(
1265 - "data-sn-first-section-aligned",
1266 - "7"
1267 - );
1268 -
1269 - sectionManaged.add(
1270 - row.bar
1271 - );
1272 - });
1273 -
1274 - return true;
1275 - }
1276 -
1277 - /* ---------- Generic first content after heading ---------- */
1278 -
1279 - function heading(card){
1280 - var cr=
1281 - card.getBoundingClientRect();
1282 -
1283 - var rows=
1284 - Array.from(
1285 - card.querySelectorAll(
1286 - "h1,h2,h3,h4,h5,h6,.box-title,[role=heading]"
1287 - )
1288 - )
1289 - .filter(function(el){
1290 - if(!visible(el,20,8))return false;
1291 -
1292 - var r=el.getBoundingClientRect();
1293 -
1294 - var rel=
1295 - r.top-
1296 - cr.top;
1297 -
1298 - return (
1299 - rel>=0&&
1300 - rel<=
1301 - Math.min(
1302 - 160,
1303 - cr.height*.45
1304 - )
1305 - );
1306 - })
1307 - .sort(function(a,b){
1308 - return (
1309 - a.getBoundingClientRect().top-
1310 - b.getBoundingClientRect().top
1311 - );
1312 - });
1313 -
1314 - return rows[0]||null;
1315 - }
1316 -
1317 - function firstContent(card,h){
1318 - if(!h)return null;
1319 -
1320 - var cr=
1321 - card.getBoundingClientRect();
1322 -
1323 - var hr=
1324 - h.getBoundingClientRect();
1325 -
1326 - var rows=
1327 - Array.from(
1328 - card.querySelectorAll(
1329 - "p,div,ul,ol,dl,blockquote"
1330 - )
1331 - )
1332 - .filter(function(el){
1333 - if(
1334 - el===h||
1335 - h.contains(el)||
1336 - el.contains(h)
1337 - ){
1338 - return false;
1339 - }
1340 -
1341 - if(!visible(el,30,8))return false;
1342 -
1343 - var text=
1344 - String(el.textContent||"")
1345 - .replace(/\s+/g," ")
1346 - .trim();
1347 -
1348 - if(text.length<3)return false;
1349 -
1350 - var r=el.getBoundingClientRect();
1351 -
1352 - if(
1353 - r.top<
1354 - hr.bottom-1
1355 - ){
1356 - return false;
1357 - }
1358 -
1359 - if(
1360 - r.top-cr.top>
1361 - Math.min(
1362 - 280,
1363 - cr.height*.65
1364 - )
1365 - ){
1366 - return false;
1367 - }
1368 -
1369 - if(
1370 - r.height>
1371 - cr.height*.58
1372 - ){
1373 - return false;
1374 - }
1375 -
1376 - return true;
1377 - })
1378 - .sort(function(a,b){
1379 - var ar=
1380 - a.getBoundingClientRect();
1381 -
1382 - var br=
1383 - b.getBoundingClientRect();
1384 -
1385 - return (
1386 - ar.top-br.top||
1387 - ar.height-br.height
1388 - );
1389 - });
1390 -
1391 - return rows[0]||null;
1392 - }
1393 -
1394 - function alignGeneric(cards){
1395 - var rows=
1396 - cards.map(function(card){
1397 - var h=
1398 - heading(card);
1399 -
1400 - var c=
1401 - firstContent(
1402 - card,
1403 - h
1404 - );
1405 -
1406 - if(!h||!c)return null;
1407 -
1408 - var cr=
1409 - card.getBoundingClientRect();
1410 -
1411 - var rr=
1412 - c.getBoundingClientRect();
1413 -
1414 - return {
1415 - content:c,
1416 - relativeTop:
1417 - rr.top-cr.top
1418 - };
1419 - });
1420 -
1421 - if(
1422 - rows.some(function(row){
1423 - return !row;
1424 - })
1425 - ){
1426 - return false;
1427 - }
1428 -
1429 - var target=
1430 - Math.max.apply(
1431 - Math,
1432 - rows.map(function(row){
1433 - return row.relativeTop;
1434 - })
1435 - );
1436 -
1437 - rows.forEach(function(row){
1438 - var delta=
1439 - target-
1440 - row.relativeTop;
1441 -
1442 - if(delta<=1)return;
1443 -
1444 - saveOriginal(
1445 - row.content,
1446 - originalMarginTop,
1447 - "margin-top"
1448 - );
1449 -
1450 - var current=
1451 - num(
1452 - getComputedStyle(
1453 - row.content
1454 - ).marginTop
1455 - );
1456 -
1457 - row.content.style.setProperty(
1458 - "margin-top",
1459 - (
1460 - current+
1461 - delta
1462 - )+"px"
1463 - );
1464 -
1465 - row.content.setAttribute(
1466 - "data-sn-first-content-aligned",
1467 - "7"
1468 - );
1469 -
1470 - contentManaged.add(
1471 - row.content
1472 - );
1473 - });
1474 -
1475 - return true;
1476 - }
1477 -
1478 - function applyRow(group){
1479 - if(!validRow(group))return false;
1480 -
1481 - var cards=[];
1482 - var seen=new Set();
1483 -
1484 - group.entries.forEach(function(entry){
1485 - if(!seen.has(entry.target)){
1486 - seen.add(entry.target);
1487 - cards.push(entry.target);
1488 - }
1489 - });
1490 -
1491 - if(cards.length<2)return false;
1492 -
1493 - if(
1494 - !alignKnownBars(cards)
1495 - ){
1496 - alignGeneric(cards);
1497 - }
1498 -
1499 - var maxHeight=0;
1500 -
1501 - cards.forEach(function(card){
1502 - maxHeight=
1503 - Math.max(
1504 - maxHeight,
1505 - card.getBoundingClientRect().height
1506 - );
1507 - });
1508 -
1509 - maxHeight=
1510 - Math.ceil(
1511 - maxHeight
1512 - );
1513 -
1514 - if(maxHeight<MIN_H)return false;
1515 -
1516 - cards.forEach(function(card){
1517 - saveOriginal(
1518 - card,
1519 - originalMinHeight,
1520 - "min-height"
1521 - );
1522 -
1523 - card.style.setProperty(
1524 - "min-height",
1525 - maxHeight+"px"
1526 - );
1527 -
1528 - card.setAttribute(
1529 - "data-sn-equal-height-managed",
1530 - "7"
1531 - );
1532 -
1533 - heightManaged.add(card);
1534 - });
1535 -
1536 - return true;
1537 - }
1538 -
1539 - function calculate(force){
1540 - if(applying)return;
1541 -
1542 - var width=
1543 - Math.round(
1544 - window.innerWidth
1545 - );
1546 -
1547 - var meaningful=
1548 - lastWidth<0||
1549 - Math.abs(
1550 - width-
1551 - lastWidth
1552 - )>=
1553 - MIN_WIDTH_CHANGE;
1554 -
1555 - if(
1556 - hasApplied&&
1557 - !force&&
1558 - !meaningful
1559 - ){
1560 - return;
1561 - }
1562 -
1563 - applying=true;
1564 -
1565 - try{
1566 - harmoniseCustomCallouts();
1567 -
1568 - if(width<=MOBILE_MAX){
1569 - if(hasApplied){
1570 - resetRuntime();
1571 - }
1572 -
1573 - hasApplied=false;
1574 - lastWidth=width;
1575 - return;
1576 - }
1577 -
1578 - if(hasApplied){
1579 - resetRuntime();
1580 - }
1581 -
1582 - var parents=
1583 - Array.from(
1584 - root.querySelectorAll("*")
1585 - )
1586 - .filter(function(parent){
1587 - return (
1588 - visible(
1589 - parent,
1590 - MIN_W,
1591 - MIN_H
1592 - )&&
1593 - parent.children&&
1594 - parent.children.length>=2&&
1595 - parent.children.length<=
1596 - MAX_PARENT_CHILDREN
1597 - );
1598 - });
1599 -
1600 - var touched=
1601 - new Set();
1602 -
1603 - parents.forEach(function(parent){
1604 - var entries=[];
1605 -
1606 - Array.from(
1607 - parent.children
1608 - ).forEach(function(child){
1609 - if(
1610 - !visible(
1611 - child,
1612 - MIN_W,
1613 - MIN_H
1614 - )
1615 - ){
1616 - return;
1617 - }
1618 -
1619 - var target=
1620 - pickTarget(child);
1621 -
1622 - if(!target)return;
1623 -
1624 - entries.push({
1625 - target:target,
1626 - rect:
1627 - target.getBoundingClientRect()
1628 - });
1629 - });
1630 -
1631 - groupRows(
1632 - entries
1633 - ).forEach(function(group){
1634 - if(!validRow(group))return;
1635 -
1636 - var targets=
1637 - group.entries.map(function(entry){
1638 - return entry.target;
1639 - });
1640 -
1641 - if(
1642 - !targets.some(function(el){
1643 - return !touched.has(el);
1644 - })
1645 - ){
1646 - return;
1647 - }
1648 -
1649 - if(applyRow(group)){
1650 - targets.forEach(function(el){
1651 - touched.add(el);
1652 - });
1653 - }
1654 - });
1655 - });
1656 -
1657 - lastWidth=width;
1658 - hasApplied=true;
1659 - }finally{
1660 - applying=false;
1661 - }
1662 - }
1663 -
1664 - function resize(){
1665 - if(resizeTimer){
1666 - clearTimeout(
1667 - resizeTimer
1668 - );
1669 - }
1670 -
1671 - resizeTimer=
1672 - setTimeout(
1673 - function(){
1674 - resizeTimer=0;
1675 - calculate(false);
1676 - },
1677 - RESIZE_DEBOUNCE
1678 - );
1679 - }
1680 -
1681 - function waitImages(){
1682 - var images=
1683 - Array.from(
1684 - root.querySelectorAll("img")
1685 - );
1686 -
1687 - return Promise.all(
1688 - images.map(function(img){
1689 - if(img.complete){
1690 - return Promise.resolve();
1691 - }
1692 -
1693 - return new Promise(function(resolve){
1694 - var done=function(){
1695 - resolve();
1696 - };
1697 -
1698 - img.addEventListener(
1699 - "load",
1700 - done,
1701 - {once:true}
1702 - );
1703 -
1704 - img.addEventListener(
1705 - "error",
1706 - done,
1707 - {once:true}
1708 - );
1709 - });
1710 - })
1711 - );
1712 - }
1713 -
1714 - async function initial(){
1715 - if(
1716 - document.readyState!==
1717 - "complete"
1718 - ){
1719 - await new Promise(function(resolve){
1720 - addEventListener(
1721 - "load",
1722 - resolve,
1723 - {once:true}
1724 - );
1725 - });
1726 - }
1727 -
1728 - if(
1729 - document.fonts&&
1730 - document.fonts.ready
1731 - ){
1732 - try{
1733 - await document.fonts.ready;
1734 - }catch(error){}
1735 - }
1736 -
1737 - await waitImages();
1738 -
1739 - // Exactly one initial layout calculation.
1740 - calculate(true);
1741 - }
1742 -
1743 - addEventListener(
1744 - "resize",
1745 - resize,
1746 - {passive:true}
1747 - );
1748 -
1749 - initial();
1750 -})();
1751 -</script>
1752 -
1753 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_END -->
1754 -{{/html}}\n