commit 0c8270189d53714a7b4fe44aa38113b592b2555e
Author: minerva-jupiter <ryouturn@gmail.com>
Date: Sat, 20 Dec 2025 14:35:22 +0900
init commit
Diffstat:
| A | about.html | | | 75 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | article.html | | | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | articles/1.txt | | | 98 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | index.html | | | 54 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | list.html | | | 115 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | sns.html | | | 57 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | styles.css | | | 155 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
7 files changed, 624 insertions(+), 0 deletions(-)
diff --git a/about.html b/about.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html lang="jp">
+ <head>
+ <meta charset="utf-8" />
+ <title>Trinity Library - Fanfic Index</title>
+ <meta name="author" content="ハチか" />
+ <meta name="description" content="ファンフィクション(二次創作置き場)" />
+ <link rel="stylesheet" href="styles.css" />
+ </head>
+ <body>
+ <header>
+ Library
+ <button class="theme-toggle" id="theme-btn">MODE: LIGHT</button>
+ </header>
+ <nav>
+ <a href="index.html">ホーム</a>
+ <a href="list.html">蔵書目録</a>
+ <a href="sns.html">sns一覧</a>
+ <a href="about.html">about</a>
+ </nav>
+ <main>
+ <span class="doc-id">DOC_TYPE: ABOUT / REF_NO: 777</span>
+ <h1>このサイトについて</h1>
+
+ <h2>トリニティ図書館・書庫</h2>
+ <p>
+ ここは個人の二次創作、主に「ブルーアーカイブ」に関する作品を収蔵する場所です。
+ </p>
+
+ <h2>免責事項 (Disclaimer)</h2>
+ <p>
+ このサイトに掲載されているすべての作品は、ファン活動として制作された二次創作物です。
+ 原作である「ブルーアーカイブ」をはじめ、NEXON Games Co.,
+ Ltd.、株式会社Yostar、その他すべての公式関係者様とは一切関係ありません。
+ </p>
+ <p>
+ 内容はすべて個人の解釈に基づくものであり、公式の見解、設定、ストーリーラインを代表するものではありません。また、掲載内容の無断転載、複製、商業利用を固く禁じます。
+ </p>
+
+ <h2>ソースコード (Source Code)</h2>
+ <p>
+ このウェブサイトのソースコードは、以下のGitHubリポジトリで公開しています。
+ <br />
+ <a
+ href="https://github.com/minerva-jupiter/fanfic"
+ target="_blank"
+ rel="noopener noreferrer"
+ >https://github.com/minerva-jupiter/fanfic</a
+ >
+ </p>
+ </main>
+ <footer>
+ このページは主にBlueArchiveの二次創作であり,公式を模す意図はありません.
+ </footer>
+
+ <script>
+ const btn = document.getElementById("theme-btn");
+ const docId = document.getElementById("doc-id");
+ let isDark = false;
+
+ btn.addEventListener("click", () => {
+ isDark = !isDark;
+ document.documentElement.setAttribute(
+ "data-theme",
+ isDark ? "dark" : "light",
+ );
+ btn.textContent = isDark ? "MODE: DARK" : "MODE: LIGHT";
+
+ docId.textContent = isDark
+ ? "DOC_TYPE: NIGHT_ARCHIVE / REF_NO: 404"
+ : "DOC_TYPE: INDEX / REF_NO: 773";
+ });
+ </script>
+ </body>
+</html>
diff --git a/article.html b/article.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html lang="jp">
+ <head>
+ <meta charset="utf-8" />
+ <title>Article</title>
+ <link rel="stylesheet" href="styles.css" />
+ </head>
+ <body>
+ <header>
+ <a href="index.html" style="color: white; text-decoration: none"
+ >Trinity Library</a
+ >
+ </header>
+ <main>
+ <h1 id="article-title"></h1>
+ <article>
+ <span class="doc-id" id="doc-id"
+ >DOC_TYPE: ARTICLE / REF_NO: 775</span
+ >
+ <div id="article-content" class="content"></div>
+ </article>
+ </main>
+
+ <script>
+ window.addEventListener("DOMContentLoaded", () => {
+ const params = new URLSearchParams(window.location.search);
+ const articleId = params.get("id");
+
+ const titleElement = document.getElementById("article-title");
+ const contentElement =
+ document.getElementById("article-content");
+
+ if (!articleId) {
+ titleElement.textContent = "Error";
+ contentElement.innerHTML = `<p class="error">No article ID provided. Please use a URL like <code>article.html?id=1</code></p>`;
+ return;
+ }
+
+ fetch(`articles/${articleId}.txt`)
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(
+ `Article not found. The file <code>articles/${articleId}.txt</code> does not exist.`,
+ );
+ }
+ return response.text();
+ })
+ .then((text) => {
+ const lines = text.split("\n");
+ const title = lines[0];
+ const preformattedContent = lines.slice(1).join("\n");
+
+ document.title = title;
+ titleElement.textContent = title;
+
+ const preElement = document.createElement("pre");
+ preElement.textContent = preformattedContent;
+
+ contentElement.innerHTML = "";
+ contentElement.appendChild(preElement);
+ })
+ .catch((error) => {
+ console.error("Error fetching article:", error);
+ titleElement.textContent = "Error";
+ contentElement.innerHTML = `<p class="error">${error.message}</p>`;
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/articles/1.txt b/articles/1.txt
@@ -0,0 +1,98 @@
+一つの熱と旅路の風と
+そろそろ今日の当番のカヨコがシャーレにつくであろう時間に、モモトークでカヨコから連絡が来た。
+「先生、ごめん、ちょっと遅れる」らしい。
+私は「大丈夫?今どこにいるの?」と聞くと、カヨコからD.U.地区の場所が送られてきた。
+シャーレからはそう遠くないため、行ってみることにした。
+上着の襟を内側に寄せて整え、シッテムの箱を持ってシャーレを後にした。
+送られてきた場所につくと、カヨコが歩道のヘリの少し高くなった縁石に座り込んでいた。
+ゆっくりとカヨコに近づくと、カヨコの前に猫が横たわっているのが見えた。
+更に二、三歩近づいてよく見ると、白茶色と白の斑の柄の猫のお腹の毛が赤く濡れていた。
+その下のアスファルトも赤黒く濡れているのが解った。
+あと一歩行けばカヨコに触れられそうなところで私は立ち止まり、声をかけた。
+「カヨコ、大丈夫?」カヨコは顔を私に向け、目を開いて私を見た。
+「先生……その、私は大丈夫なんだけど、この子が……」
+カヨコはそう言って、猫の方に目線を戻した。
+猫は目を瞑って動かない。
+私はD.U.の道路管理をしている部署に電話をかけた。
+すると、保健所に繋がれ、一時間ほどで到着すると言われた。
+私はカヨコにその旨を伝えると「ちょっとまっててね」と言い、その場を離れた。
+私は近くの自販機であたたかい缶ココアを二つ買った。
+商品が落ちてくる時に鳴るガタンッという煩い音が、耳の外側で響いた。
+先程よりも静かな足取りでカヨコのもとに戻ると、カヨコは近くの花壇の縁に腰掛けていた。
+私はカヨコに缶ココアを一つ差し出して「カヨコ、飲む?」と訊いた。
+カヨコは「うん。ありがと」と言って左手でそれを受け取った。
+私はカヨコの隣に腰掛けて、もう一つの缶ココアを開けた。
+口の中に甘くて温かい味が広がった。
+コーヒーであれば、残業のときに目覚ましによく飲むのだが、ココアを飲む機会はあまりなかった。
+チョコよりも甘くない、濃くもない、目が覚めるわけでもない久々のココアを、また一口啜った。
+カヨコが、缶に添えた右手の指先を見ながら呟いた。
+「あの子、私が見つけたときは、未だ生きてたんだ」
+「首を動かしながら、声にならない声で泣いてた」
+カヨコの言葉が止まり、車が一台、私達の前を通り過ぎて、向こうの角を曲がって見えなくなった。
+「そうだったんだね」とだけ言葉を返して、私も黙った。
+中高年くらいの夫婦が通りかかった。
+夫の方は苦虫を噛み潰したような顔になりながら、心做しか早足になり、
+妻の方は目に入らぬように顔の横に手をやり、夫についていくように二歩ほど小走りした。
+親子連れも通りかかった。
+子供の一人と母親が手を繋いで前を、もう一人の子供と父親が後ろを歩いていた。
+母親はたち度もあると、父親の方に向き、何か二言三言を言うと、それぞれ子供を抱きかかえて、子供に見せないように歩いていった。
+ふと、カヨコを見ると、おそらく残り少ない缶ココアを握り、羽根を自らの身体に巻くようにしていた。
+カヨコが俯いたまま、再び呟き始めた。
+「先生、別に来なくても良かったのに。
+仕事、あるんでしょ?」私は応える。
+「来たくて来たんだよ。カヨコの事が気になってさ。それに、これも大事な仕事だよ」
+「ふふっ」
+カヨコは喉を鳴らすように笑った。
+「先生らしいね」
+「そうかな。あはは……」
+頬をかきながら答えた。
+そうこうしていると、向こうの交差点を光沢のない白色の軽トラックが曲がってきた。
+黄色がかったフロントライトが太陽の下でも少し眩しい。
+軽トラックは私達の前まで来ると、ブレーキをかけて減速し、縁石の切れ目に乗り入れた。
+扉を開けて降りてきた人は、私達に話しかけてきた。
+「あなたが、連絡をくださった先生ですか?」
+「はい」
+「連絡いただき、ありがとうございます」
+その人とそれだけ話すと、その人は猫の方に歩いていった。
+しゃがみ込んで猫の身体に手を触れる。
+それからその人は、軽トラックの荷台の方に行った。
+カヨコは黙って、風に吹かれてすすきのように揺れる猫の毛並みを眺めていた。
+保健所の人は、肘のあたりまである青いビニルの手袋をはめて、新聞紙のひかれた段ボール箱を持ってきた。
+箱を猫のとなりに置くと、なんの躊躇いもなく猫を持ち上げて、箱の中に入れた。
+はみ出る手足を、身体を丸めることで箱内に収め、軽トラックに乗せた。
+手袋を外してトラックに乗せると、再び私達の方へ歩いてきた。
+「収容はおわりました。多分、轢かれたんじゃないかと思うのですがねぇ。有難うございました」
+「こちらこそ、ありがとうございます」
+そう返すと、保健所の人は軽トラックに乗り込んで、バックして車道に出て、そのまま走り出した。
+ふと、隣のカヨコを見ると、右手の親指の腹を眺めていた。
+「カヨコ、それじゃあ私達も行こうか」
+「うん」
+そう言って私達はシャーレに向かった。
+執務室の机の上には山積みの仕事があり、カヨコはそれを見て拳を握ろうかと力んだ。
+私はカヨコに向かい合って立ち、両手を広げた。
+「どうしたの先生…?」
+「カヨコ、おいで」
+「え?」
+「いいから、おいで」
+「う、うん」
+そう言って、カヨコは恐る恐る私の胸の中へ収まった。
+私は手をカヨコの背中にまわし、カヨコもそれに従って、私の背中に手をまわす。
+握っていた拳を開いて、私の体温がカヨコの手に伝わる。
+その熱がカヨコの手を再び温めると、カヨコは先生の胸の中で呟き始めた。
+「私、あの子に何もしてあげられなかった……」
+「カヨコは優しいね」
+「え……?」
+「カヨコはあの子が最後の旅に発つのを助けたんだよ」
+「なにそれ。スピリチュアル?」
+「ううん。カヨコはあの子のことを慮ってたんでしょ?だから、優しいなって」
+「そっか……」
+カヨコの声が私の胸を揺らしてくぐもっている。
+「あの子が動かなくなって、あの子の頭を撫でたんだ。そのときは未だ、幽かに暖かくて……」
+カヨコはそう言うと、腕により力を込めた。
+私とカヨコの熱は混ざりあって、一つになった。
+「先生、ありがとう」
+「ううん。これも私の役目だからね」
+「ふふっ」
+「え?なに?」
+「なんだか先生らしいなって」
+そうして私達は今日の仕事に取り掛かった。
diff --git a/index.html b/index.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="jp">
+ <head>
+ <meta charset="utf-8" />
+ <title>Trinity Library - Fanfic Index</title>
+ <meta name="author" content="ハチか" />
+ <meta name="description" content="ファンフィクション(二次創作置き場)" />
+ <link rel="stylesheet" href="styles.css" />
+ </head>
+ <body>
+ <header>
+ Library
+ <button class="theme-toggle" id="theme-btn">MODE: LIGHT</button>
+ </header>
+ <nav>
+ <a href="index.html">ホーム</a>
+ <a href="list.html">蔵書目録</a>
+ <a href="sns.html">sns一覧</a>
+ <a href="about.html">about</a>
+ </nav>
+ <main>
+ <span class="doc-id" id="doc-id"
+ >DOC_TYPE: INDEX / REF_NO: 773</span
+ >
+ <h1>ホーム</h1>
+ <p>
+ ようこそトリニティの図書館へ.<br />
+ ここは静寂と知性が交差する場所です。
+ </p>
+ </main>
+ <footer>
+ このページは主にBlueArchiveの二次創作であり,公式を模す意図はありません.
+ </footer>
+
+ <script>
+ const btn = document.getElementById("theme-btn");
+ const docId = document.getElementById("doc-id");
+ let isDark = false;
+
+ btn.addEventListener("click", () => {
+ isDark = !isDark;
+ document.documentElement.setAttribute(
+ "data-theme",
+ isDark ? "dark" : "light",
+ );
+ btn.textContent = isDark ? "MODE: DARK" : "MODE: LIGHT";
+
+ docId.textContent = isDark
+ ? "DOC_TYPE: NIGHT_ARCHIVE / REF_NO: 404"
+ : "DOC_TYPE: INDEX / REF_NO: 773";
+ });
+ </script>
+ </body>
+</html>
diff --git a/list.html b/list.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<html lang="jp">
+ <head>
+ <meta charset="utf-8" />
+ <title>Trinity Library - Fanfic Index</title>
+ <meta name="author" content="ハチか" />
+ <meta name="description" content="ファンフィクション(二次創作置き場)" />
+ <link rel="stylesheet" href="styles.css" />
+ </head>
+ <body>
+ <header>
+ Library
+ <button class="theme-toggle" id="theme-btn">MODE: LIGHT</button>
+ </header>
+ <nav>
+ <a href="index.html">ホーム</a>
+ <a href="list.html">蔵書目録</a>
+ <a href="sns.html">sns一覧</a>
+ <a href="about.html">about</a>
+ </nav>
+ <main>
+ <span class="doc-id" id="doc-id"
+ >DOC_TYPE: INDEX / REF_NO: 773</span
+ >
+ <h1>蔵書目録</h1>
+ <ul id="article-list">
+ <!-- Links will be added here by JavaScript -->
+ </ul>
+ </main>
+ <footer>
+ このページは主にBlue
+ Archiveの二次創作であり,公式を模す意図はありません.
+ </footer>
+
+ <script>
+ // --- Theme Toggle Script ---
+ const btn = document.getElementById("theme-btn");
+ const docId = document.getElementById("doc-id");
+ let isDark = false;
+
+ btn.addEventListener("click", () => {
+ isDark = !isDark;
+ document.documentElement.setAttribute(
+ "data-theme",
+ isDark ? "dark" : "light",
+ );
+ btn.textContent = isDark ? "MODE: DARK" : "MODE: LIGHT";
+
+ docId.textContent = isDark
+ ? "DOC_TYPE: NIGHT_ARCHIVE / REF_NO: 404"
+ : "DOC_TYPE: INDEX / REF_NO: 773";
+ });
+
+ // --- Article List Generation Script ---
+ window.addEventListener("DOMContentLoaded", () => {
+ const articleListElement =
+ document.getElementById("article-list");
+
+ // This function tries to fetch an article by its ID.
+ // If successful, it returns the title; otherwise, it returns null.
+ async function fetchArticleTitle(id) {
+ try {
+ const response = await fetch(`articles/${id}.txt`);
+ if (!response.ok) {
+ return null; // Stop when we get a 404 error
+ }
+ const text = await response.text();
+ const title = text.split("\n")[0]; // The first line is the title
+ return title;
+ } catch (error) {
+ console.error(`Error fetching article ${id}:`, error);
+ return null;
+ }
+ }
+
+ // This function fetches articles one by one until none are found.
+ async function loadAllArticles() {
+ articleListElement.innerHTML = "<li>Loading...</li>";
+ let id = 1;
+ const articles = [];
+
+ while (true) {
+ const title = await fetchArticleTitle(id);
+ if (title) {
+ articles.push({ id, title });
+ id++;
+ } else {
+ break; // No more articles found
+ }
+ }
+
+ // Clear the "Loading..." message
+ articleListElement.innerHTML = "";
+
+ // Populate the list with links
+ if (articles.length > 0) {
+ articles.forEach((article) => {
+ const listItem = document.createElement("li");
+ const link = document.createElement("a");
+ link.href = `article.html?id=${article.id}`;
+ link.textContent = article.title;
+ listItem.appendChild(link);
+ articleListElement.appendChild(listItem);
+ });
+ } else {
+ articleListElement.innerHTML =
+ "<li>No articles found.</li>";
+ }
+ }
+
+ loadAllArticles();
+ });
+ </script>
+ </body>
+</html>
diff --git a/sns.html b/sns.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="jp">
+ <head>
+ <meta charset="utf-8" />
+ <title>Trinity Library - Fanfic Index</title>
+ <meta name="author" content="ハチか" />
+ <meta name="description" content="ファンフィクション(二次創作置き場)" />
+ <link rel="stylesheet" href="styles.css" />
+ </head>
+ <body>
+ <header>
+ Library
+ <button class="theme-toggle" id="theme-btn">MODE: LIGHT</button>
+ </header>
+ <nav>
+ <a href="index.html">ホーム</a>
+ <a href="list.html">蔵書目録</a>
+ <a href="sns.html">sns一覧</a>
+ <a href="about.html">about</a>
+ </nav>
+ <main>
+ <span class="doc-id" id="doc-id"
+ >DOC_TYPE: SNS / REF_NO: 776</span
+ >
+ <h1>SNS一覧</h1>
+ <p>
+ <ul>
+ <li><a href="https://bsky.app/profile/fanfic.minervajuppiter.net">BlueSky</a></li>
+ <li><a href="https://twitter.com/bite_sour_sweet">Twitter</a></li>
+ <li><a href="https://www.pixiv.net/users/76640927">Pixiv</a></li>
+ </ul>
+ </p>
+ </main>
+ <footer>
+ このページは主にBlueArchiveの二次創作であり,公式を模す意図はありません.
+ </footer>
+
+ <script>
+ const btn = document.getElementById("theme-btn");
+ const docId = document.getElementById("doc-id");
+ let isDark = false;
+
+ btn.addEventListener("click", () => {
+ isDark = !isDark;
+ document.documentElement.setAttribute(
+ "data-theme",
+ isDark ? "dark" : "light",
+ );
+ btn.textContent = isDark ? "MODE: DARK" : "MODE: LIGHT";
+
+ docId.textContent = isDark
+ ? "DOC_TYPE: NIGHT_ARCHIVE / REF_NO: 404"
+ : "DOC_TYPE: INDEX / REF_NO: 773";
+ });
+ </script>
+ </body>
+</html>
diff --git a/styles.css b/styles.css
@@ -0,0 +1,155 @@
+@import url("https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@400;700&family=Playfair+Display:ital@0;1&display=swap");
+
+:root {
+ --trinity-navy: #1a2e56;
+ --trinity-gold: #b89a5b;
+ --bg-color: #f8f9fa;
+ --panel-white: #ffffff;
+ --text-main: #1a2e56;
+ --text-sub: #445;
+ --border-color: #ddd;
+}
+
+[data-theme="dark"] {
+ --bg-color: #0d1626;
+ --panel-white: #16243d;
+ --text-main: #e2e8f0;
+ --text-sub: #94a3b8;
+ --border-color: #2d3748;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: "Noto Serif JP", serif;
+ background-color: var(--bg-color);
+ color: var(--text-main);
+ line-height: 1.6;
+ transition:
+ background-color 0.3s,
+ color 0.3s;
+}
+
+header {
+ background-color: var(--trinity-navy);
+ color: white;
+ padding: 1rem 2rem;
+ font-family: "Playfair Display", serif;
+ font-style: italic;
+ font-size: 1.5rem;
+ letter-spacing: 0.1em;
+ border-bottom: 3px solid var(--trinity-gold);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.theme-toggle {
+ cursor: pointer;
+ background: transparent;
+ border: 1px solid rgba(255, 255, 255, 0.4);
+ color: white;
+ font-size: 0.7rem;
+ padding: 4px 12px;
+ border-radius: 2px;
+ letter-spacing: 0.1em;
+ transition: 0.2s;
+}
+.theme-toggle:hover {
+ background: rgba(255, 255, 255, 0.1);
+}
+
+nav {
+ background: var(--panel-white);
+ padding: 0 2rem;
+ border-bottom: 1px solid var(--border-color);
+ display: flex;
+ gap: 2rem;
+ transition:
+ background-color 0.3s,
+ border-color 0.3s;
+}
+
+nav a {
+ text-decoration: none;
+ color: var(--text-main);
+ font-size: 0.9rem;
+ padding: 1rem 0;
+ border-bottom: 2px solid transparent;
+ transition: 0.3s;
+ cursor: pointer;
+}
+
+nav a:hover {
+ color: var(--trinity-gold);
+}
+
+main {
+ max-width: 800px;
+ margin: 3rem auto;
+ padding: 3rem;
+ background: var(--panel-white);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+ border-radius: 2px;
+ position: relative;
+ transition: background-color 0.3s;
+}
+
+main::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 4px;
+ background: repeating-linear-gradient(
+ 90deg,
+ var(--trinity-gold),
+ var(--trinity-gold) 10px,
+ transparent 10px,
+ transparent 20px
+ );
+ opacity: 0.3;
+}
+
+h1 {
+ font-size: 1.8rem;
+ font-weight: 700;
+ border-bottom: 1px solid var(--border-color);
+ padding-bottom: 1rem;
+ margin-bottom: 2rem;
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+
+h1::before {
+ content: "■";
+ font-size: 0.8rem;
+ color: var(--trinity-gold);
+}
+
+p {
+ font-size: 1.1rem;
+ color: var(--text-sub);
+}
+
+footer {
+ max-width: 800px;
+ margin: 2rem auto;
+ padding: 1rem;
+ font-size: 0.75rem;
+ color: var(--text-sub);
+ text-align: center;
+ border-top: 1px solid var(--border-color);
+ opacity: 0.7;
+}
+
+.doc-id {
+ position: absolute;
+ top: 1rem;
+ right: 1rem;
+ font-family: monospace;
+ font-size: 0.7rem;
+ opacity: 0.4;
+}