Skip to content

Commit 897265e

Browse files
authored
Merge pull request #345 from vuejs-jp/enhance/namecard-gallery
namecard gallery test
2 parents 6bfa0e4 + dbdcf19 commit 897265e

File tree

8 files changed

+122
-0
lines changed

8 files changed

+122
-0
lines changed

apps/web/.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ ENABLE_OPERATE_ADMIN=
1414
ENABLE_SWITCH_LOCALE=
1515
ENABLE_REGISTER_TICKET=
1616
ENABLE_REGISTER_NAMECARD=
17+
SHOW_NAMECARD_GALLERY=
1718
SHOW_SPEAKER_DETAIL=
1819
SHOW_TIMETABLE=
1920
SHOW_EVENT=
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<script setup lang="ts">
2+
import type { AttendeeInfo } from '@vuejs-jp/model'
3+
4+
const props = defineProps<{ attendees: AttendeeInfo }>()
5+
</script>
6+
7+
<template>
8+
<div class="gallery">
9+
<div class="gallery-namecard-list">
10+
<VFNamecard24
11+
v-for="attendee in attendees.list"
12+
:key="attendee.id"
13+
:user="attendee"
14+
class="namecard-item"
15+
/>
16+
</div>
17+
</div>
18+
</template>
19+
20+
<style scoped>
21+
@import url('../../assets/base.css');
22+
@import url('../../assets/media.css');
23+
24+
.gallery {
25+
margin: 0 auto;
26+
padding: 60px 0 120px;
27+
width: 100%;
28+
max-width: 1920px;
29+
height: 620px;
30+
display: flex;
31+
flex-wrap: wrap;
32+
justify-content: center;
33+
gap: 40px;
34+
position: relative;
35+
overflow: hidden;
36+
37+
@media (--tablet) {
38+
padding: 20px 0 60px;
39+
max-width: 100%;
40+
}
41+
42+
a {
43+
border-radius: 12px;
44+
overflow: hidden;
45+
display: block;
46+
}
47+
}
48+
49+
.gallery-namecard-list {
50+
display: flex;
51+
gap: 40px;
52+
position: absolute;
53+
top: 0;
54+
transform: translateX(100%);
55+
animation: marquee 120s linear infinite;
56+
57+
@media (--mobile) {
58+
gap: 20px;
59+
}
60+
}
61+
62+
.gallery-namecard-list:hover {
63+
animation-play-state: paused;
64+
cursor: default;
65+
}
66+
67+
@keyframes marquee {
68+
0% {
69+
left: -100%;
70+
-moz-transform: translateX(0);
71+
-webkit-transform: translateX(0);
72+
transform: translateX(0);
73+
}
74+
75+
100% {
76+
left: 0;
77+
-moz-transform: translateX(-100%);
78+
-webkit-transform: translateX(-100%);
79+
transform: translateX(-100%);
80+
}
81+
}
82+
</style>

apps/web/app/layouts/namecard-base.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const { color } = useColor()
2020
</h1>
2121
<slot />
2222
</div>
23+
<slot name="large-container" />
2324
</template>
2425

2526
<style scoped>

apps/web/app/pages/namecard/index.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ import { useAuthSession } from '~/composables/useAuthSession'
99
import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
1010
import MarkDownText from '~/components/MarkDownText.vue'
1111
import CreationProcess from '~/components/namecard/CreationProcess.vue'
12+
import { useFetch } from '#imports'
13+
import type { AttendeeInfo } from '@vuejs-jp/model'
14+
15+
type Attendees = Record<'activatedAttendees', AttendeeInfo>
16+
17+
const { data: attendees } = await useFetch('/api/attendees')
18+
const { activatedAttendees } = attendees.value as Attendees
1219
1320
const config = useRuntimeConfig()
1421
@@ -50,6 +57,9 @@ function handleSignIn(provider: Extract<AuthProvider, 'github' | 'google'>) {
5057
{{ t('namecard.dialog_message') }}
5158
</p>
5259
</VFIntegrationDialog>
60+
<template v-if="config.public.showNamecardGallery" #large-container>
61+
<NamecardGalleryView :attendees="activatedAttendees" />
62+
</template>
5363
<div class="namecard-root">
5464
<img
5565
class="namecard-samples"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { defineEventHandler } from 'h3'
2+
import type { Attendee, AttendeeInfo } from '@vuejs-jp/model'
3+
import { serverSupabaseClient } from '#supabase/server'
4+
import { Database } from '~/types/supabase'
5+
6+
export default defineEventHandler(async (event) => {
7+
let attendees: Attendee[] = []
8+
9+
const client = await serverSupabaseClient<Database>(event)
10+
const { data: _attendees } = await client.from('attendees').select().not('activated_at', 'is', null) as { data: Attendee[] }
11+
attendees = _attendees
12+
13+
const activatedAttendees: AttendeeInfo = {
14+
type: 'activated-attendee',
15+
title: 'activated-attendee',
16+
list: attendees,
17+
}
18+
19+
return { activatedAttendees }
20+
})

apps/web/nuxt.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ export default defineNuxtConfig({
194194
enableSwitchLocale: process.env.ENABLE_SWITCH_LOCALE,
195195
enableRegisterTicket: process.env.ENABLE_REGISTER_TICKET,
196196
enableRegisterNamecard: process.env.ENABLE_REGISTER_NAMECARD,
197+
showNamecardGallery: process.env.SHOW_NAMECARD_GALLERY,
197198
showSpeakerDetail: process.env.SHOW_SPEAKER_DETAIL,
198199
showTimetable: process.env.SHOW_TIMETABLE,
199200
showEvent: process.env.SHOW_EVENT,

packages/model/lib/attendee.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,9 @@ export type Attendee = {
3333
}
3434

3535
export type NamecardUser = Pick<Attendee, 'display_name' | 'avatar_url' | 'role' | 'receipt_id'>
36+
37+
export type AttendeeInfo = {
38+
type: 'activated-attendee'
39+
title: string
40+
list: Attendee[]
41+
}

turbo.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"ENABLE_OPERATE_ADMIN",
2727
"ENABLE_REGISTER_TICKET",
2828
"ENABLE_REGISTER_NAMECARD",
29+
"SHOW_NAMECARD_GALLERY",
2930
"SHOW_SPEAKER_DETAIL",
3031
"SHOW_TIMETABLE",
3132
"SHOW_EVENT",

0 commit comments

Comments
 (0)