Skip to content

Commit 89e8348

Browse files
committed
feat: セッション詳細ページに発表資料のリンクを追加
1 parent f2b45ca commit 89e8348

File tree

5 files changed

+150
-0
lines changed

5 files changed

+150
-0
lines changed

app/pages/sessions/[id].vue

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
88
import { generalOg, twitterOg } from '~/utils/og.constants'
99
import { conferenceTitle } from '~/utils/constants'
1010
import { speakers } from '~/utils/speakers.constants'
11+
import SlideSvg from '~/assets/logo/slide_logo.svg'
1112
1213
const { locale } = useLocaleCurrent()
1314
const { showSpeakerInfo, getTrackColor } = useSession()
@@ -87,6 +88,17 @@ useHead({
8788
<div class="detailbody-explain">
8889
<MarkDownText :path="`sessions/${speakerData.id}/head`" />
8990
</div>
91+
<NuxtLink
92+
v-if="speakerData.session.archives?.slide"
93+
:to="speakerData.session.archives?.slide"
94+
target="_blank"
95+
class="detailbody-slide"
96+
>
97+
<span class="slide-icon">
98+
<SlideSvg />
99+
</span>
100+
<span class="slide-title">発表資料</span>
101+
</NuxtLink>
90102
<div class="detailbody-persons">
91103
<SpeakerCard :speaker="speakerData" />
92104
<div class="person-info">
@@ -162,6 +174,28 @@ css({
162174
},
163175
},
164176
},
177+
'.detailbody-slide': {
178+
display: 'flex',
179+
alignItems: 'center',
180+
gap: 'calc({space.8} * 1)',
181+
width: 'fit-content',
182+
margin: '-40px 0 calc({space.8} * 8)',
183+
'&:hover': {
184+
opacity: 0.8,
185+
transition: '.2s',
186+
},
187+
},
188+
'.slide-icon': {
189+
width: '40px',
190+
height: '40px',
191+
'::v-deep(svg)': {
192+
fill: '{color.vue.blue}',
193+
},
194+
},
195+
'.slide-title': {
196+
color: '{color.vue.blue}',
197+
textDecoration: 'underline',
198+
},
165199
'.detailbody-persons': {
166200
fontSize: 'calc(18*{fontSize.base})',
167201
display: 'grid',

app/pages/sponsor-sessions/[id].vue

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { generalOg, twitterOg } from '~/utils/og.constants'
99
import { conferenceTitle } from '~/utils/constants'
1010
import { all } from '~/utils/sponsor.constants'
1111
import { sponsorSpeakers } from '~/utils/sponsor-speakers.constants'
12+
import SlideSvg from '~/assets/logo/slide_logo.svg'
1213
1314
const emptySponsorSpeaker: SponsorSpeaker = {
1415
id: '',
@@ -138,6 +139,17 @@ useHead({
138139
<div class="detailbody-explain">
139140
<MarkDownText :path="`sponsor-sessions/${sponsorSpeakerData.id}/head`" />
140141
</div>
142+
<NuxtLink
143+
v-if="sponsorSpeakerData.session.archives?.slide"
144+
:to="sponsorSpeakerData.session.archives?.slide"
145+
target="_blank"
146+
class="detailbody-slide"
147+
>
148+
<span class="slide-icon">
149+
<SlideSvg />
150+
</span>
151+
<span class="slide-title">発表資料</span>
152+
</NuxtLink>
141153
<div
142154
v-for="(profile, index) in sponsorSpeakerData.profile"
143155
:key="index"
@@ -210,6 +222,28 @@ css({
210222
},
211223
},
212224
},
225+
'.detailbody-slide': {
226+
display: 'flex',
227+
alignItems: 'center',
228+
gap: 'calc({space.8} * 1)',
229+
width: 'fit-content',
230+
margin: '-40px 0 calc({space.8} * 8)',
231+
'&:hover': {
232+
opacity: 0.8,
233+
transition: '.2s',
234+
},
235+
},
236+
'.slide-icon': {
237+
width: '40px',
238+
height: '40px',
239+
'::v-deep(svg)': {
240+
fill: '{color.vue.blue}',
241+
},
242+
},
243+
'.slide-title': {
244+
color: '{color.vue.blue}',
245+
textDecoration: 'underline',
246+
},
213247
'.detailbody-persons': {
214248
fontSize: 'calc(18*{fontSize.base})',
215249
display: 'grid',

app/types/app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ export type Session = {
128128
type: 'main' | 'lt'
129129
track?: Tracks
130130
time: string
131+
archives?: Archive
131132
}
132133

133134
export type SpeakerProfile = {
@@ -142,6 +143,11 @@ export type SpeakerProfile = {
142143
mastodonUrl?: string
143144
}
144145

146+
export interface Archive {
147+
slide?: string
148+
youtube?: string
149+
}
150+
145151
/**
146152
* sponsor
147153
*/

app/utils/speakers.constants.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ export const speakers: Speaker[] = [
101101
track: 'medpeer',
102102
time: '16:30 - 17:00',
103103
type: 'main',
104+
archives: {
105+
slide: 'https://vue-fes-japan-2023-multithread-slide.sapphi.red/1',
106+
},
104107
},
105108
profile: {
106109
image: 'speakers/sapphi_red.png',
@@ -121,6 +124,9 @@ export const speakers: Speaker[] = [
121124
track: 'medpeer',
122125
time: '17:15 - 17:45',
123126
type: 'main',
127+
archives: {
128+
slide: 'https://ota-meshi.github.io/vue-fes-japan-2023-slide/1',
129+
},
124130
},
125131
profile: {
126132
image: 'speakers/ota-meshi.jpg',
@@ -140,6 +146,9 @@ export const speakers: Speaker[] = [
140146
track: 'medpeer',
141147
time: '15:00 - 15:30',
142148
type: 'main',
149+
archives: {
150+
slide: 'https://speakerdeck.com/wattanx/demystifying-nuxt-bridge',
151+
},
143152
},
144153
profile: {
145154
image: 'speakers/wattanx.png',
@@ -159,6 +168,9 @@ export const speakers: Speaker[] = [
159168
track: 'm3',
160169
time: '16:30 - 17:00',
161170
type: 'main',
171+
archives: {
172+
slide: 'https://speakerdeck.com/sorami/vue-fes-japan-2023',
173+
},
162174
},
163175
profile: {
164176
image: 'speakers/sorami.png',
@@ -178,6 +190,10 @@ export const speakers: Speaker[] = [
178190
track: 'm3',
179191
time: '15:00 - 15:30',
180192
type: 'main',
193+
archives: {
194+
slide:
195+
'https://speakerdeck.com/mizdra/vue-language-server-karasheng-mareta-volar-dot-js-to-soregami-meruke-neng-xing',
196+
},
181197
},
182198
profile: {
183199
image: 'speakers/mizdra.png',
@@ -196,6 +212,9 @@ export const speakers: Speaker[] = [
196212
track: 'medpeer',
197213
time: '15:45 - 16:15',
198214
type: 'main',
215+
archives: {
216+
slide: 'https://speakerdeck.com/nozomuikuta/deep-dive-to-unjs-and-nuxt-3',
217+
},
199218
},
200219
profile: {
201220
image: 'speakers/nozomu_ikuta.png',
@@ -215,6 +234,9 @@ export const speakers: Speaker[] = [
215234
track: 'm3',
216235
time: '13:30 - 14:00',
217236
type: 'main',
237+
archives: {
238+
slide: 'https://yamanoku.net/vuefes-japan-2023/ja/',
239+
},
218240
},
219241
profile: {
220242
image: 'speakers/yamanoku.png',
@@ -252,6 +274,9 @@ export const speakers: Speaker[] = [
252274
track: 'm3',
253275
time: '14:15 - 14:45',
254276
type: 'main',
277+
archives: {
278+
slide: 'https://speakerdeck.com/chinen/vue-fes-japan-2023',
279+
},
255280
},
256281
profile: {
257282
image: 'speakers/chocodogmagic.jpg',
@@ -270,6 +295,9 @@ export const speakers: Speaker[] = [
270295
track: 'm3',
271296
time: '17:15 - 17:45',
272297
type: 'main',
298+
archives: {
299+
slide: 'https://docs.google.com/presentation/d/1sVPisJofs18G8WUitn4l53s-mXFLRTs2Q4F0hqFqS5A/edit#slide=id.p',
300+
},
273301
},
274302
profile: {
275303
image: 'speakers/keima.jpg',
@@ -288,6 +316,10 @@ export const speakers: Speaker[] = [
288316
track: 'medpeer',
289317
time: '14:15 - 14:45',
290318
type: 'main',
319+
archives: {
320+
slide:
321+
'https://speakerdeck.com/baseballyama/vue-fes-2023-18ying-ye-ri-de350konponentogui-mo-novueapurinidezainsisutemuwodao-ru-surufang-fa',
322+
},
291323
},
292324
profile: {
293325
image: 'speakers/baseballyama.jpeg',
@@ -310,6 +342,9 @@ export const speakers: Speaker[] = [
310342
track: 'medpeer',
311343
time: '13:30 - 14:00',
312344
type: 'lt',
345+
archives: {
346+
slide: 'https://www.docswell.com/s/kira_puka/ZRXM6E-2023-10-25-064822',
347+
},
313348
},
314349
profile: {
315350
image: 'speakers/kira_puka.png',
@@ -329,6 +364,10 @@ export const speakers: Speaker[] = [
329364
track: 'medpeer',
330365
time: '13:30 - 14:00',
331366
type: 'lt',
367+
archives: {
368+
slide:
369+
'https://docs.google.com/presentation/d/1KwLPyFLE0J3W9BwFmROHtgG0qQbGdYCnbEXjuJTYpJ4/edit#slide=id.g24fad336807_0_0',
370+
},
332371
},
333372
profile: {
334373
image: 'speakers/northprint.png',
@@ -349,6 +388,9 @@ export const speakers: Speaker[] = [
349388
track: 'medpeer',
350389
time: '13:30 - 14:00',
351390
type: 'lt',
391+
archives: {
392+
slide: 'https://speakerdeck.com/t0yohei/vue-woshi-tute-grid-system-woshi-zhuang-sitahua',
393+
},
352394
},
353395
profile: {
354396
image: 'speakers/t0yohei.jpg',
@@ -368,6 +410,9 @@ export const speakers: Speaker[] = [
368410
track: 'medpeer',
369411
time: '13:30 - 14:00',
370412
type: 'lt',
413+
archives: {
414+
slide: 'https://speakerdeck.com/yud0uhu/tauriniripureisusitahua',
415+
},
371416
},
372417
profile: {
373418
image: 'speakers/yud0uhu.jpg',
@@ -387,6 +432,9 @@ export const speakers: Speaker[] = [
387432
track: 'medpeer',
388433
time: '15:45 - 16:15',
389434
type: 'lt',
435+
archives: {
436+
slide: 'https://slides-one.vercel.app/1?clicks=1',
437+
},
390438
},
391439
profile: {
392440
image: 'speakers/53able.png',
@@ -407,6 +455,9 @@ export const speakers: Speaker[] = [
407455
track: 'm3',
408456
time: '15:45 - 16:15',
409457
type: 'lt',
458+
archives: {
459+
slide: 'https://speakerdeck.com/fuqda/subpatandenozhuang-tai-guan-li',
460+
},
410461
},
411462
profile: {
412463
image: 'speakers/fuqda.png',
@@ -427,6 +478,9 @@ export const speakers: Speaker[] = [
427478
track: 'm3',
428479
time: '12:45 - 13:15',
429480
type: 'lt',
481+
archives: {
482+
slide: 'https://tome.app/mewton-8cb/vue-fes-2023-clnjmh8ez0044l77dwardvtga',
483+
},
430484
},
431485
profile: {
432486
image: 'speakers/mew-ton.png',
@@ -465,6 +519,10 @@ export const speakers: Speaker[] = [
465519
track: 'm3',
466520
time: '15:45 - 16:15',
467521
type: 'lt',
522+
archives: {
523+
slide:
524+
'https://speakerdeck.com/wakkn/hurusukuratutiecnoji-pan-dearunuxt-2wo3niyi-xing-si-kai-fa-noxiao-lu-xing-topahuomansuwogao-meru',
525+
},
468526
},
469527
profile: {
470528
image: 'speakers/hitoki-wakugawa.jpg',

app/utils/sponsor-speakers.constants.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ export const sponsorSpeakers: SponsorSpeaker[] = [
1010
track: 'all',
1111
time: '11:05 - 11:25',
1212
type: 'main',
13+
archives: {
14+
slide: 'https://speakerdeck.com/bengo4com/20231028',
15+
},
1316
},
1417
profile: [
1518
{
@@ -33,6 +36,9 @@ export const sponsorSpeakers: SponsorSpeaker[] = [
3336
track: 'all',
3437
time: '11:25 - 11:45',
3538
type: 'main',
39+
archives: {
40+
slide: 'https://twitter.com/kyamamoto9120/status/1718138625882476906',
41+
},
3642
},
3743
profile: [
3844
{
@@ -56,6 +62,9 @@ export const sponsorSpeakers: SponsorSpeaker[] = [
5662
track: 'all',
5763
time: '11:45 - 12:05',
5864
type: 'main',
65+
archives: {
66+
slide: 'https://speakerdeck.com/lmi/vuefes2023-link-and-motivation',
67+
},
5968
},
6069
profile: [
6170
{
@@ -80,6 +89,9 @@ export const sponsorSpeakers: SponsorSpeaker[] = [
8089
track: 'medpeer',
8190
time: '12:30 - 12:50',
8291
type: 'main',
92+
archives: {
93+
slide: 'https://www.slideshare.net/KazuhiroKobayashikzh/vue-2-eol-2',
94+
},
8395
},
8496
profile: [
8597
{
@@ -159,6 +171,9 @@ export const sponsorSpeakers: SponsorSpeaker[] = [
159171
track: 'cloudsign',
160172
time: '12:55 - 13:15',
161173
type: 'main',
174+
archives: {
175+
slide: 'https://speakerdeck.com/cyber_snufkin/28-vue-fes-tokyo-vue-dot-js-puroziekutoshe-ji-nobesutopurakuteisuwoqiu-mete',
176+
},
162177
},
163178
profile: [
164179
{
@@ -182,6 +197,9 @@ export const sponsorSpeakers: SponsorSpeaker[] = [
182197
track: 'm3',
183198
time: '12:20 - 12:40',
184199
type: 'main',
200+
archives: {
201+
slide: 'https://speakerdeck.com/hacomono/nuxt-3dehazimerutesutodao-ru-zhan-lue-tochu-shou',
202+
},
185203
},
186204
profile: [
187205
{

0 commit comments

Comments
 (0)