feat: initial Posimai Store — landing page with featured app and pricing
This commit is contained in:
commit
67fbecb244
|
|
@ -0,0 +1,596 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="ja">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
||||
<meta name="description" content="Posimai — 日々の暮らしに、静かに寄り添うアプリ">
|
||||
<meta name="theme-color" content="#0D0D0D">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<link rel="icon" type="image/png" href="/logo.png">
|
||||
<link rel="apple-touch-icon" href="/logo.png">
|
||||
<title>Posimai Store</title>
|
||||
<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=Inter:ital,wght@0,300;0,400;0,500;0,600;1,300&display=swap" rel="stylesheet">
|
||||
<script src="https://unpkg.com/lucide@0.344.0/dist/umd/lucide.min.js" integrity="sha384-tTkFttkBclaU1cloKwOi9xk3pbao3VZxTjLNBt8iFABWDBQibbAbWpVmO28zMuxq" crossorigin="anonymous"></script>
|
||||
<style>
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
|
||||
:root {
|
||||
--bg: #0D0D0D;
|
||||
--surface: #161616;
|
||||
--surface2: #1e1e1e;
|
||||
--border: rgba(255,255,255,0.08);
|
||||
--border2: rgba(255,255,255,0.04);
|
||||
--text: #F3F4F6;
|
||||
--text2: #9CA3AF;
|
||||
--text3: #6B7280;
|
||||
--accent: #6EE7B7;
|
||||
--accent-dim: rgba(110,231,183,0.08);
|
||||
--accent-border: rgba(110,231,183,0.2);
|
||||
--radius: 16px;
|
||||
--radius-sm: 10px;
|
||||
}
|
||||
|
||||
html { scroll-behavior: smooth; }
|
||||
body {
|
||||
font-family: 'Inter', -apple-system, sans-serif;
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
font-size: 15px;
|
||||
line-height: 1.7;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
a { color: inherit; text-decoration: none; }
|
||||
button { cursor: pointer; border: none; background: none; font-family: inherit; }
|
||||
|
||||
/* ── Nav ── */
|
||||
nav {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 24px;
|
||||
height: 56px;
|
||||
background: rgba(13,13,13,0.85);
|
||||
backdrop-filter: blur(16px);
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.nav-brand {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.02em;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.nav-brand span {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.nav-links a {
|
||||
font-size: 13px;
|
||||
color: var(--text2);
|
||||
transition: color 0.15s;
|
||||
}
|
||||
|
||||
.nav-links a:hover { color: var(--text); }
|
||||
|
||||
/* ── Hero ── */
|
||||
.hero {
|
||||
max-width: 720px;
|
||||
margin: 0 auto;
|
||||
padding: 96px 24px 80px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hero-eyebrow {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
color: var(--accent);
|
||||
background: var(--accent-dim);
|
||||
border: 1px solid var(--accent-border);
|
||||
padding: 5px 12px;
|
||||
border-radius: 100px;
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: clamp(32px, 5vw, 52px);
|
||||
font-weight: 300;
|
||||
letter-spacing: -0.03em;
|
||||
line-height: 1.15;
|
||||
color: var(--text);
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.hero h1 em {
|
||||
font-style: italic;
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.hero p {
|
||||
font-size: 16px;
|
||||
color: var(--text2);
|
||||
max-width: 480px;
|
||||
margin: 0 auto 40px;
|
||||
line-height: 1.75;
|
||||
}
|
||||
|
||||
/* ── Section ── */
|
||||
.section {
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
padding: 0 24px 80px;
|
||||
}
|
||||
|
||||
.section-label {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
color: var(--text3);
|
||||
margin-bottom: 32px;
|
||||
padding-bottom: 12px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
/* ── App Card ── */
|
||||
.app-card {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 0;
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
overflow: hidden;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.app-card { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
.app-card-body {
|
||||
padding: 40px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.app-card-meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.app-icon {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
border-radius: 12px;
|
||||
background: var(--accent-dim);
|
||||
border: 1px solid var(--accent-border);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: var(--accent);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.app-name-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
}
|
||||
|
||||
.app-name {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.app-platform {
|
||||
font-size: 11px;
|
||||
color: var(--text3);
|
||||
letter-spacing: 0.06em;
|
||||
}
|
||||
|
||||
.app-desc {
|
||||
font-size: 14px;
|
||||
color: var(--text2);
|
||||
line-height: 1.75;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.app-features {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.app-features li {
|
||||
font-size: 13px;
|
||||
color: var(--text2);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.app-features li svg {
|
||||
color: var(--accent);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.app-pricing {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
padding: 32px 40px;
|
||||
background: var(--surface2);
|
||||
justify-content: center;
|
||||
border-left: 1px solid var(--border);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.app-pricing { border-left: none; border-top: 1px solid var(--border); }
|
||||
}
|
||||
|
||||
.tier {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
padding: 20px;
|
||||
border-radius: var(--radius-sm);
|
||||
border: 1px solid var(--border);
|
||||
background: var(--surface);
|
||||
}
|
||||
|
||||
.tier.featured {
|
||||
border-color: var(--accent-border);
|
||||
background: var(--accent-dim);
|
||||
}
|
||||
|
||||
.tier-name {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.1em;
|
||||
text-transform: uppercase;
|
||||
color: var(--text3);
|
||||
}
|
||||
|
||||
.tier.featured .tier-name { color: var(--accent); }
|
||||
|
||||
.tier-price {
|
||||
font-size: 28px;
|
||||
font-weight: 300;
|
||||
letter-spacing: -0.03em;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.tier-price sup {
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
vertical-align: super;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.tier-desc {
|
||||
font-size: 12px;
|
||||
color: var(--text3);
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
padding: 10px 18px;
|
||||
border-radius: 8px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
transition: all 0.15s;
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: var(--accent);
|
||||
color: #0D0D0D;
|
||||
}
|
||||
|
||||
.btn-primary:hover { opacity: 0.88; }
|
||||
|
||||
.btn-ghost {
|
||||
border: 1px solid var(--border);
|
||||
color: var(--text2);
|
||||
}
|
||||
|
||||
.btn-ghost:hover { border-color: rgba(255,255,255,0.2); color: var(--text); }
|
||||
|
||||
.coming-soon-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 5px;
|
||||
font-size: 11px;
|
||||
font-weight: 500;
|
||||
color: var(--text3);
|
||||
background: var(--surface2);
|
||||
border: 1px solid var(--border);
|
||||
padding: 4px 10px;
|
||||
border-radius: 100px;
|
||||
}
|
||||
|
||||
/* ── App grid (coming soon) ── */
|
||||
.app-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.app-mini-card {
|
||||
padding: 24px;
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius-sm);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.app-mini-card .app-icon {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
.app-mini-name { font-size: 14px; font-weight: 500; }
|
||||
.app-mini-desc { font-size: 12px; color: var(--text3); line-height: 1.6; }
|
||||
|
||||
/* ── Philosophy ── */
|
||||
.philosophy {
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
padding: 0 24px 96px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.philosophy p {
|
||||
font-size: 18px;
|
||||
font-weight: 300;
|
||||
line-height: 1.9;
|
||||
color: var(--text2);
|
||||
letter-spacing: -0.01em;
|
||||
}
|
||||
|
||||
.philosophy p em {
|
||||
color: var(--text);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* ── Footer ── */
|
||||
footer {
|
||||
border-top: 1px solid var(--border);
|
||||
padding: 32px 24px;
|
||||
}
|
||||
|
||||
.footer-inner {
|
||||
max-width: 960px;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.footer-copy {
|
||||
font-size: 12px;
|
||||
color: var(--text3);
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.footer-links a {
|
||||
font-size: 12px;
|
||||
color: var(--text3);
|
||||
transition: color 0.15s;
|
||||
}
|
||||
|
||||
.footer-links a:hover { color: var(--text2); }
|
||||
|
||||
/* ── Divider ── */
|
||||
.divider {
|
||||
max-width: 960px;
|
||||
margin: 0 auto 80px;
|
||||
padding: 0 24px;
|
||||
border-top: 1px solid var(--border);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Nav -->
|
||||
<nav>
|
||||
<div class="nav-brand">
|
||||
Posimai <span>Store</span>
|
||||
</div>
|
||||
<div class="nav-links">
|
||||
<a href="#apps">Apps</a>
|
||||
<a href="https://posimai.soar-enrich.com" target="_blank" rel="noopener">Dashboard</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Hero -->
|
||||
<section class="hero">
|
||||
<div class="hero-eyebrow">
|
||||
<i data-lucide="sparkles" style="width:12px;height:12px;"></i>
|
||||
Indie apps, thoughtfully made
|
||||
</div>
|
||||
<h1>日々の暮らしに、<br><em>静かに寄り添う</em>アプリ。</h1>
|
||||
<p>広告なし。余計な機能なし。あなたのデータはあなたのもの。<br>使い込むほどに、自分だけの記録が積み重なっていく。</p>
|
||||
</section>
|
||||
|
||||
<!-- Featured app -->
|
||||
<section class="section">
|
||||
<div class="section-label">Featured</div>
|
||||
|
||||
<div class="app-card">
|
||||
<div class="app-card-body">
|
||||
<div class="app-card-meta">
|
||||
<div class="app-icon">
|
||||
<i data-lucide="wine" style="width:20px;height:20px;"></i>
|
||||
</div>
|
||||
<div class="app-name-group">
|
||||
<div class="app-name">Ponshu Room</div>
|
||||
<div class="app-platform">iOS & Android</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="app-desc">
|
||||
飲んだ日本酒を記録して、自分だけの酒帳を育てるアプリ。
|
||||
AIが味のプロファイルを解析し、あなたの好みを学習する。
|
||||
地図で産地を辿り、季節ごとの変化を楽しめる。
|
||||
</p>
|
||||
|
||||
<ul class="app-features">
|
||||
<li>
|
||||
<i data-lucide="check" style="width:14px;height:14px;"></i>
|
||||
飲んだ日本酒の記録・評価・メモ
|
||||
</li>
|
||||
<li>
|
||||
<i data-lucide="check" style="width:14px;height:14px;"></i>
|
||||
AI による味のレーダーチャート分析
|
||||
</li>
|
||||
<li>
|
||||
<i data-lucide="check" style="width:14px;height:14px;"></i>
|
||||
都道府県マップで産地を可視化
|
||||
</li>
|
||||
<li>
|
||||
<i data-lucide="check" style="width:14px;height:14px;"></i>
|
||||
広告なし・サブスク不要
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="app-pricing">
|
||||
<div class="tier">
|
||||
<div class="tier-name">Free</div>
|
||||
<div class="tier-price">¥0</div>
|
||||
<div class="tier-desc">記録10件まで。機能を試すのに十分。</div>
|
||||
<a href="#" class="btn btn-ghost" id="freeBtn">
|
||||
<i data-lucide="download" style="width:14px;height:14px;"></i>
|
||||
App Store で入手
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="tier featured">
|
||||
<div class="tier-name">Full Access</div>
|
||||
<div class="tier-price"><sup>¥</sup>500</div>
|
||||
<div class="tier-desc">記録無制限・AI分析・全機能。買い切り。</div>
|
||||
<a href="#" class="btn btn-primary" id="buyBtn">
|
||||
<i data-lucide="credit-card" style="width:14px;height:14px;"></i>
|
||||
購入する
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- Coming soon -->
|
||||
<section class="section">
|
||||
<div class="section-label">Coming Soon</div>
|
||||
<div class="app-grid">
|
||||
<div class="app-mini-card">
|
||||
<div class="app-icon">
|
||||
<i data-lucide="brain" style="width:16px;height:16px;"></i>
|
||||
</div>
|
||||
<div class="app-mini-name">Posimai Brain</div>
|
||||
<div class="app-mini-desc">AIが自動でキュレーションするパーソナル記事管理</div>
|
||||
<span class="coming-soon-badge">
|
||||
<i data-lucide="clock" style="width:10px;height:10px;"></i>
|
||||
準備中
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="app-mini-card">
|
||||
<div class="app-icon">
|
||||
<i data-lucide="check-square" style="width:16px;height:16px;"></i>
|
||||
</div>
|
||||
<div class="app-mini-name">Posimai Habit</div>
|
||||
<div class="app-mini-desc">シンプルな習慣トラッカー。続けることに集中できる設計</div>
|
||||
<span class="coming-soon-badge">
|
||||
<i data-lucide="clock" style="width:10px;height:10px;"></i>
|
||||
準備中
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="app-mini-card">
|
||||
<div class="app-icon">
|
||||
<i data-lucide="activity" style="width:16px;height:16px;"></i>
|
||||
</div>
|
||||
<div class="app-mini-name">Posimai Pulse</div>
|
||||
<div class="app-mini-desc">気分・エネルギー・集中度を毎日記録して傾向を把握</div>
|
||||
<span class="coming-soon-badge">
|
||||
<i data-lucide="clock" style="width:10px;height:10px;"></i>
|
||||
準備中
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- Philosophy -->
|
||||
<section class="philosophy">
|
||||
<p>
|
||||
Posimaiのアプリは、<em>余計なものを足さない</em>ことを設計の起点にしています。<br>
|
||||
通知でユーザーを呼び戻す仕掛けも、データを収益化する仕組みも、持ちません。<br>
|
||||
ただ、使いたいときに使えて、記録が残る。それだけを。
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer>
|
||||
<div class="footer-inner">
|
||||
<div class="footer-copy">
|
||||
© 2026 Posimai
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="https://posimai.soar-enrich.com/legal/privacy" target="_blank" rel="noopener">プライバシーポリシー</a>
|
||||
<a href="https://posimai.soar-enrich.com/legal/terms" target="_blank" rel="noopener">利用規約</a>
|
||||
<a href="https://posimai.soar-enrich.com/legal/tokusho" target="_blank" rel="noopener">特定商取引法</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.register('/sw.js').catch(() => {});
|
||||
}
|
||||
if (window.lucide) lucide.createIcons();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"name": "Posimai Store",
|
||||
"short_name": "Store",
|
||||
"description": "日々の暮らしに、静かに寄り添うアプリ",
|
||||
"start_url": "/",
|
||||
"display": "browser",
|
||||
"background_color": "#0D0D0D",
|
||||
"theme_color": "#0D0D0D",
|
||||
"lang": "ja",
|
||||
"icons": [
|
||||
{ "src": "/logo.png", "sizes": "192x192", "type": "image/png", "purpose": "any maskable" },
|
||||
{ "src": "/logo.png", "sizes": "512x512", "type": "image/png", "purpose": "any maskable" }
|
||||
],
|
||||
"categories": ["shopping", "lifestyle"]
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
const CACHE = 'posimai-store-v1';
|
||||
const STATIC = ['/', '/index.html', '/manifest.json', '/logo.png'];
|
||||
|
||||
self.addEventListener('install', e => {
|
||||
e.waitUntil(caches.open(CACHE).then(c => c.addAll(STATIC)).then(() => self.skipWaiting()));
|
||||
});
|
||||
|
||||
self.addEventListener('activate', e => {
|
||||
e.waitUntil(caches.keys().then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k)))).then(() => self.clients.claim()));
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', e => {
|
||||
if (e.request.method !== 'GET') return;
|
||||
if (new URL(e.request.url).origin !== location.origin) return;
|
||||
e.respondWith(
|
||||
caches.match(e.request).then(cached => cached || fetch(e.request).then(res => {
|
||||
const clone = res.clone();
|
||||
caches.open(CACHE).then(c => c.put(e.request, clone));
|
||||
return res;
|
||||
}))
|
||||
);
|
||||
});
|
||||
Loading…
Reference in New Issue