Changes for page Plan Your Data Management
Last modified by Veronika Kocher on Friday, 04 Sep 2026 14:45
From version 4.10
edited by Veronika Kocher
on Thursday, 03 Sep 2026 10:09
on Thursday, 03 Sep 2026 10:09
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
-
... ... @@ -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"> ... ... @@ -257,1120 +257,3 @@ 257 257 </div> 258 258 {{/html}} 259 259 260 -\n\n 261 -\n\n{{html clean="false"}} 262 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_START --> 263 - 264 -<style data-sn-horizontal-box-harmonizer="7"> 265 -/* ---------- Typography: never justify headings ---------- */ 266 -#xwikicontent h1, 267 -#xwikicontent h2, 268 -#xwikicontent h3, 269 -#xwikicontent h4, 270 -#xwikicontent h5, 271 -#xwikicontent h6, 272 -#xwikicontent .box-title, 273 -#xwikicontent [role="heading"], 274 -#xwikicontent h1 a, 275 -#xwikicontent h2 a, 276 -#xwikicontent h3 a, 277 -#xwikicontent h4 a, 278 -#xwikicontent h5 a, 279 -#xwikicontent h6 a, 280 -#xwikicontent .box-title a, 281 -#xwikicontent [role="heading"] a{ 282 - text-align:left!important; 283 - text-justify:auto!important; 284 - word-spacing:normal!important; 285 -} 286 - 287 -/* ---------- Native XWiki semantic callouts ---------- */ 288 -#xwikicontent .box.infomessage, 289 -#xwikicontent .infomessage, 290 -#xwikicontent .box.warningmessage, 291 -#xwikicontent .warningmessage, 292 -#xwikicontent .box.successmessage, 293 -#xwikicontent .successmessage, 294 -#xwikicontent .box.errormessage, 295 -#xwikicontent .errormessage, 296 -#xwikicontent [data-sn-callout-harmonized="1"]{ 297 - box-sizing:border-box!important; 298 - border-radius:8px!important; 299 - border-top:1px solid rgba(0,0,0,.08)!important; 300 - border-right:1px solid rgba(0,0,0,.08)!important; 301 - border-bottom:1px solid rgba(0,0,0,.08)!important; 302 - border-left:4px solid var(--sn-callout-accent,#21b6d7)!important; 303 - padding:14px 16px!important; 304 - text-align:left!important; 305 - text-justify:auto!important; 306 - word-spacing:normal!important; 307 - box-shadow:none!important; 308 -} 309 - 310 -#xwikicontent .box.infomessage, 311 -#xwikicontent .infomessage{ 312 - --sn-callout-accent:#21b6d7; 313 - background:#eaf7fb!important; 314 -} 315 - 316 -#xwikicontent .box.warningmessage, 317 -#xwikicontent .warningmessage{ 318 - --sn-callout-accent:#f0aa00; 319 - background:#fff8e7!important; 320 -} 321 - 322 -#xwikicontent .box.successmessage, 323 -#xwikicontent .successmessage{ 324 - --sn-callout-accent:#38b76a; 325 - background:#edf9f1!important; 326 -} 327 - 328 -#xwikicontent .box.errormessage, 329 -#xwikicontent .errormessage{ 330 - --sn-callout-accent:#e94b13; 331 - background:#fff1ec!important; 332 -} 333 - 334 -#xwikicontent [data-sn-callout-harmonized="1"] > :first-child, 335 -#xwikicontent .infomessage > :first-child, 336 -#xwikicontent .warningmessage > :first-child, 337 -#xwikicontent .successmessage > :first-child, 338 -#xwikicontent .errormessage > :first-child{ 339 - margin-top:0!important; 340 -} 341 - 342 -#xwikicontent [data-sn-callout-harmonized="1"] > :last-child, 343 -#xwikicontent .infomessage > :last-child, 344 -#xwikicontent .warningmessage > :last-child, 345 -#xwikicontent .successmessage > :last-child, 346 -#xwikicontent .errormessage > :last-child{ 347 - margin-bottom:0!important; 348 -} 349 - 350 -#xwikicontent [data-sn-equal-height-managed], 351 -#xwikicontent [data-sn-first-section-aligned], 352 -#xwikicontent [data-sn-first-content-aligned]{ 353 - box-sizing:border-box; 354 -} 355 -</style> 356 - 357 -<script data-sn-horizontal-box-harmonizer="7"> 358 -(function(){ 359 - "use strict"; 360 - 361 - var MOBILE_MAX=767; 362 - var ROW_TOLERANCE=6; 363 - var MIN_W=150; 364 - var MIN_H=36; 365 - var MAX_PARENT_CHILDREN=18; 366 - var SEARCH_DEPTH=5; 367 - var RESIZE_DEBOUNCE=220; 368 - var MIN_WIDTH_CHANGE=2; 369 - 370 - var root= 371 - document.getElementById("xwikicontent")|| 372 - document.querySelector(".xwiki-rendering-content")|| 373 - document.querySelector("main")|| 374 - document.body; 375 - 376 - if(!root)return; 377 - 378 - var heightManaged=new Set(); 379 - var sectionManaged=new Set(); 380 - var contentManaged=new Set(); 381 - 382 - var originalMinHeight=new WeakMap(); 383 - var originalMarginTop=new WeakMap(); 384 - 385 - var resizeTimer=0; 386 - var lastWidth=-1; 387 - var hasApplied=false; 388 - var applying=false; 389 - 390 - function num(v){ 391 - var n=parseFloat(v); 392 - return Number.isFinite(n)?n:0; 393 - } 394 - 395 - function visible(el,minW,minH){ 396 - if(!el||el.nodeType!==1)return false; 397 - 398 - var s=getComputedStyle(el); 399 - 400 - if( 401 - s.display==="none"|| 402 - s.visibility==="hidden"|| 403 - Number(s.opacity)===0 404 - ){ 405 - return false; 406 - } 407 - 408 - var r=el.getBoundingClientRect(); 409 - 410 - return ( 411 - r.width>=(minW||1)&& 412 - r.height>=(minH||1) 413 - ); 414 - } 415 - 416 - function normalizeText(text){ 417 - return String(text||"") 418 - .replace(/\s+/g," ") 419 - .trim() 420 - .toUpperCase(); 421 - } 422 - 423 - function excluded(el){ 424 - return ( 425 - !el.matches|| 426 - el.matches( 427 - "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]" 428 - ) 429 - ); 430 - } 431 - 432 - /* ---------- Custom coloured callouts ---------- */ 433 - 434 - function nativeCallout(el){ 435 - var c= 436 - typeof el.className==="string" 437 - ? el.className.toLowerCase() 438 - : ""; 439 - 440 - return ( 441 - /(^|\s)(infomessage|warningmessage|successmessage|errormessage)(\s|$)/.test(c) 442 - ); 443 - } 444 - 445 - function customCallout(el){ 446 - if(!visible(el,220,42)||excluded(el))return false; 447 - 448 - var r=el.getBoundingClientRect(); 449 - 450 - if(r.height>520)return false; 451 - 452 - var s=getComputedStyle(el); 453 - 454 - var bg= 455 - s.backgroundColor&& 456 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&& 457 - s.backgroundColor!=="transparent"&& 458 - s.backgroundColor!=="rgb(255, 255, 255)"; 459 - 460 - var left= 461 - num(s.borderLeftWidth); 462 - 463 - return ( 464 - bg&& 465 - left>=2 466 - ); 467 - } 468 - 469 - function harmoniseCustomCallouts(){ 470 - Array.from( 471 - root.querySelectorAll( 472 - "div,aside,section" 473 - ) 474 - ).forEach(function(el){ 475 - if(nativeCallout(el))return; 476 - if(!customCallout(el))return; 477 - 478 - var s=getComputedStyle(el); 479 - 480 - el.setAttribute( 481 - "data-sn-callout-harmonized", 482 - "1" 483 - ); 484 - 485 - if( 486 - s.borderLeftColor 487 - ){ 488 - el.style.setProperty( 489 - "--sn-callout-accent", 490 - s.borderLeftColor 491 - ); 492 - } 493 - }); 494 - } 495 - 496 - /* ---------- Restore only values V7 itself changed ---------- */ 497 - 498 - function saveOriginal(el,map,property){ 499 - if(map.has(el))return; 500 - 501 - map.set(el,{ 502 - value: 503 - el.style.getPropertyValue( 504 - property 505 - ), 506 - priority: 507 - el.style.getPropertyPriority( 508 - property 509 - ) 510 - }); 511 - } 512 - 513 - function restoreOriginal(el,map,property){ 514 - var original=map.get(el); 515 - 516 - if(original&&original.value){ 517 - el.style.setProperty( 518 - property, 519 - original.value, 520 - original.priority||"" 521 - ); 522 - }else{ 523 - el.style.removeProperty( 524 - property 525 - ); 526 - } 527 - } 528 - 529 - function resetRuntime(){ 530 - heightManaged.forEach(function(el){ 531 - restoreOriginal( 532 - el, 533 - originalMinHeight, 534 - "min-height" 535 - ); 536 - 537 - el.removeAttribute( 538 - "data-sn-equal-height-managed" 539 - ); 540 - }); 541 - 542 - sectionManaged.forEach(function(el){ 543 - restoreOriginal( 544 - el, 545 - originalMarginTop, 546 - "margin-top" 547 - ); 548 - 549 - el.removeAttribute( 550 - "data-sn-first-section-aligned" 551 - ); 552 - }); 553 - 554 - contentManaged.forEach(function(el){ 555 - restoreOriginal( 556 - el, 557 - originalMarginTop, 558 - "margin-top" 559 - ); 560 - 561 - el.removeAttribute( 562 - "data-sn-first-content-aligned" 563 - ); 564 - }); 565 - 566 - heightManaged.clear(); 567 - sectionManaged.clear(); 568 - contentManaged.clear(); 569 - } 570 - 571 - /* ---------- Card detection ---------- */ 572 - 573 - function namedLikeBox(el){ 574 - var c= 575 - typeof el.className==="string" 576 - ? el.className 577 - : ""; 578 - 579 - return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c); 580 - } 581 - 582 - function boxLike(el){ 583 - if( 584 - !visible(el,MIN_W,MIN_H)|| 585 - excluded(el) 586 - ){ 587 - return false; 588 - } 589 - 590 - var s=getComputedStyle(el); 591 - var r=el.getBoundingClientRect(); 592 - 593 - var border= 594 - num(s.borderTopWidth)+ 595 - num(s.borderRightWidth)+ 596 - num(s.borderBottomWidth)+ 597 - num(s.borderLeftWidth); 598 - 599 - var radius=Math.max( 600 - num(s.borderTopLeftRadius), 601 - num(s.borderTopRightRadius), 602 - num(s.borderBottomLeftRadius), 603 - num(s.borderBottomRightRadius) 604 - ); 605 - 606 - var bg= 607 - s.backgroundColor&& 608 - s.backgroundColor!=="rgba(0, 0, 0, 0)"&& 609 - s.backgroundColor!=="transparent"; 610 - 611 - var shadow= 612 - s.boxShadow&& 613 - s.boxShadow!=="none"; 614 - 615 - return ( 616 - namedLikeBox(el)|| 617 - border>=1|| 618 - (bg&&radius>=3)|| 619 - (shadow&&r.width>=180) 620 - ); 621 - } 622 - 623 - function pickTarget(child){ 624 - if(!visible(child,MIN_W,MIN_H))return null; 625 - 626 - if(boxLike(child))return child; 627 - 628 - var cr=child.getBoundingClientRect(); 629 - var q=[]; 630 - 631 - Array.from(child.children||[]).forEach(function(el){ 632 - q.push({el:el,depth:1}); 633 - }); 634 - 635 - var best=null; 636 - var bestScore=-Infinity; 637 - 638 - while(q.length){ 639 - var item=q.shift(); 640 - var el=item.el; 641 - 642 - if(!visible(el,MIN_W,MIN_H))continue; 643 - 644 - var r=el.getBoundingClientRect(); 645 - 646 - if( 647 - r.width>=cr.width*.68&& 648 - boxLike(el) 649 - ){ 650 - var widthFit= 651 - 1-Math.min( 652 - 1, 653 - Math.abs(cr.width-r.width)/ 654 - Math.max(1,cr.width) 655 - ); 656 - 657 - var topFit= 658 - 1-Math.min( 659 - 1, 660 - Math.abs(cr.top-r.top)/100 661 - ); 662 - 663 - var score= 664 - widthFit*6+ 665 - topFit*3+ 666 - Math.min(r.height,900)/450+ 667 - Math.min(r.width*r.height,900000)/900000; 668 - 669 - if(score>bestScore){ 670 - best=el; 671 - bestScore=score; 672 - } 673 - } 674 - 675 - if(item.depth<SEARCH_DEPTH){ 676 - Array.from(el.children||[]).forEach(function(next){ 677 - q.push({ 678 - el:next, 679 - depth:item.depth+1 680 - }); 681 - }); 682 - } 683 - } 684 - 685 - return best; 686 - } 687 - 688 - function groupRows(entries){ 689 - var groups=[]; 690 - 691 - entries 692 - .slice() 693 - .sort(function(a,b){ 694 - return ( 695 - a.rect.top-b.rect.top|| 696 - a.rect.left-b.rect.left 697 - ); 698 - }) 699 - .forEach(function(entry){ 700 - var group=null; 701 - 702 - for(var i=0;i<groups.length;i++){ 703 - if( 704 - Math.abs( 705 - groups[i].top- 706 - entry.rect.top 707 - )<=ROW_TOLERANCE 708 - ){ 709 - group=groups[i]; 710 - break; 711 - } 712 - } 713 - 714 - if(!group){ 715 - group={ 716 - top:entry.rect.top, 717 - entries:[] 718 - }; 719 - groups.push(group); 720 - } 721 - 722 - group.entries.push(entry); 723 - }); 724 - 725 - return groups; 726 - } 727 - 728 - function validRow(group){ 729 - if(group.entries.length<2)return false; 730 - 731 - var lefts= 732 - group.entries 733 - .map(function(e){return e.rect.left;}) 734 - .sort(function(a,b){return a-b;}); 735 - 736 - if( 737 - lefts[lefts.length-1]- 738 - lefts[0]< 739 - 80 740 - ){ 741 - return false; 742 - } 743 - 744 - var widths= 745 - group.entries 746 - .map(function(e){return e.rect.width;}) 747 - .filter(function(w){return w>0;}); 748 - 749 - if(widths.length<2)return false; 750 - 751 - var minW= 752 - Math.min.apply(Math,widths); 753 - 754 - var maxW= 755 - Math.max.apply(Math,widths); 756 - 757 - return ( 758 - maxW/ 759 - Math.max(1,minW)<= 760 - 1.9 761 - ); 762 - } 763 - 764 - /* ---------- Known ARSN first section bars ---------- */ 765 - 766 - function knownBar(el){ 767 - var text= 768 - normalizeText( 769 - el.textContent 770 - ); 771 - 772 - return ( 773 - text==="HIER STARTEN"|| 774 - text==="ORGANISIEREN & DOKUMENTIEREN"|| 775 - text==="ENTSCHEIDEN"|| 776 - text==="START HERE"|| 777 - text==="GET STARTED"|| 778 - text==="ORGANISE & DOCUMENT"|| 779 - text==="ORGANIZE & DOCUMENT"|| 780 - text==="DECIDE" 781 - ); 782 - } 783 - 784 - function findKnownBar(card){ 785 - var cardRect= 786 - card.getBoundingClientRect(); 787 - 788 - var rows= 789 - Array.from( 790 - card.querySelectorAll( 791 - "div,p,span,strong,h3,h4,h5,h6" 792 - ) 793 - ) 794 - .filter(function(el){ 795 - if(!visible(el,20,6))return false; 796 - if(!knownBar(el))return false; 797 - 798 - var r=el.getBoundingClientRect(); 799 - 800 - var rel= 801 - r.top- 802 - cardRect.top; 803 - 804 - return ( 805 - rel>=35&& 806 - rel<= 807 - cardRect.height*.75 808 - ); 809 - }) 810 - .sort(function(a,b){ 811 - return ( 812 - a.getBoundingClientRect().top- 813 - b.getBoundingClientRect().top 814 - ); 815 - }); 816 - 817 - return rows[0]||null; 818 - } 819 - 820 - function alignKnownBars(cards){ 821 - var rows= 822 - cards.map(function(card){ 823 - var bar= 824 - findKnownBar(card); 825 - 826 - if(!bar)return null; 827 - 828 - var cr= 829 - card.getBoundingClientRect(); 830 - 831 - var br= 832 - bar.getBoundingClientRect(); 833 - 834 - return { 835 - bar:bar, 836 - relativeTop: 837 - br.top- 838 - cr.top 839 - }; 840 - }); 841 - 842 - if( 843 - rows.some(function(row){ 844 - return !row; 845 - }) 846 - ){ 847 - return false; 848 - } 849 - 850 - var target= 851 - Math.max.apply( 852 - Math, 853 - rows.map(function(row){ 854 - return row.relativeTop; 855 - }) 856 - ); 857 - 858 - rows.forEach(function(row){ 859 - var delta= 860 - target- 861 - row.relativeTop; 862 - 863 - if(delta<=1)return; 864 - 865 - saveOriginal( 866 - row.bar, 867 - originalMarginTop, 868 - "margin-top" 869 - ); 870 - 871 - var current= 872 - num( 873 - getComputedStyle( 874 - row.bar 875 - ).marginTop 876 - ); 877 - 878 - row.bar.style.setProperty( 879 - "margin-top", 880 - ( 881 - current+ 882 - delta 883 - )+"px" 884 - ); 885 - 886 - row.bar.setAttribute( 887 - "data-sn-first-section-aligned", 888 - "7" 889 - ); 890 - 891 - sectionManaged.add( 892 - row.bar 893 - ); 894 - }); 895 - 896 - return true; 897 - } 898 - 899 - /* ---------- Generic first content after heading ---------- */ 900 - 901 - function heading(card){ 902 - var cr= 903 - card.getBoundingClientRect(); 904 - 905 - var rows= 906 - Array.from( 907 - card.querySelectorAll( 908 - "h1,h2,h3,h4,h5,h6,.box-title,[role=heading]" 909 - ) 910 - ) 911 - .filter(function(el){ 912 - if(!visible(el,20,8))return false; 913 - 914 - var r=el.getBoundingClientRect(); 915 - 916 - var rel= 917 - r.top- 918 - cr.top; 919 - 920 - return ( 921 - rel>=0&& 922 - rel<= 923 - Math.min( 924 - 160, 925 - cr.height*.45 926 - ) 927 - ); 928 - }) 929 - .sort(function(a,b){ 930 - return ( 931 - a.getBoundingClientRect().top- 932 - b.getBoundingClientRect().top 933 - ); 934 - }); 935 - 936 - return rows[0]||null; 937 - } 938 - 939 - function firstContent(card,h){ 940 - if(!h)return null; 941 - 942 - var cr= 943 - card.getBoundingClientRect(); 944 - 945 - var hr= 946 - h.getBoundingClientRect(); 947 - 948 - var rows= 949 - Array.from( 950 - card.querySelectorAll( 951 - "p,div,ul,ol,dl,blockquote" 952 - ) 953 - ) 954 - .filter(function(el){ 955 - if( 956 - el===h|| 957 - h.contains(el)|| 958 - el.contains(h) 959 - ){ 960 - return false; 961 - } 962 - 963 - if(!visible(el,30,8))return false; 964 - 965 - var text= 966 - String(el.textContent||"") 967 - .replace(/\s+/g," ") 968 - .trim(); 969 - 970 - if(text.length<3)return false; 971 - 972 - var r=el.getBoundingClientRect(); 973 - 974 - if( 975 - r.top< 976 - hr.bottom-1 977 - ){ 978 - return false; 979 - } 980 - 981 - if( 982 - r.top-cr.top> 983 - Math.min( 984 - 280, 985 - cr.height*.65 986 - ) 987 - ){ 988 - return false; 989 - } 990 - 991 - if( 992 - r.height> 993 - cr.height*.58 994 - ){ 995 - return false; 996 - } 997 - 998 - return true; 999 - }) 1000 - .sort(function(a,b){ 1001 - var ar= 1002 - a.getBoundingClientRect(); 1003 - 1004 - var br= 1005 - b.getBoundingClientRect(); 1006 - 1007 - return ( 1008 - ar.top-br.top|| 1009 - ar.height-br.height 1010 - ); 1011 - }); 1012 - 1013 - return rows[0]||null; 1014 - } 1015 - 1016 - function alignGeneric(cards){ 1017 - var rows= 1018 - cards.map(function(card){ 1019 - var h= 1020 - heading(card); 1021 - 1022 - var c= 1023 - firstContent( 1024 - card, 1025 - h 1026 - ); 1027 - 1028 - if(!h||!c)return null; 1029 - 1030 - var cr= 1031 - card.getBoundingClientRect(); 1032 - 1033 - var rr= 1034 - c.getBoundingClientRect(); 1035 - 1036 - return { 1037 - content:c, 1038 - relativeTop: 1039 - rr.top-cr.top 1040 - }; 1041 - }); 1042 - 1043 - if( 1044 - rows.some(function(row){ 1045 - return !row; 1046 - }) 1047 - ){ 1048 - return false; 1049 - } 1050 - 1051 - var target= 1052 - Math.max.apply( 1053 - Math, 1054 - rows.map(function(row){ 1055 - return row.relativeTop; 1056 - }) 1057 - ); 1058 - 1059 - rows.forEach(function(row){ 1060 - var delta= 1061 - target- 1062 - row.relativeTop; 1063 - 1064 - if(delta<=1)return; 1065 - 1066 - saveOriginal( 1067 - row.content, 1068 - originalMarginTop, 1069 - "margin-top" 1070 - ); 1071 - 1072 - var current= 1073 - num( 1074 - getComputedStyle( 1075 - row.content 1076 - ).marginTop 1077 - ); 1078 - 1079 - row.content.style.setProperty( 1080 - "margin-top", 1081 - ( 1082 - current+ 1083 - delta 1084 - )+"px" 1085 - ); 1086 - 1087 - row.content.setAttribute( 1088 - "data-sn-first-content-aligned", 1089 - "7" 1090 - ); 1091 - 1092 - contentManaged.add( 1093 - row.content 1094 - ); 1095 - }); 1096 - 1097 - return true; 1098 - } 1099 - 1100 - function applyRow(group){ 1101 - if(!validRow(group))return false; 1102 - 1103 - var cards=[]; 1104 - var seen=new Set(); 1105 - 1106 - group.entries.forEach(function(entry){ 1107 - if(!seen.has(entry.target)){ 1108 - seen.add(entry.target); 1109 - cards.push(entry.target); 1110 - } 1111 - }); 1112 - 1113 - if(cards.length<2)return false; 1114 - 1115 - if( 1116 - !alignKnownBars(cards) 1117 - ){ 1118 - alignGeneric(cards); 1119 - } 1120 - 1121 - var maxHeight=0; 1122 - 1123 - cards.forEach(function(card){ 1124 - maxHeight= 1125 - Math.max( 1126 - maxHeight, 1127 - card.getBoundingClientRect().height 1128 - ); 1129 - }); 1130 - 1131 - maxHeight= 1132 - Math.ceil( 1133 - maxHeight 1134 - ); 1135 - 1136 - if(maxHeight<MIN_H)return false; 1137 - 1138 - cards.forEach(function(card){ 1139 - saveOriginal( 1140 - card, 1141 - originalMinHeight, 1142 - "min-height" 1143 - ); 1144 - 1145 - card.style.setProperty( 1146 - "min-height", 1147 - maxHeight+"px" 1148 - ); 1149 - 1150 - card.setAttribute( 1151 - "data-sn-equal-height-managed", 1152 - "7" 1153 - ); 1154 - 1155 - heightManaged.add(card); 1156 - }); 1157 - 1158 - return true; 1159 - } 1160 - 1161 - function calculate(force){ 1162 - if(applying)return; 1163 - 1164 - var width= 1165 - Math.round( 1166 - window.innerWidth 1167 - ); 1168 - 1169 - var meaningful= 1170 - lastWidth<0|| 1171 - Math.abs( 1172 - width- 1173 - lastWidth 1174 - )>= 1175 - MIN_WIDTH_CHANGE; 1176 - 1177 - if( 1178 - hasApplied&& 1179 - !force&& 1180 - !meaningful 1181 - ){ 1182 - return; 1183 - } 1184 - 1185 - applying=true; 1186 - 1187 - try{ 1188 - harmoniseCustomCallouts(); 1189 - 1190 - if(width<=MOBILE_MAX){ 1191 - if(hasApplied){ 1192 - resetRuntime(); 1193 - } 1194 - 1195 - hasApplied=false; 1196 - lastWidth=width; 1197 - return; 1198 - } 1199 - 1200 - if(hasApplied){ 1201 - resetRuntime(); 1202 - } 1203 - 1204 - var parents= 1205 - Array.from( 1206 - root.querySelectorAll("*") 1207 - ) 1208 - .filter(function(parent){ 1209 - return ( 1210 - visible( 1211 - parent, 1212 - MIN_W, 1213 - MIN_H 1214 - )&& 1215 - parent.children&& 1216 - parent.children.length>=2&& 1217 - parent.children.length<= 1218 - MAX_PARENT_CHILDREN 1219 - ); 1220 - }); 1221 - 1222 - var touched= 1223 - new Set(); 1224 - 1225 - parents.forEach(function(parent){ 1226 - var entries=[]; 1227 - 1228 - Array.from( 1229 - parent.children 1230 - ).forEach(function(child){ 1231 - if( 1232 - !visible( 1233 - child, 1234 - MIN_W, 1235 - MIN_H 1236 - ) 1237 - ){ 1238 - return; 1239 - } 1240 - 1241 - var target= 1242 - pickTarget(child); 1243 - 1244 - if(!target)return; 1245 - 1246 - entries.push({ 1247 - target:target, 1248 - rect: 1249 - target.getBoundingClientRect() 1250 - }); 1251 - }); 1252 - 1253 - groupRows( 1254 - entries 1255 - ).forEach(function(group){ 1256 - if(!validRow(group))return; 1257 - 1258 - var targets= 1259 - group.entries.map(function(entry){ 1260 - return entry.target; 1261 - }); 1262 - 1263 - if( 1264 - !targets.some(function(el){ 1265 - return !touched.has(el); 1266 - }) 1267 - ){ 1268 - return; 1269 - } 1270 - 1271 - if(applyRow(group)){ 1272 - targets.forEach(function(el){ 1273 - touched.add(el); 1274 - }); 1275 - } 1276 - }); 1277 - }); 1278 - 1279 - lastWidth=width; 1280 - hasApplied=true; 1281 - }finally{ 1282 - applying=false; 1283 - } 1284 - } 1285 - 1286 - function resize(){ 1287 - if(resizeTimer){ 1288 - clearTimeout( 1289 - resizeTimer 1290 - ); 1291 - } 1292 - 1293 - resizeTimer= 1294 - setTimeout( 1295 - function(){ 1296 - resizeTimer=0; 1297 - calculate(false); 1298 - }, 1299 - RESIZE_DEBOUNCE 1300 - ); 1301 - } 1302 - 1303 - function waitImages(){ 1304 - var images= 1305 - Array.from( 1306 - root.querySelectorAll("img") 1307 - ); 1308 - 1309 - return Promise.all( 1310 - images.map(function(img){ 1311 - if(img.complete){ 1312 - return Promise.resolve(); 1313 - } 1314 - 1315 - return new Promise(function(resolve){ 1316 - var done=function(){ 1317 - resolve(); 1318 - }; 1319 - 1320 - img.addEventListener( 1321 - "load", 1322 - done, 1323 - {once:true} 1324 - ); 1325 - 1326 - img.addEventListener( 1327 - "error", 1328 - done, 1329 - {once:true} 1330 - ); 1331 - }); 1332 - }) 1333 - ); 1334 - } 1335 - 1336 - async function initial(){ 1337 - if( 1338 - document.readyState!== 1339 - "complete" 1340 - ){ 1341 - await new Promise(function(resolve){ 1342 - addEventListener( 1343 - "load", 1344 - resolve, 1345 - {once:true} 1346 - ); 1347 - }); 1348 - } 1349 - 1350 - if( 1351 - document.fonts&& 1352 - document.fonts.ready 1353 - ){ 1354 - try{ 1355 - await document.fonts.ready; 1356 - }catch(error){} 1357 - } 1358 - 1359 - await waitImages(); 1360 - 1361 - // Exactly one initial layout calculation. 1362 - calculate(true); 1363 - } 1364 - 1365 - addEventListener( 1366 - "resize", 1367 - resize, 1368 - {passive:true} 1369 - ); 1370 - 1371 - initial(); 1372 -})(); 1373 -</script> 1374 - 1375 -<!-- SN_HORIZONTAL_BOX_HARMONIZER_END --> 1376 -{{/html}}\n