repositories / bugabinga.net
bugabinga.net
personal infrastructure for bugabinga!
owned by admin
services/luci/internal/web/assets/layout.tmpl
Raw{{define "run-row"}}<article class="run-row" data-search="{{.Search}}"><span class="state {{.Status}}">{{upper .Status}}</span><a class="name" href="/runs/{{.RunID}}"><b>{{.Repo}} / {{.Job}}</b>{{if .Meta}}<small>{{.Meta}}</small>{{end}}{{if .Subject}}<small class="subject">{{.Subject}}</small>{{end}}</a>{{if .PronounceShort}}<button class="scalar rowid" data-raw="{{.Pronounce}}" data-kind="full run ID" aria-label="Copy full run ID {{.Pronounce}}">{{.PronounceShort}}</button>{{end}}{{if ne .FullRev "—"}}<button class="scalar sha" data-raw="{{.FullRev}}" data-kind="full Git revision" aria-label="Copy full Git revision {{.FullRev}}">{{.Rev}}</button>{{end}}<span class="timing">{{.When}}</span></article>{{end}}
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>{{.Title}} · Luci</title><link rel="icon" href="data:,"><style>
{{.CSS}}
</style>{{if .Theme}}<link rel="stylesheet" href="/theme.css">{{end}}</head><body {{if .Data.Running}}data-running="1"{{end}}><div class="shell"><header class="top"><strong>LUCI</strong><a href="/">RUNS</a><a href="/docs">DOCS</a><span>PUBLIC CI</span></header><main class="main">{{template "body" .Data}}</main><div class="copy-fallback" hidden><label>Clipboard unavailable. Select exact value and copy manually.<input readonly aria-label="Exact value to copy manually"></label></div><div class="copy-status" role="status" aria-live="polite"></div><footer>LUCI · public repositories, runs, logs</footer></div><script>(()=>{const status=document.querySelector('.copy-status'),fallback=document.querySelector('.copy-fallback'),input=fallback.querySelector('input');let timer;function notify(text){clearTimeout(timer);status.textContent=text;timer=setTimeout(()=>status.textContent='',6000)}async function copy(text,kind){try{await navigator.clipboard.writeText(text);fallback.hidden=true;notify('Copied '+kind+'.')}catch{input.value=text;fallback.hidden=false;input.focus();input.select();notify('Clipboard unavailable. Exact value selected for manual copy.')}}document.querySelectorAll('[data-raw]').forEach((node,index)=>{const tip=document.createElement('span');tip.className='raw-tooltip';tip.id='raw-tooltip-'+index;tip.setAttribute('role','tooltip');tip.textContent=node.dataset.raw;const note=document.createElement('small');note.textContent=node.dataset.kind+' · activate to copy';tip.append(note);node.append(tip);node.setAttribute('aria-describedby',tip.id);node.addEventListener('click',event=>{event.preventDefault();copy(node.dataset.raw,node.dataset.kind)});node.addEventListener('keydown',event=>{if(event.key==='Escape'){node.classList.add('tooltip-dismissed');event.stopPropagation()}});for(const event of ['pointerenter','focus'])node.addEventListener(event,()=>node.classList.remove('tooltip-dismissed'))});document.querySelectorAll('[data-copy]').forEach(node=>node.addEventListener('click',event=>{event.preventDefault();copy(node.dataset.copy,node.dataset.copyKind||'value')}));if(document.body.dataset.running)setInterval(()=>{const active=document.activeElement;const busy=active&&active!==document.body&&active!==document.documentElement;if(!document.hidden&&!busy&&!document.querySelector('details[open],.copy-fallback:not([hidden]),.scalar:hover'))location.reload()},5000)})();</script></body></html>