Use the theme's chip and tag components for every pill on the site
Build & Deploy / deploy (push) Successful in 2m41s

Links are .wt-chip, labels are .wt-tag, highlighted labels .wt-tag--accent.
Bumps Weircon-wind for the status tag variants.

Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
This commit is contained in:
Asger Geel Weirsøe
2026-10-29 18:41:00 +01:00
parent 0105f1576d
commit a352b32fac
11 changed files with 22 additions and 23 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ const isActive = (href: string) => (href === '/' || href === '/en' ? path === hr
</ul> </ul>
{andet && ( {andet && (
<a href={andet.path} hreflang={andet.lang} lang={andet.lang} <a href={andet.path} hreflang={andet.lang} lang={andet.lang}
class="mr-1 rounded-full border border-border px-2.5 py-0.5 text-sm text-muted transition-colors hover:border-accent hover:text-accent">{andet.lang === 'en' ? 'English' : 'Dansk'}</a> class="wt-chip mr-1">{andet.lang === 'en' ? 'English' : 'Dansk'}</a>
)} )}
<button type="button" data-palette-open class="theme-toggle" title="Søg (⌘K / Ctrl K)" aria-label="Åbn søgning og kommandopalette"> <button type="button" data-palette-open class="theme-toggle" title="Søg (⌘K / Ctrl K)" aria-label="Åbn søgning og kommandopalette">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
+1 -1
View File
@@ -12,7 +12,7 @@ const d = date.toLocaleDateString('da-DK', { year: 'numeric', month: 'long', day
{tags.length > 0 && ( {tags.length > 0 && (
<div class="mt-3 flex flex-wrap gap-1.5"> <div class="mt-3 flex flex-wrap gap-1.5">
{tags.map((t) => ( {tags.map((t) => (
<a href={`/tags/${t}`} class="rounded-full border border-border px-2.5 py-0.5 text-xs text-muted transition-colors hover:border-accent hover:text-accent">#{t}</a> <a href={`/tags/${t}`} class="wt-chip">#{t}</a>
))} ))}
</div> </div>
)} )}
+3 -3
View File
@@ -64,12 +64,12 @@ const alternates = oversat
{d.platforme.length > 0 && <div><dt class="inline text-muted">{T.koerer} </dt><dd class="inline">{d.platforme.join(', ')}</dd></div>} {d.platforme.length > 0 && <div><dt class="inline text-muted">{T.koerer} </dt><dd class="inline">{d.platforme.join(', ')}</dd></div>}
</dl> </dl>
<div class="mt-5 flex flex-wrap gap-2"> <div class="mt-5 flex flex-wrap gap-2">
<a href={repo} class="rounded-full border border-border px-3 py-1 text-sm hover:border-accent hover:text-accent">{T.kilde}</a> <a href={repo} class="wt-chip">{T.kilde}</a>
{aur.map((a) => ( {aur.map((a) => (
<a href={a.url} class="rounded-full border border-border px-3 py-1 text-sm hover:border-accent hover:text-accent">AUR: {a.navn}</a> <a href={a.url} class="wt-chip">AUR: {a.navn}</a>
))} ))}
{d.aur.some((n) => n.endsWith('-bin')) && ( {d.aur.some((n) => n.endsWith('-bin')) && (
<a href="/tarballz/" class="rounded-full border border-border px-3 py-1 text-sm hover:border-accent hover:text-accent">{T.bin}</a> <a href="/tarballz/" class="wt-chip">{T.bin}</a>
)} )}
</div> </div>
</header> </header>
+1 -1
View File
@@ -49,7 +49,7 @@ const crumbs = breadcrumb([
{post.data.tags.length > 0 && ( {post.data.tags.length > 0 && (
<div class="mt-4 flex flex-wrap gap-1.5"> <div class="mt-4 flex flex-wrap gap-1.5">
{post.data.tags.map((t) => ( {post.data.tags.map((t) => (
<a href={`/tags/${t}`} class="rounded-full border border-border px-2.5 py-0.5 text-xs text-muted hover:border-accent hover:text-accent">#{t}</a> <a href={`/tags/${t}`} class="wt-chip">#{t}</a>
))} ))}
</div> </div>
)} )}
+4 -4
View File
@@ -90,7 +90,7 @@ const sprog = ['Dansk (modersmål)', 'Engelsk (flydende i tale og skrift)'];
</p> </p>
<div class="mt-4 flex flex-wrap gap-2"> <div class="mt-4 flex flex-wrap gap-2">
{['Peppol', 'Peppol Access Point', 'Oxalis', 'NemHandel', 'e-faktura', 'Electronic invoicing', 'OIOUBL / UBL', 'e-Delivery (AS4)', 'EN 16931', 'e-procurement'].map((k) => ( {['Peppol', 'Peppol Access Point', 'Oxalis', 'NemHandel', 'e-faktura', 'Electronic invoicing', 'OIOUBL / UBL', 'e-Delivery (AS4)', 'EN 16931', 'e-procurement'].map((k) => (
<span class="rounded-full border border-border bg-surface/60 px-3 py-1 text-sm">{k}</span> <span class="wt-tag">{k}</span>
))} ))}
</div> </div>
</section> </section>
@@ -117,7 +117,7 @@ const sprog = ['Dansk (modersmål)', 'Engelsk (flydende i tale og skrift)'];
</p> </p>
<div class="mt-4 flex flex-wrap gap-2"> <div class="mt-4 flex flex-wrap gap-2">
{['Incident response', 'Hændelseshåndtering', 'Eskalering', 'Post-incident review', 'Sårbarhedshåndtering', 'Interessentkommunikation', 'ISO/IEC 27001', 'ISMS', 'Informationssikkerhed'].map((k) => ( {['Incident response', 'Hændelseshåndtering', 'Eskalering', 'Post-incident review', 'Sårbarhedshåndtering', 'Interessentkommunikation', 'ISO/IEC 27001', 'ISMS', 'Informationssikkerhed'].map((k) => (
<span class="rounded-full border border-border bg-surface/60 px-3 py-1 text-sm">{k}</span> <span class="wt-tag">{k}</span>
))} ))}
</div> </div>
</section> </section>
@@ -207,11 +207,11 @@ const sprog = ['Dansk (modersmål)', 'Engelsk (flydende i tale og skrift)'];
<div> <div>
<h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Primære kompetencer</h2> <h2 class="text-sm font-semibold uppercase tracking-widest text-accent">Primære kompetencer</h2>
<div class="mt-4 flex flex-wrap gap-2"> <div class="mt-4 flex flex-wrap gap-2">
{primaere.map((k) => <span class="rounded-full border border-border bg-surface/60 px-3 py-1 text-sm">{k}</span>)} {primaere.map((k) => <span class="wt-tag">{k}</span>)}
</div> </div>
<h2 class="mt-8 text-sm font-semibold uppercase tracking-widest text-accent">Sekundære</h2> <h2 class="mt-8 text-sm font-semibold uppercase tracking-widest text-accent">Sekundære</h2>
<div class="mt-4 flex flex-wrap gap-2"> <div class="mt-4 flex flex-wrap gap-2">
{sekundaere.map((k) => <span class="rounded-full border border-border bg-surface/40 px-3 py-1 text-sm text-muted">{k}</span>)} {sekundaere.map((k) => <span class="wt-tag wt-muted">{k}</span>)}
</div> </div>
</div> </div>
<div> <div>
+2 -2
View File
@@ -68,7 +68,7 @@ const skills = [
</p> </p>
<div class="mt-4 flex flex-wrap gap-2"> <div class="mt-4 flex flex-wrap gap-2">
{['Peppol', 'Peppol Access Point', 'Oxalis', 'NemHandel', 'E-invoicing', 'OIOUBL / UBL', 'eDelivery (AS4)', 'EN 16931', 'E-procurement'].map((k) => ( {['Peppol', 'Peppol Access Point', 'Oxalis', 'NemHandel', 'E-invoicing', 'OIOUBL / UBL', 'eDelivery (AS4)', 'EN 16931', 'E-procurement'].map((k) => (
<span class="rounded-full border border-border bg-surface/60 px-3 py-1 text-sm">{k}</span> <span class="wt-tag">{k}</span>
))} ))}
</div> </div>
</section> </section>
@@ -153,7 +153,7 @@ const skills = [
<div> <div>
<h3 class="text-sm font-medium text-text">{s.k}</h3> <h3 class="text-sm font-medium text-text">{s.k}</h3>
<div class="mt-2 flex flex-wrap gap-2"> <div class="mt-2 flex flex-wrap gap-2">
{s.v.map((k) => <span class="rounded-full border border-border bg-surface/60 px-3 py-1 text-sm">{k}</span>)} {s.v.map((k) => <span class="wt-tag">{k}</span>)}
</div> </div>
</div> </div>
))} ))}
+4 -4
View File
@@ -52,12 +52,12 @@ import Base from '../layouts/Base.astro';
var d = await r.json(); var d = await r.json();
if (!r.ok) { box.innerHTML = '<div class="rounded-2xl border border-border bg-surface/60 p-5"><p class="text-sm text-muted">Peppol-opslag ikke tilgængeligt lige nu.</p></div>'; return; } if (!r.ok) { box.innerHTML = '<div class="rounded-2xl border border-border bg-surface/60 p-5"><p class="text-sm text-muted">Peppol-opslag ikke tilgængeligt lige nu.</p></div>'; return; }
if (!d.on_peppol) { if (!d.on_peppol) {
box.innerHTML = '<div class="rounded-2xl border border-border bg-surface/60 p-5"><div class="flex items-baseline justify-between gap-2"><h2 class="text-xl font-semibold tracking-tight">Peppol-netværk</h2><span class="rounded-full border border-border px-3 py-1 text-sm text-muted">Ikke fundet</span></div><p class="mt-2 text-sm text-muted">Virksomheden blev ikke fundet i Peppol Directory via CVR-opslag (kan stadig være på Peppol under et andet identifikator-scheme).</p></div>'; box.innerHTML = '<div class="rounded-2xl border border-border bg-surface/60 p-5"><div class="flex items-baseline justify-between gap-2"><h2 class="text-xl font-semibold tracking-tight">Peppol-netværk</h2><span class="wt-tag wt-muted">Ikke fundet</span></div><p class="mt-2 text-sm text-muted">Virksomheden blev ikke fundet i Peppol Directory via CVR-opslag (kan stadig være på Peppol under et andet identifikator-scheme).</p></div>';
return; return;
} }
var docs = (d.doctypes || []).map(function (dt) { var docs = (d.doctypes || []).map(function (dt) {
var label = PROF[dt.customization] || dt.customization; var label = PROF[dt.customization] || dt.customization;
return '<span class="rounded-full border border-border bg-surface-2 px-2.5 py-1 text-sm">' + esc(dt.document) + ' · ' + esc(label) + '</span>'; return '<span class="wt-tag">' + esc(dt.document) + ' · ' + esc(label) + '</span>';
}).join(''); }).join('');
box.innerHTML = '<div class="rounded-2xl border border-border bg-surface/60 p-5">' + box.innerHTML = '<div class="rounded-2xl border border-border bg-surface/60 p-5">' +
'<div class="flex flex-wrap items-baseline justify-between gap-2"><h2 class="text-xl font-semibold tracking-tight">Peppol-netværk</h2>' + '<div class="flex flex-wrap items-baseline justify-between gap-2"><h2 class="text-xl font-semibold tracking-tight">Peppol-netværk</h2>' +
@@ -93,10 +93,10 @@ import Base from '../layouts/Base.astro';
caps.innerHTML = caps.innerHTML =
(data.networks.length ? '<p class="text-xs font-semibold uppercase tracking-widest text-accent">Netværk</p>' + (data.networks.length ? '<p class="text-xs font-semibold uppercase tracking-widest text-accent">Netværk</p>' +
'<div class="mt-2 flex flex-wrap gap-2">' + data.networks.map(function (n) { '<div class="mt-2 flex flex-wrap gap-2">' + data.networks.map(function (n) {
return '<span class="rounded-full border border-border bg-surface-2 px-3 py-1 text-sm">' + esc(n) + '</span>'; }).join('') + '</div>' : '') + return '<span class="wt-tag">' + esc(n) + '</span>'; }).join('') + '</div>' : '') +
(data.profiles.length ? '<p class="mt-4 text-xs font-semibold uppercase tracking-widest text-accent">Profilpakker</p>' + (data.profiles.length ? '<p class="mt-4 text-xs font-semibold uppercase tracking-widest text-accent">Profilpakker</p>' +
'<div class="mt-2 flex flex-wrap gap-2">' + data.profiles.map(function (p) { '<div class="mt-2 flex flex-wrap gap-2">' + data.profiles.map(function (p) {
return '<span class="rounded-full border border-border bg-surface-2 px-3 py-1 text-sm">' + esc(p) + '</span>'; }).join('') + '</div>' : ''); return '<span class="wt-tag">' + esc(p) + '</span>'; }).join('') + '</div>' : '');
} else { } else {
caps.innerHTML = '<p class="text-sm text-muted">' + (data.registered caps.innerHTML = '<p class="text-sm text-muted">' + (data.registered
? 'Registreret, men ingen profildata i seneste opdatering.' ? 'Registreret, men ingen profildata i seneste opdatering.'
+3 -3
View File
@@ -81,12 +81,12 @@ const kilde = (p: (typeof profiles)[number]) => {
class="rounded-2xl border border-border bg-surface/60 p-5 transition-colors hover:border-accent/50" class="rounded-2xl border border-border bg-surface/60 p-5 transition-colors hover:border-accent/50"
> >
<div class="flex flex-wrap items-center gap-2"> <div class="flex flex-wrap items-center gap-2">
<span class="rounded-full border border-accent/40 bg-accent/10 px-2.5 py-0.5 text-xs font-medium text-accent"> <span class="wt-tag wt-tag--accent">
{p.standard} {p.standard}
</span> </span>
{p.kategori && ( {p.kategori && (
<span <span
class="rounded-full border border-border bg-surface-2 px-2.5 py-0.5 text-xs text-muted" class="wt-tag wt-muted"
title="Gruppen profilen står under i Nemhandelsregistrets dropdown" title="Gruppen profilen står under i Nemhandelsregistrets dropdown"
> >
Register: {p.kategori} Register: {p.kategori}
@@ -112,7 +112,7 @@ const kilde = (p: (typeof profiles)[number]) => {
<div class="mt-3 flex flex-wrap gap-1.5"> <div class="mt-3 flex flex-wrap gap-1.5">
{p.dokumenter.map((d) => ( {p.dokumenter.map((d) => (
<span class="rounded-full border border-border bg-surface-2 px-2 py-0.5 text-xs">{d}</span> <span class="wt-tag">{d}</span>
))} ))}
</div> </div>
+1 -1
View File
@@ -11,7 +11,7 @@ const tags = [...counts.entries()].sort((a, b) => b[1] - a[1]);
<h1 class="text-4xl font-bold tracking-tight">Tags</h1> <h1 class="text-4xl font-bold tracking-tight">Tags</h1>
<div class="mt-8 flex flex-wrap gap-2"> <div class="mt-8 flex flex-wrap gap-2">
{tags.map(([t, n]) => ( {tags.map(([t, n]) => (
<a href={`/tags/${t}`} class="rounded-full border border-border bg-surface/60 px-3.5 py-1.5 text-sm transition-colors hover:border-accent hover:text-accent"> <a href={`/tags/${t}`} class="wt-chip">
#{t} <span class="text-muted">({n})</span> #{t} <span class="text-muted">({n})</span>
</a> </a>
))} ))}
+1 -2
View File
@@ -103,8 +103,7 @@ const idx = profiles.map((p) => ({
} }
function badge(text, kind) { function badge(text, kind) {
var cls = kind === 'ok' ? 'border-accent/40 bg-accent/10 text-accent' : 'border-border bg-surface-2 text-text'; return '<span class="wt-tag' + (kind === 'ok' ? ' wt-tag--accent' : '') + '">' + esc(text) + '</span>';
return '<span class="rounded-full border ' + cls + ' px-2.5 py-0.5 text-xs">' + esc(text) + '</span>';
} }
function row(dt, dd) { function row(dt, dd) {
return '<div class="grid gap-1 sm:grid-cols-[10rem_1fr]"><dt class="text-muted">' + esc(dt) + return '<div class="grid gap-1 sm:grid-cols-[10rem_1fr]"><dt class="text-muted">' + esc(dt) +