Changes for page Plan Your Data Management
Last modified by Veronika Kocher on Friday, 04 Sep 2026 14:45
From version 4.15
edited by Veronika Kocher
on Friday, 04 Sep 2026 14:45
on Friday, 04 Sep 2026 14:45
Change comment:
There is no comment for this version
To version 4.6
edited by Veronika Kocher
on Wednesday, 02 Sep 2026 13:27
on Wednesday, 02 Sep 2026 13:27
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -26,7 +26,7 @@ 26 26 <section class="dmp-card" style="margin-bottom:18px;overflow:hidden;border-left:6px solid #e94b13;"> 27 27 <div class="dmp-hero"><img src="https://xwiki.uni-ak.ac.at/bin/download/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/WebHome/enable.png" alt="Planning research data, materials and outputs across the project lifecycle"></div> 28 28 <div style="padding:18px 21px 20px"> 29 -<div class="dmp-eye" style="color:#8a4d36;margin-bottom:5px"> PREPARE · DATA MANAGEMENT PLAN</div>29 +<div class="dmp-eye" style="color:#8a4d36;margin-bottom:5px">ENABLE · DATA MANAGEMENT PLAN</div> 30 30 <h2 style="font-size:27px;line-height:1.2;margin:0 0 8px;color:#2c2926">Turn data management into a working project routine — not a form you fill in once</h2> 31 31 <p style="margin:0;color:#5e5953;line-height:1.6;max-width:1160px">A practical Data Management Plan (DMP) records how your project will organise, store, protect, document, share, preserve or dispose of its data and materials. For artistic and arts-based research, this can include physical objects, audiovisual material, software, performances, process documentation and artistic outputs as well as conventional research data.</p> 32 32 </div> ... ... @@ -38,18 +38,6 @@ 38 38 39 39 <div class="dmp-store" style="margin-bottom:28px"><strong>Start from your material inventory.</strong> If you have not yet mapped the data, materials, documentation and outputs your project will create, collect or reuse, begin with <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Identify%20Your%20Data%20%26%20Research%20Outputs/">Identify Your Data & Research Outputs</a>.</div> 40 40 41 -<!-- ARSN_DMP_TOOL_COMING_SOON_V1 --> 42 -<section id="dmp-tool-coming-soon" class="dmp-card" style="margin-bottom:28px;overflow:hidden;border-left:6px solid #21b6d7;"> 43 -<div style="padding:17px 20px 18px"> 44 -<div class="dmp-eye" style="color:#3f6871;margin-bottom:5px">DMP TOOL <span style="display:inline-block;margin-left:6px;padding:3px 7px;border-radius:12px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:10px;letter-spacing:.06em;vertical-align:1px">COMING SOON</span></div> 45 -<h3 style="font-size:21px;margin:0 0 7px;color:#35312d">Interactive Art & Research DMP Tool</h3> 46 -<p style="margin:0 0 11px;color:#625d56;line-height:1.55;max-width:1050px">A local form will connect the eleven core DMP questions with funder-specific requirements and export DMPs as PDF, JSON, YAML and Markdown. Funder profiles are maintained separately from the tool so that FWF, Horizon Europe, ERC or FFG requirements can be updated without reprogramming the form.</p> 47 -<a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Plan%20Your%20Data%20Management/DMP%20Tool/" aria-disabled="true" onclick="return false;" style="display:inline-block;padding:8px 11px;border:1px solid #c7e5ed;border-radius:6px;background:#f4fbfc;color:#3f6871;text-decoration:none;font-weight:700;cursor:not-allowed">Open DMP Tool ↗</a> 48 -<span style="display:inline-block;margin-left:8px;color:#8a4d36;font-size:12px;font-weight:700">COMING SOON</span> 49 -</div> 50 -</section> 51 -<!-- ARSN_DMP_TOOL_COMING_SOON_END --> 52 - 53 53 <section class="dmp-sec"> 54 54 <div class="dmp-eye" style="color:#8a4d36;margin-bottom:4px">STEP 1 · DEFINE THE SCOPE</div> 55 55 <h3>Decide what your DMP needs to cover</h3> ... ... @@ -141,50 +141,28 @@ 141 141 </section> 142 142 143 143 <section class="dmp-sec"> 144 -<!-- ARSN_DMP_FUNDER_LINKS_SPECIFIC_V2 --> 145 145 <div class="dmp-eye" style="color:#8a4d36;margin-bottom:4px">FUNDER REQUIREMENTS</div> 146 -<h3> Workfromtheactualtemplate,call andbindingprojectconditions</h3>147 -<p>Your internal working DMP can be broader than the formalfunder template.Fora funded project,however, the currentDMPtemplate,thespecificcallorcallguide,thefunding agreementorGrantAgreement andthe deadlines statedthereare decisive. The links below therefore pointdirectly to DMP-relevant documents or document areas.</p>133 +<h3>Use the funder’s current template and deadlines where one is required</h3> 134 +<p>Your internal working DMP can be broader than a funder template, but a funded project must still satisfy the applicable programme rules. Always check the current call, grant agreement and funder guidance.</p> 148 148 149 149 <div class="dmp-grid"> 150 150 <div class="dmp-box" style="border-top:4px solid #e94b13"> 151 151 <h4>FWF</h4> 152 -<p>For the relevant approved FWF projects, the DMP is required for project start, is submitted with the funding agreement, uses the same language as the proposal, is versioned throughout the project and is submitted in its final version with the final project report.</p> 153 -<ul style="margin:10px 0 0 18px;padding:0;line-height:1.55"> 154 -<li><a href="https://www.fwf.ac.at/fileadmin/Website/Dokumente/Ueber_uns/Aufgaben_und_Aktivitaeten/Open_Science/fwf_dmp_guidelines_template.docx" target="_blank" rel="noopener"><strong>DMP – Guidelines and template (EN, DOCX) ↗</strong></a></li> 155 -<li><a href="https://www.fwf.ac.at/fileadmin/Website/Dokumente/Ueber_uns/Aufgaben_und_Aktivitaeten/Open_Science/fwf_dmp_evaluierungsmatrix.pdf" target="_blank" rel="noopener">DMP evaluation matrix (PDF) ↗</a></li> 156 -<li><a href="https://www.fwf.ac.at/en/about-us/what-we-do/open-science/open-access-policy/open-access-policy-for-research-data" target="_blank" rel="noopener">Open-Access Policy for Research Data ↗</a></li> 157 -<li><a href="https://www.fwf.ac.at/en/about-us/what-we-do/open-science/research-data-management" target="_blank" rel="noopener">Research Data Management – workflow, funding & contact ↗</a></li> 158 -</ul> 139 +<p>The FWF requires a Data Management Plan for projects approved under the relevant guidelines since 1 January 2019. The DMP is submitted with the funding agreement, is required for project start, should be maintained as a living document and the final version is submitted with the final project report.</p> 140 +<p style="margin-top:9px"><a href="https://www.fwf.ac.at/en/about-us/tasks-and-activities/open-science/research-data-management" target="_blank" rel="noopener"><strong>FWF Research Data Management & DMP guidance ↗</strong></a></p> 159 159 </div> 160 160 161 161 <div class="dmp-box" style="border-top:4px solid #21b6d7"> 162 162 <h4>Horizon Europe</h4> 163 -<p>Research Data Management is a mandatory Open Science practice for projects generating or reusing research data. The detailed DMP is normally a deliverable by month 6 and is maintained as a living document.</p> 164 -<ul style="margin:10px 0 0 18px;padding:0;line-height:1.55"> 165 -<li><a href="https://ec.europa.eu/info/funding-tenders/opportunities/portal/screen/how-to-participate/reference-documents;programCode=HORIZON" target="_blank" rel="noopener"><strong>DMP Reporting Template – Funding & Tenders Reference Documents ↗</strong></a><br><small>Under “Templates & Forms” → “Project reporting templates”.</small></li> 166 -<li><a href="https://ec.europa.eu/info/funding-tenders/opportunities/docs/2021-2027/common/guidance/aga_en.pdf" target="_blank" rel="noopener">Annotated Grant Agreement – DMP and Open Science obligations ↗</a></li> 167 -<li><a href="https://rea.ec.europa.eu/open-science_en" target="_blank" rel="noopener">REA Open Science Q&A – DMP, repositories & access restrictions ↗</a></li> 168 -<li><a href="https://ec.europa.eu/info/funding-tenders/opportunities/docs/2021-2027/horizon/guidance/programme-guide_horizon_en.pdf" target="_blank" rel="noopener">Horizon Europe Programme Guide – Open Science / RDM ↗</a></li> 169 -</ul> 145 +<p>Horizon Europe projects that generate or reuse research data are expected to establish a detailed DMP; programme guidance normally places the first DMP deliverable at month 6, with updates as the project develops and towards project end.</p> 146 +<p style="margin-top:9px"><a href="https://ec.europa.eu/info/funding-tenders/opportunities/docs/2021-2027/horizon/guidance/programme-guide_horizon_en.pdf" target="_blank" rel="noopener"><strong>Horizon Europe Programme Guide ↗</strong></a></p> 170 170 </div> 171 171 172 -<div class="dmp-box" style="border-top:4px solid #21b6d7"> 173 -<h4>ERC · Horizon Europe</h4> 174 -<p>Horizon Europe-funded ERC projects include Research Data Management as a work package. The DMP is due no later than the end of project month 6; the ERC guidance also addresses dissemination level, FAIR, resources and data security.</p> 175 -<p style="margin-top:9px"><a href="https://erc.europa.eu/manage-your-project/open-science" target="_blank" rel="noopener"><strong>ERC – Open Science in ERC Projects: RDM work package, DMP deadline & template ↗</strong></a></p> 176 -</div> 177 - 178 178 <div class="dmp-box" style="border-top:4px solid #f0aa00"> 179 -<h4>FFG · always check the specific call</h4> 180 -<p>For FFG funding, DMP rules are call- and instrument-specific. Record the URL of the actual call, the version/date of the guide and whether a DMP is mandatory at submission, mandatory during the project/reporting, recommended or not required.</p> 181 -<p style="margin-top:9px"><a href="https://www.ffg.at/content/ausschreibungsdokumente-der-basisprogramme" target="_blank" rel="noopener"><strong>FFG – current Basisprogramme call documents 2025/26 ↗</strong></a></p> 182 -<p style="margin-top:8px;color:#6a655e;font-size:13px">For other FFG programmes, always use the current programme/call page and the guide linked there.</p> 150 +<h4>Other funders / partners</h4> 151 +<p>Do not reuse an old DMP blindly. Check whether the current programme specifies a template, mandatory questions, repository expectations, open-access rules, review dates, eligible costs or reporting obligations.</p> 183 183 </div> 184 184 </div> 185 - 186 -<div class="dmp-info" style="margin-top:14px"><strong>Other funders / partners:</strong> Do not record only the funder name. Store the <strong>exact URL of the binding requirement or template, its version/date and deadline</strong> in the DMP. For questions about the internal funding route or how funder requirements apply at the Angewandte: <a href="https://www.dieangewandte.at/universitaet/organisation/planung_service_und_verwaltung/support_kunst_und_forschung" target="_blank" rel="noopener">Support Kunst und Forschung ↗</a>.</div> 187 -<!-- ARSN_DMP_FUNDER_LINKS_SPECIFIC_END --> 188 188 </section> 189 189 190 190 <section class="dmp-sec"> ... ... @@ -247,31 +247,6 @@ 247 247 248 248 <div class="dmp-info" style="margin-bottom:14px"><strong>Need help reviewing a DMP?</strong> Bring the current funder template or internal draft, your material/output inventory, planned storage locations, project partners and the main questions that are still unresolved. This makes support much faster and more concrete.</div> 249 249 250 -<!-- ARSN_TRAINING_WORKSHOPS_V2_START --> 251 -<section class="arsn-training-workshops" data-arsn-training-workshops="v2" style="margin:27px 0 22px 0;"> 252 - <div style="padding:16px 18px;background:#eef8fa;border:1px solid #cfe8ef;border-left:5px solid #21b6d7;border-radius:9px;"> 253 - <div style="font-size:12px;font-weight:700;letter-spacing:.075em;text-transform:uppercase;color:#3f6871;margin-bottom:5px;">TRAINING & WORKSHOPS</div> 254 - <h3 style="font-size:20px;line-height:1.3;margin:0 0 7px;color:#35312d;text-align:left;">Training, workshops & consultation sessions</h3> 255 - <p style="margin:0 0 10px;color:#5e5953;line-height:1.55;">Relevant opportunities for this topic will be shown here automatically from the central calendar.</p> 256 - <span data-arsn-coming-soon="true" style="display:inline-block;padding:4px 9px;border-radius:14px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:11px;font-weight:700;letter-spacing:.065em;line-height:1.2;">COMING SOON</span> 257 - </div> 258 -</section> 259 -<!-- ARSN_TRAINING_WORKSHOPS_V2_END --> 260 - 261 -<!-- ARSN_PRACTICAL_RESOURCES_V2_START --> 262 -<section class="arsn-practical-resources" data-arsn-practical-resources="v2" style="margin:0 0 27px;"> 263 - <div style="font-size:12px;font-weight:700;letter-spacing:.075em;text-transform:uppercase;color:#8a4d36;margin-bottom:4px;">USEFUL MATERIALS</div> 264 - <h3 style="font-size:22px;line-height:1.25;margin:0 0 8px;color:#35312d;text-align:left;">Practical Resources</h3> 265 - <p style="margin:0 0 12px;color:#5e5953;line-height:1.55;">Use practical resources when you need a concise overview, a step-by-step procedure or a ready-to-use project aid.</p> 266 - <div class="arsn-resource-grid" style="display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;"> 267 - <div style="padding:15px 16px;background:#fcfbf8;border:1px solid #e3ded6;border-top:3px solid #21b6d7;border-radius:9px;"><strong>Info Sheets</strong><br><span data-arsn-coming-soon="true" style="display:inline-block;margin:6px 0 8px;padding:4px 9px;border-radius:14px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:11px;font-weight:700;letter-spacing:.065em;">COMING SOON</span><div style="color:#625d56;line-height:1.45;">Short reference guides for common questions and decisions.</div></div> 268 - <div style="padding:15px 16px;background:#fcfbf8;border:1px solid #e3ded6;border-top:3px solid #e94b13;border-radius:9px;"><strong>Tutorials</strong><br><span data-arsn-coming-soon="true" style="display:inline-block;margin:6px 0 8px;padding:4px 9px;border-radius:14px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:11px;font-weight:700;letter-spacing:.065em;">COMING SOON</span><div style="color:#625d56;line-height:1.45;">Step-by-step guidance for specific tasks and workflows.</div></div> 269 - <div style="padding:15px 16px;background:#fcfbf8;border:1px solid #e3ded6;border-top:3px solid #38b76a;border-radius:9px;"><strong>Checklists & Templates</strong><br><span data-arsn-coming-soon="true" style="display:inline-block;margin:6px 0 8px;padding:4px 9px;border-radius:14px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:11px;font-weight:700;letter-spacing:.065em;">COMING SOON</span><div style="color:#625d56;line-height:1.45;">Ready-to-use checklists and templates for planning, managing and closing projects.</div></div> 270 - </div> 271 - <style>@media(max-width:767px){.arsn-resource-grid{grid-template-columns:1fr!important}}</style> 272 -</section> 273 -<!-- ARSN_PRACTICAL_RESOURCES_V2_END --> 274 - 275 275 <!-- ARSN_SEARCH_TERMS_START --> 276 276 <details style="margin-top:24px;padding-top:10px;border-top:1px solid #e3ded6"> 277 277 <summary style="cursor:pointer;color:#6a655e;font-size:13px">Search terms & related topics</summary> ... ... @@ -282,1404 +282,3 @@ 282 282 </div> 283 283 {{/html}} 284 284 285 -{{html clean="false"}} 286 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START --> 287 - 288 -<style data-sn-service-navigator-master="1"> 289 -/* ========================================================= 290 - MASTER TYPOGRAPHY 291 - ========================================================= */ 292 -#xwikicontent h1, 293 -#xwikicontent h2, 294 -#xwikicontent h3, 295 -#xwikicontent h4, 296 -#xwikicontent h5, 297 -#xwikicontent h6, 298 -#xwikicontent .box-title, 299 -#xwikicontent [role="heading"], 300 -#xwikicontent h1 a, 301 -#xwikicontent h2 a, 302 -#xwikicontent h3 a, 303 -#xwikicontent h4 a, 304 -#xwikicontent h5 a, 305 -#xwikicontent h6 a, 306 -#xwikicontent .box-title a, 307 -#xwikicontent [role="heading"] a{ 308 - text-align:left!important; 309 - text-justify:auto!important; 310 - word-spacing:normal!important; 311 -} 312 - 313 -/* ========================================================= 314 - COMING SOON / IN VORBEREITUNG 315 - ========================================================= */ 316 -.sn-coming-soon-badge{ 317 - display:inline-block; 318 - vertical-align:middle; 319 - margin-left:10px; 320 - padding:4px 8px; 321 - border-radius:14px; 322 - border:1px solid #efd9cc; 323 - background:#fff4ee; 324 - color:#8a4d36; 325 - font-size:11px; 326 - font-weight:700; 327 - letter-spacing:.055em; 328 - line-height:1.2; 329 - white-space:nowrap; 330 -} 331 - 332 -/* ========================================================= 333 - NATIVE / DETAIL CALLOUT GEOMETRY 334 - Preserve existing backgrounds. 335 - ========================================================= */ 336 -#xwikicontent .arsn-info, 337 -#xwikicontent .dmp-info, 338 -#xwikicontent .ido-info, 339 -#xwikicontent .pp-info, 340 -#xwikicontent .infomessage{ 341 - box-sizing:border-box!important; 342 - border-left:4px solid #21b6d7!important; 343 - border-radius:8px; 344 - text-align:left!important; 345 - word-spacing:normal!important; 346 -} 347 - 348 -#xwikicontent .arsn-warn, 349 -#xwikicontent .dmp-warn, 350 -#xwikicontent .ido-warn, 351 -#xwikicontent .pp-warn, 352 -#xwikicontent .warn, 353 -#xwikicontent .warning, 354 -#xwikicontent .warningmessage, 355 -#xwikicontent .errormessage{ 356 - box-sizing:border-box!important; 357 - border-left:4px solid #e94b13!important; 358 - border-radius:8px; 359 - text-align:left!important; 360 - word-spacing:normal!important; 361 -} 362 - 363 -[data-sn-master-equal-height], 364 -[data-sn-master-first-row]{ 365 - box-sizing:border-box; 366 -} 367 - 368 -/* ========================================================= 369 - FULL-WIDTH THREE-LINE NUMBER / TITLE / SUBTITLE BLOCKS 370 - ========================================================= */ 371 -#xwikicontent .arsn-area-label[data-sn-three-line="1"]{ 372 - display:grid!important; 373 - grid-template-columns:minmax(0,1fr)!important; 374 - grid-auto-rows:auto!important; 375 - width:100%!important; 376 - max-width:none!important; 377 - box-sizing:border-box!important; 378 - justify-items:start!important; 379 - align-items:start!important; 380 - gap:2px!important; 381 - text-align:left!important; 382 - text-align-last:left!important; 383 - text-justify:auto!important; 384 - word-spacing:normal!important; 385 - white-space:normal!important; 386 -} 387 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-number, 388 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .sn-area-label-title, 389 -#xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-action{ 390 - display:block!important; 391 - width:100%!important; 392 - margin:0!important; 393 - text-align:left!important; 394 - text-align-last:left!important; 395 - text-justify:auto!important; 396 - word-spacing:normal!important; 397 - white-space:normal!important; 398 -} 399 -</style> 400 - 401 -<script data-sn-service-navigator-master="1"> 402 -(function(){ 403 - "use strict"; 404 - 405 - var PAGE_KIND="detail"; 406 - var PLACEHOLDER=false; 407 - var PLACEHOLDER_LABEL="COMING SOON"; 408 - 409 - var MOBILE_MAX=767; 410 - var ROW_TOLERANCE=6; 411 - var RESIZE_DEBOUNCE=220; 412 - 413 - var root= 414 - document.getElementById("xwikicontent")|| 415 - document.querySelector(".xwiki-rendering-content")|| 416 - document.querySelector("main")|| 417 - document.body; 418 - 419 - if(!root)return; 420 - 421 - var managedHeight=new Set(); 422 - var managedMargin=new Set(); 423 - var originalHeight=new WeakMap(); 424 - var originalMargin=new WeakMap(); 425 - 426 - var resizeTimer=0; 427 - var running=false; 428 - 429 - var THEMES=[ 430 - { 431 - name:"BLUE", 432 - accent:"#21b6d7", 433 - bg:"#eaf7fb", 434 - text:"#315d68", 435 - labels:[ 436 - "HIER STARTEN", 437 - "ENTSCHEIDEN", 438 - "ÜBERPRÜFEN & ANPASSEN", 439 - "START HERE", 440 - "DECIDE", 441 - "REVIEW & ADAPT" 442 - ] 443 - }, 444 - { 445 - name:"RED", 446 - accent:"#e94b13", 447 - bg:"#fff1ec", 448 - text:"#8a4d36", 449 - labels:[ 450 - "PLANEN & ORGANISIEREN", 451 - "ORGANISIEREN & DOKUMENTIEREN", 452 - "PUBLIZIEREN & PRÄSENTIEREN", 453 - "PLAN & ORGANISE", 454 - "PLAN & ORGANIZE", 455 - "ORGANISE & DOCUMENT", 456 - "ORGANIZE & DOCUMENT", 457 - "PUBLISH & PRESENT" 458 - ] 459 - }, 460 - { 461 - name:"YELLOW", 462 - accent:"#f0aa00", 463 - bg:"#fff8e7", 464 - text:"#785b17", 465 - labels:[ 466 - "SCHÜTZEN & KLÄREN", 467 - "STANDARDISIEREN & IDENTIFIZIEREN", 468 - "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN", 469 - "PROTECT & CLARIFY", 470 - "STANDARDISE & IDENTIFY", 471 - "STANDARDIZE & IDENTIFY", 472 - "OPEN, REUSE & MAKE FINDABLE" 473 - ] 474 - }, 475 - { 476 - name:"GREEN", 477 - accent:"#38b76a", 478 - bg:"#edf9f1", 479 - text:"#3f7451", 480 - labels:[ 481 - "INFRASTRUKTUR EINRICHTEN", 482 - "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN", 483 - "SPEICHERN & ZUGRIFF STEUERN", 484 - "REPOSITORIUM, ERHALTEN & ÜBERGEBEN", 485 - "SET UP INFRASTRUCTURE", 486 - "SET UP INFRASTRUCTURE & COLLABORATION", 487 - "STORE & CONTROL ACCESS", 488 - "REPOSITORY, PRESERVE & HAND OVER" 489 - ] 490 - } 491 - ]; 492 - 493 - function num(value){ 494 - var n=parseFloat(value); 495 - return Number.isFinite(n)?n:0; 496 - } 497 - 498 - function norm(value){ 499 - return String(value||"") 500 - .replace(/\s+/g," ") 501 - .trim() 502 - .toUpperCase(); 503 - } 504 - 505 - function visible(el){ 506 - if(!el||el.nodeType!==1)return false; 507 - 508 - var style=getComputedStyle(el); 509 - var rect=el.getBoundingClientRect(); 510 - 511 - return ( 512 - style.display!=="none"&& 513 - style.visibility!=="hidden"&& 514 - rect.width>20&& 515 - rect.height>4 516 - ); 517 - } 518 - 519 - function saveStyle(el,map,property){ 520 - if(map.has(el))return; 521 - 522 - map.set(el,{ 523 - value:el.style.getPropertyValue(property), 524 - priority:el.style.getPropertyPriority(property) 525 - }); 526 - } 527 - 528 - function restoreStyle(el,map,property){ 529 - var original=map.get(el); 530 - 531 - if(original&&original.value){ 532 - el.style.setProperty( 533 - property, 534 - original.value, 535 - original.priority||"" 536 - ); 537 - }else{ 538 - el.style.removeProperty(property); 539 - } 540 - } 541 - 542 - function resetRuntime(){ 543 - managedHeight.forEach(function(el){ 544 - restoreStyle( 545 - el, 546 - originalHeight, 547 - "min-height" 548 - ); 549 - el.removeAttribute( 550 - "data-sn-master-equal-height" 551 - ); 552 - }); 553 - 554 - managedMargin.forEach(function(el){ 555 - restoreStyle( 556 - el, 557 - originalMargin, 558 - "margin-top" 559 - ); 560 - el.removeAttribute( 561 - "data-sn-master-first-row" 562 - ); 563 - }); 564 - 565 - managedHeight.clear(); 566 - managedMargin.clear(); 567 - } 568 - 569 - function themeFor(text){ 570 - var value=norm(text); 571 - 572 - for(var i=0;i<THEMES.length;i++){ 573 - for(var j=0;j<THEMES[i].labels.length;j++){ 574 - var label=THEMES[i].labels[j]; 575 - 576 - if( 577 - value===label|| 578 - value.indexOf(label+" ")===0|| 579 - value.indexOf(label+" -")===0|| 580 - value.indexOf(label+" ·")===0 581 - ){ 582 - return THEMES[i]; 583 - } 584 - } 585 - } 586 - 587 - return null; 588 - } 589 - 590 - /* ======================================================= 591 - BORDERLESS FILLED RED/ORANGE CTA BUTTONS 592 - ======================================================= */ 593 - 594 - function colourDistance(a,b){ 595 - return Math.sqrt( 596 - Math.pow(a[0]-b[0],2)+ 597 - Math.pow(a[1]-b[1],2)+ 598 - Math.pow(a[2]-b[2],2) 599 - ); 600 - } 601 - 602 - function makeFilledRedOrangeCTAsBorderless(){ 603 - var RED_ORANGE=[233,75,19]; 604 - 605 - Array.from( 606 - root.querySelectorAll( 607 - 'a,button,[role="button"],input[type="submit"],input[type="button"]' 608 - ) 609 - ).forEach(function(el){ 610 - if(!visible(el))return; 611 - 612 - var style=getComputedStyle(el); 613 - var rgb=parseRGB(style.backgroundColor); 614 - 615 - if(!rgb)return; 616 - 617 - if( 618 - colourDistance( 619 - rgb, 620 - RED_ORANGE 621 - )>55 622 - ){ 623 - return; 624 - } 625 - 626 - var rect=el.getBoundingClientRect(); 627 - 628 - if( 629 - rect.width<80|| 630 - rect.height<24 631 - ){ 632 - return; 633 - } 634 - 635 - el.style.setProperty( 636 - "border", 637 - "none", 638 - "important" 639 - ); 640 - 641 - el.style.setProperty( 642 - "border-left", 643 - "none", 644 - "important" 645 - ); 646 - 647 - el.style.setProperty( 648 - "border-top", 649 - "none", 650 - "important" 651 - ); 652 - 653 - el.style.setProperty( 654 - "border-right", 655 - "none", 656 - "important" 657 - ); 658 - 659 - el.style.setProperty( 660 - "border-bottom", 661 - "none", 662 - "important" 663 - ); 664 - 665 - el.style.setProperty( 666 - "box-shadow", 667 - "none", 668 - "important" 669 - ); 670 - }); 671 - } 672 - 673 - /* ======================================================= 674 - FULL-WIDTH THREE-LINE AREA LABELS 675 - ======================================================= */ 676 - 677 - function compactText(value){ 678 - return String(value||"") 679 - .replace(/\s+/g," ") 680 - .trim(); 681 - } 682 - 683 - function makeThreeLineAreaLabels(){ 684 - Array.from( 685 - root.querySelectorAll( 686 - ".arsn-area-label" 687 - ) 688 - ).forEach(function(label){ 689 - if( 690 - label.getAttribute( 691 - "data-sn-three-line" 692 - )==="1" 693 - ){ 694 - return; 695 - } 696 - 697 - var number= 698 - label.querySelector( 699 - ":scope > .arsn-area-number" 700 - ); 701 - 702 - var action= 703 - label.querySelector( 704 - ":scope > .arsn-area-action" 705 - ); 706 - 707 - if( 708 - !number|| 709 - !action 710 - ){ 711 - return; 712 - } 713 - 714 - var clone= 715 - label.cloneNode(true); 716 - 717 - var cloneNumber= 718 - clone.querySelector( 719 - ":scope > .arsn-area-number" 720 - ); 721 - 722 - var cloneAction= 723 - clone.querySelector( 724 - ":scope > .arsn-area-action" 725 - ); 726 - 727 - if(cloneNumber){ 728 - cloneNumber.remove(); 729 - } 730 - 731 - if(cloneAction){ 732 - cloneAction.remove(); 733 - } 734 - 735 - var titleText= 736 - compactText( 737 - clone.textContent 738 - ); 739 - 740 - if(!titleText){ 741 - return; 742 - } 743 - 744 - var numberNode= 745 - number.cloneNode(true); 746 - 747 - var actionNode= 748 - action.cloneNode(true); 749 - 750 - var titleNode= 751 - document.createElement( 752 - "span" 753 - ); 754 - 755 - titleNode.className= 756 - "sn-area-label-title"; 757 - 758 - titleNode.textContent= 759 - titleText; 760 - 761 - while(label.firstChild){ 762 - label.removeChild( 763 - label.firstChild 764 - ); 765 - } 766 - 767 - label.appendChild( 768 - numberNode 769 - ); 770 - 771 - label.appendChild( 772 - titleNode 773 - ); 774 - 775 - label.appendChild( 776 - actionNode 777 - ); 778 - 779 - label.setAttribute( 780 - "data-sn-three-line", 781 - "1" 782 - ); 783 - 784 - var head= 785 - label.closest( 786 - ".arsn-area-head" 787 - ); 788 - 789 - if(head){ 790 - head.style.setProperty( 791 - "width", 792 - "100%", 793 - "important" 794 - ); 795 - 796 - head.style.setProperty( 797 - "max-width", 798 - "100%", 799 - "important" 800 - ); 801 - 802 - head.style.setProperty( 803 - "box-sizing", 804 - "border-box", 805 - "important" 806 - ); 807 - } 808 - }); 809 - } 810 - 811 - /* ======================================================= 812 - PLACEHOLDER BADGE 813 - ======================================================= */ 814 - 815 - function applyPlaceholderBadge(){ 816 - if(!PLACEHOLDER)return; 817 - 818 - if( 819 - document.querySelector( 820 - ".sn-coming-soon-badge" 821 - ) 822 - ){ 823 - return; 824 - } 825 - 826 - var title= 827 - document.querySelector( 828 - "#document-title" 829 - )|| 830 - document.querySelector( 831 - "h1" 832 - ); 833 - 834 - if(!title)return; 835 - 836 - var badge= 837 - document.createElement( 838 - "span" 839 - ); 840 - 841 - badge.className= 842 - "sn-coming-soon-badge"; 843 - 844 - badge.textContent= 845 - PLACEHOLDER_LABEL; 846 - 847 - badge.setAttribute( 848 - "aria-label", 849 - PLACEHOLDER_LABEL 850 - ); 851 - 852 - title.appendChild( 853 - badge 854 - ); 855 - } 856 - 857 - /* ======================================================= 858 - DETAIL PAGE OWN-ACCENT PROPAGATION 859 - ======================================================= */ 860 - 861 - function parseRGB(value){ 862 - var match=String(value||"").match( 863 - /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i 864 - ); 865 - 866 - if(!match)return null; 867 - 868 - return [ 869 - Number(match[1]), 870 - Number(match[2]), 871 - Number(match[3]) 872 - ]; 873 - } 874 - 875 - function distance(a,b){ 876 - return Math.sqrt( 877 - Math.pow(a[0]-b[0],2)+ 878 - Math.pow(a[1]-b[1],2)+ 879 - Math.pow(a[2]-b[2],2) 880 - ); 881 - } 882 - 883 - function paletteMatch(cssColor){ 884 - var rgb=parseRGB(cssColor); 885 - 886 - if(!rgb)return null; 887 - 888 - var palette=[ 889 - {hex:"#21b6d7",rgb:[33,182,215]}, 890 - {hex:"#e94b13",rgb:[233,75,19]}, 891 - {hex:"#f0aa00",rgb:[240,170,0]}, 892 - {hex:"#38b76a",rgb:[56,183,106]} 893 - ]; 894 - 895 - var best=null; 896 - var bestDistance=Infinity; 897 - 898 - palette.forEach(function(item){ 899 - var d=distance(rgb,item.rgb); 900 - 901 - if(d<bestDistance){ 902 - best=item; 903 - bestDistance=d; 904 - } 905 - }); 906 - 907 - return bestDistance<=30 908 - ?best 909 - :null; 910 - } 911 - 912 - function propagateDetailAccents(){ 913 - if(PAGE_KIND!=="detail")return; 914 - 915 - Array.from( 916 - root.querySelectorAll( 917 - ".arsn-call,.dmp-call,.ido-call,.pp-call,"+ 918 - ".arsn-source,.dmp-source,.ido-source,.pp-source" 919 - ) 920 - ).forEach(function(el){ 921 - if(!visible(el))return; 922 - 923 - var style=getComputedStyle(el); 924 - 925 - if( 926 - num(style.borderTopWidth)>=2 927 - ){ 928 - var match= 929 - paletteMatch( 930 - style.borderTopColor 931 - ); 932 - 933 - if(match){ 934 - el.style.setProperty( 935 - "border-left", 936 - "4px solid "+match.hex, 937 - "important" 938 - ); 939 - } 940 - } 941 - }); 942 - 943 - // Warning families: explicit safety override. 944 - Array.from( 945 - root.querySelectorAll( 946 - ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+ 947 - ".warn,.warning,.warningmessage,.errormessage" 948 - ) 949 - ).forEach(function(el){ 950 - if(!visible(el))return; 951 - 952 - el.style.setProperty( 953 - "border-left", 954 - "4px solid #e94b13", 955 - "important" 956 - ); 957 - }); 958 - 959 - // Info families: explicit orientation override. 960 - Array.from( 961 - root.querySelectorAll( 962 - ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage" 963 - ) 964 - ).forEach(function(el){ 965 - if(!visible(el))return; 966 - 967 - el.style.setProperty( 968 - "border-left", 969 - "4px solid #21b6d7", 970 - "important" 971 - ); 972 - }); 973 - } 974 - 975 - /* ======================================================= 976 - OVERVIEW SEMANTIC THEME PALETTE 977 - ======================================================= */ 978 - 979 - function smallestThemeHeaders(){ 980 - return Array.from( 981 - root.querySelectorAll( 982 - "div,span,p,strong,h3,h4,h5,h6" 983 - ) 984 - ).filter(function(el){ 985 - if(!visible(el))return false; 986 - if(!themeFor(el.textContent))return false; 987 - 988 - return !Array.from( 989 - el.children||[] 990 - ).some(function(child){ 991 - return !!themeFor( 992 - child.textContent 993 - ); 994 - }); 995 - }); 996 - } 997 - 998 - function findOverviewCard(header){ 999 - var node=header.parentElement; 1000 - var candidates=[]; 1001 - 1002 - while(node&&node!==root){ 1003 - var rect=node.getBoundingClientRect(); 1004 - var style=getComputedStyle(node); 1005 - 1006 - var border= 1007 - num(style.borderTopWidth)+ 1008 - num(style.borderRightWidth)+ 1009 - num(style.borderBottomWidth)+ 1010 - num(style.borderLeftWidth); 1011 - 1012 - if( 1013 - rect.width>=220&& 1014 - rect.width<=800&& 1015 - rect.height>=120&& 1016 - border>=1 1017 - ){ 1018 - candidates.push(node); 1019 - } 1020 - 1021 - node=node.parentElement; 1022 - } 1023 - 1024 - if(!candidates.length)return null; 1025 - 1026 - candidates.sort(function(a,b){ 1027 - return ( 1028 - b.getBoundingClientRect().height- 1029 - a.getBoundingClientRect().height 1030 - ); 1031 - }); 1032 - 1033 - return candidates[0]; 1034 - } 1035 - 1036 - function rowCandidates(link,card){ 1037 - var result=[]; 1038 - var cardRect= 1039 - card.getBoundingClientRect(); 1040 - 1041 - var node=link; 1042 - 1043 - while(node&&node!==card){ 1044 - if(visible(node)){ 1045 - var rect= 1046 - node.getBoundingClientRect(); 1047 - 1048 - if( 1049 - rect.height<=105&& 1050 - rect.width>= 1051 - cardRect.width*.50&& 1052 - rect.width<= 1053 - cardRect.width*1.03 1054 - ){ 1055 - result.push(node); 1056 - } 1057 - } 1058 - 1059 - node=node.parentElement; 1060 - } 1061 - 1062 - return result; 1063 - } 1064 - 1065 - function chooseOuterRow( 1066 - candidates, 1067 - link 1068 - ){ 1069 - if(!candidates.length){ 1070 - return link; 1071 - } 1072 - 1073 - var bordered= 1074 - candidates.filter(function(el){ 1075 - return ( 1076 - num( 1077 - getComputedStyle(el) 1078 - .borderLeftWidth 1079 - )>=1 1080 - ); 1081 - }); 1082 - 1083 - var pool= 1084 - bordered.length 1085 - ?bordered 1086 - :candidates; 1087 - 1088 - pool.sort(function(a,b){ 1089 - var ar= 1090 - a.getBoundingClientRect(); 1091 - 1092 - var br= 1093 - b.getBoundingClientRect(); 1094 - 1095 - return ( 1096 - ar.left-br.left|| 1097 - br.width-ar.width 1098 - ); 1099 - }); 1100 - 1101 - return pool[0]||link; 1102 - } 1103 - 1104 - function applyOverviewPalette(){ 1105 - if(PAGE_KIND!=="overview"){ 1106 - return []; 1107 - } 1108 - 1109 - var headers= 1110 - smallestThemeHeaders() 1111 - .map(function(el){ 1112 - return { 1113 - el:el, 1114 - theme: 1115 - themeFor( 1116 - el.textContent 1117 - ), 1118 - card: 1119 - findOverviewCard( 1120 - el 1121 - ) 1122 - }; 1123 - }) 1124 - .filter(function(row){ 1125 - return !!row.card; 1126 - }); 1127 - 1128 - var unique=[]; 1129 - var seenHeaders=new Set(); 1130 - 1131 - headers.forEach(function(row){ 1132 - var key= 1133 - row.theme.name+ 1134 - "|"+ 1135 - Math.round( 1136 - row.card 1137 - .getBoundingClientRect() 1138 - .left 1139 - )+ 1140 - "|"+ 1141 - Math.round( 1142 - row.el 1143 - .getBoundingClientRect() 1144 - .top 1145 - ); 1146 - 1147 - if(!seenHeaders.has(key)){ 1148 - seenHeaders.add(key); 1149 - unique.push(row); 1150 - } 1151 - }); 1152 - 1153 - unique.forEach(function(row){ 1154 - var headerRect= 1155 - row.el 1156 - .getBoundingClientRect(); 1157 - 1158 - row.el.style.setProperty( 1159 - "background", 1160 - row.theme.bg, 1161 - "important" 1162 - ); 1163 - 1164 - row.el.style.setProperty( 1165 - "color", 1166 - row.theme.text, 1167 - "important" 1168 - ); 1169 - 1170 - row.el.style.setProperty( 1171 - "text-align", 1172 - "left", 1173 - "important" 1174 - ); 1175 - 1176 - row.el.style.setProperty( 1177 - "word-spacing", 1178 - "normal", 1179 - "important" 1180 - ); 1181 - 1182 - var later= 1183 - unique 1184 - .filter(function(other){ 1185 - return ( 1186 - other.card===row.card&& 1187 - other.el 1188 - .getBoundingClientRect() 1189 - .top> 1190 - headerRect.top+2 1191 - ); 1192 - }) 1193 - .sort(function(a,b){ 1194 - return ( 1195 - a.el 1196 - .getBoundingClientRect() 1197 - .top- 1198 - b.el 1199 - .getBoundingClientRect() 1200 - .top 1201 - ); 1202 - }); 1203 - 1204 - var stopTop= 1205 - later.length 1206 - ?later[0].el 1207 - .getBoundingClientRect() 1208 - .top 1209 - :Infinity; 1210 - 1211 - Array.from( 1212 - row.card.querySelectorAll("a") 1213 - ).forEach(function(link){ 1214 - if(!visible(link))return; 1215 - 1216 - var rect= 1217 - link.getBoundingClientRect(); 1218 - 1219 - if( 1220 - rect.top<= 1221 - headerRect.bottom-2|| 1222 - rect.top>= 1223 - stopTop-2 1224 - ){ 1225 - return; 1226 - } 1227 - 1228 - var candidates= 1229 - rowCandidates( 1230 - link, 1231 - row.card 1232 - ); 1233 - 1234 - var target= 1235 - chooseOuterRow( 1236 - candidates, 1237 - link 1238 - ); 1239 - 1240 - candidates.forEach(function(el){ 1241 - el.style.setProperty( 1242 - "border-left", 1243 - "0 solid transparent", 1244 - "important" 1245 - ); 1246 - }); 1247 - 1248 - target.style.setProperty( 1249 - "border-left", 1250 - "3px solid "+ 1251 - row.theme.accent, 1252 - "important" 1253 - ); 1254 - 1255 - target.style.setProperty( 1256 - "box-sizing", 1257 - "border-box", 1258 - "important" 1259 - ); 1260 - }); 1261 - }); 1262 - 1263 - return unique; 1264 - } 1265 - 1266 - /* ======================================================= 1267 - OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW 1268 - ======================================================= */ 1269 - 1270 - function alignOverviewCards(headers){ 1271 - if( 1272 - PAGE_KIND!=="overview"|| 1273 - window.innerWidth<=MOBILE_MAX 1274 - ){ 1275 - return; 1276 - } 1277 - 1278 - var cards=[]; 1279 - var seen=new Set(); 1280 - 1281 - headers.forEach(function(row){ 1282 - if(!seen.has(row.card)){ 1283 - seen.add(row.card); 1284 - cards.push(row.card); 1285 - } 1286 - }); 1287 - 1288 - if(cards.length<2){ 1289 - return; 1290 - } 1291 - 1292 - // Group cards by actual top position. 1293 - var groups=[]; 1294 - 1295 - cards.forEach(function(card){ 1296 - var top= 1297 - card.getBoundingClientRect().top; 1298 - 1299 - var group=null; 1300 - 1301 - for(var i=0;i<groups.length;i++){ 1302 - if( 1303 - Math.abs( 1304 - groups[i].top-top 1305 - )<=ROW_TOLERANCE 1306 - ){ 1307 - group=groups[i]; 1308 - break; 1309 - } 1310 - } 1311 - 1312 - if(!group){ 1313 - group={ 1314 - top:top, 1315 - cards:[] 1316 - }; 1317 - groups.push(group); 1318 - } 1319 - 1320 - group.cards.push(card); 1321 - }); 1322 - 1323 - groups.forEach(function(group){ 1324 - if(group.cards.length<2){ 1325 - return; 1326 - } 1327 - 1328 - var firstHeaders= 1329 - group.cards.map(function(card){ 1330 - var candidates= 1331 - headers 1332 - .filter(function(row){ 1333 - return row.card===card; 1334 - }) 1335 - .sort(function(a,b){ 1336 - return ( 1337 - a.el 1338 - .getBoundingClientRect() 1339 - .top- 1340 - b.el 1341 - .getBoundingClientRect() 1342 - .top 1343 - ); 1344 - }); 1345 - 1346 - return candidates.length 1347 - ?candidates[0] 1348 - :null; 1349 - }); 1350 - 1351 - if( 1352 - !firstHeaders.some(function(row){ 1353 - return !row; 1354 - }) 1355 - ){ 1356 - var targetTop= 1357 - Math.max.apply( 1358 - Math, 1359 - firstHeaders.map(function(row){ 1360 - return ( 1361 - row.el 1362 - .getBoundingClientRect() 1363 - .top- 1364 - row.card 1365 - .getBoundingClientRect() 1366 - .top 1367 - ); 1368 - }) 1369 - ); 1370 - 1371 - firstHeaders.forEach(function(row){ 1372 - var relativeTop= 1373 - row.el 1374 - .getBoundingClientRect() 1375 - .top- 1376 - row.card 1377 - .getBoundingClientRect() 1378 - .top; 1379 - 1380 - var delta= 1381 - targetTop-relativeTop; 1382 - 1383 - if(delta>1){ 1384 - saveStyle( 1385 - row.el, 1386 - originalMargin, 1387 - "margin-top" 1388 - ); 1389 - 1390 - var current= 1391 - num( 1392 - getComputedStyle( 1393 - row.el 1394 - ).marginTop 1395 - ); 1396 - 1397 - row.el.style.setProperty( 1398 - "margin-top", 1399 - ( 1400 - current+delta 1401 - )+"px" 1402 - ); 1403 - 1404 - row.el.setAttribute( 1405 - "data-sn-master-first-row", 1406 - "1" 1407 - ); 1408 - 1409 - managedMargin.add( 1410 - row.el 1411 - ); 1412 - } 1413 - }); 1414 - } 1415 - 1416 - var maxHeight=0; 1417 - 1418 - group.cards.forEach(function(card){ 1419 - maxHeight= 1420 - Math.max( 1421 - maxHeight, 1422 - card 1423 - .getBoundingClientRect() 1424 - .height 1425 - ); 1426 - }); 1427 - 1428 - maxHeight= 1429 - Math.ceil(maxHeight); 1430 - 1431 - group.cards.forEach(function(card){ 1432 - saveStyle( 1433 - card, 1434 - originalHeight, 1435 - "min-height" 1436 - ); 1437 - 1438 - card.style.setProperty( 1439 - "min-height", 1440 - maxHeight+"px" 1441 - ); 1442 - 1443 - card.setAttribute( 1444 - "data-sn-master-equal-height", 1445 - "1" 1446 - ); 1447 - 1448 - managedHeight.add( 1449 - card 1450 - ); 1451 - }); 1452 - }); 1453 - } 1454 - 1455 - /* ======================================================= 1456 - DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY 1457 - ======================================================= */ 1458 - 1459 - function equaliseDetailGrids(){ 1460 - if( 1461 - PAGE_KIND!=="detail"|| 1462 - window.innerWidth<=MOBILE_MAX 1463 - ){ 1464 - return; 1465 - } 1466 - 1467 - var selectors=[ 1468 - ".arsn-grid", 1469 - ".arsn-grid-2", 1470 - ".arsn-grid-3", 1471 - ".dmp-grid", 1472 - ".ido-grid", 1473 - ".pp-grid" 1474 - ]; 1475 - 1476 - selectors.forEach(function(selector){ 1477 - Array.from( 1478 - root.querySelectorAll(selector) 1479 - ).forEach(function(grid){ 1480 - var children= 1481 - Array.from( 1482 - grid.children||[] 1483 - ).filter(visible); 1484 - 1485 - if(children.length<2){ 1486 - return; 1487 - } 1488 - 1489 - var groups=[]; 1490 - 1491 - children.forEach(function(child){ 1492 - var top= 1493 - child 1494 - .getBoundingClientRect() 1495 - .top; 1496 - 1497 - var group=null; 1498 - 1499 - for(var i=0;i<groups.length;i++){ 1500 - if( 1501 - Math.abs( 1502 - groups[i].top-top 1503 - )<=ROW_TOLERANCE 1504 - ){ 1505 - group=groups[i]; 1506 - break; 1507 - } 1508 - } 1509 - 1510 - if(!group){ 1511 - group={ 1512 - top:top, 1513 - items:[] 1514 - }; 1515 - groups.push(group); 1516 - } 1517 - 1518 - group.items.push(child); 1519 - }); 1520 - 1521 - groups.forEach(function(group){ 1522 - if(group.items.length<2){ 1523 - return; 1524 - } 1525 - 1526 - var maxHeight=0; 1527 - 1528 - group.items.forEach(function(item){ 1529 - maxHeight= 1530 - Math.max( 1531 - maxHeight, 1532 - item 1533 - .getBoundingClientRect() 1534 - .height 1535 - ); 1536 - }); 1537 - 1538 - maxHeight= 1539 - Math.ceil(maxHeight); 1540 - 1541 - group.items.forEach(function(item){ 1542 - saveStyle( 1543 - item, 1544 - originalHeight, 1545 - "min-height" 1546 - ); 1547 - 1548 - item.style.setProperty( 1549 - "min-height", 1550 - maxHeight+"px" 1551 - ); 1552 - 1553 - item.setAttribute( 1554 - "data-sn-master-equal-height", 1555 - "1" 1556 - ); 1557 - 1558 - managedHeight.add(item); 1559 - }); 1560 - }); 1561 - }); 1562 - }); 1563 - } 1564 - 1565 - /* ======================================================= 1566 - RUN / RESPONSIVE SCHEDULING 1567 - ======================================================= */ 1568 - 1569 - function run(){ 1570 - if(running)return; 1571 - 1572 - running=true; 1573 - 1574 - try{ 1575 - resetRuntime(); 1576 - applyPlaceholderBadge(); 1577 - propagateDetailAccents(); 1578 - 1579 - var headers= 1580 - applyOverviewPalette(); 1581 - 1582 - makeThreeLineAreaLabels(); 1583 - makeFilledRedOrangeCTAsBorderless(); 1584 - 1585 - if( 1586 - window.innerWidth> 1587 - MOBILE_MAX 1588 - ){ 1589 - alignOverviewCards( 1590 - headers 1591 - ); 1592 - 1593 - equaliseDetailGrids(); 1594 - } 1595 - }finally{ 1596 - running=false; 1597 - } 1598 - } 1599 - 1600 - function onResize(){ 1601 - if(resizeTimer){ 1602 - clearTimeout( 1603 - resizeTimer 1604 - ); 1605 - } 1606 - 1607 - resizeTimer= 1608 - setTimeout( 1609 - function(){ 1610 - resizeTimer=0; 1611 - run(); 1612 - }, 1613 - RESIZE_DEBOUNCE 1614 - ); 1615 - } 1616 - 1617 - async function waitForReady(){ 1618 - if( 1619 - document.readyState!=="complete" 1620 - ){ 1621 - await new Promise(function(resolve){ 1622 - window.addEventListener( 1623 - "load", 1624 - resolve, 1625 - {once:true} 1626 - ); 1627 - }); 1628 - } 1629 - 1630 - if( 1631 - document.fonts&& 1632 - document.fonts.ready 1633 - ){ 1634 - try{ 1635 - await document.fonts.ready; 1636 - }catch(error){} 1637 - } 1638 - 1639 - var images= 1640 - Array.from( 1641 - root.querySelectorAll("img") 1642 - ); 1643 - 1644 - await Promise.all( 1645 - images.map(function(img){ 1646 - if(img.complete){ 1647 - return Promise.resolve(); 1648 - } 1649 - 1650 - return new Promise(function(resolve){ 1651 - var done=function(){ 1652 - resolve(); 1653 - }; 1654 - 1655 - img.addEventListener( 1656 - "load", 1657 - done, 1658 - {once:true} 1659 - ); 1660 - 1661 - img.addEventListener( 1662 - "error", 1663 - done, 1664 - {once:true} 1665 - ); 1666 - }); 1667 - }) 1668 - ); 1669 - 1670 - run(); 1671 - } 1672 - 1673 - window.addEventListener( 1674 - "resize", 1675 - onResize, 1676 - {passive:true} 1677 - ); 1678 - 1679 - waitForReady(); 1680 -})(); 1681 -</script> 1682 - 1683 -<!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END --> 1684 -{{/html}} 1685 -