Add colored grid-card fallbacks, bottom tab bar, dashboard reorder
Three visual/structural changes: - Grid cards without a thumbnail (nearly all real courses in this library) showed the same generic graduation-cap icon, making the poster grid hard to visually scan. Replace it with a deterministic color+initial per course name (same idea as Slack/Google Photos default avatars), so cards without real cover art still look distinct from each other. - Notes/Help/Settings only existed as small footer text links, meaning a scroll to the bottom of every page to navigate. Add a persistent bottom tab bar (Home/Notes/Help/Settings, current page highlighted via a new active_tab context var) to the dashboard, Notes Hub, Settings, and Help pages. Deliberately left the lesson page alone - it already has its own fixed-bottom notes panel, and a second fixed bar there would just eat into an already content-dense page. - The no-course dashboard stacked five informational/queue cards (Library Stats, Next Up, Pick Back Up, Recently Added, Continue Watching, Recently Viewed) before "Your Courses," so the actual library browser was the last thing on the page. Move it up to right after the Surprise Me banner - it was already unconditional, so this only changes where it renders, not when. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+39
-30
@@ -55,6 +55,7 @@
|
||||
.page-content {
|
||||
flex: 1;
|
||||
padding: 20px;
|
||||
padding-bottom: 70px;
|
||||
}
|
||||
.app-header {
|
||||
background: linear-gradient(135deg, var(--bg-secondary), var(--bg-tertiary));
|
||||
@@ -77,31 +78,36 @@
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
.app-footer {
|
||||
.bottom-tab-bar {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 9000;
|
||||
display: flex;
|
||||
background: var(--bg-secondary);
|
||||
border-top: 1px solid var(--border-color);
|
||||
padding: 18px 0;
|
||||
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.2);
|
||||
padding-bottom: env(safe-area-inset-bottom, 0px);
|
||||
}
|
||||
.app-footer .footer-inner {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
.tab-item {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 15px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.footer-brand {
|
||||
gap: 2px;
|
||||
padding: 8px 4px;
|
||||
color: var(--text-muted);
|
||||
font-size: 0.9em;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.footer-links a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
font-size: 0.9em;
|
||||
font-size: 0.72em;
|
||||
transition: color 0.2s;
|
||||
}
|
||||
.tab-item .tab-icon {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
.tab-item:hover,
|
||||
.tab-item.active {
|
||||
color: var(--accent);
|
||||
}
|
||||
.container {
|
||||
max-width: 800px;
|
||||
@@ -171,7 +177,7 @@
|
||||
<li>Every note is stamped with the video's timestamp when you save it - click a timestamp to jump straight to that moment</li>
|
||||
<li>Press <strong>N</strong> anywhere on a lesson page to capture one without reaching for the mouse</li>
|
||||
<li>Edit or delete any note from the floating panel at the bottom of the lesson page</li>
|
||||
<li><strong>Notes</strong> (in the footer) collects every note across your whole library in one searchable list</li>
|
||||
<li><strong>Notes</strong> (in the bottom bar) collects every note across your whole library in one searchable list</li>
|
||||
<li><strong>Download Study Guide</strong> on a loaded course exports every note as one markdown file, organized by section</li>
|
||||
<li>If you use <a href="/settings">Outline</a>, pick a topic on a lesson's notes to push them there automatically when you navigate away</li>
|
||||
</ul>
|
||||
@@ -211,17 +217,20 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="app-footer">
|
||||
<div class="footer-inner">
|
||||
<div class="footer-brand">
|
||||
📚 <a href="/reset_course" style="color: inherit; text-decoration: none;">OfflineU</a>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/notes">📝 Notes</a>
|
||||
<a href="/">← Back to app</a>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<nav class="bottom-tab-bar">
|
||||
<a href="/reset_course" class="tab-item {% if active_tab == 'home' %}active{% endif %}">
|
||||
<span class="tab-icon">🏠</span><span class="tab-label">Home</span>
|
||||
</a>
|
||||
<a href="/notes" class="tab-item {% if active_tab == 'notes' %}active{% endif %}">
|
||||
<span class="tab-icon">📝</span><span class="tab-label">Notes</span>
|
||||
</a>
|
||||
<a href="/help" class="tab-item {% if active_tab == 'help' %}active{% endif %}">
|
||||
<span class="tab-icon">❓</span><span class="tab-label">Help</span>
|
||||
</a>
|
||||
<a href="/settings" class="tab-item {% if active_tab == 'settings' %}active{% endif %}">
|
||||
<span class="tab-icon">⚙</span><span class="tab-label">Settings</span>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
<script src="/static/theme.js"></script>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user