blob: b4f7bd9e09c0c980de358c3dbeceba3a59fee51f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
<script setup lang="ts">
import { format } from 'date-fns';
import { type Event as ScheduledEvent } from '~/stores/schedule';
const { event } = defineProps<{
event: ScheduledEvent;
}>();
const getHostname = (url: string) => new URL(url).hostname;
</script>
<template>
<div class="event">
<div class="event-details">
<span class="event-info">
{{ format(event.start, "eeee kk:mm") }} - {{ format(event.end, "kk:mm") }}, {{ event.room }}
</span>
<span class="event-title">{{ event.title }}</span>
<span class="event-speaker">{{ event.persons.map(p => p.name).join(", ") }}</span>
</div>
<div class="event-abstract" v-html="event.abstract" />
<div v-if="event.links.length > 0 || event.attachments.length > 0" class="event-supplementary">
<div class="event-links" v-if="event.links.length > 0">
<span class="event-links-header">Links</span>
<ul>
<li v-for="link in event.links" :key="link.href" class="event-link">
<a :href="link.href" target="_blank">{{ link.name }}</a>
</li>
</ul>
</div>
<div class="event-attachments" v-if="event.attachments.length > 0">
<span class="event-attachments-header">Attachments</span>
<ul>
<li v-for="attachment in event.attachments" :key="attachment.href" class="event-attachment">
<a :href="attachment.href" target="_blank">{{ attachment.name }}</a>
</li>
</ul>
</div>
</div>
<div>
<span class="event-track"><NuxtLink :to="'/tracks/' + event.track.slug">{{ event.track.name }}</NuxtLink> •</span> <a v-if="event.url" class="event-url" :href="event.url" target="_blank">view on {{ getHostname(event.url)}}</a>
</div>
</div>
</template>
<style scoped>
.event {
display: flex;
flex-direction: column;
gap: 1rem;
}
.event-details {
display: flex;
justify-content: space-between;
align-items: flex-start;
flex-direction: column;
line-height: 1.3;
}
.event-info {
font-size: var(--text-normal);
color: var(--color-text);
margin: 0;
}
.event-title {
font-size: var(--text-larger);
font-weight: 600;
margin: 0;
}
.event-supplementary {
display: flex;
flex-direction: row;
gap: 1rem;
}
.event-links-header, .event-attachments-header, .event-track-header {
font-weight: 600;
}
.event-speaker {
font-size: var(--text-small);
color: var(--color-text-muted);
}
.event-track, .event-url {
font-size: var(--text-small);
}
.event-button {
background: none;
border: none;
color: var(--color-primary);
cursor: pointer;
outline: none;
}
.event-button:hover {
color: var(--color-primary-dark);
}
.event-icon {
height: 1.5rem;
width: 1.5rem;
}
</style>
|