feat: reorder unit sections, Step1 tap-only advance, replace interrupt with back

Made-with: Cursor
This commit is contained in:
posimai 2026-04-19 14:45:19 +09:00
parent bfebf38121
commit 21ae64958b
2 changed files with 61 additions and 64 deletions

View File

@ -356,6 +356,7 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
.flash-card-front{display:flex;flex-direction:column;align-items:center;gap:10px;width:100%} .flash-card-front{display:flex;flex-direction:column;align-items:center;gap:10px;width:100%}
.flash-card-term{font-size:15px;font-weight:600;color:var(--text);line-height:1.45;letter-spacing:-.01em} .flash-card-term{font-size:15px;font-weight:600;color:var(--text);line-height:1.45;letter-spacing:-.01em}
.flash-card-hint{font-size:11px;color:var(--text3);letter-spacing:.04em} .flash-card-hint{font-size:11px;color:var(--text3);letter-spacing:.04em}
.flash-card-hint-footer{margin-top:10px;width:100%}
.flash-card-back{font-size:13px;color:var(--text);line-height:1.75;padding-top:12px;border-top:1px solid var(--border);width:100%;margin-top:0;text-align:left} .flash-card-back{font-size:13px;color:var(--text);line-height:1.75;padding-top:12px;border-top:1px solid var(--border);width:100%;margin-top:0;text-align:left}
.step-count{font-size:10px;color:var(--text3);text-align:center;margin-bottom:10px;letter-spacing:.04em} .step-count{font-size:10px;color:var(--text3);text-align:center;margin-bottom:10px;letter-spacing:.04em}
.s2choice{display:flex;gap:10px;margin-bottom:10px} .s2choice{display:flex;gap:10px;margin-bottom:10px}
@ -509,8 +510,8 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
弱点集中特訓 弱点集中特訓
</div> </div>
<button class="btn-sm" @click="exitWeakDrill()"> <button class="btn-sm" @click="exitWeakDrill()">
<i data-lucide="x" style="width:11px;height:11px"></i> <i data-lucide="arrow-left" style="width:11px;height:11px"></i>
中断 戻る
</button> </button>
</div> </div>
@ -600,6 +601,51 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
</div> </div>
</div> </div>
<!-- Concept -->
<div class="card" x-show="currentUnit && !stepMode">
<div class="card-title">
<i data-lucide="book-open" style="width:13px;height:13px"></i>
概念解説
</div>
<div class="concept-text" x-html="conceptPreview"></div>
<div class="concept-text" x-show="conceptExpanded" x-html="conceptRest"></div>
<button class="concept-expand-btn" x-show="conceptRest"
@click="conceptExpanded = !conceptExpanded">
<i :data-lucide="conceptExpanded ? 'chevron-up' : 'chevron-down'" style="width:11px;height:11px"></i>
<span x-text="conceptExpanded ? '閉じる' : 'もっと詳しく'"></span>
</button>
</div>
<!-- Keypoints -->
<div class="card" x-show="!stepMode && currentUnit?.keypoints?.length">
<div class="card-title">
<i data-lucide="zap" style="width:13px;height:13px"></i>
重要ポイント
</div>
<ul class="key-list">
<template x-for="kp in (currentUnit?.keypoints||[])" :key="kp">
<li class="key-item">
<div class="key-dot"></div>
<span x-html="kp"></span>
</li>
</template>
</ul>
</div>
<!-- Exam tips -->
<div class="card" x-show="currentUnit?.examtips?.length && !stepMode" style="border-color:rgba(248,113,113,.18);background:rgba(248,113,113,.03)">
<div class="card-title" style="color:var(--err)">
<i data-lucide="alert-triangle" style="width:13px;height:13px;color:var(--err)"></i>
試験対策メモ
</div>
<template x-for="tip in (currentUnit?.examtips||[])" :key="tip">
<div class="tips-point">
<div class="tips-icon">!</div>
<span x-html="tip"></span>
</div>
</template>
</div>
<!-- Study mode buttons --> <!-- Study mode buttons -->
<div style="display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap" x-show="currentUnit && !stepMode"> <div style="display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap" x-show="currentUnit && !stepMode">
<button class="btn-sm btn-accent" @click="startStepMode()" <button class="btn-sm btn-accent" @click="startStepMode()"
@ -616,9 +662,9 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
<i data-lucide="layers" style="width:13px;height:13px"></i> <i data-lucide="layers" style="width:13px;height:13px"></i>
3ステップで学ぶ 3ステップで学ぶ
</div> </div>
<button class="btn-sm" @click="exitStepMode()"> <button class="btn-sm" type="button" @click="exitStepMode()">
<i data-lucide="x" style="width:11px;height:11px"></i> <i data-lucide="arrow-left" style="width:11px;height:11px"></i>
中断 戻る
</button> </button>
</div> </div>
<div class="step-pips"> <div class="step-pips">
@ -634,20 +680,16 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
Step 1 — 用語確認 Step 1 — 用語確認
</div> </div>
<div class="step-count" x-text="(stepKpIdx+1) + ' / ' + (currentUnit?.keypoints?.length||0) + ' ポイント'"></div> <div class="step-count" x-text="(stepKpIdx+1) + ' / ' + (currentUnit?.keypoints?.length||0) + ' ポイント'"></div>
<div class="flash-card" role="button" tabindex="0" :aria-expanded="stepFlashRevealed" <div class="flash-card" role="button" tabindex="0" :aria-expanded="stepFlashRevealed || !keypointHasFlip(stepKpIdx)"
@click="revealFlash()" @keydown.enter.prevent="revealFlash()" @keydown.space.prevent="revealFlash()"> @click="advanceStep1Card()" @keydown.enter.prevent="advanceStep1Card()" @keydown.space.prevent="advanceStep1Card()">
<div class="flash-card-front" x-show="!stepFlashRevealed && keypointHasFlip(stepKpIdx)"> <div class="flash-card-front" x-show="!stepFlashRevealed && keypointHasFlip(stepKpIdx)">
<div class="flash-card-term" x-text="keypointTerm(stepKpIdx)"></div> <div class="flash-card-term" x-text="keypointTerm(stepKpIdx)"></div>
<div class="flash-card-hint">タップして全文を表示</div> <div class="flash-card-hint">タップして全文を表示</div>
</div> </div>
<div class="flash-card-back" x-show="stepFlashRevealed" <div class="flash-card-back" x-show="stepFlashRevealed"
x-html="currentUnit?.keypoints?.[stepKpIdx]"></div> x-html="currentUnit?.keypoints?.[stepKpIdx]"></div>
</div> <div class="flash-card-hint flash-card-hint-footer"
<div class="step-action-row"> x-show="stepFlashRevealed || !keypointHasFlip(stepKpIdx)">タップで次へ</div>
<button class="btn-sm btn-accent" @click="nextStepFlash()" x-show="stepFlashRevealed">
次へ
<i data-lucide="arrow-right" style="width:11px;height:11px"></i>
</button>
</div> </div>
</div> </div>
@ -698,50 +740,6 @@ header{display:flex;align-items:center;justify-content:space-between;padding:0 1
</div> </div>
</div> </div>
<!-- Concept -->
<div class="card" x-show="currentUnit && !stepMode">
<div class="card-title">
<i data-lucide="book-open" style="width:13px;height:13px"></i>
概念解説
</div>
<div class="concept-text" x-html="conceptPreview"></div>
<div class="concept-text" x-show="conceptExpanded" x-html="conceptRest"></div>
<button class="concept-expand-btn" x-show="conceptRest"
@click="conceptExpanded = !conceptExpanded">
<i :data-lucide="conceptExpanded ? 'chevron-up' : 'chevron-down'" style="width:11px;height:11px"></i>
<span x-text="conceptExpanded ? '閉じる' : 'もっと詳しく'"></span>
</button>
</div>
<!-- Exam tips -->
<div class="card" x-show="currentUnit?.examtips?.length" style="border-color:rgba(248,113,113,.18);background:rgba(248,113,113,.03)">
<div class="card-title" style="color:var(--err)">
<i data-lucide="alert-triangle" style="width:13px;height:13px;color:var(--err)"></i>
試験対策メモ
</div>
<template x-for="tip in (currentUnit?.examtips||[])" :key="tip">
<div class="tips-point">
<div class="tips-icon">!</div>
<span x-html="tip"></span>
</div>
</template>
</div>
<!-- Keypoints -->
<div class="card" x-show="!stepMode && currentUnit?.keypoints?.length">
<div class="card-title">
<i data-lucide="zap" style="width:13px;height:13px"></i>
重要ポイント
</div>
<ul class="key-list">
<template x-for="kp in (currentUnit?.keypoints||[])" :key="kp">
<li class="key-item">
<div class="key-dot"></div>
<span x-html="kp"></span>
</li>
</template>
</ul>
</div>
<!-- Quiz --> <!-- Quiz -->
<div class="card" x-show="currentUnit?.quiz?.length && (!stepMode || stepStep === 3)"> <div class="card" x-show="currentUnit?.quiz?.length && (!stepMode || stepStep === 3)">
<div class="quiz-header"> <div class="quiz-header">
@ -1586,14 +1584,13 @@ function bokiApp(){
resetFlashRevealState(){ resetFlashRevealState(){
this.stepFlashRevealed=!this.keypointHasFlip(this.stepKpIdx); this.stepFlashRevealed=!this.keypointHasFlip(this.stepKpIdx);
}, },
revealFlash(){ advanceStep1Card(){
if(!this.keypointHasFlip(this.stepKpIdx)){ if(this.stepStep!==1) return;
return; if(this.keypointHasFlip(this.stepKpIdx)&&!this.stepFlashRevealed){
}
if(this.stepFlashRevealed){
return;
}
this.stepFlashRevealed=true; this.stepFlashRevealed=true;
return;
}
this.nextStepFlash();
}, },
nextStepFlash(){ nextStepFlash(){
const kps=this.currentUnit?.keypoints||[]; const kps=this.currentUnit?.keypoints||[];

2
sw.js
View File

@ -1,5 +1,5 @@
// posimai-boki SW — stale-while-revalidate + skipWaiting // posimai-boki SW — stale-while-revalidate + skipWaiting
const CACHE = 'posimai-boki-v12'; const CACHE = 'posimai-boki-v13';
const STATIC = ['/', '/index.html', '/manifest.json', '/logo.png']; const STATIC = ['/', '/index.html', '/manifest.json', '/logo.png'];
self.addEventListener('install', e => { self.addEventListener('install', e => {