Skip to content

Commit 61a86b8

Browse files
authored
Merge pull request #982 from vuejs-jp/main
2 parents 32e7f31 + 39d97ca commit 61a86b8

File tree

16 files changed

+261
-141
lines changed

16 files changed

+261
-141
lines changed

app/layouts/default.vue

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,19 @@ const cta = computed(() =>
8585
8686
const { y } = useScroll(window);
8787
const isShowedSpMenu = computed(() => {
88-
const targetBp: Breakpoint[] = isWidenContent.value ? ["mobile-wide", "mobile"] : ["mobile"];
88+
const targetBp: Breakpoint[]
89+
= isTimetable.value
90+
? ["pc", "mobile-wide", "mobile"]
91+
: isWidenContent.value
92+
? ["mobile-wide", "mobile"]
93+
: ["mobile"];
8994
return targetBp.includes(bp.value) && (!isRoot.value || y.value > 450);
9095
});
9196
const isShowedSpCta = computed(() => {
92-
const targetBp: Breakpoint[] = isWidenContent.value ? ["pc", "mobile-wide", "mobile"] : ["mobile-wide", "mobile"];
97+
const targetBp: Breakpoint[]
98+
= isTimetable.value || isWidenContent.value
99+
? ["pc", "mobile-wide", "mobile"]
100+
: ["mobile-wide", "mobile"];
93101
return targetBp.includes(bp.value) && (!isRoot.value || y.value > 450);
94102
});
95103
@@ -102,7 +110,6 @@ const WIDE_ROUTE_NAMES: RoutesNamesList[] = [
102110
"sponsors",
103111
"sponsors-sponsorId",
104112
"event",
105-
"timetable",
106113
"related-events",
107114
"store",
108115
];
@@ -114,6 +121,8 @@ const isWidenContent = computed(() =>
114121
.includes(route.name?.toString() ?? ""),
115122
);
116123
124+
const isTimetable = computed(() => localeRoute("timetable" as string).name === route.name?.toString());
125+
117126
// scroll behavior
118127
watch(() => route.hash, async (hash) => {
119128
if (hash === "") {
@@ -150,7 +159,7 @@ watch(() => route.hash, async (hash) => {
150159
<VFMenu :items="menuItems" />
151160
</div>
152161
</div>
153-
<div class="content" :class="{ 'widen-content': isWidenContent }">
162+
<div class="content" :class="{ 'widen-content': isWidenContent, 'timetable': isTimetable }">
154163
<VFHeader :is-root class="header" />
155164

156165
<main class="main">
@@ -220,6 +229,7 @@ watch(() => route.hash, async (hash) => {
220229
justify-content: center;
221230
min-width: 700px;
222231
max-width: 700px;
232+
transition: unset;
223233
224234
@media (--mobile) {
225235
row-gap: 1rem;
@@ -230,10 +240,18 @@ watch(() => route.hash, async (hash) => {
230240
flex-basis: auto;
231241
}
232242
243+
&.timetable {
244+
width: 90%;
245+
max-width: 1400px;
246+
247+
@media (--mobile) {
248+
min-width: 0;
249+
width: 100%;
250+
}
251+
}
252+
233253
&.widen-content {
234254
min-width: 960px;
235-
/* min-width: 95%; */
236-
transition: unset;
237255
238256
@media (--mobile) {
239257
min-width: 0;

app/pages/_components/StaffGridItem.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { computed } from "vue";
33
44
export type StaffItemProps = {
55
name: string;
6-
avatarUrl: string;
6+
avatarUrl?: string;
77
socialUrls?: {
88
x?: string;
99
github?: string;

app/pages/ticket/index.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ const localeRoute = useLocaleRoute();
3333
const isSoldOutAfterParty = import.meta.vfFeatures.soldOutAfterParty;
3434
const isSoldOutEarlyBirdAfterParty = import.meta.vfFeatures.soldOutEarlyBirdAfterParty || import.meta.vfFeatures.soldOutEarlyBird;
3535
const isSoldOutEarlyBird = import.meta.vfFeatures.soldOutEarlyBird;
36+
const isSoldOutGeneral = import.meta.vfFeatures.soldOutGeneral;
37+
const isSoldOutHandsOn = import.meta.vfFeatures.soldOutHandsOn;
38+
const isSoldOutIndividualSponsor = import.meta.vfFeatures.soldOutIndividualSponsor;
3639
3740
const isLoading = ref(false);
3841
@@ -94,9 +97,10 @@ useSeoMeta({
9497
<span class="ticket-badge-price">
9598
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
9699
<span class="ticket-badge-price-type">{{ t('ticket.standard') }}</span>
97-
<span class="ticket-badge-price-value">
100+
<span class="ticket-badge-price-value" :class="{ 'sold-out': isSoldOutGeneral }">
98101
<span class="ticket-badge-price-unit" :class="locale">{{ t("ticket.priceUnit") }}</span>{{ (Number(t('ticket.generalTicket.standardPrice'))).toLocaleString() }}
99102
</span>
103+
<span v-if="isSoldOutGeneral" class="sold-out-label">{{ t('ticket.soldOut') }}</span>
100104
</span>
101105
</div>
102106
</div>
@@ -147,9 +151,10 @@ useSeoMeta({
147151
</h2>
148152
<div class="ticket-badge-prices">
149153
<span class="ticket-badge-price">
150-
<span class="ticket-badge-price-value">
154+
<span class="ticket-badge-price-value" :class="{ 'sold-out': isSoldOutHandsOn }">
151155
<span class="ticket-badge-price-unit" :class="locale">{{ t("ticket.priceUnit") }}</span>{{ (Number(t('ticket.handsOn.price'))).toLocaleString() }}
152156
</span>
157+
<span v-if="isSoldOutHandsOn" class="sold-out-label">{{ t('ticket.soldOut') }}</span>
153158
</span>
154159
</div>
155160
</div>
@@ -172,9 +177,10 @@ useSeoMeta({
172177
</h2>
173178
<div class="ticket-badge-prices">
174179
<span class="ticket-badge-price">
175-
<span class="ticket-badge-price-value">
180+
<span class="ticket-badge-price-value" :class="{ 'sold-out': isSoldOutIndividualSponsor }">
176181
<span class="ticket-badge-price-unit" :class="locale">{{ t("ticket.priceUnit") }}</span>{{ (Number(t('ticket.individual.price'))).toLocaleString() }}
177182
</span>
183+
<span v-if="isSoldOutIndividualSponsor" class="sold-out-label">{{ t('ticket.soldOut') }}</span>
178184
</span>
179185
</div>
180186
</div>

app/pages/timetable/_components/TimetableCard.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import SliderIcon from "~icons/icons/timetable-slider.svg";
77
const {
88
type,
99
title,
10-
sessionStart,
11-
sessionEnd,
10+
startTime,
11+
endTime,
1212
speakers,
1313
slide,
1414
track,
@@ -47,9 +47,9 @@ const hoverColor = computed(() => `var(--color-${accentColorName.value}-accent-h
4747
{{ t(`timetable.track.${track}`) }}
4848
</div>
4949
</template>
50-
<div v-if="sessionStart" class="time">
50+
<div v-if="startTime" class="time">
5151
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
52-
{{ sessionStart }} - {{ sessionEnd }}
52+
{{ startTime }} - {{ endTime }}
5353
</div>
5454
<template v-if="type === 'schedule'">
5555
<div class="schedule-title">
@@ -152,6 +152,7 @@ const hoverColor = computed(() => `var(--color-${accentColorName.value}-accent-h
152152
font-family: IBMPlexSansJP-Bold;
153153
font-size: 16px;
154154
text-align: left;
155+
white-space: pre-wrap;
155156
156157
a {
157158
font-family: IBMPlexSansJP-Bold;

app/pages/timetable/_components/TimetableCell.vue

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import SliderIcon from "~icons/icons/timetable-slider.svg";
77
const {
88
type,
99
title,
10-
sessionStart,
11-
sessionEnd,
10+
startTime,
11+
endTime,
1212
speakers,
1313
slide,
1414
colspan,
@@ -44,16 +44,16 @@ const hoverColor = `var(--color-${accentColorName.value}-accent-hover)`;
4444
<template>
4545
<td class="cell" :colspan="colspan" :rowspan="rowspan" :class="{ 'cell--schedule': type === 'schedule' }">
4646
<div class="cell-inner">
47-
<div v-if="sessionStart && type !== 'schedule'" class="time">
47+
<div v-if="startTime && type !== 'schedule'" class="time">
4848
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
49-
{{ sessionStart }} - {{ sessionEnd }}
49+
{{ startTime }} - {{ endTime }}
5050
</div>
5151

5252
<template v-if="type === 'schedule'">
5353
<div class="schedule-content">
54-
<div v-if="sessionStart" class="time">
54+
<div v-if="startTime" class="time">
5555
<!-- eslint-disable-next-line @intlify/vue-i18n/no-raw-text -->
56-
{{ sessionStart }} - {{ sessionEnd }}
56+
{{ startTime }} - {{ endTime }}
5757
</div>
5858
<div class="schedule-title">
5959
{{ title }}
@@ -160,6 +160,7 @@ const hoverColor = `var(--color-${accentColorName.value}-accent-hover)`;
160160
font-family: IBMPlexSansJP-Bold;
161161
font-size: 16px;
162162
text-align: left;
163+
white-space: pre-wrap;
163164
a {
164165
all: inherit;
165166
cursor: pointer;

cspell.config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ words:
182182
- sasagawaki
183183
- Sasaki
184184
- Sato
185+
- Satouuuuuu
185186
- sayn
186187
- senbei
187188
- Seyschab

i18n/en/index.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,11 @@ timetable:
304304
platinumSponsorSession: "Platinum Sponsor Session"
305305
lunchTime: "Lunch Time"
306306
studentSupportProgram: "Student Support Program"
307+
studentSupportProgramSessionTitle: "【Student Support Program】\nTalents discovered by kazupon ─ Developer discovery techniques that change Vue.js and the OSS ecosystem"
307308
break: "Break"
308309
beginnerHandsOn: "Beginner Hands-on"
309310
intermediateHandsOn: "Intermediate Hands-on"
310-
panelDiscussion: "Panel Discussion"
311+
crossTalkTitle: "Panel Discussion\nThe Future of Frontend: Visions from React, Vue.js, and Svelte for the Next Decade"
311312
lightningTalk: "Lightning Talk"
312313
transition: "Transition"
313314
afterParty: "After Party\nsupported by Tenshoku-DRAFT"

i18n/en/speakers.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const evan = {
66
id: "yyx990803",
77
name: "Evan You",
88
affiliation: "Creator of Vue.js & Vite",
9-
talkSchedule: "10:11 - 10:50",
9+
talkSchedule: "10:10 - 10:50",
1010
talkTrack: "hacomono" as const,
1111
avatarUrl: "/images/avatars/evan-you.png",
1212
attendedIndex: 1,
@@ -30,7 +30,12 @@ export const SESSION_SPEAKERS: Speaker[] = [
3030
attendedIndex: 4,
3131
color: "purple",
3232
talkTitle: import.meta.vfFeatures.guestDetailsDaniel ? "Beyond the Framework: Building for the Next Decade of the Web" : "TBD",
33-
talkOverview: import.meta.vfFeatures.guestDetailsDaniel ? `Frontend tooling moves at breakneck speed, but the foundations of great web applications remain surprisingly constant. In this talk, Daniel explores how to architect projects that will thrive across technology shifts — from framework migrations to evolving hosting landscapes. Drawing from his work leading the Nuxt core team and collaborating with global developer communities, Daniel shares patterns, pitfalls, and practical strategies for building software that stays resilient, adaptable, and joyful to work on.` : undefined,
33+
talkOverview: import.meta.vfFeatures.guestDetailsDaniel
34+
? `Frontend tooling moves at breakneck speed, but the foundations of great web applications remain surprisingly constant.
35+
36+
In this talk, Daniel explores how to architect projects that will thrive across technology shifts — from framework migrations to evolving hosting landscapes.
37+
Drawing from his work leading the Nuxt core team and collaborating with global developer communities, Daniel shares patterns, pitfalls, and practical strategies for building software that stays resilient, adaptable, and joyful to work on.`
38+
: undefined,
3439
socialUrls: {
3540
github: "https://github.com/danielroe",
3641
bluesky: "https://bsky.app/profile/danielroe.dev",
@@ -63,7 +68,16 @@ export const SESSION_SPEAKERS: Speaker[] = [
6368
attendedIndex: 6,
6469
color: "navy",
6570
talkTitle: import.meta.vfFeatures.guestDetailsAkryum ? "rstore and the challenge of building a local-first store" : "TBD",
66-
talkOverview: import.meta.vfFeatures.guestDetailsAkryum ? `We will explore what is rstore and how it works as a flexible state management solution. Let's answer many interesting questions like: What does local-first mean? How is rstore different from pinia? How was it made extensible to support many use cases? What is data federation? How to make an offline sync engine?` : undefined,
71+
talkOverview: import.meta.vfFeatures.guestDetailsAkryum
72+
? `We will explore what is rstore and how it works as a flexible state management solution.
73+
74+
Let's answer many interesting questions like:
75+
・What does local-first mean?
76+
・How is rstore different from pinia?
77+
・How was it made extensible to support many use cases?
78+
・What is data federation?
79+
・How to make an offline sync engine?`
80+
: undefined,
6781
socialUrls: {
6882
github: "https://github.com/Akryum",
6983
x: "https://x.com/Akryum",
@@ -97,7 +111,10 @@ export const SESSION_SPEAKERS: Speaker[] = [
97111
attendedIndex: 8,
98112
color: "purple",
99113
talkTitle: import.meta.vfFeatures.guestDetailsOgawa ? "Inside Vitest: Test Framework Architecture Deep Dive" : "TBD",
100-
talkOverview: import.meta.vfFeatures.guestDetailsOgawa ? "This talk explores what makes Vitest architecturally unique, including how it leverages Vite's broad framework ecosystem and plugin capabilities, its runtime agnostic architecture that enables running the same tests across Node.js, browsers, and edge environments, and the implementation of core testing features like mocking, coverage, and parallel execution systems. By understanding the internals, you'll learn better testing practices and test performance optimization techniques to improve your software development workflow." : undefined,
114+
talkOverview: import.meta.vfFeatures.guestDetailsOgawa
115+
? `This talk explores what makes Vitest architecturally unique, including how it leverages Vite's broad framework ecosystem and plugin capabilities, its runtime agnostic architecture that enables running the same tests across Node.js, browsers, and edge environments, and the implementation of core testing features like mocking, coverage, and parallel execution systems.
116+
By understanding the internals, you'll learn better testing practices and test performance optimization techniques to improve your software development workflow.`
117+
: undefined,
101118
socialUrls: {
102119
github: "https://github.com/hi-ogawa",
103120
bluesky: "https://bsky.app/profile/hiogawa.bsky.social",

i18n/ja/index.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,11 @@ timetable:
303303
platinumSponsorSession: "プラチナスポンサーセッション"
304304
lunchTime: "ランチタイム"
305305
studentSupportProgram: "学生支援プログラム"
306+
studentSupportProgramSessionTitle: "【学生支援プログラム】\nkazuponが見つけた才能たち ─ Vue.jsそしてOSSエコシステムを変える開発者発掘術"
306307
break: "休憩"
307308
beginnerHandsOn: "初級者向けハンズオン"
308309
intermediateHandsOn: "中級者向けハンズオン"
309-
panelDiscussion: "パネルディスカッション"
310+
crossTalkTitle: "パネルディスカッション\nフロントエンドの未来を語る ─ React/Vue.js/Svelte が見据える次の 10 年"
310311
lightningTalk: "ライトニングトーク"
311312
transition: "転換"
312313
afterParty: "アフターパーティー\nsupported by 転職ドラフト"

0 commit comments

Comments
 (0)