feat: modernized web application
This commit is contained in:
34
nextjs/src/app/about/page.tsx
Normal file
34
nextjs/src/app/about/page.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
import style from '@/styles/web.module.scss';
|
||||
|
||||
export default function AboutPage() {
|
||||
return (
|
||||
<div className={style.guideBody}>
|
||||
<h2>About</h2>
|
||||
<hr />
|
||||
<div className={style.aboutNoticeBlock}>
|
||||
<br />
|
||||
<p>
|
||||
Covid-19
|
||||
の影響で、オフライン大会の実施なども困難であるため、オンラインによるランキングバトル(通称:ストレイシープ杯)を開催することになりました。
|
||||
</p>
|
||||
<p>
|
||||
先日発売されたSwitch版+各自の配信設備を用いて大会を実施するため、まずは少人数で進めていきます。(まずは第0回を実験的に開催)
|
||||
</p>
|
||||
<p>
|
||||
キャサリンの対戦は、決着はわかりやすいですが、使われているテクニックなどが分かるともっと楽しめると思うので、解説なども交えながら実施する予定です。
|
||||
</p>
|
||||
<p>悪い点は改善し、良い点はつづけながら、継続的に続けていきたいと思います。</p>
|
||||
<p>
|
||||
もっとこうしてみては?次の大会から参加したい!などございましたら問い合わせフォームからご意見下さい!
|
||||
</p>
|
||||
<p>それでは、楽しんでいくめぇ。~</p>
|
||||
<div className={style.sheepAbout} />
|
||||
<div className={style.aboutContactBox}>
|
||||
<a href="https://forms.gle/Dn4p7cFEPLK1zcTz5" rel="noopener noreferrer" target="_blank">
|
||||
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
15
nextjs/src/app/api/archive/route.ts
Normal file
15
nextjs/src/app/api/archive/route.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
import { getArchiveItems } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET() {
|
||||
try {
|
||||
const data = await getArchiveItems();
|
||||
return NextResponse.json(data);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return NextResponse.json([], { status: 500 });
|
||||
}
|
||||
}
|
||||
15
nextjs/src/app/api/contact/route.ts
Normal file
15
nextjs/src/app/api/contact/route.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
import { getContactItems } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET() {
|
||||
try {
|
||||
const data = await getContactItems();
|
||||
return NextResponse.json(data);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return NextResponse.json([], { status: 500 });
|
||||
}
|
||||
}
|
||||
15
nextjs/src/app/api/guide/route.ts
Normal file
15
nextjs/src/app/api/guide/route.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
import { getGuideItems } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET() {
|
||||
try {
|
||||
const data = await getGuideItems();
|
||||
return NextResponse.json(data);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return NextResponse.json([], { status: 500 });
|
||||
}
|
||||
}
|
||||
23
nextjs/src/app/api/players/[key]/route.ts
Normal file
23
nextjs/src/app/api/players/[key]/route.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
import { getPlayersForTournament } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
type RouteContext = {
|
||||
params: Promise<{ key: string }>;
|
||||
};
|
||||
|
||||
export async function GET(_request: Request, context: RouteContext) {
|
||||
try {
|
||||
const { key } = await context.params;
|
||||
const data = await getPlayersForTournament(key);
|
||||
if (data === null) {
|
||||
return NextResponse.json({ error: 'Tournament not found' }, { status: 404 });
|
||||
}
|
||||
return NextResponse.json(data);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return NextResponse.json([], { status: 500 });
|
||||
}
|
||||
}
|
||||
15
nextjs/src/app/api/players/route.ts
Normal file
15
nextjs/src/app/api/players/route.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
import { getAllPlayers } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET() {
|
||||
try {
|
||||
const data = await getAllPlayers();
|
||||
return NextResponse.json(data);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return NextResponse.json([], { status: 500 });
|
||||
}
|
||||
}
|
||||
9
nextjs/src/app/archive/page.tsx
Normal file
9
nextjs/src/app/archive/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
import { ArchiveVideoList } from '@/components/ArchiveVideoList';
|
||||
import { getArchiveItems } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export default async function ArchivePage() {
|
||||
const items = await getArchiveItems();
|
||||
return <ArchiveVideoList items={items} />;
|
||||
}
|
||||
9
nextjs/src/app/contact/page.tsx
Normal file
9
nextjs/src/app/contact/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
import { ContactList } from '@/components/ContactList';
|
||||
import { getContactItems } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export default async function ContactPage() {
|
||||
const items = await getContactItems();
|
||||
return <ContactList items={items} />;
|
||||
}
|
||||
17
nextjs/src/app/globals.css
Normal file
17
nextjs/src/app/globals.css
Normal file
@@ -0,0 +1,17 @@
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--font-mplus), -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto',
|
||||
sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
|
||||
monospace;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
min-height: 100%;
|
||||
}
|
||||
9
nextjs/src/app/guide/page.tsx
Normal file
9
nextjs/src/app/guide/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
import { GuideVideoList } from '@/components/GuideVideoList';
|
||||
import { getGuideItems } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export default async function GuidePage() {
|
||||
const items = await getGuideItems();
|
||||
return <GuideVideoList items={items} />;
|
||||
}
|
||||
46
nextjs/src/app/layout.tsx
Normal file
46
nextjs/src/app/layout.tsx
Normal file
@@ -0,0 +1,46 @@
|
||||
import type { Metadata, Viewport } from 'next';
|
||||
import { Indie_Flower, M_PLUS_Rounded_1c } from 'next/font/google';
|
||||
import type { ReactNode } from 'react';
|
||||
|
||||
import { I18nProvider } from '@/components/I18nProvider';
|
||||
import { SiteLayout } from '@/components/SiteLayout';
|
||||
|
||||
import 'semantic-ui-css/semantic.min.css';
|
||||
import './globals.css';
|
||||
|
||||
const indieFlower = Indie_Flower({
|
||||
weight: '400',
|
||||
subsets: ['latin'],
|
||||
variable: '--font-indie',
|
||||
display: 'swap',
|
||||
});
|
||||
|
||||
const mPlusRounded = M_PLUS_Rounded_1c({
|
||||
weight: ['400', '700'],
|
||||
subsets: ['latin'],
|
||||
variable: '--font-mplus',
|
||||
display: 'swap',
|
||||
adjustFontFallback: false,
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'キャサリン faito crab',
|
||||
description: 'キャサリン faito crab',
|
||||
manifest: '/manifest.json',
|
||||
};
|
||||
|
||||
export const viewport: Viewport = {
|
||||
themeColor: '#ff2d7c',
|
||||
};
|
||||
|
||||
export default function RootLayout({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<html lang="ja" className={`${indieFlower.variable} ${mPlusRounded.variable}`}>
|
||||
<body>
|
||||
<I18nProvider>
|
||||
<SiteLayout>{children}</SiteLayout>
|
||||
</I18nProvider>
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
7
nextjs/src/app/not-found.tsx
Normal file
7
nextjs/src/app/not-found.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function NotFound() {
|
||||
return (
|
||||
<div>
|
||||
<p>404</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
34
nextjs/src/app/page.tsx
Normal file
34
nextjs/src/app/page.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
import style from '@/styles/web.module.scss';
|
||||
|
||||
export default function HomePage() {
|
||||
return (
|
||||
<div className={style.mainBody}>
|
||||
<div className={style.evojapan2025} />
|
||||
<div className={style.padding} />
|
||||
<div className={style.evojapan2023kaisaikettei} />
|
||||
<div className={style.padding} />
|
||||
<div className={style.group}>
|
||||
<div className={style.evojapan2023catherinetonamel}>
|
||||
<a href="https://tonamel.com/competition/VD6y8" rel="noopener noreferrer" target="_blank">
|
||||
|
||||
</a>
|
||||
</div>
|
||||
<div className={style.evojapan2023catherinefullbodytonamel}>
|
||||
<a href="https://tonamel.com/competition/dgdQ9" rel="noopener noreferrer" target="_blank">
|
||||
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div className={style.padding} />
|
||||
<div className={style.twitchHome}>
|
||||
<a
|
||||
href="https://www.twitch.tv/catherine_faito_crab"
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
9
nextjs/src/app/players/page.tsx
Normal file
9
nextjs/src/app/players/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
import { PlayersList } from '@/components/PlayersList';
|
||||
import { getAllPlayers } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export default async function PlayersPage() {
|
||||
const players = await getAllPlayers();
|
||||
return <PlayersList players={players} />;
|
||||
}
|
||||
19
nextjs/src/app/tournaments/[tournament_key]/players/page.tsx
Normal file
19
nextjs/src/app/tournaments/[tournament_key]/players/page.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import { notFound } from 'next/navigation';
|
||||
|
||||
import { PlayersList } from '@/components/PlayersList';
|
||||
import { getPlayersForTournament } from '@/lib/data';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
type PageProps = {
|
||||
params: Promise<{ tournament_key: string }>;
|
||||
};
|
||||
|
||||
export default async function TournamentPlayersPage({ params }: PageProps) {
|
||||
const { tournament_key } = await params;
|
||||
const players = await getPlayersForTournament(tournament_key);
|
||||
if (players === null) {
|
||||
notFound();
|
||||
}
|
||||
return <PlayersList players={players} />;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import style from '@/styles/web.module.scss';
|
||||
|
||||
export default function ScoreboardPage() {
|
||||
return (
|
||||
<div className={style.mainBody}>
|
||||
<div className={style.scoreboardImage} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
7
nextjs/src/app/tournaments/page.tsx
Normal file
7
nextjs/src/app/tournaments/page.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
export default function TournamentsPage() {
|
||||
return (
|
||||
<div>
|
||||
<p>Tournaments</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user