'
+ f'
{cat_id}. {cat.get("title", "")}
'
+ f'
{cat.get("tagline", "")}
'
+ f'
톤: {cat.get("tone", "")}
'
+ f' {items_html}'
+ f'
',
+ unsafe_allow_html=True,
+ )
+```
+
+- [ ] **Step 2: stage 전환 후 시각 확인**
+
+```bash
+docker cp app.py hackathon-vote:/app/app.py
+docker compose restart vote
+sleep 3
+docker exec hackathon-vote python3 -c "
+import os; os.environ['DATA_PATH']='/app/data/hackathon.json'
+import sys; sys.path.insert(0,'/app')
+from app import set_stage; set_stage('topics')
+"
+```
+
+브라우저로 `/` 진입 → 2×2 카테고리 카드 + 색상 그라디언트 + 10주제 list.
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add app.py
+git commit -m "feat: stage topics — 2×2 카테고리 그리드 + 10주제 list + 색상"
+```
+
+---
+
+## Task 11: Stage `vote` — QR + 진행률 + autorefresh
+
+**Files:**
+- Modify: `app.py` — `render_stage_vote` 본구현 + autorefresh import
+
+- [ ] **Step 1: import 추가**
+
+`app.py` import 섹션 끝에:
+
+```python
+from streamlit_autorefresh import st_autorefresh
+```
+
+- [ ] **Step 2: `render_stage_vote` 교체**
+
+```python
+def render_stage_vote(data):
+ st_autorefresh(interval=3000, key="vote_poll")
+
+ st.markdown('