Service Navigator
Version 22.13 by Veronika Kocher on Thursday, 03 Sep 2026 9:18
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.
The Service Navigator is organised around what you need to do, not around the university's organisational chart.
Find a service
Search by task, topic or question — for example room, invoice, disability, DOI, event, employment, data protection or library.
Find services by what you need to do
[data-sn-equal-height-managed="1"]{box-sizing:border-box}
@media(max-width:767px){
[data-sn-equal-height-managed="1"]{min-height:0!important}
}
(function(){
"use strict";
var MOBILE_MAX=767;
var ROW_TOLERANCE=4;
var MIN_W=150;
var MIN_H=36;
var root=
document.getElementById("xwikicontent")||
document.querySelector(".xwiki-rendering-content")||
document.querySelector("main")||
document.body;
if(!root)return;
var managed=new Set();
var raf=0;
function num(v){
var n=parseFloat(v);
return Number.isFinite(n)?n:0;
}
function visible(el){
if(!el||el.nodeType!==1)return false;
var s=getComputedStyle(el);
if(s.display==="none"||s.visibility==="hidden"||Number(s.opacity)===0)return false;
var r=el.getBoundingClientRect();
return r.width>=MIN_W&&r.height>=MIN_H;
}
function excluded(el){
return !el.matches||el.matches(
"button,input,select,textarea,option,label,img,svg,canvas,table,thead,tbody,tfoot,tr,td,th,summary,script,style,noscript,template,.btn,.chip,[role=button]"
);
}
function namedLikeBox(el){
var c=typeof el.className==="string"?el.className:"";
return /(^|[\s_-])(box|card|tile|panel|role|check|service|source|call|area|detail|resource|topic|warn|info)([\s_-]|$)/i.test(c);
}
function boxLike(el){
if(!visible(el)||excluded(el))return false;
var s=getComputedStyle(el);
var r=el.getBoundingClientRect();
var border=
num(s.borderTopWidth)+num(s.borderRightWidth)+
num(s.borderBottomWidth)+num(s.borderLeftWidth);
var radius=Math.max(
num(s.borderTopLeftRadius),num(s.borderTopRightRadius),
num(s.borderBottomLeftRadius),num(s.borderBottomRightRadius)
);
var bg=s.backgroundColor&&s.backgroundColor!=="rgba(0, 0, 0, 0)"&&s.backgroundColor!=="transparent";
var shadow=s.boxShadow&&s.boxShadow!=="none";
return namedLikeBox(el)||border>=1||(bg&&radius>=3)||(shadow&&r.width>=180);
}
function pickTarget(child){
if(!visible(child))return null;
if(boxLike(child))return child;
var cr=child.getBoundingClientRect();
var q=[];
Array.from(child.children||[]).forEach(function(el){
q.push({el:el,depth:1});
});
var best=null,bestScore=-1;
while(q.length){
var item=q.shift();
var el=item.el;
if(!visible(el))continue;
var r=el.getBoundingClientRect();
if(r.width>=cr.width*.72&&boxLike(el)){
var widthFit=1-Math.min(1,Math.abs(cr.width-r.width)/Math.max(1,cr.width));
var topFit=1-Math.min(1,Math.abs(cr.top-r.top)/80);
var score=widthFit*5+topFit*2+Math.min(r.height,600)/600;
if(score>bestScore){
best=el;
bestScore=score;
}
}
if(item.depth<3){
Array.from(el.children||[]).forEach(function(next){
q.push({el:next,depth:item.depth+1});
});
}
}
return best;
}
function reset(){
managed.forEach(function(el){
el.style.removeProperty("min-height");
el.removeAttribute("data-sn-equal-height-managed");
});
managed.clear();
}
function horizontalLayout(parent){
if(!visible(parent))return false;
var s=getComputedStyle(parent);
if(s.display==="grid"||s.display==="inline-grid")return true;
if(s.display==="flex"||s.display==="inline-flex"){
return s.flexDirection==="row"||s.flexDirection==="row-reverse";
}
return false;
}
function rowGroups(entries){
var groups=[];
entries.slice().sort(function(a,b){
return a.rect.top-b.rect.top||a.rect.left-b.rect.left;
}).forEach(function(entry){
var group=null;
for(var i=0;i=2&&horizontalLayout(el);
});
parents.forEach(function(parent){
var entries=[];
Array.from(parent.children).forEach(function(child){
if(!visible(child))return;
var target=pickTarget(child);
if(!target)return;
entries.push({
target:target,
rect:target.getBoundingClientRect()
});
});
if(entries.length<2)return;
rowGroups(entries).forEach(function(group){
if(group.entries.length<2)return;
var lefts=group.entries.map(function(e){return e.rect.left;}).sort(function(a,b){return a-b;});
if(lefts[lefts.length-1]-lefts[0]<80)return;
var targets=[];
var seen=new Set();
group.entries.forEach(function(e){
if(!seen.has(e.target)){
seen.add(e.target);
targets.push(e.target);
}
});
if(targets.length<2)return;
var max=0;
targets.forEach(function(el){
max=Math.max(max,el.getBoundingClientRect().height);
});
max=Math.ceil(max);
if(max