Changes for page Plan Your Data Management

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

From version 4.14
edited by Veronika Kocher
on Friday, 04 Sep 2026 14:23
Change comment: There is no comment for this version
To version 4.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
... ... @@ -26,7 +26,7 @@
26 26  <section class="dmp-card" style="margin-bottom:18px;overflow:hidden;border-left:6px solid #e94b13;">
27 27  <div class="dmp-hero"><img src="https://xwiki.uni-ak.ac.at/bin/download/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/WebHome/enable.png" alt="Planning research data, materials and outputs across the project lifecycle"></div>
28 28  <div style="padding:18px 21px 20px">
29 -<div class="dmp-eye" style="color:#8a4d36;margin-bottom:5px">PREPARE · DATA MANAGEMENT PLAN</div>
29 +<div class="dmp-eye" style="color:#8a4d36;margin-bottom:5px">ENABLE · DATA MANAGEMENT PLAN</div>
30 30  <h2 style="font-size:27px;line-height:1.2;margin:0 0 8px;color:#2c2926">Turn data management into a working project routine — not a form you fill in once</h2>
31 31  <p style="margin:0;color:#5e5953;line-height:1.6;max-width:1160px">A practical Data Management Plan (DMP) records how your project will organise, store, protect, document, share, preserve or dispose of its data and materials. For artistic and arts-based research, this can include physical objects, audiovisual material, software, performances, process documentation and artistic outputs as well as conventional research data.</p>
32 32  </div>
... ... @@ -247,14 +247,6 @@
247 247  
248 248  <div class="dmp-info" style="margin-bottom:14px"><strong>Need help reviewing a DMP?</strong> Bring the current funder template or internal draft, your material/output inventory, planned storage locations, project partners and the main questions that are still unresolved. This makes support much faster and more concrete.</div>
249 249  
250 -<!-- ARSN_TRAINING_WORKSHOPS_INCLUDE_V1_START -->
251 -{{include reference="Service Navigator.Art & Research Services Navigator.Code.TrainingWorkshopsBlock" author="target" /}}
252 -<!-- ARSN_TRAINING_WORKSHOPS_INCLUDE_V1_END -->
253 -
254 -<!-- ARSN_PRACTICAL_RESOURCES_FALLBACK_V1_START -->
255 -{{include reference="Service Navigator.Art & Research Services Navigator.Code.PracticalResourcesFallbackBlock" author="target" /}}
256 -<!-- ARSN_PRACTICAL_RESOURCES_FALLBACK_V1_END -->
257 -
258 258  <!-- ARSN_SEARCH_TERMS_START -->
259 259  <details style="margin-top:24px;padding-top:10px;border-top:1px solid #e3ded6">
260 260  <summary style="cursor:pointer;color:#6a655e;font-size:13px">Search terms &amp; related topics</summary>
... ... @@ -266,132 +266,21 @@
266 266  {{/html}}
267 267  
268 268  {{html clean="false"}}
269 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START -->
270 -
271 -<style data-sn-service-navigator-master="1">
272 -/* =========================================================
273 - MASTER TYPOGRAPHY
274 - ========================================================= */
275 -#xwikicontent h1,
276 -#xwikicontent h2,
277 -#xwikicontent h3,
278 -#xwikicontent h4,
279 -#xwikicontent h5,
280 -#xwikicontent h6,
281 -#xwikicontent .box-title,
282 -#xwikicontent [role="heading"],
283 -#xwikicontent h1 a,
284 -#xwikicontent h2 a,
285 -#xwikicontent h3 a,
286 -#xwikicontent h4 a,
287 -#xwikicontent h5 a,
288 -#xwikicontent h6 a,
289 -#xwikicontent .box-title a,
290 -#xwikicontent [role="heading"] a{
291 - text-align:left!important;
292 - text-justify:auto!important;
293 - word-spacing:normal!important;
261 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_START -->
262 +<style data-sn-horizontal-box-harmonizer="1">
263 +[data-sn-equal-height-managed="1"]{box-sizing:border-box}
264 +@media(max-width:767px){
265 + [data-sn-equal-height-managed="1"]{min-height:0!important}
294 294  }
295 -
296 -/* =========================================================
297 - COMING SOON / IN VORBEREITUNG
298 - ========================================================= */
299 -.sn-coming-soon-badge{
300 - display:inline-block;
301 - vertical-align:middle;
302 - margin-left:10px;
303 - padding:4px 8px;
304 - border-radius:14px;
305 - border:1px solid #efd9cc;
306 - background:#fff4ee;
307 - color:#8a4d36;
308 - font-size:11px;
309 - font-weight:700;
310 - letter-spacing:.055em;
311 - line-height:1.2;
312 - white-space:nowrap;
313 -}
314 -
315 -/* =========================================================
316 - NATIVE / DETAIL CALLOUT GEOMETRY
317 - Preserve existing backgrounds.
318 - ========================================================= */
319 -#xwikicontent .arsn-info,
320 -#xwikicontent .dmp-info,
321 -#xwikicontent .ido-info,
322 -#xwikicontent .pp-info,
323 -#xwikicontent .infomessage{
324 - box-sizing:border-box!important;
325 - border-left:4px solid #21b6d7!important;
326 - border-radius:8px;
327 - text-align:left!important;
328 - word-spacing:normal!important;
329 -}
330 -
331 -#xwikicontent .arsn-warn,
332 -#xwikicontent .dmp-warn,
333 -#xwikicontent .ido-warn,
334 -#xwikicontent .pp-warn,
335 -#xwikicontent .warn,
336 -#xwikicontent .warning,
337 -#xwikicontent .warningmessage,
338 -#xwikicontent .errormessage{
339 - box-sizing:border-box!important;
340 - border-left:4px solid #e94b13!important;
341 - border-radius:8px;
342 - text-align:left!important;
343 - word-spacing:normal!important;
344 -}
345 -
346 -[data-sn-master-equal-height],
347 -[data-sn-master-first-row]{
348 - box-sizing:border-box;
349 -}
350 -
351 -/* =========================================================
352 - FULL-WIDTH THREE-LINE NUMBER / TITLE / SUBTITLE BLOCKS
353 - ========================================================= */
354 -#xwikicontent .arsn-area-label[data-sn-three-line="1"]{
355 - display:grid!important;
356 - grid-template-columns:minmax(0,1fr)!important;
357 - grid-auto-rows:auto!important;
358 - width:100%!important;
359 - max-width:none!important;
360 - box-sizing:border-box!important;
361 - justify-items:start!important;
362 - align-items:start!important;
363 - gap:2px!important;
364 - text-align:left!important;
365 - text-align-last:left!important;
366 - text-justify:auto!important;
367 - word-spacing:normal!important;
368 - white-space:normal!important;
369 -}
370 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-number,
371 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .sn-area-label-title,
372 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-action{
373 - display:block!important;
374 - width:100%!important;
375 - margin:0!important;
376 - text-align:left!important;
377 - text-align-last:left!important;
378 - text-justify:auto!important;
379 - word-spacing:normal!important;
380 - white-space:normal!important;
381 -}
382 382  </style>
383 -
384 -<script data-sn-service-navigator-master="1">
268 +<script data-sn-horizontal-box-harmonizer="1">
385 385  (function(){
386 386   "use strict";
387 387  
388 - var PAGE_KIND="detail";
389 - var PLACEHOLDER=false;
390 - var PLACEHOLDER_LABEL="COMING SOON";
391 -
392 392   var MOBILE_MAX=767;
393 - var ROW_TOLERANCE=6;
394 - var RESIZE_DEBOUNCE=220;
273 + var ROW_TOLERANCE=4;
274 + var MIN_W=150;
275 + var MIN_H=36;
395 395  
396 396   var root=
397 397   document.getElementById("xwikicontent")||
... ... @@ -401,1268 +401,212 @@
401 401  
402 402   if(!root)return;
403 403  
404 - var managedHeight=new Set();
405 - var managedMargin=new Set();
406 - var originalHeight=new WeakMap();
407 - var originalMargin=new WeakMap();
285 + var managed=new Set();
286 + var raf=0;
408 408  
409 - var resizeTimer=0;
410 - var running=false;
411 -
412 - var THEMES=[
413 - {
414 - name:"BLUE",
415 - accent:"#21b6d7",
416 - bg:"#eaf7fb",
417 - text:"#315d68",
418 - labels:[
419 - "HIER STARTEN",
420 - "ENTSCHEIDEN",
421 - "ÜBERPRÜFEN & ANPASSEN",
422 - "START HERE",
423 - "DECIDE",
424 - "REVIEW & ADAPT"
425 - ]
426 - },
427 - {
428 - name:"RED",
429 - accent:"#e94b13",
430 - bg:"#fff1ec",
431 - text:"#8a4d36",
432 - labels:[
433 - "PLANEN & ORGANISIEREN",
434 - "ORGANISIEREN & DOKUMENTIEREN",
435 - "PUBLIZIEREN & PRÄSENTIEREN",
436 - "PLAN & ORGANISE",
437 - "PLAN & ORGANIZE",
438 - "ORGANISE & DOCUMENT",
439 - "ORGANIZE & DOCUMENT",
440 - "PUBLISH & PRESENT"
441 - ]
442 - },
443 - {
444 - name:"YELLOW",
445 - accent:"#f0aa00",
446 - bg:"#fff8e7",
447 - text:"#785b17",
448 - labels:[
449 - "SCHÜTZEN & KLÄREN",
450 - "STANDARDISIEREN & IDENTIFIZIEREN",
451 - "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN",
452 - "PROTECT & CLARIFY",
453 - "STANDARDISE & IDENTIFY",
454 - "STANDARDIZE & IDENTIFY",
455 - "OPEN, REUSE & MAKE FINDABLE"
456 - ]
457 - },
458 - {
459 - name:"GREEN",
460 - accent:"#38b76a",
461 - bg:"#edf9f1",
462 - text:"#3f7451",
463 - labels:[
464 - "INFRASTRUKTUR EINRICHTEN",
465 - "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN",
466 - "SPEICHERN & ZUGRIFF STEUERN",
467 - "REPOSITORIUM, ERHALTEN & ÜBERGEBEN",
468 - "SET UP INFRASTRUCTURE",
469 - "SET UP INFRASTRUCTURE & COLLABORATION",
470 - "STORE & CONTROL ACCESS",
471 - "REPOSITORY, PRESERVE & HAND OVER"
472 - ]
473 - }
474 - ];
475 -
476 - function num(value){
477 - var n=parseFloat(value);
288 + function num(v){
289 + var n=parseFloat(v);
478 478   return Number.isFinite(n)?n:0;
479 479   }
480 480  
481 - function norm(value){
482 - return String(value||"")
483 - .replace(/\s+/g," ")
484 - .trim()
485 - .toUpperCase();
486 - }
487 -
488 488   function visible(el){
489 489   if(!el||el.nodeType!==1)return false;
490 -
491 - var style=getComputedStyle(el);
492 - var rect=el.getBoundingClientRect();
493 -
494 - return (
495 - style.display!=="none"&&
496 - style.visibility!=="hidden"&&
497 - rect.width>20&&
498 - rect.height>4
499 - );
295 + var s=getComputedStyle(el);
296 + if(s.display==="none"||s.visibility==="hidden"||Number(s.opacity)===0)return false;
297 + var r=el.getBoundingClientRect();
298 + return r.width>=MIN_W&&r.height>=MIN_H;
500 500   }
501 501  
502 - function saveStyle(el,map,property){
503 - if(map.has(el))return;
504 -
505 - map.set(el,{
506 - value:el.style.getPropertyValue(property),
507 - priority:el.style.getPropertyPriority(property)
508 - });
509 - }
510 -
511 - function restoreStyle(el,map,property){
512 - var original=map.get(el);
513 -
514 - if(original&&original.value){
515 - el.style.setProperty(
516 - property,
517 - original.value,
518 - original.priority||""
519 - );
520 - }else{
521 - el.style.removeProperty(property);
522 - }
523 - }
524 -
525 - function resetRuntime(){
526 - managedHeight.forEach(function(el){
527 - restoreStyle(
528 - el,
529 - originalHeight,
530 - "min-height"
531 - );
532 - el.removeAttribute(
533 - "data-sn-master-equal-height"
534 - );
535 - });
536 -
537 - managedMargin.forEach(function(el){
538 - restoreStyle(
539 - el,
540 - originalMargin,
541 - "margin-top"
542 - );
543 - el.removeAttribute(
544 - "data-sn-master-first-row"
545 - );
546 - });
547 -
548 - managedHeight.clear();
549 - managedMargin.clear();
550 - }
551 -
552 - function themeFor(text){
553 - var value=norm(text);
554 -
555 - for(var i=0;i<THEMES.length;i++){
556 - for(var j=0;j<THEMES[i].labels.length;j++){
557 - var label=THEMES[i].labels[j];
558 -
559 - if(
560 - value===label||
561 - value.indexOf(label+" ")===0||
562 - value.indexOf(label+" -")===0||
563 - value.indexOf(label+" ·")===0
564 - ){
565 - return THEMES[i];
566 - }
567 - }
568 - }
569 -
570 - return null;
571 - }
572 -
573 - /* =======================================================
574 - BORDERLESS FILLED RED/ORANGE CTA BUTTONS
575 - ======================================================= */
576 -
577 - function colourDistance(a,b){
578 - return Math.sqrt(
579 - Math.pow(a[0]-b[0],2)+
580 - Math.pow(a[1]-b[1],2)+
581 - Math.pow(a[2]-b[2],2)
301 + function excluded(el){
302 + return !el.matches||el.matches(
303 + "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]"
582 582   );
583 583   }
584 584  
585 - function makeFilledRedOrangeCTAsBorderless(){
586 - var RED_ORANGE=[233,75,19];
587 -
588 - Array.from(
589 - root.querySelectorAll(
590 - 'a,button,[role="button"],input[type="submit"],input[type="button"]'
591 - )
592 - ).forEach(function(el){
593 - if(!visible(el))return;
594 -
595 - var style=getComputedStyle(el);
596 - var rgb=parseRGB(style.backgroundColor);
597 -
598 - if(!rgb)return;
599 -
600 - if(
601 - colourDistance(
602 - rgb,
603 - RED_ORANGE
604 - )>55
605 - ){
606 - return;
607 - }
608 -
609 - var rect=el.getBoundingClientRect();
610 -
611 - if(
612 - rect.width<80||
613 - rect.height<24
614 - ){
615 - return;
616 - }
617 -
618 - el.style.setProperty(
619 - "border",
620 - "none",
621 - "important"
622 - );
623 -
624 - el.style.setProperty(
625 - "border-left",
626 - "none",
627 - "important"
628 - );
629 -
630 - el.style.setProperty(
631 - "border-top",
632 - "none",
633 - "important"
634 - );
635 -
636 - el.style.setProperty(
637 - "border-right",
638 - "none",
639 - "important"
640 - );
641 -
642 - el.style.setProperty(
643 - "border-bottom",
644 - "none",
645 - "important"
646 - );
647 -
648 - el.style.setProperty(
649 - "box-shadow",
650 - "none",
651 - "important"
652 - );
653 - });
307 + function namedLikeBox(el){
308 + var c=typeof el.className==="string"?el.className:"";
309 + return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c);
654 654   }
655 655  
656 - /* =======================================================
657 - FULL-WIDTH THREE-LINE AREA LABELS
658 - ======================================================= */
659 -
660 - function compactText(value){
661 - return String(value||"")
662 - .replace(/\s+/g," ")
663 - .trim();
664 - }
665 -
666 - function makeThreeLineAreaLabels(){
667 - Array.from(
668 - root.querySelectorAll(
669 - ".arsn-area-label"
670 - )
671 - ).forEach(function(label){
672 - if(
673 - label.getAttribute(
674 - "data-sn-three-line"
675 - )==="1"
676 - ){
677 - return;
678 - }
679 -
680 - var number=
681 - label.querySelector(
682 - ":scope > .arsn-area-number"
683 - );
684 -
685 - var action=
686 - label.querySelector(
687 - ":scope > .arsn-area-action"
688 - );
689 -
690 - if(
691 - !number||
692 - !action
693 - ){
694 - return;
695 - }
696 -
697 - var clone=
698 - label.cloneNode(true);
699 -
700 - var cloneNumber=
701 - clone.querySelector(
702 - ":scope > .arsn-area-number"
703 - );
704 -
705 - var cloneAction=
706 - clone.querySelector(
707 - ":scope > .arsn-area-action"
708 - );
709 -
710 - if(cloneNumber){
711 - cloneNumber.remove();
712 - }
713 -
714 - if(cloneAction){
715 - cloneAction.remove();
716 - }
717 -
718 - var titleText=
719 - compactText(
720 - clone.textContent
721 - );
722 -
723 - if(!titleText){
724 - return;
725 - }
726 -
727 - var numberNode=
728 - number.cloneNode(true);
729 -
730 - var actionNode=
731 - action.cloneNode(true);
732 -
733 - var titleNode=
734 - document.createElement(
735 - "span"
736 - );
737 -
738 - titleNode.className=
739 - "sn-area-label-title";
740 -
741 - titleNode.textContent=
742 - titleText;
743 -
744 - while(label.firstChild){
745 - label.removeChild(
746 - label.firstChild
747 - );
748 - }
749 -
750 - label.appendChild(
751 - numberNode
752 - );
753 -
754 - label.appendChild(
755 - titleNode
756 - );
757 -
758 - label.appendChild(
759 - actionNode
760 - );
761 -
762 - label.setAttribute(
763 - "data-sn-three-line",
764 - "1"
765 - );
766 -
767 - var head=
768 - label.closest(
769 - ".arsn-area-head"
770 - );
771 -
772 - if(head){
773 - head.style.setProperty(
774 - "width",
775 - "100%",
776 - "important"
777 - );
778 -
779 - head.style.setProperty(
780 - "max-width",
781 - "100%",
782 - "important"
783 - );
784 -
785 - head.style.setProperty(
786 - "box-sizing",
787 - "border-box",
788 - "important"
789 - );
790 - }
791 - });
792 - }
793 -
794 - /* =======================================================
795 - PLACEHOLDER BADGE
796 - ======================================================= */
797 -
798 - function applyPlaceholderBadge(){
799 - if(!PLACEHOLDER)return;
800 -
801 - if(
802 - document.querySelector(
803 - ".sn-coming-soon-badge"
804 - )
805 - ){
806 - return;
807 - }
808 -
809 - var title=
810 - document.querySelector(
811 - "#document-title"
812 - )||
813 - document.querySelector(
814 - "h1"
815 - );
816 -
817 - if(!title)return;
818 -
819 - var badge=
820 - document.createElement(
821 - "span"
822 - );
823 -
824 - badge.className=
825 - "sn-coming-soon-badge";
826 -
827 - badge.textContent=
828 - PLACEHOLDER_LABEL;
829 -
830 - badge.setAttribute(
831 - "aria-label",
832 - PLACEHOLDER_LABEL
312 + function boxLike(el){
313 + if(!visible(el)||excluded(el))return false;
314 + var s=getComputedStyle(el);
315 + var r=el.getBoundingClientRect();
316 + var border=
317 + num(s.borderTopWidth)+num(s.borderRightWidth)+
318 + num(s.borderBottomWidth)+num(s.borderLeftWidth);
319 + var radius=Math.max(
320 + num(s.borderTopLeftRadius),num(s.borderTopRightRadius),
321 + num(s.borderBottomLeftRadius),num(s.borderBottomRightRadius)
833 833   );
834 -
835 - title.appendChild(
836 - badge
837 - );
323 + var bg=s.backgroundColor&&s.backgroundColor!=="rgba(0, 0, 0, 0)"&&s.backgroundColor!=="transparent";
324 + var shadow=s.boxShadow&&s.boxShadow!=="none";
325 + return namedLikeBox(el)||border>=1||(bg&&radius>=3)||(shadow&&r.width>=180);
838 838   }
839 839  
840 - /* =======================================================
841 - DETAIL PAGE OWN-ACCENT PROPAGATION
842 - ======================================================= */
328 + function pickTarget(child){
329 + if(!visible(child))return null;
330 + if(boxLike(child))return child;
843 843  
844 - function parseRGB(value){
845 - var match=String(value||"").match(
846 - /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i
847 - );
848 -
849 - if(!match)return null;
850 -
851 - return [
852 - Number(match[1]),
853 - Number(match[2]),
854 - Number(match[3])
855 - ];
856 - }
857 -
858 - function distance(a,b){
859 - return Math.sqrt(
860 - Math.pow(a[0]-b[0],2)+
861 - Math.pow(a[1]-b[1],2)+
862 - Math.pow(a[2]-b[2],2)
863 - );
864 - }
865 -
866 - function paletteMatch(cssColor){
867 - var rgb=parseRGB(cssColor);
868 -
869 - if(!rgb)return null;
870 -
871 - var palette=[
872 - {hex:"#21b6d7",rgb:[33,182,215]},
873 - {hex:"#e94b13",rgb:[233,75,19]},
874 - {hex:"#f0aa00",rgb:[240,170,0]},
875 - {hex:"#38b76a",rgb:[56,183,106]}
876 - ];
877 -
878 - var best=null;
879 - var bestDistance=Infinity;
880 -
881 - palette.forEach(function(item){
882 - var d=distance(rgb,item.rgb);
883 -
884 - if(d<bestDistance){
885 - best=item;
886 - bestDistance=d;
887 - }
332 + var cr=child.getBoundingClientRect();
333 + var q=[];
334 + Array.from(child.children||[]).forEach(function(el){
335 + q.push({el:el,depth:1});
888 888   });
889 889  
890 - return bestDistance<=30
891 - ?best
892 - :null;
893 - }
338 + var best=null,bestScore=-1;
894 894  
895 - function propagateDetailAccents(){
896 - if(PAGE_KIND!=="detail")return;
340 + while(q.length){
341 + var item=q.shift();
342 + var el=item.el;
343 + if(!visible(el))continue;
897 897  
898 - Array.from(
899 - root.querySelectorAll(
900 - ".arsn-call,.dmp-call,.ido-call,.pp-call,"+
901 - ".arsn-source,.dmp-source,.ido-source,.pp-source"
902 - )
903 - ).forEach(function(el){
904 - if(!visible(el))return;
345 + var r=el.getBoundingClientRect();
905 905  
906 - var style=getComputedStyle(el);
907 -
908 - if(
909 - num(style.borderTopWidth)>=2
910 - ){
911 - var match=
912 - paletteMatch(
913 - style.borderTopColor
914 - );
915 -
916 - if(match){
917 - el.style.setProperty(
918 - "border-left",
919 - "4px solid "+match.hex,
920 - "important"
921 - );
347 + if(r.width>=cr.width*.72&&boxLike(el)){
348 + var widthFit=1-Math.min(1,Math.abs(cr.width-r.width)/Math.max(1,cr.width));
349 + var topFit=1-Math.min(1,Math.abs(cr.top-r.top)/80);
350 + var score=widthFit*5+topFit*2+Math.min(r.height,600)/600;
351 + if(score>bestScore){
352 + best=el;
353 + bestScore=score;
922 922   }
923 923   }
924 - });
925 925  
926 - // Warning families: explicit safety override.
927 - Array.from(
928 - root.querySelectorAll(
929 - ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+
930 - ".warn,.warning,.warningmessage,.errormessage"
931 - )
932 - ).forEach(function(el){
933 - if(!visible(el))return;
934 -
935 - el.style.setProperty(
936 - "border-left",
937 - "4px solid #e94b13",
938 - "important"
939 - );
940 - });
941 -
942 - // Info families: explicit orientation override.
943 - Array.from(
944 - root.querySelectorAll(
945 - ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage"
946 - )
947 - ).forEach(function(el){
948 - if(!visible(el))return;
949 -
950 - el.style.setProperty(
951 - "border-left",
952 - "4px solid #21b6d7",
953 - "important"
954 - );
955 - });
956 - }
957 -
958 - /* =======================================================
959 - OVERVIEW SEMANTIC THEME PALETTE
960 - ======================================================= */
961 -
962 - function smallestThemeHeaders(){
963 - return Array.from(
964 - root.querySelectorAll(
965 - "div,span,p,strong,h3,h4,h5,h6"
966 - )
967 - ).filter(function(el){
968 - if(!visible(el))return false;
969 - if(!themeFor(el.textContent))return false;
970 -
971 - return !Array.from(
972 - el.children||[]
973 - ).some(function(child){
974 - return !!themeFor(
975 - child.textContent
976 - );
977 - });
978 - });
979 - }
980 -
981 - function findOverviewCard(header){
982 - var node=header.parentElement;
983 - var candidates=[];
984 -
985 - while(node&&node!==root){
986 - var rect=node.getBoundingClientRect();
987 - var style=getComputedStyle(node);
988 -
989 - var border=
990 - num(style.borderTopWidth)+
991 - num(style.borderRightWidth)+
992 - num(style.borderBottomWidth)+
993 - num(style.borderLeftWidth);
994 -
995 - if(
996 - rect.width>=220&&
997 - rect.width<=800&&
998 - rect.height>=120&&
999 - border>=1
1000 - ){
1001 - candidates.push(node);
357 + if(item.depth<3){
358 + Array.from(el.children||[]).forEach(function(next){
359 + q.push({el:next,depth:item.depth+1});
360 + });
1002 1002   }
1003 -
1004 - node=node.parentElement;
1005 1005   }
1006 1006  
1007 - if(!candidates.length)return null;
1008 -
1009 - candidates.sort(function(a,b){
1010 - return (
1011 - b.getBoundingClientRect().height-
1012 - a.getBoundingClientRect().height
1013 - );
1014 - });
1015 -
1016 - return candidates[0];
364 + return best;
1017 1017   }
1018 1018  
1019 - function rowCandidates(link,card){
1020 - var result=[];
1021 - var cardRect=
1022 - card.getBoundingClientRect();
1023 -
1024 - var node=link;
1025 -
1026 - while(node&&node!==card){
1027 - if(visible(node)){
1028 - var rect=
1029 - node.getBoundingClientRect();
1030 -
1031 - if(
1032 - rect.height<=105&&
1033 - rect.width>=
1034 - cardRect.width*.50&&
1035 - rect.width<=
1036 - cardRect.width*1.03
1037 - ){
1038 - result.push(node);
1039 - }
1040 - }
1041 -
1042 - node=node.parentElement;
1043 - }
1044 -
1045 - return result;
1046 - }
1047 -
1048 - function chooseOuterRow(
1049 - candidates,
1050 - link
1051 - ){
1052 - if(!candidates.length){
1053 - return link;
1054 - }
1055 -
1056 - var bordered=
1057 - candidates.filter(function(el){
1058 - return (
1059 - num(
1060 - getComputedStyle(el)
1061 - .borderLeftWidth
1062 - )>=1
1063 - );
1064 - });
1065 -
1066 - var pool=
1067 - bordered.length
1068 - ?bordered
1069 - :candidates;
1070 -
1071 - pool.sort(function(a,b){
1072 - var ar=
1073 - a.getBoundingClientRect();
1074 -
1075 - var br=
1076 - b.getBoundingClientRect();
1077 -
1078 - return (
1079 - ar.left-br.left||
1080 - br.width-ar.width
1081 - );
367 + function reset(){
368 + managed.forEach(function(el){
369 + el.style.removeProperty("min-height");
370 + el.removeAttribute("data-sn-equal-height-managed");
1082 1082   });
1083 -
1084 - return pool[0]||link;
372 + managed.clear();
1085 1085   }
1086 1086  
1087 - function applyOverviewPalette(){
1088 - if(PAGE_KIND!=="overview"){
1089 - return [];
375 + function horizontalLayout(parent){
376 + if(!visible(parent))return false;
377 + var s=getComputedStyle(parent);
378 + if(s.display==="grid"||s.display==="inline-grid")return true;
379 + if(s.display==="flex"||s.display==="inline-flex"){
380 + return s.flexDirection==="row"||s.flexDirection==="row-reverse";
1090 1090   }
1091 -
1092 - var headers=
1093 - smallestThemeHeaders()
1094 - .map(function(el){
1095 - return {
1096 - el:el,
1097 - theme:
1098 - themeFor(
1099 - el.textContent
1100 - ),
1101 - card:
1102 - findOverviewCard(
1103 - el
1104 - )
1105 - };
1106 - })
1107 - .filter(function(row){
1108 - return !!row.card;
1109 - });
1110 -
1111 - var unique=[];
1112 - var seenHeaders=new Set();
1113 -
1114 - headers.forEach(function(row){
1115 - var key=
1116 - row.theme.name+
1117 - "|"+
1118 - Math.round(
1119 - row.card
1120 - .getBoundingClientRect()
1121 - .left
1122 - )+
1123 - "|"+
1124 - Math.round(
1125 - row.el
1126 - .getBoundingClientRect()
1127 - .top
1128 - );
1129 -
1130 - if(!seenHeaders.has(key)){
1131 - seenHeaders.add(key);
1132 - unique.push(row);
1133 - }
1134 - });
1135 -
1136 - unique.forEach(function(row){
1137 - var headerRect=
1138 - row.el
1139 - .getBoundingClientRect();
1140 -
1141 - row.el.style.setProperty(
1142 - "background",
1143 - row.theme.bg,
1144 - "important"
1145 - );
1146 -
1147 - row.el.style.setProperty(
1148 - "color",
1149 - row.theme.text,
1150 - "important"
1151 - );
1152 -
1153 - row.el.style.setProperty(
1154 - "text-align",
1155 - "left",
1156 - "important"
1157 - );
1158 -
1159 - row.el.style.setProperty(
1160 - "word-spacing",
1161 - "normal",
1162 - "important"
1163 - );
1164 -
1165 - var later=
1166 - unique
1167 - .filter(function(other){
1168 - return (
1169 - other.card===row.card&&
1170 - other.el
1171 - .getBoundingClientRect()
1172 - .top>
1173 - headerRect.top+2
1174 - );
1175 - })
1176 - .sort(function(a,b){
1177 - return (
1178 - a.el
1179 - .getBoundingClientRect()
1180 - .top-
1181 - b.el
1182 - .getBoundingClientRect()
1183 - .top
1184 - );
1185 - });
1186 -
1187 - var stopTop=
1188 - later.length
1189 - ?later[0].el
1190 - .getBoundingClientRect()
1191 - .top
1192 - :Infinity;
1193 -
1194 - Array.from(
1195 - row.card.querySelectorAll("a")
1196 - ).forEach(function(link){
1197 - if(!visible(link))return;
1198 -
1199 - var rect=
1200 - link.getBoundingClientRect();
1201 -
1202 - if(
1203 - rect.top<=
1204 - headerRect.bottom-2||
1205 - rect.top>=
1206 - stopTop-2
1207 - ){
1208 - return;
1209 - }
1210 -
1211 - var candidates=
1212 - rowCandidates(
1213 - link,
1214 - row.card
1215 - );
1216 -
1217 - var target=
1218 - chooseOuterRow(
1219 - candidates,
1220 - link
1221 - );
1222 -
1223 - candidates.forEach(function(el){
1224 - el.style.setProperty(
1225 - "border-left",
1226 - "0 solid transparent",
1227 - "important"
1228 - );
1229 - });
1230 -
1231 - target.style.setProperty(
1232 - "border-left",
1233 - "3px solid "+
1234 - row.theme.accent,
1235 - "important"
1236 - );
1237 -
1238 - target.style.setProperty(
1239 - "box-sizing",
1240 - "border-box",
1241 - "important"
1242 - );
1243 - });
1244 - });
1245 -
1246 - return unique;
382 + return false;
1247 1247   }
1248 1248  
1249 - /* =======================================================
1250 - OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW
1251 - ======================================================= */
1252 -
1253 - function alignOverviewCards(headers){
1254 - if(
1255 - PAGE_KIND!=="overview"||
1256 - window.innerWidth<=MOBILE_MAX
1257 - ){
1258 - return;
1259 - }
1260 -
1261 - var cards=[];
1262 - var seen=new Set();
1263 -
1264 - headers.forEach(function(row){
1265 - if(!seen.has(row.card)){
1266 - seen.add(row.card);
1267 - cards.push(row.card);
1268 - }
1269 - });
1270 -
1271 - if(cards.length<2){
1272 - return;
1273 - }
1274 -
1275 - // Group cards by actual top position.
385 + function rowGroups(entries){
1276 1276   var groups=[];
1277 -
1278 - cards.forEach(function(card){
1279 - var top=
1280 - card.getBoundingClientRect().top;
1281 -
387 + entries.slice().sort(function(a,b){
388 + return a.rect.top-b.rect.top||a.rect.left-b.rect.left;
389 + }).forEach(function(entry){
1282 1282   var group=null;
1283 -
1284 1284   for(var i=0;i<groups.length;i++){
1285 - if(
1286 - Math.abs(
1287 - groups[i].top-top
1288 - )<=ROW_TOLERANCE
1289 - ){
392 + if(Math.abs(groups[i].top-entry.rect.top)<=ROW_TOLERANCE){
1290 1290   group=groups[i];
1291 1291   break;
1292 1292   }
1293 1293   }
1294 -
1295 1295   if(!group){
1296 - group={
1297 - top:top,
1298 - cards:[]
1299 - };
398 + group={top:entry.rect.top,entries:[]};
1300 1300   groups.push(group);
1301 1301   }
1302 -
1303 - group.cards.push(card);
401 + group.entries.push(entry);
1304 1304   });
403 + return groups;
404 + }
1305 1305  
1306 - groups.forEach(function(group){
1307 - if(group.cards.length<2){
1308 - return;
1309 - }
406 + function run(){
407 + reset();
1310 1310  
1311 - var firstHeaders=
1312 - group.cards.map(function(card){
1313 - var candidates=
1314 - headers
1315 - .filter(function(row){
1316 - return row.card===card;
1317 - })
1318 - .sort(function(a,b){
1319 - return (
1320 - a.el
1321 - .getBoundingClientRect()
1322 - .top-
1323 - b.el
1324 - .getBoundingClientRect()
1325 - .top
1326 - );
1327 - });
409 + if(window.innerWidth<=MOBILE_MAX)return;
1328 1328  
1329 - return candidates.length
1330 - ?candidates[0]
1331 - :null;
1332 - });
411 + var parents=Array.from(root.querySelectorAll("*")).filter(function(el){
412 + return el.children&&el.children.length>=2&&horizontalLayout(el);
413 + });
1333 1333  
1334 - if(
1335 - !firstHeaders.some(function(row){
1336 - return !row;
1337 - })
1338 - ){
1339 - var targetTop=
1340 - Math.max.apply(
1341 - Math,
1342 - firstHeaders.map(function(row){
1343 - return (
1344 - row.el
1345 - .getBoundingClientRect()
1346 - .top-
1347 - row.card
1348 - .getBoundingClientRect()
1349 - .top
1350 - );
1351 - })
1352 - );
415 + parents.forEach(function(parent){
416 + var entries=[];
1353 1353  
1354 - firstHeaders.forEach(function(row){
1355 - var relativeTop=
1356 - row.el
1357 - .getBoundingClientRect()
1358 - .top-
1359 - row.card
1360 - .getBoundingClientRect()
1361 - .top;
1362 -
1363 - var delta=
1364 - targetTop-relativeTop;
1365 -
1366 - if(delta>1){
1367 - saveStyle(
1368 - row.el,
1369 - originalMargin,
1370 - "margin-top"
1371 - );
1372 -
1373 - var current=
1374 - num(
1375 - getComputedStyle(
1376 - row.el
1377 - ).marginTop
1378 - );
1379 -
1380 - row.el.style.setProperty(
1381 - "margin-top",
1382 - (
1383 - current+delta
1384 - )+"px"
1385 - );
1386 -
1387 - row.el.setAttribute(
1388 - "data-sn-master-first-row",
1389 - "1"
1390 - );
1391 -
1392 - managedMargin.add(
1393 - row.el
1394 - );
1395 - }
418 + Array.from(parent.children).forEach(function(child){
419 + if(!visible(child))return;
420 + var target=pickTarget(child);
421 + if(!target)return;
422 + entries.push({
423 + target:target,
424 + rect:target.getBoundingClientRect()
1396 1396   });
1397 - }
1398 -
1399 - var maxHeight=0;
1400 -
1401 - group.cards.forEach(function(card){
1402 - maxHeight=
1403 - Math.max(
1404 - maxHeight,
1405 - card
1406 - .getBoundingClientRect()
1407 - .height
1408 - );
1409 1409   });
1410 1410  
1411 - maxHeight=
1412 - Math.ceil(maxHeight);
428 + if(entries.length<2)return;
1413 1413  
1414 - group.cards.forEach(function(card){
1415 - saveStyle(
1416 - card,
1417 - originalHeight,
1418 - "min-height"
1419 - );
430 + rowGroups(entries).forEach(function(group){
431 + if(group.entries.length<2)return;
1420 1420  
1421 - card.style.setProperty(
1422 - "min-height",
1423 - maxHeight+"px"
1424 - );
433 + var lefts=group.entries.map(function(e){return e.rect.left;}).sort(function(a,b){return a-b;});
434 + if(lefts[lefts.length-1]-lefts[0]<80)return;
1425 1425  
1426 - card.setAttribute(
1427 - "data-sn-master-equal-height",
1428 - "1"
1429 - );
436 + var targets=[];
437 + var seen=new Set();
1430 1430  
1431 - managedHeight.add(
1432 - card
1433 - );
1434 - });
1435 - });
1436 - }
1437 -
1438 - /* =======================================================
1439 - DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY
1440 - ======================================================= */
1441 -
1442 - function equaliseDetailGrids(){
1443 - if(
1444 - PAGE_KIND!=="detail"||
1445 - window.innerWidth<=MOBILE_MAX
1446 - ){
1447 - return;
1448 - }
1449 -
1450 - var selectors=[
1451 - ".arsn-grid",
1452 - ".arsn-grid-2",
1453 - ".arsn-grid-3",
1454 - ".dmp-grid",
1455 - ".ido-grid",
1456 - ".pp-grid"
1457 - ];
1458 -
1459 - selectors.forEach(function(selector){
1460 - Array.from(
1461 - root.querySelectorAll(selector)
1462 - ).forEach(function(grid){
1463 - var children=
1464 - Array.from(
1465 - grid.children||[]
1466 - ).filter(visible);
1467 -
1468 - if(children.length<2){
1469 - return;
1470 - }
1471 -
1472 - var groups=[];
1473 -
1474 - children.forEach(function(child){
1475 - var top=
1476 - child
1477 - .getBoundingClientRect()
1478 - .top;
1479 -
1480 - var group=null;
1481 -
1482 - for(var i=0;i<groups.length;i++){
1483 - if(
1484 - Math.abs(
1485 - groups[i].top-top
1486 - )<=ROW_TOLERANCE
1487 - ){
1488 - group=groups[i];
1489 - break;
1490 - }
439 + group.entries.forEach(function(e){
440 + if(!seen.has(e.target)){
441 + seen.add(e.target);
442 + targets.push(e.target);
1491 1491   }
444 + });
1492 1492  
1493 - if(!group){
1494 - group={
1495 - top:top,
1496 - items:[]
1497 - };
1498 - groups.push(group);
1499 - }
446 + if(targets.length<2)return;
1500 1500  
1501 - group.items.push(child);
448 + var max=0;
449 + targets.forEach(function(el){
450 + max=Math.max(max,el.getBoundingClientRect().height);
1502 1502   });
1503 1503  
1504 - groups.forEach(function(group){
1505 - if(group.items.length<2){
1506 - return;
1507 - }
453 + max=Math.ceil(max);
454 + if(max<MIN_H)return;
1508 1508  
1509 - var maxHeight=0;
1510 -
1511 - group.items.forEach(function(item){
1512 - maxHeight=
1513 - Math.max(
1514 - maxHeight,
1515 - item
1516 - .getBoundingClientRect()
1517 - .height
1518 - );
1519 - });
1520 -
1521 - maxHeight=
1522 - Math.ceil(maxHeight);
1523 -
1524 - group.items.forEach(function(item){
1525 - saveStyle(
1526 - item,
1527 - originalHeight,
1528 - "min-height"
1529 - );
1530 -
1531 - item.style.setProperty(
1532 - "min-height",
1533 - maxHeight+"px"
1534 - );
1535 -
1536 - item.setAttribute(
1537 - "data-sn-master-equal-height",
1538 - "1"
1539 - );
1540 -
1541 - managedHeight.add(item);
1542 - });
456 + targets.forEach(function(el){
457 + el.style.setProperty("min-height",max+"px");
458 + el.setAttribute("data-sn-equal-height-managed","1");
459 + managed.add(el);
1543 1543   });
1544 1544   });
1545 1545   });
1546 1546   }
1547 1547  
1548 - /* =======================================================
1549 - RUN / RESPONSIVE SCHEDULING
1550 - ======================================================= */
1551 -
1552 - function run(){
1553 - if(running)return;
1554 -
1555 - running=true;
1556 -
1557 - try{
1558 - resetRuntime();
1559 - applyPlaceholderBadge();
1560 - propagateDetailAccents();
1561 -
1562 - var headers=
1563 - applyOverviewPalette();
1564 -
1565 - makeThreeLineAreaLabels();
1566 - makeFilledRedOrangeCTAsBorderless();
1567 -
1568 - if(
1569 - window.innerWidth>
1570 - MOBILE_MAX
1571 - ){
1572 - alignOverviewCards(
1573 - headers
1574 - );
1575 -
1576 - equaliseDetailGrids();
1577 - }
1578 - }finally{
1579 - running=false;
1580 - }
465 + function schedule(){
466 + if(raf)cancelAnimationFrame(raf);
467 + raf=requestAnimationFrame(function(){
468 + raf=requestAnimationFrame(function(){
469 + raf=0;
470 + run();
471 + });
472 + });
1581 1581   }
1582 1582  
1583 - function onResize(){
1584 - if(resizeTimer){
1585 - clearTimeout(
1586 - resizeTimer
1587 - );
1588 - }
475 + addEventListener("resize",schedule,{passive:true});
476 + addEventListener("load",schedule,{once:true});
1589 1589  
1590 - resizeTimer=
1591 - setTimeout(
1592 - function(){
1593 - resizeTimer=0;
1594 - run();
1595 - },
1596 - RESIZE_DEBOUNCE
1597 - );
1598 - }
478 + root.addEventListener("click",function(){
479 + setTimeout(schedule,0);
480 + },true);
1599 1599  
1600 - async function waitForReady(){
1601 - if(
1602 - document.readyState!=="complete"
1603 - ){
1604 - await new Promise(function(resolve){
1605 - window.addEventListener(
1606 - "load",
1607 - resolve,
1608 - {once:true}
1609 - );
1610 - });
1611 - }
1612 -
1613 - if(
1614 - document.fonts&&
1615 - document.fonts.ready
1616 - ){
1617 - try{
1618 - await document.fonts.ready;
1619 - }catch(error){}
1620 - }
1621 -
1622 - var images=
1623 - Array.from(
1624 - root.querySelectorAll("img")
1625 - );
1626 -
1627 - await Promise.all(
1628 - images.map(function(img){
1629 - if(img.complete){
1630 - return Promise.resolve();
1631 - }
1632 -
1633 - return new Promise(function(resolve){
1634 - var done=function(){
1635 - resolve();
1636 - };
1637 -
1638 - img.addEventListener(
1639 - "load",
1640 - done,
1641 - {once:true}
1642 - );
1643 -
1644 - img.addEventListener(
1645 - "error",
1646 - done,
1647 - {once:true}
1648 - );
1649 - });
1650 - })
1651 - );
1652 -
1653 - run();
482 + if(document.fonts&&document.fonts.ready){
483 + document.fonts.ready.then(schedule);
1654 1654   }
1655 1655  
1656 - window.addEventListener(
1657 - "resize",
1658 - onResize,
1659 - {passive:true}
1660 - );
1661 -
1662 - waitForReady();
486 + schedule();
487 + setTimeout(schedule,250);
488 + setTimeout(schedule,900);
1663 1663  })();
1664 1664  </script>
1665 -
1666 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END -->
491 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_END -->
1667 1667  {{/html}}
1668 1668