ponshu-room-lite/web/download/index.html

317 lines
11 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ponshu Room - ダウンロード</title>
<meta name="description" content="日本酒コレクションアプリ - 撮って、記録して、味わう">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300;400;500&family=Noto+Serif+JP:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🍶</text></svg>">
<style>
.user-select-overlay {
position: fixed;
top: 0; left: 0;
width: 100%; height: 100%;
background: rgba(74, 59, 50, 0.95);
backdrop-filter: blur(10px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
opacity: 1;
transition: opacity 0.3s var(--ease-out);
}
.user-select-overlay.hidden {
opacity: 0;
pointer-events: none;
}
.user-select-box {
background: var(--washi-white);
border-radius: 24px;
padding: var(--space-xl);
max-width: 400px;
width: 90%;
text-align: center;
}
.user-select-title {
font-family: var(--font-serif);
font-size: 1.5rem;
margin-bottom: var(--space-lg);
color: var(--sumi-black);
}
.user-buttons {
display: flex;
gap: var(--space-md);
margin-bottom: var(--space-md);
}
.user-button {
flex: 1;
padding: var(--space-lg);
background: white;
border: 2px solid var(--gray-200);
border-radius: 16px;
font-family: var(--font-sans);
font-size: 1.125rem;
font-weight: 500;
color: var(--sumi-black);
cursor: pointer;
transition: all 0.3s var(--ease-out);
}
.user-button:hover {
border-color: var(--kohaku-gold);
transform: translateY(-2px);
box-shadow: 0 12px 24px -8px rgba(74, 59, 50, 0.15);
}
.user-select-note {
font-size: 0.75rem;
color: var(--gray-400);
margin-top: var(--space-md);
}
.version-card.disabled {
opacity: 0.5;
pointer-events: none;
}
.info-banner {
background: rgba(212, 165, 116, 0.1);
border: 1px solid var(--kohaku-gold);
border-radius: 12px;
padding: var(--space-sm) var(--space-md);
text-align: center;
}
.info-banner-user {
font-weight: 500;
color: var(--kohaku-gold);
}
.change-user-btn {
display: inline-block;
margin-top: var(--space-xs);
font-size: 0.75rem;
color: var(--kohaku-gold);
text-decoration: underline;
cursor: pointer;
}
.change-user-btn:hover { color: var(--kohaku-deep); }
.card-version {
font-size: 0.7rem;
color: var(--gray-400);
letter-spacing: 0.04em;
}
@media (prefers-color-scheme: dark) {
.user-select-box { background: #1E1E1E; }
.user-button { background: #2A2A2A; border-color: #3A3A3A; color: var(--sumi-black); }
.info-banner { background: rgba(212, 165, 116, 0.15); }
}
</style>
</head>
<body>
<!-- User Selection Overlay -->
<div id="userSelectOverlay" class="user-select-overlay">
<div class="user-select-box">
<h2 class="user-select-title">ユーザーを選択</h2>
<div class="user-buttons">
<button class="user-button" onclick="selectUser('maita')">Mai</button>
<button class="user-button" onclick="selectUser('eiji')">Eiji</button>
</div>
<p class="user-select-note">あなた専用のAPKをダウンロードします</p>
</div>
</div>
<div class="container">
<!-- Hero -->
<header class="hero">
<div class="logo">
<span class="sake-icon" role="img" aria-label="日本酒">🍶</span>
<h1>Ponshu Room</h1>
</div>
<p class="tagline">日本酒を撮って、記録して、味わう</p>
</header>
<!-- User Info Banner -->
<div id="infoBanner" class="info-banner" style="display: none;">
<div class="info-banner-user">
<span id="currentUserName"></span> 用のAPK &nbsp;·&nbsp; <span id="releaseDate"></span>
</div>
<a class="change-user-btn" onclick="changeUser()">ユーザーを変更</a>
</div>
<!-- Download Section -->
<section class="download">
<div class="version-cards">
<!-- Lite -->
<a id="liteDownload" href="#" class="version-card" download>
<div class="card-header">
<span class="version-name">Lite</span>
<span class="version-badge free">Free</span>
</div>
<div class="card-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M12 3v12m0 0l-4-4m4 4l4-4M5 17v2a2 2 0 002 2h10a2 2 0 002-2v-2"/>
</svg>
</div>
<span class="card-version" id="liteVersion"></span>
<span class="file-size" id="liteSize">90 MB</span>
</a>
<!-- Pro -->
<a id="proDownload" href="#" class="version-card pro" download>
<div class="card-header">
<span class="version-name">Pro</span>
<span class="version-badge pro-badge">Pro</span>
</div>
<div class="card-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M12 3v12m0 0l-4-4m4 4l4-4M5 17v2a2 2 0 002 2h10a2 2 0 002-2v-2"/>
</svg>
</div>
<span class="card-version" id="proVersion"></span>
<span class="file-size" id="proSize">90 MB</span>
</a>
</div>
<p class="platform-note">Android 8.0+ (API Level 24)</p>
</section>
<!-- Features -->
<section class="features">
<div class="feature">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M23 19a2 2 0 01-2 2H3a2 2 0 01-2-2V8a2 2 0 012-2h4l2-3h6l2 3h4a2 2 0 012 2z"/>
<circle cx="12" cy="13" r="4"/>
</svg>
<span>撮影</span>
</div>
<div class="feature">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/>
</svg>
<span>AI解析</span>
</div>
<div class="feature">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
</svg>
<span>コレクション</span>
</div>
<div class="feature">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/>
<circle cx="12" cy="10" r="3"/>
</svg>
<span>マップ</span>
</div>
</section>
</div>
<script>
let currentUser = null;
let releaseData = null;
// releases.json から動的にデータを取得
async function loadReleases() {
try {
const res = await fetch('releases.json?t=' + Date.now());
releaseData = await res.json();
applyReleaseData();
} catch (e) {
// フォールバック: 固定値
releaseData = {
version: 'v1.0.16',
date: '2026-02-23',
apks: {
maita: {
lite: { url: 'https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.16/ponshu_room_lite_maita.apk', size_mb: 90 },
pro: { url: 'https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.16/ponshu_room_pro_maita.apk', size_mb: 90 }
},
eiji: {
lite: { url: 'https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.16/ponshu_room_lite_eiji.apk', size_mb: 90 },
pro: { url: 'https://posimai-lab.tail72e846.ts.net/mai/ponshu-room-lite/releases/download/v1.0.16/ponshu_room_pro_eiji.apk', size_mb: 90 }
}
}
};
applyReleaseData();
}
}
function applyReleaseData() {
if (!releaseData) return;
document.getElementById('liteVersion').textContent = releaseData.version || '';
document.getElementById('proVersion').textContent = releaseData.version || '';
document.getElementById('releaseDate').textContent = releaseData.date || '';
updateSizeDisplay();
if (currentUser) updateDownloadLinks();
}
function updateSizeDisplay() {
if (!releaseData) return;
const user = currentUser || 'eiji';
const apks = releaseData.apks?.[user] || releaseData.apks?.eiji || {};
const liteMB = apks.lite?.size_mb;
const proMB = apks.pro?.size_mb;
document.getElementById('liteSize').textContent = liteMB != null ? liteMB + ' MB' : '89 MB';
document.getElementById('proSize').textContent = proMB != null ? proMB + ' MB' : '90 MB';
}
function selectUser(user) {
currentUser = user;
localStorage.setItem('ponshu_user', user);
updateDownloadLinks();
hideUserSelect();
}
function changeUser() { showUserSelect(); }
function updateDownloadLinks() {
if (!currentUser || !releaseData) return;
const apks = releaseData.apks[currentUser];
const nameMap = { maita: 'Mai', eiji: 'Eiji' };
updateSizeDisplay();
// Lite
if (apks?.lite?.url) {
document.getElementById('liteDownload').href = apks.lite.url;
document.getElementById('liteDownload').classList.remove('disabled');
}
// Pro存在しない場合は非表示
const proCard = document.getElementById('proDownload');
if (apks?.pro?.url) {
proCard.href = apks.pro.url;
proCard.style.display = '';
} else {
proCard.style.display = 'none';
}
document.getElementById('currentUserName').textContent = nameMap[currentUser] || currentUser;
document.getElementById('infoBanner').style.display = 'block';
}
function showUserSelect() {
document.getElementById('userSelectOverlay').classList.remove('hidden');
}
function hideUserSelect() {
document.getElementById('userSelectOverlay').classList.add('hidden');
}
window.addEventListener('DOMContentLoaded', async () => {
await loadReleases();
const savedUser = localStorage.getItem('ponshu_user');
if (savedUser === 'maita' || savedUser === 'eiji') {
selectUser(savedUser);
} else {
showUserSelect();
}
});
document.getElementById('liteDownload').addEventListener('click', (e) => {
if (!currentUser) { e.preventDefault(); showUserSelect(); }
});
document.getElementById('proDownload').addEventListener('click', (e) => {
if (!currentUser) { e.preventDefault(); showUserSelect(); }
});
</script>
</body>
</html>