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

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