13 Commits

Author SHA1 Message Date
tuna2134
8189dee012 update dependencies in pnpm-lock.yaml to latest versions 2026-06-09 22:15:22 +09:00
tuna2134
bc79b64b61 update dependencies and devDependencies in package.json 2026-06-09 22:14:54 +09:00
tuna2134
f8a0eb8442 add renovate configuration file 2026-06-09 22:14:37 +09:00
tuna2134
30e5141727 add additional introduction details to Profile component 2026-06-09 22:10:49 +09:00
tuna2134
1f0c8a3333 fix 2026-05-27 12:33:51 +09:00
tuna2134
0784d78f8c add 2026-05-27 12:32:56 +09:00
tuna2134
7b05257b7d aaa 2026-05-27 12:31:24 +09:00
tuna2134
ab1611b6ea fix 2026-05-27 12:30:33 +09:00
tuna2134
a09f9aa6dc fix 2026-05-27 12:26:37 +09:00
tuna2134
4a754c8b87 fix 2026-05-27 12:25:29 +09:00
tuna2134
6c9d788095 fix 2026-05-27 12:20:05 +09:00
tuna2134
e08b5c475c fixed 2026-05-27 08:08:39 +09:00
tuna2134
efaa624b51 fixed 2026-05-27 08:07:11 +09:00
12 changed files with 295 additions and 136 deletions

30
.github/workflows/ghcr.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Push to github container register
on:
push:
branches: [main]
workflow_dispatch:
jobs:
push-docker:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: git.neody.ad.jp
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push image
uses: docker/build-push-action@v7
with:
context: .
push: true
tags: |
git.neody.ad.jp/tuna2134/cecilia:latest

3
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"recommendations": ["bradlc.vscode-tailwindcss"]
}

27
Dockerfile Normal file
View File

@@ -0,0 +1,27 @@
FROM node:24-slim AS builder
WORKDIR /src
ENV OUTPUT=standalone
RUN corepack enable
COPY pnpm-lock.yaml package.json .
RUN pnpm install --frozen-lockfile --ignore-scripts
RUN pnpm approve-builds sharp
RUN pnpm rebuild sharp
COPY . .
RUN pnpm build
FROM gcr.io/distroless/nodejs24-debian12
# ENV NODE_ENV=production
WORKDIR /usr/src
COPY --chown=nonroot:nonroot ./public ./public
COPY --from=builder --chown=nonroot:nonroot /src/.next/standalone ./
COPY --from=builder --chown=nonroot:nonroot /src/.next/static ./.next/static
USER nonroot
EXPOSE 3000
CMD ["server.js"]

View File

@@ -5,4 +5,8 @@ const nextConfig: NextConfig = {
reactCompiler: true, reactCompiler: true,
}; };
if (process.env.OUTPUT === "standalone") {
nextConfig.output = "standalone";
}
export default nextConfig; export default nextConfig;

View File

@@ -10,18 +10,19 @@
"format": "biome format --write" "format": "biome format --write"
}, },
"dependencies": { "dependencies": {
"next": "16.2.6", "iconoir-react": "^7.11.0",
"react": "19.2.4", "next": "16.2.7",
"react-dom": "19.2.4" "react": "19.2.7",
"react-dom": "19.2.7"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "2.2.0", "@biomejs/biome": "2.4.16",
"@tailwindcss/postcss": "^4", "@tailwindcss/postcss": "^4",
"@types/node": "^20", "@types/node": "^25",
"@types/react": "^19", "@types/react": "^19",
"@types/react-dom": "^19", "@types/react-dom": "^19",
"babel-plugin-react-compiler": "1.0.0", "babel-plugin-react-compiler": "1.0.0",
"tailwindcss": "^4", "tailwindcss": "^4",
"typescript": "^5" "typescript": "^6"
} }
} }

230
pnpm-lock.yaml generated
View File

