First Commit

This commit is contained in:
Last2014 2025-10-27 05:00:02 +09:00
commit 5d3fb2a5d0
37 changed files with 4118 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@ -0,0 +1,24 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/

43
README.md Normal file
View File

@ -0,0 +1,43 @@
# Astro Starter Kit: Minimal
```sh
pnpm create astro@latest -- --template minimal
```
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
## 🚀 Project Structure
Inside of your Astro project, you'll see the following folders and files:
```text
/
├── public/
├── src/
│ └── pages/
│ └── index.astro
└── package.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
Any static assets, like images, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `pnpm install` | Installs dependencies |
| `pnpm dev` | Starts local dev server at `localhost:4321` |
| `pnpm build` | Build your production site to `./dist/` |
| `pnpm preview` | Preview your build locally, before deploying |
| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` |
| `pnpm astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).

11
astro.config.ts Normal file
View File

@ -0,0 +1,11 @@
// @ts-check
import { defineConfig } from "astro/config";
import tailwindcss from "@tailwindcss/vite";
// https://astro.build/config
export default defineConfig({
vite: {
plugins: [tailwindcss()],
},
site: "https://about.last2014.com",
});

17
package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "www",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@tailwindcss/vite": "^4.1.14",
"astro": "^5.14.6",
"sharp": "^0.34.4",
"tailwindcss": "^4.1.14"
}
}

3455
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

3
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,3 @@
onlyBuiltDependencies:
- esbuild
- sharp

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

1
public/icons/cake.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M160-80q-17 0-28.5-11.5T120-120v-200q0-33 23.5-56.5T200-400v-160q0-33 23.5-56.5T280-640h160v-58q-18-12-29-29t-11-41q0-15 6-29.5t18-26.5l56-56 56 56q12 12 18 26.5t6 29.5q0 24-11 41t-29 29v58h160q33 0 56.5 23.5T760-560v160q33 0 56.5 23.5T840-320v200q0 17-11.5 28.5T800-80H160Zm120-320h400v-160H280v160Zm-80 240h560v-160H200v160Zm80-240h400-400Zm-80 240h560-560Zm560-240H200h560Z"/></svg>

After

Width:  |  Height:  |  Size: 503 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-80h80v80h320v-80h80v80h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Z"/></svg>

After

Width:  |  Height:  |  Size: 327 B

1
public/icons/contact.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M480-400q33 0 56.5-23.5T560-480q0-33-23.5-56.5T480-560q-33 0-56.5 23.5T400-480q0 33 23.5 56.5T480-400ZM320-240h320v-23q0-24-13-44t-36-30q-26-11-53.5-17t-57.5-6q-30 0-57.5 6T369-337q-23 10-36 30t-13 44v23ZM720-80H240q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80Zm0-80v-446L526-800H240v640h480Zm-480 0v-640 640Z"/></svg>

After

Width:  |  Height:  |  Size: 481 B

1
public/icons/gender.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M220-80v-300h-60v-220q0-33 23.5-56.5T240-680h120q33 0 56.5 23.5T440-600v220h-60v300H220Zm80-640q-33 0-56.5-23.5T220-800q0-33 23.5-56.5T300-880q33 0 56.5 23.5T380-800q0 33-23.5 56.5T300-720ZM600-80v-240H480l102-306q8-26 29.5-40t48.5-14q27 0 48.5 14t29.5 40l102 306H720v240H600Zm60-640q-33 0-56.5-23.5T580-800q0-33 23.5-56.5T660-880q33 0 56.5 23.5T740-800q0 33-23.5 56.5T660-720Z"/></svg>

After

Width:  |  Height:  |  Size: 502 B

1
public/icons/gitea.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640" xml:space="preserve" width="32" height="32"><path style="fill:#fff" d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12z"/><path style="fill:#609926" d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6zM125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1zm300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1z"/><path style="fill:#609926" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M480-480q33 0 56.5-23.5T560-560q0-33-23.5-56.5T480-640q-33 0-56.5 23.5T400-560q0 33 23.5 56.5T480-480Zm0 294q122-112 181-203.5T720-552q0-109-69.5-178.5T480-800q-101 0-170.5 69.5T240-552q0 71 59 162.5T480-186Zm0 106Q319-217 239.5-334.5T160-552q0-150 96.5-239T480-880q127 0 223.5 89T800-552q0 100-79.5 217.5T480-80Zm0-480Z"/></svg>

After

Width:  |  Height:  |  Size: 445 B

1
public/icons/mail.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm320-280L160-640v400h640v-400L480-440Zm0-80 320-200H160l320 200ZM160-640v-80 480-400Z"/></svg>

After

Width:  |  Height:  |  Size: 330 B

BIN
public/icons/mistems.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
public/icons/nicovideo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
public/icons/qiita.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

1
public/icons/rss.svg Normal file
View File

@ -0,0 +1 @@
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#FFA500"><title>RSS</title><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg>

After

Width:  |  Height:  |  Size: 417 B

BIN
public/icons/uwuzunet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
public/icons/wakatime.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

1
public/icons/world.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-155.5t86-127Q252-817 325-848.5T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 82-31.5 155t-86 127.5q-54.5 54.5-127 86T480-80Zm0-82q26-36 45-75t31-83H404q12 44 31 83t45 75Zm-104-16q-18-33-31.5-68.5T322-320H204q29 50 72.5 87t99.5 55Zm208 0q56-18 99.5-55t72.5-87H638q-9 38-22.5 73.5T584-178ZM170-400h136q-3-20-4.5-39.5T300-480q0-21 1.5-40.5T306-560H170q-5 20-7.5 39.5T160-480q0 21 2.5 40.5T170-400Zm216 0h188q3-20 4.5-39.5T580-480q0-21-1.5-40.5T574-560H386q-3 20-4.5 39.5T380-480q0 21 1.5 40.5T386-400Zm268 0h136q5-20 7.5-39.5T800-480q0-21-2.5-40.5T790-560H654q3 20 4.5 39.5T660-480q0 21-1.5 40.5T654-400Zm-16-240h118q-29-50-72.5-87T584-782q18 33 31.5 68.5T638-640Zm-234 0h152q-12-44-31-83t-45-75q-26 36-45 75t-31 83Zm-200 0h118q9-38 22.5-73.5T376-782q-56 18-99.5 55T204-640Z"/></svg>

After

Width:  |  Height:  |  Size: 976 B

BIN
public/icons/yahoo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

9
public/icons/zenn.svg Normal file
View File

@ -0,0 +1,9 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 88.3 88.3" style="enable-background:new 0 0 88.3 88.3;" xml:space="preserve">
<g fill="#3EA8FF">
<path class="st0" d="M3.9,83.3h17c0.9,0,1.7-0.5,2.2-1.2L69.9,5.2c0.6-1-0.1-2.2-1.3-2.2H52.5c-0.8,0-1.5,0.4-1.9,1.1L3.1,81.9
C2.8,82.5,3.2,83.3,3.9,83.3z"/>
<path class="st0" d="M62.5,82.1l22.1-35.5c0.7-1.1-0.1-2.5-1.4-2.5h-16c-0.6,0-1.2,0.3-1.5,0.8L43,81.2c-0.6,0.9,0.1,2.1,1.2,2.1
h16.3C61.3,83.3,62.1,82.9,62.5,82.1z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 565 B

BIN
public/last2014.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

43
src/components/Card.astro Normal file
View File

@ -0,0 +1,43 @@
---
export interface Props {
title: string;
description: string;
img: string;
href?: URL;
isFullWidth?: true;
}
---
<a class={`
flex
flex-grow
items-center
${Astro.props.isFullWidth
? "w-full"
: "w-fit"}
p-3
rounded
shadow-sm
mb-3
bg-white
text-black
`} href={Astro.props.href} target="_blank">
<img
src={new URL(`/icons/${Astro.props.img}`, Astro.url.origin).toString()}
alt="アイコン"
class={`
w-10
h-10
rounded
mr-5
object-contain
border
border-neutral-200
shadow-xs
`}
/>
<div class="flex flex-col">
<span class="text-lg">{Astro.props.title}</span>
<span class="text-xs">{Astro.props.description}</span>
</div>
</a>

View File

@ -0,0 +1,24 @@
---
function getYears(start: number) {
const currentYear = new Date().getFullYear();
if (currentYear > start) {
return `${start}-${currentYear}`;
} else {
return String(start);
}
}
---
<footer class={`
p-[2em]
bg-gray-200
text-slate-500
text-center
text-[16px]
font-[BIZ_UDPGothic]
`}>
&copy; {getYears(2025)} Last2014. All rights reserved.
</footer>
<style>
@import url("https://fonts.googleapis.com/css2?family=BIZ+UDPGothic&display=swap");
</style>

View File

@ -0,0 +1,41 @@
---
import Link from "@/components/header/Link.astro";
---
<header class={`
backdrop-blur-sm
bg-white/80
m-auto
mx-5
mb-8
top-[1rem]
rounded-[1em]
h-[5rem]
sticky
p-[1em]
flex
items-center
justify-center
shadow-sm
`}>
<a class={`
flex
items-center
font-[Atkinson_Hyperlegible]
font-lg
`} href="/">
<img
src={new URL("/last2014.png", Astro.url.origin).toString()}
alt="アバター"
class={`
w-10
mr-2
!rounded-[100%]
`}
/>
Last2014
</a>
</header>
<style>
@import url("https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&display=swap");
</style>

View File

@ -0,0 +1,27 @@
---
import type { HTMLAttributes } from "astro/types";
type Props = HTMLAttributes<"a">;
const { href, class: className, ...props } = Astro.props;
const pathname = Astro.url.pathname.replace(/\/$/, "");
const isActive = href === "/"
? pathname === ""
: pathname === href
---
<a
class={`
${isActive && `
font-bold
underline
decoration-blue-500
decoration-3
underline-offset-5
`}
`}
href={href}
{...props}
>
<slot />
</a>

28
src/constants/contacts.ts Normal file
View File

@ -0,0 +1,28 @@
import { type Props as CardProps } from "@/components/Card.astro";
export default [
{
title: "お問い合わせフォーム",
description: "メールアドレスが必要です",
img: "contact.svg",
href: new URL("https://last2014.com/contact"),
},
{
title: "メール(last2014.com)",
description: "info@last2014.com",
img: "mail.svg",
href: new URL("mailto:info@last2014.com"),
},
{
title: "メール(yahoo.co.jp)",
description: "last2014yh@yahoo.co.jp",
img: "mail.svg",
href: new URL("mailto:last2014yh@yahoo.co.jp"),
},
{
title: "Activity Pub",
description: "@last2014@misskey.systems",
img: "mistems.png",
href: new URL("https://misskey.systems/@last2014"),
},
] as CardProps[];

29
src/constants/details.ts Normal file
View File

@ -0,0 +1,29 @@
import { type Props as CardProps } from "@/components/Card.astro";
export default [
{
title: "活動開始日",
description: "2025/5/31",
img: "calendar.svg",
},
{
title: "誕生日",
description: "2014/12/8",
img: "cake.svg",
},
{
title: "場所",
description: "神奈川県",
img: "location.svg",
},
{
title: "性別",
description: "男性",
img: "gender.svg",
},
{
title: "出身",
description: "神奈川県川崎市",
img: "world.svg",
},
] as CardProps[];

58
src/constants/links.ts Normal file
View File

@ -0,0 +1,58 @@
import { type Props as CardProps } from "@/components/Card.astro";
export default [
{
title: "Last2014's Blog",
description: "@last2014@last2014.com",
img: "rss.svg",
href: new URL("https://last2014.com"),
},
{
title: "WakaTime",
description: "@last2014@wakatime.com",
img: "wakatime.png",
href: new URL("https://wakatime.com/@last2014"),
},
{
title: "Gitea",
description: "@last2014@gitea.last2014.com",
img: "gitea.svg",
href: new URL("https://gitea.last2014.com/last2014"),
},
{
title: "みすてむず いず みすきーしすてむず",
description: "@last2014@misskey.systems",
img: "mistems.png",
href: new URL("https://misskey.systems/@last2014"),
},
{
title: "ゆずねっと",
description: "@last2014@uwuzu.net",
img: "uwuzunet.png",
href: new URL("https://uwuzu.net/@last2014"),
},
{
title: "Zenn",
description: "@last2014@zenn.dev",
img: "zenn.svg",
href: new URL("https://zenn.dev/last2014"),
},
{
title: "Qiita",
description: "@last2014@qiita.com",
img: "qiita.png",
href: new URL("https://qiita.com/last2014"),
},
{
title: "ニコニコ動画",
description: "@140339612@nicovideo.jp",
img: "nicovideo.png",
href: new URL("https://nicovideo.jp/user/140339612"),
},
{
title: "Yahoo! 知恵袋",
description: "@1154047737@chiebukuro.yahoo.co.jp",
img: "yahoo.png",
href: new URL("https://chiebukuro.yahoo.co.jp/user/1154047737"),
},
] as CardProps[];

74
src/layouts/Layout.astro Normal file
View File

@ -0,0 +1,74 @@
---
import Header from "@/components/header/Header.astro";
import Footer from "@/components/Footer.astro";
import "@/styles/global.css";
import "@/styles/tailwind.css";
interface Props {
title?: string;
description?: string;
}
const title = Astro.props.title
? Astro.props.title + " - Last2014"
: "Last2014";
---
<!DOCTYPE HTML>
<html lang="ja" prefix="og: https://ogp.me/ns#">
<head>
<!-- Global -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="generator" content={Astro.generator} />
<link rel="icon" href="/favicon.ico" />
<meta name="color-scheme" content="light dark" />
{Astro.site && (
<link rel="canonical" href={Astro.site.href} />
)}
<!-- Primary -->
{Astro.props.description && (
<meta name="description" content={Astro.props.description} />
)}
<title>{title}</title>
<meta name="title" content={title}>
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:url" content={Astro.url.href} />
<meta property="og:site_name" content="Last2014" />
<meta property="og:title" content={Astro.props.title ?? "Last2014"} />
{Astro.props.description && (
<meta property="og:description" content={Astro.props.description}>
)}
<meta property="og:locale" content="ja_JP" />
<meta property="og:image" content={new URL("/last2014.png", Astro.url)} />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary">
<meta name="twitter:url" content={Astro.url.href}>
<meta name="twitter:domain" content={Astro.url.hostname} />
<meta name="twitter:title" content={title}>
{Astro.props.description && (
<meta name="twitter:description" content={Astro.props.description}>
)}
<meta name="twitter:image" content={new URL("/last2014.png", Astro.url)}>
<!-- Astro -->
</head>
<body class={`
bg-neutral-100
text-black
min-h-screen
flex
flex-col
`}>
<Header />
<main class={`
flex
flex-grow
flex-col
items-center
`}>
<slot />
</main>
<Footer />
</body>
</html>

24
src/pages/404.astro Normal file
View File

@ -0,0 +1,24 @@
---
import Layout from "@/layouts/Layout.astro";
const legacyLink = new URL(Astro.url.pathname, "https://last2014.com").toString();
---
<Layout>
<span class="text-4xl font-bold">Not Found</span>
<p><code>{Astro.url.pathname}</code>が見つかりませんでした。</p>
<span class="mt-3 text-2xl">もしかして...</span>
<p>
<a
href="https://legacy.last2014.com"
class="underline text-blue-500"
>従来のサイト</a>のページをお探しですか?
</p>
<a
class="underline text-blue-500"
href={legacyLink}
>
<code>{legacyLink}</code>に移動できます
</a>
</Layout>

96
src/pages/index.astro Normal file
View File

@ -0,0 +1,96 @@
---
import Layout from "@/layouts/Layout.astro";
import Card from "@/components/Card.astro";
import details from "@/constants/details";
import links from "@/constants/links";
import contacts from "@/constants/contacts";
---
<Layout>
<div class={`
flex
justify-between
bg-white
shadow-sm
w-fit
rounded
p-5
`}>
<img
src={new URL("/last2014.png", Astro.url.origin).toString()}
alt="アバター"
class={`
w-15
h-15
mr-2
!rounded-[100%]
`}
/>
<div class="flex flex-grow flex-col">
<span class="text-xl font-bold">Last2014</span>
<p class="text-sm">
ウェブ開発一生やってる小学生です。<br />
TypeScriptをメインに色々作っています。
</p>
</div>
</div>
<div class={`
flex
flex-col
gap-3
w-full
p-5
`}>
<span class="font-bold text-4xl w-full mb-3">詳細</span>
{details.map((detail) => (
<Card
title={detail.title}
description={detail.description}
img={detail.img}
href={detail.href}
isFullWidth
/>
))}
</div>
<div class={`
flex
flex-wrap
gap-3
w-fit
p-5
`}>
<span class="font-bold text-4xl w-full mb-3">リンク</span>
{links.map((link) => (
<Card
title={link.title}
description={link.description}
img={link.img}
href={link.href}
/>
))}
</div>
<div class={`
flex
flex-col
gap-3
w-full
p-5
`}>
<span class="font-bold text-4xl w-full mb-3">連絡先</span>
{contacts.map((contact) => (
<Card
title={contact.title}
description={contact.description}
img={contact.img}
href={contact.href}
isFullWidth
/>
))}
</div>
</Layout>

90
src/styles/global.css Normal file
View File

@ -0,0 +1,90 @@
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400;700&display=swap");
@layer base {
*, ::after, ::before, ::backdrop, ::file-selector-button {
font-family: "Noto Sans JP";
font-weight: 400;
box-sizing: border-box;
margin: 0;
padding: 0;
border: 0 solid;
line-height: 1.7;
font-size: 18px;
word-wrap: break-word;
overflow-wrap: break-word;
}
a {
color: var(--color-blue-600);
}
}
html {
scroll-padding-top: 6rem;
overscroll-behavior: none;
}
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
margin-top: 1rem;
}
h1 {
font-size: 3.052em;
}
h2 {
font-size: 2.441em;
}
h3 {
font-size: 1.953em;
}
h4 {
font-size: 1.563em;
}
h5 {
font-size: 1.25em;
}
code {
padding: 2px 5px;
background-color: var(--color-gray-300);
color: var(--color-black);
border-radius: 2px;
}
pre {
padding: 1.5em;
border-radius: 8px;
}
pre > code {
all: unset;
}
strong, b {
font-weight: 700;
}
textarea {
width: 100%;
font-size: 16px;
}
input {
font-size: 16px;
}
table {
width: 100%;
}
blockquote {
border-left: 4px solid var(--color-blue-600);
padding: 0 0 0 20px;
margin: 0px;
font-size: 1.333em;
}

1
src/styles/tailwind.css Normal file
View File

@ -0,0 +1 @@
@import "tailwindcss";

12
tsconfig.json Normal file
View File

@ -0,0 +1,12 @@
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"],
"compilerOptions": {
"strictNullChecks": true,
"paths": {
"@/*": ["./src/*"],
"assets/*": ["./src/assets/*"],
},
},
}