fanfic

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 0c8270189d53714a7b4fe44aa38113b592b2555e
Author: minerva-jupiter <ryouturn@gmail.com>
Date:   Sat, 20 Dec 2025 14:35:22 +0900

init commit

Diffstat:
Aabout.html | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aarticle.html | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aarticles/1.txt | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aindex.html | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alist.html | 115+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asns.html | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astyles.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; +}