diff --git a/CLAUDE.md b/CLAUDE.md index 67ab791..25171d3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -779,15 +779,17 @@ For ActivityPub federated posts and thumbnails: - [x] Heart rate chart over time on activity details (Chart.js line chart, elapsed time x-axis, heart rate y-axis) - [x] Speed/pace chart over time on activity details (Chart.js line chart with smoothing, displays speed in km/h with pace in tooltip) - [x] Notifications system (Notification entity, NotificationRepository, NotificationService, NotificationController REST API, notifications.html UI, notification bell in nav with unread count, polling every 30s, mark as read/delete, all/unread filter tabs) +- [x] Custom 404 Not Found page (error/404.html with animated compass icon, suggestions, gradient background) +- [x] Custom 403 Forbidden page (error/403.html with shield-lock icon, auth-aware login button, gradient background) +- [x] Custom 500 Internal Server Error page (error/500.html with tools icon, recovery suggestions) +- [x] Generic error page (error/error.html with dynamic error code display, technical details toggle) +- [x] Empty state illustrations (reusable CSS classes in fitpub.css, floating animation, variant colors for activities/notifications/timeline/users/search, updated all timeline pages, notifications page, and discover page) - [ ] Enhanced privacy controls UI - [ ] Follow/unfollow buttons on user profiles - [ ] Activity visibility to followers (implement FOLLOWERS visibility enforcement) - [ ] Breadcrumb navigation - [ ] Active route highlighting in navigation - [ ] Global error boundary/handler -- [ ] Custom 404 Not Found page -- [ ] Custom 403 Forbidden page -- [ ] Empty state illustrations ### Phase 3: Advanced Analytics - [ ] Personal records tracking diff --git a/src/main/resources/static/css/fitpub.css b/src/main/resources/static/css/fitpub.css index 29c0792..9c33986 100644 --- a/src/main/resources/static/css/fitpub.css +++ b/src/main/resources/static/css/fitpub.css @@ -290,6 +290,68 @@ body { color: var(--danger-color); } +/* Empty State Illustrations */ +.empty-state { + text-align: center; + padding: 4rem 2rem; + color: #6b7280; +} + +.empty-state-icon { + font-size: 5rem; + color: #d1d5db; + margin-bottom: 1.5rem; + display: inline-block; + animation: float-gentle 3s ease-in-out infinite; +} + +@keyframes float-gentle { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +.empty-state-title { + font-size: 1.5rem; + font-weight: 600; + color: #374151; + margin-bottom: 0.5rem; +} + +.empty-state-message { + font-size: 1rem; + color: #6b7280; + margin-bottom: 1.5rem; +} + +.empty-state-action { + margin-top: 1.5rem; +} + +/* Empty state variants */ +.empty-state-activities .empty-state-icon { + color: #93c5fd; +} + +.empty-state-notifications .empty-state-icon { + color: #fbbf24; +} + +.empty-state-timeline .empty-state-icon { + color: #a78bfa; +} + +.empty-state-users .empty-state-icon { + color: #86efac; +} + +.empty-state-search .empty-state-icon { + color: #fda4af; +} + /* Responsive adjustments */ @media (max-width: 768px) { .map-container { @@ -303,4 +365,16 @@ body { .metric-value { font-size: 1.5rem; } + + .empty-state { + padding: 3rem 1rem; + } + + .empty-state-icon { + font-size: 4rem; + } + + .empty-state-title { + font-size: 1.25rem; + } } diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html new file mode 100644 index 0000000..910d64f --- /dev/null +++ b/src/main/resources/templates/error/403.html @@ -0,0 +1,184 @@ + + +
+ + +You're all caught up!
+Follow other athletes to see their activities here!
- - Explore Public Timeline - +Be the first to share your fitness activities!
- +Upload your first FIT file to get started!
- - Upload Activity - +Try adjusting your search or browse all users
+