317 lines
11 KiB
HTML
317 lines
11 KiB
HTML
<!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 · <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>
|