@@ -8,25 +8,28 @@ importers:
.: .:
dependencies: dependencies:
iconoir-react:
specifier: ^7.11.0
version: 7.11.0(react@19.2.7)
next: next:
specifier: 16.2.6 specifier: 16.2.7
version: 16.2.6(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) version: 16.2.7(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
react: react:
specifier: 19.2.4 specifier: 19.2.7
version: 19.2.4 version: 19.2.7
react-dom: react-dom:
specifier: 19.2.4 specifier: 19.2.7
version: 19.2.4(react@19.2.4) version: 19.2.7(react@19.2.7)
devDependencies: devDependencies:
'@biomejs/biome': '@biomejs/biome':
specifier: 2.2.0 specifier: 2.4.16
version: 2.2.0 version: 2.4.16
'@tailwindcss/postcss': '@tailwindcss/postcss':
specifier: ^4 specifier: ^4
version: 4.3.0 version: 4.3.0
'@types/node': '@types/node':
specifier: ^20 specifier: ^25
version: 20.19.41 version: 25.9.2
'@types/react': '@types/react':
specifier: ^19 specifier: ^19
version: 19.2.15 version: 19.2.15
@@ -40,8 +43,8 @@ importers:
specifier: ^4 specifier: ^4
version: 4.3.0 version: 4.3.0
typescript: typescript:
specifier: ^5 specifier: ^6
version: 5.9.3 version: 6.0.3
packages: packages:
@@ -61,59 +64,59 @@ packages:
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@biomejs/biome@2.2.0': '@biomejs/biome@2.4.16':
resolution: {integrity: sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==} resolution: {integrity: sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
hasBin: true hasBin: true
'@biomejs/cli-darwin-arm64@2.2.0': '@biomejs/cli-darwin-arm64@2.4.16':
resolution: {integrity: sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==} resolution: {integrity: sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@biomejs/cli-darwin-x64@2.2.0': '@biomejs/cli-darwin-x64@2.4.16':
resolution: {integrity: sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==} resolution: {integrity: sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@biomejs/cli-linux-arm64-musl@2.2.0': '@biomejs/cli-linux-arm64-musl@2.4.16':
resolution: {integrity: sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==} resolution: {integrity: sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
'@biomejs/cli-linux-arm64@2.2.0': '@biomejs/cli-linux-arm64@2.4.16':
resolution: {integrity: sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==} resolution: {integrity: sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@biomejs/cli-linux-x64-musl@2.2.0': '@biomejs/cli-linux-x64-musl@2.4.16':
resolution: {integrity: sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==} resolution: {integrity: sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
'@biomejs/cli-linux-x64@2.2.0': '@biomejs/cli-linux-x64@2.4.16':
resolution: {integrity: sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==} resolution: {integrity: sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@biomejs/cli-win32-arm64@2.2.0': '@biomejs/cli-win32-arm64@2.4.16':
resolution: {integrity: sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==} resolution: {integrity: sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@biomejs/cli-win32-x64@2.2.0': '@biomejs/cli-win32-x64@2.4.16':
resolution: {integrity: sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==} resolution: {integrity: sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -290,57 +293,57 @@ packages:
'@jridgewell/trace-mapping@0.3.31': '@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
'@next/env@16.2.6': '@next/env@16.2.7':
resolution: {integrity: sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==} resolution: {integrity: sha512-tMJizPlj6ZYpBMMdK8S0LJufrP4QTdR6pcv9KQ/bVETPAmg0j1mlHE9G2c38UyGHxoBapgwuj7XjbGJ2RcDFOg==}
'@next/swc-darwin-arm64@16.2.6': '@next/swc-darwin-arm64@16.2.7':
resolution: {integrity: sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==} resolution: {integrity: sha512-vm1EDI/pVaBNNiychmxk3fft+OhQPVD9cIM/tReLZIQ3TfQ4kqI9DwKk00dzuS1ulC7icbrzCFrmRRlk9PfNdw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@next/swc-darwin-x64@16.2.6': '@next/swc-darwin-x64@16.2.7':
resolution: {integrity: sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==} resolution: {integrity: sha512-O3IRSv1ZBL1zs0WrIgefTEcTKFVn+ryxBNe54erJ6KsD+2f/Mmt7g2jOYh8PSBdUwPtKQJuCsTMlZ7tIu2AcsQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@next/swc-linux-arm64-gnu@16.2.6': '@next/swc-linux-arm64-gnu@16.2.7':
resolution: {integrity: sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==} resolution: {integrity: sha512-Re6PZtjBDd0aMU+VcZcC/PrIvj4WhrjDYtMhhCVQamWN4L90EVP0pcEOBQD25prSlw7OzNw5QpHLWMilRLsRNw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@next/swc-linux-arm64-musl@16.2.6': '@next/swc-linux-arm64-musl@16.2.7':
resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} resolution: {integrity: sha512-qyogG9QtBzWxgJfeGBvOEHI3851gTfCF3wLZ5RDLTBJGAmE9p1qDwKCOdrBrvBzRvYDT+gUDp72pzlSEfAXgNA==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
'@next/swc-linux-x64-gnu@16.2.6': '@next/swc-linux-x64-gnu@16.2.7':
resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} resolution: {integrity: sha512-Vhe4ZDuBpmMogrGi5D4R2Kq4JAQlj6+wvgaFYy31zfES0zPmt6TLA+cuYpM/OLrPZjo2MYQTHVqNUSCR6+fDZQ==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [glibc] libc: [glibc]
'@next/swc-linux-x64-musl@16.2.6': '@next/swc-linux-x64-musl@16.2.7':
resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} resolution: {integrity: sha512-srvian89JahFLw1YLBEuhvPJ0DO5lpUeJQMXy4xYo7g628ZlNgXdNkqoxSAv9OYrBfByh6vxISMwW/mRbzCY+g==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
libc: [musl] libc: [musl]
'@next/swc-win32-arm64-msvc@16.2.6': '@next/swc-win32-arm64-msvc@16.2.7':
resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} resolution: {integrity: sha512-GX3wvLpULFuRFJzwHaKfm7QZJ18F4ZSuxlPJ96BoBglCzBmdSjyeBKF+ZhWhvL/ckxNfLnNa7bsObO2ipYpszw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@next/swc-win32-x64-msvc@16.2.6': '@next/swc-win32-x64-msvc@16.2.7':
resolution: {integrity: sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==} resolution: {integrity: sha512-J4WlM72NMk076Qsg0jTdK3SNXatlSdnjW7L7oNGLst1tAGjHrJh/FYi+pw9wyIjEtGRKDNzD0zuiY16oWYWVaw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -440,8 +443,8 @@ packages:
'@tailwindcss/postcss@4.3.0': '@tailwindcss/postcss@4.3.0':
resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==} resolution: {integrity: sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==}
'@types/node@20.19.41': '@types/node@25.9.2':
resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==} resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==}
'@types/react-dom@19.2.3': '@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
@@ -479,6 +482,11 @@ packages:
graceful-fs@4.2.11: graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
iconoir-react@7.11.0:
resolution: {integrity: sha512-uvTKtnHYwbbTsmQ6HCcliYd50WK0GbjP497RwdISxKzfS01x4cK1Mn/F2mT/t2roSaJQ0I+KnHxMcyvmNMXWsQ==}
peerDependencies:
react: 18 || 19
jiti@2.7.0: jiti@2.7.0:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true hasBin: true
@@ -565,8 +573,8 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true hasBin: true
next@16.2.6: next@16.2.7:
resolution: {integrity: sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==} resolution: {integrity: sha512-eMJxgjRzBaj3olkP4cBamHDXL79A8FC6u1GcsO1D1Tsx8bw/LLXUJCaoajVxtnhD3A1IJqIT8IcRJjgBIPJq4w==}
engines: {node: '>=20.9.0'} engines: {node: '>=20.9.0'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -597,13 +605,13 @@ packages:
resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
react-dom@19.2.4: react-dom@19.2.7:
resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==}
peerDependencies: peerDependencies:
react: ^19.2.4 react: ^19.2.7
react@19.2.4: react@19.2.7:
resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
scheduler@0.27.0: scheduler@0.27.0:
@@ -645,13 +653,13 @@ packages:
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
typescript@5.9.3: typescript@6.0.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
undici-types@6.21.0: undici-types@7.24.6:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
snapshots: snapshots:
@@ -666,39 +674,39 @@ snapshots:
'@babel/helper-string-parser': 7.27.1 '@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5 '@babel/helper-validator-identifier': 7.28.5
'@biomejs/biome@2.2.0': '@biomejs/biome@2.4.16':
optionalDependencies: optionalDependencies:
'@biomejs/cli-darwin-arm64': 2.2.0 '@biomejs/cli-darwin-arm64': 2.4.16
'@biomejs/cli-darwin-x64': 2.2.0 '@biomejs/cli-darwin-x64': 2.4.16
'@biomejs/cli-linux-arm64': 2.2.0 '@biomejs/cli-linux-arm64': 2.4.16
'@biomejs/cli-linux-arm64-musl': 2.2.0 '@biomejs/cli-linux-arm64-musl': 2.4.16
'@biomejs/cli-linux-x64': 2.2.0 '@biomejs/cli-linux-x64': 2.4.16
'@biomejs/cli-linux-x64-musl': 2.2.0 '@biomejs/cli-linux-x64-musl': 2.4.16
'@biomejs/cli-win32-arm64': 2.2.0 '@biomejs/cli-win32-arm64': 2.4.16
'@biomejs/cli-win32-x64': 2.2.0 '@biomejs/cli-win32-x64': 2.4.16
'@biomejs/cli-darwin-arm64@2.2.0': '@biomejs/cli-darwin-arm64@2.4.16':
optional: true optional: true
'@biomejs/cli-darwin-x64@2.2.0': '@biomejs/cli-darwin-x64@2.4.16':
optional: true optional: true
'@biomejs/cli-linux-arm64-musl@2.2.0': '@biomejs/cli-linux-arm64-musl@2.4.16':
optional: true optional: true
'@biomejs/cli-linux-arm64@2.2.0': '@biomejs/cli-linux-arm64@2.4.16':
optional: true optional: true
'@biomejs/cli-linux-x64-musl@2.2.0': '@biomejs/cli-linux-x64-musl@2.4.16':
optional: true optional: true
'@biomejs/cli-linux-x64@2.2.0': '@biomejs/cli-linux-x64@2.4.16':
optional: true optional: true
'@biomejs/cli-win32-arm64@2.2.0': '@biomejs/cli-win32-arm64@2.4.16':
optional: true optional: true
'@biomejs/cli-win32-x64@2.2.0': '@biomejs/cli-win32-x64@2.4.16':
optional: true optional: true
'@emnapi/runtime@1.10.0': '@emnapi/runtime@1.10.0':
@@ -822,30 +830,30 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/sourcemap-codec': 1.5.5
'@next/env@16.2.6': {} '@next/env@16.2.7': {}
'@next/swc-darwin-arm64@16.2.6': '@next/swc-darwin-arm64@16.2.7':
optional: true optional: true
'@next/swc-darwin-x64@16.2.6': '@next/swc-darwin-x64@16.2.7':
optional: true optional: true
'@next/swc-linux-arm64-gnu@16.2.6': '@next/swc-linux-arm64-gnu@16.2.7':
optional: true optional: true
'@next/swc-linux-arm64-musl@16.2.6': '@next/swc-linux-arm64-musl@16.2.7':
optional: true optional: true
'@next/swc-linux-x64-gnu@16.2.6': '@next/swc-linux-x64-gnu@16.2.7':
optional: true optional: true
'@next/swc-linux-x64-musl@16.2.6': '@next/swc-linux-x64-musl@16.2.7':
optional: true optional: true
'@next/swc-win32-arm64-msvc@16.2.6': '@next/swc-win32-arm64-msvc@16.2.7':
optional: true optional: true
'@next/swc-win32-x64-msvc@16.2.6': '@next/swc-win32-x64-msvc@16.2.7':
optional: true optional: true
'@swc/helpers@0.5.15': '@swc/helpers@0.5.15':
@@ -921,9 +929,9 @@ snapshots:
postcss: 8.5.15 postcss: 8.5.15
tailwindcss: 4.3.0 tailwindcss: 4.3.0
'@types/node@20.19.41': '@types/node@25.9.2':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 7.24.6
'@types/react-dom@19.2.3(@types/react@19.2.15)': '@types/react-dom@19.2.3(@types/react@19.2.15)':
dependencies: dependencies:
@@ -954,6 +962,10 @@ snapshots:
graceful-fs@4.2.11: {} graceful-fs@4.2.11: {}
iconoir-react@7.11.0(react@19.2.7):
dependencies:
react: 19.2.7
jiti@2.7.0: {} jiti@2.7.0: {}
lightningcss-android-arm64@1.32.0: lightningcss-android-arm64@1.32.0:
@@ -1011,25 +1023,25 @@ snapshots:
nanoid@3.3.12: {} nanoid@3.3.12: {}
next@16.2.6(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): next@16.2.7(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies: dependencies:
'@next/env': 16.2.6 '@next/env': 16.2.7
'@swc/helpers': 0.5.15 '@swc/helpers': 0.5.15
baseline-browser-mapping: 2.10.32 baseline-browser-mapping: 2.10.32
caniuse-lite: 1.0.30001793 caniuse-lite: 1.0.30001793
postcss: 8.4.31 postcss: 8.4.31
react: 19.2.4 react: 19.2.7
react-dom: 19.2.4(react@19.2.4) react-dom: 19.2.7(react@19.2.7)
styled-jsx: 5.1.6(react@19.2.4) styled-jsx: 5.1.6(react@19.2.7)
optionalDependencies: optionalDependencies:
'@next/swc-darwin-arm64': 16.2.6 '@next/swc-darwin-arm64': 16.2.7
'@next/swc-darwin-x64': 16.2.6 '@next/swc-darwin-x64': 16.2.7
'@next/swc-linux-arm64-gnu': 16.2.6 '@next/swc-linux-arm64-gnu': 16.2.7
'@next/swc-linux-arm64-musl': 16.2.6 '@next/swc-linux-arm64-musl': 16.2.7
'@next/swc-linux-x64-gnu': 16.2.6 '@next/swc-linux-x64-gnu': 16.2.7
'@next/swc-linux-x64-musl': 16.2.6 '@next/swc-linux-x64-musl': 16.2.7
'@next/swc-win32-arm64-msvc': 16.2.6 '@next/swc-win32-arm64-msvc': 16.2.7
'@next/swc-win32-x64-msvc': 16.2.6 '@next/swc-win32-x64-msvc': 16.2.7
babel-plugin-react-compiler: 1.0.0 babel-plugin-react-compiler: 1.0.0
sharp: 0.34.5 sharp: 0.34.5
transitivePeerDependencies: transitivePeerDependencies:
@@ -1050,12 +1062,12 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
source-map-js: 1.2.1 source-map-js: 1.2.1
react-dom@19.2.4(react@19.2.4): react-dom@19.2.7(react@19.2.7):
dependencies: dependencies:
react: 19.2.4 react: 19.2.7
scheduler: 0.27.0 scheduler: 0.27.0
react@19.2.4: {} react@19.2.7: {}
scheduler@0.27.0: {} scheduler@0.27.0: {}
@@ -1096,10 +1108,10 @@ snapshots:
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
styled-jsx@5.1.6(react@19.2.4): styled-jsx@5.1.6(react@19.2.7):
dependencies: dependencies:
client-only: 0.0.1 client-only: 0.0.1
react: 19.2.4 react: 19.2.7
tailwindcss@4.3.0: {} tailwindcss@4.3.0: {}
@@ -1107,6 +1119,6 @@ snapshots:
tslib@2.8.1: {} tslib@2.8.1: {}
typescript@5.9.3: {} typescript@6.0.3: {}
undici-types@6.21.0: {} undici-types@7.24.6: {}

6
renovate.json Normal file
View File

@@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
]
}

View File

@@ -1,26 +1,41 @@
import { NextPage } from "next"; import { NextPage, Metadata } from "next";
import Image from "next/image"; import { Activity, ActivityData } from "@/components/pages/Home/Activity";
import { Profile } from "@/components/pages/Home/Profile";
export const metadata: Metadata = {
title: "ホーム",
description: "tuna2134のホームページ",
};
const activities: ActivityData[] = [
{
title: "cecilia",
description: "Next.jsで作成したポートフォリオサイトです。",
url: "https://github.com/tuna2134/cecilia",
},
{
title: "Neody Networks",
description: "AS152873をはじめインフラをメインで運用しています。",
url: "https://neody.ad.jp",
},
{
title: "EtherIP",
description: "RustでRFC3378であるEtherIPを実装しました。",
url: "https://github.com/tuna2134/EtherIP",
},
];
const Home: NextPage = () => { const Home: NextPage = () => {
return ( return (
<> <>
<div className="w-full flex items-center gap-4 py-8"> <Profile />
<Image
src="/images/icon.png"
alt="icon"
width={128}
height={128}
className="rounded-full"
/>
<div>
<h2 className="text-2xl font-bold"></h2>
<p>
tuna2134です
</p>
</div>
</div>
<div> <div>
<h3 className="text-xl font-bold mb-4"></h3> <h3 className="text-xl font-bold mb-4"></h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{activities.map((activity, index) => (
<Activity key={index} activity={activity} />
))}
</div>
</div> </div>
</> </>
); );

View File

@@ -27,9 +27,7 @@ export default function RootLayout({
lang="ja" lang="ja"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`} className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
> >
<body className="min-h-full flex flex-col bg-black text-white"> <body className="min-h-full flex flex-col">{children}</body>
{children}
</body>
</html> </html>
); );
} }

View File

@@ -2,7 +2,7 @@ const Header: React.FC = () => {
return ( return (
<header className="w-full flex flex-col items-center gap-1 py-4 border-b border-gray-400"> <header className="w-full flex flex-col items-center gap-1 py-4 border-b border-gray-400">
<h1 className="text-4xl font-bold">tuna2134</h1> <h1 className="text-4xl font-bold">tuna2134</h1>
<small className="text-sm text-gray-400/90"> <small className="text-sm text-gray-600/80">
tuna2134の個人的な憩いの場 tuna2134の個人的な憩いの場
</small> </small>
</header> </header>

View File

@@ -0,0 +1,28 @@
import Link from "next/link";
export interface ActivityData {
title: string;
description: string;
url: string | null;
}
interface ActivityProps {
activity: ActivityData;
}
export const Activity: React.FC<ActivityProps> = ({ activity }) => {
return (
<div className="p-4 border border-gray-300 rounded-lg mb-4 flex flex-col">
<h4 className="text-lg font-semibold">{activity.title}</h4>
<p className="grow mb-2 text-gray-700">{activity.description}</p>
{activity.url && (
<Link
href={activity.url}
className="text-blue-500 hover:underline text-sm"
>
</Link>
)}
</div>
);
};

View File

@@ -0,0 +1,35 @@
import { Github, Mail, Twitter } from "iconoir-react";
import Image from "next/image";
import Link from "next/link";
export const Profile: React.FC = () => {
return (
<div className="w-full flex items-center gap-4 py-8">
<Image
src="/images/icon.png"
alt="icon"
width={128}
height={128}
className="rounded-full"
/>
<div>
<h2 className="text-2xl font-bold"></h2>
<p>
tuna2134です
AS152873を運用していますAS152873のインフラで動いています
</p>
<div className="mt-4 flex items-center gap-2">
<Link href="https://x.com/fdc_tuna2134">
<Twitter />
</Link>
<Link href="https://github.com/tuna2134">
<Github />
</Link>
<Link href="mailto:m-kikuchi@tuna2134.dev">
<Mail />
</Link>
</div>
</div>
</div>
);
};