Last modified by Veronika Kocher on Friday, 04 Sep 2026 14:45

From version 5.7
edited by Veronika Kocher
on Wednesday, 02 Sep 2026 13:13
Change comment: There is no comment for this version
To version 5.8
edited by Veronika Kocher
on Thursday, 03 Sep 2026 9:18
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -261,3 +261,237 @@
261 261  </div>
262 262  {{/html}}
263 263  
264 +{{html clean="false"}}
265 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_START -->
266 +<style data-sn-horizontal-box-harmonizer="1">
267 +[data-sn-equal-height-managed="1"]{box-sizing:border-box}
268 +@media(max-width:767px){
269 + [data-sn-equal-height-managed="1"]{min-height:0!important}
270 +}
271 +</style>
272 +<script data-sn-horizontal-box-harmonizer="1">
273 +(function(){
274 + "use strict";
275 +
276 + var MOBILE_MAX=767;
277 + var ROW_TOLERANCE=4;
278 + var MIN_W=150;
279 + var MIN_H=36;
280 +
281 + var root=
282 + document.getElementById("xwikicontent")||
283 + document.querySelector(".xwiki-rendering-content")||
284 + document.querySelector("main")||
285 + document.body;
286 +
287 + if(!root)return;
288 +
289 + var managed=new Set();
290 + var raf=0;
291 +
292 + function num(v){
293 + var n=parseFloat(v);
294 + return Number.isFinite(n)?n:0;
295 + }
296 +
297 + function visible(el){
298 + if(!el||el.nodeType!==1)return false;
299 + var s=getComputedStyle(el);
300 + if(s.display==="none"||s.visibility==="hidden"||Number(s.opacity)===0)return false;
301 + var r=el.getBoundingClientRect();
302 + return r.width>=MIN_W&&r.height>=MIN_H;
303 + }
304 +
305 + function excluded(el){
306 + return !el.matches||el.matches(
307 + "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]"
308 + );
309 + }
310 +
311 + function namedLikeBox(el){
312 + var c=typeof el.className==="string"?el.className:"";
313 + return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c);
314 + }
315 +
316 + function boxLike(el){
317 + if(!visible(el)||excluded(el))return false;
318 + var s=getComputedStyle(el);
319 + var r=el.getBoundingClientRect();
320 + var border=
321 + num(s.borderTopWidth)+num(s.borderRightWidth)+
322 + num(s.borderBottomWidth)+num(s.borderLeftWidth);
323 + var radius=Math.max(
324 + num(s.borderTopLeftRadius),num(s.borderTopRightRadius),
325 + num(s.borderBottomLeftRadius),num(s.borderBottomRightRadius)
326 + );
327 + var bg=s.backgroundColor&&s.backgroundColor!=="rgba(0, 0, 0, 0)"&&s.backgroundColor!=="transparent";
328 + var shadow=s.boxShadow&&s.boxShadow!=="none";
329 + return namedLikeBox(el)||border>=1||(bg&&radius>=3)||(shadow&&r.width>=180);
330 + }
331 +
332 + function pickTarget(child){
333 + if(!visible(child))return null;
334 + if(boxLike(child))return child;
335 +
336 + var cr=child.getBoundingClientRect();
337 + var q=[];
338 + Array.from(child.children||[]).forEach(function(el){
339 + q.push({el:el,depth:1});
340 + });
341 +
342 + var best=null,bestScore=-1;
343 +
344 + while(q.length){
345 + var item=q.shift();
346 + var el=item.el;
347 + if(!visible(el))continue;
348 +
349 + var r=el.getBoundingClientRect();
350 +
351 + if(r.width>=cr.width*.72&&boxLike(el)){
352 + var widthFit=1-Math.min(1,Math.abs(cr.width-r.width)/Math.max(1,cr.width));
353 + var topFit=1-Math.min(1,Math.abs(cr.top-r.top)/80);
354 + var score=widthFit*5+topFit*2+Math.min(r.height,600)/600;
355 + if(score>bestScore){
356 + best=el;
357 + bestScore=score;
358 + }
359 + }
360 +
361 + if(item.depth<3){
362 + Array.from(el.children||[]).forEach(function(next){
363 + q.push({el:next,depth:item.depth+1});
364 + });
365 + }
366 + }
367 +
368 + return best;
369 + }
370 +
371 + function reset(){
372 + managed.forEach(function(el){
373 + el.style.removeProperty("min-height");
374 + el.removeAttribute("data-sn-equal-height-managed");
375 + });
376 + managed.clear();
377 + }
378 +
379 + function horizontalLayout(parent){
380 + if(!visible(parent))return false;
381 + var s=getComputedStyle(parent);
382 + if(s.display==="grid"||s.display==="inline-grid")return true;
383 + if(s.display==="flex"||s.display==="inline-flex"){
384 + return s.flexDirection==="row"||s.flexDirection==="row-reverse";
385 + }
386 + return false;
387 + }
388 +
389 + function rowGroups(entries){
390 + var groups=[];
391 + entries.slice().sort(function(a,b){
392 + return a.rect.top-b.rect.top||a.rect.left-b.rect.left;
393 + }).forEach(function(entry){
394 + var group=null;
395 + for(var i=0;i<groups.length;i++){
396 + if(Math.abs(groups[i].top-entry.rect.top)<=ROW_TOLERANCE){
397 + group=groups[i];
398 + break;
399 + }
400 + }
401 + if(!group){
402 + group={top:entry.rect.top,entries:[]};
403 + groups.push(group);
404 + }
405 + group.entries.push(entry);
406 + });
407 + return groups;
408 + }
409 +
410 + function run(){
411 + reset();
412 +
413 + if(window.innerWidth<=MOBILE_MAX)return;
414 +
415 + var parents=Array.from(root.querySelectorAll("*")).filter(function(el){
416 + return el.children&&el.children.length>=2&&horizontalLayout(el);
417 + });
418 +
419 + parents.forEach(function(parent){
420 + var entries=[];
421 +
422 + Array.from(parent.children).forEach(function(child){
423 + if(!visible(child))return;
424 + var target=pickTarget(child);
425 + if(!target)return;
426 + entries.push({
427 + target:target,
428 + rect:target.getBoundingClientRect()
429 + });
430 + });
431 +
432 + if(entries.length<2)return;
433 +
434 + rowGroups(entries).forEach(function(group){
435 + if(group.entries.length<2)return;
436 +
437 + var lefts=group.entries.map(function(e){return e.rect.left;}).sort(function(a,b){return a-b;});
438 + if(lefts[lefts.length-1]-lefts[0]<80)return;
439 +
440 + var targets=[];
441 + var seen=new Set();
442 +
443 + group.entries.forEach(function(e){
444 + if(!seen.has(e.target)){
445 + seen.add(e.target);
446 + targets.push(e.target);
447 + }
448 + });
449 +
450 + if(targets.length<2)return;
451 +
452 + var max=0;
453 + targets.forEach(function(el){
454 + max=Math.max(max,el.getBoundingClientRect().height);
455 + });
456 +
457 + max=Math.ceil(max);
458 + if(max<MIN_H)return;
459 +
460 + targets.forEach(function(el){
461 + el.style.setProperty("min-height",max+"px");
462 + el.setAttribute("data-sn-equal-height-managed","1");
463 + managed.add(el);
464 + });
465 + });
466 + });
467 + }
468 +
469 + function schedule(){
470 + if(raf)cancelAnimationFrame(raf);
471 + raf=requestAnimationFrame(function(){
472 + raf=requestAnimationFrame(function(){
473 + raf=0;
474 + run();
475 + });
476 + });
477 + }
478 +
479 + addEventListener("resize",schedule,{passive:true});
480 + addEventListener("load",schedule,{once:true});
481 +
482 + root.addEventListener("click",function(){
483 + setTimeout(schedule,0);
484 + },true);
485 +
486 + if(document.fonts&&document.fonts.ready){
487 + document.fonts.ready.then(schedule);
488 + }
489 +
490 + schedule();
491 + setTimeout(schedule,250);
492 + setTimeout(schedule,900);
493 +})();
494 +</script>
495 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_END -->
496 +{{/html}}
497 +