Changes for page Plan Your Data Management

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

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