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

From version 5.14
edited by Veronika Kocher
on Thursday, 03 Sep 2026 16:47
Change comment: Update property defaultLocale
To version 5.9
edited by Veronika Kocher
on Thursday, 03 Sep 2026 9:34
Change comment: There is no comment for this version

Summary

Details

Page properties
Default language
... ... @@ -1,1 +1,0 @@
1 -en
Content
... ... @@ -1,18 +1,18 @@
1 -Check funder requirements for data management, Open Science, documentation, preservation and eligible costs early.
1 +Identify funder requirements for data management, Open Science, documentation, preservation and eligible costs.
2 2  
3 3  == Overview ==
4 4  
5 -Funding conditions influence more than the budget and timeline. They often also affect data management, Open Access, reporting, rights and retention. Always use the current call and the binding funding conditions as your basis.
5 +Add a concise explanation of this topic and why it matters for Art & Research projects.
6 6  
7 7  == What you need to know ==
8 8  
9 -* Distinguish eligibility requirements, eligible costs and reporting obligations.
10 -* Check internal deadlines and approvals in addition to the external submission deadline.
11 -* Record requirements concerning data, publication, Open Science, communication and preservation in the project plan.
9 +* Key concepts
10 +* Relevant requirements
11 +* Important distinctions
12 12  
13 13  == What you need to do ==
14 14  
15 -1. Check what applies to your project.
15 +1. Identify what applies to your project.
16 16  2. Document the relevant decisions.
17 17  3. Use appropriate institutional services and support where needed.
18 18  
... ... @@ -26,32 +26,32 @@
26 26  
27 27  == Services & Tools ==
28 28  
29 -Use the institutional services, infrastructure and tools that fit your project and its requirements. Specific links will be added as the relevant services are included in the Navigator.
29 +Add links to relevant institutional services, infrastructure and tools.
30 30  
31 31  == Info Sheets & Checklists ==
32 32  
33 -Relevant Info Sheets, checklists and templates will be added here as they become available.
33 +Add links to related Info Sheets, checklists and templates.
34 34  
35 35  == Tutorials ==
36 36  
37 37  
38 38  {{html}}<span data-arsn-coming-soon="true" style="display:inline-block;margin:6px 0 8px 0;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>{{/html}}
39 -Step-by-step tutorials will be added here as they become available.
39 +Add links to step-by-step tutorials for this topic.
40 40  
41 41  == Related Topics ==
42 42  
43 -Further guidance can be found in the adjacent phases Prepare, Work & Manage and Publish & Share.
43 +Add links to related pages in Enable, Work & Manage, and Publish & Share.
44 44  
45 45  == Who is responsible? ==
46 46  
47 -
47 +{{html}}<!-- ARSN_TOPIC_ROUTING_V1 -->{{/html}}
48 48  {{info title="Service routing"}}
49 -**Primary specialist service(s):** Support Kunst und Forschung (SKF) for the research-funding landscape, call fit, proposal development, internal routes and coordination of funded research projects.
49 +**Primary specialist service(s):** Support Kunst und Forschung (SKF) for research funding landscape, call fit, proposal development, internal routing and funded-project coordination.
50 50  
51 -**Role of Support Kunst und Forschung (SKF):** Lead / central project and funding hub for this topic; specialist services are involved when the call triggers legal, financial, HR, data, IT or other requirements.
51 +**Role of Support Kunst und Forschung (SKF):** Lead / central project-and-funding hub for this topic; specialist units are involved when the call triggers legal, financial, HR, data, IT or other requirements.
52 52  {{/info}}
53 53  
54 -If you are unsure which route applies, start with the specialist service named above. For funded or project-based research involving several units, SKF can coordinate the project route.
54 +If you are unsure which route applies, start with the service named above. For funded or project-based research where several units are involved, SKF can coordinate the project route.
55 55  
56 56  {{html}}
57 57  <!-- ARSN_SEARCH_TERMS_START -->
... ... @@ -62,7 +62,7 @@
62 62  This topic can also be found through related terms, synonyms and common search queries.
63 63  Select a term to search the Art &amp; Research Services Navigator.
64 64  </p>
65 -<p style="margin:0;"><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=art%20and%20research#arsn-search-input" class="arsn-search-term" data-search-term="art and research" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">art and research</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=prepare#arsn-search-input" class="arsn-search-term" data-search-term="prepare" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">prepare</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=research%20funding#arsn-search-input" class="arsn-search-term" data-search-term="research funding" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">research funding</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funder%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="funder requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funder requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=grant%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="grant requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">grant requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=data%20management%20plan#arsn-search-input" class="arsn-search-term" data-search-term="data management plan" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">data management plan</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=open%20science%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="open science requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">open science requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=eligible%20costs#arsn-search-input" class="arsn-search-term" data-search-term="eligible costs" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">eligible costs</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funding#arsn-search-input" class="arsn-search-term" data-search-term="funding" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funding</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=grant#arsn-search-input" class="arsn-search-term" data-search-term="grant" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">grant</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=grant%20application#arsn-search-input" class="arsn-search-term" data-search-term="grant application" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">grant application</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funder#arsn-search-input" class="arsn-search-term" data-search-term="funder" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funder</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funding%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="funding requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funding requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=f%C3%B6rderung#arsn-search-input" class="arsn-search-term" data-search-term="förderung" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">förderung</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=f%C3%B6rdergeber#arsn-search-input" class="arsn-search-term" data-search-term="fördergeber" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">fördergeber</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=f%C3%B6rderbedingungen#arsn-search-input" class="arsn-search-term" data-search-term="förderbedingungen" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">förderbedingungen</a></p>
65 +<p style="margin:0;"><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=art%20and%20research#arsn-search-input" class="arsn-search-term" data-search-term="art and research" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">art and research</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=enable#arsn-search-input" class="arsn-search-term" data-search-term="enable" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">enable</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=research%20funding#arsn-search-input" class="arsn-search-term" data-search-term="research funding" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">research funding</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funder%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="funder requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funder requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=grant%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="grant requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">grant requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=data%20management%20plan#arsn-search-input" class="arsn-search-term" data-search-term="data management plan" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">data management plan</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=open%20science%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="open science requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">open science requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=eligible%20costs#arsn-search-input" class="arsn-search-term" data-search-term="eligible costs" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">eligible costs</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funding#arsn-search-input" class="arsn-search-term" data-search-term="funding" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funding</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=grant#arsn-search-input" class="arsn-search-term" data-search-term="grant" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">grant</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=grant%20application#arsn-search-input" class="arsn-search-term" data-search-term="grant application" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">grant application</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funder#arsn-search-input" class="arsn-search-term" data-search-term="funder" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funder</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=funding%20requirements#arsn-search-input" class="arsn-search-term" data-search-term="funding requirements" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">funding requirements</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=f%C3%B6rderung#arsn-search-input" class="arsn-search-term" data-search-term="förderung" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">förderung</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=f%C3%B6rdergeber#arsn-search-input" class="arsn-search-term" data-search-term="fördergeber" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">fördergeber</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=f%C3%B6rderbedingungen#arsn-search-input" class="arsn-search-term" data-search-term="förderbedingungen" style="display:inline-block;margin:3px 5px 3px 0;padding:3px 8px;border:1px solid #d7d7d7;border-radius:14px;background:#fff;color:#333;text-decoration:none;font-size:12px;">förderbedingungen</a></p>
66 66  </div>
67 67  </details>
68 68  <!-- ARSN_SEARCH_TERMS_END -->
... ... @@ -69,132 +69,23 @@
69 69  {{/html}}
70 70  
71 71  {{html clean="false"}}
72 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START -->
73 -
74 -<style data-sn-service-navigator-master="1">
75 -/* =========================================================
76 - MASTER TYPOGRAPHY
77 - ========================================================= */
78 -#xwikicontent h1,
79 -#xwikicontent h2,
80 -#xwikicontent h3,
81 -#xwikicontent h4,
82 -#xwikicontent h5,
83 -#xwikicontent h6,
84 -#xwikicontent .box-title,
85 -#xwikicontent [role="heading"],
86 -#xwikicontent h1 a,
87 -#xwikicontent h2 a,
88 -#xwikicontent h3 a,
89 -#xwikicontent h4 a,
90 -#xwikicontent h5 a,
91 -#xwikicontent h6 a,
92 -#xwikicontent .box-title a,
93 -#xwikicontent [role="heading"] a{
94 - text-align:left!important;
95 - text-justify:auto!important;
96 - word-spacing:normal!important;
97 -}
98 -
99 -/* =========================================================
100 - COMING SOON / IN VORBEREITUNG
101 - ========================================================= */
102 -.sn-coming-soon-badge{
103 - display:inline-block;
104 - vertical-align:middle;
105 - margin-left:10px;
106 - padding:4px 8px;
107 - border-radius:14px;
108 - border:1px solid #efd9cc;
109 - background:#fff4ee;
110 - color:#8a4d36;
111 - font-size:11px;
112 - font-weight:700;
113 - letter-spacing:.055em;
114 - line-height:1.2;
115 - white-space:nowrap;
116 -}
117 -
118 -/* =========================================================
119 - NATIVE / DETAIL CALLOUT GEOMETRY
120 - Preserve existing backgrounds.
121 - ========================================================= */
122 -#xwikicontent .arsn-info,
123 -#xwikicontent .dmp-info,
124 -#xwikicontent .ido-info,
125 -#xwikicontent .pp-info,
126 -#xwikicontent .infomessage{
127 - box-sizing:border-box!important;
128 - border-left:4px solid #21b6d7!important;
129 - border-radius:8px;
130 - text-align:left!important;
131 - word-spacing:normal!important;
132 -}
133 -
134 -#xwikicontent .arsn-warn,
135 -#xwikicontent .dmp-warn,
136 -#xwikicontent .ido-warn,
137 -#xwikicontent .pp-warn,
138 -#xwikicontent .warn,
139 -#xwikicontent .warning,
140 -#xwikicontent .warningmessage,
141 -#xwikicontent .errormessage{
142 - box-sizing:border-box!important;
143 - border-left:4px solid #e94b13!important;
144 - border-radius:8px;
145 - text-align:left!important;
146 - word-spacing:normal!important;
147 -}
148 -
149 -[data-sn-master-equal-height],
150 -[data-sn-master-first-row]{
72 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_START -->
73 +<style data-sn-horizontal-box-harmonizer="4">
74 +[data-sn-equal-height-managed],
75 +[data-sn-first-section-aligned]{
151 151   box-sizing:border-box;
152 152  }
153 -
154 -/* =========================================================
155 - FULL-WIDTH THREE-LINE NUMBER / TITLE / SUBTITLE BLOCKS
156 - ========================================================= */
157 -#xwikicontent .arsn-area-label[data-sn-three-line="1"]{
158 - display:grid!important;
159 - grid-template-columns:minmax(0,1fr)!important;
160 - grid-auto-rows:auto!important;
161 - width:100%!important;
162 - max-width:none!important;
163 - box-sizing:border-box!important;
164 - justify-items:start!important;
165 - align-items:start!important;
166 - gap:2px!important;
167 - text-align:left!important;
168 - text-align-last:left!important;
169 - text-justify:auto!important;
170 - word-spacing:normal!important;
171 - white-space:normal!important;
172 -}
173 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-number,
174 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .sn-area-label-title,
175 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-action{
176 - display:block!important;
177 - width:100%!important;
178 - margin:0!important;
179 - text-align:left!important;
180 - text-align-last:left!important;
181 - text-justify:auto!important;
182 - word-spacing:normal!important;
183 - white-space:normal!important;
184 -}
185 185  </style>
186 -
187 -<script data-sn-service-navigator-master="1">
79 +<script data-sn-horizontal-box-harmonizer="4">
188 188  (function(){
189 189   "use strict";
190 190  
191 - var PAGE_KIND="detail";
192 - var PLACEHOLDER=true;
193 - var PLACEHOLDER_LABEL="COMING SOON";
194 -
195 195   var MOBILE_MAX=767;
196 196   var ROW_TOLERANCE=6;
197 - var RESIZE_DEBOUNCE=220;
85 + var MIN_W=150;
86 + var MIN_H=36;
87 + var MAX_PARENT_CHILDREN=16;
88 + var SEARCH_DEPTH=5;
198 198  
199 199   var root=
200 200   document.getElementById("xwikicontent")||
... ... @@ -204,105 +204,93 @@
204 204  
205 205   if(!root)return;
206 206  
207 - var managedHeight=new Set();
208 - var managedMargin=new Set();
209 - var originalHeight=new WeakMap();
210 - var originalMargin=new WeakMap();
98 + var heightManaged=new Set();
99 + var sectionManaged=new Set();
100 + var originalMinHeight=new WeakMap();
101 + var originalMarginTop=new WeakMap();
102 + var raf=0;
211 211  
212 - var resizeTimer=0;
213 - var running=false;
104 + function num(v){
105 + var n=parseFloat(v);
106 + return Number.isFinite(n)?n:0;
107 + }
214 214  
215 - var THEMES=[
216 - {
217 - name:"BLUE",
218 - accent:"#21b6d7",
219 - bg:"#eaf7fb",
220 - text:"#315d68",
221 - labels:[
222 - "HIER STARTEN",
223 - "ENTSCHEIDEN",
224 - "ÜBERPRÜFEN & ANPASSEN",
225 - "START HERE",
226 - "DECIDE",
227 - "REVIEW & ADAPT"
228 - ]
229 - },
230 - {
231 - name:"RED",
232 - accent:"#e94b13",
233 - bg:"#fff1ec",
234 - text:"#8a4d36",
235 - labels:[
236 - "PLANEN & ORGANISIEREN",
237 - "ORGANISIEREN & DOKUMENTIEREN",
238 - "PUBLIZIEREN & PRÄSENTIEREN",
239 - "PLAN & ORGANISE",
240 - "PLAN & ORGANIZE",
241 - "ORGANISE & DOCUMENT",
242 - "ORGANIZE & DOCUMENT",
243 - "PUBLISH & PRESENT"
244 - ]
245 - },
246 - {
247 - name:"YELLOW",
248 - accent:"#f0aa00",
249 - bg:"#fff8e7",
250 - text:"#785b17",
251 - labels:[
252 - "SCHÜTZEN & KLÄREN",
253 - "STANDARDISIEREN & IDENTIFIZIEREN",
254 - "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN",
255 - "PROTECT & CLARIFY",
256 - "STANDARDISE & IDENTIFY",
257 - "STANDARDIZE & IDENTIFY",
258 - "OPEN, REUSE & MAKE FINDABLE"
259 - ]
260 - },
261 - {
262 - name:"GREEN",
263 - accent:"#38b76a",
264 - bg:"#edf9f1",
265 - text:"#3f7451",
266 - labels:[
267 - "INFRASTRUKTUR EINRICHTEN",
268 - "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN",
269 - "SPEICHERN & ZUGRIFF STEUERN",
270 - "REPOSITORIUM, ERHALTEN & ÜBERGEBEN",
271 - "SET UP INFRASTRUCTURE",
272 - "SET UP INFRASTRUCTURE & COLLABORATION",
273 - "STORE & CONTROL ACCESS",
274 - "REPOSITORY, PRESERVE & HAND OVER"
275 - ]
109 + function visible(el,minW,minH){
110 + if(!el||el.nodeType!==1)return false;
111 +
112 + var s=getComputedStyle(el);
113 +
114 + if(
115 + s.display==="none"||
116 + s.visibility==="hidden"||
117 + Number(s.opacity)===0
118 + ){
119 + return false;
276 276   }
277 - ];
278 278  
279 - function num(value){
280 - var n=parseFloat(value);
281 - return Number.isFinite(n)?n:0;
122 + var r=el.getBoundingClientRect();
123 +
124 + return (
125 + r.width>=(minW||1)&&
126 + r.height>=(minH||1)
127 + );
282 282   }
283 283  
284 - function norm(value){
285 - return String(value||"")
286 - .replace(/\s+/g," ")
287 - .trim()
288 - .toUpperCase();
130 + function excluded(el){
131 + return (
132 + !el.matches||
133 + el.matches(
134 + "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]"
135 + )
136 + );
289 289   }
290 290  
291 - function visible(el){
292 - if(!el||el.nodeType!==1)return false;
139 + function namedLikeBox(el){
140 + var c=
141 + typeof el.className==="string"
142 + ? el.className
143 + : "";
293 293  
294 - var style=getComputedStyle(el);
295 - var rect=el.getBoundingClientRect();
145 + return /(^|[s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([s_-]|$)/i.test(c);
146 + }
296 296  
148 + function boxLike(el){
149 + if(!visible(el,MIN_W,MIN_H)||excluded(el))return false;
150 +
151 + var s=getComputedStyle(el);
152 + var r=el.getBoundingClientRect();
153 +
154 + var border=
155 + num(s.borderTopWidth)+
156 + num(s.borderRightWidth)+
157 + num(s.borderBottomWidth)+
158 + num(s.borderLeftWidth);
159 +
160 + var radius=Math.max(
161 + num(s.borderTopLeftRadius),
162 + num(s.borderTopRightRadius),
163 + num(s.borderBottomLeftRadius),
164 + num(s.borderBottomRightRadius)
165 + );
166 +
167 + var bg=
168 + s.backgroundColor&&
169 + s.backgroundColor!=="rgba(0, 0, 0, 0)"&&
170 + s.backgroundColor!=="transparent";
171 +
172 + var shadow=
173 + s.boxShadow&&
174 + s.boxShadow!=="none";
175 +
297 297   return (
298 - style.display!=="none"&&
299 - style.visibility!=="hidden"&&
300 - rect.width>20&&
301 - rect.height>4
177 + namedLikeBox(el)||
178 + border>=1||
179 + (bg&&radius>=3)||
180 + (shadow&&r.width>=180)
302 302   );
303 303   }
304 304  
305 - function saveStyle(el,map,property){
184 + function saveOriginal(el,map,property){
306 306   if(map.has(el))return;
307 307  
308 308   map.set(el,{
... ... @@ -311,7 +311,7 @@
311 311   });
312 312   }
313 313  
314 - function restoreStyle(el,map,property){
193 + function restoreOriginal(el,map,property){
315 315   var original=map.get(el);
316 316  
317 317   if(original&&original.value){
... ... @@ -325,470 +325,247 @@
325 325   }
326 326   }
327 327  
328 - function resetRuntime(){
329 - managedHeight.forEach(function(el){
330 - restoreStyle(
207 + function reset(){
208 + heightManaged.forEach(function(el){
209 + restoreOriginal(
331 331   el,
332 - originalHeight,
211 + originalMinHeight,
333 333   "min-height"
334 334   );
214 +
335 335   el.removeAttribute(
336 - "data-sn-master-equal-height"
216 + "data-sn-equal-height-managed"
337 337   );
338 338   });
339 339  
340 - managedMargin.forEach(function(el){
341 - restoreStyle(
220 + sectionManaged.forEach(function(el){
221 + restoreOriginal(
342 342   el,
343 - originalMargin,
223 + originalMarginTop,
344 344   "margin-top"
345 345   );
226 +
346 346   el.removeAttribute(
347 - "data-sn-master-first-row"
228 + "data-sn-first-section-aligned"
348 348   );
349 349   });
350 350  
351 - managedHeight.clear();
352 - managedMargin.clear();
232 + heightManaged.clear();
233 + sectionManaged.clear();
353 353   }
354 354  
355 - function themeFor(text){
356 - var value=norm(text);
236 + function pickTarget(child){
237 + if(!visible(child,MIN_W,MIN_H))return null;
357 357  
358 - for(var i=0;i<THEMES.length;i++){
359 - for(var j=0;j<THEMES[i].labels.length;j++){
360 - var label=THEMES[i].labels[j];
361 -
362 - if(
363 - value===label||
364 - value.indexOf(label+" ")===0||
365 - value.indexOf(label+" -")===0||
366 - value.indexOf(label+" ·")===0
367 - ){
368 - return THEMES[i];
369 - }
370 - }
239 + if(boxLike(child)){
240 + return child;
371 371   }
372 372  
373 - return null;
374 - }
243 + var cr=child.getBoundingClientRect();
244 + var q=[];
375 375  
376 - /* =======================================================
377 - BORDERLESS FILLED RED/ORANGE CTA BUTTONS
378 - ======================================================= */
379 -
380 - function colourDistance(a,b){
381 - return Math.sqrt(
382 - Math.pow(a[0]-b[0],2)+
383 - Math.pow(a[1]-b[1],2)+
384 - Math.pow(a[2]-b[2],2)
385 - );
386 - }
387 -
388 - function makeFilledRedOrangeCTAsBorderless(){
389 - var RED_ORANGE=[233,75,19];
390 -
391 - Array.from(
392 - root.querySelectorAll(
393 - 'a,button,[role="button"],input[type="submit"],input[type="button"]'
394 - )
395 - ).forEach(function(el){
396 - if(!visible(el))return;
397 -
398 - var style=getComputedStyle(el);
399 - var rgb=parseRGB(style.backgroundColor);
400 -
401 - if(!rgb)return;
402 -
403 - if(
404 - colourDistance(
405 - rgb,
406 - RED_ORANGE
407 - )>55
408 - ){
409 - return;
410 - }
411 -
412 - var rect=el.getBoundingClientRect();
413 -
414 - if(
415 - rect.width<80||
416 - rect.height<24
417 - ){
418 - return;
419 - }
420 -
421 - el.style.setProperty(
422 - "border",
423 - "none",
424 - "important"
425 - );
426 -
427 - el.style.setProperty(
428 - "border-left",
429 - "none",
430 - "important"
431 - );
432 -
433 - el.style.setProperty(
434 - "border-top",
435 - "none",
436 - "important"
437 - );
438 -
439 - el.style.setProperty(
440 - "border-right",
441 - "none",
442 - "important"
443 - );
444 -
445 - el.style.setProperty(
446 - "border-bottom",
447 - "none",
448 - "important"
449 - );
450 -
451 - el.style.setProperty(
452 - "box-shadow",
453 - "none",
454 - "important"
455 - );
246 + Array.from(child.children||[]).forEach(function(el){
247 + q.push({el:el,depth:1});
456 456   });
457 - }
458 458  
459 - /* =======================================================
460 - FULL-WIDTH THREE-LINE AREA LABELS
461 - ======================================================= */
250 + var best=null;
251 + var bestScore=-Infinity;
462 462  
463 - function compactText(value){
464 - return String(value||"")
465 - .replace(/\s+/g," ")
466 - .trim();
467 - }
253 + while(q.length){
254 + var item=q.shift();
255 + var el=item.el;
468 468  
469 - function makeThreeLineAreaLabels(){
470 - Array.from(
471 - root.querySelectorAll(
472 - ".arsn-area-label"
473 - )
474 - ).forEach(function(label){
475 - if(
476 - label.getAttribute(
477 - "data-sn-three-line"
478 - )==="1"
479 - ){
480 - return;
481 - }
257 + if(!visible(el,MIN_W,MIN_H))continue;
482 482  
483 - var number=
484 - label.querySelector(
485 - ":scope > .arsn-area-number"
486 - );
259 + var r=el.getBoundingClientRect();
487 487  
488 - var action=
489 - label.querySelector(
490 - ":scope > .arsn-area-action"
491 - );
492 -
493 493   if(
494 - !number||
495 - !action
262 + r.width>=cr.width*.68&&
263 + boxLike(el)
496 496   ){
497 - return;
498 - }
265 + var widthFit=
266 + 1-Math.min(
267 + 1,
268 + Math.abs(cr.width-r.width)/
269 + Math.max(1,cr.width)
270 + );
499 499  
500 - var clone=
501 - label.cloneNode(true);
272 + var topFit=
273 + 1-Math.min(
274 + 1,
275 + Math.abs(cr.top-r.top)/100
276 + );
502 502  
503 - var cloneNumber=
504 - clone.querySelector(
505 - ":scope > .arsn-area-number"
506 - );
278 + var score=
279 + widthFit*6+
280 + topFit*3+
281 + Math.min(r.height,900)/450+
282 + Math.min(r.width*r.height,900000)/900000;
507 507  
508 - var cloneAction=
509 - clone.querySelector(
510 - ":scope > .arsn-area-action"
511 - );
512 -
513 - if(cloneNumber){
514 - cloneNumber.remove();
284 + if(score>bestScore){
285 + best=el;
286 + bestScore=score;
287 + }
515 515   }
516 516  
517 - if(cloneAction){
518 - cloneAction.remove();
290 + if(item.depth<SEARCH_DEPTH){
291 + Array.from(el.children||[]).forEach(function(next){
292 + q.push({
293 + el:next,
294 + depth:item.depth+1
295 + });
296 + });
519 519   }
298 + }
520 520  
521 - var titleText=
522 - compactText(
523 - clone.textContent
524 - );
300 + return best;
301 + }
525 525  
526 - if(!titleText){
527 - return;
528 - }
303 + function groupsByVisualRow(entries){
304 + var groups=[];
529 529  
530 - var numberNode=
531 - number.cloneNode(true);
532 -
533 - var actionNode=
534 - action.cloneNode(true);
535 -
536 - var titleNode=
537 - document.createElement(
538 - "span"
306 + entries
307 + .slice()
308 + .sort(function(a,b){
309 + return (
310 + a.rect.top-b.rect.top||
311 + a.rect.left-b.rect.left
539 539   );
313 + })
314 + .forEach(function(entry){
315 + var group=null;
540 540  
541 - titleNode.className=
542 - "sn-area-label-title";
317 + for(var i=0;i<groups.length;i++){
318 + if(
319 + Math.abs(
320 + groups[i].top-
321 + entry.rect.top
322 + )<=ROW_TOLERANCE
323 + ){
324 + group=groups[i];
325 + break;
326 + }
327 + }
543 543  
544 - titleNode.textContent=
545 - titleText;
329 + if(!group){
330 + group={
331 + top:entry.rect.top,
332 + entries:[]
333 + };
334 + groups.push(group);
335 + }
546 546  
547 - while(label.firstChild){
548 - label.removeChild(
549 - label.firstChild
550 - );
551 - }
337 + group.entries.push(entry);
338 + });
552 552  
553 - label.appendChild(
554 - numberNode
555 - );
556 -
557 - label.appendChild(
558 - titleNode
559 - );
560 -
561 - label.appendChild(
562 - actionNode
563 - );
564 -
565 - label.setAttribute(
566 - "data-sn-three-line",
567 - "1"
568 - );
569 -
570 - var head=
571 - label.closest(
572 - ".arsn-area-head"
573 - );
574 -
575 - if(head){
576 - head.style.setProperty(
577 - "width",
578 - "100%",
579 - "important"
580 - );
581 -
582 - head.style.setProperty(
583 - "max-width",
584 - "100%",
585 - "important"
586 - );
587 -
588 - head.style.setProperty(
589 - "box-sizing",
590 - "border-box",
591 - "important"
592 - );
593 - }
594 - });
340 + return groups;
595 595   }
596 596  
597 - /* =======================================================
598 - PLACEHOLDER BADGE
599 - ======================================================= */
343 + function validHorizontalGroup(group){
344 + if(group.entries.length<2)return false;
600 600  
601 - function applyPlaceholderBadge(){
602 - if(!PLACEHOLDER)return;
346 + var lefts=
347 + group.entries
348 + .map(function(e){return e.rect.left;})
349 + .sort(function(a,b){return a-b;});
603 603  
604 604   if(
605 - document.querySelector(
606 - ".sn-coming-soon-badge"
607 - )
352 + lefts[lefts.length-1]-
353 + lefts[0]<
354 + 80
608 608   ){
609 - return;
356 + return false;
610 610   }
611 611  
612 - var title=
613 - document.querySelector(
614 - "#document-title"
615 - )||
616 - document.querySelector(
617 - "h1"
618 - );
359 + var widths=
360 + group.entries
361 + .map(function(e){return e.rect.width;})
362 + .filter(function(w){return w>0;});
619 619  
620 - if(!title)return;
364 + if(widths.length<2)return false;
621 621  
622 - var badge=
623 - document.createElement(
624 - "span"
625 - );
366 + var minWidth=Math.min.apply(Math,widths);
367 + var maxWidth=Math.max.apply(Math,widths);
626 626  
627 - badge.className=
628 - "sn-coming-soon-badge";
629 -
630 - badge.textContent=
631 - PLACEHOLDER_LABEL;
632 -
633 - badge.setAttribute(
634 - "aria-label",
635 - PLACEHOLDER_LABEL
369 + return (
370 + maxWidth/
371 + Math.max(1,minWidth)<=
372 + 1.9
636 636   );
374 + }
637 637  
638 - title.appendChild(
639 - badge
640 - );
376 + function normalizeText(text){
377 + return String(text||"")
378 + .replace(/s+/g," ")
379 + .trim()
380 + .toUpperCase();
641 641   }
642 642  
643 - /* =======================================================
644 - DETAIL PAGE OWN-ACCENT PROPAGATION
645 - ======================================================= */
383 + function exactKnownFirstSection(el){
384 + var text=normalizeText(el.textContent);
646 646  
647 - function parseRGB(value){
648 - var match=String(value||"").match(
649 - /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i
386 + return (
387 + text==="HIER STARTEN"||
388 + text==="ORGANISIEREN & DOKUMENTIEREN"||
389 + text==="ENTSCHEIDEN"||
390 + text==="START HERE"||
391 + text==="GET STARTED"||
392 + text==="ORGANISE & DOCUMENT"||
393 + text==="ORGANIZE & DOCUMENT"||
394 + text==="DECIDE"
650 650   );
651 -
652 - if(!match)return null;
653 -
654 - return [
655 - Number(match[1]),
656 - Number(match[2]),
657 - Number(match[3])
658 - ];
659 659   }
660 660  
661 - function distance(a,b){
662 - return Math.sqrt(
663 - Math.pow(a[0]-b[0],2)+
664 - Math.pow(a[1]-b[1],2)+
665 - Math.pow(a[2]-b[2],2)
666 - );
667 - }
398 + function visuallyFirstSectionBar(card){
399 + var cardRect=card.getBoundingClientRect();
400 + var candidates=[];
668 668  
669 - function paletteMatch(cssColor){
670 - var rgb=parseRGB(cssColor);
671 -
672 - if(!rgb)return null;
673 -
674 - var palette=[
675 - {hex:"#21b6d7",rgb:[33,182,215]},
676 - {hex:"#e94b13",rgb:[233,75,19]},
677 - {hex:"#f0aa00",rgb:[240,170,0]},
678 - {hex:"#38b76a",rgb:[56,183,106]}
679 - ];
680 -
681 - var best=null;
682 - var bestDistance=Infinity;
683 -
684 - palette.forEach(function(item){
685 - var d=distance(rgb,item.rgb);
686 -
687 - if(d<bestDistance){
688 - best=item;
689 - bestDistance=d;
690 - }
691 - });
692 -
693 - return bestDistance<=30
694 - ?best
695 - :null;
696 - }
697 -
698 - function propagateDetailAccents(){
699 - if(PAGE_KIND!=="detail")return;
700 -
701 701   Array.from(
702 - root.querySelectorAll(
703 - ".arsn-call,.dmp-call,.ido-call,.pp-call,"+
704 - ".arsn-source,.dmp-source,.ido-source,.pp-source"
403 + card.querySelectorAll(
404 + "div,p,span,strong,h3,h4,h5,h6"
705 705   )
706 706   ).forEach(function(el){
707 - if(!visible(el))return;
407 + if(!visible(el,20,6))return;
408 + if(excluded(el))return;
708 708  
709 - var style=getComputedStyle(el);
410 + var r=el.getBoundingClientRect();
411 + var relativeTop=r.top-cardRect.top;
710 710  
711 711   if(
712 - num(style.borderTopWidth)>=2
414 + relativeTop<45||
415 + relativeTop>cardRect.height*.72
713 713   ){
714 - var match=
715 - paletteMatch(
716 - style.borderTopColor
717 - );
718 -
719 - if(match){
720 - el.style.setProperty(
721 - "border-left",
722 - "4px solid "+match.hex,
723 - "important"
724 - );
725 - }
417 + return;
726 726   }
727 - });
728 728  
729 - // Warning families: explicit safety override.
730 - Array.from(
731 - root.querySelectorAll(
732 - ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+
733 - ".warn,.warning,.warningmessage,.errormessage"
734 - )
735 - ).forEach(function(el){
736 - if(!visible(el))return;
420 + var widthRatio=
421 + r.width/
422 + Math.max(1,cardRect.width);
737 737  
738 - el.style.setProperty(
739 - "border-left",
740 - "4px solid #e94b13",
741 - "important"
742 - );
743 - });
424 + if(
425 + widthRatio<.55||
426 + widthRatio>1.05||
427 + r.height>54
428 + ){
429 + return;
430 + }
744 744  
745 - // Info families: explicit orientation override.
746 - Array.from(
747 - root.querySelectorAll(
748 - ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage"
749 - )
750 - ).forEach(function(el){
751 - if(!visible(el))return;
432 + var text=normalizeText(el.textContent);
752 752  
753 - el.style.setProperty(
754 - "border-left",
755 - "4px solid #21b6d7",
756 - "important"
757 - );
758 - });
759 - }
434 + if(
435 + text.length<2||
436 + text.length>90
437 + ){
438 + return;
439 + }
760 760  
761 - /* =======================================================
762 - OVERVIEW SEMANTIC THEME PALETTE
763 - ======================================================= */
441 + var style=getComputedStyle(el);
764 764  
765 - function smallestThemeHeaders(){
766 - return Array.from(
767 - root.querySelectorAll(
768 - "div,span,p,strong,h3,h4,h5,h6"
769 - )
770 - ).filter(function(el){
771 - if(!visible(el))return false;
772 - if(!themeFor(el.textContent))return false;
443 + var bg=
444 + style.backgroundColor&&
445 + style.backgroundColor!=="rgba(0, 0, 0, 0)"&&
446 + style.backgroundColor!=="transparent";
773 773  
774 - return !Array.from(
775 - el.children||[]
776 - ).some(function(child){
777 - return !!themeFor(
778 - child.textContent
779 - );
780 - });
781 - });
782 - }
783 -
784 - function findOverviewCard(header){
785 - var node=header.parentElement;
786 - var candidates=[];
787 -
788 - while(node&&node!==root){
789 - var rect=node.getBoundingClientRect();
790 - var style=getComputedStyle(node);
791 -
792 792   var border=
793 793   num(style.borderTopWidth)+
794 794   num(style.borderRightWidth)+
... ... @@ -795,677 +795,315 @@
795 795   num(style.borderBottomWidth)+
796 796   num(style.borderLeftWidth);
797 797  
798 - if(
799 - rect.width>=220&&
800 - rect.width<=800&&
801 - rect.height>=120&&
802 - border>=1
803 - ){
804 - candidates.push(node);
805 - }
454 + var mostlyUpper=
455 + text.length>=3&&
456 + text===text.toUpperCase();
806 806  
807 - node=node.parentElement;
808 - }
458 + var exact=exactKnownFirstSection(el);
809 809  
810 - if(!candidates.length)return null;
460 + var score=
461 + (exact?20:0)+
462 + (bg?6:0)+
463 + (border>=1?2:0)+
464 + (mostlyUpper?4:0)+
465 + (num(style.fontWeight)>=600?1:0);
811 811  
812 - candidates.sort(function(a,b){
813 - return (
814 - b.getBoundingClientRect().height-
815 - a.getBoundingClientRect().height
816 - );
467 + if(score>=7){
468 + candidates.push({
469 + el:el,
470 + relativeTop:relativeTop,
471 + width:r.width,
472 + score:score
473 + });
474 + }
817 817   });
818 818  
819 - return candidates[0];
820 - }
477 + if(!candidates.length)return null;
821 821  
822 - function rowCandidates(link,card){
823 - var result=[];
824 - var cardRect=
825 - card.getBoundingClientRect();
826 -
827 - var node=link;
828 -
829 - while(node&&node!==card){
830 - if(visible(node)){
831 - var rect=
832 - node.getBoundingClientRect();
833 -
834 - if(
835 - rect.height<=105&&
836 - rect.width>=
837 - cardRect.width*.50&&
838 - rect.width<=
839 - cardRect.width*1.03
840 - ){
841 - result.push(node);
842 - }
479 + candidates.sort(function(a,b){
480 + if(a.score!==b.score)return b.score-a.score;
481 + if(Math.abs(a.relativeTop-b.relativeTop)>3){
482 + return a.relativeTop-b.relativeTop;
843 843   }
484 + return b.width-a.width;
485 + });
844 844  
845 - node=node.parentElement;
846 - }
487 + // For exact known labels always prefer the earliest exact match.
488 + var exacts=candidates.filter(function(c){
489 + return exactKnownFirstSection(c.el);
490 + });
847 847  
848 - return result;
849 - }
850 -
851 - function chooseOuterRow(
852 - candidates,
853 - link
854 - ){
855 - if(!candidates.length){
856 - return link;
492 + if(exacts.length){
493 + exacts.sort(function(a,b){
494 + return a.relativeTop-b.relativeTop||b.width-a.width;
495 + });
496 + return exacts[0].el;
857 857   }
858 858  
859 - var bordered=
860 - candidates.filter(function(el){
861 - return (
862 - num(
863 - getComputedStyle(el)
864 - .borderLeftWidth
865 - )>=1
866 - );
867 - });
499 + // Generic fallback: earliest high-confidence bar.
500 + candidates.sort(function(a,b){
501 + return a.relativeTop-b.relativeTop||b.score-a.score||b.width-a.width;
502 + });
868 868  
869 - var pool=
870 - bordered.length
871 - ?bordered
872 - :candidates;
504 + return candidates[0].el;
505 + }
873 873  
874 - pool.sort(function(a,b){
875 - var ar=
876 - a.getBoundingClientRect();
507 + function alignFirstSections(cards){
508 + var rows=
509 + cards.map(function(card){
510 + var bar=
511 + visuallyFirstSectionBar(card);
877 877  
878 - var br=
879 - b.getBoundingClientRect();
513 + if(!bar)return null;
880 880  
881 - return (
882 - ar.left-br.left||
883 - br.width-ar.width
884 - );
885 - });
515 + var cardRect=
516 + card.getBoundingClientRect();
886 886  
887 - return pool[0]||link;
888 - }
518 + var barRect=
519 + bar.getBoundingClientRect();
889 889  
890 - function applyOverviewPalette(){
891 - if(PAGE_KIND!=="overview"){
892 - return [];
521 + return {
522 + card:card,
523 + bar:bar,
524 + relativeTop:
525 + barRect.top-cardRect.top,
526 + label:
527 + normalizeText(bar.textContent)
528 + };
529 + });
530 +
531 + // Conservative: only align when every card in the horizontal row
532 + // has a reliable first section bar.
533 + if(
534 + rows.some(function(row){
535 + return !row;
536 + })
537 + ){
538 + return null;
893 893   }
894 894  
895 - var headers=
896 - smallestThemeHeaders()
897 - .map(function(el){
898 - return {
899 - el:el,
900 - theme:
901 - themeFor(
902 - el.textContent
903 - ),
904 - card:
905 - findOverviewCard(
906 - el
907 - )
908 - };
541 + var targetTop=
542 + Math.max.apply(
543 + Math,
544 + rows.map(function(row){
545 + return row.relativeTop;
909 909   })
910 - .filter(function(row){
911 - return !!row.card;
912 - });
547 + );
913 913  
914 - var unique=[];
915 - var seenHeaders=new Set();
549 + rows.forEach(function(row){
550 + var delta=
551 + targetTop-
552 + row.relativeTop;
916 916  
917 - headers.forEach(function(row){
918 - var key=
919 - row.theme.name+
920 - "|"+
921 - Math.round(
922 - row.card
923 - .getBoundingClientRect()
924 - .left
925 - )+
926 - "|"+
927 - Math.round(
928 - row.el
929 - .getBoundingClientRect()
930 - .top
931 - );
554 + if(delta<=1)return;
932 932  
933 - if(!seenHeaders.has(key)){
934 - seenHeaders.add(key);
935 - unique.push(row);
936 - }
937 - });
938 -
939 - unique.forEach(function(row){
940 - var headerRect=
941 - row.el
942 - .getBoundingClientRect();
943 -
944 - row.el.style.setProperty(
945 - "background",
946 - row.theme.bg,
947 - "important"
556 + saveOriginal(
557 + row.bar,
558 + originalMarginTop,
559 + "margin-top"
948 948   );
949 949  
950 - row.el.style.setProperty(
951 - "color",
952 - row.theme.text,
953 - "important"
954 - );
562 + var currentMargin=
563 + num(
564 + getComputedStyle(
565 + row.bar
566 + ).marginTop
567 + );
955 955  
956 - row.el.style.setProperty(
957 - "text-align",
958 - "left",
959 - "important"
569 + row.bar.style.setProperty(
570 + "margin-top",
571 + (
572 + currentMargin+
573 + delta
574 + )+"px"
960 960   );
961 961  
962 - row.el.style.setProperty(
963 - "word-spacing",
964 - "normal",
965 - "important"
577 + row.bar.setAttribute(
578 + "data-sn-first-section-aligned",
579 + "4"
966 966   );
967 967  
968 - var later=
969 - unique
970 - .filter(function(other){
971 - return (
972 - other.card===row.card&&
973 - other.el
974 - .getBoundingClientRect()
975 - .top>
976 - headerRect.top+2
977 - );
978 - })
979 - .sort(function(a,b){
980 - return (
981 - a.el
982 - .getBoundingClientRect()
983 - .top-
984 - b.el
985 - .getBoundingClientRect()
986 - .top
987 - );
988 - });
989 -
990 - var stopTop=
991 - later.length
992 - ?later[0].el
993 - .getBoundingClientRect()
994 - .top
995 - :Infinity;
996 -
997 - Array.from(
998 - row.card.querySelectorAll("a")
999 - ).forEach(function(link){
1000 - if(!visible(link))return;
1001 -
1002 - var rect=
1003 - link.getBoundingClientRect();
1004 -
1005 - if(
1006 - rect.top<=
1007 - headerRect.bottom-2||
1008 - rect.top>=
1009 - stopTop-2
1010 - ){
1011 - return;
1012 - }
1013 -
1014 - var candidates=
1015 - rowCandidates(
1016 - link,
1017 - row.card
1018 - );
1019 -
1020 - var target=
1021 - chooseOuterRow(
1022 - candidates,
1023 - link
1024 - );
1025 -
1026 - candidates.forEach(function(el){
1027 - el.style.setProperty(
1028 - "border-left",
1029 - "0 solid transparent",
1030 - "important"
1031 - );
1032 - });
1033 -
1034 - target.style.setProperty(
1035 - "border-left",
1036 - "3px solid "+
1037 - row.theme.accent,
1038 - "important"
1039 - );
1040 -
1041 - target.style.setProperty(
1042 - "box-sizing",
1043 - "border-box",
1044 - "important"
1045 - );
1046 - });
582 + sectionManaged.add(row.bar);
1047 1047   });
1048 1048  
1049 - return unique;
585 + return {
586 + labels:
587 + rows.map(function(row){
588 + return row.label;
589 + }),
590 + targetRelativeTop:
591 + Math.round(targetTop)
592 + };
1050 1050   }
1051 1051  
1052 - /* =======================================================
1053 - OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW
1054 - ======================================================= */
1055 -
1056 - function alignOverviewCards(headers){
1057 - if(
1058 - PAGE_KIND!=="overview"||
1059 - window.innerWidth<=MOBILE_MAX
1060 - ){
1061 - return;
595 + function applyGroup(group){
596 + if(!validHorizontalGroup(group)){
597 + return null;
1062 1062   }
1063 1063  
1064 1064   var cards=[];
1065 1065   var seen=new Set();
1066 1066  
1067 - headers.forEach(function(row){
1068 - if(!seen.has(row.card)){
1069 - seen.add(row.card);
1070 - cards.push(row.card);
603 + group.entries.forEach(function(entry){
604 + if(!seen.has(entry.target)){
605 + seen.add(entry.target);
606 + cards.push(entry.target);
1071 1071   }
1072 1072   });
1073 1073  
1074 - if(cards.length<2){
1075 - return;
1076 - }
610 + if(cards.length<2)return null;
1077 1077  
1078 - // Group cards by actual top position.
1079 - var groups=[];
612 + var firstSection=
613 + alignFirstSections(cards);
1080 1080  
1081 - cards.forEach(function(card){
1082 - var top=
1083 - card.getBoundingClientRect().top;
615 + // The section alignment can change natural card heights.
616 + // Measure only afterwards.
617 + var maxHeight=0;
1084 1084  
1085 - var group=null;
1086 -
1087 - for(var i=0;i<groups.length;i++){
1088 - if(
1089 - Math.abs(
1090 - groups[i].top-top
1091 - )<=ROW_TOLERANCE
1092 - ){
1093 - group=groups[i];
1094 - break;
1095 - }
1096 - }
1097 -
1098 - if(!group){
1099 - group={
1100 - top:top,
1101 - cards:[]
1102 - };
1103 - groups.push(group);
1104 - }
1105 -
1106 - group.cards.push(card);
619 + cards.forEach(function(card){
620 + maxHeight=Math.max(
621 + maxHeight,
622 + card.getBoundingClientRect().height
623 + );
1107 1107   });
1108 1108  
1109 - groups.forEach(function(group){
1110 - if(group.cards.length<2){
1111 - return;
1112 - }
626 + maxHeight=Math.ceil(maxHeight);
1113 1113  
1114 - var firstHeaders=
1115 - group.cards.map(function(card){
1116 - var candidates=
1117 - headers
1118 - .filter(function(row){
1119 - return row.card===card;
1120 - })
1121 - .sort(function(a,b){
1122 - return (
1123 - a.el
1124 - .getBoundingClientRect()
1125 - .top-
1126 - b.el
1127 - .getBoundingClientRect()
1128 - .top
1129 - );
1130 - });
628 + if(maxHeight<MIN_H)return null;
1131 1131  
1132 - return candidates.length
1133 - ?candidates[0]
1134 - :null;
1135 - });
630 + cards.forEach(function(card){
631 + saveOriginal(
632 + card,
633 + originalMinHeight,
634 + "min-height"
635 + );
1136 1136  
1137 - if(
1138 - !firstHeaders.some(function(row){
1139 - return !row;
1140 - })
1141 - ){
1142 - var targetTop=
1143 - Math.max.apply(
1144 - Math,
1145 - firstHeaders.map(function(row){
1146 - return (
1147 - row.el
1148 - .getBoundingClientRect()
1149 - .top-
1150 - row.card
1151 - .getBoundingClientRect()
1152 - .top
1153 - );
1154 - })
1155 - );
637 + card.style.setProperty(
638 + "min-height",
639 + maxHeight+"px"
640 + );
1156 1156  
1157 - firstHeaders.forEach(function(row){
1158 - var relativeTop=
1159 - row.el
1160 - .getBoundingClientRect()
1161 - .top-
1162 - row.card
1163 - .getBoundingClientRect()
1164 - .top;
642 + card.setAttribute(
643 + "data-sn-equal-height-managed",
644 + "4"
645 + );
1165 1165  
1166 - var delta=
1167 - targetTop-relativeTop;
1168 -
1169 - if(delta>1){
1170 - saveStyle(
1171 - row.el,
1172 - originalMargin,
1173 - "margin-top"
1174 - );
1175 -
1176 - var current=
1177 - num(
1178 - getComputedStyle(
1179 - row.el
1180 - ).marginTop
1181 - );
1182 -
1183 - row.el.style.setProperty(
1184 - "margin-top",
1185 - (
1186 - current+delta
1187 - )+"px"
1188 - );
1189 -
1190 - row.el.setAttribute(
1191 - "data-sn-master-first-row",
1192 - "1"
1193 - );
1194 -
1195 - managedMargin.add(
1196 - row.el
1197 - );
1198 - }
1199 - });
1200 - }
1201 -
1202 - var maxHeight=0;
1203 -
1204 - group.cards.forEach(function(card){
1205 - maxHeight=
1206 - Math.max(
1207 - maxHeight,
1208 - card
1209 - .getBoundingClientRect()
1210 - .height
1211 - );
1212 - });
1213 -
1214 - maxHeight=
1215 - Math.ceil(maxHeight);
1216 -
1217 - group.cards.forEach(function(card){
1218 - saveStyle(
1219 - card,
1220 - originalHeight,
1221 - "min-height"
1222 - );
1223 -
1224 - card.style.setProperty(
1225 - "min-height",
1226 - maxHeight+"px"
1227 - );
1228 -
1229 - card.setAttribute(
1230 - "data-sn-master-equal-height",
1231 - "1"
1232 - );
1233 -
1234 - managedHeight.add(
1235 - card
1236 - );
1237 - });
647 + heightManaged.add(card);
1238 1238   });
649 +
650 + return {
651 + cards:cards.length,
652 + height:maxHeight,
653 + firstSection:firstSection
654 + };
1239 1239   }
1240 1240  
1241 - /* =======================================================
1242 - DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY
1243 - ======================================================= */
657 + function run(){
658 + reset();
1244 1244  
1245 - function equaliseDetailGrids(){
1246 1246   if(
1247 - PAGE_KIND!=="detail"||
1248 1248   window.innerWidth<=MOBILE_MAX
1249 1249   ){
1250 1250   return;
1251 1251   }
1252 1252  
1253 - var selectors=[
1254 - ".arsn-grid",
1255 - ".arsn-grid-2",
1256 - ".arsn-grid-3",
1257 - ".dmp-grid",
1258 - ".ido-grid",
1259 - ".pp-grid"
1260 - ];
1261 -
1262 - selectors.forEach(function(selector){
666 + var parents=
1263 1263   Array.from(
1264 - root.querySelectorAll(selector)
1265 - ).forEach(function(grid){
1266 - var children=
1267 - Array.from(
1268 - grid.children||[]
1269 - ).filter(visible);
668 + root.querySelectorAll("*")
669 + ).filter(function(parent){
670 + return (
671 + visible(parent,MIN_W,MIN_H)&&
672 + parent.children&&
673 + parent.children.length>=2&&
674 + parent.children.length<=MAX_PARENT_CHILDREN
675 + );
676 + });
1270 1270  
1271 - if(children.length<2){
1272 - return;
1273 - }
678 + var touched=new Set();
1274 1274  
1275 - var groups=[];
680 + parents.forEach(function(parent){
681 + var entries=[];
1276 1276  
1277 - children.forEach(function(child){
1278 - var top=
1279 - child
1280 - .getBoundingClientRect()
1281 - .top;
683 + Array.from(parent.children).forEach(function(child){
684 + if(!visible(child,MIN_W,MIN_H))return;
1282 1282  
1283 - var group=null;
686 + var target=pickTarget(child);
687 + if(!target)return;
1284 1284  
1285 - for(var i=0;i<groups.length;i++){
1286 - if(
1287 - Math.abs(
1288 - groups[i].top-top
1289 - )<=ROW_TOLERANCE
1290 - ){
1291 - group=groups[i];
1292 - break;
1293 - }
1294 - }
1295 -
1296 - if(!group){
1297 - group={
1298 - top:top,
1299 - items:[]
1300 - };
1301 - groups.push(group);
1302 - }
1303 -
1304 - group.items.push(child);
689 + entries.push({
690 + target:target,
691 + rect:target.getBoundingClientRect()
1305 1305   });
693 + });
1306 1306  
1307 - groups.forEach(function(group){
1308 - if(group.items.length<2){
1309 - return;
1310 - }
695 + if(entries.length<2)return;
1311 1311  
1312 - var maxHeight=0;
697 + groupsByVisualRow(entries).forEach(function(group){
698 + if(!validHorizontalGroup(group))return;
1313 1313  
1314 - group.items.forEach(function(item){
1315 - maxHeight=
1316 - Math.max(
1317 - maxHeight,
1318 - item
1319 - .getBoundingClientRect()
1320 - .height
1321 - );
700 + var signature=
701 + group.entries.map(function(entry){
702 + return entry.target;
1322 1322   });
1323 1323  
1324 - maxHeight=
1325 - Math.ceil(maxHeight);
705 + if(
706 + !signature.some(function(el){
707 + return !touched.has(el);
708 + })
709 + ){
710 + return;
711 + }
1326 1326  
1327 - group.items.forEach(function(item){
1328 - saveStyle(
1329 - item,
1330 - originalHeight,
1331 - "min-height"
1332 - );
713 + var applied=
714 + applyGroup(group);
1333 1333  
1334 - item.style.setProperty(
1335 - "min-height",
1336 - maxHeight+"px"
1337 - );
1338 -
1339 - item.setAttribute(
1340 - "data-sn-master-equal-height",
1341 - "1"
1342 - );
1343 -
1344 - managedHeight.add(item);
716 + if(applied){
717 + signature.forEach(function(el){
718 + touched.add(el);
1345 1345   });
1346 - });
720 + }
1347 1347   });
1348 1348   });
1349 1349   }
1350 1350  
1351 - /* =======================================================
1352 - RUN / RESPONSIVE SCHEDULING
1353 - ======================================================= */
725 + function schedule(){
726 + if(raf)cancelAnimationFrame(raf);
1354 1354  
1355 - function run(){
1356 - if(running)return;
1357 -
1358 - running=true;
1359 -
1360 - try{
1361 - resetRuntime();
1362 - applyPlaceholderBadge();
1363 - propagateDetailAccents();
1364 -
1365 - var headers=
1366 - applyOverviewPalette();
1367 -
1368 - makeThreeLineAreaLabels();
1369 - makeFilledRedOrangeCTAsBorderless();
1370 -
1371 - if(
1372 - window.innerWidth>
1373 - MOBILE_MAX
1374 - ){
1375 - alignOverviewCards(
1376 - headers
1377 - );
1378 -
1379 - equaliseDetailGrids();
1380 - }
1381 - }finally{
1382 - running=false;
1383 - }
728 + raf=requestAnimationFrame(function(){
729 + raf=requestAnimationFrame(function(){
730 + raf=0;
731 + run();
732 + });
733 + });
1384 1384   }
1385 1385  
1386 - function onResize(){
1387 - if(resizeTimer){
1388 - clearTimeout(
1389 - resizeTimer
1390 - );
1391 - }
736 + addEventListener("resize",schedule,{passive:true});
737 + addEventListener("load",schedule,{once:true});
1392 1392  
1393 - resizeTimer=
1394 - setTimeout(
1395 - function(){
1396 - resizeTimer=0;
1397 - run();
1398 - },
1399 - RESIZE_DEBOUNCE
1400 - );
1401 - }
739 + root.addEventListener(
740 + "click",
741 + function(){
742 + setTimeout(schedule,0);
743 + },
744 + true
745 + );
1402 1402  
1403 - async function waitForReady(){
1404 - if(
1405 - document.readyState!=="complete"
1406 - ){
1407 - await new Promise(function(resolve){
1408 - window.addEventListener(
1409 - "load",
1410 - resolve,
1411 - {once:true}
1412 - );
1413 - });
747 + Array.from(root.querySelectorAll("img")).forEach(function(img){
748 + if(!img.complete){
749 + img.addEventListener("load",schedule,{once:true});
1414 1414   }
751 + });
1415 1415  
1416 - if(
1417 - document.fonts&&
1418 - document.fonts.ready
1419 - ){
1420 - try{
1421 - await document.fonts.ready;
1422 - }catch(error){}
1423 - }
1424 -
1425 - var images=
1426 - Array.from(
1427 - root.querySelectorAll("img")
1428 - );
1429 -
1430 - await Promise.all(
1431 - images.map(function(img){
1432 - if(img.complete){
1433 - return Promise.resolve();
1434 - }
1435 -
1436 - return new Promise(function(resolve){
1437 - var done=function(){
1438 - resolve();
1439 - };
1440 -
1441 - img.addEventListener(
1442 - "load",
1443 - done,
1444 - {once:true}
1445 - );
1446 -
1447 - img.addEventListener(
1448 - "error",
1449 - done,
1450 - {once:true}
1451 - );
1452 - });
1453 - })
1454 - );
1455 -
1456 - run();
753 + if(document.fonts&&document.fonts.ready){
754 + document.fonts.ready.then(schedule);
1457 1457   }
1458 1458  
1459 - window.addEventListener(
1460 - "resize",
1461 - onResize,
1462 - {passive:true}
1463 - );
1464 -
1465 - waitForReady();
757 + schedule();
758 + setTimeout(schedule,200);
759 + setTimeout(schedule,650);
760 + setTimeout(schedule,1400);
1466 1466  })();
1467 1467  </script>
1468 -
1469 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END -->
763 +<!-- SN_HORIZONTAL_BOX_HARMONIZER_END -->
1470 1470  {{/html}}
1471 1471