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

307 lines
11 KiB
HTML
Raw Permalink Normal View History

<!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('liteSize').textContent = releaseData.apks.eiji?.lite?.size_mb + ' MB' || '90 MB';
document.getElementById('proSize').textContent = releaseData.apks.eiji?.pro?.size_mb + ' MB' || '90 MB';
document.getElementById('releaseDate').textContent = releaseData.date;
if (currentUser) updateDownloadLinks();
}
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' };
// 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>