Wiki source code of Data Protection & Ethics

Version 5.14 by Veronika Kocher on Thursday, 03 Sep 2026 15:54

Hide last authors
Veronika Kocher 5.14 1 Assess personal data, confidentiality, consent, sensitive materials and ethical questions early in the project.
Veronika Kocher 2.1 2
3 == Overview ==
4
Veronika Kocher 5.14 5 Personal, confidential or sensitive information requires a clear legal basis, appropriate safeguards and transparent information for the people concerned. Ethical questions can also go beyond legal compliance alone.
Veronika Kocher 2.1 6
7 == What you need to know ==
8
Veronika Kocher 5.14 9 * Clarify which personal or sensitive data are actually needed.
10 * Where relevant, distinguish consent to participate from permission to publish identifiable content.
11 * Plan access, storage, retention, deletion and possible sharing before data collection begins.
Veronika Kocher 2.1 12
13 == What you need to do ==
14
Veronika Kocher 5.14 15 1. Check what applies to your project.
Veronika Kocher 2.1 16 2. Document the relevant decisions.
17 3. Use appropriate institutional services and support where needed.
18
19 == Key questions ==
20
21 * What needs to be decided?
22 * Who is responsible?
23 * What needs to be documented?
24 * Are there legal, ethical or technical constraints?
25 * What needs to happen before the next project phase?
26
27 == Services & Tools ==
28
Veronika Kocher 5.14 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.
Veronika Kocher 2.1 30
31 == Info Sheets & Checklists ==
32
Veronika Kocher 5.14 33 Relevant Info Sheets, checklists and templates will be added here as they become available.
Veronika Kocher 2.1 34
35 == Tutorials ==
36
Veronika Kocher 5.6 37
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}}
Veronika Kocher 5.14 39 Step-by-step tutorials will be added here as they become available.
Veronika Kocher 2.1 40
41 == Related Topics ==
42
Veronika Kocher 5.14 43 Further guidance can be found in the adjacent phases Prepare, Work & Manage and Publish & Share.
Veronika Kocher 2.1 44
Veronika Kocher 5.7 45 == Who is responsible? ==
Veronika Kocher 2.1 46
Veronika Kocher 5.11 47
Veronika Kocher 5.7 48 {{info title="Service routing"}}
Veronika Kocher 5.14 49 **Primary specialist service(s):** Data Protection Officer for questions concerning personal data; project/host unit and the applicable ethics or funder route for ethical review.
Veronika Kocher 2.1 50
Veronika Kocher 5.14 51 **Role of Support Kunst und Forschung (SKF):** Coordinates project and funder requirements and helps route specialist review; SKF is not the data-protection authority.
Veronika Kocher 5.7 52 {{/info}}
Veronika Kocher 4.1 53
Veronika Kocher 5.14 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.
Veronika Kocher 5.7 55
Veronika Kocher 4.1 56 {{html}}
57 <!-- ARSN_SEARCH_TERMS_START -->
58 <details class="arsn-search-terms" style="margin-top:28px;padding-top:10px;border-top:1px solid #eee;">
59 <summary style="cursor:pointer;color:#666;font-size:13px;">Search terms &amp; related topics</summary>
60 <div style="margin-top:9px;color:#555;font-size:13px;">
61 <p style="margin:0 0 8px 0;">
Veronika Kocher 5.2 62 This topic can also be found through related terms, synonyms and common search queries.
63 Select a term to search the Art &amp; Research Services Navigator.
Veronika Kocher 4.1 64 </p>
Veronika Kocher 5.14 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=data%20protection#arsn-search-input" class="arsn-search-term" data-search-term="data protection" 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 protection</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=personal%20data#arsn-search-input" class="arsn-search-term" data-search-term="personal data" 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;">personal data</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=gdpr#arsn-search-input" class="arsn-search-term" data-search-term="gdpr" 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;">gdpr</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=ethics#arsn-search-input" class="arsn-search-term" data-search-term="ethics" 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;">ethics</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=consent#arsn-search-input" class="arsn-search-term" data-search-term="consent" 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;">consent</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=sensitive%20data#arsn-search-input" class="arsn-search-term" data-search-term="sensitive data" 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;">sensitive data</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=confidentiality#arsn-search-input" class="arsn-search-term" data-search-term="confidentiality" 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;">confidentiality</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=data%20privacy#arsn-search-input" class="arsn-search-term" data-search-term="data privacy" 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 privacy</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=dsgvo#arsn-search-input" class="arsn-search-term" data-search-term="dsgvo" 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;">dsgvo</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=anonymisation#arsn-search-input" class="arsn-search-term" data-search-term="anonymisation" 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;">anonymisation</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=anonymization#arsn-search-input" class="arsn-search-term" data-search-term="anonymization" 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;">anonymization</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=pseudonymisation#arsn-search-input" class="arsn-search-term" data-search-term="pseudonymisation" 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;">pseudonymisation</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=pseudonymization#arsn-search-input" class="arsn-search-term" data-search-term="pseudonymization" 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;">pseudonymization</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=datenschutz#arsn-search-input" class="arsn-search-term" data-search-term="datenschutz" 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;">datenschutz</a><a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/?q=einwilligung#arsn-search-input" class="arsn-search-term" data-search-term="einwilligung" 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;">einwilligung</a></p>
Veronika Kocher 4.1 66 </div>
67 </details>
68 <!-- ARSN_SEARCH_TERMS_END -->
69 {{/html}}
Veronika Kocher 5.8 70
Veronika Kocher 5.11 71 {{html clean="false"}}
72 <!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START -->
Veronika Kocher 5.10 73
Veronika Kocher 5.11 74 <style data-sn-service-navigator-master="1">
75 /* =========================================================
76 MASTER TYPOGRAPHY
77 ========================================================= */
Veronika Kocher 5.10 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
Veronika Kocher 5.11 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{
Veronika Kocher 5.10 127 box-sizing:border-box!important;
Veronika Kocher 5.11 128 border-left:4px solid #21b6d7!important;
129 border-radius:8px;
Veronika Kocher 5.10 130 text-align:left!important;
131 word-spacing:normal!important;
132 }
133
Veronika Kocher 5.11 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,
Veronika Kocher 5.10 141 #xwikicontent .errormessage{
Veronika Kocher 5.11 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;
Veronika Kocher 5.10 147 }
148
Veronika Kocher 5.11 149 [data-sn-master-equal-height],
150 [data-sn-master-first-row]{
Veronika Kocher 5.9 151 box-sizing:border-box;
Veronika Kocher 5.8 152 }
Veronika Kocher 5.12 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 }
Veronika Kocher 5.8 185 </style>
Veronika Kocher 5.10 186
Veronika Kocher 5.11 187 <script data-sn-service-navigator-master="1">
Veronika Kocher 5.8 188 (function(){
189 "use strict";
190
Veronika Kocher 5.11 191 var PAGE_KIND="detail";
192 var PLACEHOLDER=true;
193 var PLACEHOLDER_LABEL="COMING SOON";
194
Veronika Kocher 5.8 195 var MOBILE_MAX=767;
Veronika Kocher 5.9 196 var ROW_TOLERANCE=6;
Veronika Kocher 5.10 197 var RESIZE_DEBOUNCE=220;
Veronika Kocher 5.8 198
199 var root=
200 document.getElementById("xwikicontent")||
201 document.querySelector(".xwiki-rendering-content")||
202 document.querySelector("main")||
203 document.body;
204
205 if(!root)return;
206
Veronika Kocher 5.11 207 var managedHeight=new Set();
208 var managedMargin=new Set();
209 var originalHeight=new WeakMap();
210 var originalMargin=new WeakMap();
Veronika Kocher 5.10 211
212 var resizeTimer=0;
Veronika Kocher 5.11 213 var running=false;
Veronika Kocher 5.10 214
Veronika Kocher 5.11 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 ]
Veronika Kocher 5.9 276 }
Veronika Kocher 5.11 277 ];
Veronika Kocher 5.9 278
Veronika Kocher 5.11 279 function num(value){
280 var n=parseFloat(value);
281 return Number.isFinite(n)?n:0;
Veronika Kocher 5.8 282 }
283
Veronika Kocher 5.11 284 function norm(value){
285 return String(value||"")
Veronika Kocher 5.10 286 .replace(/\s+/g," ")
287 .trim()
288 .toUpperCase();
289 }
290
Veronika Kocher 5.11 291 function visible(el){
292 if(!el||el.nodeType!==1)return false;
Veronika Kocher 5.8 293
Veronika Kocher 5.11 294 var style=getComputedStyle(el);
295 var rect=el.getBoundingClientRect();
Veronika Kocher 5.10 296
297 return (
Veronika Kocher 5.11 298 style.display!=="none"&&
299 style.visibility!=="hidden"&&
300 rect.width>20&&
301 rect.height>4
Veronika Kocher 5.10 302 );
Veronika Kocher 5.8 303 }
304
Veronika Kocher 5.11 305 function saveStyle(el,map,property){
Veronika Kocher 5.9 306 if(map.has(el))return;
307
308 map.set(el,{
Veronika Kocher 5.11 309 value:el.style.getPropertyValue(property),
310 priority:el.style.getPropertyPriority(property)
Veronika Kocher 5.9 311 });
312 }
313
Veronika Kocher 5.11 314 function restoreStyle(el,map,property){
Veronika Kocher 5.9 315 var original=map.get(el);
316
317 if(original&&original.value){
318 el.style.setProperty(
319 property,
320 original.value,
321 original.priority||""
322 );
323 }else{
Veronika Kocher 5.11 324 el.style.removeProperty(property);
Veronika Kocher 5.9 325 }
326 }
327
Veronika Kocher 5.10 328 function resetRuntime(){
Veronika Kocher 5.11 329 managedHeight.forEach(function(el){
330 restoreStyle(
Veronika Kocher 5.9 331 el,
Veronika Kocher 5.11 332 originalHeight,
Veronika Kocher 5.9 333 "min-height"
334 );
335 el.removeAttribute(
Veronika Kocher 5.11 336 "data-sn-master-equal-height"
Veronika Kocher 5.9 337 );
338 });
339
Veronika Kocher 5.11 340 managedMargin.forEach(function(el){
341 restoreStyle(
Veronika Kocher 5.9 342 el,
Veronika Kocher 5.11 343 originalMargin,
Veronika Kocher 5.9 344 "margin-top"
345 );
346 el.removeAttribute(
Veronika Kocher 5.11 347 "data-sn-master-first-row"
Veronika Kocher 5.9 348 );
349 });
350
Veronika Kocher 5.11 351 managedHeight.clear();
352 managedMargin.clear();
353 }
Veronika Kocher 5.10 354
Veronika Kocher 5.11 355 function themeFor(text){
356 var value=norm(text);
Veronika Kocher 5.10 357
Veronika Kocher 5.11 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 }
371 }
372
373 return null;
Veronika Kocher 5.9 374 }
375
Veronika Kocher 5.11 376 /* =======================================================
Veronika Kocher 5.12 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 );
456 });
457 }
458
459 /* =======================================================
460 FULL-WIDTH THREE-LINE AREA LABELS
461 ======================================================= */
462
463 function compactText(value){
464 return String(value||"")
465 .replace(/\s+/g," ")
466 .trim();
467 }
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 }
482
483 var number=
484 label.querySelector(
485 ":scope > .arsn-area-number"
486 );
487
488 var action=
489 label.querySelector(
490 ":scope > .arsn-area-action"
491 );
492
493 if(
494 !number||
495 !action
496 ){
497 return;
498 }
499
500 var clone=
501 label.cloneNode(true);
502
503 var cloneNumber=
504 clone.querySelector(
505 ":scope > .arsn-area-number"
506 );
507
508 var cloneAction=
509 clone.querySelector(
510 ":scope > .arsn-area-action"
511 );
512
513 if(cloneNumber){
514 cloneNumber.remove();
515 }
516
517 if(cloneAction){
518 cloneAction.remove();
519 }
520
521 var titleText=
522 compactText(
523 clone.textContent
524 );
525
526 if(!titleText){
527 return;
528 }
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"
539 );
540
541 titleNode.className=
542 "sn-area-label-title";
543
544 titleNode.textContent=
545 titleText;
546
547 while(label.firstChild){
548 label.removeChild(
549 label.firstChild
550 );
551 }
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 });
595 }
596
597 /* =======================================================
Veronika Kocher 5.11 598 PLACEHOLDER BADGE
599 ======================================================= */
Veronika Kocher 5.10 600
Veronika Kocher 5.11 601 function applyPlaceholderBadge(){
602 if(!PLACEHOLDER)return;
Veronika Kocher 5.10 603
604 if(
Veronika Kocher 5.11 605 document.querySelector(
606 ".sn-coming-soon-badge"
607 )
Veronika Kocher 5.10 608 ){
Veronika Kocher 5.11 609 return;
Veronika Kocher 5.10 610 }
611
Veronika Kocher 5.11 612 var title=
613 document.querySelector(
614 "#document-title"
615 )||
616 document.querySelector(
617 "h1"
618 );
Veronika Kocher 5.10 619
Veronika Kocher 5.11 620 if(!title)return;
Veronika Kocher 5.10 621
Veronika Kocher 5.11 622 var badge=
623 document.createElement(
624 "span"
625 );
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
Veronika Kocher 5.10 636 );
637
Veronika Kocher 5.11 638 title.appendChild(
639 badge
640 );
641 }
Veronika Kocher 5.10 642
Veronika Kocher 5.11 643 /* =======================================================
644 DETAIL PAGE OWN-ACCENT PROPAGATION
645 ======================================================= */
Veronika Kocher 5.10 646
Veronika Kocher 5.11 647 function parseRGB(value){
648 var match=String(value||"").match(
649 /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i
Veronika Kocher 5.10 650 );
Veronika Kocher 5.11 651
652 if(!match)return null;
653
654 return [
655 Number(match[1]),
656 Number(match[2]),
657 Number(match[3])
658 ];
Veronika Kocher 5.10 659 }
660
Veronika Kocher 5.11 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 }
Veronika Kocher 5.8 668
Veronika Kocher 5.11 669 function paletteMatch(cssColor){
670 var rgb=parseRGB(cssColor);
Veronika Kocher 5.9 671
Veronika Kocher 5.11 672 if(!rgb)return null;
Veronika Kocher 5.9 673
Veronika Kocher 5.11 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 ];
Veronika Kocher 5.8 680
Veronika Kocher 5.9 681 var best=null;
Veronika Kocher 5.11 682 var bestDistance=Infinity;
Veronika Kocher 5.8 683
Veronika Kocher 5.11 684 palette.forEach(function(item){
685 var d=distance(rgb,item.rgb);
Veronika Kocher 5.8 686
Veronika Kocher 5.11 687 if(d<bestDistance){
688 best=item;
689 bestDistance=d;
690 }
691 });
Veronika Kocher 5.9 692
Veronika Kocher 5.11 693 return bestDistance<=30
694 ?best
695 :null;
696 }
Veronika Kocher 5.8 697
Veronika Kocher 5.11 698 function propagateDetailAccents(){
699 if(PAGE_KIND!=="detail")return;
700
701 Array.from(
702 root.querySelectorAll(
703 ".arsn-call,.dmp-call,.ido-call,.pp-call,"+
704 ".arsn-source,.dmp-source,.ido-source,.pp-source"
705 )
706 ).forEach(function(el){
707 if(!visible(el))return;
708
709 var style=getComputedStyle(el);
710
Veronika Kocher 5.9 711 if(
Veronika Kocher 5.11 712 num(style.borderTopWidth)>=2
Veronika Kocher 5.9 713 ){
Veronika Kocher 5.11 714 var match=
715 paletteMatch(
716 style.borderTopColor
Veronika Kocher 5.9 717 );
718
Veronika Kocher 5.11 719 if(match){
720 el.style.setProperty(
721 "border-left",
722 "4px solid "+match.hex,
723 "important"
Veronika Kocher 5.9 724 );
Veronika Kocher 5.8 725 }
726 }
Veronika Kocher 5.11 727 });
Veronika Kocher 5.8 728
Veronika Kocher 5.11 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;
Veronika Kocher 5.8 737
Veronika Kocher 5.11 738 el.style.setProperty(
739 "border-left",
740 "4px solid #e94b13",
741 "important"
742 );
743 });
Veronika Kocher 5.8 744
Veronika Kocher 5.11 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;
Veronika Kocher 5.9 752
Veronika Kocher 5.11 753 el.style.setProperty(
754 "border-left",
755 "4px solid #21b6d7",
756 "important"
757 );
758 });
759 }
Veronika Kocher 5.9 760
Veronika Kocher 5.11 761 /* =======================================================
762 OVERVIEW SEMANTIC THEME PALETTE
763 ======================================================= */
Veronika Kocher 5.9 764
Veronika Kocher 5.11 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;
Veronika Kocher 5.9 773
Veronika Kocher 5.11 774 return !Array.from(
775 el.children||[]
776 ).some(function(child){
777 return !!themeFor(
778 child.textContent
779 );
Veronika Kocher 5.9 780 });
Veronika Kocher 5.11 781 });
Veronika Kocher 5.8 782 }
783
Veronika Kocher 5.11 784 function findOverviewCard(header){
785 var node=header.parentElement;
786 var candidates=[];
Veronika Kocher 5.9 787
Veronika Kocher 5.11 788 while(node&&node!==root){
789 var rect=node.getBoundingClientRect();
790 var style=getComputedStyle(node);
Veronika Kocher 5.9 791
Veronika Kocher 5.11 792 var border=
793 num(style.borderTopWidth)+
794 num(style.borderRightWidth)+
795 num(style.borderBottomWidth)+
796 num(style.borderLeftWidth);
Veronika Kocher 5.9 797
Veronika Kocher 5.11 798 if(
799 rect.width>=220&&
800 rect.width<=800&&
801 rect.height>=120&&
802 border>=1
803 ){
804 candidates.push(node);
805 }
Veronika Kocher 5.9 806
Veronika Kocher 5.11 807 node=node.parentElement;
808 }
Veronika Kocher 5.9 809
Veronika Kocher 5.11 810 if(!candidates.length)return null;
Veronika Kocher 5.9 811
Veronika Kocher 5.11 812 candidates.sort(function(a,b){
813 return (
814 b.getBoundingClientRect().height-
815 a.getBoundingClientRect().height
Veronika Kocher 5.10 816 );
Veronika Kocher 5.11 817 });
Veronika Kocher 5.9 818
Veronika Kocher 5.11 819 return candidates[0];
Veronika Kocher 5.9 820 }
821
Veronika Kocher 5.11 822 function rowCandidates(link,card){
823 var result=[];
Veronika Kocher 5.10 824 var cardRect=
825 card.getBoundingClientRect();
Veronika Kocher 5.9 826
Veronika Kocher 5.11 827 var node=link;
Veronika Kocher 5.9 828
Veronika Kocher 5.11 829 while(node&&node!==card){
830 if(visible(node)){
831 var rect=
832 node.getBoundingClientRect();
Veronika Kocher 5.9 833
Veronika Kocher 5.11 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 }
843 }
Veronika Kocher 5.9 844
Veronika Kocher 5.11 845 node=node.parentElement;
846 }
847
848 return result;
849 }
850
851 function chooseOuterRow(
852 candidates,
853 link
854 ){
855 if(!candidates.length){
856 return link;
857 }
858
859 var bordered=
860 candidates.filter(function(el){
Veronika Kocher 5.10 861 return (
Veronika Kocher 5.11 862 num(
863 getComputedStyle(el)
864 .borderLeftWidth
865 )>=1
Veronika Kocher 5.10 866 );
867 });
Veronika Kocher 5.9 868
Veronika Kocher 5.11 869 var pool=
870 bordered.length
871 ?bordered
872 :candidates;
Veronika Kocher 5.9 873
Veronika Kocher 5.11 874 pool.sort(function(a,b){
875 var ar=
876 a.getBoundingClientRect();
Veronika Kocher 5.9 877
Veronika Kocher 5.11 878 var br=
879 b.getBoundingClientRect();
Veronika Kocher 5.9 880
Veronika Kocher 5.11 881 return (
882 ar.left-br.left||
883 br.width-ar.width
884 );
885 });
Veronika Kocher 5.9 886
Veronika Kocher 5.11 887 return pool[0]||link;
888 }
Veronika Kocher 5.9 889
Veronika Kocher 5.11 890 function applyOverviewPalette(){
891 if(PAGE_KIND!=="overview"){
892 return [];
Veronika Kocher 5.10 893 }
Veronika Kocher 5.9 894
Veronika Kocher 5.11 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 };
Veronika Kocher 5.10 909 })
Veronika Kocher 5.11 910 .filter(function(row){
911 return !!row.card;
912 });
Veronika Kocher 5.9 913
Veronika Kocher 5.11 914 var unique=[];
915 var seenHeaders=new Set();
Veronika Kocher 5.9 916
Veronika Kocher 5.11 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 );
Veronika Kocher 5.9 932
Veronika Kocher 5.11 933 if(!seenHeaders.has(key)){
934 seenHeaders.add(key);
935 unique.push(row);
936 }
937 });
Veronika Kocher 5.9 938
Veronika Kocher 5.11 939 unique.forEach(function(row){
940 var headerRect=
941 row.el
942 .getBoundingClientRect();
Veronika Kocher 5.9 943
Veronika Kocher 5.11 944 row.el.style.setProperty(
945 "background",
946 row.theme.bg,
947 "important"
Veronika Kocher 5.10 948 );
949
Veronika Kocher 5.11 950 row.el.style.setProperty(
951 "color",
952 row.theme.text,
953 "important"
Veronika Kocher 5.10 954 );
955
Veronika Kocher 5.11 956 row.el.style.setProperty(
957 "text-align",
958 "left",
959 "important"
Veronika Kocher 5.10 960 );
Veronika Kocher 5.9 961
Veronika Kocher 5.11 962 row.el.style.setProperty(
963 "word-spacing",
964 "normal",
965 "important"
966 );
Veronika Kocher 5.10 967
Veronika Kocher 5.11 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 });
Veronika Kocher 5.10 989
Veronika Kocher 5.11 990 var stopTop=
991 later.length
992 ?later[0].el
993 .getBoundingClientRect()
994 .top
995 :Infinity;
Veronika Kocher 5.10 996
997 Array.from(
Veronika Kocher 5.11 998 row.card.querySelectorAll("a")
999 ).forEach(function(link){
1000 if(!visible(link))return;
Veronika Kocher 5.10 1001
Veronika Kocher 5.11 1002 var rect=
1003 link.getBoundingClientRect();
Veronika Kocher 5.10 1004
Veronika Kocher 5.11 1005 if(
1006 rect.top<=
1007 headerRect.bottom-2||
1008 rect.top>=
1009 stopTop-2
1010 ){
1011 return;
1012 }
Veronika Kocher 5.10 1013
Veronika Kocher 5.11 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"
Veronika Kocher 5.10 1039 );
Veronika Kocher 5.11 1040
1041 target.style.setProperty(
1042 "box-sizing",
1043 "border-box",
1044 "important"
Veronika Kocher 5.10 1045 );
Veronika Kocher 5.9 1046 });
Veronika Kocher 5.11 1047 });
Veronika Kocher 5.9 1048
Veronika Kocher 5.11 1049 return unique;
Veronika Kocher 5.10 1050 }
Veronika Kocher 5.9 1051
Veronika Kocher 5.11 1052 /* =======================================================
1053 OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW
1054 ======================================================= */
Veronika Kocher 5.10 1055
Veronika Kocher 5.11 1056 function alignOverviewCards(headers){
1057 if(
1058 PAGE_KIND!=="overview"||
1059 window.innerWidth<=MOBILE_MAX
1060 ){
1061 return;
1062 }
Veronika Kocher 5.10 1063
Veronika Kocher 5.11 1064 var cards=[];
1065 var seen=new Set();
Veronika Kocher 5.10 1066
Veronika Kocher 5.11 1067 headers.forEach(function(row){
1068 if(!seen.has(row.card)){
1069 seen.add(row.card);
1070 cards.push(row.card);
1071 }
1072 });
Veronika Kocher 5.10 1073
Veronika Kocher 5.11 1074 if(cards.length<2){
1075 return;
1076 }
Veronika Kocher 5.10 1077
Veronika Kocher 5.11 1078 // Group cards by actual top position.
1079 var groups=[];
Veronika Kocher 5.10 1080
Veronika Kocher 5.11 1081 cards.forEach(function(card){
1082 var top=
1083 card.getBoundingClientRect().top;
Veronika Kocher 5.10 1084
Veronika Kocher 5.11 1085 var group=null;
Veronika Kocher 5.10 1086
Veronika Kocher 5.11 1087 for(var i=0;i<groups.length;i++){
Veronika Kocher 5.10 1088 if(
Veronika Kocher 5.11 1089 Math.abs(
1090 groups[i].top-top
1091 )<=ROW_TOLERANCE
Veronika Kocher 5.10 1092 ){
Veronika Kocher 5.11 1093 group=groups[i];
1094 break;
Veronika Kocher 5.10 1095 }
Veronika Kocher 5.11 1096 }
Veronika Kocher 5.10 1097
Veronika Kocher 5.11 1098 if(!group){
1099 group={
1100 top:top,
1101 cards:[]
1102 };
1103 groups.push(group);
1104 }
Veronika Kocher 5.10 1105
Veronika Kocher 5.11 1106 group.cards.push(card);
1107 });
Veronika Kocher 5.10 1108
Veronika Kocher 5.11 1109 groups.forEach(function(group){
1110 if(group.cards.length<2){
1111 return;
1112 }
Veronika Kocher 5.10 1113
Veronika Kocher 5.11 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 });
Veronika Kocher 5.10 1131
Veronika Kocher 5.11 1132 return candidates.length
1133 ?candidates[0]
1134 :null;
1135 });
Veronika Kocher 5.10 1136
Veronika Kocher 5.11 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 );
Veronika Kocher 5.8 1156
Veronika Kocher 5.11 1157 firstHeaders.forEach(function(row){
1158 var relativeTop=
1159 row.el
1160 .getBoundingClientRect()
1161 .top-
1162 row.card
1163 .getBoundingClientRect()
1164 .top;
Veronika Kocher 5.9 1165
Veronika Kocher 5.11 1166 var delta=
1167 targetTop-relativeTop;
Veronika Kocher 5.9 1168
Veronika Kocher 5.11 1169 if(delta>1){
1170 saveStyle(
1171 row.el,
1172 originalMargin,
1173 "margin-top"
1174 );
Veronika Kocher 5.10 1175
Veronika Kocher 5.11 1176 var current=
1177 num(
1178 getComputedStyle(
1179 row.el
1180 ).marginTop
1181 );
Veronika Kocher 5.9 1182
Veronika Kocher 5.11 1183 row.el.style.setProperty(
1184 "margin-top",
1185 (
1186 current+delta
1187 )+"px"
1188 );
Veronika Kocher 5.9 1189
Veronika Kocher 5.11 1190 row.el.setAttribute(
1191 "data-sn-master-first-row",
1192 "1"
1193 );
Veronika Kocher 5.9 1194
Veronika Kocher 5.11 1195 managedMargin.add(
1196 row.el
1197 );
1198 }
1199 });
1200 }
Veronika Kocher 5.9 1201
Veronika Kocher 5.11 1202 var maxHeight=0;
Veronika Kocher 5.9 1203
Veronika Kocher 5.11 1204 group.cards.forEach(function(card){
1205 maxHeight=
1206 Math.max(
1207 maxHeight,
1208 card
1209 .getBoundingClientRect()
1210 .height
1211 );
1212 });
Veronika Kocher 5.9 1213
Veronika Kocher 5.11 1214 maxHeight=
1215 Math.ceil(maxHeight);
Veronika Kocher 5.9 1216
Veronika Kocher 5.11 1217 group.cards.forEach(function(card){
1218 saveStyle(
1219 card,
1220 originalHeight,
1221 "min-height"
1222 );
Veronika Kocher 5.9 1223
Veronika Kocher 5.11 1224 card.style.setProperty(
1225 "min-height",
1226 maxHeight+"px"
Veronika Kocher 5.9 1227 );
1228
Veronika Kocher 5.11 1229 card.setAttribute(
1230 "data-sn-master-equal-height",
1231 "1"
1232 );
Veronika Kocher 5.9 1233
Veronika Kocher 5.11 1234 managedHeight.add(
1235 card
1236 );
1237 });
Veronika Kocher 5.9 1238 });
1239 }
1240
Veronika Kocher 5.11 1241 /* =======================================================
1242 DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY
1243 ======================================================= */
Veronika Kocher 5.9 1244
Veronika Kocher 5.11 1245 function equaliseDetailGrids(){
Veronika Kocher 5.10 1246 if(
Veronika Kocher 5.11 1247 PAGE_KIND!=="detail"||
1248 window.innerWidth<=MOBILE_MAX
Veronika Kocher 5.10 1249 ){
Veronika Kocher 5.11 1250 return;
Veronika Kocher 5.10 1251 }
Veronika Kocher 5.9 1252
Veronika Kocher 5.11 1253 var selectors=[
1254 ".arsn-grid",
1255 ".arsn-grid-2",
1256 ".arsn-grid-3",
1257 ".dmp-grid",
1258 ".ido-grid",
1259 ".pp-grid"
1260 ];
Veronika Kocher 5.9 1261
Veronika Kocher 5.11 1262 selectors.forEach(function(selector){
1263 Array.from(
1264 root.querySelectorAll(selector)
1265 ).forEach(function(grid){
1266 var children=
1267 Array.from(
1268 grid.children||[]
1269 ).filter(visible);
Veronika Kocher 5.9 1270
Veronika Kocher 5.11 1271 if(children.length<2){
1272 return;
1273 }
Veronika Kocher 5.9 1274
Veronika Kocher 5.11 1275 var groups=[];
Veronika Kocher 5.9 1276
Veronika Kocher 5.11 1277 children.forEach(function(child){
1278 var top=
1279 child
1280 .getBoundingClientRect()
1281 .top;
Veronika Kocher 5.9 1282
Veronika Kocher 5.11 1283 var group=null;
Veronika Kocher 5.9 1284
Veronika Kocher 5.11 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 }
Veronika Kocher 5.9 1295
Veronika Kocher 5.11 1296 if(!group){
1297 group={
1298 top:top,
1299 items:[]
1300 };
1301 groups.push(group);
1302 }
Veronika Kocher 5.9 1303
Veronika Kocher 5.11 1304 group.items.push(child);
1305 });
Veronika Kocher 5.9 1306
Veronika Kocher 5.11 1307 groups.forEach(function(group){
1308 if(group.items.length<2){
1309 return;
1310 }
Veronika Kocher 5.8 1311
Veronika Kocher 5.11 1312 var maxHeight=0;
Veronika Kocher 5.10 1313
Veronika Kocher 5.11 1314 group.items.forEach(function(item){
1315 maxHeight=
1316 Math.max(
1317 maxHeight,
1318 item
1319 .getBoundingClientRect()
1320 .height
1321 );
1322 });
Veronika Kocher 5.10 1323
Veronika Kocher 5.11 1324 maxHeight=
1325 Math.ceil(maxHeight);
Veronika Kocher 5.8 1326
Veronika Kocher 5.11 1327 group.items.forEach(function(item){
1328 saveStyle(
1329 item,
1330 originalHeight,
1331 "min-height"
1332 );
Veronika Kocher 5.8 1333
Veronika Kocher 5.11 1334 item.style.setProperty(
1335 "min-height",
1336 maxHeight+"px"
1337 );
Veronika Kocher 5.9 1338
Veronika Kocher 5.11 1339 item.setAttribute(
1340 "data-sn-master-equal-height",
1341 "1"
1342 );
Veronika Kocher 5.8 1343
Veronika Kocher 5.11 1344 managedHeight.add(item);
1345 });
Veronika Kocher 5.8 1346 });
Veronika Kocher 5.11 1347 });
1348 });
1349 }
Veronika Kocher 5.8 1350
Veronika Kocher 5.11 1351 /* =======================================================
1352 RUN / RESPONSIVE SCHEDULING
1353 ======================================================= */
Veronika Kocher 5.8 1354
Veronika Kocher 5.11 1355 function run(){
1356 if(running)return;
Veronika Kocher 5.8 1357
Veronika Kocher 5.11 1358 running=true;
Veronika Kocher 5.10 1359
Veronika Kocher 5.11 1360 try{
1361 resetRuntime();
1362 applyPlaceholderBadge();
1363 propagateDetailAccents();
Veronika Kocher 5.10 1364
Veronika Kocher 5.11 1365 var headers=
1366 applyOverviewPalette();
Veronika Kocher 5.10 1367
Veronika Kocher 5.12 1368 makeThreeLineAreaLabels();
1369 makeFilledRedOrangeCTAsBorderless();
1370
Veronika Kocher 5.11 1371 if(
1372 window.innerWidth>
1373 MOBILE_MAX
1374 ){
1375 alignOverviewCards(
1376 headers
1377 );
Veronika Kocher 5.8 1378
Veronika Kocher 5.11 1379 equaliseDetailGrids();
1380 }
Veronika Kocher 5.10 1381 }finally{
Veronika Kocher 5.11 1382 running=false;
Veronika Kocher 5.10 1383 }
Veronika Kocher 5.8 1384 }
1385
Veronika Kocher 5.11 1386 function onResize(){
Veronika Kocher 5.10 1387 if(resizeTimer){
1388 clearTimeout(
1389 resizeTimer
1390 );
1391 }
Veronika Kocher 5.9 1392
Veronika Kocher 5.10 1393 resizeTimer=
1394 setTimeout(
1395 function(){
1396 resizeTimer=0;
Veronika Kocher 5.11 1397 run();
Veronika Kocher 5.10 1398 },
1399 RESIZE_DEBOUNCE
1400 );
Veronika Kocher 5.8 1401 }
1402
Veronika Kocher 5.11 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 });
1414 }
1415
1416 if(
1417 document.fonts&&
1418 document.fonts.ready
1419 ){
1420 try{
1421 await document.fonts.ready;
1422 }catch(error){}
1423 }
1424
Veronika Kocher 5.10 1425 var images=
1426 Array.from(
1427 root.querySelectorAll("img")
1428 );
Veronika Kocher 5.8 1429
Veronika Kocher 5.11 1430 await Promise.all(
Veronika Kocher 5.10 1431 images.map(function(img){
1432 if(img.complete){
1433 return Promise.resolve();
1434 }
Veronika Kocher 5.8 1435
Veronika Kocher 5.10 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
Veronika Kocher 5.11 1456 run();
Veronika Kocher 5.8 1457 }
1458
Veronika Kocher 5.11 1459 window.addEventListener(
Veronika Kocher 5.10 1460 "resize",
Veronika Kocher 5.11 1461 onResize,
Veronika Kocher 5.10 1462 {passive:true}
1463 );
1464
Veronika Kocher 5.11 1465 waitForReady();
Veronika Kocher 5.8 1466 })();
1467 </script>
Veronika Kocher 5.10 1468
Veronika Kocher 5.11 1469 <!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END -->
1470 {{/html}}
1471