Files
website/layers/cv/app/components/CvSection.vue
T
2026-10-02 17:32:02 +02:00

73 lines
2.7 KiB
Vue

<script setup lang="ts">
defineProps<{ title: string, entries: CvEntry[] }>()
const { lang, t } = useCvLang()
</script>
<template>
<section class="mt-12 first:mt-0">
<h2 class="mb-6 text-xl font-semibold text-highlighted">
{{ title }}
</h2>
<ol class="space-y-6">
<li v-for="entry in entries" :key="entry.id" class="grid gap-1 break-inside-avoid sm:grid-cols-[11rem_1fr] sm:gap-6 print:grid-cols-[11rem_1fr] print:gap-6">
<div class="text-sm text-muted tabular-nums">
<div>{{ cvPeriod(entry.from, entry.to, lang, t) }}</div>
<div class="text-dimmed">
{{ cvDuration(entry.from, entry.to, t) }}
</div>
</div>
<div>
<div class="font-medium text-highlighted">
{{ lang === 'de' && entry.areaGerman || entry.area }}
</div>
<div class="text-sm text-default">
{{ entry.institution }}<span v-if="entry.place" class="ms-1.5 text-muted">{{ entry.place }}</span>
</div>
<div class="mt-1.5 flex flex-wrap items-center gap-2">
<UBadge v-if="entry.type" :label="t.types[entry.type] ?? entry.type" color="neutral" variant="subtle" size="sm" />
<span v-if="entry.grade" class="text-xs text-muted">{{ t.grade }} {{ entry.grade }}</span>
</div>
<ul v-if="entry.links.length" class="mt-2 space-y-1">
<li v-for="(group, index) in entry.links" :key="index" class="flex flex-wrap gap-x-4 gap-y-1">
<UButton
v-for="link in group"
:key="link.url"
:to="link.url"
target="_blank"
:icon="link.kind === 'github' ? 'i-lucide-github' : 'i-lucide-globe'"
:label="link.label"
color="primary"
variant="link"
size="sm"
class="p-0 print:hidden"
/>
<a
v-for="link in group"
:key="`print-${link.url}`"
:href="link.url"
class="hidden text-xs break-all text-primary print:inline"
>{{ cvLinkText(link.url) }}</a>
</li>
</ul>
<ul v-if="entry.files.length" class="mt-2 space-y-1 print:hidden">
<li v-for="file in entry.files" :key="file.url">
<UButton
:to="file.url"
target="_blank"
icon="i-lucide-file-down"
:label="file.name"
color="primary"
variant="link"
size="sm"
class="p-0"
/>
</li>
</ul>
</div>
</li>
</ol>
</section>
</template>