Wiki source code of Quick Start for Small Projects

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

Show last authors
1 {{html clean="false"}}
2
3 <style>
4 .arsn-topic-page{max-width:1400px;margin:0 auto;color:#322f2b}
5 .arsn-topic-page *{box-sizing:border-box}
6 .arsn-card{border:1px solid #e3ded6;border-radius:11px;background:#fcfbf8;box-shadow:0 1px 3px rgba(0,0,0,.035)}
7 .arsn-eyebrow{font-size:12px;font-weight:700;letter-spacing:.075em;text-transform:uppercase}
8 .arsn-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:14px}
9 .arsn-grid-2{display:grid;grid-template-columns:repeat(2,minmax(300px,1fr));gap:14px}
10 .arsn-grid-3{display:grid;grid-template-columns:repeat(3,minmax(240px,1fr));gap:14px}
11 .arsn-chip{display:inline-block;padding:4px 8px;margin:3px 4px 3px 0;border-radius:14px;background:#f3efe8;border:1px solid #e3ded6;color:#5c5650;font-size:12px}
12 .arsn-check{position:relative;padding:11px 12px 11px 36px;border:1px solid #e3ded6;border-radius:8px;background:#fffdf9}
13 .arsn-check:before{content:"✓";position:absolute;left:13px;top:9px;color:#e94b13;font-weight:800}
14 .arsn-call{padding:15px 16px;border:1px solid #e3ded6;border-top:4px solid #e94b13;border-radius:9px;background:#fcfbf8}
15 .arsn-call h4{font-size:17px;margin:0 0 6px 0;color:#35312d}
16 .arsn-call p{margin:0 0 8px 0;color:#625d56;line-height:1.5}
17 .arsn-call a{font-weight:600}
18 .arsn-section{margin:0 0 26px 0}
19 .arsn-section h3{font-size:22px;margin:0 0 6px 0;color:#35312d}
20 .arsn-section > p{color:#6a655e;line-height:1.55}
21 .arsn-info{padding:15px 17px;border:1px solid #c7e5ed;border-left:5px solid #21b6d7;background:#eaf6f9;border-radius:8px;color:#365e68}
22 .arsn-info strong{color:#2d5661}
23 .arsn-warn{padding:15px 17px;border:1px solid #efd9cc;border-left:5px solid #e94b13;background:#fff6f1;border-radius:8px;color:#67564e}
24 .arsn-warn strong{color:#744531}
25 details.arsn-detail{margin:8px 0;border:1px solid #e3ded6;border-radius:8px;background:#fcfbf8;overflow:hidden}
26 details.arsn-detail summary{cursor:pointer;padding:12px 14px;font-weight:700;color:#403b36;background:#f3efe8}
27 details.arsn-detail[open] summary{border-bottom:1px solid #e3ded6}
28 details.arsn-detail .body{padding:14px 16px;color:#514c46;line-height:1.55}
29 .arsn-table{width:100%;border-collapse:collapse;background:#fffdf9}
30 .arsn-table th,.arsn-table td{border:1px solid #e3ded6;padding:10px 11px;vertical-align:top;text-align:left}
31 .arsn-table th{background:#f3efe8;color:#403b36}
32 .arsn-source{padding:12px 13px;border:1px solid #e3ded6;border-left:4px solid #21b6d7;border-radius:7px;background:#fffdf9}
33 .arsn-source strong{display:block;margin-bottom:3px}
34 .arsn-source small{color:#6a655e}
35 .arsn-hero-image{height:125px;overflow:hidden;background:#f1eee9}
36 .arsn-hero-image img{width:100%;height:100%;object-fit:cover;object-position:center 45%;display:block}
37 @media(max-width:850px){.arsn-grid-2,.arsn-grid-3{grid-template-columns:1fr}}
38 </style>
39
40 <div class="arsn-topic-page">
41
42 <section class="arsn-card" style="margin-bottom:18px;overflow:hidden;border-left:6px solid #21b6d7;">
43 <div class="arsn-hero-image"><img src="https://xwiki.uni-ak.ac.at/bin/download/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/WebHome/enable.png" alt="Quick start for a small artistic or research project" style="object-position:center 58%;" /></div>
44 <div style="padding:18px 21px 20px 21px;">
45 <div class="arsn-eyebrow" style="color:#3f6871;margin-bottom:5px;">PREPARE · QUICK START · SMALL PROJECTS</div>
46 <h2 style="font-size:27px;line-height:1.2;margin:0 0 8px 0;color:#2c2926;">Minimum viable project setup</h2>
47 <p style="margin:0;color:#5e5953;line-height:1.6;max-width:1050px;">
48 For a small, short or low-complexity project, you do not need a large management system.
49 You do need a small set of decisions that prevents funding, rights, data, budget or handover problems later.
50 </p>
51 </div>
52 </section>
53
54 <div class="arsn-info" style="margin-bottom:22px;">
55 <strong>Use this page if:</strong> the project is small enough that a full project plan would be disproportionate,
56 but it still involves money, collaborators, data/materials, public presentation or third-party rights.
57 If any red flag at the bottom applies, switch to the full <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Get%20Started/">Get Started</a> workflow.
58 </div>
59
60 <!-- 30 MINUTE CHECK -->
61 <section class="arsn-section">
62 <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:4px;">20–30 MINUTE PROJECT CHECK</div>
63 <h3>Decide these eight things before you start</h3>
64
65 <div class="arsn-grid">
66 <div class="arsn-check"><strong>1 · What is the project?</strong><br><span style="color:#6a655e;">Write 3–6 sentences: objective, activity, result, audience.</span></div>
67 <div class="arsn-check"><strong>2 · Who is responsible?</strong><br><span style="color:#6a655e;">Name project lead, budget/contact person and collaborators.</span></div>
68 <div class="arsn-check"><strong>3 · Who is the applicant?</strong><br><span style="color:#6a655e;">University, individual, association, partner organisation?</span></div>
69 <div class="arsn-check"><strong>4 · How much will it cost?</strong><br><span style="color:#6a655e;">Personnel/fees, materials, travel, services, venue, rights, documentation.</span></div>
70 <div class="arsn-check"><strong>5 · What needs permission?</strong><br><span style="color:#6a655e;">Images, music, texts, participants, personal data, venue, event, recording?</span></div>
71 <div class="arsn-check"><strong>6 · Where do the files/materials live?</strong><br><span style="color:#6a655e;">One primary location + backup + named access.</span></div>
72 <div class="arsn-check"><strong>7 · What will be shared?</strong><br><span style="color:#6a655e;">Public output, documentation, credits, licence/access.</span></div>
73 <div class="arsn-check"><strong>8 · What happens at the end?</strong><br><span style="color:#6a655e;">Master files, final documents, archive/repository/handover/deletion.</span></div>
74 </div>
75 </section>
76
77 <!-- FUNDING QUICK ROUTE -->
78 <section class="arsn-section">
79 <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:4px;">FUNDING IN 5 MINUTES</div>
80 <h3>Choose the closest route, then read the current call</h3>
81
82 <div class="arsn-grid">
83 <div class="arsn-call" style="border-top-color:#21b6d7">
84 <h4>Small internal art/research activity at the Angewandte</h4>
85 <p>Check SUP and current internal open calls first.</p>
86 <a href="https://www.dieangewandte.at/en/news/open_calls" target="_blank" rel="noopener">Angewandte Open Calls</a>
87 </div>
88
89 <div class="arsn-call" style="border-top-color:#21b6d7">
90 <h4>Arts-based research</h4>
91 <p>PEEK is the central Austrian research route when artistic practice is integral to the research question; it is not a “small project” scheme, so use the full planning route.</p>
92 <a href="https://www.fwf.ac.at/en/funding/portfolio/projects/arts-based-research" target="_blank" rel="noopener">FWF PEEK</a>
93 </div>
94
95 <div class="arsn-call" style="border-top-color:#e94b13">
96 <h4>Artistic production / presentation</h4>
97 <p>Check the relevant federal BMWKMS artistic discipline and, for Vienna, MA 7.</p>
98 <a href="https://www.bmwkms.gv.at/themen/kunst-und-kultur/" target="_blank" rel="noopener">BMWKMS calls</a>
99 · <a href="https://www.wien.gv.at/kultur/foerderungen" target="_blank" rel="noopener">MA 7</a>
100 </div>
101
102 <div class="arsn-call" style="border-top-color:#38b76a">
103 <h4>Mobility / residency</h4>
104 <p>Check Culture Moves Europe and current Austrian mobility programmes.</p>
105 <a href="https://culture.ec.europa.eu/culture-moves-europe" target="_blank" rel="noopener">Culture Moves Europe</a>
106 </div>
107 </div>
108
109 <div class="arsn-warn" style="margin-top:14px;">
110 <strong>Quick call-fit rule:</strong>
111 confirm applicant eligibility, project type, exclusions, deadline, earliest project start, eligible costs,
112 funding percentage/co-financing and reporting requirements before you write the application.
113 </div>
114 </section>
115
116 <!-- MINIMUM FILE PACK -->
117 <section class="arsn-section">
118 <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:4px;">MINIMUM DOCUMENTATION</div>
119 <h3>Create one project folder with these files</h3>
120
121 <table class="arsn-table">
122 <thead><tr><th>File</th><th>Minimum content</th></tr></thead>
123 <tbody>
124 <tr><td><strong>01_Project_Summary</strong></td><td>Title, objective, project type, people, dates, outputs, audience.</td></tr>
125 <tr><td><strong>02_Budget</strong></td><td>Costs, funding source, co-financing/own contribution, notes on eligible costs.</td></tr>
126 <tr><td><strong>03_Timeline</strong></td><td>Start/end, 4–8 milestones, public presentation/deposit/closure.</td></tr>
127 <tr><td><strong>04_Roles</strong></td><td>Who decides, creates, buys, signs, stores, publishes and hands over.</td></tr>
128 <tr><td><strong>05_Rights_Ethics</strong></td><td>Third-party material, licences, participants, personal data, consent, unresolved issues.</td></tr>
129 <tr><td><strong>06_Storage_Backup</strong></td><td>Primary location, backup, access list, master-file location.</td></tr>
130 <tr><td><strong>07_Funder_Rules</strong></td><td>Call PDF/link, deadline, start rule, budget rules, reporting, contact.</td></tr>
131 <tr><td><strong>08_Closure</strong></td><td>What is retained, published, deposited, handed over or deleted.</td></tr>
132 </tbody>
133 </table>
134 </section>
135
136 <!-- SMALL PROJECT LEGAL CHECK -->
137 <section class="arsn-section">
138 <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:4px;">AUSTRIA · MINIMUM LEGAL / ADMIN CHECK</div>
139 <h3>Do not skip these because the project is small</h3>
140
141 <div class="arsn-grid">
142 <div class="arsn-check">Correct applicant / institutional approval</div>
143 <div class="arsn-check">Written agreements with paid collaborators / contractors</div>
144 <div class="arsn-check">Copyright and permission for third-party material</div>
145 <div class="arsn-check">Participant information / consent / data protection where relevant</div>
146 <div class="arsn-check">Social insurance / tax route if working independently</div>
147 <div class="arsn-check">Venue / event / safety permission if publicly presented</div>
148 <div class="arsn-check">Fair and eligible payment in the budget</div>
149 <div class="arsn-check">Evidence: invoices, contracts, approvals, payment records</div>
150 </div>
151 </section>
152
153 <!-- ESCALATE -->
154 <section class="arsn-section">
155 <div class="arsn-eyebrow" style="color:#8a4d36;margin-bottom:4px;">USE THE FULL GET STARTED PAGE IF…</div>
156 <h3>These are signs that your project is no longer “quick start”</h3>
157
158 <div class="arsn-grid">
159 <div class="arsn-warn">You are applying to FWF, Horizon Europe, Creative Europe cooperation or another complex external programme.</div>
160 <div class="arsn-warn">There are several institutions, countries or formal partners.</div>
161 <div class="arsn-warn">You employ people or have a significant personnel budget.</div>
162 <div class="arsn-warn">You collect sensitive/personal data or work with minors/vulnerable participants.</div>
163 <div class="arsn-warn">You use substantial third-party copyrighted material.</div>
164 <div class="arsn-warn">There is complex equipment, construction, public-space work, safety risk or permits.</div>
165 <div class="arsn-warn">The project has multiple publication/repository/preservation obligations.</div>
166 <div class="arsn-warn">The funder requires co-financing, procurement, audit, open science or a DMP.</div>
167 </div>
168 </section>
169
170 <div class="arsn-info" style="margin-bottom:14px;">
171 <strong>Need help finding a call?</strong>
172 Start with <a href="https://www.dieangewandte.at/en/news/open_calls" target="_blank" rel="noopener">Angewandte Open Calls</a>
173 and Support Kunst und Forschung. Send a short project idea, applicant, duration and rough budget to
174 <a href="mailto:projektsupport@uni-ak.ac.at">projektsupport@uni-ak.ac.at</a>.
175 </div>
176
177 <div class="arsn-info">
178 <strong>Need the full checklist?</strong>
179 Continue to <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/Enable/Get%20Started/">Get Started</a>.
180 </div>
181
182 <!-- ARSN_TRAINING_WORKSHOPS_V2_START -->
183 <section class="arsn-training-workshops" data-arsn-training-workshops="v2" style="margin:27px 0 22px 0;">
184 <div style="padding:16px 18px;background:#eef8fa;border:1px solid #cfe8ef;border-left:5px solid #21b6d7;border-radius:9px;">
185 <div style="font-size:12px;font-weight:700;letter-spacing:.075em;text-transform:uppercase;color:#3f6871;margin-bottom:5px;">TRAINING &amp; WORKSHOPS</div>
186 <h3 style="font-size:20px;line-height:1.3;margin:0 0 7px;color:#35312d;text-align:left;">Training, workshops &amp; consultation sessions</h3>
187 <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>
188 <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>
189 </div>
190 </section>
191 <!-- ARSN_TRAINING_WORKSHOPS_V2_END -->
192
193 <!-- ARSN_PRACTICAL_RESOURCES_V2_START -->
194 <section class="arsn-practical-resources" data-arsn-practical-resources="v2" style="margin:0 0 27px;">
195 <div style="font-size:12px;font-weight:700;letter-spacing:.075em;text-transform:uppercase;color:#8a4d36;margin-bottom:4px;">USEFUL MATERIALS</div>
196 <h3 style="font-size:22px;line-height:1.25;margin:0 0 8px;color:#35312d;text-align:left;">Practical Resources</h3>
197 <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>
198 <div class="arsn-resource-grid" style="display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;">
199 <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>
200 <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>
201 <div style="padding:15px 16px;background:#fcfbf8;border:1px solid #e3ded6;border-top:3px solid #38b76a;border-radius:9px;"><strong>Checklists &amp; Templates</strong><br><span data-arsn-coming-soon="true" style="display:inline-block;margin:6px 0 8px;padding:4px 9px;border-radius:14px;background:#fff4ee;border:1px solid #efd9cc;color:#8a4d36;font-size:11px;font-weight:700;letter-spacing:.065em;">COMING SOON</span><div style="color:#625d56;line-height:1.45;">Ready-to-use checklists and templates for planning, managing and closing projects.</div></div>
202 </div>
203 <style>@media(max-width:767px){.arsn-resource-grid{grid-template-columns:1fr!important}}</style>
204 </section>
205 <!-- ARSN_PRACTICAL_RESOURCES_V2_END -->
206
207 </div>
208 {{/html}}
209
210 {{html clean="false"}}
211 <!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START -->
212
213 <style data-sn-service-navigator-master="1">
214 /* =========================================================
215 MASTER TYPOGRAPHY
216 ========================================================= */
217 #xwikicontent h1,
218 #xwikicontent h2,
219 #xwikicontent h3,
220 #xwikicontent h4,
221 #xwikicontent h5,
222 #xwikicontent h6,
223 #xwikicontent .box-title,
224 #xwikicontent [role="heading"],
225 #xwikicontent h1 a,
226 #xwikicontent h2 a,
227 #xwikicontent h3 a,
228 #xwikicontent h4 a,
229 #xwikicontent h5 a,
230 #xwikicontent h6 a,
231 #xwikicontent .box-title a,
232 #xwikicontent [role="heading"] a{
233 text-align:left!important;
234 text-justify:auto!important;
235 word-spacing:normal!important;
236 }
237
238 /* =========================================================
239 COMING SOON / IN VORBEREITUNG
240 ========================================================= */
241 .sn-coming-soon-badge{
242 display:inline-block;
243 vertical-align:middle;
244 margin-left:10px;
245 padding:4px 8px;
246 border-radius:14px;
247 border:1px solid #efd9cc;
248 background:#fff4ee;
249 color:#8a4d36;
250 font-size:11px;
251 font-weight:700;
252 letter-spacing:.055em;
253 line-height:1.2;
254 white-space:nowrap;
255 }
256
257 /* =========================================================
258 NATIVE / DETAIL CALLOUT GEOMETRY
259 Preserve existing backgrounds.
260 ========================================================= */
261 #xwikicontent .arsn-info,
262 #xwikicontent .dmp-info,
263 #xwikicontent .ido-info,
264 #xwikicontent .pp-info,
265 #xwikicontent .infomessage{
266 box-sizing:border-box!important;
267 border-left:4px solid #21b6d7!important;
268 border-radius:8px;
269 text-align:left!important;
270 word-spacing:normal!important;
271 }
272
273 #xwikicontent .arsn-warn,
274 #xwikicontent .dmp-warn,
275 #xwikicontent .ido-warn,
276 #xwikicontent .pp-warn,
277 #xwikicontent .warn,
278 #xwikicontent .warning,
279 #xwikicontent .warningmessage,
280 #xwikicontent .errormessage{
281 box-sizing:border-box!important;
282 border-left:4px solid #e94b13!important;
283 border-radius:8px;
284 text-align:left!important;
285 word-spacing:normal!important;
286 }
287
288 [data-sn-master-equal-height],
289 [data-sn-master-first-row]{
290 box-sizing:border-box;
291 }
292
293 /* =========================================================
294 FULL-WIDTH THREE-LINE NUMBER / TITLE / SUBTITLE BLOCKS
295 ========================================================= */
296 #xwikicontent .arsn-area-label[data-sn-three-line="1"]{
297 display:grid!important;
298 grid-template-columns:minmax(0,1fr)!important;
299 grid-auto-rows:auto!important;
300 width:100%!important;
301 max-width:none!important;
302 box-sizing:border-box!important;
303 justify-items:start!important;
304 align-items:start!important;
305 gap:2px!important;
306 text-align:left!important;
307 text-align-last:left!important;
308 text-justify:auto!important;
309 word-spacing:normal!important;
310 white-space:normal!important;
311 }
312 #xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-number,
313 #xwikicontent .arsn-area-label[data-sn-three-line="1"] > .sn-area-label-title,
314 #xwikicontent .arsn-area-label[data-sn-three-line="1"] > .arsn-area-action{
315 display:block!important;
316 width:100%!important;
317 margin:0!important;
318 text-align:left!important;
319 text-align-last:left!important;
320 text-justify:auto!important;
321 word-spacing:normal!important;
322 white-space:normal!important;
323 }
324 </style>
325
326 <script data-sn-service-navigator-master="1">
327 (function(){
328 "use strict";
329
330 var PAGE_KIND="detail";
331 var PLACEHOLDER=false;
332 var PLACEHOLDER_LABEL="COMING SOON";
333
334 var MOBILE_MAX=767;
335 var ROW_TOLERANCE=6;
336 var RESIZE_DEBOUNCE=220;
337
338 var root=
339 document.getElementById("xwikicontent")||
340 document.querySelector(".xwiki-rendering-content")||
341 document.querySelector("main")||
342 document.body;
343
344 if(!root)return;
345
346 var managedHeight=new Set();
347 var managedMargin=new Set();
348 var originalHeight=new WeakMap();
349 var originalMargin=new WeakMap();
350
351 var resizeTimer=0;
352 var running=false;
353
354 var THEMES=[
355 {
356 name:"BLUE",
357 accent:"#21b6d7",
358 bg:"#eaf7fb",
359 text:"#315d68",
360 labels:[
361 "HIER STARTEN",
362 "ENTSCHEIDEN",
363 "ÜBERPRÜFEN & ANPASSEN",
364 "START HERE",
365 "DECIDE",
366 "REVIEW & ADAPT"
367 ]
368 },
369 {
370 name:"RED",
371 accent:"#e94b13",
372 bg:"#fff1ec",
373 text:"#8a4d36",
374 labels:[
375 "PLANEN & ORGANISIEREN",
376 "ORGANISIEREN & DOKUMENTIEREN",
377 "PUBLIZIEREN & PRÄSENTIEREN",
378 "PLAN & ORGANISE",
379 "PLAN & ORGANIZE",
380 "ORGANISE & DOCUMENT",
381 "ORGANIZE & DOCUMENT",
382 "PUBLISH & PRESENT"
383 ]
384 },
385 {
386 name:"YELLOW",
387 accent:"#f0aa00",
388 bg:"#fff8e7",
389 text:"#785b17",
390 labels:[
391 "SCHÜTZEN & KLÄREN",
392 "STANDARDISIEREN & IDENTIFIZIEREN",
393 "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN",
394 "PROTECT & CLARIFY",
395 "STANDARDISE & IDENTIFY",
396 "STANDARDIZE & IDENTIFY",
397 "OPEN, REUSE & MAKE FINDABLE"
398 ]
399 },
400 {
401 name:"GREEN",
402 accent:"#38b76a",
403 bg:"#edf9f1",
404 text:"#3f7451",
405 labels:[
406 "INFRASTRUKTUR EINRICHTEN",
407 "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN",
408 "SPEICHERN & ZUGRIFF STEUERN",
409 "REPOSITORIUM, ERHALTEN & ÜBERGEBEN",
410 "SET UP INFRASTRUCTURE",
411 "SET UP INFRASTRUCTURE & COLLABORATION",
412 "STORE & CONTROL ACCESS",
413 "REPOSITORY, PRESERVE & HAND OVER"
414 ]
415 }
416 ];
417
418 function num(value){
419 var n=parseFloat(value);
420 return Number.isFinite(n)?n:0;
421 }
422
423 function norm(value){
424 return String(value||"")
425 .replace(/\s+/g," ")
426 .trim()
427 .toUpperCase();
428 }
429
430 function visible(el){
431 if(!el||el.nodeType!==1)return false;
432
433 var style=getComputedStyle(el);
434 var rect=el.getBoundingClientRect();
435
436 return (
437 style.display!=="none"&&
438 style.visibility!=="hidden"&&
439 rect.width>20&&
440 rect.height>4
441 );
442 }
443
444 function saveStyle(el,map,property){
445 if(map.has(el))return;
446
447 map.set(el,{
448 value:el.style.getPropertyValue(property),
449 priority:el.style.getPropertyPriority(property)
450 });
451 }
452
453 function restoreStyle(el,map,property){
454 var original=map.get(el);
455
456 if(original&&original.value){
457 el.style.setProperty(
458 property,
459 original.value,
460 original.priority||""
461 );
462 }else{
463 el.style.removeProperty(property);
464 }
465 }
466
467 function resetRuntime(){
468 managedHeight.forEach(function(el){
469 restoreStyle(
470 el,
471 originalHeight,
472 "min-height"
473 );
474 el.removeAttribute(
475 "data-sn-master-equal-height"
476 );
477 });
478
479 managedMargin.forEach(function(el){
480 restoreStyle(
481 el,
482 originalMargin,
483 "margin-top"
484 );
485 el.removeAttribute(
486 "data-sn-master-first-row"
487 );
488 });
489
490 managedHeight.clear();
491 managedMargin.clear();
492 }
493
494 function themeFor(text){
495 var value=norm(text);
496
497 for(var i=0;i<THEMES.length;i++){
498 for(var j=0;j<THEMES[i].labels.length;j++){
499 var label=THEMES[i].labels[j];
500
501 if(
502 value===label||
503 value.indexOf(label+" ")===0||
504 value.indexOf(label+" -")===0||
505 value.indexOf(label+" ·")===0
506 ){
507 return THEMES[i];
508 }
509 }
510 }
511
512 return null;
513 }
514
515 /* =======================================================
516 BORDERLESS FILLED RED/ORANGE CTA BUTTONS
517 ======================================================= */
518
519 function colourDistance(a,b){
520 return Math.sqrt(
521 Math.pow(a[0]-b[0],2)+
522 Math.pow(a[1]-b[1],2)+
523 Math.pow(a[2]-b[2],2)
524 );
525 }
526
527 function makeFilledRedOrangeCTAsBorderless(){
528 var RED_ORANGE=[233,75,19];
529
530 Array.from(
531 root.querySelectorAll(
532 'a,button,[role="button"],input[type="submit"],input[type="button"]'
533 )
534 ).forEach(function(el){
535 if(!visible(el))return;
536
537 var style=getComputedStyle(el);
538 var rgb=parseRGB(style.backgroundColor);
539
540 if(!rgb)return;
541
542 if(
543 colourDistance(
544 rgb,
545 RED_ORANGE
546 )>55
547 ){
548 return;
549 }
550
551 var rect=el.getBoundingClientRect();
552
553 if(
554 rect.width<80||
555 rect.height<24
556 ){
557 return;
558 }
559
560 el.style.setProperty(
561 "border",
562 "none",
563 "important"
564 );
565
566 el.style.setProperty(
567 "border-left",
568 "none",
569 "important"
570 );
571
572 el.style.setProperty(
573 "border-top",
574 "none",
575 "important"
576 );
577
578 el.style.setProperty(
579 "border-right",
580 "none",
581 "important"
582 );
583
584 el.style.setProperty(
585 "border-bottom",
586 "none",
587 "important"
588 );
589
590 el.style.setProperty(
591 "box-shadow",
592 "none",
593 "important"
594 );
595 });
596 }
597
598 /* =======================================================
599 FULL-WIDTH THREE-LINE AREA LABELS
600 ======================================================= */
601
602 function compactText(value){
603 return String(value||"")
604 .replace(/\s+/g," ")
605 .trim();
606 }
607
608 function makeThreeLineAreaLabels(){
609 Array.from(
610 root.querySelectorAll(
611 ".arsn-area-label"
612 )
613 ).forEach(function(label){
614 if(
615 label.getAttribute(
616 "data-sn-three-line"
617 )==="1"
618 ){
619 return;
620 }
621
622 var number=
623 label.querySelector(
624 ":scope > .arsn-area-number"
625 );
626
627 var action=
628 label.querySelector(
629 ":scope > .arsn-area-action"
630 );
631
632 if(
633 !number||
634 !action
635 ){
636 return;
637 }
638
639 var clone=
640 label.cloneNode(true);
641
642 var cloneNumber=
643 clone.querySelector(
644 ":scope > .arsn-area-number"
645 );
646
647 var cloneAction=
648 clone.querySelector(
649 ":scope > .arsn-area-action"
650 );
651
652 if(cloneNumber){
653 cloneNumber.remove();
654 }
655
656 if(cloneAction){
657 cloneAction.remove();
658 }
659
660 var titleText=
661 compactText(
662 clone.textContent
663 );
664
665 if(!titleText){
666 return;
667 }
668
669 var numberNode=
670 number.cloneNode(true);
671
672 var actionNode=
673 action.cloneNode(true);
674
675 var titleNode=
676 document.createElement(
677 "span"
678 );
679
680 titleNode.className=
681 "sn-area-label-title";
682
683 titleNode.textContent=
684 titleText;
685
686 while(label.firstChild){
687 label.removeChild(
688 label.firstChild
689 );
690 }
691
692 label.appendChild(
693 numberNode
694 );
695
696 label.appendChild(
697 titleNode
698 );
699
700 label.appendChild(
701 actionNode
702 );
703
704 label.setAttribute(
705 "data-sn-three-line",
706 "1"
707 );
708
709 var head=
710 label.closest(
711 ".arsn-area-head"
712 );
713
714 if(head){
715 head.style.setProperty(
716 "width",
717 "100%",
718 "important"
719 );
720
721 head.style.setProperty(
722 "max-width",
723 "100%",
724 "important"
725 );
726
727 head.style.setProperty(
728 "box-sizing",
729 "border-box",
730 "important"
731 );
732 }
733 });
734 }
735
736 /* =======================================================
737 PLACEHOLDER BADGE
738 ======================================================= */
739
740 function applyPlaceholderBadge(){
741 if(!PLACEHOLDER)return;
742
743 if(
744 document.querySelector(
745 ".sn-coming-soon-badge"
746 )
747 ){
748 return;
749 }
750
751 var title=
752 document.querySelector(
753 "#document-title"
754 )||
755 document.querySelector(
756 "h1"
757 );
758
759 if(!title)return;
760
761 var badge=
762 document.createElement(
763 "span"
764 );
765
766 badge.className=
767 "sn-coming-soon-badge";
768
769 badge.textContent=
770 PLACEHOLDER_LABEL;
771
772 badge.setAttribute(
773 "aria-label",
774 PLACEHOLDER_LABEL
775 );
776
777 title.appendChild(
778 badge
779 );
780 }
781
782 /* =======================================================
783 DETAIL PAGE OWN-ACCENT PROPAGATION
784 ======================================================= */
785
786 function parseRGB(value){
787 var match=String(value||"").match(
788 /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i
789 );
790
791 if(!match)return null;
792
793 return [
794 Number(match[1]),
795 Number(match[2]),
796 Number(match[3])
797 ];
798 }
799
800 function distance(a,b){
801 return Math.sqrt(
802 Math.pow(a[0]-b[0],2)+
803 Math.pow(a[1]-b[1],2)+
804 Math.pow(a[2]-b[2],2)
805 );
806 }
807
808 function paletteMatch(cssColor){
809 var rgb=parseRGB(cssColor);
810
811 if(!rgb)return null;
812
813 var palette=[
814 {hex:"#21b6d7",rgb:[33,182,215]},
815 {hex:"#e94b13",rgb:[233,75,19]},
816 {hex:"#f0aa00",rgb:[240,170,0]},
817 {hex:"#38b76a",rgb:[56,183,106]}
818 ];
819
820 var best=null;
821 var bestDistance=Infinity;
822
823 palette.forEach(function(item){
824 var d=distance(rgb,item.rgb);
825
826 if(d<bestDistance){
827 best=item;
828 bestDistance=d;
829 }
830 });
831
832 return bestDistance<=30
833 ?best
834 :null;
835 }
836
837 function propagateDetailAccents(){
838 if(PAGE_KIND!=="detail")return;
839
840 Array.from(
841 root.querySelectorAll(
842 ".arsn-call,.dmp-call,.ido-call,.pp-call,"+
843 ".arsn-source,.dmp-source,.ido-source,.pp-source"
844 )
845 ).forEach(function(el){
846 if(!visible(el))return;
847
848 var style=getComputedStyle(el);
849
850 if(
851 num(style.borderTopWidth)>=2
852 ){
853 var match=
854 paletteMatch(
855 style.borderTopColor
856 );
857
858 if(match){
859 el.style.setProperty(
860 "border-left",
861 "4px solid "+match.hex,
862 "important"
863 );
864 }
865 }
866 });
867
868 // Warning families: explicit safety override.
869 Array.from(
870 root.querySelectorAll(
871 ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+
872 ".warn,.warning,.warningmessage,.errormessage"
873 )
874 ).forEach(function(el){
875 if(!visible(el))return;
876
877 el.style.setProperty(
878 "border-left",
879 "4px solid #e94b13",
880 "important"
881 );
882 });
883
884 // Info families: explicit orientation override.
885 Array.from(
886 root.querySelectorAll(
887 ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage"
888 )
889 ).forEach(function(el){
890 if(!visible(el))return;
891
892 el.style.setProperty(
893 "border-left",
894 "4px solid #21b6d7",
895 "important"
896 );
897 });
898 }
899
900 /* =======================================================
901 OVERVIEW SEMANTIC THEME PALETTE
902 ======================================================= */
903
904 function smallestThemeHeaders(){
905 return Array.from(
906 root.querySelectorAll(
907 "div,span,p,strong,h3,h4,h5,h6"
908 )
909 ).filter(function(el){
910 if(!visible(el))return false;
911 if(!themeFor(el.textContent))return false;
912
913 return !Array.from(
914 el.children||[]
915 ).some(function(child){
916 return !!themeFor(
917 child.textContent
918 );
919 });
920 });
921 }
922
923 function findOverviewCard(header){
924 var node=header.parentElement;
925 var candidates=[];
926
927 while(node&&node!==root){
928 var rect=node.getBoundingClientRect();
929 var style=getComputedStyle(node);
930
931 var border=
932 num(style.borderTopWidth)+
933 num(style.borderRightWidth)+
934 num(style.borderBottomWidth)+
935 num(style.borderLeftWidth);
936
937 if(
938 rect.width>=220&&
939 rect.width<=800&&
940 rect.height>=120&&
941 border>=1
942 ){
943 candidates.push(node);
944 }
945
946 node=node.parentElement;
947 }
948
949 if(!candidates.length)return null;
950
951 candidates.sort(function(a,b){
952 return (
953 b.getBoundingClientRect().height-
954 a.getBoundingClientRect().height
955 );
956 });
957
958 return candidates[0];
959 }
960
961 function rowCandidates(link,card){
962 var result=[];
963 var cardRect=
964 card.getBoundingClientRect();
965
966 var node=link;
967
968 while(node&&node!==card){
969 if(visible(node)){
970 var rect=
971 node.getBoundingClientRect();
972
973 if(
974 rect.height<=105&&
975 rect.width>=
976 cardRect.width*.50&&
977 rect.width<=
978 cardRect.width*1.03
979 ){
980 result.push(node);
981 }
982 }
983
984 node=node.parentElement;
985 }
986
987 return result;
988 }
989
990 function chooseOuterRow(
991 candidates,
992 link
993 ){
994 if(!candidates.length){
995 return link;
996 }
997
998 var bordered=
999 candidates.filter(function(el){
1000 return (
1001 num(
1002 getComputedStyle(el)
1003 .borderLeftWidth
1004 )>=1
1005 );
1006 });
1007
1008 var pool=
1009 bordered.length
1010 ?bordered
1011 :candidates;
1012
1013 pool.sort(function(a,b){
1014 var ar=
1015 a.getBoundingClientRect();
1016
1017 var br=
1018 b.getBoundingClientRect();
1019
1020 return (
1021 ar.left-br.left||
1022 br.width-ar.width
1023 );
1024 });
1025
1026 return pool[0]||link;
1027 }
1028
1029 function applyOverviewPalette(){
1030 if(PAGE_KIND!=="overview"){
1031 return [];
1032 }
1033
1034 var headers=
1035 smallestThemeHeaders()
1036 .map(function(el){
1037 return {
1038 el:el,
1039 theme:
1040 themeFor(
1041 el.textContent
1042 ),
1043 card:
1044 findOverviewCard(
1045 el
1046 )
1047 };
1048 })
1049 .filter(function(row){
1050 return !!row.card;
1051 });
1052
1053 var unique=[];
1054 var seenHeaders=new Set();
1055
1056 headers.forEach(function(row){
1057 var key=
1058 row.theme.name+
1059 "|"+
1060 Math.round(
1061 row.card
1062 .getBoundingClientRect()
1063 .left
1064 )+
1065 "|"+
1066 Math.round(
1067 row.el
1068 .getBoundingClientRect()
1069 .top
1070 );
1071
1072 if(!seenHeaders.has(key)){
1073 seenHeaders.add(key);
1074 unique.push(row);
1075 }
1076 });
1077
1078 unique.forEach(function(row){
1079 var headerRect=
1080 row.el
1081 .getBoundingClientRect();
1082
1083 row.el.style.setProperty(
1084 "background",
1085 row.theme.bg,
1086 "important"
1087 );
1088
1089 row.el.style.setProperty(
1090 "color",
1091 row.theme.text,
1092 "important"
1093 );
1094
1095 row.el.style.setProperty(
1096 "text-align",
1097 "left",
1098 "important"
1099 );
1100
1101 row.el.style.setProperty(
1102 "word-spacing",
1103 "normal",
1104 "important"
1105 );
1106
1107 var later=
1108 unique
1109 .filter(function(other){
1110 return (
1111 other.card===row.card&&
1112 other.el
1113 .getBoundingClientRect()
1114 .top>
1115 headerRect.top+2
1116 );
1117 })
1118 .sort(function(a,b){
1119 return (
1120 a.el
1121 .getBoundingClientRect()
1122 .top-
1123 b.el
1124 .getBoundingClientRect()
1125 .top
1126 );
1127 });
1128
1129 var stopTop=
1130 later.length
1131 ?later[0].el
1132 .getBoundingClientRect()
1133 .top
1134 :Infinity;
1135
1136 Array.from(
1137 row.card.querySelectorAll("a")
1138 ).forEach(function(link){
1139 if(!visible(link))return;
1140
1141 var rect=
1142 link.getBoundingClientRect();
1143
1144 if(
1145 rect.top<=
1146 headerRect.bottom-2||
1147 rect.top>=
1148 stopTop-2
1149 ){
1150 return;
1151 }
1152
1153 var candidates=
1154 rowCandidates(
1155 link,
1156 row.card
1157 );
1158
1159 var target=
1160 chooseOuterRow(
1161 candidates,
1162 link
1163 );
1164
1165 candidates.forEach(function(el){
1166 el.style.setProperty(
1167 "border-left",
1168 "0 solid transparent",
1169 "important"
1170 );
1171 });
1172
1173 target.style.setProperty(
1174 "border-left",
1175 "3px solid "+
1176 row.theme.accent,
1177 "important"
1178 );
1179
1180 target.style.setProperty(
1181 "box-sizing",
1182 "border-box",
1183 "important"
1184 );
1185 });
1186 });
1187
1188 return unique;
1189 }
1190
1191 /* =======================================================
1192 OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW
1193 ======================================================= */
1194
1195 function alignOverviewCards(headers){
1196 if(
1197 PAGE_KIND!=="overview"||
1198 window.innerWidth<=MOBILE_MAX
1199 ){
1200 return;
1201 }
1202
1203 var cards=[];
1204 var seen=new Set();
1205
1206 headers.forEach(function(row){
1207 if(!seen.has(row.card)){
1208 seen.add(row.card);
1209 cards.push(row.card);
1210 }
1211 });
1212
1213 if(cards.length<2){
1214 return;
1215 }
1216
1217 // Group cards by actual top position.
1218 var groups=[];
1219
1220 cards.forEach(function(card){
1221 var top=
1222 card.getBoundingClientRect().top;
1223
1224 var group=null;
1225
1226 for(var i=0;i<groups.length;i++){
1227 if(
1228 Math.abs(
1229 groups[i].top-top
1230 )<=ROW_TOLERANCE
1231 ){
1232 group=groups[i];
1233 break;
1234 }
1235 }
1236
1237 if(!group){
1238 group={
1239 top:top,
1240 cards:[]
1241 };
1242 groups.push(group);
1243 }
1244
1245 group.cards.push(card);
1246 });
1247
1248 groups.forEach(function(group){
1249 if(group.cards.length<2){
1250 return;
1251 }
1252
1253 var firstHeaders=
1254 group.cards.map(function(card){
1255 var candidates=
1256 headers
1257 .filter(function(row){
1258 return row.card===card;
1259 })
1260 .sort(function(a,b){
1261 return (
1262 a.el
1263 .getBoundingClientRect()
1264 .top-
1265 b.el
1266 .getBoundingClientRect()
1267 .top
1268 );
1269 });
1270
1271 return candidates.length
1272 ?candidates[0]
1273 :null;
1274 });
1275
1276 if(
1277 !firstHeaders.some(function(row){
1278 return !row;
1279 })
1280 ){
1281 var targetTop=
1282 Math.max.apply(
1283 Math,
1284 firstHeaders.map(function(row){
1285 return (
1286 row.el
1287 .getBoundingClientRect()
1288 .top-
1289 row.card
1290 .getBoundingClientRect()
1291 .top
1292 );
1293 })
1294 );
1295
1296 firstHeaders.forEach(function(row){
1297 var relativeTop=
1298 row.el
1299 .getBoundingClientRect()
1300 .top-
1301 row.card
1302 .getBoundingClientRect()
1303 .top;
1304
1305 var delta=
1306 targetTop-relativeTop;
1307
1308 if(delta>1){
1309 saveStyle(
1310 row.el,
1311 originalMargin,
1312 "margin-top"
1313 );
1314
1315 var current=
1316 num(
1317 getComputedStyle(
1318 row.el
1319 ).marginTop
1320 );
1321
1322 row.el.style.setProperty(
1323 "margin-top",
1324 (
1325 current+delta
1326 )+"px"
1327 );
1328
1329 row.el.setAttribute(
1330 "data-sn-master-first-row",
1331 "1"
1332 );
1333
1334 managedMargin.add(
1335 row.el
1336 );
1337 }
1338 });
1339 }
1340
1341 var maxHeight=0;
1342
1343 group.cards.forEach(function(card){
1344 maxHeight=
1345 Math.max(
1346 maxHeight,
1347 card
1348 .getBoundingClientRect()
1349 .height
1350 );
1351 });
1352
1353 maxHeight=
1354 Math.ceil(maxHeight);
1355
1356 group.cards.forEach(function(card){
1357 saveStyle(
1358 card,
1359 originalHeight,
1360 "min-height"
1361 );
1362
1363 card.style.setProperty(
1364 "min-height",
1365 maxHeight+"px"
1366 );
1367
1368 card.setAttribute(
1369 "data-sn-master-equal-height",
1370 "1"
1371 );
1372
1373 managedHeight.add(
1374 card
1375 );
1376 });
1377 });
1378 }
1379
1380 /* =======================================================
1381 DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY
1382 ======================================================= */
1383
1384 function equaliseDetailGrids(){
1385 if(
1386 PAGE_KIND!=="detail"||
1387 window.innerWidth<=MOBILE_MAX
1388 ){
1389 return;
1390 }
1391
1392 var selectors=[
1393 ".arsn-grid",
1394 ".arsn-grid-2",
1395 ".arsn-grid-3",
1396 ".dmp-grid",
1397 ".ido-grid",
1398 ".pp-grid"
1399 ];
1400
1401 selectors.forEach(function(selector){
1402 Array.from(
1403 root.querySelectorAll(selector)
1404 ).forEach(function(grid){
1405 var children=
1406 Array.from(
1407 grid.children||[]
1408 ).filter(visible);
1409
1410 if(children.length<2){
1411 return;
1412 }
1413
1414 var groups=[];
1415
1416 children.forEach(function(child){
1417 var top=
1418 child
1419 .getBoundingClientRect()
1420 .top;
1421
1422 var group=null;
1423
1424 for(var i=0;i<groups.length;i++){
1425 if(
1426 Math.abs(
1427 groups[i].top-top
1428 )<=ROW_TOLERANCE
1429 ){
1430 group=groups[i];
1431 break;
1432 }
1433 }
1434
1435 if(!group){
1436 group={
1437 top:top,
1438 items:[]
1439 };
1440 groups.push(group);
1441 }
1442
1443 group.items.push(child);
1444 });
1445
1446 groups.forEach(function(group){
1447 if(group.items.length<2){
1448 return;
1449 }
1450
1451 var maxHeight=0;
1452
1453 group.items.forEach(function(item){
1454 maxHeight=
1455 Math.max(
1456 maxHeight,
1457 item
1458 .getBoundingClientRect()
1459 .height
1460 );
1461 });
1462
1463 maxHeight=
1464 Math.ceil(maxHeight);
1465
1466 group.items.forEach(function(item){
1467 saveStyle(
1468 item,
1469 originalHeight,
1470 "min-height"
1471 );
1472
1473 item.style.setProperty(
1474 "min-height",
1475 maxHeight+"px"
1476 );
1477
1478 item.setAttribute(
1479 "data-sn-master-equal-height",
1480 "1"
1481 );
1482
1483 managedHeight.add(item);
1484 });
1485 });
1486 });
1487 });
1488 }
1489
1490 /* =======================================================
1491 RUN / RESPONSIVE SCHEDULING
1492 ======================================================= */
1493
1494 function run(){
1495 if(running)return;
1496
1497 running=true;
1498
1499 try{
1500 resetRuntime();
1501 applyPlaceholderBadge();
1502 propagateDetailAccents();
1503
1504 var headers=
1505 applyOverviewPalette();
1506
1507 makeThreeLineAreaLabels();
1508 makeFilledRedOrangeCTAsBorderless();
1509
1510 if(
1511 window.innerWidth>
1512 MOBILE_MAX
1513 ){
1514 alignOverviewCards(
1515 headers
1516 );
1517
1518 equaliseDetailGrids();
1519 }
1520 }finally{
1521 running=false;
1522 }
1523 }
1524
1525 function onResize(){
1526 if(resizeTimer){
1527 clearTimeout(
1528 resizeTimer
1529 );
1530 }
1531
1532 resizeTimer=
1533 setTimeout(
1534 function(){
1535 resizeTimer=0;
1536 run();
1537 },
1538 RESIZE_DEBOUNCE
1539 );
1540 }
1541
1542 async function waitForReady(){
1543 if(
1544 document.readyState!=="complete"
1545 ){
1546 await new Promise(function(resolve){
1547 window.addEventListener(
1548 "load",
1549 resolve,
1550 {once:true}
1551 );
1552 });
1553 }
1554
1555 if(
1556 document.fonts&&
1557 document.fonts.ready
1558 ){
1559 try{
1560 await document.fonts.ready;
1561 }catch(error){}
1562 }
1563
1564 var images=
1565 Array.from(
1566 root.querySelectorAll("img")
1567 );
1568
1569 await Promise.all(
1570 images.map(function(img){
1571 if(img.complete){
1572 return Promise.resolve();
1573 }
1574
1575 return new Promise(function(resolve){
1576 var done=function(){
1577 resolve();
1578 };
1579
1580 img.addEventListener(
1581 "load",
1582 done,
1583 {once:true}
1584 );
1585
1586 img.addEventListener(
1587 "error",
1588 done,
1589 {once:true}
1590 );
1591 });
1592 })
1593 );
1594
1595 run();
1596 }
1597
1598 window.addEventListener(
1599 "resize",
1600 onResize,
1601 {passive:true}
1602 );
1603
1604 waitForReady();
1605 })();
1606 </script>
1607
1608 <!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END -->
1609 {{/html}}