Story 5.1: Content Viewer Page
Header Information
Visual Wireframe
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ Close [๐] [โฌ] [๐] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโ CONTENT HEADER โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โโ
โ โ Kubernetes Security Best Practices โโ
โ โ Thomas Weber โข UBS โข Spring 2024 Event โข March 15, 2024 โโ
โ โ โโ
โ โ โญ 4.8/5 (234 ratings) โข ๐๏ธ 1,247 views โข โฌ 523 downloads โโ
โ โ โโ
โ โ Tags: #kubernetes #security #compliance #fintech #devops โโ
โ โ โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โโโโ CONTENT VIEWER โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ โ โโ
โ โ โ โ โโ
โ โ โ Kubernetes Security Best Practices โ โโ
โ โ โ โ โโ
โ โ โ By Thomas Weber โ โโ
โ โ โ UBS โ โโ
โ โ โ โ โโ
โ โ โ BATbern Spring 2024 โ โโ
โ โ โ โ โโ
โ โ โ โ โโ
โ โ โ [PDF/SLIDE CONTENT] โ โโ
โ โ โ โ โโ
โ โ โ - Implementing Zero-Trust Security โ โโ
โ โ โ - Network Policies & Pod Security โ โโ
โ โ โ - Secret Management Best Practices โ โโ
โ โ โ - Compliance in Financial Services โ โโ
โ โ โ โ โโ
โ โ โ โ โโ
โ โ โ โ โโ
โ โ โ โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โ โโโโ VIEWER CONTROLS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ โ โโ
โ โ โ [โ Prev] Slide 1 of 42 [Next โถ] [โถ Fullscreen] โ โโ
โ โ โ โ โโ
โ โ โ [๐-] [๐+] [โป Rotate] [๐จ Print] [๐ฌ Comments (12)] โ โโ
โ โ โ โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โโโโ CONTENT DETAILS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โโ
โ โ ๐ Abstract โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ Implementing zero-trust security in Kubernetes environments โ โโ
โ โ โ with practical examples from Swiss financial sector โ โโ
โ โ โ compliance requirements. Learn how to secure your clusters โ โโ
โ โ โ with network policies, pod security standards, secret โ โโ
โ โ โ management, and audit logging. Includes real-world case โ โโ
โ โ โ studies from banking infrastructure deployments. โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โ ๐ค Speaker โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ ๐ท [Photo] Thomas Weber โ โโ
โ โ โ Senior Cloud Architect, UBS โ โโ
โ โ โ Expertise: Kubernetes, Security, FinTech โ โโ
โ โ โ [View Full Profile โ] โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โ ๐ฏ Event โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ BATbern Spring 2024 โข March 15, 2024 โ โโ
โ โ โ Venue: Technopark Zurich โ โโ
โ โ โ Session: Cloud Native Security Track โ โโ
โ โ โ [View Event Details โ] โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โ ๐ Additional Materials โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ ๐ Presentation Slides (PDF) โข 2.3 MB [Download] โ โโ
โ โ โ ๐น Video Recording (MP4) โข 145 MB [Watch] [โฌ] โ โโ
โ โ โ ๐ Speaker Notes (PDF) โข 486 KB [Download] โ โโ
โ โ โ ๐ป Code Examples (ZIP) โข 1.2 MB [Download] โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โโโโ ENGAGEMENT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โโ
โ โ โญ Rate This Content โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ โ โ โ โ โ Rate your experience (234 ratings, avg 4.8/5) โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โ ๐ฌ Comments & Reviews (12) โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โ ๐ค Maria Schmidt โข 2 weeks ago โญโญโญโญโญ โ โโ
โ โ โ Excellent practical examples from real banking use cases. โ โโ
โ โ โ The secret management section was particularly valuable. โ โโ
โ โ โ [๐ 12] [Reply] โ โโ
โ โ โ โ โโ
โ โ โ ๐ค John Chen โข 1 month ago โญโญโญโญโญ โ โโ
โ โ โ Best K8s security presentation I've seen. Clear and โ โโ
โ โ โ actionable. Already implementing in our environment. โ โโ
โ โ โ [๐ 8] [Reply] โ โโ
โ โ โ โ โโ
โ โ โ [Load More Comments...] [Add Your Review] โ โโ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโ
โ โ โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ โโโโ RELATED CONTENT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โโ
โ โ You might also like: โโ
โ โ โโ
โ โ โโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโฌโโโโโโโโโโโโโ โโ
โ โ โ ๐ [Card] โ ๐ [Card] โ ๐ [Card] โ ๐ [Card] โ โโ
โ โ โ โ โ โ โ โโ
โ โ โ Container โ K8s RBAC โ Security โ DevSecOps โ โโ
โ โ โ Security โ Deep Dive โ Audit Log โ Pipeline โ โโ
โ โ โ Deep Dive โ โ Analysis โ Tools โ โโ
โ โ โ Sara Kim โ Alex Mรผllerโ Lisa Wang โ David Ross โ โโ
โ โ โ 2023 โ 2024 โ 2023 โ 2024 โ โโ
โ โ โ โญ 4.9/5 โ โญ 4.7/5 โ โญ 4.6/5 โ โญ 4.8/5 โ โโ
โ โ โ โ โ โ โ โโ
โ โ โ [View] โ [View] โ [View] โ [View] โ โโ
โ โ โโโโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโโดโโโโโโโโโโโโโ โโ
โ โ โโ
โ โ [View All Related Content โ] โโ
โ โ โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Key Interactive Elements
Header Actions
- [โ Close]: Close viewer, return to previous screen (Content Discovery, Personal Dashboard, Event Details)
- [๐ Fullscreen]: Toggle fullscreen mode for immersive viewing
- [โฌ Download]: Download all materials as ZIP or individual file
- [๐ Save/Bookmark]: Add to personal library (heart icon, toggles between filled/outline)
Content Viewer
- PDF Viewer: Embedded PDF.js viewer for presentations and documents
- Zoom controls (zoom in/out, fit to width, fit to page)
- Page navigation (prev/next, jump to page, thumbnail sidebar)
- Rotation controls for landscape/portrait
- Text selection and copy (if allowed)
- Video Player: Embedded HTML5 video player for recordings
- Play/pause, volume, scrubber timeline
- Playback speed controls (0.5x, 1x, 1.25x, 1.5x, 2x)
- Fullscreen mode
- Picture-in-picture
- Subtitles/captions (if available)
- Slide Viewer: Custom slide viewer for PPTX (converted to images)
- Auto-advance option
- Keyboard navigation (arrow keys)
- Touch swipe gestures (mobile)
Viewer Controls
- [โ Prev] / [Next โถ]: Navigate between slides/pages
- Slide Counter: โSlide 1 of 42โ with jump-to functionality
- [โถ Fullscreen]: Enter/exit fullscreen mode
- [๐-] [๐+]: Zoom out/in controls
- [โป Rotate]: Rotate content 90 degrees clockwise
- [๐จ Print]: Print current page or entire document
- [๐ฌ Comments]: Toggle comments sidebar, show comment count
Rating & Reviews
- Star Rating: Click stars to rate (1-5 stars), updates in real-time
- Comment Input: โAdd Your Reviewโ opens text area with submit button
- Comment Actions: [๐ Like], [Reply] for threaded discussions
- Load More: Paginated comment loading
Related Content Cards
- Content Cards: Thumbnail, title, speaker, event date, rating
- [View] Button: Opens content in viewer (replaces current content)
- Horizontal Scroll: Swipe or arrow navigation for more suggestions
Functional Requirements Met
- FR11 (Event Archive): Complete archive access with presentation downloads, speaker profiles, and photo galleries via CDN
- FR13 (Content Discovery - Basic): Related content suggestions based on tags and topic similarity (non-AI)
- FR14 (Personal Engagement): Content bookmarking, presentation downloads, rating/review system for community engagement
- FR15 (Mobile-Optimized): Responsive content viewer with offline capability (PWA), touch gestures, mobile-friendly controls
- FR16 (Community Features - Basic): Content ratings, social sharing (links), curated related content
User Interactions
Opening Content
- User clicks [View] on content card from Content Discovery or Personal Dashboard
- System checks content type (PDF, video, PPTX, document)
- Loading screen displays with progress indicator
- APIs called in parallel:
GET /api/v1/content/{contentId}- Content metadataGET /api/v1/content/{contentId}/download-url- CDN URLGET /api/v1/content/{contentId}/related- Related contentGET /api/v1/content/{contentId}/reviews- Comments/ratingsPOST /api/v1/content/{contentId}/view- Track view (async)
- Content Viewer Page opens with content loaded
- If PDF/PPTX: PDF.js renders first page
- If video: Video player loads with poster frame
- Viewer controls appear, metadata displayed below
Viewing Content
- Navigation:
- User clicks [Next โถ] or uses keyboard arrow keys โ Next slide/page loads
- User clicks [โ Prev] โ Previous slide/page loads
- User clicks page number โ Jump-to-page modal opens, enter page number
- Auto-advance mode: Slides advance every N seconds (configurable)
- Zooming:
- User clicks [๐+] โ Content zooms in (25% increments, max 400%)
- User clicks [๐-] โ Content zooms out (25% increments, min 25%)
- User double-clicks content โ Toggle fit-to-width / fit-to-page
- User uses mouse wheel โ Zoom in/out (with Ctrl/Cmd modifier)
- Fullscreen:
- User clicks [โถ Fullscreen] or presses F11 โ Enter fullscreen
- Viewer controls auto-hide after 3 seconds of inactivity
- Mouse movement or touch โ Controls reappear
- User presses Esc or clicks exit fullscreen โ Return to normal view
Downloading Content
- User clicks [โฌ Download] button in header
- If single file:
- Direct download initiated (presigned S3 URL)
- Download progress shows in browser status bar
- Success toast: โDownload started: Kubernetes_Security.pdfโ
- If multiple materials:
- Modal opens: โDownload Optionsโ
- โ Presentation Slides (2.3 MB)
- โ Video Recording (145 MB)
- โ Speaker Notes (486 KB)
- โ Code Examples (1.2 MB)
- Total size displayed (e.g., โ148.6 MB selectedโ)
- [Download Selected] โ Generates ZIP archive, download link
- [Download All] โ All materials included
- Modal opens: โDownload Optionsโ
- Download tracking API called:
POST /api/v1/content/{contentId}/download - Download counter increments in real-time
Bookmarking Content
- User clicks [๐ Save] button in header
- If not authenticated:
- Login modal appears: โSign in to save content to your libraryโ
- After login: Bookmark action completes automatically
- If authenticated:
- Bookmark API called:
POST /api/v1/users/{userId}/bookmarks - Success: Icon changes to filled heart, toast โSaved to your libraryโ
- If already bookmarked: Remove bookmark, icon outline, toast โRemoved from libraryโ
- Bookmark API called:
- Optional: โAdd to Collectionโ modal
- Select existing collection dropdown
- Or create new collection: [+ New Collection]
- Input collection name, description
- [Save] โ Content added to collection
Rating Content
- User hovers over star rating โ Stars highlight up to hover position
- User clicks 4th star โ 4-star rating submitted
- API called:
POST /api/v1/content/{contentId}/ratings - Rating saved, average rating updates immediately
- Success toast: โThank you for rating! Your rating: โญโญโญโญโ
- Userโs rating persists (shows filled stars on reload)
- User can change rating by clicking different star count
Adding Comments/Reviews
- User clicks [Add Your Review] button
- Comment editor expands:
- Text area with formatting toolbar (bold, italic, bullets, links)
- Character counter (max 2000 chars)
- Optional: Attach screenshot or image
- [Cancel] / [Post Review] buttons
- User writes review, clicks [Post Review]
- If not authenticated: Login prompt
- If authenticated:
- Validation: Minimum 20 characters
- API called:
POST /api/v1/content/{contentId}/reviews - Success: Comment appears at top of list
- Comment marked โJust nowโ with user avatar
- Success toast: โReview posted successfullyโ
- New comment count updates (12 โ 13 comments)
Interacting with Comments
- User clicks [๐ Like] on comment โ Like count increments, icon fills
- User clicks [Reply] โ Nested comment editor appears
- Indented reply text area
- @mentions original commenter
- [Cancel] / [Post Reply] buttons
- User posts reply โ Appears as threaded comment below original
- User clicks [Load More Commentsโฆ] โ Next 10 comments load (pagination)
Viewing Related Content
- Related content cards displayed based on:
- Same tags (e.g., #kubernetes, #security)
- Same topic category
- Same speaker (other presentations)
- Same event (other sessions)
- User clicks [View] on related content card
- Current content replaced with selected content (smooth transition)
- URL updates, browser history entry added
- Previous content accessible via browser back button
- Analytics tracked: โRelated content clickโ
Printing Content
- User clicks [๐จ Print] button
- Print modal opens:
- Options: Current page only / All pages / Page range
- Include comments: Yes / No
- Page orientation: Portrait / Landscape
- [Cancel] / [Print] buttons
- User configures options, clicks [Print]
- Browser print dialog opens with configured options
- User prints or saves as PDF
Closing Viewer
- User clicks [โ Close] button or presses Esc
- If on slide 5+ and spent >2 minutes viewing:
- โSave progressโ prompt: โYou were on slide 5. Save bookmark?โ
- [Donโt Save] โ Close immediately
- [Save Bookmark] โ Save position, then close
- โSave progressโ prompt: โYou were on slide 5. Save bookmark?โ
- Return to previous screen (referrer):
- From Content Discovery โ Content Discovery (search results preserved)
- From Personal Dashboard โ Personal Dashboard
- From Event Details โ Event Details
- Analytics tracked:
POST /api/v1/content/{contentId}/closewith viewing duration, slides viewed
Technical Notes
Frontend Implementation
- Framework: React 18.2 with TypeScript, Material-UI Modal component
- PDF Rendering: PDF.js library for client-side PDF rendering
- Video Player: HTML5 video element with custom controls, react-player for advanced features
- Slide Viewer: Custom React component with image preloading for smooth transitions
- State Management: React Query for content data, Zustand for viewer state (page number, zoom level, fullscreen)
- Keyboard Shortcuts:
- Arrow Left/Right: Previous/Next slide
- Arrow Up/Down: Scroll content
- Ctrl/Cmd + Plus/Minus: Zoom in/out
- Ctrl/Cmd + 0: Reset zoom to 100%
- F11: Toggle fullscreen
- Esc: Exit fullscreen or close viewer
- Home/End: First/Last slide
Content Delivery
- CDN: CloudFront CDN for global content delivery, low-latency access
- Presigned URLs: S3 presigned URLs for secure downloads (1-hour expiration)
- Streaming: HLS streaming for videos (adaptive bitrate)
- Caching Strategy:
- Content metadata: 15 min cache (React Query)
- CDN URLs: 5 min cache (regenerated frequently for security)
- Related content: 30 min cache
- Comments: 2 min cache, invalidated on new comment
- Image Optimization: Thumbnails served via CloudFront with image resizing (multiple sizes for responsive images)
PDF Viewer Features
- Text Layer: Searchable text overlay (Ctrl+F to search within PDF)
- Annotations: Read-only support for PDF annotations (highlights, notes)
- Lazy Loading: Pages loaded on-demand (viewport + 2 pages buffer)
- Memory Management: Unload off-screen pages to prevent memory leaks
- Print Optimization: High-quality rendering for print
Video Player Features
- Adaptive Streaming: HLS.js for adaptive bitrate streaming
- Quality Selector: Manual quality selection (1080p, 720p, 480p, 360p)
- Playback Resume: Resume from last viewed position (saved in localStorage)
- Keyboard Shortcuts:
- Space: Play/pause
- F: Fullscreen
- M: Mute/unmute
- Arrow Left/Right: Seek backward/forward 10s
- Arrow Up/Down: Volume up/down
- 0-9: Jump to 0%, 10%, โฆ, 90% of video
- Accessibility: Full keyboard control, ARIA labels, captions support
Performance Optimization
- Code Splitting: PDF.js and video player loaded lazily (only when needed)
- Preloading: Next/previous slides preloaded in background
- Thumbnail Generation: Server-side thumbnail generation for PPTX slides
- Progressive Loading: Show low-res preview while high-res loads
- Intersection Observer: Lazy load related content cards when scrolled into view
Analytics Tracking
- View Tracking: Duration, slides viewed, completion rate
- Engagement Metrics: Zoom usage, fullscreen usage, print actions
- Download Tracking: Individual file downloads, ZIP downloads
- Interaction Events: Comments posted, ratings given, related content clicks
- Heatmap Data: Which slides get the most time/attention (for organizers)
API Requirements
Initial Page Load APIs
-
GET /api/v1/content/{contentId}?include=analytics,reviews,versions,related
- Authorization: Optional (public content accessible without auth, private requires auth)
- Path Params:
contentId(UUID) - Query Params:
include=analytics,reviews,versions,related(optional, default: none) - Returns: Complete content metadata with optional sub-resources
- Consolidated: Story 1.20 standard content endpoint with flexible includes
- Benefit: Single call retrieves all needed datajson
{ "id": "content-123", "title": "Kubernetes Security Best Practices", "description": "Implementing zero-trust security in Kubernetes environments...", "contentType": "presentation", "fileId": "file-456", "fileType": "application/pdf", "fileSizeBytes": 2400000, "pageCount": 42, "duration": null, "eventId": "event-789", "eventTitle": "BATbern Spring 2024", "eventDate": "2024-03-15T14:00:00Z", "sessionTitle": "Cloud Native Security Track", "speakerId": "speaker-321", "speakerName": "Thomas Weber", "speakerTitle": "Senior Cloud Architect", "companyId": "company-654", "companyName": "UBS", "thumbnailUrl": "https://d3tsrt2aaweqwh.cloudfront.net/thumbnails/content-123.jpg", "previewUrl": "https://d3tsrt2aaweqwh.cloudfront.net/previews/content-123.pdf", "tags": ["kubernetes", "security", "compliance", "fintech", "devops"], "viewCount": 1247, "downloadCount": 523, "averageRating": 4.8, "ratingCount": 234, "commentCount": 12, "createdAt": "2024-03-15T18:00:00Z", "updatedAt": "2024-03-16T09:30:00Z", "isPublic": true, "allowDownload": true, "allowComments": true } - Used for: Populate content header, metadata sections, viewer configuration
-
GET /api/v1/content/{contentId}/download-url
- Authorization: Optional (public content accessible, private requires auth)
- Path Params:
contentId(UUID) - Query Params:
materialType(optional): โpresentationโ | โvideoโ | โnotesโ | โcodeโexpiresIn(optional): Expiration in seconds (default: 3600)
- Returns: Presigned download URLjson
{ "contentId": "content-123", "downloadUrl": "https://batbern-content.s3.eu-central-1.amazonaws.com/...", "cdnUrl": "https://d3tsrt2aaweqwh.cloudfront.net/content/...", "expiresAt": "2024-04-01T15:30:00Z", "fileType": "application/pdf", "fileSizeBytes": 2400000, "fileName": "Kubernetes_Security_Best_Practices.pdf" } - Used for: Load content in viewer, enable download button
-
GET /api/v1/content/{contentId}/materials
- Authorization: Optional (public content accessible, private requires auth)
- Path Params:
contentId(UUID) - Returns: Additional materials associated with contentjson
{ "materials": [ { "id": "material-1", "type": "presentation", "name": "Presentation Slides", "fileId": "file-456", "fileName": "K8s_Security.pdf", "fileSizeBytes": 2400000, "downloadUrl": "https://...", "cdnUrl": "https://..." }, { "id": "material-2", "type": "video", "name": "Video Recording", "fileId": "file-457", "fileName": "K8s_Security_Recording.mp4", "fileSizeBytes": 152000000, "durationSeconds": 2700, "streamUrl": "https://.../playlist.m3u8", "cdnUrl": "https://..." }, { "id": "material-3", "type": "notes", "name": "Speaker Notes", "fileId": "file-458", "fileName": "K8s_Security_Notes.pdf", "fileSizeBytes": 486000, "downloadUrl": "https://...", "cdnUrl": "https://..." }, { "id": "material-4", "type": "code", "name": "Code Examples", "fileId": "file-459", "fileName": "K8s_Security_Examples.zip", "fileSizeBytes": 1200000, "downloadUrl": "https://...", "cdnUrl": "https://..." } ], "totalSizeBytes": 156086000 } - Used for: Populate โAdditional Materialsโ section
-
GET /api/v1/content/recommendations?contentId={contentId}&limit=8
- Authorization: Optional
- Path Params: None (uses query params)
- Query Params:
contentId: Content to find related items forlimit(optional): Max results (default: 8, max: 20)algorithm(optional): โtagsโ | โspeakerโ | โeventโ | โtopicโ (default: โtagsโ)
- Returns: Related content recommendations
- Consolidated: Uses Story 1.20 recommendations endpoint (was /api/v1/content/{id}/related)
- Benefit: Same endpoint for user and content-based recommendationsjson
{ "relatedContent": [ { "id": "content-456", "title": "Container Security Deep Dive", "speakerName": "Sara Kim", "eventDate": "2023-09-20T14:00:00Z", "thumbnailUrl": "https://...", "averageRating": 4.9, "ratingCount": 342, "viewCount": 2103, "tags": ["docker", "security", "cicd", "devops"], "matchScore": 0.87 }, // ... more related content ], "totalCount": 47, "algorithm": "tags", "matchCriteria": ["kubernetes", "security"] } - Used for: Populate โRelated Contentโ carousel
-
GET /api/v1/content/{contentId}/reviews?page=1&limit=10&sort=-createdAt
- Authorization: Optional (public reviews visible to all)
- Path Params:
contentId(UUID) - Query Params:
page(optional): Page number (default: 1)limit(optional): Reviews per page (default: 10, max: 50)sort(optional): โ-createdAtโ | โ-helpfulCountโ | โ-ratingโ (default: โ-createdAtโ)
- Returns: Comments and reviews with pagination
- Consolidated: Story 1.20 standard reviews endpoint with pagination
- Benefit: Consistent pagination pattern across all endpointsjson
{ "reviews": [ { "id": "review-789", "userId": "user-123", "userName": "Maria Schmidt", "userAvatar": "https://.../avatars/user-123.jpg", "rating": 5, "comment": "Excellent practical examples from real banking use cases...", "createdAt": "2024-03-20T10:30:00Z", "updatedAt": "2024-03-20T10:30:00Z", "helpfulCount": 12, "replies": [ { "id": "reply-101", "userId": "user-456", "userName": "Thomas Weber", "comment": "Thank you Maria! Glad it was helpful.", "createdAt": "2024-03-21T08:15:00Z", "isSpeaker": true } ] }, // ... more reviews ], "pagination": { "total": 234, "limit": 10, "offset": 0, "hasMore": true }, "summary": { "averageRating": 4.8, "totalReviews": 234, "ratingDistribution": { "5": 180, "4": 40, "3": 10, "2": 3, "1": 1 } } } - Used for: Populate comments section, display rating distribution
User Action APIs
-
POST /api/v1/content/{contentId}/view
- Triggered by: Content viewer opens (async, doesnโt block UI)
- Authorization: Optional (tracks views for authenticated and anonymous users)
- Path Params:
contentId(UUID) - Payload:json
{ "referrer": "content_discovery", "userAgent": "Mozilla/5.0...", "viewDurationSeconds": 0, "slidesViewed": [1], "sessionId": "session-abc123" } - Response:json
{ "viewId": "view-987", "viewCount": 1248, "tracked": true } - Used for: Track view count, analytics (which content is popular)
-
PUT /api/v1/content/{contentId}/view/{viewId}
- Triggered by: Periodic updates while viewing (every 30s), on viewer close
- Authorization: Optional
- Path Params:
contentId(UUID),viewId(UUID from initial view tracking) - Payload:json
{ "viewDurationSeconds": 420, "slidesViewed": [1, 2, 3, 5, 7, 8, 10, 12, 15], "completionPercentage": 0.36, "interactions": { "zoomed": 3, "fullscreen": 1, "printed": 0 } } - Response:json
{ "viewId": "view-987", "updated": true } - Used for: Detailed analytics, resume playback position, engagement metrics
-
POST /api/v1/users/{userId}/bookmarks
- Triggered by: [๐ Save] button click
- Authorization: Requires authenticated user
- Path Params:
userId(UUID) - Payload:json
{ "contentId": "content-123", "collectionId": "collection-456", "notes": "Great resource for K8s security implementation", "currentSlide": 5, "tags": ["reference", "security", "to-review"] } - Response:json
{ "bookmarkId": "bookmark-789", "contentId": "content-123", "userId": "user-123", "createdAt": "2024-04-01T14:35:00Z", "collection": { "id": "collection-456", "name": "Security Resources" } } - Used for: Save content to personal library, create collections
-
DELETE /api/v1/users/{userId}/bookmarks/{bookmarkId}
- Triggered by: [๐ Remove] button click (if already bookmarked)
- Authorization: Requires authenticated user, bookmark owner
- Path Params:
userId(UUID),bookmarkId(UUID) - Response:json
{ "bookmarkId": "bookmark-789", "deleted": true, "deletedAt": "2024-04-01T14:40:00Z" } - Used for: Remove bookmark from library
-
POST /api/v1/content/{contentId}/reviews
- Triggered by: User clicks star rating (1-5 stars)
- Authorization: Requires authenticated user
- Path Params:
contentId(UUID) - Payload:json
{ "rating": 4, "comment": null, "userId": "user-123" } - Response:json
{ "reviewId": "review-654", "contentId": "content-123", "userId": "user-123", "rating": 4, "createdAt": "2024-04-01T14:38:00Z", "updatedAverageRating": 4.78, "updatedRatingCount": 235 } - Used for: Submit user rating, update average rating in real-time
- Consolidated: Reviews endpoint handles ratings (was POST /api/v1/content/{id}/ratings)
- Benefit: Single endpoint for ratings and comments
-
PUT /api/v1/content/{contentId}/reviews/{reviewId}
- Triggered by: User changes existing rating (clicks different star count)
- Authorization: Requires authenticated user, review owner
- Path Params:
contentId(UUID),reviewId(UUID) - Payload:json
{ "rating": 5 } - Response:json
{ "reviewId": "review-654", "previousRating": 4, "newRating": 5, "updatedAt": "2024-04-01T14:42:00Z", "updatedAverageRating": 4.79 } - Used for: Update existing rating
- Consolidated: Standard PUT on review resource (was PUT /api/v1/content/{id}/ratings/{ratingId})
-
POST /api/v1/content/{contentId}/reviews
- Triggered by: [Post Review] button in comment editor
- Authorization: Requires authenticated user
- Path Params:
contentId(UUID) - Payload:json
{ "userId": "user-123", "rating": 5, "comment": "Excellent practical examples from real banking use cases. The secret management section was particularly valuable.", "parentReviewId": null } - Validation:
- Comment: Required if rating not provided, 20-2000 characters
- Rating: Optional (1-5), if provided must submit rating separately via ratings API
- Response:json
{ "reviewId": "review-890", "contentId": "content-123", "userId": "user-123", "userName": "Maria Schmidt", "userAvatar": "https://.../avatars/user-123.jpg", "rating": 5, "comment": "Excellent practical examples...", "createdAt": "2024-04-01T14:45:00Z", "helpfulCount": 0, "replies": [] } - Used for: Post new review/comment, appears immediately in comments section
-
POST /api/v1/content/{contentId}/reviews/{reviewId}/replies
- Triggered by: [Reply] button in comment, then [Post Reply]
- Authorization: Requires authenticated user
- Path Params:
contentId(UUID),reviewId(UUID of parent review) - Payload:json
{ "userId": "user-456", "comment": "Thank you Maria! Glad it was helpful.", "mentionUserId": "user-123" } - Response:json
{ "replyId": "reply-102", "parentReviewId": "review-890", "userId": "user-456", "userName": "Thomas Weber", "comment": "Thank you Maria! Glad it was helpful.", "createdAt": "2024-04-01T15:00:00Z", "isSpeaker": true } - Used for: Post reply to existing review, creates threaded conversation
-
POST /api/v1/content/{contentId}/reviews/{reviewId}/helpful
- Triggered by: [๐ Like] button on review
- Authorization: Requires authenticated user
- Path Params:
contentId(UUID),reviewId(UUID) - Payload:json
{ "userId": "user-789", "helpful": true } - Response:json
{ "reviewId": "review-890", "userId": "user-789", "helpful": true, "updatedHelpfulCount": 13 } - Used for: Mark review as helpful, increases helpful count
-
POST /api/v1/content/{contentId}/download
- Triggered by: [โฌ Download] button click or download link
- Authorization: Optional (public content accessible, private requires auth)
- Path Params:
contentId(UUID) - Payload:json
{ "materialIds": ["material-1", "material-3"], "downloadType": "zip", "referrer": "content_viewer" } - Response (for ZIP):json
{ "downloadId": "download-345", "downloadUrl": "https://batbern-content.s3.../downloads/bundle-abc123.zip", "expiresAt": "2024-04-01T16:00:00Z", "fileSizeBytes": 3886000, "materials": [ { "materialId": "material-1", "fileName": "K8s_Security.pdf" }, { "materialId": "material-3", "fileName": "K8s_Security_Notes.pdf" } ] } - Response (for single file):json
{ "downloadId": "download-346", "downloadUrl": "https://batbern-content.s3.../K8s_Security.pdf", "expiresAt": "2024-04-01T16:00:00Z", "fileSizeBytes": 2400000, "fileName": "K8s_Security.pdf" } - Used for: Track downloads, generate download URLs, analytics
-
POST /api/v1/content/{contentId}/share
- Triggered by: Share action (copy link, email, social)
- Authorization: Optional
- Path Params:
contentId(UUID) - Payload:json
{ "method": "link", "recipients": [], "message": "Check out this great K8s security presentation!" } - Response:json
{ "shareId": "share-567", "shareUrl": "https://batbern.ch/content/content-123?ref=share-567", "shortUrl": "https://bat.link/k8s-sec", "sharedAt": "2024-04-01T14:50:00Z", "method": "link" } - Used for: Generate shareable links, track shares, social media integration
Navigation Map
Primary Navigation Actions
-
โ Close button / Esc key โ Return to previous screen
- Target: Referrer screen (Content Discovery, Personal Dashboard, Event Details)
- Context: None (returns to exact state before opening viewer)
- Behavior:
- If viewing duration >2 min and on slide 5+: โSave progress?โ prompt
- On confirm: Save bookmark with current position
- On cancel: Close without saving
- Analytics: Track close action with viewing stats
-
Content title or event link โ Navigate to Event Details
- Target: Event Details Page (if wireframe exists)
- Context:
eventIdfrom content metadata - Behavior: Opens event in new context, viewer can remain open (if modal) or navigate (if full page)
-
Speaker name link or [View Full Profile โ] โ Navigate to Speaker Profile
- Target: Speaker Profile Detail View (
story-7.1-speaker-profile-detail-view.md) - Context:
speakerIdfrom content metadata - Behavior: Opens speaker profile (new page or modal depending on implementation)
- Target: Speaker Profile Detail View (
Secondary Navigation (Data Interactions)
-
[View] button on related content card โ Load different content
- Action: Replace current content with selected related content
- Behavior:
- Smooth transition (fade out โ load โ fade in)
- URL updates to new contentId
- Browser history entry added (back button works)
- Viewer state resets (page 1, zoom 100%, fullscreen off)
- Analytics: Track โrelated content clickโ
-
[View All Related Content โ] link โ Navigate to filtered Content Discovery
- Target: Content Discovery page with filters pre-applied
- Context: Same tags/speaker/topic as current content
- Behavior: Opens Content Discovery with search results matching current contentโs attributes
-
Tag click (e.g., #kubernetes) โ Navigate to tag search
- Target: Content Discovery page filtered by tag
- Context: Selected tag
- Behavior: Opens search results for that tag, viewer closes (or remains if modal)
-
Slide thumbnail click (in sidebar, if implemented) โ Jump to slide
- Action: Navigate to selected slide
- Behavior: Smooth scroll/transition to target slide
- No Navigation: Remains in viewer
-
Page number click โ Open jump-to-page modal
- Action: Modal overlay with numeric input
- Input: Enter page number (1-42)
- Behavior: Navigate to entered page, modal closes
- No Navigation: Remains in viewer
Event-Driven Navigation
-
Content load complete โ Display viewer
- Trigger: All load APIs return successfully
- Behavior: Loading spinner disappears, content appears
- Error Handling: If load fails, show error state with retry option
-
Rating submitted โ Update UI
- Trigger: Rating API success response
- Behavior:
- Userโs stars fill to selected rating
- Average rating updates
- Rating count increments
- Success toast appears
- No Navigation: Remains in viewer
-
Comment posted โ Add to comments list
- Trigger: Review API success response
- Behavior:
- New comment appears at top of list
- Comment count increments
- Comment editor clears
- Success toast appears
- Scroll to new comment
- No Navigation: Remains in viewer
-
Bookmark saved โ Update bookmark icon
- Trigger: Bookmark API success response
- Behavior:
- Bookmark icon changes from outline to filled
- Success toast: โSaved to your libraryโ
- If collection selected, toast includes collection name
- No Navigation: Remains in viewer
-
Download started โ Browser download
- Trigger: Download API returns presigned URL
- Behavior:
- Browser download initiated
- Download counter increments
- Success toast appears
- File downloads in background
- No Navigation: Remains in viewer
-
Fullscreen toggled โ Enter/exit fullscreen
- Trigger: Fullscreen button or F11 key
- Behavior:
- Viewer expands to full screen
- Controls auto-hide after 3s inactivity
- Mouse movement shows controls
- Esc exits fullscreen
- No Navigation: Remains in viewer
Error States & Redirects
-
Content not found (404) โ Show error page
- Condition: Content ID invalid or content deleted
- Display: โContent not foundโ error page
- Message: โThis content is no longer available or the link is incorrect.โ
- Actions:
- [Browse Content] โ Navigate to Content Discovery
- [Go Back] โ Return to previous screen
-
Unauthorized access (403) โ Login prompt or error
- Condition: Private content requires authentication
- Display: Login modal or error page
- Message: โThis content is private. Please log in to access.โ
- Actions:
- [Login] โ Open login modal, return to content after auth
- [Cancel] โ Return to previous screen
-
Content load failed (500) โ Show error state with retry
- Condition: CDN unreachable, S3 error, network issue
- Display: Error state in viewer area
- Message: โUnable to load content. Please try again.โ
- Actions:
- [Retry] โ Reload content
- [Download] โ Direct download as fallback
- [Close] โ Return to previous screen
-
Rating/Comment failed โ Show error toast
- Condition: API error, network issue, validation failure
- Display: Error toast notification
- Message: โUnable to submit rating. Please try again.โ
- Actions:
- Toast auto-dismisses after 5s
- User can retry action
- No Navigation: Remains in viewer
-
Download failed โ Show error toast with retry
- Condition: S3 presigned URL expired, network error
- Display: Error toast notification
- Message: โDownload failed. Please try again.โ
- Actions:
- [Retry] โ Regenerate presigned URL, retry download
- Toast auto-dismisses after 10s
- No Navigation: Remains in viewer
-
Session timeout during view โ Save progress prompt
- Condition: JWT token expired while viewing
- Display: Session timeout modal
- Message: โYour session has expired. Your viewing progress has been saved.โ
- Actions:
- [Login Again] โ Open login, resume viewing after auth
- [Close] โ Return to previous screen
- Behavior: Viewing progress saved to localStorage, restored after login
Responsive Design Considerations
Mobile Layout Changes (< 768px)
- Full-Screen Viewer: Content viewer takes entire viewport, header minimized
- Collapsible Sections: Abstract, speaker, event details collapsed by default
- Expand on tap with smooth animation
- Icons indicate expand/collapse state
- Touch-Optimized Controls:
- Larger hit targets (min 44x44px)
- Swipe left/right to navigate slides
- Pinch to zoom gesture
- Double-tap to toggle fit-to-width/fit-to-page
- Bottom Navigation Bar: Primary controls in fixed bottom bar
- [โ Prev] [Page Count] [Next โถ]
- [โฌ Download] [๐ Save] [โฎ More]
- Floating Action Button: Primary actions accessible via FAB
- Tap FAB โ Opens action menu (Download, Save, Share, Fullscreen)
- Related Content: Horizontal scroll carousel (one card visible at a time)
- Comments: Load on-demand via โView Commentsโ button to save initial load time
Tablet Layout Changes (768px - 1024px)
- Two-Column Layout: Content viewer on left (70%), metadata on right (30%)
- Sticky Header: Content title and actions remain visible while scrolling metadata
- Hybrid Controls: Both touch and mouse/keyboard navigation supported
- Related Content: 2 cards per row in carousel
- Comments: Show top 3 initially, โLoad Moreโ for rest
Mobile-Specific Interactions
- Swipe Gestures:
- Swipe left โ Next slide
- Swipe right โ Previous slide
- Swipe down from top โ Close viewer (with confirm if >2 min viewing)
- Swipe up from bottom โ Expand details panel
- Pinch Zoom: Native pinch-to-zoom on content
- Share Sheet: Native mobile share sheet for sharing content
- Integrates with installed apps (WhatsApp, Email, etc.)
- Offline Viewing:
- โSave for Offlineโ option downloads content to device
- Offline indicator shows cached content
- Works in PWA mode
Tablet-Specific Features
- Split View: View related content side-by-side with main content (iPad)
- Pencil Support: Apple Pencil annotations on iPad (future enhancement)
- Keyboard Shortcuts: Full keyboard shortcut support for iPad with keyboard
Accessibility Notes
-
Keyboard Navigation:
- Tab: Navigate through interactive elements (controls, links, buttons)
- Arrow keys: Navigate slides, scroll content
- Enter/Space: Activate buttons, play/pause video
- Esc: Exit fullscreen, close viewer
- Ctrl/Cmd shortcuts: Zoom, print, fullscreen
- All functionality accessible via keyboard only
-
Screen Reader Support:
- ARIA labels on all controls:
aria-label="Next slide",aria-label="Download presentation" - ARIA live regions for dynamic updates:
aria-live="polite"for page changes: โNow viewing slide 5 of 42โaria-live="assertive"for errors: โContent failed to loadโ
- Semantic HTML: Proper heading hierarchy (h1 for title, h2 for sections)
- Alt text for all images and thumbnails
- Content description read aloud: Title, speaker, event, abstract
- ARIA labels on all controls:
-
Focus Management:
- On viewer open: Focus moves to content viewer container
- On modal open (comments, download): Focus moves to modal first element
- On modal close: Focus returns to trigger element
- Focus trap in modals (Tab cycles within modal)
- Visible focus indicators: 3px solid outline, high contrast
-
Color & Contrast:
- All text meets WCAG 2.1 AA standards (4.5:1 for normal, 3:1 for large text)
- Icons paired with text labels (not relying on color alone)
- Rating stars: Color + shape + number for accessibility
- Error states: Red color + icon + text message
-
Video Accessibility:
- Captions/subtitles for all videos (if available)
- Audio descriptions option (future enhancement)
- Keyboard-accessible video controls
- ARIA labels for play, pause, volume, scrubber
-
PDF Accessibility:
- Accessible PDFs preserved (tagged PDFs, alt text, reading order)
- Text-to-speech support (browser native)
- Searchable text layer
- High-contrast mode option
-
Reduced Motion:
- Respects
prefers-reduced-motionmedia query - Disables auto-advance, smooth scrolling, transitions
- Instant state changes instead of animations
- Respects
State Management
Local Component State
currentPage: Current slide/page number (1-based index)totalPages: Total number of slides/pageszoomLevel: Current zoom percentage (25%, 50%, 100%, 200%, 400%)isFullscreen: Boolean for fullscreen stateisPlaying: Boolean for video playback state (if video content)playbackSpeed: Video playback speed (0.5x, 1x, 1.25x, 1.5x, 2x)viewerMode: โfit-widthโ | โfit-pageโ | โcustomโcommentsExpanded: Boolean for comments section visibilitydetailsExpanded: Boolean for details sections (mobile)
Global State (Zustand Store)
currentContent: Content metadata object (full content details)userBookmarks: Array of userโs bookmarked content IDsuserRatings: Object mapping contentId โ userโs ratingviewingHistory: Array of recently viewed contentdownloadQueue: Array of pending downloads
Server State (React Query)
-
Query Keys:
['content', contentId]: Content metadata (15 min cache)['content', contentId, 'materials']: Additional materials (15 min cache)['content', contentId, 'related']: Related content (30 min cache)['content', contentId, 'reviews']: Comments/reviews (2 min cache)['user', userId, 'bookmarks']: User bookmarks (5 min cache)
-
Mutations:
submitRating: Invalidates['content', contentId]query (updates avg rating)postReview: Invalidates['content', contentId, 'reviews']query (adds new review)addBookmark: Invalidates['user', userId, 'bookmarks']querytrackView: No invalidation (analytics only, async)
Real-Time Updates
- View Tracking: Update view stats every 30 seconds (debounced)
- Playback Position: Save video position every 10 seconds for resume capability
- Auto-Save Bookmark: If viewing >5 min, auto-save bookmark with current position
- Rating Updates: Real-time average rating updates when users submit ratings
- Comment Count: Live comment count updates when new reviews posted
Offline State (PWA)
- Cached Content: Service worker caches viewed content for offline access
- Download for Offline: Explicit download stores content in IndexedDB
- Offline Indicator: Banner shows โViewing offlineโ when no network
- Sync Queue: Ratings, comments queued when offline, synced when online
Form Validation Rules
Comment/Review Submission
-
Comment Text:
- Required: If rating not provided (either comment or rating required)
- Min Length: 20 characters (ensures meaningful feedback)
- Max Length: 2000 characters
- Validation: No spam keywords, no excessive links, profanity filter
-
Rating:
- Optional: Can submit comment without rating, or rating without comment
- Range: 1-5 stars (inclusive)
- Validation: Must be integer
Reply Submission
- Reply Text:
- Required: Cannot submit empty reply
- Min Length: 10 characters
- Max Length: 1000 characters
- Validation: Same spam/profanity checks as comments
Edge Cases & Error Handling
Empty States
- No Comments: Display โBe the first to review this content!โ with [Add Review] CTA
- No Related Content: Display โNo related content foundโ with link to browse all content
- No Additional Materials: Hide โAdditional Materialsโ section entirely
- No Ratings: Display โNot yet ratedโ with invitation to rate
Loading States
- Content Loading: Full-screen loading spinner with progress text โLoading contentโฆโ
- Page Transition: Smooth fade between slides with brief loading indicator
- Comments Loading: Skeleton screens for comment cards
- Related Content Loading: Skeleton cards in carousel
- Download Generating: โGenerating downloadโฆโ spinner on button
Error States
-
Content Load Failed:
- Error screen: โUnable to load contentโ
- Possible reasons: Network error, content deleted, CDN issue
- Actions: [Retry], [Download Anyway], [Report Issue], [Close]
-
Unsupported File Type:
- Warning: โThis file type cannot be previewed in browserโ
- Offer direct download instead
- Show file metadata (name, size, type)
-
Large File Warning:
- For files >50 MB: โThis is a large file (145 MB). Download may take several minutes.โ
- Option to proceed or cancel
- Progress indicator during download
-
Corrupt/Invalid PDF:
- Error: โThis PDF file is corrupted and cannot be displayedโ
- Offer download to try opening in native PDF viewer
- Link to report issue to organizers
Permission Issues
-
Private Content (Unauthenticated):
- Blurred preview with overlay: โLogin to view full contentโ
- [Login] / [Create Account] buttons
- Abstract and metadata still visible
-
Download Restricted:
- Download button disabled with tooltip: โDownloads disabled by speakerโ
- Alternative: โContact speaker for accessโ
Playback Issues
-
Video Playback Error:
- Error: โUnable to play videoโ
- Possible reasons: Format not supported, encoding issue, network error
- Actions: [Retry], [Download Video], [Report Issue]
-
Audio/Video Out of Sync:
- User can report issue via [Report Issue] button
- Issue flagged for organizer review
Concurrent Actions
-
Bookmark While Offline:
- Bookmark saved to localStorage
- Synced to server when online
- Visual indicator: โSaved offline, will sync when onlineโ
-
Rate/Comment While Offline:
- Action queued in IndexedDB
- Auto-synced when connection restored
- User notified of pending actions
Browser Compatibility
-
PDF.js Not Supported:
- Fallback: Offer direct download
- Message: โYour browser doesnโt support PDF preview. Download to view.โ
-
Video Format Not Supported:
- Fallback to HLS stream or MP4 download
- Message: โSwitching to compatible formatโฆโ
-
Fullscreen API Not Supported:
- Hide fullscreen button
- Maximize in viewport instead
Change Log
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-04-01 | 1.0 | Initial wireframe creation | Sally (UX) |
Review Notes
Stakeholder Feedback
To be added after stakeholder review
Design Iterations
To be documented as design evolves
Open Questions
-
Annotations/Notes Feature: Should users be able to add private notes or annotations directly on slides?
- Current: Comment system only (public reviews)
- Enhancement: Private notes linked to specific slides, stored in user account
- Use Case: Study notes, implementation reminders, personal highlights
- Recommendation: Add as future enhancement (post-MVP), requires additional API endpoints and UI
-
Offline Download Limits: Should there be a limit on how much content users can download for offline access?
- Current: No explicit limit (device storage is limiting factor)
- Consideration: Storage costs, user experience with large libraries
- Recommendation: Implement soft quota (e.g., 5 GB) with option to manage offline content
-
Content Versioning: If a speaker updates their presentation, should old versions remain accessible?
- Current: Single version only (latest overwrites previous)
- Use Case: Track changes, compare versions, access historical versions
- Recommendation: Keep latest 3 versions, archive older versions with metadata
-
Speaker Notifications: Should speakers be notified when their content receives reviews/ratings?
- Current: No notifications specified
- Enhancement: Email digest (weekly) with review summaries
- Recommendation: Add in notification preferences (Story 1.20)
-
Content Expiration: Should old content (>10 years) be archived or removed from discovery?
- Current: All 20+ years accessible
- Consideration: Storage costs vs. historical value
- Recommendation: Keep all content, add โArchiveโ filter for old content (pre-2015)