Skip to content

Commit 1b36a7a

Browse files
committed
Add HUB Google observation experiment lab prototype
1 parent 9fa5ec5 commit 1b36a7a

1 file changed

Lines changed: 123 additions & 0 deletions

File tree

‎experiment-lab.html‎

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<!doctype html>
2+
<html lang="ja">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" />
6+
<title>Aifate HUB — 観測実験室 Prototype</title>
7+
<style>
8+
:root{
9+
--bg:#061019;--panel:#0b1824;--panel2:#0d1e2c;--line:rgba(255,255,255,.10);
10+
--text:#edf8ff;--muted:#88a0b4;--cyan:#74e9ff;--green:#63df9d;--yellow:#ffd66d;
11+
--red:#ff7184;--violet:#b79cff;--shadow:0 18px 48px rgba(0,0,0,.34)
12+
}
13+
*{box-sizing:border-box}
14+
html,body{margin:0;min-height:100%;background:radial-gradient(circle at 50% -10%,rgba(50,135,190,.17),transparent 35%),linear-gradient(180deg,#07111a,#040a0f 70%);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans JP",sans-serif}
15+
body{padding-bottom:env(safe-area-inset-bottom)}
16+
button,select,input{font:inherit}
17+
button{cursor:pointer}
18+
a{color:inherit;text-decoration:none}
19+
.shell{width:min(1180px,100%);margin:0 auto;padding:12px 14px 30px}
20+
.topbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:4px 0 12px}
21+
.brand{display:flex;align-items:center;gap:10px}.logo{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;border:1px solid rgba(116,233,255,.55);box-shadow:0 0 20px rgba(116,233,255,.15) inset}.logo:before{content:'A';font-weight:800}.brand b{display:block;font-size:14px;letter-spacing:.08em}.brand small{display:block;color:var(--muted);font-size:9px;margin-top:1px}.back{border:1px solid var(--line);background:rgba(255,255,255,.04);color:#bfd0dd;padding:8px 10px;border-radius:10px;font-size:10px}
22+
.nav{display:flex;gap:7px;overflow:auto;padding:2px 0 12px;scrollbar-width:none}.nav::-webkit-scrollbar{display:none}.nav button{flex:0 0 auto;border:1px solid var(--line);background:rgba(255,255,255,.035);color:#91a7b8;padding:9px 12px;border-radius:999px;font-size:10px}.nav button.active{color:#eaffff;border-color:rgba(116,233,255,.45);background:rgba(116,233,255,.10)}
23+
.hero{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;margin:4px 0 12px}.hero h1{font-size:22px;margin:0 0 5px}.hero p{margin:0;color:#91a9ba;font-size:11px;line-height:1.6}.sample{flex:0 0 auto;border:1px solid rgba(255,214,109,.35);background:rgba(255,214,109,.08);color:#ffe6a1;border-radius:999px;padding:6px 9px;font-size:9px}
24+
.grid{display:grid;grid-template-columns:1.15fr .85fr;gap:12px}.card{background:linear-gradient(180deg,rgba(13,30,44,.90),rgba(8,20,30,.90));border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow);padding:14px}.card h2{font-size:13px;margin:0 0 10px}.sub{color:#7f98aa;font-size:9px;letter-spacing:.11em;text-transform:uppercase;margin-bottom:5px}
25+
.statuses{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:12px}.source{border:1px solid var(--line);border-radius:12px;padding:9px 10px;background:rgba(255,255,255,.025)}.source .line{display:flex;align-items:center;justify-content:space-between;gap:8px}.source b{font-size:10px}.source small{display:block;color:var(--muted);font-size:8px;margin-top:4px}.dot{width:7px;height:7px;border-radius:50%;display:inline-block}.ok{background:var(--green);box-shadow:0 0 10px rgba(99,223,157,.6)}.pending{background:var(--yellow);box-shadow:0 0 10px rgba(255,214,109,.5)}.later{background:#607789}
26+
.formgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:9px}.field label{display:block;color:#8299aa;font-size:9px;margin:0 0 5px}.control{width:100%;border:1px solid var(--line);background:#09141e;color:#eaf7ff;border-radius:10px;padding:10px 10px;font-size:11px;outline:none}.control:focus{border-color:rgba(116,233,255,.45)}.wide{grid-column:1/-1}.hypo{min-height:74px;resize:none}.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.chip{border:1px solid rgba(116,233,255,.23);background:rgba(116,233,255,.07);color:#c8f8ff;border-radius:999px;padding:6px 8px;font-size:9px}.actions{display:flex;gap:8px;margin-top:12px}.primary,.secondary{border-radius:11px;padding:10px 12px;font-weight:700;font-size:10px}.primary{border:1px solid rgba(116,233,255,.42);background:rgba(116,233,255,.13);color:#eaffff}.secondary{border:1px solid var(--line);background:rgba(255,255,255,.04);color:#a9bdcb}
27+
.obs-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.obs-head h2{margin-bottom:3px}.obs-title{font-size:15px;font-weight:750}.state{border:1px solid rgba(99,223,157,.30);background:rgba(99,223,157,.08);color:#a9f1c8;padding:5px 8px;border-radius:999px;font-size:9px}.meta{font-size:9px;color:#7f97a8;margin-top:4px}.metric-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:12px}.metric{padding:10px;border:1px solid var(--line);border-radius:12px;background:rgba(255,255,255,.022)}.metric b{display:block;font-size:17px}.metric span{display:block;color:#7f98aa;font-size:8px;margin-top:3px}.delta{margin-top:5px;font-size:9px;color:var(--green)}.delta.down{color:var(--red)}
28+
.periods{display:flex;gap:6px;margin:12px 0 4px}.periods button{border:1px solid var(--line);background:transparent;color:#8298a9;border-radius:8px;padding:6px 9px;font-size:9px}.periods button.active{color:#eaffff;border-color:rgba(116,233,255,.4);background:rgba(116,233,255,.09)}
29+
.chart{margin-top:10px;height:148px;display:flex;align-items:flex-end;gap:8px;padding:12px 4px 0;border-bottom:1px solid var(--line);position:relative}.chart:before,.chart:after{content:'';position:absolute;left:0;right:0;border-top:1px dashed rgba(255,255,255,.07)}.chart:before{top:36%}.chart:after{top:66%}.barset{flex:1;display:flex;align-items:flex-end;gap:3px;height:100%;position:relative;z-index:1}.bar{flex:1;border-radius:5px 5px 2px 2px;background:linear-gradient(180deg,rgba(116,233,255,.92),rgba(116,233,255,.22));min-height:4px}.bar.alt{background:linear-gradient(180deg,rgba(183,156,255,.92),rgba(183,156,255,.22))}.xlabel{position:absolute;bottom:-18px;left:50%;transform:translateX(-50%);font-size:7px;color:#6f8596;white-space:nowrap}
30+
.full{grid-column:1/-1}.toolbar{display:flex;gap:7px;flex-wrap:wrap;margin:2px 0 10px}.filter{border:1px solid var(--line);background:rgba(255,255,255,.025);color:#aebfcb;border-radius:9px;padding:7px 9px;font-size:9px}.tablewrap{overflow:auto;border:1px solid var(--line);border-radius:12px}.table{min-width:780px;width:100%;border-collapse:collapse}.table th,.table td{text-align:left;padding:9px 10px;border-bottom:1px solid rgba(255,255,255,.06);font-size:9px}.table th{color:#6f889a;font-weight:600;background:rgba(255,255,255,.025);position:sticky;top:0}.table tr:last-child td{border-bottom:0}.table td:first-child{font-size:10px;font-weight:650}.up{color:var(--green)}.dn{color:var(--red)}.tag{display:inline-block;border:1px solid var(--line);border-radius:999px;padding:3px 6px;color:#9db1c0;font-size:8px}.tag.visit{color:#c9baff;border-color:rgba(183,156,255,.35);background:rgba(183,156,255,.07)}
31+
.insight{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:start;border:1px solid rgba(116,233,255,.16);background:rgba(116,233,255,.045);border-radius:13px;padding:11px;margin-top:11px}.orb{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;border:1px solid rgba(116,233,255,.38);color:#dffcff;box-shadow:0 0 18px rgba(116,233,255,.12)}.insight b{font-size:10px}.insight p{font-size:9px;line-height:1.65;color:#91a7b7;margin:4px 0 0}
32+
.footnote{margin-top:10px;color:#708797;font-size:8px;line-height:1.6}
33+
@media(max-width:760px){.shell{padding:10px 10px 24px}.grid{grid-template-columns:1fr}.hero h1{font-size:18px}.hero p{font-size:10px}.statuses{grid-template-columns:1fr}.formgrid{grid-template-columns:1fr}.wide{grid-column:auto}.metric-grid{grid-template-columns:repeat(2,1fr)}.card{padding:12px;border-radius:14px}.hero{align-items:center}.sample{font-size:8px}.tablewrap{margin-left:-1px;margin-right:-1px}.actions{position:sticky;bottom:8px;z-index:5}.primary,.secondary{backdrop-filter:blur(12px)}}
34+
@media(max-width:390px){.brand small{display:none}.hero{gap:8px}.hero h1{font-size:17px}.metric b{font-size:15px}.nav button{padding:8px 10px}.sample{padding:5px 7px}}
35+
</style>
36+
</head>
37+
<body>
38+
<div class="shell">
39+
<div class="topbar">
40+
<div class="brand"><div class="logo"></div><div><b>AIFATE HUB</b><small>GROWTH OBSERVATION LAB</small></div></div>
41+
<a class="back" href="./index.html">← HOME</a>
42+
</div>
43+
44+
<div class="nav">
45+
<button>集客概況</button><button>回遊</button><button>広告</button><button class="active">実験室</button>
46+
</div>
47+
48+
<div class="hero">
49+
<div><h1>観測実験室</h1><p>仮説を固定し、記事群を同じ条件で観測して、次の一手につなげる。</p></div>
50+
<div class="sample">SAMPLE DATA</div>
51+
</div>
52+
53+
<div class="statuses">
54+
<div class="source"><div class="line"><b>GA4 Data API</b><span class="dot ok"></span></div><small>既存接続を利用 / 流入・回遊・イベント</small></div>
55+
<div class="source"><div class="line"><b>Search Console</b><span class="dot pending"></span></div><small>HUB API接続を追加 / 検索語句・表示・CTR・順位</small></div>
56+
<div class="source"><div class="line"><b>AdSense</b><span class="dot later"></span></div><small>後段追加 / Page RPM・推定収益</small></div>
57+
</div>
58+
59+
<div class="grid">
60+
<section class="card">
61+
<div class="sub">Create observation</div><h2>実験条件を固定する</h2>
62+
<div class="formgrid">
63+
<div class="field"><label>観測名</label><input class="control" value="三重県10記事テスト #01" /></div>
64+
<div class="field"><label>対象媒体</label><select class="control"><option>Twinow</option></select></div>
65+
<div class="field"><label>対象地域</label><select class="control"><option>三重県</option><option>愛知県</option></select></div>
66+
<div class="field"><label>対象記事</label><select class="control"><option>10記事</option><option>20記事</option></select></div>
67+
<div class="field"><label>観測期間</label><select class="control"><option>7日</option><option>14日</option><option>30日</option><option>60日</option><option>90日</option></select></div>
68+
<div class="field"><label>比較基準</label><select class="control"><option>同カテゴリ直近平均</option><option>前期間</option><option>比較群B</option></select></div>
69+
<div class="field wide"><label>仮説</label><textarea class="control hypo">現地取材・独自写真・周辺行動情報を追加した記事群は、AI調査のみの記事群より検索表示・CTR・回遊率が伸びる。</textarea></div>
70+
</div>
71+
<div class="chips"><span class="chip">Organic</span><span class="chip">グルメ</span><span class="chip">三重県</span><span class="chip">現地取材比較</span><span class="chip">Mobile含む</span></div>
72+
<div class="actions"><button class="primary" id="startBtn">この条件で観測を開始</button><button class="secondary" id="saveBtn">下書き保存</button></div>
73+
</section>
74+
75+
<section class="card">
76+
<div class="obs-head"><div><div class="sub">Active observation</div><div class="obs-title">三重県10記事テスト #01</div><div class="meta">Twinow / 三重県 / 10記事 / Day 7 of 30</div></div><div class="state">観測中</div></div>
77+
<div class="metric-grid">
78+
<div class="metric"><b id="impressions">18,920</b><span>検索表示</span><div class="delta">+24.6%</div></div>
79+
<div class="metric"><b id="ctr">5.4%</b><span>CTR</span><div class="delta">+1.8pt</div></div>
80+
<div class="metric"><b id="circulation">34.1%</b><span>2ページ以上回遊</span><div class="delta">+8.2pt</div></div>
81+
<div class="metric"><b id="store">96</b><span>店舗遷移</span><div class="delta">+31.5%</div></div>
82+
</div>
83+
<div class="periods"><button data-p="7" class="active">7日</button><button data-p="14">14日</button><button data-p="30">30日</button><button data-p="60">60日</button><button data-p="90">90日</button></div>
84+
<div class="chart" id="chart"></div>
85+
<div class="insight"><div class="orb">響</div><div><b>観測メモ</b><p id="insightText">現地取材あり5記事は、AI調査のみ5記事よりCTRと回遊率が高い傾向です。まだ7日なので結論は固定せず、14日まで同条件で観測を継続します。</p></div></div>
86+
</section>
87+
88+
<section class="card full">
89+
<div class="sub">Article comparison</div><h2>10記事を同じ条件で比較</h2>
90+
<div class="toolbar"><button class="filter">地域:三重県</button><button class="filter">媒体:Twinow</button><button class="filter">流入:Organic</button><button class="filter">並び:変化率</button></div>
91+
<div class="tablewrap">
92+
<table class="table">
93+
<thead><tr><th>記事</th><th>方式</th><th>表示</th><th>CTR</th><th>平均順位</th><th>回遊率</th><th>店舗遷移</th><th>変化</th></tr></thead>
94+
<tbody>
95+
<tr><td>伊勢のお参りに、甘いひと休み。赤福餅</td><td><span class="tag visit">現地取材</span></td><td>3,820</td><td>6.8%</td><td>9.7</td><td>41%</td><td>28</td><td class="up">↑ 32%</td></tr>
96+
<tr><td>伊勢神宮のあとに食べたい伊勢うどん</td><td><span class="tag visit">現地取材</span></td><td>3,110</td><td>6.2%</td><td>10.8</td><td>38%</td><td>21</td><td class="up">↑ 27%</td></tr>
97+
<tr><td>おかげ横丁で買う三重のお土産</td><td><span class="tag visit">現地取材</span></td><td>2,740</td><td>5.9%</td><td>11.2</td><td>36%</td><td>18</td><td class="up">↑ 19%</td></tr>
98+
<tr><td>雨の日でも楽しめる伊勢周辺</td><td><span class="tag">AI調査</span></td><td>2,020</td><td>4.1%</td><td>15.4</td><td>29%</td><td>9</td><td class="up">↑ 7%</td></tr>
99+
<tr><td>子連れで歩く伊勢エリア</td><td><span class="tag">AI調査</span></td><td>1,880</td><td>3.8%</td><td>17.1</td><td>26%</td><td>7</td><td class="dn">↓ 2%</td></tr>
100+
<tr><td>伊勢市駅から始める半日プラン</td><td><span class="tag visit">現地取材</span></td><td>1,650</td><td>5.2%</td><td>12.6</td><td>35%</td><td>8</td><td class="up">↑ 14%</td></tr>
101+
<tr><td>伊勢の駐車場を迷わず選ぶ</td><td><span class="tag">AI調査</span></td><td>1,420</td><td>3.5%</td><td>18.8</td><td>24%</td><td>3</td><td class="dn">↓ 4%</td></tr>
102+
<tr><td>五十鈴川周辺でひと休み</td><td><span class="tag visit">現地取材</span></td><td>1,210</td><td>5.0%</td><td>13.9</td><td>33%</td><td>2</td><td class="up">↑ 11%</td></tr>
103+
<tr><td>伊勢で今日買える手土産</td><td><span class="tag">AI調査</span></td><td>690</td><td>3.2%</td><td>21.4</td><td>19%</td><td>0</td><td class="dn">↓ 8%</td></tr>
104+
<tr><td>伊勢から志摩へつなぐ寄り道</td><td><span class="tag">AI調査</span></td><td>380</td><td>2.9%</td><td>24.1</td><td>18%</td><td>0</td><td class="dn">↓ 12%</td></tr>
105+
</tbody>
106+
</table>
107+
</div>
108+
<div class="insight"><div class="orb">AI</div><div><b>次の仮説候補</b><p>「現地取材あり」が検索と回遊の両方で優位なら、次は鈴鹿・津で同じ5対5比較を再現。逆に差が薄ければ、取材有無ではなく画像・タイトル・内部リンク条件を1つずつ切り分ける。</p></div></div>
109+
<div class="footnote">※ このページの数値は画面設計確認用のサンプルです。本実装ではGA4 / Search Console / HUB記事マスタの実データへバインドします。</div>
110+
</section>
111+
</div>
112+
</div>
113+
<script>
114+
const chart=document.getElementById('chart');
115+
const series={7:[32,44,38,57,49,66,72],14:[28,35,42,39,48,55,61,58,64,69,72,76,78,82],30:[18,22,26,24,31,35,39,42,45,49,52,55,59,61,63,66,69,72,75,77,79,81,84,86,88,90,91,93,95,97]};
116+
function draw(days){const data=series[days]||series[30];chart.innerHTML='';const show=data.length>16?data.filter((_,i)=>i%Math.ceil(data.length/14)===0):data;show.forEach((v,i)=>{const s=document.createElement('div');s.className='barset';const a=document.createElement('div');a.className='bar';a.style.height=(v*.78)+'%';const b=document.createElement('div');b.className='bar alt';b.style.height=Math.max(12,(v-12)*.62)+'%';s.append(a,b);if(i===0||i===show.length-1){const x=document.createElement('span');x.className='xlabel';x.textContent=i===0?'START':'NOW';s.append(x)}chart.append(s)})}
117+
draw(7);
118+
document.querySelectorAll('.periods button').forEach(btn=>btn.addEventListener('click',()=>{document.querySelectorAll('.periods button').forEach(b=>b.classList.remove('active'));btn.classList.add('active');const p=+btn.dataset.p;draw(p);document.getElementById('insightText').textContent=p<=14?'まだ短期観測です。順位・CTR・回遊の方向は見え始めていますが、結論を固定せず同条件で継続します。':'観測期間が長くなったので、単発変動より傾向を重視します。記事群ごとの差と改善後の持続性を比較します。'}));
119+
document.getElementById('startBtn').addEventListener('click',e=>{e.currentTarget.textContent='観測条件を固定しました ✓';e.currentTarget.style.borderColor='rgba(99,223,157,.45)';e.currentTarget.style.background='rgba(99,223,157,.10)'});
120+
document.getElementById('saveBtn').addEventListener('click',e=>{e.currentTarget.textContent='下書き保存済み ✓'});
121+
</script>
122+
</body>
123+
</html>

0 commit comments

Comments
 (0)