commit 3a64709b0763e7ac01d509e819c4a6d4b14cd71b
parent 37ea9a923a6e6a42a06d932a2ee3d5f227054805
Author: Sunny <kajimalu10@gmail.com>
Date: Sun, 19 Jul 2026 17:49:34 +0900
feat: add update logs and new character gifts for キサキ and シュン
Diffstat:
4 files changed, 194 insertions(+), 95 deletions(-)
diff --git a/src/components/NewFeatureDialog.tsx b/src/components/NewFeatureDialog.tsx
@@ -1,23 +1,29 @@
"use client";
-import React, { useState, useEffect } from 'react';
+import { useState, useEffect } from 'react';
+import { UPDATE_LOGS } from '@/lib/updateLogs';
export default function NewFeatureDialog() {
const [isOpen, setIsOpen] = useState(false);
const [isChecked, setIsChecked] = useState(false);
+ const latestLog = UPDATE_LOGS[0];
+ const pastLogs = UPDATE_LOGS.slice(1);
+
+ const latestLogId = latestLog ? `${latestLog.date}_${latestLog.content}` : 'initial';
+
useEffect(() => {
if (typeof window !== 'undefined') {
- const isNotified = localStorage.getItem('new_feature_notified');
- if (!isNotified) {
+ const lastNotifiedId = localStorage.getItem('new_feature_notified_id');
+ if (lastNotifiedId !== latestLogId) {
setIsOpen(true);
}
}
- }, []);
+ }, [latestLogId]);
const handleClose = () => {
if (isChecked) {
- localStorage.setItem('new_feature_notified', 'true');
+ localStorage.setItem('new_feature_notified_id', latestLogId);
}
setIsOpen(false);
};
@@ -30,32 +36,51 @@ export default function NewFeatureDialog() {
<div className="border-b border-dashed flex justify-between items-center p-5">
<h2 className="text-xl font-bold text-(--foreground) tracking-wide flex items-center gap-2">
- <span>✨</span> 新機能追加のお知らせ
+ アップデートのお知らせ
</h2>
</div>
- <div className="p-6 flex flex-col gap-4 text-sm font-medium leading-relaxed text-(--secondary-foreground)">
- <p>いつもご利用いただきありがとうございます!</p>
+ <div className=" flex flex-col text-sm font-medium leading-relaxed text-(--secondary-foreground)">
- <div className="bg-(--background) p-4 rounded-xl border border-dashed border-(--muted)/60 flex flex-col gap-3">
- <div className="flex items-start gap-2">
- <span className="text-base">▶</span>
- <div>
- <strong className="text-(--foreground) block font-bold">絆上げ記録機能</strong>
- <span className="text-xs">生徒さんごとに絆上げの記録をつけられるようになりました。日付とランクを入力して登録できます。</span>
+ {/* 1. 最新の更新履歴とコメント(上部に大きく配置) */}
+ {latestLog && (
+ <div className="bg-(--background) p-4 border border-dashed border-(--primary)/30 flex flex-col gap-2">
+ <div className="flex items-center gap-2 text-s font-bold text-(--secondary-foreground)">
+ <span>{latestLog.date}</span>
</div>
+ <strong className="text-base font-bold text-(--foreground) block">
+ {latestLog.content}
+ </strong>
+ {latestLog.comment && (
+ <p className="text-sm text-(--secondary-foreground) font-medium">
+ {latestLog.comment}
+ </p>
+ )}
</div>
- <div className="flex items-start gap-2">
- <span className="text-base">▶</span>
- <div>
- <strong className="text-(--foreground) block font-bold">絆ランク100の未来予想線</strong>
- <span className="text-xs">現在の進捗ペースから絆ランク100に到達する日付を予測して、グラフに破線で描画します。</span>
+ )}
+
+ {/* 2. それ以前の更新履歴(下部にリスト表示) */}
+ {pastLogs.length > 0 && (
+ <div className="flex flex-col gap-2">
+ <div className="show-scrollbar bg-(--background) p-4 border border-dashed border-(--muted)/60 flex flex-col gap-2.5 max-h-36 overflow-y-auto">
+ {pastLogs.map((log, index) => (
+ <div key={index} className="flex flex-col gap-0.5 text-xs">
+ <div className="flex gap-3">
+ <span className="shrink-0 font-bold text-(--muted-foreground)">{log.date}</span>
+ <p className="text-(--secondary-foreground)">{log.content}</p>
+ </div>
+ {log.comment && (
+ <p className="text-[11px] text-(--secondary-foreground)/70 pl-18.5 leading-normal">
+ {log.comment}
+ </p>
+ )}
+ </div>
+ ))}
</div>
</div>
- </div>
+ )}
</div>
- {/* 下部アクションエリア(チェックボックスとボタン) */}
<div className="p-4 bg-(--background)/50 border-t border-dashed border-(--muted)/40 flex flex-col gap-3">
<label className="flex items-center gap-2 px-1 cursor-pointer select-none text-xs text-(--secondary-foreground) font-bold">
<input
@@ -64,14 +89,14 @@ export default function NewFeatureDialog() {
onChange={(e) => setIsChecked(e.target.checked)}
className="w-4 h-4 rounded border-(--muted) text-(--primary) focus:ring-(--primary) cursor-pointer"
/>
- <span>今後このお知らせを表示しない</span>
+ <span>今回のアップデートノートを今後表示しない</span>
</label>
<button
onClick={handleClose}
className="w-full py-3 rounded-xl font-bold bg-(--primary) text-(--primary-foreground) transition-all active:scale-98 cursor-pointer shadow-sm hover:brightness-105"
>
- 閉じる
+ OK
</button>
</div>
diff --git a/src/components/pages.tsx b/src/components/pages.tsx
@@ -1,6 +1,7 @@
"use client";
import React from 'react';
+import { UPDATE_LOGS } from '@/lib/updateLogs';
export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.ReactNode }> = {
about: {
@@ -11,7 +12,7 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
「Cafe Timer」は、ゲーム『ブルーアーカイブ』のカフェ機能を支援する非公式ファンメイドツールです。<br />
生徒さんのカフェ訪問タイミングを通知でお知らせし、先生方の業務をサポートします。
</p>
- <h2 className="text-xl font-bold mt-8 mb-4 text-foreground">主な機能</h2>
+ <h2 className="text-xl font-bold mt-8 mb-4 text-(--foreground)">主な機能</h2>
<ul className="list-disc pl-5 space-y-2">
<li>生徒さんの再タップ可能タイミングのカウントダウン</li>
<li>生徒さんの訪問タイミング(4:00/16:00 JST)のカウントダウン</li>
@@ -19,7 +20,7 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
<li>タップ履歴のカレンダー表示</li>
<li>絆上げの記録とグラフ表示</li>
</ul>
- <h2 className="text-xl font-bold mt-8 mb-4 text-foreground">対応プラットフォーム</h2>
+ <h2 className="text-xl font-bold mt-8 mb-4 text-(--foreground)">対応プラットフォーム</h2>
<p>
PCおよびスマートフォンの最新ブラウザで動作します。<br />
PWAに対応しているため、ホーム画面に追加してアプリのように使うことができます。
@@ -32,7 +33,7 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
body: (
<div className="space-y-6 font-normal">
<section>
- <h2 className="text-xl font-bold mb-3 text-foreground border-b border-muted pb-2">
+ <h2 className="text-xl font-bold mb-3 text-(--foreground) border-b border-muted pb-2">
🟦 カフェタイマーの使い方
</h2>
<ul className="list-disc pl-5 space-y-2">
@@ -45,7 +46,7 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
</ul>
</section>
<section>
- <h2 className="text-xl font-bold mb-3 text-foreground border-b border-muted pb-2">
+ <h2 className="text-xl font-bold mb-3 text-(--foreground) border-b border-muted pb-2">
🟨 Tap履歴の使い方
</h2>
<ul className="list-disc pl-5 space-y-2">
@@ -55,7 +56,7 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
</ul>
</section>
<section>
- <h2 className="text-xl font-bold mb-3 text-foreground border-b border-muted pb-2">
+ <h2 className="text-xl font-bold mb-3 text-(--foreground) border-b border-muted pb-2">
🟦 履歴と同期
</h2>
<p>
@@ -64,7 +65,7 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
</p>
</section>
<section>
- <h2 className="text-xl font-bold mb-3 text-foreground border-b border-muted pb-2">
+ <h2 className="text-xl font-bold mb-3 text-(--foreground) border-b border-muted pb-2">
🟨 通知設定について
</h2>
<p className="mb-4">
@@ -97,107 +98,107 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
title: "FAQ",
body: (
<div className="space-y-4 font-normal">
- <h2 className="text-xl font-bold mb-3 text-foreground border-b border-muted pb-2">
+ <h2 className="text-xl font-bold mb-3 text-(--foreground) border-b border-muted pb-2">
🟦 機能
</h2>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: 記録を間違えてタップしてしまいました。削除できますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: カフェタッチのTap履歴は個別に編集・削除することはできません。絆ランク記録は直近6件のデータまで削除可能です。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: 追加招待券には対応しますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 今のところは対応していません。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: ゲーム内でタップしたら自動で反映されますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 本サイトはゲーム内のデータに一切アクセスしていません。ゲーム内カフェでのタップ後は、こちらでも手動でTapボタンを押してください。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: Tap履歴のエクスポートはできますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: テキストデータなどによるエクスポートは、今のところは対応していません。SNSなどへの共有は、月ごとの画像エクスポート機能をご使用ください。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: The history calendar doesn't match the dates I actually tapped.</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: The historical calendar considers the period from 4:00 AM to 3:59 AM the following day (Japan Standard Time) as one day. If you reside in a country using a time zone different from UTC+9, please understand this may not match the actual date you use.</p>
</div>
- <h2 className="text-xl font-bold mb-3 text-foreground border-b border-muted pb-2">
+ <h2 className="text-xl font-bold mb-3 text-(--foreground) border-b border-muted pb-2">
🟨 システム
</h2>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: オフラインでも利用できますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 利用できません。インターネットへの接続が必要です。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: ゲーム内部のデータを使用していますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 本サイトはゲーム「ブルーアーカイブ」内に実装されている機能などは使用していません。また、ゲームデータ自体にもアクセスしていませんので、本サイトがゲーム内のアカウントに影響を与えることはありません。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: アプリを閉じてもタイマー・チケットは維持されますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: はい、維持されます。時間はサーバー側に保存されているため、ブラウザを閉じたり、別の端末からアクセスしたりしても、最新の状態が反映されます。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: データのバックアップは必要ですか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: ログインに使用しているDiscordアカウントに紐づいてクラウド上に保存されるため、ログアウトしてもデータが消えることはありません。ただし、データの永久保存については保証しておりませんので、各自で別途記録しておくことをおすすめします。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: 複数の端末で同時に使えますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 複数端末でお使いいただけますが、複数端末での同時操作はデータの不整合を引き起こす可能性があります。データの整合性を保つために、他方の端末では再読み込みを行ってから操作を開始してください。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: 1つの端末で複数アカウントを管理できますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 可能ですが、本サイトはアカウントを切り替えて使うシステムを実装していませんので、都度ログアウト・ログインが必要となります。また、通知機能は端末ごとに管理されており、1つの端末につき1つのアカウントのみ通知を受信できますのでご了承ください。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: このサービスは無料で使えますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: はい、すべての機能を無料でご利用いただけます。ただし、個人開発のサービスであるため、予告なく仕様変更やサービス停止を行う可能性がある点はあらかじめご了承ください。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: 通知が届きません。</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: ブラウザの設定で通知が「許可」になっているかご確認ください。また、本サイトの通知設定をやり直してみてください(使い方ガイドのページも参照)。ご利用の端末に起因する通知の不着は、申し訳ありませんが対応いたしかねます。利用規約にもある通り、通知は必ず届くことを保証しておりません。</p>
</div>
<div className="flex flex-col gap-1">
- <h3 className="font-bold text-foreground">
+ <h3 className="font-bold text-(--foreground)">
Q: Discord以外のログイン方法はありますか?</h3>
- <p className="font-normal text-sm">
+ <p className="font-normal text-(--secondary-foreground) text-sm">
A: 現在はDiscord認証のみに対応しています。本サイトはアカウントを切り替えて使用する設計になっていないため、他の認証システムを導入する予定もありません。</p>
</div>
</div>
@@ -209,15 +210,15 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
<div className="space-y-4 font-normal text-sm">
<p>この利用規約は、本ウェブサイト上で提供するサービス(以下、「本サービス」といいます。)の利用条件を定めるものです。</p>
- <h3 className="font-bold text-foreground mt-6">1. 免責事項</h3>
- <ul className="list-disc pl-5">
+ <h3 className="font-bold text-(--foreground) mt-6">1. 免責事項</h3>
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li>本サービスは現状有姿で提供され、その機密性、完全性、可用性を保証するものではありません。</li>
<li>本サービスの利用により生じた損害(ゲーム内での損失、データ消失など)について、運営者は一切の責任を負いません。</li>
<li>通知機能はブラウザや設定、端末、ネットワーク環境等に依存するため、確実に届くことを保証するものではありません。</li>
</ul>
- <h3 className="font-bold text-foreground mt-6">2. 禁止事項</h3>
- <ul className="list-disc pl-5">
+ <h3 className="font-bold text-(--foreground) mt-6">2. 禁止事項</h3>
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li>本サービスのサーバーに過度な負荷をかける行為</li>
<li>不正アクセス行為</li>
<li>本サービスを営利目的に使用する行為</li>
@@ -226,13 +227,13 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
<li>禁止事項に違反した場合は、アカウント及び保存されたデータの削除、IPアドレス遮断などの相当な措置を行うことがあります。</li>
</ul>
- <h3 className="font-bold text-foreground mt-6">3. サービスの変更・停止</h3>
- <ul className="list-disc pl-5">
+ <h3 className="font-bold text-(--foreground) mt-6">3. サービスの変更・停止</h3>
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li>運営者は、ユーザーに通知することなく、本サービスの内容を変更または提供を中止することができるものとします。</li>
</ul>
- <h3 className="font-bold text-foreground mt-6">4. 著作権</h3>
- <ul className="list-disc pl-5">
+ <h3 className="font-bold text-(--foreground) mt-6">4. 著作権</h3>
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li>本サービスは個人によって制作された非公式ツールであり、株式会社Yostar、NEXON Games、およびその他の関連団体とは一切関係ありません。</li>
<li>本サービス中の『ブルーアーカイブ』に関係するデータ等の著作権は、株式会社Yostar、NEXON Games、およびその他の権利者に帰属します。</li>
<li>本サービスのファビコンおよびアプリアイコンは、<a href="https://www.flaticon.com/free-icons/coffee-break" title="coffee break icons" target="_blank" rel="noopener noreferrer" className="hover:underline text-blue-400">Freepik社</a> のライセンスの下で使用しています。</li>
@@ -248,85 +249,92 @@ export const OVERLAY_CONTENTS: Record<string, { title: string; body: React.React
<div className="space-y-4 font-normal text-sm">
<p>当サイトは、ユーザーの個人情報の取扱いについて、以下のとおりプライバシーポリシーを定めます。</p>
- <h3 className="font-bold text-foreground mt-6">1. 収集する情報</h3>
- <ul className="list-disc pl-5">
+ <h3 className="font-bold text-(--foreground) mt-6">1. 収集する情報</h3>
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li><b>認証情報</b>: Discordログイン時に提供されるユーザーID、メールアドレス、プロフィール画像URL。これらはユーザーの識別とデータ保存のためにのみ使用されます。</li>
<li><b>利用データ</b>: タイマーのタップ履歴、設定情報。</li>
<li><b>通知トークン</b>: プッシュ通知を送信するために必要なトークン。</li>
</ul>
- <h3 className="font-bold text-foreground mt-6">2. 利用目的</h3>
- <ul className="list-disc pl-5">
+ <h3 className="font-bold text-(--foreground) mt-6">2. 利用目的</h3>
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li>本サービスの提供・運営のため</li>
<li>通知機能の提供のため</li>
<li>アクセス解析による利便性向上のため</li>
<li>不正アクセスの防止のため</li>
</ul>
- <h3 className="font-bold text-foreground mt-6">3. アクセス解析ツール</h3>
- <p>
+ <h3 className="font-bold text-(--foreground) mt-6">3. アクセス解析ツール</h3>
+ <p className="text-(--secondary-foreground)">
当サイトでは、サービスの改善を目的として以下のツールを利用し、個人を特定できない匿名のトラフィックデータを収集しています。
</p>
- <ul className="list-disc pl-5">
+ <ul className="list-disc text-(--secondary-foreground) pl-5">
<li><b>Google Analytics</b>: Cookieを使用してサイトの利用状況を収集するために使用されます。</li>
<li><b>Cloudflare Browser Insights</b>: サイトのパフォーマンスや接続状況を分析するために使用されます。</li>
</ul>
- <h3 className="font-bold text-foreground mt-6">4. 第三者への提供</h3>
- <p>当サイトは、法令に基づく場合を除き、予めユーザーの同意を得ることなく第三者に個人情報を提供することはありません。ただし、本サービスの基盤としてSupabaseを使用しており、データはSupabaseのサーバー上で管理されます。</p>
+ <h3 className="font-bold text-(--foreground) mt-6">4. 第三者への提供</h3>
+ <p className="text-(--secondary-foreground)">
+ 当サイトは、法令に基づく場合を除き、予めユーザーの同意を得ることなく第三者に個人情報を提供することはありません。ただし、本サービスの基盤としてSupabaseを使用しており、データはSupabaseのサーバー上で管理されます。
+ </p>
- <h3 className="font-bold text-foreground mt-6">5. データの削除</h3>
- <p>ユーザーは設定画面の「データ削除」ボタンから、いつでも自身の全データをサーバーから完全に削除することができます。なお、アクセス解析によって収集された匿名情報については、本操作の対象外となります。</p>
+ <h3 className="font-bold text-(--foreground) mt-6">5. データの削除</h3>
+ <p className="text-(--secondary-foreground)">
+ ユーザーは設定画面の「データ削除」ボタンから、いつでも自身の全データをサーバーから完全に削除することができます。なお、アクセス解析によって収集された匿名情報については、本操作の対象外となります。
+ </p>
</div>
),
},
operator: {
title: "運営者情報など",
body: (() => {
- const updateLogs = [
- { date: '2026-06-11', content: '贈物追加: ナグサ(水着)' },
- { date: '2026-06-10', content: '新規追加: ナグサ(水着)' },
- { date: '2026-06-10', content: '贈物修正: エリカ' },
- { date: '2026-06-07', content: '絆ランク記録機能追加' },
- { date: '2026-02-08', content: '初回リリース' },
- ];
+ const pastLogs = UPDATE_LOGS;
return (
<div className="space-y-4 font-normal">
<div className="grid grid-cols-1 gap-6">
<div className="flex flex-col gap-2">
- <h3 className="font-bold text-foreground border-b border-muted pb-1">運営代表・開発</h3>
+ <h3 className="font-bold text-(--foreground) border-b border-muted pb-1">運営代表・開発</h3>
<p className="font-normal">
さにー<span className="ml-2 mr-1">X:</span><a href="https://x.com/156miyako" target="_blank" rel="noopener noreferrer" className="hover:underline text-blue-400">@156miyako</a><br />
<span className="ml-11 mr-1">HP:</span><a href="https://rabbit1.cc" target="_blank" rel="noopener noreferrer" className="hover:underline text-blue-400">https://rabbit1.cc</a>
</p>
</div>
<div className="flex flex-col gap-2">
- <h3 className="font-bold text-foreground border-b border-muted pb-1">開発協力</h3>
+ <h3 className="font-bold text-(--foreground) border-b border-muted pb-1">開発協力</h3>
<p className="font-normal">
ハチか<span className="ml-2 mr-1">X:</span><a href="https://x.com/bite_sour_sweet" target="_blank" rel="noopener noreferrer" className="hover:underline text-blue-400">@bite_sour_sweet</a>
</p>
</div>
<div className="flex flex-col gap-2">
- <h3 className="font-bold text-foreground border-b border-muted pb-1">謝辞</h3>
+ <h3 className="font-bold text-(--foreground) border-b border-muted pb-1">謝辞</h3>
<p className="font-normal">
ブルーアーカイブ(ブルアカ)攻略 Wiki 様(絆ランクテーブル・生徒さんごとの贈り物対応付けに使用)<span className="ml-2 mr-1">HP:</span><a href="https://bluearchive.wikiru.jp/" target="_blank" rel="noopener noreferrer" className="hover:underline text-blue-400">https://bluearchive.wikiru.jp/</a>
</p>
</div>
</div>
+
<div className="flex flex-col gap-2">
- <h3 className="font-bold text-foreground border-b border-muted pb-1">変更履歴</h3>
- <div className="show-scrollbar bg-background/50 rounded-md p-1.5 max-h-48 overflow-y-auto space-y-1 text-sm">
- {updateLogs.map((log, index) => (
- <div key={index} className="flex gap-3">
- <span className="shrink-0">{log.date}</span>
- <p className="text-foreground/80">{log.content}</p>
+ <h3 className="font-bold text-(--foreground) border-b border-muted pb-1">変更履歴</h3>
+ <div className="show-scrollbar bg-background/50 rounded-md p-3 max-h-60 overflow-y-auto space-y-1 text-sm">
+ {pastLogs.map((log, index) => (
+ <div key={index} className="flex flex-col gap-0.5">
+ <div className="flex gap-3 text-(--foreground)">
+ <span className="shrink-0 w-18">{log.date}</span>
+ <p>{log.content}</p>
+ </div>
+ {log.comment && (
+ <p className="text-xs text-(--secondary-foreground) pl-21 leading-relaxed">
+ {log.comment}
+ </p>
+ )}
</div>
))}
</div>
</div>
+
<div className="flex flex-col gap-2">
- <h3 className="font-bold text-foreground border-b border-muted pb-1">連絡先・フィードバック</h3>
+ <h3 className="font-bold text-(--foreground) border-b border-muted pb-1">連絡先・フィードバック</h3>
<p className="text-sm leading-relaxed">
不具合・ミスのご報告やご要望は、
<a href="https://github.com/Sunny-JP/ba-cafe" target="_blank" rel="noopener noreferrer" className="mx-1 hover:underline text-blue-400">
diff --git a/src/lib/bondData.ts b/src/lib/bondData.ts
@@ -864,6 +864,19 @@ export const CHARACTER_LIST = [
} as Record<string, keyof typeof GIFT_EXP>
},
{
+ id: 'kisaki_swimsuit',
+ name: 'キサキ(水着)',
+ giftRatings: {
+ 'レトロな卵の工芸品': 'ss',
+ '刺繍付きのハンカチ': 'na',
+ '夏模様の浮き輪': 'na',
+ '埋蔵金の地図': 'nb',
+ '世界で最も無駄な絡繰りボックス': 'nb',
+ '高級そうな欲望のつぼ': 'nb',
+ 'ぜんまい式オルゴール': 'nb',
+ } as Record<string, keyof typeof GIFT_EXP>
+ },
+ {
id: 'kirara',
name: 'キララ',
giftRatings: {
@@ -1258,6 +1271,19 @@ export const CHARACTER_LIST = [
} as Record<string, keyof typeof GIFT_EXP>
},
{
+ id: 'shun_swimsuit',
+ name: 'シュン(水着)',
+ giftRatings: {
+ '栄養満載の総合ビタミンゼリー': 'ss',
+ 'サミュエラ「ザ・ビヨンド」': 'sa',
+ '頭脳開発キューブパズル': 'na',
+ '夏模様の浮き輪': 'na',
+ 'チェリーローズカラーのグロス': 'nb',
+ 'お肌を透明にするBBクリーム': 'nb',
+ 'ミリタリー用カモフラージュクリーム3種セット': 'nb',
+ } as Record<string, keyof typeof GIFT_EXP>
+ },
+ {
id: 'shun_kid',
name: 'シュン(幼女)',
giftRatings: {
diff --git a/src/lib/updateLogs.ts b/src/lib/updateLogs.ts
@@ -0,0 +1,39 @@
+interface UpdateLog {
+ date: string;
+ content: string;
+ comment?: string; // 更新ごとの個別コメント(オプショナル)
+}
+
+export const UPDATE_LOGS: UpdateLog[] = [
+ {
+ date: '2026-07-19',
+ content: '贈物追加: キサキ(水着)・シュン(水着)',
+ comment: '実装からこちらの追加まで時間が経ってしまい申し訳ありません。管理者が引っ越しのためバタバタしていました。お許しください。'
+ },
+ {
+ date: '2026-06-11',
+ content: '贈物追加: ナグサ(水着)',
+ },
+ {
+ date: '2026-06-10',
+ content: '新規追加: ナグサ(水着)'
+ },
+ {
+ date: '2026-06-10',
+ content: '贈物修正: エリカ'
+ },
+ {
+ date: '2026-06-07',
+ content: '絆ランク100の未来予想線追加',
+ comment: '現在の進捗ペースから絆ランク100に到達する日付を予測して、グラフに破線で描画します。'
+ },
+ {
+ date: '2026-06-07',
+ content: '絆ランク記録機能追加',
+ comment: '新機能!生徒さんごとに絆上げの記録をつけられるようになりました。日付とランクを入力して登録できます。'
+ },
+ {
+ date: '2026-02-08',
+ content: '初回リリース'
+ },
+];+
\ No newline at end of file