diff --git a/static/index.html b/static/index.html index 3337882..1f4451c 100644 --- a/static/index.html +++ b/static/index.html @@ -186,16 +186,24 @@ ═══════════════════════════════════════════════════════════════════════ */ .tab-panel { display: none; padding: 0 12px; - animation: none; + opacity: 1; transform: translateX(0); } .tab-panel.active { display: block; animation: tabSlideIn 0.25s cubic-bezier(0.4, 0, 0.2, 1); } + .tab-panel.slide-left { + display: block !important; + animation: tabSlideOutLeft 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards; + } @keyframes tabSlideIn { from { opacity: 0; transform: translateX(16px); } to { opacity: 1; transform: translateX(0); } } + @keyframes tabSlideOutLeft { + from { opacity: 1; transform: translateX(0); } + to { opacity: 0; transform: translateX(-16px); } + } /* ═══════════════════════════════════════════════════════════════════════ BOTTOM TABS @@ -344,6 +352,73 @@ .empty-state { text-align: center; padding: 32px 16px; color: var(--text2); font-size: 13px; } .empty-state .es-icon { font-size: 40px; margin-bottom: 8px; opacity: 0.5; } + /* Enhanced empty-state card — full-page onboarding pattern */ + .empty-state-card { + display: flex; flex-direction: column; align-items: center; justify-content: center; + text-align: center; padding: 48px 24px; min-height: 240px; + } + .esc-icon { + font-size: 56px; margin-bottom: 16px; opacity: 0.35; + width: 88px; height: 88px; border-radius: 50%; + background: var(--card2); display: flex; align-items: center; justify-content: center; + } + .esc-heading { + font-size: 17px; font-weight: 700; color: var(--text); + margin-bottom: 6px; + } + .esc-desc { + font-size: 13px; color: var(--text2); max-width: 280px; + line-height: 1.5; margin-bottom: 20px; + } + .esc-cta { + display: inline-flex; align-items: center; gap: 6px; + padding: 10px 24px; font-size: 14px; font-weight: 600; + background: var(--accent); color: #fff; border: none; + border-radius: var(--radius-sm); cursor: pointer; + -webkit-tap-highlight-color: transparent; + transition: background 0.15s; + } + .esc-cta:active { background: var(--accent2); } + .esc-cta-sm { + display: inline-flex; align-items: center; gap: 4px; + padding: 6px 14px; font-size: 12px; font-weight: 600; + background: var(--accent); color: #fff; border: none; + border-radius: var(--radius-xs); cursor: pointer; + -webkit-tap-highlight-color: transparent; + transition: background 0.15s; + } + .esc-cta-sm:active { background: var(--accent2); } + + /* Onboarding welcome overlay */ + .onboard-overlay { + position: fixed; inset: 0; background: rgba(0,0,0,0.7); + z-index: 600; display: flex; align-items: center; justify-content: center; + padding: 20px; opacity: 0; pointer-events: none; transition: opacity 0.25s; + } + .onboard-overlay.open { opacity: 1; pointer-events: auto; } + .onboard-card { + background: var(--card); border: 1px solid var(--border); + border-radius: var(--radius); padding: 28px 24px; max-width: 340px; + text-align: center; width: 100%; + } + .onboard-card .esc-icon { margin: 0 auto 16px; } + + /* Guidance card — reports empty state */ + .guidance-card { + text-align: center; padding: 24px 16px; + } + .gc-icon { + font-size: 40px; margin-bottom: 12px; opacity: 0.5; + } + .gc-title { + font-size: 15px; font-weight: 600; color: var(--text); + margin-bottom: 6px; + } + .gc-hint { + font-size: 12px; color: var(--text2); line-height: 1.5; + max-width: 300px; margin: 0 auto; + } + /* ═══════════════════════════════════════════════════════════════════════ MODAL / DIALOG ═══════════════════════════════════════════════════════════════════════ */ @@ -1325,104 +1400,178 @@