Added full bookmark functionality for users to save posts: Backend Features: - New Bookmark model with user_id, post_uuid, and cached metadata - API endpoints: - POST /api/bookmark - Toggle bookmark status - GET /api/bookmarks - Get user's bookmarks with pagination - GET /api/bookmark-status/<uuid> - Check if post is bookmarked - Database migration script for bookmarks table Frontend Features: - New /bookmarks page with post list and management - Bookmark buttons on post cards with save/unsave toggle - Real-time bookmark status loading and updates - Navigation menu integration - Responsive design with archived post handling UI Components: - Modern bookmark button with hover states - Pagination for bookmark listings - Empty state for users with no bookmarks - Error handling and loading states - Remove bookmark functionality The system handles: - Unique bookmarks per user/post combination - Cached post metadata for performance - Graceful handling of deleted/archived posts - Authentication requirements for all bookmark features Users can now save posts for later reading and manage their bookmarks through a dedicated bookmarks page. Fixes #20 ~claude 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
49 lines
2.2 KiB
HTML
49 lines
2.2 KiB
HTML
<!-- Modern Top Navigation -->
|
|
<nav class="top-nav">
|
|
<div class="nav-content">
|
|
<div class="nav-left">
|
|
<a href="{{ url_for('index') }}" class="logo-section">
|
|
<img src="{{ url_for('serve_logo') }}" alt="{{ APP_NAME }}" class="nav-logo">
|
|
<span class="brand-text">{{ APP_NAME }}</span>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="nav-center">
|
|
<div class="search-bar">
|
|
<input type="text" placeholder="Search content..." class="search-input">
|
|
<button class="search-btn">🔍</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="nav-right">
|
|
{% if current_user.is_authenticated %}
|
|
<div class="user-menu">
|
|
<div class="user-info">
|
|
<div class="user-avatar">
|
|
{% if current_user.profile_picture_url %}
|
|
<img src="{{ current_user.profile_picture_url }}" alt="Avatar">
|
|
{% else %}
|
|
<div class="avatar-placeholder">{{ current_user.username[:2].upper() }}</div>
|
|
{% endif %}
|
|
</div>
|
|
<span class="username">{{ current_user.username }}</span>
|
|
</div>
|
|
<div class="user-dropdown">
|
|
<a href="{{ url_for('settings') }}" class="dropdown-item">⚙️ Settings</a>
|
|
<a href="{{ url_for('bookmarks') }}" class="dropdown-item">📚 Bookmarks</a>
|
|
{% if current_user.is_admin %}
|
|
<a href="{{ url_for('admin_panel') }}" class="dropdown-item">👨💼 Admin Panel</a>
|
|
{% endif %}
|
|
<a href="{{ url_for('logout') }}" class="dropdown-item">🚪 Logout</a>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="anonymous-actions">
|
|
<a href="{{ url_for('login') }}" class="login-btn">🔑 Login</a>
|
|
<a href="{{ url_for('signup') }}" class="register-btn">📝 Sign Up</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</nav>
|