Wiki source code of Service Navigator

Version 22.16 by Veronika Kocher on Thursday, 03 Sep 2026 13:04

Hide last authors
Veronika Kocher 18.1 1 {{html}}
2 <div style="max-width:1400px;margin:0 auto;">
Veronika Kocher 15.1 3
Veronika Kocher 18.1 4 <p style="margin:0 0 8px 0;">
5 Artistic and administrative services at the University support many different needs — from research projects and teaching to employment, IT, rooms, procurement, legal questions, international mobility and library services.
6 </p>
Veronika Kocher 15.1 7
Veronika Kocher 18.1 8 <p style="margin:0 0 22px 0;">
9 The <strong>Service Navigator</strong> is organised around what you need to do, not around the university's organisational chart.
10 </p>
Veronika Kocher 15.1 11
Veronika Kocher 21.1 12 <section style="margin:0 0 28px 0;padding:16px 18px;border:1px solid #e3ded6;border-radius:10px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);">
13 <h2 style="font-size:20px;margin:0 0 6px 0;color:#35312d;">Find a service</h2>
14 <p style="margin:0 0 12px 0;color:#6a655e;">
Veronika Kocher 18.1 15 Search by task, topic or question — for example <em>room, invoice, disability, DOI, event, employment, data protection</em> or <em>library</em>.
16 </p>
Veronika Kocher 15.1 17
Veronika Kocher 18.1 18 <form action="https://xwiki.uni-ak.ac.at/bin/view/Main/SolrSearch" method="get" role="search" style="margin:0;">
19 <div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;">
20 <label for="service-navigator-search" style="position:absolute;left:-10000px;">Search services</label>
21 <input
22 id="service-navigator-search"
23 name="text"
24 type="search"
25 placeholder="What do you need help with?"
26 autocomplete="off"
Veronika Kocher 21.1 27 style="flex:1 1 520px;min-width:260px;padding:11px 13px;border:1px solid #cfc8bd;border-radius:6px;background:#fffdf9;font-size:16px;"
Veronika Kocher 18.1 28 />
29 <button type="submit" class="btn btn-primary" style="padding:11px 22px;">Search</button>
30 </div>
31 </form>
32 </section>
Veronika Kocher 15.1 33
Veronika Kocher 21.1 34 <h2 style="font-size:24px;margin:0 0 16px 0;color:#35312d;">Find services by what you need to do</h2>
Veronika Kocher 15.1 35
Veronika Kocher 18.1 36 <div style="
37 display:grid;
38 grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
39 gap:18px;
40 align-items:stretch;
Veronika Kocher 17.1 41 ">
Veronika Kocher 15.1 42
Veronika Kocher 19.1 43 <!-- 1. PEOPLE, EQUALITY, HEALTH & WORK -->
Veronika Kocher 21.1 44 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #f0aa00;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 45 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 46 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">PEOPLE &amp; WORK</div>
47 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">People, Equality, Health &amp; Work</h3>
48 <p style="color:#6a655e;margin:0 0 14px 0;">Employment, equality, diversity, disability, accessibility and health.</p>
Veronika Kocher 15.1 49
Veronika Kocher 18.1 50 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
51 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 52 <li>ask about employment, working conditions or labour law</li>
53 <li>get support concerning discrimination, equality or diversity</li>
54 <li>address disability, accessibility or health at work</li>
Veronika Kocher 18.1 55 </ul>
56
Veronika Kocher 21.1 57 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 58 HR · staff development · equal treatment · diversity · disability · accessibility · health · labour law
Veronika Kocher 18.1 59 </div>
Veronika Kocher 17.1 60 </div>
Veronika Kocher 18.1 61 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 62 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore People &amp; Work</span>
Veronika Kocher 18.1 63 </div>
64 </section>
Veronika Kocher 15.1 65
Veronika Kocher 19.1 66 <!-- 2. IT & DIGITAL SERVICES -->
Veronika Kocher 21.1 67 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #38b76a;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 68 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 69 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">IT &amp; DIGITAL</div>
70 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">IT &amp; Digital Services</h3>
71 <p style="color:#6a655e;margin:0 0 14px 0;">Accounts, systems, software, digital infrastructure and IT support.</p>
Veronika Kocher 15.1 72
Veronika Kocher 18.1 73 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
74 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 75 <li>access an account, system or digital service</li>
76 <li>solve an IT problem</li>
77 <li>plan or coordinate a digital or IT project</li>
Veronika Kocher 18.1 78 </ul>
Veronika Kocher 15.1 79
Veronika Kocher 21.1 80 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 81 Accounts · IT support · software · digital tools · infrastructure · IT project coordination
Veronika Kocher 18.1 82 </div>
Veronika Kocher 17.1 83 </div>
Veronika Kocher 18.1 84 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 85 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore IT &amp; Digital Services</span>
Veronika Kocher 18.1 86 </div>
87 </section>
Veronika Kocher 15.1 88
Veronika Kocher 19.1 89 <!-- 3. ROOMS, BUILDINGS & CAMPUS -->
Veronika Kocher 21.1 90 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #38b76a;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 91 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 92 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">CAMPUS</div>
93 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Rooms, Buildings &amp; Campus</h3>
94 <p style="color:#6a655e;margin:0 0 14px 0;">Rooms, buildings, facilities, campus use and operational support.</p>
Veronika Kocher 15.1 95
Veronika Kocher 18.1 96 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
97 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 98 <li>book or use a room</li>
99 <li>report a building, equipment or safety issue</li>
100 <li>find information about campus facilities or house rules</li>
Veronika Kocher 18.1 101 </ul>
Veronika Kocher 15.1 102
Veronika Kocher 21.1 103 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 104 Facility management · estates · room coordination · building services · safety · house rules · campus operations
Veronika Kocher 18.1 105 </div>
Veronika Kocher 17.1 106 </div>
Veronika Kocher 18.1 107 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 108 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore Rooms &amp; Campus</span>
Veronika Kocher 18.1 109 </div>
110 </section>
Veronika Kocher 15.1 111
Veronika Kocher 19.1 112 <!-- 4. ART & RESEARCH SERVICES -->
Veronika Kocher 21.1 113 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #21b6d7;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 114 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 115 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">ART &amp; RESEARCH</div>
116 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Art &amp; Research Services</h3>
Veronika Kocher 22.12 117 <p style="color:#6a655e;margin:0 0 8px 0;">Cross-unit guidance for planning, managing, publishing, sharing and preserving artistic and research projects.</p>
118 <!-- ARSN_ROOT_SCOPE_ROUTING_V1 -->
119 <div style="font-size:12px;color:#506168;line-height:1.45;margin:0 0 14px 0;padding:7px 9px;background:#eef7f9;border-radius:5px;"><strong>Central project &amp; funding hub:</strong> Support Kunst und Forschung · specialist responsibilities remain with the relevant service units.</div>
Veronika Kocher 15.1 120
Veronika Kocher 18.1 121 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
122 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 123 <li>develop or plan an artistic or research project</li>
124 <li>manage research data, documentation or collaboration</li>
125 <li>publish, cite, share or preserve outputs</li>
Veronika Kocher 18.1 126 </ul>
Veronika Kocher 15.1 127
Veronika Kocher 21.1 128 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 129 Research projects · research data management · rights &amp; ethics · repositories · publication · preservation
Veronika Kocher 18.1 130 </div>
Veronika Kocher 17.1 131 </div>
Veronika Kocher 18.1 132 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 19.1 133 <a href="https://xwiki.uni-ak.ac.at/bin/view/Service%20Navigator/Art%20%26%20Research%20Services%20Navigator/" class="btn btn-primary btn-block">Explore Art &amp; Research Services</a>
Veronika Kocher 18.1 134 </div>
135 </section>
Veronika Kocher 15.1 136
Veronika Kocher 19.1 137 <!-- 5. STUDY, TEACHING & CURRICULUM -->
Veronika Kocher 21.1 138 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #21b6d7;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 139 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 140 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">STUDY &amp; TEACHING</div>
141 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Study, Teaching &amp; Curriculum</h3>
142 <p style="color:#6a655e;margin:0 0 14px 0;">Support for studying, teaching, curricula and the learning environment.</p>
Veronika Kocher 15.1 143
Veronika Kocher 18.1 144 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
145 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 146 <li>clarify a study-related question</li>
147 <li>develop or change teaching or curricula</li>
148 <li>find support for final projects or accessibility in study</li>
Veronika Kocher 18.1 149 </ul>
Veronika Kocher 15.1 150
Veronika Kocher 21.1 151 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 152 Student affairs · teaching quality · curriculum development · final projects · student workspace
Veronika Kocher 18.1 153 </div>
Veronika Kocher 17.1 154 </div>
Veronika Kocher 18.1 155 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 156 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore Study &amp; Teaching</span>
Veronika Kocher 18.1 157 </div>
158 </section>
Veronika Kocher 15.1 159
Veronika Kocher 20.1 160 <!-- 6. RESEARCH & DISCOVERY RESOURCES -->
Veronika Kocher 21.1 161 <section style="display:flex;flex-direction:column;min-height:340px;border:1px solid #e3ded6;border-left:6px solid #21b6d7;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 20.1 162 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 163 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">FIND · SEARCH · DISCOVER</div>
164 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Research &amp; Discovery Resources</h3>
165 <p style="color:#6a655e;margin:0 0 14px 0;">Find literature, databases, archives, collections, repositories and specialist research resources across the University.</p>
Veronika Kocher 20.1 166
167 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
168 <ul style="margin:0 0 14px 18px;padding:0;">
169 <li>find literature, media, databases or digital resources</li>
170 <li>research archival, artistic or institutional collections</li>
171 <li>discover repositories, specialist archives and research databases</li>
172 </ul>
173
Veronika Kocher 21.1 174 <div style="font-size:12px;color:#6a655e;line-height:1.5;">
Veronika Kocher 20.1 175 University Library &amp; supA · licensed databases · University Archive &amp; Art Collection · online collection databases · Oskar Kokoschka Centre · Viktor J. Papanek Foundation · Venedig Biennale Archiv Austria · Weibel Institute &amp; Peter Weibel Archive · Ursula Blickle Video Archive · Angewandte Repository
176 </div>
177 </div>
178 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 179 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore Research &amp; Discovery</span>
Veronika Kocher 20.1 180 </div>
181 </section>
182
183 <!-- 7. PURCHASING, FINANCE & LOGISTICS -->
Veronika Kocher 21.1 184 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #38b76a;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 185 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 186 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">PURCHASE &amp; MOVE</div>
187 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Purchasing, Finance &amp; Logistics</h3>
188 <p style="color:#6a655e;margin:0 0 14px 0;">Buy, pay, budget, send, transport and move things.</p>
Veronika Kocher 15.1 189
Veronika Kocher 18.1 190 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
191 <ul style="margin:0 0 14px 18px;padding:0;">
192 <li>purchase materials or services</li>
193 <li>clarify an invoice, budget or financial process</li>
194 <li>send, transport or move items</li>
195 </ul>
Veronika Kocher 15.1 196
Veronika Kocher 21.1 197 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 18.1 198 Procurement · controlling · accounting · resource planning · mail &amp; logistics · transport · relocations
199 </div>
Veronika Kocher 17.1 200 </div>
Veronika Kocher 18.1 201 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 202 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore Finance &amp; Logistics</span>
Veronika Kocher 18.1 203 </div>
204 </section>
Veronika Kocher 15.1 205
Veronika Kocher 20.1 206 <!-- 8. LEGAL, DATA PROTECTION & GOVERNANCE -->
Veronika Kocher 21.1 207 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #f0aa00;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 208 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 209 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">RIGHTS &amp; RULES</div>
210 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Legal, Data Protection &amp; Governance</h3>
211 <p style="color:#6a655e;margin:0 0 14px 0;">Legal questions, privacy, information rights and institutional rules.</p>
Veronika Kocher 15.1 212
Veronika Kocher 18.1 213 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
214 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 215 <li>clarify a legal or contractual question</li>
216 <li>deal with personal data or privacy</li>
217 <li>understand an institutional rule or information-access requirement</li>
Veronika Kocher 18.1 218 </ul>
Veronika Kocher 15.1 219
Veronika Kocher 21.1 220 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 221 Legal affairs · data protection · freedom of information · governance · institutional rules
Veronika Kocher 18.1 222 </div>
Veronika Kocher 17.1 223 </div>
Veronika Kocher 18.1 224 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 225 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore Legal &amp; Governance</span>
Veronika Kocher 18.1 226 </div>
227 </section>
Veronika Kocher 15.1 228
Veronika Kocher 20.1 229 <!-- 9. COMMUNICATION, MEDIA & EVENTS -->
Veronika Kocher 21.1 230 <section style="display:flex;flex-direction:column;min-height:320px;border:1px solid #e3ded6;border-left:6px solid #e94b13;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 18.1 231 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 232 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">COMMUNICATE &amp; ORGANISE</div>
233 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">Communication, Media &amp; Events</h3>
234 <p style="color:#6a655e;margin:0 0 14px 0;">Communicate, publish, print, promote and organise events.</p>
Veronika Kocher 15.1 235
Veronika Kocher 18.1 236 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
237 <ul style="margin:0 0 14px 18px;padding:0;">
Veronika Kocher 19.1 238 <li>communicate or publicise something</li>
239 <li>produce a publication, flyer or printed material</li>
240 <li>organise or support an event</li>
Veronika Kocher 18.1 241 </ul>
Veronika Kocher 15.1 242
Veronika Kocher 21.1 243 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 244 Press &amp; communications · publications · print materials · event management · Open House · festival
Veronika Kocher 18.1 245 </div>
246 </div>
247 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 248 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore Communication &amp; Events</span>
Veronika Kocher 18.1 249 </div>
250 </section>
Veronika Kocher 15.1 251
Veronika Kocher 19.1 252 <!-- 10. INTERNATIONAL OFFICE -->
Veronika Kocher 21.1 253 <section style="display:flex;flex-direction:column;min-height:300px;border:1px solid #e3ded6;border-left:6px solid #21b6d7;border-radius:12px;background:#fcfbf8;box-shadow:0 1px 2px rgba(0,0,0,.035);overflow:hidden;">
Veronika Kocher 19.1 254 <div style="padding:18px 18px 14px 18px;flex:1;">
Veronika Kocher 21.1 255 <div style="display:inline-block;font-size:12px;font-weight:700;letter-spacing:.065em;color:#4f4a44;margin-bottom:8px;padding:4px 7px;background:#f3efe8;border-radius:4px;">GO INTERNATIONAL</div>
256 <h3 style="font-size:21px;line-height:1.25;margin:0 0 8px 0;color:#252321;">International Office</h3>
257 <p style="color:#6a655e;margin:0 0 14px 0;">International mobility, exchange and international support.</p>
Veronika Kocher 19.1 258
259 <div style="font-weight:700;margin-bottom:6px;">I need to…</div>
260 <ul style="margin:0 0 14px 18px;padding:0;">
261 <li>plan an international stay or exchange</li>
262 <li>ask about mobility opportunities</li>
263 <li>find support for an international context</li>
264 </ul>
265
Veronika Kocher 21.1 266 <div style="font-size:12px;color:#6a655e;line-height:1.45;">
Veronika Kocher 19.1 267 Mobility · exchange · international cooperation · international support
268 </div>
269 </div>
270 <div style="padding:0 18px 18px 18px;">
Veronika Kocher 21.1 271 <span class="btn btn-default btn-block disabled" style="background:#f4f0e9;border-color:#d8d1c7;color:#6b655d;" aria-disabled="true">Explore International Office</span>
Veronika Kocher 19.1 272 </div>
273 </section>
274
275
Veronika Kocher 18.1 276 </div>
277
Veronika Kocher 22.1 278 <aside style="margin-top:26px;padding:14px 16px;border:1px solid #cfe8ef;border-left:4px solid #21b6d7;background:#eaf6f9;border-radius:6px;">
Veronika Kocher 18.1 279 <strong>Not sure where to start?</strong>
280 <div style="margin-top:4px;">
281 Use the search at the top of the page or choose the card that best matches what you are trying to do. A service may deliberately appear in more than one area when this makes it easier to find.
Veronika Kocher 17.1 282 </div>
Veronika Kocher 18.1 283 </aside>
Veronika Kocher 15.1 284
Veronika Kocher 17.1 285 </div>
Veronika Kocher 15.1 286 {{/html}}
Veronika Kocher 22.13 287
Veronika Kocher 22.16 288 {{html clean="false"}}
289 <!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_START -->
Veronika Kocher 22.15 290
Veronika Kocher 22.16 291 <style data-sn-service-navigator-master="1">
292 /* =========================================================
293 MASTER TYPOGRAPHY
294 ========================================================= */
Veronika Kocher 22.15 295 #xwikicontent h1,
296 #xwikicontent h2,
297 #xwikicontent h3,
298 #xwikicontent h4,
299 #xwikicontent h5,
300 #xwikicontent h6,
301 #xwikicontent .box-title,
302 #xwikicontent [role="heading"],
303 #xwikicontent h1 a,
304 #xwikicontent h2 a,
305 #xwikicontent h3 a,
306 #xwikicontent h4 a,
307 #xwikicontent h5 a,
308 #xwikicontent h6 a,
309 #xwikicontent .box-title a,
310 #xwikicontent [role="heading"] a{
311 text-align:left!important;
312 text-justify:auto!important;
313 word-spacing:normal!important;
314 }
315
Veronika Kocher 22.16 316 /* =========================================================
317 COMING SOON / IN VORBEREITUNG
318 ========================================================= */
319 .sn-coming-soon-badge{
320 display:inline-block;
321 vertical-align:middle;
322 margin-left:10px;
323 padding:4px 8px;
324 border-radius:14px;
325 border:1px solid #efd9cc;
326 background:#fff4ee;
327 color:#8a4d36;
328 font-size:11px;
329 font-weight:700;
330 letter-spacing:.055em;
331 line-height:1.2;
332 white-space:nowrap;
333 }
334
335 /* =========================================================
336 NATIVE / DETAIL CALLOUT GEOMETRY
337 Preserve existing backgrounds.
338 ========================================================= */
339 #xwikicontent .arsn-info,
340 #xwikicontent .dmp-info,
341 #xwikicontent .ido-info,
342 #xwikicontent .pp-info,
343 #xwikicontent .infomessage{
Veronika Kocher 22.15 344 box-sizing:border-box!important;
Veronika Kocher 22.16 345 border-left:4px solid #21b6d7!important;
346 border-radius:8px;
Veronika Kocher 22.15 347 text-align:left!important;
348 word-spacing:normal!important;
349 }
350
Veronika Kocher 22.16 351 #xwikicontent .arsn-warn,
352 #xwikicontent .dmp-warn,
353 #xwikicontent .ido-warn,
354 #xwikicontent .pp-warn,
355 #xwikicontent .warn,
356 #xwikicontent .warning,
357 #xwikicontent .warningmessage,
Veronika Kocher 22.15 358 #xwikicontent .errormessage{
Veronika Kocher 22.16 359 box-sizing:border-box!important;
360 border-left:4px solid #e94b13!important;
361 border-radius:8px;
362 text-align:left!important;
363 word-spacing:normal!important;
Veronika Kocher 22.15 364 }
365
Veronika Kocher 22.16 366 [data-sn-master-equal-height],
367 [data-sn-master-first-row]{
Veronika Kocher 22.14 368 box-sizing:border-box;
Veronika Kocher 22.13 369 }
370 </style>
Veronika Kocher 22.15 371
Veronika Kocher 22.16 372 <script data-sn-service-navigator-master="1">
Veronika Kocher 22.13 373 (function(){
374 "use strict";
375
Veronika Kocher 22.16 376 var PAGE_KIND="overview";
377 var PLACEHOLDER=false;
378 var PLACEHOLDER_LABEL="COMING SOON";
379
Veronika Kocher 22.13 380 var MOBILE_MAX=767;
Veronika Kocher 22.14 381 var ROW_TOLERANCE=6;
Veronika Kocher 22.15 382 var RESIZE_DEBOUNCE=220;
Veronika Kocher 22.13 383
384 var root=
385 document.getElementById("xwikicontent")||
386 document.querySelector(".xwiki-rendering-content")||
387 document.querySelector("main")||
388 document.body;
389
390 if(!root)return;
391
Veronika Kocher 22.16 392 var managedHeight=new Set();
393 var managedMargin=new Set();
394 var originalHeight=new WeakMap();
395 var originalMargin=new WeakMap();
Veronika Kocher 22.15 396
397 var resizeTimer=0;
Veronika Kocher 22.16 398 var running=false;
Veronika Kocher 22.15 399
Veronika Kocher 22.16 400 var THEMES=[
401 {
402 name:"BLUE",
403 accent:"#21b6d7",
404 bg:"#eaf7fb",
405 text:"#315d68",
406 labels:[
407 "HIER STARTEN",
408 "ENTSCHEIDEN",
409 "ÜBERPRÜFEN & ANPASSEN",
410 "START HERE",
411 "DECIDE",
412 "REVIEW & ADAPT"
413 ]
414 },
415 {
416 name:"RED",
417 accent:"#e94b13",
418 bg:"#fff1ec",
419 text:"#8a4d36",
420 labels:[
421 "PLANEN & ORGANISIEREN",
422 "ORGANISIEREN & DOKUMENTIEREN",
423 "PUBLIZIEREN & PRÄSENTIEREN",
424 "PLAN & ORGANISE",
425 "PLAN & ORGANIZE",
426 "ORGANISE & DOCUMENT",
427 "ORGANIZE & DOCUMENT",
428 "PUBLISH & PRESENT"
429 ]
430 },
431 {
432 name:"YELLOW",
433 accent:"#f0aa00",
434 bg:"#fff8e7",
435 text:"#785b17",
436 labels:[
437 "SCHÜTZEN & KLÄREN",
438 "STANDARDISIEREN & IDENTIFIZIEREN",
439 "ÖFFNEN, NACHNUTZEN & AUFFINDBAR MACHEN",
440 "PROTECT & CLARIFY",
441 "STANDARDISE & IDENTIFY",
442 "STANDARDIZE & IDENTIFY",
443 "OPEN, REUSE & MAKE FINDABLE"
444 ]
445 },
446 {
447 name:"GREEN",
448 accent:"#38b76a",
449 bg:"#edf9f1",
450 text:"#3f7451",
451 labels:[
452 "INFRASTRUKTUR EINRICHTEN",
453 "INFRASTRUKTUR & ZUSAMMENARBEIT EINRICHTEN",
454 "SPEICHERN & ZUGRIFF STEUERN",
455 "REPOSITORIUM, ERHALTEN & ÜBERGEBEN",
456 "SET UP INFRASTRUCTURE",
457 "SET UP INFRASTRUCTURE & COLLABORATION",
458 "STORE & CONTROL ACCESS",
459 "REPOSITORY, PRESERVE & HAND OVER"
460 ]
Veronika Kocher 22.14 461 }
Veronika Kocher 22.16 462 ];
Veronika Kocher 22.14 463
Veronika Kocher 22.16 464 function num(value){
465 var n=parseFloat(value);
466 return Number.isFinite(n)?n:0;
Veronika Kocher 22.13 467 }
468
Veronika Kocher 22.16 469 function norm(value){
470 return String(value||"")
Veronika Kocher 22.15 471 .replace(/\s+/g," ")
472 .trim()
473 .toUpperCase();
474 }
475
Veronika Kocher 22.16 476 function visible(el){
477 if(!el||el.nodeType!==1)return false;
Veronika Kocher 22.13 478
Veronika Kocher 22.16 479 var style=getComputedStyle(el);
480 var rect=el.getBoundingClientRect();
Veronika Kocher 22.15 481
482 return (
Veronika Kocher 22.16 483 style.display!=="none"&&
484 style.visibility!=="hidden"&&
485 rect.width>20&&
486 rect.height>4
Veronika Kocher 22.15 487 );
Veronika Kocher 22.13 488 }
489
Veronika Kocher 22.16 490 function saveStyle(el,map,property){
Veronika Kocher 22.14 491 if(map.has(el))return;
492
493 map.set(el,{
Veronika Kocher 22.16 494 value:el.style.getPropertyValue(property),
495 priority:el.style.getPropertyPriority(property)
Veronika Kocher 22.14 496 });
497 }
498
Veronika Kocher 22.16 499 function restoreStyle(el,map,property){
Veronika Kocher 22.14 500 var original=map.get(el);
501
502 if(original&&original.value){
503 el.style.setProperty(
504 property,
505 original.value,
506 original.priority||""
507 );
508 }else{
Veronika Kocher 22.16 509 el.style.removeProperty(property);
Veronika Kocher 22.14 510 }
511 }
512
Veronika Kocher 22.15 513 function resetRuntime(){
Veronika Kocher 22.16 514 managedHeight.forEach(function(el){
515 restoreStyle(
Veronika Kocher 22.14 516 el,
Veronika Kocher 22.16 517 originalHeight,
Veronika Kocher 22.14 518 "min-height"
519 );
520 el.removeAttribute(
Veronika Kocher 22.16 521 "data-sn-master-equal-height"
Veronika Kocher 22.14 522 );
523 });
524
Veronika Kocher 22.16 525 managedMargin.forEach(function(el){
526 restoreStyle(
Veronika Kocher 22.14 527 el,
Veronika Kocher 22.16 528 originalMargin,
Veronika Kocher 22.14 529 "margin-top"
530 );
531 el.removeAttribute(
Veronika Kocher 22.16 532 "data-sn-master-first-row"
Veronika Kocher 22.14 533 );
534 });
535
Veronika Kocher 22.16 536 managedHeight.clear();
537 managedMargin.clear();
538 }
Veronika Kocher 22.15 539
Veronika Kocher 22.16 540 function themeFor(text){
541 var value=norm(text);
Veronika Kocher 22.15 542
Veronika Kocher 22.16 543 for(var i=0;i<THEMES.length;i++){
544 for(var j=0;j<THEMES[i].labels.length;j++){
545 var label=THEMES[i].labels[j];
546
547 if(
548 value===label||
549 value.indexOf(label+" ")===0||
550 value.indexOf(label+" -")===0||
551 value.indexOf(label+" ·")===0
552 ){
553 return THEMES[i];
554 }
555 }
556 }
557
558 return null;
Veronika Kocher 22.14 559 }
560
Veronika Kocher 22.16 561 /* =======================================================
562 PLACEHOLDER BADGE
563 ======================================================= */
Veronika Kocher 22.15 564
Veronika Kocher 22.16 565 function applyPlaceholderBadge(){
566 if(!PLACEHOLDER)return;
Veronika Kocher 22.15 567
568 if(
Veronika Kocher 22.16 569 document.querySelector(
570 ".sn-coming-soon-badge"
571 )
Veronika Kocher 22.15 572 ){
Veronika Kocher 22.16 573 return;
Veronika Kocher 22.15 574 }
575
Veronika Kocher 22.16 576 var title=
577 document.querySelector(
578 "#document-title"
579 )||
580 document.querySelector(
581 "h1"
582 );
Veronika Kocher 22.15 583
Veronika Kocher 22.16 584 if(!title)return;
Veronika Kocher 22.15 585
Veronika Kocher 22.16 586 var badge=
587 document.createElement(
588 "span"
589 );
590
591 badge.className=
592 "sn-coming-soon-badge";
593
594 badge.textContent=
595 PLACEHOLDER_LABEL;
596
597 badge.setAttribute(
598 "aria-label",
599 PLACEHOLDER_LABEL
Veronika Kocher 22.15 600 );
601
Veronika Kocher 22.16 602 title.appendChild(
603 badge
604 );
605 }
Veronika Kocher 22.15 606
Veronika Kocher 22.16 607 /* =======================================================
608 DETAIL PAGE OWN-ACCENT PROPAGATION
609 ======================================================= */
Veronika Kocher 22.15 610
Veronika Kocher 22.16 611 function parseRGB(value){
612 var match=String(value||"").match(
613 /rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/i
Veronika Kocher 22.15 614 );
Veronika Kocher 22.16 615
616 if(!match)return null;
617
618 return [
619 Number(match[1]),
620 Number(match[2]),
621 Number(match[3])
622 ];
Veronika Kocher 22.15 623 }
624
Veronika Kocher 22.16 625 function distance(a,b){
626 return Math.sqrt(
627 Math.pow(a[0]-b[0],2)+
628 Math.pow(a[1]-b[1],2)+
629 Math.pow(a[2]-b[2],2)
630 );
631 }
Veronika Kocher 22.13 632
Veronika Kocher 22.16 633 function paletteMatch(cssColor){
634 var rgb=parseRGB(cssColor);
Veronika Kocher 22.14 635
Veronika Kocher 22.16 636 if(!rgb)return null;
Veronika Kocher 22.14 637
Veronika Kocher 22.16 638 var palette=[
639 {hex:"#21b6d7",rgb:[33,182,215]},
640 {hex:"#e94b13",rgb:[233,75,19]},
641 {hex:"#f0aa00",rgb:[240,170,0]},
642 {hex:"#38b76a",rgb:[56,183,106]}
643 ];
Veronika Kocher 22.13 644
Veronika Kocher 22.14 645 var best=null;
Veronika Kocher 22.16 646 var bestDistance=Infinity;
Veronika Kocher 22.13 647
Veronika Kocher 22.16 648 palette.forEach(function(item){
649 var d=distance(rgb,item.rgb);
Veronika Kocher 22.13 650
Veronika Kocher 22.16 651 if(d<bestDistance){
652 best=item;
653 bestDistance=d;
654 }
655 });
Veronika Kocher 22.14 656
Veronika Kocher 22.16 657 return bestDistance<=30
658 ?best
659 :null;
660 }
Veronika Kocher 22.13 661
Veronika Kocher 22.16 662 function propagateDetailAccents(){
663 if(PAGE_KIND!=="detail")return;
664
665 Array.from(
666 root.querySelectorAll(
667 ".arsn-call,.dmp-call,.ido-call,.pp-call,"+
668 ".arsn-source,.dmp-source,.ido-source,.pp-source"
669 )
670 ).forEach(function(el){
671 if(!visible(el))return;
672
673 var style=getComputedStyle(el);
674
Veronika Kocher 22.14 675 if(
Veronika Kocher 22.16 676 num(style.borderTopWidth)>=2
Veronika Kocher 22.14 677 ){
Veronika Kocher 22.16 678 var match=
679 paletteMatch(
680 style.borderTopColor
Veronika Kocher 22.14 681 );
682
Veronika Kocher 22.16 683 if(match){
684 el.style.setProperty(
685 "border-left",
686 "4px solid "+match.hex,
687 "important"
Veronika Kocher 22.14 688 );
Veronika Kocher 22.13 689 }
690 }
Veronika Kocher 22.16 691 });
Veronika Kocher 22.13 692
Veronika Kocher 22.16 693 // Warning families: explicit safety override.
694 Array.from(
695 root.querySelectorAll(
696 ".arsn-warn,.dmp-warn,.ido-warn,.pp-warn,"+
697 ".warn,.warning,.warningmessage,.errormessage"
698 )
699 ).forEach(function(el){
700 if(!visible(el))return;
Veronika Kocher 22.13 701
Veronika Kocher 22.16 702 el.style.setProperty(
703 "border-left",
704 "4px solid #e94b13",
705 "important"
706 );
707 });
Veronika Kocher 22.13 708
Veronika Kocher 22.16 709 // Info families: explicit orientation override.
710 Array.from(
711 root.querySelectorAll(
712 ".arsn-info,.dmp-info,.ido-info,.pp-info,.infomessage"
713 )
714 ).forEach(function(el){
715 if(!visible(el))return;
Veronika Kocher 22.14 716
Veronika Kocher 22.16 717 el.style.setProperty(
718 "border-left",
719 "4px solid #21b6d7",
720 "important"
721 );
722 });
723 }
Veronika Kocher 22.14 724
Veronika Kocher 22.16 725 /* =======================================================
726 OVERVIEW SEMANTIC THEME PALETTE
727 ======================================================= */
Veronika Kocher 22.14 728
Veronika Kocher 22.16 729 function smallestThemeHeaders(){
730 return Array.from(
731 root.querySelectorAll(
732 "div,span,p,strong,h3,h4,h5,h6"
733 )
734 ).filter(function(el){
735 if(!visible(el))return false;
736 if(!themeFor(el.textContent))return false;
Veronika Kocher 22.14 737
Veronika Kocher 22.16 738 return !Array.from(
739 el.children||[]
740 ).some(function(child){
741 return !!themeFor(
742 child.textContent
743 );
Veronika Kocher 22.14 744 });
Veronika Kocher 22.16 745 });
Veronika Kocher 22.13 746 }
747
Veronika Kocher 22.16 748 function findOverviewCard(header){
749 var node=header.parentElement;
750 var candidates=[];
Veronika Kocher 22.14 751
Veronika Kocher 22.16 752 while(node&&node!==root){
753 var rect=node.getBoundingClientRect();
754 var style=getComputedStyle(node);
Veronika Kocher 22.14 755
Veronika Kocher 22.16 756 var border=
757 num(style.borderTopWidth)+
758 num(style.borderRightWidth)+
759 num(style.borderBottomWidth)+
760 num(style.borderLeftWidth);
Veronika Kocher 22.14 761
Veronika Kocher 22.16 762 if(
763 rect.width>=220&&
764 rect.width<=800&&
765 rect.height>=120&&
766 border>=1
767 ){
768 candidates.push(node);
769 }
Veronika Kocher 22.14 770
Veronika Kocher 22.16 771 node=node.parentElement;
772 }
Veronika Kocher 22.14 773
Veronika Kocher 22.16 774 if(!candidates.length)return null;
Veronika Kocher 22.14 775
Veronika Kocher 22.16 776 candidates.sort(function(a,b){
777 return (
778 b.getBoundingClientRect().height-
779 a.getBoundingClientRect().height
Veronika Kocher 22.15 780 );
Veronika Kocher 22.16 781 });
Veronika Kocher 22.14 782
Veronika Kocher 22.16 783 return candidates[0];
Veronika Kocher 22.14 784 }
785
Veronika Kocher 22.16 786 function rowCandidates(link,card){
787 var result=[];
Veronika Kocher 22.15 788 var cardRect=
789 card.getBoundingClientRect();
Veronika Kocher 22.14 790
Veronika Kocher 22.16 791 var node=link;
Veronika Kocher 22.14 792
Veronika Kocher 22.16 793 while(node&&node!==card){
794 if(visible(node)){
795 var rect=
796 node.getBoundingClientRect();
Veronika Kocher 22.14 797
Veronika Kocher 22.16 798 if(
799 rect.height<=105&&
800 rect.width>=
801 cardRect.width*.50&&
802 rect.width<=
803 cardRect.width*1.03
804 ){
805 result.push(node);
806 }
807 }
Veronika Kocher 22.14 808
Veronika Kocher 22.16 809 node=node.parentElement;
810 }
811
812 return result;
813 }
814
815 function chooseOuterRow(
816 candidates,
817 link
818 ){
819 if(!candidates.length){
820 return link;
821 }
822
823 var bordered=
824 candidates.filter(function(el){
Veronika Kocher 22.15 825 return (
Veronika Kocher 22.16 826 num(
827 getComputedStyle(el)
828 .borderLeftWidth
829 )>=1
Veronika Kocher 22.15 830 );
831 });
Veronika Kocher 22.14 832
Veronika Kocher 22.16 833 var pool=
834 bordered.length
835 ?bordered
836 :candidates;
Veronika Kocher 22.14 837
Veronika Kocher 22.16 838 pool.sort(function(a,b){
839 var ar=
840 a.getBoundingClientRect();
Veronika Kocher 22.14 841
Veronika Kocher 22.16 842 var br=
843 b.getBoundingClientRect();
Veronika Kocher 22.14 844
Veronika Kocher 22.16 845 return (
846 ar.left-br.left||
847 br.width-ar.width
848 );
849 });
Veronika Kocher 22.14 850
Veronika Kocher 22.16 851 return pool[0]||link;
852 }
Veronika Kocher 22.14 853
Veronika Kocher 22.16 854 function applyOverviewPalette(){
855 if(PAGE_KIND!=="overview"){
856 return [];
Veronika Kocher 22.15 857 }
Veronika Kocher 22.14 858
Veronika Kocher 22.16 859 var headers=
860 smallestThemeHeaders()
861 .map(function(el){
862 return {
863 el:el,
864 theme:
865 themeFor(
866 el.textContent
867 ),
868 card:
869 findOverviewCard(
870 el
871 )
872 };
Veronika Kocher 22.15 873 })
Veronika Kocher 22.16 874 .filter(function(row){
875 return !!row.card;
876 });
Veronika Kocher 22.14 877
Veronika Kocher 22.16 878 var unique=[];
879 var seenHeaders=new Set();
Veronika Kocher 22.14 880
Veronika Kocher 22.16 881 headers.forEach(function(row){
882 var key=
883 row.theme.name+
884 "|"+
885 Math.round(
886 row.card
887 .getBoundingClientRect()
888 .left
889 )+
890 "|"+
891 Math.round(
892 row.el
893 .getBoundingClientRect()
894 .top
895 );
Veronika Kocher 22.14 896
Veronika Kocher 22.16 897 if(!seenHeaders.has(key)){
898 seenHeaders.add(key);
899 unique.push(row);
900 }
901 });
Veronika Kocher 22.14 902
Veronika Kocher 22.16 903 unique.forEach(function(row){
904 var headerRect=
905 row.el
906 .getBoundingClientRect();
Veronika Kocher 22.14 907
Veronika Kocher 22.16 908 row.el.style.setProperty(
909 "background",
910 row.theme.bg,
911 "important"
Veronika Kocher 22.15 912 );
913
Veronika Kocher 22.16 914 row.el.style.setProperty(
915 "color",
916 row.theme.text,
917 "important"
Veronika Kocher 22.15 918 );
919
Veronika Kocher 22.16 920 row.el.style.setProperty(
921 "text-align",
922 "left",
923 "important"
Veronika Kocher 22.15 924 );
Veronika Kocher 22.14 925
Veronika Kocher 22.16 926 row.el.style.setProperty(
927 "word-spacing",
928 "normal",
929 "important"
930 );
Veronika Kocher 22.15 931
Veronika Kocher 22.16 932 var later=
933 unique
934 .filter(function(other){
935 return (
936 other.card===row.card&&
937 other.el
938 .getBoundingClientRect()
939 .top>
940 headerRect.top+2
941 );
942 })
943 .sort(function(a,b){
944 return (
945 a.el
946 .getBoundingClientRect()
947 .top-
948 b.el
949 .getBoundingClientRect()
950 .top
951 );
952 });
Veronika Kocher 22.15 953
Veronika Kocher 22.16 954 var stopTop=
955 later.length
956 ?later[0].el
957 .getBoundingClientRect()
958 .top
959 :Infinity;
Veronika Kocher 22.15 960
961 Array.from(
Veronika Kocher 22.16 962 row.card.querySelectorAll("a")
963 ).forEach(function(link){
964 if(!visible(link))return;
Veronika Kocher 22.15 965
Veronika Kocher 22.16 966 var rect=
967 link.getBoundingClientRect();
Veronika Kocher 22.15 968
Veronika Kocher 22.16 969 if(
970 rect.top<=
971 headerRect.bottom-2||
972 rect.top>=
973 stopTop-2
974 ){
975 return;
976 }
Veronika Kocher 22.15 977
Veronika Kocher 22.16 978 var candidates=
979 rowCandidates(
980 link,
981 row.card
982 );
983
984 var target=
985 chooseOuterRow(
986 candidates,
987 link
988 );
989
990 candidates.forEach(function(el){
991 el.style.setProperty(
992 "border-left",
993 "0 solid transparent",
994 "important"
995 );
996 });
997
998 target.style.setProperty(
999 "border-left",
1000 "3px solid "+
1001 row.theme.accent,
1002 "important"
Veronika Kocher 22.15 1003 );
Veronika Kocher 22.16 1004
1005 target.style.setProperty(
1006 "box-sizing",
1007 "border-box",
1008 "important"
Veronika Kocher 22.15 1009 );
Veronika Kocher 22.14 1010 });
Veronika Kocher 22.16 1011 });
Veronika Kocher 22.14 1012
Veronika Kocher 22.16 1013 return unique;
Veronika Kocher 22.15 1014 }
Veronika Kocher 22.14 1015
Veronika Kocher 22.16 1016 /* =======================================================
1017 OVERVIEW CARD HEIGHT + FIRST THEMATIC ROW
1018 ======================================================= */
Veronika Kocher 22.15 1019
Veronika Kocher 22.16 1020 function alignOverviewCards(headers){
1021 if(
1022 PAGE_KIND!=="overview"||
1023 window.innerWidth<=MOBILE_MAX
1024 ){
1025 return;
1026 }
Veronika Kocher 22.15 1027
Veronika Kocher 22.16 1028 var cards=[];
1029 var seen=new Set();
Veronika Kocher 22.15 1030
Veronika Kocher 22.16 1031 headers.forEach(function(row){
1032 if(!seen.has(row.card)){
1033 seen.add(row.card);
1034 cards.push(row.card);
1035 }
1036 });
Veronika Kocher 22.15 1037
Veronika Kocher 22.16 1038 if(cards.length<2){
1039 return;
1040 }
Veronika Kocher 22.15 1041
Veronika Kocher 22.16 1042 // Group cards by actual top position.
1043 var groups=[];
Veronika Kocher 22.15 1044
Veronika Kocher 22.16 1045 cards.forEach(function(card){
1046 var top=
1047 card.getBoundingClientRect().top;
Veronika Kocher 22.15 1048
Veronika Kocher 22.16 1049 var group=null;
Veronika Kocher 22.15 1050
Veronika Kocher 22.16 1051 for(var i=0;i<groups.length;i++){
Veronika Kocher 22.15 1052 if(
Veronika Kocher 22.16 1053 Math.abs(
1054 groups[i].top-top
1055 )<=ROW_TOLERANCE
Veronika Kocher 22.15 1056 ){
Veronika Kocher 22.16 1057 group=groups[i];
1058 break;
Veronika Kocher 22.15 1059 }
Veronika Kocher 22.16 1060 }
Veronika Kocher 22.15 1061
Veronika Kocher 22.16 1062 if(!group){
1063 group={
1064 top:top,
1065 cards:[]
1066 };
1067 groups.push(group);
1068 }
Veronika Kocher 22.15 1069
Veronika Kocher 22.16 1070 group.cards.push(card);
1071 });
Veronika Kocher 22.15 1072
Veronika Kocher 22.16 1073 groups.forEach(function(group){
1074 if(group.cards.length<2){
1075 return;
1076 }
Veronika Kocher 22.15 1077
Veronika Kocher 22.16 1078 var firstHeaders=
1079 group.cards.map(function(card){
1080 var candidates=
1081 headers
1082 .filter(function(row){
1083 return row.card===card;
1084 })
1085 .sort(function(a,b){
1086 return (
1087 a.el
1088 .getBoundingClientRect()
1089 .top-
1090 b.el
1091 .getBoundingClientRect()
1092 .top
1093 );
1094 });
Veronika Kocher 22.15 1095
Veronika Kocher 22.16 1096 return candidates.length
1097 ?candidates[0]
1098 :null;
1099 });
Veronika Kocher 22.15 1100
Veronika Kocher 22.16 1101 if(
1102 !firstHeaders.some(function(row){
1103 return !row;
1104 })
1105 ){
1106 var targetTop=
1107 Math.max.apply(
1108 Math,
1109 firstHeaders.map(function(row){
1110 return (
1111 row.el
1112 .getBoundingClientRect()
1113 .top-
1114 row.card
1115 .getBoundingClientRect()
1116 .top
1117 );
1118 })
1119 );
Veronika Kocher 22.13 1120
Veronika Kocher 22.16 1121 firstHeaders.forEach(function(row){
1122 var relativeTop=
1123 row.el
1124 .getBoundingClientRect()
1125 .top-
1126 row.card
1127 .getBoundingClientRect()
1128 .top;
Veronika Kocher 22.14 1129
Veronika Kocher 22.16 1130 var delta=
1131 targetTop-relativeTop;
Veronika Kocher 22.14 1132
Veronika Kocher 22.16 1133 if(delta>1){
1134 saveStyle(
1135 row.el,
1136 originalMargin,
1137 "margin-top"
1138 );
Veronika Kocher 22.15 1139
Veronika Kocher 22.16 1140 var current=
1141 num(
1142 getComputedStyle(
1143 row.el
1144 ).marginTop
1145 );
Veronika Kocher 22.14 1146
Veronika Kocher 22.16 1147 row.el.style.setProperty(
1148 "margin-top",
1149 (
1150 current+delta
1151 )+"px"
1152 );
Veronika Kocher 22.14 1153
Veronika Kocher 22.16 1154 row.el.setAttribute(
1155 "data-sn-master-first-row",
1156 "1"
1157 );
Veronika Kocher 22.14 1158
Veronika Kocher 22.16 1159 managedMargin.add(
1160 row.el
1161 );
1162 }
1163 });
1164 }
Veronika Kocher 22.14 1165
Veronika Kocher 22.16 1166 var maxHeight=0;
Veronika Kocher 22.14 1167
Veronika Kocher 22.16 1168 group.cards.forEach(function(card){
1169 maxHeight=
1170 Math.max(
1171 maxHeight,
1172 card
1173 .getBoundingClientRect()
1174 .height
1175 );
1176 });
Veronika Kocher 22.14 1177
Veronika Kocher 22.16 1178 maxHeight=
1179 Math.ceil(maxHeight);
Veronika Kocher 22.14 1180
Veronika Kocher 22.16 1181 group.cards.forEach(function(card){
1182 saveStyle(
1183 card,
1184 originalHeight,
1185 "min-height"
1186 );
Veronika Kocher 22.14 1187
Veronika Kocher 22.16 1188 card.style.setProperty(
1189 "min-height",
1190 maxHeight+"px"
Veronika Kocher 22.14 1191 );
1192
Veronika Kocher 22.16 1193 card.setAttribute(
1194 "data-sn-master-equal-height",
1195 "1"
1196 );
Veronika Kocher 22.14 1197
Veronika Kocher 22.16 1198 managedHeight.add(
1199 card
1200 );
1201 });
Veronika Kocher 22.14 1202 });
1203 }
1204
Veronika Kocher 22.16 1205 /* =======================================================
1206 DETAIL GRID EQUAL HEIGHT, DESKTOP ONLY
1207 ======================================================= */
Veronika Kocher 22.14 1208
Veronika Kocher 22.16 1209 function equaliseDetailGrids(){
Veronika Kocher 22.15 1210 if(
Veronika Kocher 22.16 1211 PAGE_KIND!=="detail"||
1212 window.innerWidth<=MOBILE_MAX
Veronika Kocher 22.15 1213 ){
Veronika Kocher 22.16 1214 return;
Veronika Kocher 22.15 1215 }
Veronika Kocher 22.14 1216
Veronika Kocher 22.16 1217 var selectors=[
1218 ".arsn-grid",
1219 ".arsn-grid-2",
1220 ".arsn-grid-3",
1221 ".dmp-grid",
1222 ".ido-grid",
1223 ".pp-grid"
1224 ];
Veronika Kocher 22.14 1225
Veronika Kocher 22.16 1226 selectors.forEach(function(selector){
1227 Array.from(
1228 root.querySelectorAll(selector)
1229 ).forEach(function(grid){
1230 var children=
1231 Array.from(
1232 grid.children||[]
1233 ).filter(visible);
Veronika Kocher 22.14 1234
Veronika Kocher 22.16 1235 if(children.length<2){
1236 return;
1237 }
Veronika Kocher 22.14 1238
Veronika Kocher 22.16 1239 var groups=[];
Veronika Kocher 22.14 1240
Veronika Kocher 22.16 1241 children.forEach(function(child){
1242 var top=
1243 child
1244 .getBoundingClientRect()
1245 .top;
Veronika Kocher 22.14 1246
Veronika Kocher 22.16 1247 var group=null;
Veronika Kocher 22.14 1248
Veronika Kocher 22.16 1249 for(var i=0;i<groups.length;i++){
1250 if(
1251 Math.abs(
1252 groups[i].top-top
1253 )<=ROW_TOLERANCE
1254 ){
1255 group=groups[i];
1256 break;
1257 }
1258 }
Veronika Kocher 22.14 1259
Veronika Kocher 22.16 1260 if(!group){
1261 group={
1262 top:top,
1263 items:[]
1264 };
1265 groups.push(group);
1266 }
Veronika Kocher 22.14 1267
Veronika Kocher 22.16 1268 group.items.push(child);
1269 });
Veronika Kocher 22.14 1270
Veronika Kocher 22.16 1271 groups.forEach(function(group){
1272 if(group.items.length<2){
1273 return;
1274 }
Veronika Kocher 22.13 1275
Veronika Kocher 22.16 1276 var maxHeight=0;
Veronika Kocher 22.15 1277
Veronika Kocher 22.16 1278 group.items.forEach(function(item){
1279 maxHeight=
1280 Math.max(
1281 maxHeight,
1282 item
1283 .getBoundingClientRect()
1284 .height
1285 );
1286 });
Veronika Kocher 22.15 1287
Veronika Kocher 22.16 1288 maxHeight=
1289 Math.ceil(maxHeight);
Veronika Kocher 22.13 1290
Veronika Kocher 22.16 1291 group.items.forEach(function(item){
1292 saveStyle(
1293 item,
1294 originalHeight,
1295 "min-height"
1296 );
Veronika Kocher 22.13 1297
Veronika Kocher 22.16 1298 item.style.setProperty(
1299 "min-height",
1300 maxHeight+"px"
1301 );
Veronika Kocher 22.14 1302
Veronika Kocher 22.16 1303 item.setAttribute(
1304 "data-sn-master-equal-height",
1305 "1"
1306 );
Veronika Kocher 22.13 1307
Veronika Kocher 22.16 1308 managedHeight.add(item);
1309 });
Veronika Kocher 22.13 1310 });
Veronika Kocher 22.16 1311 });
1312 });
1313 }
Veronika Kocher 22.13 1314
Veronika Kocher 22.16 1315 /* =======================================================
1316 RUN / RESPONSIVE SCHEDULING
1317 ======================================================= */
Veronika Kocher 22.13 1318
Veronika Kocher 22.16 1319 function run(){
1320 if(running)return;
Veronika Kocher 22.13 1321
Veronika Kocher 22.16 1322 running=true;
Veronika Kocher 22.15 1323
Veronika Kocher 22.16 1324 try{
1325 resetRuntime();
1326 applyPlaceholderBadge();
1327 propagateDetailAccents();
Veronika Kocher 22.15 1328
Veronika Kocher 22.16 1329 var headers=
1330 applyOverviewPalette();
Veronika Kocher 22.15 1331
Veronika Kocher 22.16 1332 if(
1333 window.innerWidth>
1334 MOBILE_MAX
1335 ){
1336 alignOverviewCards(
1337 headers
1338 );
Veronika Kocher 22.13 1339
Veronika Kocher 22.16 1340 equaliseDetailGrids();
1341 }
Veronika Kocher 22.15 1342 }finally{
Veronika Kocher 22.16 1343 running=false;
Veronika Kocher 22.15 1344 }
Veronika Kocher 22.13 1345 }
1346
Veronika Kocher 22.16 1347 function onResize(){
Veronika Kocher 22.15 1348 if(resizeTimer){
1349 clearTimeout(
1350 resizeTimer
1351 );
1352 }
Veronika Kocher 22.14 1353
Veronika Kocher 22.15 1354 resizeTimer=
1355 setTimeout(
1356 function(){
1357 resizeTimer=0;
Veronika Kocher 22.16 1358 run();
Veronika Kocher 22.15 1359 },
1360 RESIZE_DEBOUNCE
1361 );
Veronika Kocher 22.13 1362 }
1363
Veronika Kocher 22.16 1364 async function waitForReady(){
1365 if(
1366 document.readyState!=="complete"
1367 ){
1368 await new Promise(function(resolve){
1369 window.addEventListener(
1370 "load",
1371 resolve,
1372 {once:true}
1373 );
1374 });
1375 }
1376
1377 if(
1378 document.fonts&&
1379 document.fonts.ready
1380 ){
1381 try{
1382 await document.fonts.ready;
1383 }catch(error){}
1384 }
1385
Veronika Kocher 22.15 1386 var images=
1387 Array.from(
1388 root.querySelectorAll("img")
1389 );
Veronika Kocher 22.13 1390
Veronika Kocher 22.16 1391 await Promise.all(
Veronika Kocher 22.15 1392 images.map(function(img){
1393 if(img.complete){
1394 return Promise.resolve();
1395 }
Veronika Kocher 22.13 1396
Veronika Kocher 22.15 1397 return new Promise(function(resolve){
1398 var done=function(){
1399 resolve();
1400 };
1401
1402 img.addEventListener(
1403 "load",
1404 done,
1405 {once:true}
1406 );
1407
1408 img.addEventListener(
1409 "error",
1410 done,
1411 {once:true}
1412 );
1413 });
1414 })
1415 );
1416
Veronika Kocher 22.16 1417 run();
Veronika Kocher 22.13 1418 }
1419
Veronika Kocher 22.16 1420 window.addEventListener(
Veronika Kocher 22.15 1421 "resize",
Veronika Kocher 22.16 1422 onResize,
Veronika Kocher 22.15 1423 {passive:true}
1424 );
1425
Veronika Kocher 22.16 1426 waitForReady();
Veronika Kocher 22.13 1427 })();
1428 </script>
Veronika Kocher 22.15 1429
Veronika Kocher 22.16 1430 <!-- SN_SERVICE_NAVIGATOR_MASTER_STYLE_END -->
1431 {{/html}}
1432