Last modified by Veronika Kocher on Friday, 18 Sep 2026 16:47

From version 39.20
edited by Veronika Kocher
on Wednesday, 02 Sep 2026 17:21
Change comment: There is no comment for this version
To version 39.23
edited by Veronika Kocher
on Thursday, 03 Sep 2026 10:09
Change comment: There is no comment for this version

Summary

Details

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