Skip to content

Commit fd3af3d

Browse files
committed
chore: merge main and add 404 page
2 parents 47c83dc + d235fe7 commit fd3af3d

12 files changed

Lines changed: 315 additions & 184 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Vue Fes Japan Speakers
22

3-
歴代のVue Fes Japanのスピーカーを一覧できるサイトです(パネルディスカッションやイベントスピーカーは含めておりません)。
3+
歴代のVue Fes Japanのスピーカーを一覧できるサイトです(イベントスピーカーは含めておりません)。
44

55
![Vue Fes Japan Speakersのサイトスクリーンショット](./public/og-image.png)
66

app/app.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { YEARS } from "../types";
55
import { getSpeakerNames, getSpeakerTalks } from "./composables/speaker";
66
import { isValidYear } from "./utils/years";
77
import HomeRoute from "./routes/HomeRoute.vue";
8+
import NotFoundRoute from "./routes/NotFoundRoute.vue";
89
import SpeakerRoute from "./routes/SpeakerRoute.vue";
910
import YearRoute from "./routes/YearRoute.vue";
1011

@@ -78,6 +79,14 @@ export default defineApp({
7879
},
7980
render: { strategy: "ssg" },
8081
}),
82+
defineRoute({
83+
path: "/404.html",
84+
component: NotFoundRoute,
85+
head: {
86+
title: "Page Not Found",
87+
},
88+
render: { strategy: "ssg" },
89+
}),
8190
defineRoute({
8291
path: "/speakers/:name",
8392
component: SpeakerRoute,

app/components/AppFooter.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ const { t } = useVfjsI18n();
66

77
<template>
88
<footer
9-
class="border-t border-[var(--rule)] flex flex-wrap gap-x-[24px] gap-y-[8px] items-baseline justify-between px-[var(--pad-x)] py-[20px] text-[12px] text-[var(--ink-3)] [font-family:var(--font-mono)]"
9+
class="border-t border-[var(--rule)] flex flex-wrap gap-x-[24px] gap-y-[8px] items-baseline justify-between px-[var(--pad-x)] py-[20px] text-[12px] [font-family:var(--font-mono)]"
1010
>
1111
<div>
12-
<a href="/" class="text-inherit underline hover:no-underline hover:text-[var(--ink-3)]">
12+
<a href="/" class="text-inherit underline hover:no-underline hover:text-[var(--ink)]">
1313
{{ t.back_top }}
1414
</a>
1515
</div>
@@ -18,10 +18,11 @@ const { t } = useVfjsI18n();
1818
href="https://github.com/yamanoku/vuefes-japan-speakers"
1919
target="_blank"
2020
rel="noopener"
21-
class="text-inherit underline hover:no-underline hover:text-[var(--ink-3)]"
21+
class="text-inherit no-underline hover:underline hover:text-[var(--ink)]"
2222
>
2323
GitHub
2424
</a>
25+
<span class="text-[10px] ml-[4px]">({{ t.external }})</span>
2526
</div>
2627
</footer>
2728
</template>

app/components/AppMasthead.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,22 @@ const { t } = useVfjsI18n();
1313
<section
1414
class="border-b border-[var(--rule)] pt-[clamp(48px,8vw,120px)] pb-[clamp(40px,6vw,72px)] px-[var(--pad-x)]"
1515
>
16-
<div class="grid grid-cols-12 gap-6 items-end">
16+
<div class="grid grid-cols-12 gap-6">
1717
<div
1818
class="col-span-9 flex items-center gap-[clamp(18px,2.4vw,34px)] max-[800px]:col-span-12 max-[560px]:flex-col max-[560px]:items-start"
1919
>
2020
<AppLogoMark
2121
class="w-[clamp(42px,5vw,72px)] h-auto text-[var(--ink)] mb-[0.08em] max-[560px]:mb-0"
2222
/>
2323
<h1
24-
class="m-0 [font-family:var(--font-display)] font-[500] text-[clamp(38px,6.2vw,104px)] leading-[0.96] text-[var(--ink)] word-break-keep-all"
24+
class="m-0 [font-family:var(--font-display)] font-[500] text-[clamp(38px,6.2vw,104px)] leading-[0.96] text-[var(--ink)] break-keep"
2525
>
2626
<span>Vue Fes Japan Speakers</span>
2727
</h1>
2828
</div>
2929
<aside
30+
class="grid items-center col-span-3 [font-family:var(--font-mono)] text-[20px] leading-[1.7] tracking-[0.06em] border-l border-[var(--rule)] pl-[16px] max-[800px]:col-span-12 max-[800px]:border-l-0 max-[800px]:pl-0 max-[800px]:border-t max-[800px]:pt-[16px]"
3031
aria-label="Archive scope"
31-
class="col-span-3 [font-family:var(--font-mono)] text-[12px] leading-[1.7] tracking-[0.06em] text-[var(--ink-3)] border-l border-[var(--rule-soft)] pl-[16px] max-[800px]:col-span-12 max-[800px]:border-l-0 max-[800px]:pl-0 max-[800px]:border-t max-[800px]:pt-[16px]"
3232
>
3333
<div>
3434
<b class="text-[var(--ink)] font-[500] not-italic">

app/components/ChronicleView.vue

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ const grouped = computed(() => {
9797
:id="`year-${year}`"
9898
>
9999
<span
100-
class="[font-family:var(--font-display)] font-[500] text-[clamp(72px,8vw,120px)] leading-[0.85] tracking-[-0.04em] tabular-nums text-[var(--ink)]"
100+
class="[font-family:var(--font-display)] font-[500] text-[clamp(72px,8vw,120px)] leading-[0.85] tabular-nums text-[var(--ink)]"
101101
aria-hidden="true"
102102
>
103103
{{ year }}
@@ -117,7 +117,7 @@ const grouped = computed(() => {
117117
</div>
118118

119119
<!-- Rows -->
120-
<ul class="list-none p-0 m-0 border-t border-[var(--rule-soft)]">
120+
<ol class="list-none p-0 m-0 border-t border-[var(--rule-soft)]">
121121
<li
122122
v-for="(s, i) in arr"
123123
:key="`${year}-${i}`"
@@ -130,7 +130,7 @@ const grouped = computed(() => {
130130
<span>{{ String(i + 1).padStart(2, "0") }}</span>
131131
</div>
132132
<div
133-
class="grid grid-cols-[minmax(0,300px)_minmax(0,1fr)] gap-[clamp(16px,2vw,32px)] items-baseline max-[700px]:grid-cols-1 max-[700px]:gap-[6px]"
133+
class="grid grid-cols-[minmax(0,200px)_minmax(0,1fr)] gap-[clamp(16px,2vw,32px)] items-baseline max-[700px]:grid-cols-1 max-[700px]:gap-[6px]"
134134
>
135135
<!-- Speaker names -->
136136
<div
@@ -159,20 +159,19 @@ const grouped = computed(() => {
159159
:href="s.url"
160160
target="_blank"
161161
rel="noopener noreferrer"
162-
class="text-[var(--ink-2)] no-underline hover:text-[var(--ink)]"
162+
class="text-[var(--ink-2)] no-underline group hover:text-[var(--ink)]"
163163
>
164164
<span
165165
v-if="s.format === 'panel'"
166-
class="relative top-[-1px] inline-flex items-center self-center align-middle [font-family:var(--font-mono)] text-[10px] uppercase tracking-[0.06em] border border-[var(--accent)] text-[var(--accent)] px-[5px] py-[1px] leading-[1.15] mr-[8px]"
166+
class="relative top-[-1px] inline-flex items-center self-center align-middle [font-family:var(--font-mono)] text-[10px] uppercase tracking-[0.06em] border border-[var(--ink)] text-[var(--ink)] px-[5px] py-[1px] leading-[1.15] mr-[8px]"
167167
>
168168
{{ t.session_format_panel }}
169169
</span>
170-
<span class="hover:underline">{{ s.title }}</span>
170+
<span class="group-hover:underline">{{ s.title }}</span>
171171
<span
172-
class="[font-family:var(--font-mono)] text-[12px] text-[var(--ink-2)] ml-[4px]"
173-
:aria-label="t.external"
172+
class="[font-family:var(--font-mono)] text-[10px] text-[var(--ink-2)] ml-[4px]"
174173
>
175-
174+
({{ t.external }})
176175
</span>
177176
</a>
178177
<span
@@ -184,7 +183,7 @@ const grouped = computed(() => {
184183
</div>
185184
</div>
186185
</li>
187-
</ul>
186+
</ol>
188187
</li>
189188
</ol>
190189
</section>

app/components/DirectoryView.vue

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -109,24 +109,24 @@ function toggleRow(name: string) {
109109
<button
110110
class="text-[12px] tracking-[0.06em] uppercase px-[10px] py-[5px] border cursor-pointer whitespace-nowrap"
111111
:class="
112-
sort === 'name'
112+
sort === 'appearances'
113113
? 'bg-[var(--ink)] text-[var(--paper)] border-[var(--ink)]'
114114
: 'border-[var(--rule-soft)] text-[var(--ink-3)] hover:text-[var(--ink)] hover:border-[var(--ink)]'
115115
"
116-
@click="sort = 'name'"
116+
@click="sort = 'appearances'"
117117
>
118-
Name A→Z
118+
Appearances ↓
119119
</button>
120120
<button
121121
class="text-[12px] tracking-[0.06em] uppercase px-[10px] py-[5px] border cursor-pointer whitespace-nowrap"
122122
:class="
123-
sort === 'appearances'
123+
sort === 'name'
124124
? 'bg-[var(--ink)] text-[var(--paper)] border-[var(--ink)]'
125125
: 'border-[var(--rule-soft)] text-[var(--ink-3)] hover:text-[var(--ink)] hover:border-[var(--ink)]'
126126
"
127-
@click="sort = 'appearances'"
127+
@click="sort = 'name'"
128128
>
129-
Appearances ↓
129+
Name A→Z
130130
</button>
131131
<button
132132
class="text-[12px] tracking-[0.06em] uppercase px-[10px] py-[5px] border cursor-pointer whitespace-nowrap"
@@ -236,8 +236,7 @@ function toggleRow(name: string) {
236236
<li
237237
v-for="(talk, k) in rec.talks"
238238
:key="k"
239-
class="grid gap-[16px] items-baseline py-[6px] border-t border-[var(--rule-softer)]"
240-
style="grid-template-columns: 56px minmax(0, 1fr) auto"
239+
class="grid grid-cols-[30px_1fr] gap-[16px] items-baseline py-[6px] border-t border-[var(--rule-softer)]"
241240
:class="k === 0 ? 'border-t-0' : ''"
242241
>
243242
<a
@@ -246,41 +245,42 @@ function toggleRow(name: string) {
246245
>
247246
{{ talk.year }}
248247
</a>
249-
<a
250-
class="text-[14px] text-[var(--ink)] pb-[1px] leading-[1.45] no-underline"
251-
:href="talk.url"
252-
target="_blank"
253-
rel="noopener noreferrer"
254-
>
255-
<span
256-
v-if="talk.format === 'panel'"
257-
class="relative top-[-1px] inline-flex items-center self-center align-middle [font-family:var(--font-mono)] text-[10px] uppercase tracking-[0.06em] border border-[var(--accent)] text-[var(--accent)] px-[5px] py-[1px] leading-[1.15] mr-[8px]"
248+
<div class="flex flex-col gap-y-[8px]">
249+
<a
250+
class="text-[14px] text-[var(--ink)] pb-[1px] leading-[1.45] no-underline group"
251+
:href="talk.url"
252+
target="_blank"
253+
rel="noopener noreferrer"
258254
>
259-
{{ t.session_format_panel }}
260-
</span>
261-
<span class="hover:underline">{{ talk.title || t.tbd }}</span>
255+
<span
256+
v-if="talk.format === 'panel'"
257+
class="relative top-[-1px] inline-flex items-center self-center align-middle [font-family:var(--font-mono)] text-[10px] uppercase tracking-[0.06em] border border-[var(--ink)] text-[var(--ink)] px-[5px] py-[1px] leading-[1.15] mr-[8px]"
258+
>
259+
{{ t.session_format_panel }}
260+
</span>
261+
<span class="group-hover:underline">{{ talk.title || t.tbd }}</span>
262+
<span
263+
class="[font-family:var(--font-mono)] text-[10px] text-[var(--ink-2)] ml-[4px]"
264+
>
265+
({{ t.external }})
266+
</span>
267+
</a>
262268
<span
263-
class="[font-family:var(--font-mono)] text-[12px] text-[var(--ink-2)] ml-[4px]"
264-
:aria-label="t.external"
269+
v-if="talk.coSpeakers.length > 0"
270+
class="text-[12px] [font-family:var(--font-mono)] text-[var(--ink-3)]"
265271
>
266-
272+
w/
273+
<template v-for="(cn, ci) in talk.coSpeakers" :key="cn">
274+
<template v-if="ci > 0">,</template>
275+
<a
276+
class="text-[var(--ink)] border-b border-[var(--rule-soft)] pb-[1px] no-underline hover:border-[var(--ink)]"
277+
:href="`/speakers/${encodeURIComponent(cn)}`"
278+
>
279+
{{ cn }}
280+
</a>
281+
</template>
267282
</span>
268-
</a>
269-
<span
270-
v-if="talk.coSpeakers.length > 0"
271-
class="text-[12px] [font-family:var(--font-mono)] text-[var(--ink-3)]"
272-
>
273-
w/
274-
<template v-for="(cn, ci) in talk.coSpeakers" :key="cn">
275-
<template v-if="ci > 0">,</template>
276-
<a
277-
class="text-[var(--ink)] border-b border-[var(--rule-soft)] pb-[1px] no-underline hover:border-[var(--ink)]"
278-
:href="`/speakers/${encodeURIComponent(cn)}`"
279-
>
280-
{{ cn }}
281-
</a>
282-
</template>
283-
</span>
283+
</div>
284284
</li>
285285
</ol>
286286
</div>

app/composables/useVfjsI18n.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ export interface VfjsTranslations {
2727
back_top: string;
2828
official_site: string;
2929
related_talks: string;
30+
all_speakers: string;
31+
not_found_title: string;
32+
not_found_description: string;
3033
year_total_talks: (n: number) => string;
3134
appearance_count: (n: number) => string;
3235
}
@@ -53,13 +56,16 @@ const translations: Record<"ja" | "en", VfjsTranslations> = {
5356
color_scheme_system: "システム",
5457
empty: "該当するスピーカーが見つかりません。",
5558
tbd: "タイトル未定",
56-
external: "外部リンク",
59+
external: "外部サイトへ移動",
5760
session_format_panel: "パネル",
5861
speaker_profile: "スピーカー",
5962
years_appeared: "登壇年",
6063
back_top: "TOPページに戻る",
6164
official_site: "公式サイト",
6265
related_talks: "発表一覧",
66+
all_speakers: "発表者一覧",
67+
not_found_title: "ページが見つかりません",
68+
not_found_description: "指定されたページは存在しないか、移動した可能性があります。",
6369
year_total_talks: (n: number) => `全 ${n} 発表`,
6470
appearance_count: (n: number) => `${n}回登壇`,
6571
},
@@ -84,13 +90,16 @@ const translations: Record<"ja" | "en", VfjsTranslations> = {
8490
color_scheme_system: "System",
8591
empty: "No speakers match the current filters.",
8692
tbd: "TBD",
87-
external: "External",
93+
external: "External Site",
8894
session_format_panel: "Panel",
8995
speaker_profile: "Speaker",
9096
years_appeared: "Appeared in",
9197
back_top: "Back to top page",
9298
official_site: "Official site",
9399
related_talks: "Talks",
100+
all_speakers: "Speakers",
101+
not_found_title: "Page Not Found",
102+
not_found_description: "The page you requested does not exist or may have moved.",
94103
year_total_talks: (n: number) => `${n} talks total`,
95104
appearance_count: (n: number) => `${n} appearance${n > 1 ? "s" : ""}`,
96105
},

app/islands/HomePageIsland.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ const stats = computed(() => {
4141
for (const speaker of props.allSpeakers) {
4242
speaker.name.forEach((name) => speakerSet.add(name));
4343
}
44-
return { speakers: speakerSet.size, talks: props.allSpeakers.length, years: YEARS.length };
44+
return {
45+
speakers: speakerSet.size,
46+
talks: props.allSpeakers.length,
47+
years: YEARS.length,
48+
};
4549
});
4650
</script>
4751

0 commit comments

Comments
 (0)