mirror of
https://github.com/yude-jp/yude.jp
synced 2025-10-17 05:38:36 +09:00
Compare commits
43 Commits
24327251ee
...
master
Author | SHA1 | Date | |
---|---|---|---|
79246ee600 | |||
98ad910a9b | |||
fc90f87285 | |||
b07d6412ff | |||
![]() |
6d6365c240 | ||
![]() |
1dd86ac2c8 | ||
![]() |
496fe5ee4b | ||
![]() |
cdcce3a39b | ||
7f3a8f8230 | |||
![]() |
fae52872f1 | ||
1c8bf364dd | |||
![]() |
ef653ed749 | ||
8deac1fede | |||
3fb52ddcfa | |||
![]() |
a36785dded | ||
c60270c1c6
|
|||
1b7319617b
|
|||
![]() |
aa6f4417e7 | ||
ae6c8aa9c9
|
|||
9389cc55f7
|
|||
ba0e41579a
|
|||
b35caef45c
|
|||
7ac1c7199f
|
|||
f697eb9b85
|
|||
16bb6398e4
|
|||
02b1adcf55
|
|||
34e335037c
|
|||
0cb27e3cda
|
|||
92459e594f
|
|||
c30312a46a
|
|||
5531b3a3bf
|
|||
f0cf3729a0
|
|||
ec530601b4
|
|||
30547e3b81
|
|||
2529afa286 | |||
b62f95d483
|
|||
2bd3b69da1
|
|||
5a0e87d7d4
|
|||
b6f427d605
|
|||
92bb8b995c
|
|||
52c8cd8d1c
|
|||
22385a42c8
|
|||
99f776b861
|
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"extends": "next/core-web-vitals",
|
"extends": "next/core-web-vitals",
|
||||||
"rules": {
|
"rules": {
|
||||||
"@next/next/no-document-import-in-page": "off"
|
"@next/next/no-document-import-in-page": "off",
|
||||||
|
"@next/next/no-img-element": "off",
|
||||||
|
"react-hooks/exhaustive-deps": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<img alt="Next JS" src="https://img.shields.io/badge/nextjs-%23000000.svg?style=for-the-badge&logo=next.js&logoColor=white"/>
|
<img alt="Next JS" src="https://img.shields.io/badge/nextjs-%23000000.svg?style=for-the-badge&logo=next.js&logoColor=white"/>
|
||||||
<img alt="TailwindCSS" src="https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white"/>\
|
<img alt="TailwindCSS" src="https://img.shields.io/badge/tailwindcss-%2338B2AC.svg?style=for-the-badge&logo=tailwind-css&logoColor=white"/>\
|
||||||
Source code of [yude.jp](https://yude.jp).\
|
Source code of [yude.jp](https://yude.jp).\
|
||||||
Built with [Next.js](https://nextjs.org/) and [Tailwind CSS](https://tailwindcss.com/) and deployed on [Vercel](https://vercel.com).
|
Built with [Next.js](https://nextjs.org/) and [Tailwind CSS](https://tailwindcss.com/) and deployed to [Cloudflare Pages](https://pages.cloudflare.com/).
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
1. Run `yarn` to install dependencies.
|
1. Run `yarn` to install dependencies.
|
||||||
|
23
docs/services/en.md
Normal file
23
docs/services/en.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Available services on yude.jp
|
||||||
|
|
||||||
|
## Softwares
|
||||||
|
* [AutoMuteUs](https://github.com/denverquane/automuteus)\
|
||||||
|
Among Us helper; API: [`galactus.yude.jp`](https://galactus.yude.jp)
|
||||||
|
* [Nextcloud](https://nc.yude.jp)
|
||||||
|
* [Mastodon](https://mstdn.yude.jp)
|
||||||
|
* [Misskey](https://misskey.yude.jp)
|
||||||
|
* [Pleroma](https//pleroma.yude.jp)
|
||||||
|
* TeamSpeak 3: `yude.jp`
|
||||||
|
* [Gitea](https://git.yude.jp)
|
||||||
|
* [h5ai](https://files.yude.jp)
|
||||||
|
* [JMusicBot (forked)](https://discord.com/oauth2/authorize?client_id=429638220456656896&scope=bot&permissions=338963472)
|
||||||
|
* [Owncast](https://live.yude.jp)
|
||||||
|
* [Minecraft Server](https://yude.jp/minecraft)
|
||||||
|
|
||||||
|
## Anonymous communication
|
||||||
|
### Tor
|
||||||
|
* Relay: [yudejp](https://metrics.torproject.org/rs.html#details/CF762EF3C86B104C301511894547C72371F952A4)
|
||||||
|
* Hidden Service: [yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion](http://yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion)
|
||||||
|
|
||||||
|
### I2P
|
||||||
|
* Hidden Service: [yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p](http://yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p)
|
23
docs/services/ja.md
Normal file
23
docs/services/ja.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# yude.jp で運用中のサービス
|
||||||
|
|
||||||
|
## ソフトウェア
|
||||||
|
* [AutoMuteUs](https://github.com/denverquane/automuteus)\
|
||||||
|
Among Us の自動ミュートボット; API: [`galactus.yude.jp`](https://galactus.yude.jp)
|
||||||
|
* [Nextcloud](https://nc.yude.jp)
|
||||||
|
* [Mastodon](https://mstdn.yude.jp)
|
||||||
|
* [Misskey](https://misskey.yude.jp)
|
||||||
|
* [Pleroma](https//pleroma.yude.jp)
|
||||||
|
* TeamSpeak 3: `yude.jp`
|
||||||
|
* [Gitea](https://git.yude.jp)
|
||||||
|
* [h5ai](https://files.yude.jp)
|
||||||
|
* [JMusicBot (フォーク)](https://discord.com/oauth2/authorize?client_id=429638220456656896&scope=bot&permissions=338963472)
|
||||||
|
* [Owncast](https://live.yude.jp)
|
||||||
|
* [Minecraft サーバー](https://yude.jp/minecraft)
|
||||||
|
|
||||||
|
## 秘匿化ネットワーク
|
||||||
|
### Tor
|
||||||
|
* リレー: [yudejp](https://metrics.torproject.org/rs.html#details/CF762EF3C86B104C301511894547C72371F952A4)
|
||||||
|
* Hidden Service: [yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion](http://yude3mzscyufx5u3zup72ium7tgecy3bd67p7t6vqhaywvr7e2gqpcqd.onion)
|
||||||
|
|
||||||
|
### I2P
|
||||||
|
* Hidden Service: [yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p](http://yudejp.i2p/?i2paddresshelper=55ivoba6mo3mqlwvw5lqz7lchxqew2kh77kwkn5shefrj2dp3coq.b32.i2p)
|
@@ -60,5 +60,8 @@
|
|||||||
"service": "Service",
|
"service": "Service",
|
||||||
"shape": "Shape",
|
"shape": "Shape",
|
||||||
"tos": "yude.jp Terms of Service",
|
"tos": "yude.jp Terms of Service",
|
||||||
"input": "en"
|
"input": "en",
|
||||||
|
"services": "Services",
|
||||||
|
"contents": "Contents",
|
||||||
|
"Blog": "Weblog"
|
||||||
}
|
}
|
@@ -60,5 +60,8 @@
|
|||||||
"service": "サービス",
|
"service": "サービス",
|
||||||
"shape": "シェイプ",
|
"shape": "シェイプ",
|
||||||
"tos": "yude.jp サービス利用規約",
|
"tos": "yude.jp サービス利用規約",
|
||||||
"input": "ja"
|
"input": "ja",
|
||||||
|
"services": "サービス",
|
||||||
|
"contents": "コンテンツ",
|
||||||
|
"blog": "ブログ"
|
||||||
}
|
}
|
@@ -31,8 +31,8 @@
|
|||||||
"autoprefixer": "^10.3.4",
|
"autoprefixer": "^10.3.4",
|
||||||
"axios": "^0.21.4",
|
"axios": "^0.21.4",
|
||||||
"date-fns": "^2.24.0",
|
"date-fns": "^2.24.0",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.4",
|
||||||
"next": "^11.1.3",
|
"next": "^12.1.0",
|
||||||
"next-export-i18n": "^1.2.1",
|
"next-export-i18n": "^1.2.1",
|
||||||
"next-seo": "^4.28.1",
|
"next-seo": "^4.28.1",
|
||||||
"next-themes": "^0.0.15",
|
"next-themes": "^0.0.15",
|
||||||
|
@@ -2,44 +2,37 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
// Data fetching
|
// Data fetching
|
||||||
import axios from 'axios';
|
import useSwr from 'swr'
|
||||||
|
const fetcher = (url) => fetch(url).then((res) => res.json())
|
||||||
|
|
||||||
// i18n
|
// i18n
|
||||||
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
function App (){
|
export default function DiscordPlaying() {
|
||||||
const [data, setData] = useState({ hits: [] });
|
const { t } = useTranslation();
|
||||||
useEffect(() => {
|
const [query] = useLanguageQuery();
|
||||||
const fetchData = async () => {
|
|
||||||
const result = await axios(
|
|
||||||
'https://discord.com/api/guilds/723409709306216498/widget.json',
|
|
||||||
);
|
|
||||||
setData(result.data);
|
|
||||||
};
|
|
||||||
fetchData();
|
|
||||||
}, []);
|
|
||||||
if (data === undefined){
|
|
||||||
console.log("[Discord API] データの取得に失敗しました。 / Failed to retrieve data.")
|
|
||||||
return <p></p>
|
|
||||||
}else{
|
|
||||||
const str = JSON.stringify(data)
|
|
||||||
|
|
||||||
if (str.indexOf("game") !== -1){
|
const { data, error } = useSwr(
|
||||||
const yes_playing = t('yes_playing', {playing: data.members[0].game.name})
|
`https://discord.com/api/guilds/723409709306216498/widget.json`,
|
||||||
return <p>{yes_playing}</p>
|
fetcher
|
||||||
}else{
|
)
|
||||||
return <></>
|
if (error){
|
||||||
}
|
console.log("[Discord API] データの取得に失敗しました。 / Failed to retrieve data.")
|
||||||
|
return <></>
|
||||||
|
} else {
|
||||||
|
if (!data) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
if (data.members) {
|
||||||
|
if (data.members[0].game) {
|
||||||
|
const yes_playing = t('yes_playing', {playing: data.members[0].game.name})
|
||||||
|
return <p>{yes_playing}</p>
|
||||||
|
} else {
|
||||||
|
return <></>
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return <></>
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
export async function getServerSideProps() {
|
|
||||||
// Fetch data from external API
|
|
||||||
const res = await fetch(url)
|
|
||||||
const data = await res.json()
|
|
||||||
|
|
||||||
// Pass data to the page via props
|
|
||||||
return { props: { data } }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
|
@@ -1,20 +0,0 @@
|
|||||||
// Next.js
|
|
||||||
import Link from 'next/link'
|
|
||||||
import Image from 'next/image'
|
|
||||||
|
|
||||||
const happybusy = (props) => {
|
|
||||||
return (
|
|
||||||
<Link href="https://www.eff.org/pages/blue-ribbon-campaign">
|
|
||||||
<a>
|
|
||||||
<Image
|
|
||||||
src="/images/brstrip.gif"
|
|
||||||
width={150}
|
|
||||||
height={41}
|
|
||||||
alt="EFF Blue Ribbon Campaign"
|
|
||||||
/>
|
|
||||||
</a>
|
|
||||||
</Link>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default happybusy
|
|
@@ -1,16 +1,16 @@
|
|||||||
// Next.js
|
// Next.js
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import Image from 'next/image'
|
|
||||||
|
|
||||||
const HappyBusy = (props) => {
|
const HappyBusy = (props) => {
|
||||||
return (
|
return (
|
||||||
<Link href="https://sites.google.com/site/happybusy/">
|
<Link href="https://sites.google.com/site/happybusy/">
|
||||||
<a>
|
<a>
|
||||||
<Image
|
<img
|
||||||
src="/images/busy_banner.png"
|
src="/images/busy_banner.png"
|
||||||
width={200}
|
width={200}
|
||||||
height={42}
|
height={42}
|
||||||
alt="時間のないサイト運営者リング"
|
alt="時間のないサイト運営者リング"
|
||||||
|
className="mx-auto"
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
|
@@ -31,7 +31,7 @@ const Dropdown = ({ color }) => {
|
|||||||
<>
|
<>
|
||||||
|
|
||||||
<div className="text-left mr-2 ml-2 my-3 float-right">
|
<div className="text-left mr-2 ml-2 my-3 float-right">
|
||||||
<button type="button" className="inline-flex justify-center w-full rounded-md border border-gray-300 dark:border-gray-800 shadow-sm px-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 dark:bg-gray-700 dark:text-white focus:outline-none" id="options-menu" aria-haspopup="true" aria-expanded="true"
|
<button type="button" className="inline-flex justify-center rounded-md border border-gray-300 dark:border-gray-800 shadow-sm px-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 dark:bg-gray-700 dark:text-white focus:outline-none h-10" id="options-menu" aria-haspopup="true" aria-expanded="true"
|
||||||
style={{ transition: "all .15s ease" }}
|
style={{ transition: "all .15s ease" }}
|
||||||
ref={btnDropdownRef}
|
ref={btnDropdownRef}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -40,19 +40,19 @@ const Dropdown = ({ color }) => {
|
|||||||
: openDropdownPopover();
|
: openDropdownPopover();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<FontAwesomeIcon icon={faLanguage} className="w-12 h-9" />
|
<FontAwesomeIcon icon={faLanguage} size="3x" />
|
||||||
<svg className="-mr-1 ml-2 h-9 w-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
<svg className="-mr-1 ml-2 h-9 w-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||||
<path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
|
<path fillRule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule="evenodd" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<div ref={popoverDropdownRef} className={
|
<div ref={popoverDropdownRef} className={
|
||||||
(dropdownPopoverShow ? "block " : "hidden ") + "z-10 origin-top-right absolute right-0 mt-2 w-40 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 dark:bg-gray-700"}>
|
(dropdownPopoverShow ? "block " : "hidden ") + "z-10 origin-top-right absolute right-0 mt-2 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 dark:bg-gray-700"}>
|
||||||
<div className="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
|
<div className="py-1" role="menu" aria-orientation="vertical" aria-labelledby="options-menu">
|
||||||
<LanguageSwitcher lang="ja">
|
<LanguageSwitcher lang="ja">
|
||||||
<a href="#" className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">日本語</a>
|
<a href="#" className="block px-4 py-2 text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">日本語</a>
|
||||||
</LanguageSwitcher>
|
</LanguageSwitcher>
|
||||||
<LanguageSwitcher lang="en">
|
<LanguageSwitcher lang="en">
|
||||||
<a href="#" className="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">English</a>
|
<a href="#" className="block px-4 py-2 text-gray-700 hover:bg-gray-100 hover:text-gray-700 dark:text-white dark:hover:bg-gray-800" role="menuitem">English</a>
|
||||||
</LanguageSwitcher>
|
</LanguageSwitcher>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -11,7 +11,7 @@ const FontAwesomeMenu = (props) => {
|
|||||||
<div>
|
<div>
|
||||||
<Link href={{ pathname: dest, query: query }}>
|
<Link href={{ pathname: dest, query: query }}>
|
||||||
<a>
|
<a>
|
||||||
<FontAwesomeIcon icon={icon} className="w-10 h-10 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" />
|
<FontAwesomeIcon icon={icon} size="5x" className="w-9 h-9 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" />
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -5,8 +5,6 @@ import React, { useState, useEffect } from 'react';
|
|||||||
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import Image from 'next/image'
|
|
||||||
import { list } from 'postcss';
|
|
||||||
|
|
||||||
export default function Minecraft(props) {
|
export default function Minecraft(props) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -55,7 +53,7 @@ export default function Minecraft(props) {
|
|||||||
url.push('https://mc-heads.net/avatar/' + data.players.list[i])
|
url.push('https://mc-heads.net/avatar/' + data.players.list[i])
|
||||||
}
|
}
|
||||||
for (var i in url){
|
for (var i in url){
|
||||||
list.push(<Image src={url[i]} key={i} className="inline" height="50" width="50" alt={i}/>)
|
list.push(<img src={url[i]} key={i} className="inline" height="50" width="50" alt={i}/>)
|
||||||
}
|
}
|
||||||
return <div>{list}</div>
|
return <div>{list}</div>
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import Image from 'next/image'
|
|
||||||
|
|
||||||
function App (props) {
|
function App (props) {
|
||||||
const uuid = props;
|
const uuid = props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Image
|
<img
|
||||||
src={"https://crafatar.com/renders/body/" + uuid.uuid}
|
src={"https://crafatar.com/renders/body/" + uuid.uuid}
|
||||||
width={110}
|
width={110}
|
||||||
height={250}
|
height={250}
|
||||||
|
@@ -10,7 +10,7 @@ const Button = (props) => {
|
|||||||
<Link href={{ pathname: dest }}>
|
<Link href={{ pathname: dest }}>
|
||||||
<a>
|
<a>
|
||||||
<button
|
<button
|
||||||
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
className="bg-pink-600 text-white active:bg-pink-600 mt-3 font-bold text-sm px-6 py-3 rounded shadow hover:shadow-lg outline-none focus:outline-none mr-1 mb-1 ease-linear transition-all duration-150"
|
||||||
type="button"
|
type="button"
|
||||||
>
|
>
|
||||||
<FontAwesomeIcon icon={icon} className="w-5 h-5 inline"/> {caption}
|
<FontAwesomeIcon icon={icon} className="w-5 h-5 inline"/> {caption}
|
||||||
|
@@ -10,7 +10,7 @@ const Contact = (props) => {
|
|||||||
<div className="hover:underline">
|
<div className="hover:underline">
|
||||||
<Link href={{ pathname: dest }}>
|
<Link href={{ pathname: dest }}>
|
||||||
<a>
|
<a>
|
||||||
<FontAwesomeIcon icon={icon} className="w-7 h-7 inline lg:w-10 lg:h-10 md:w-7 md:h-7"/>
|
<FontAwesomeIcon icon={icon} size="5x" className="w-9 h-9 fill-current inline transition duration-200 ease-in-out transform hover:-translate-y-1 hover:scale-110" />
|
||||||
<p className="font-mono text-xl">{caption}</p>
|
<p className="font-mono text-xl">{caption}</p>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
|
@@ -1,12 +1,16 @@
|
|||||||
// React
|
// React
|
||||||
import React, { useState, useEffect } from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
// Font Awesome
|
// Font Awesome
|
||||||
import { faUserClock } from '@fortawesome/free-solid-svg-icons'
|
import { faUserClock } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation } from 'next-export-i18n';
|
||||||
|
|
||||||
export default function Modal() {
|
export default function Modal() {
|
||||||
const [showModal, setShowModal] = React.useState(false);
|
const [showModal, setShowModal] = React.useState(false);
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -36,7 +40,7 @@ export default function Modal() {
|
|||||||
type="button"
|
type="button"
|
||||||
onClick={() => setShowModal(false)}
|
onClick={() => setShowModal(false)}
|
||||||
>
|
>
|
||||||
{close}
|
{t('close')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -5,23 +5,20 @@ import Layout from "./components/Layout"
|
|||||||
import FAMenu from "./components/Menu/FontAwesomeMenu"
|
import FAMenu from "./components/Menu/FontAwesomeMenu"
|
||||||
|
|
||||||
// Banner
|
// Banner
|
||||||
import BlueRibbon from "./components/Footer/BlueRibbon"
|
|
||||||
import HappyBusy from "./components/Footer/HappyBusy"
|
import HappyBusy from "./components/Footer/HappyBusy"
|
||||||
|
|
||||||
// Next.js
|
// Next.js
|
||||||
import Image from 'next/image'
|
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
|
|
||||||
// i18n
|
// i18n
|
||||||
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
||||||
|
|
||||||
// React Router
|
// React Router
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
import MinecraftMenu from "./components/Menu/MinecraftMenu"
|
import MinecraftMenu from "./components/Menu/MinecraftMenu"
|
||||||
|
|
||||||
// Font Awesome
|
// Font Awesome
|
||||||
import { faDiscord, faGit, faMastodon, faGithub } from '@fortawesome/free-brands-svg-icons'
|
import { faDiscord, faGit, faGithub } from '@fortawesome/free-brands-svg-icons'
|
||||||
import { faBook, faUser, faServer, faHouseUser, faHeart } from '@fortawesome/free-solid-svg-icons'
|
import { faBook, faUser, faServer, faScrewdriver, faHeart } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
export default function Index(props) {
|
export default function Index(props) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -35,12 +32,12 @@ export default function Index(props) {
|
|||||||
<Layout title={t('home')}>
|
<Layout title={t('home')}>
|
||||||
<div className="my-9 text-center">
|
<div className="my-9 text-center">
|
||||||
<div className="m-10">
|
<div className="m-10">
|
||||||
<Image
|
<img
|
||||||
|
className = "mx-auto"
|
||||||
src = "/images/avatar_riru.png"
|
src = "/images/avatar_riru.png"
|
||||||
alt = "yude's avatar"
|
alt = "yude's avatar"
|
||||||
width = {200}
|
width = {200}
|
||||||
height = {200}
|
height = {200}
|
||||||
unoptimized = {true}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -48,18 +45,16 @@ export default function Index(props) {
|
|||||||
<div className="grid grid-cols-3 gap-10">
|
<div className="grid grid-cols-3 gap-10">
|
||||||
<FAMenu dest="/profile" query={query} icon={faUser} />
|
<FAMenu dest="/profile" query={query} icon={faUser} />
|
||||||
<FAMenu dest="/server" query={query} icon={faServer} />
|
<FAMenu dest="/server" query={query} icon={faServer} />
|
||||||
<FAMenu dest="/house" query={query} icon={faHouseUser} />
|
<FAMenu dest="/services" query={query} icon={faScrewdriver} />
|
||||||
<FAMenu dest="https://scrapbox.io/yude" query={query} icon={faBook} />
|
<FAMenu dest="https://discord.gg/X6srY7X" icon={faDiscord} />
|
||||||
<FAMenu dest="https://discord.gg/X6srY7X" query={query} icon={faDiscord} />
|
<FAMenu dest="https://github.com/yudejp" icon={faGithub} />
|
||||||
<FAMenu dest="https://github.com/yudejp" query={query} icon={faGithub} />
|
<FAMenu dest="https://git.yude.jp" icon={faGit} />
|
||||||
<FAMenu dest="https://git.yude.jp" icon={faGit} query={query} />
|
|
||||||
<MinecraftMenu query={query} />
|
<MinecraftMenu query={query} />
|
||||||
<FAMenu dest="/mutual" icon={faHeart} query={query} />
|
<FAMenu dest="/mutual" icon={faHeart} query={query} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Banner */}
|
{/* Banner */}
|
||||||
<div className="mx-auto mt-10">
|
<div className="mx-auto mt-10">
|
||||||
<BlueRibbon />
|
|
||||||
<HappyBusy />
|
<HappyBusy />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -9,7 +9,6 @@ import { useRouter } from 'next/router'
|
|||||||
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
// Next.js
|
// Next.js
|
||||||
import Image from 'next/image'
|
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
|
|
||||||
// Custom pages
|
// Custom pages
|
||||||
@@ -51,7 +50,7 @@ export default function About(props) {
|
|||||||
<div>
|
<div>
|
||||||
<p className="my-2 text-3xl text-center">{t('title')}</p>
|
<p className="my-2 text-3xl text-center">{t('title')}</p>
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
<Image
|
<img
|
||||||
src = "/images/dynmap.png"
|
src = "/images/dynmap.png"
|
||||||
alt = "Minecraft brief world map generated by Dynmap"
|
alt = "Minecraft brief world map generated by Dynmap"
|
||||||
width = {1354}
|
width = {1354}
|
||||||
@@ -72,7 +71,7 @@ export default function About(props) {
|
|||||||
</button>
|
</button>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>{t('version')}: 1.17</p>
|
<p>{t('version')}: 1.18.1</p>
|
||||||
|
|
||||||
<Link href="https://bluemap.yude.jp">
|
<Link href="https://bluemap.yude.jp">
|
||||||
<a>
|
<a>
|
||||||
|
@@ -30,7 +30,7 @@ export default function Tos(props) {
|
|||||||
title="相互リンク"
|
title="相互リンク"
|
||||||
description="yude.jp と相互にリンクを貼っている Web サイトの一覧"
|
description="yude.jp と相互にリンクを貼っている Web サイトの一覧"
|
||||||
/>
|
/>
|
||||||
<Layout title={t('common:mutual')}>
|
<Layout title={t('mutual')}>
|
||||||
<div>
|
<div>
|
||||||
{query["lang"] === 'ja' ? (
|
{query["lang"] === 'ja' ? (
|
||||||
<ReactMarkdown plugins={[gfm]}>
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
@@ -6,13 +6,11 @@ import { useTranslation, useLanguageQuery } from 'next-export-i18n';
|
|||||||
|
|
||||||
// Font Awesome
|
// Font Awesome
|
||||||
import { faDiscord, faTwitter, faGithub, faKeybase, faInstagram, faMastodon, faSteam, faAmazon } from '@fortawesome/free-brands-svg-icons'
|
import { faDiscord, faTwitter, faGithub, faKeybase, faInstagram, faMastodon, faSteam, faAmazon } from '@fortawesome/free-brands-svg-icons'
|
||||||
import { faEnvelope, faBirthdayCake, faMapPin, faSchool, faPhone, faInfo, faLink, faMobile } from '@fortawesome/free-solid-svg-icons'
|
import { faEnvelope, faBirthdayCake, faMapPin, faSchool, faPhone, faBlog, faBookDead, faInfo, faBookmark, faLink, faMobile } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
|
|
||||||
// Next.js, React
|
// Next.js, React
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import Image from 'next/image'
|
|
||||||
import { useRouter } from 'next/router'
|
|
||||||
|
|
||||||
// Discord
|
// Discord
|
||||||
import DiscordStatus from './components/Discord/DiscordStatus'
|
import DiscordStatus from './components/Discord/DiscordStatus'
|
||||||
@@ -46,7 +44,7 @@ export default function Profile(props) {
|
|||||||
}
|
}
|
||||||
<div>
|
<div>
|
||||||
<div className="flex mb-10 justify-center">
|
<div className="flex mb-10 justify-center">
|
||||||
<Image
|
<img
|
||||||
className = "rounded-full hover:animate-rumble z-0 p-15"
|
className = "rounded-full hover:animate-rumble z-0 p-15"
|
||||||
src = "/images/avatar_mel.png"
|
src = "/images/avatar_mel.png"
|
||||||
alt = "yude's avatar"
|
alt = "yude's avatar"
|
||||||
@@ -88,6 +86,19 @@ export default function Profile(props) {
|
|||||||
<p className="ml-9">{t('hiroshima')}</p>
|
<p className="ml-9">{t('hiroshima')}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{
|
||||||
|
// Contents
|
||||||
|
}
|
||||||
|
<div>
|
||||||
|
<div className="text-left">
|
||||||
|
<p className="text-2xl"><FontAwesomeIcon icon={faBookDead} className="w-5 h-5 inline"/> {t('contents')}</p>
|
||||||
|
</div>
|
||||||
|
<div className="my-2 grid grid-cols-2 lg:grid-cols-5 md:grid-cols-3 sm:grid-cols-2justify-items-center gap-y-6">
|
||||||
|
<Contact dest="https://blog.yude.jp" icon={faBlog} caption={t('blog')} />
|
||||||
|
<Contact dest="https://scrapbox.io/yude" icon={faBookmark} caption="Scrapbox" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{
|
{
|
||||||
// Contact
|
// Contact
|
||||||
|
@@ -37,7 +37,7 @@ export default function Server(props) {
|
|||||||
<div className="flex-1"><p className="font-bold">OS </p>Arch Linux</div>
|
<div className="flex-1"><p className="font-bold">OS </p>Arch Linux</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('location')} </p>{t('hiroshima')}</div>
|
<div className="flex-1"><p className="font-bold">{t('location')} </p>{t('hiroshima')}</div>
|
||||||
</div>
|
</div>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/heHnGhDanoIDlf7jjxUe9yPVrsG3deeH5ptD8suErrq5w46crWEIYdLfzLoukzfF?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
<a href="https://mackerel.io/orgs/yude/hosts/4dkbQuMQjvo/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/heHnGhDanoIDlf7jjxUe9yPVrsG3deeH5ptD8suErrq5w46crWEIYdLfzLoukzfF.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -51,7 +51,7 @@ export default function Server(props) {
|
|||||||
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
||||||
</div>
|
</div>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/vcn6LE4P2hh6GzvtMbIAWxsXpDh6eSoNyAXdhfYaj9yDN6FJwOHIiz9ktqToj1HG?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
<a href="https://mackerel.io/orgs/yude/hosts/4ftHfeojMCU/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/vcn6LE4P2hh6GzvtMbIAWxsXpDh6eSoNyAXdhfYaj9yDN6FJwOHIiz9ktqToj1HG.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
{
|
{
|
||||||
// oracle2
|
// oracle2
|
||||||
@@ -64,7 +64,20 @@ export default function Server(props) {
|
|||||||
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04 LTS</div>
|
||||||
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
||||||
</div>
|
</div>
|
||||||
<iframe className="w-full h-96" src="https://mackerel.io/embed/public/embed/wgmTz7aTgvwfyU6qVHrJJmQlpOHCUJK6qw0W9sJTX68WOI8TFtc27YvJ7dwkQEGv?period=24h" height="400" frameBorder="0" scrolling="no"></iframe>
|
<a href="https://mackerel.io/orgs/yude/hosts/4frgQ1QuivJ/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/wgmTz7aTgvwfyU6qVHrJJmQlpOHCUJK6qw0W9sJTX68WOI8TFtc27YvJ7dwkQEGv.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
|
{
|
||||||
|
// oracle-a1-1
|
||||||
|
}
|
||||||
|
<h2 className="text-2xl text-left font-bold leading-7 sm:text-3xl sm:truncate">oracle-a1-1</h2>
|
||||||
|
<div className="flex xl:w-2/3 text-center">
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('service')} </p>Oracle Cloud</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('shape')} </p>VM.Standard.A1.Flex</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">RAM </p>6GB</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">OS </p>Ubuntu 20.04.3 LTS</div>
|
||||||
|
<div className="flex-1"><p className="font-bold">{t('region')} </p>Japan Central (Osaka)</div>
|
||||||
|
</div>
|
||||||
|
<a href="https://mackerel.io/orgs/yude/hosts/4qzeqT6kToQ/-/graphs/loadavg#period=10m"><img src="https://mackerel.io/embed/public/embed/2C7NdtqLgGFGPiO2IctDGuaMdjBwhXyp0i8imkaJT2GFI55syPaxxACEYIRWDHnS.png?period=10m" className="w-full" /></a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
|
49
pages/services.js
Normal file
49
pages/services.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// Base layout
|
||||||
|
import Layout from "./components/Layout"
|
||||||
|
|
||||||
|
// i18n
|
||||||
|
import { useTranslation, useLanguageQuery, LanguageSwitcher } from 'next-export-i18n';
|
||||||
|
|
||||||
|
// React Router etc.
|
||||||
|
import { useRouter } from 'next/router'
|
||||||
|
import React from "react"
|
||||||
|
|
||||||
|
// React Markdown
|
||||||
|
import ReactMarkdown from "react-markdown"
|
||||||
|
import gfm from 'remark-gfm';
|
||||||
|
import ja from '../docs/services/ja.md'
|
||||||
|
import en from '../docs/services/en.md'
|
||||||
|
|
||||||
|
// next-seo
|
||||||
|
import { NextSeo } from 'next-seo';
|
||||||
|
|
||||||
|
export default function Tos(props) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const [query] = useLanguageQuery();
|
||||||
|
|
||||||
|
if (!query) {
|
||||||
|
return <p>Loading...</p>
|
||||||
|
} else {
|
||||||
|
return(
|
||||||
|
<>
|
||||||
|
<NextSeo
|
||||||
|
title="サービス"
|
||||||
|
description="yude.jp で運用中のサービス"
|
||||||
|
/>
|
||||||
|
<Layout title={t('services')}>
|
||||||
|
<div>
|
||||||
|
{query["lang"] === 'ja' ? (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{ja}
|
||||||
|
</ReactMarkdown>
|
||||||
|
) : (
|
||||||
|
<ReactMarkdown plugins={[gfm]}>
|
||||||
|
{en}
|
||||||
|
</ReactMarkdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user