Commit Graph

182 Commits

Author SHA1 Message Date
Yusuf Suleman
e350a354a3 fix: replace .defaultGoal with DailyGoal() to avoid macro expansion issue
All checks were successful
Security Checks / dependency-audit (push) Successful in 12s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 3s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:13:27 -05:00
Yusuf Suleman
ac8fe3db29 fix: remove History tab, add Foods tab, fix FitnessTabView
All checks were successful
Security Checks / dockerfile-lint (push) Successful in 3s
Security Checks / dependency-audit (push) Successful in 12s
Security Checks / secret-scanning (push) Successful in 3s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:11:29 -05:00
Yusuf Suleman
f3e5737706 fix: all model/repo/view mismatches — computed properties, missing methods, type fixes
All checks were successful
Security Checks / dependency-audit (push) Successful in 14s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 3s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:08:40 -05:00
Yusuf Suleman
9438421207 fix: GoalsViewModel use repo.loadDay instead of missing goals()
All checks were successful
Security Checks / dependency-audit (push) Successful in 12s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 4s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:01:30 -05:00
Yusuf Suleman
c934791a4a fix: ContentView isAuthenticated → isLoggedIn
All checks were successful
Security Checks / dependency-audit (push) Successful in 12s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 3s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:59:20 -05:00
Yusuf Suleman
fdb8aeba8a restore: original UI views from first build, keep fixed models/API
All checks were successful
Security Checks / dependency-audit (push) Successful in 12s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 3s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:54:46 -05:00
Yusuf Suleman
e852e98812 fix: iOS fitness models — UUID strings, snapshot_ fields, convertFromSnakeCase compatibility
All checks were successful
Security Checks / dependency-audit (push) Successful in 12s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 3s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:44:53 -05:00
Yusuf Suleman
4592e35732 feat: major platform expansion — Brain service, RSS reader, iOS app, AI assistants, Firefox extension
All checks were successful
Security Checks / dependency-audit (push) Successful in 1m13s
Security Checks / secret-scanning (push) Successful in 3s
Security Checks / dockerfile-lint (push) Successful in 3s
Brain Service:
- Playwright stealth crawler replacing browserless (og:image, Readability, Reddit JSON API)
- AI classification with tag definitions and folder assignment
- YouTube video download via yt-dlp
- Karakeep migration complete (96 items)
- Taxonomy management (folders with icons/colors, tags)
- Discovery shuffle, sort options, search (Meilisearch + pgvector)
- Item tag/folder editing, card color accents

RSS Reader Service:
- Custom FastAPI reader replacing Miniflux
- Feed management (add/delete/refresh), category support
- Full article extraction via Readability
- Background content fetching for new entries
- Mark all read with confirmation
- Infinite scroll, retention cleanup (30/60 day)
- 17 feeds migrated from Miniflux

iOS App (SwiftUI):
- Native iOS 17+ app with @Observable architecture
- Cookie-based auth, configurable gateway URL
- Dashboard with custom background photo + frosted glass widgets
- Full fitness module (today/templates/goals/food library)
- AI assistant chat (fitness + brain, raw JSON state management)
- 120fps ProMotion support

AI Assistants (Gateway):
- Unified dispatcher with fitness/brain domain detection
- Fitness: natural language food logging, photo analysis, multi-item splitting
- Brain: save/append/update/delete notes, search & answer, undo support
- Madiha user gets fitness-only (brain disabled)

Firefox Extension:
- One-click save to Brain from any page
- Login with platform credentials
- Right-click context menu (save page/link/image)
- Notes field for URL saves
- Signed and published on AMO

Other:
- Reader bookmark button routes to Brain (was Karakeep)
- Fitness food library with "Add" button + add-to-meal popup
- Kindle send file size check (25MB SMTP2GO limit)
- Atelier UI as default (useAtelierShell=true)
- Mobile upload box in nav drawer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:56:29 -05:00
Yusuf Suleman
af1765bd8e fix: mobile nav spacing + safe area, PDF viewer mobile layout
- Mobile nav: tighter spacing, safe-area-inset-bottom padding
- Nav items closer together so bottom section stays visible
- Nav sheet scrollable if content overflows
- PDF viewer mobile: 55vh for PDF, rest for sidebar (scrollable)
- Full screen on mobile (no border-radius, no padding)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 00:27:16 -05:00
Yusuf Suleman
5098545580 fix: mobile nav full height + upload paste box, PDF zoom fit
- Mobile nav sheet: flex layout, bottom section pushed to bottom
- Upload paste box + file picker added to mobile nav drawer
- Date shown at bottom of mobile nav
- PDF viewer: added #zoom=page-fit to iframe URL

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 00:18:45 -05:00
Yusuf Suleman
2ab27d048a fix: mobile tags pills show all active tags regardless of item count
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 22:42:56 -05:00
Yusuf Suleman
9f51f3bcd3 feat: brain mobile pills — tags shown after separator, prefixed with #
Scroll: [All] [Home] [Work] ... | [#guide] [#important] [#dev] ...

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 22:35:37 -05:00
Yusuf Suleman
3531360827 feat: brain colored folders/tags — color + icon fields, mobile pills
Backend:
- Added color (hex) and icon (lucide name) columns to folders and tags
- Default folders seeded with colors: Home=green, Work=indigo, Travel=blue, etc.
- API returns color/icon in sidebar and CRUD responses
- Create/update endpoints accept color and icon

Frontend:
- Mobile: horizontal scrollable pill tabs with colored dots
- Desktop sidebar: colored dots next to folder names
- Active pill gets tinted border matching folder color

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 22:32:40 -05:00
Yusuf Suleman
8f3afd46c3 feat: brain mobile sidebar — slide-out drawer with overlay
- "Folders & Tags" button shown only on mobile
- Click opens sidebar as slide-out drawer from left
- Dark overlay behind, click to dismiss
- Selecting a folder/tag auto-closes the drawer
- Desktop sidebar unchanged

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 22:13:48 -05:00
Yusuf Suleman
a52b13eb28 feat: brain sidebar — settings icon at top, tags show counts, hide empty tags
- Settings gear icon in sidebar header (replaces bottom manage button)
- Click gear → manage mode (shows as checkmark when active)
- Tags only show ones with items (counts visible)
- Manage mode shows ALL tags with delete buttons
- Add input inline under each section in manage mode
- Fixed button-inside-button error (use span for delete)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 22:05:01 -05:00
Yusuf Suleman
adef1dbeb8 fix: sidebar add button no longer cut off — input shrinks, button stays visible
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:58:45 -05:00
Yusuf Suleman
e1f18cfb18 fix: upload works in both Docker and dev mode
Falls back to absolute path on host when /app/screenshots doesn't exist.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:56:26 -05:00
Yusuf Suleman
f94987ac1b fix: move upload endpoint to root /upload route (works from both app and atelier)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:44:46 -05:00
Yusuf Suleman
b09fa0b42b feat: paste box + file picker in AppShell sidebar for screenshots
- Paste box: click it, Ctrl+V a screenshot from snipping tool
- Upload icon button: opens file picker
- Only captures paste events inside the box (not globally)
- Shows "Uploading..." then "Saved!" status

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:41:26 -05:00
Yusuf Suleman
b87a3a583d feat: upload button in AppShell sidebar — click or drag to upload screenshots
- Dashed border button at bottom of sidebar nav
- Click to open file picker
- Drag files onto the bottom rail area to upload
- Shows "Uploading..." then "Saved!" for 2 seconds
- Files save to platform/screenshots/ with timestamp names
- Works from any page in the Atelier shell

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:36:13 -05:00
Yusuf Suleman
07cbec89c4 feat: quick screenshot upload at /upload
- Drop zone: drag and drop files
- Paste: Ctrl+V pastes clipboard screenshots directly
- Browse: file picker button
- Saves to platform/screenshots/ with timestamp filename
- Mounted as volume in frontend container
- Accessible from any device at dash.quadjourney.com/upload

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:31:13 -05:00
Yusuf Suleman
02a9783d4f feat: brain sidebar manage mode — add/delete folders and tags
- "Manage folders & tags" button at bottom of sidebar
- Click to enter manage mode:
  - + button appears next to Folders/Tags headers
  - Inline input to type and add new folder/tag
  - × delete button appears on each item
  - Delete confirms before removing
- "Done" button exits manage mode
- Tags/folders created/deleted via taxonomy API
- Sidebar refreshes after changes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:25:29 -05:00
Yusuf Suleman
11965eccd1 fix: brain sidebar — show all tags, fix content overflow, match nav styling
- Tags now show regardless of item_count (were hidden when 0)
- Content padding fixed (28px, overflow-x hidden)
- Sidebar nav items use same var(--text-sm) and var(--transition) as AppShell
- Active count color matches AppShell pattern
- Hero command-actions narrower to prevent overflow

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:20:30 -05:00
Yusuf Suleman
5689ee1f6a fix: brain layout — sidebar + content as flex siblings, no page wrapper
Template restructured to match Reader pattern:
brain-layout (flex) > brain-sidebar (248px) + brain-content (flex:1)
Hero and capture bar moved inside brain-content.
Removed page/app-surface wrappers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:17:14 -05:00
Yusuf Suleman
e982b10db5 fix: brain second sidebar — Reader-style panel between AppShell and content
- Removed AppShell sub-nav items (wrong approach)
- Brain page now has its own sidebar column (248px, like Reader)
- Layout: [AppShell Nav] | [Brain Sidebar] | [Masonry Grid]
- Sidebar shows: All items, Folders section, Tags section (with counts)
- Matches Reader page pattern exactly (same CSS, same structure)
- Mobile: sidebar hidden

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 21:12:40 -05:00
Yusuf Suleman
e8c5636d98 refactor: brain sidebar lives in AppShell nav, not in-page
- Removed duplicate in-page sidebar from AtelierBrainPage
- AppShell sub-items now full-sized, matching main nav style
- Folders/Tags tabs as pill toggle in sidebar
- All folders shown (not just ones with items)
- All tags shown (not limited to 12)
- Brain page is now just capture + search + masonry grid
- Sidebar links use /brain?folder=X and /brain?tag=X

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 20:58:49 -05:00
Yusuf Suleman
fd636f01fa feat: brain sub-sidebar in AppShell — folders/tags under Brain nav item
- Brain nav item expands when on /brain page
- Shows Folders/Tags toggle tabs
- Folder links: /brain?folder=Work etc
- Tag links: /brain?tag=dev etc
- Counts shown next to each
- Brain page reads filter from URL params
- Only shows folders with items + key defaults (Home, Work, Knowledge)
- Tags limited to 12 most-used

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 20:35:19 -05:00
Yusuf Suleman
5f2fe8eca6 fix: brain page 500 — removed stale folderCounts reference
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 20:30:18 -05:00
Yusuf Suleman
68a8d4c228 feat: brain taxonomy — DB-backed folders/tags, sidebar, CRUD API
Backend:
- New Folder/Tag/ItemTag models with proper relational tables
- Taxonomy CRUD endpoints: list, create, rename, delete, merge tags
- Sidebar endpoint with folder/tag counts
- AI classification reads live folders/tags from DB, not hardcoded
- Default folders/tags seeded on first request per user
- folder_id FK on items for relational integrity

Frontend:
- Left sidebar with Folders/Tags tabs (like Karakeep)
- Click folder/tag to filter items
- "Manage" mode: add new folders/tags, delete existing
- Counts next to each folder/tag
- "All items" option to clear filter
- Replaces the old signal-strip cards

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 20:23:45 -05:00
Yusuf Suleman
4805729f87 checkpoint: before taxonomy refactor
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 20:12:14 -05:00
Yusuf Suleman
e7b7ff3400 feat: brain live search — results appear as you type (300ms debounce)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:51:13 -05:00
Yusuf Suleman
85a075260d fix: brain search — Meilisearch settings use PATCH not PUT
Settings were failing with 405 (PUT not supported in Meilisearch v1.12).
Changed to PATCH. Filterable/searchable attributes now applied.
Keyword search working: wedding, yusuf, insurance, airport all return results.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:48:27 -05:00
Yusuf Suleman
f7fd7cf7d5 fix: brain viewer — centered popup modal instead of full-screen
- 90vw x 80vh centered modal with rounded corners and shadow
- Blurred backdrop overlay, click outside to close
- PDF viewer on left, metadata sidebar on right
- Feels like a popup, not a page takeover

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:18:34 -05:00
Yusuf Suleman
840c7d6ea7 feat: brain full-screen PDF/image viewer with sidebar details
- PDFs open in full-screen split layout: PDF viewer (left) + metadata sidebar (right)
- Uses native browser PDF viewer (iframe) for full rendering
- Images open in centered viewer with dark background
- Sidebar shows title, summary, tags, folder, extracted text, download button
- Mobile: stacks vertically (viewer top, sidebar bottom)
- Links and notes still use the slide-over sheet

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:14:59 -05:00
Yusuf Suleman
783faa0abd feat: brain inline PDF viewer — reuses PdfInlinePreview from trips
- PDF detail sheet now shows inline rendered PDF pages
- Click to expand inline, "Full view" for overlay viewer
- Uses pdfjs-dist canvas rendering (same as trips app)
- Falls back to screenshot if no original upload found

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:08:42 -05:00
Yusuf Suleman
b58313ec8e fix: brain polling — update individual items instead of full reload
Polls only pending/processing items by ID every 4s instead of
reloading the entire list every 3s. Prevents screen flashing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:06:52 -05:00
Yusuf Suleman
7a5c3382d3 feat: brain file upload button — PDFs, images, text files
- Upload button (arrow icon) in capture bar next to text input
- Accepts: PDF, PNG, JPG, GIF, WEBP, TXT, MD, CSV
- Multiple file upload supported
- Hidden file input triggered by button click
- Upload status indicator while processing
- Files sent to /api/brain/items/upload endpoint

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:03:52 -05:00
Yusuf Suleman
3264aad614 feat: brain cards show PDF thumbnails, image previews, extracted text
- PDF cards: show first page render as thumbnail with "PDF" badge
- Image cards: show the original uploaded image
- PDF detail sheet: shows screenshot + extracted text in mono font
- Image detail sheet: shows the original image
- Card content shows page count for PDFs, extracted text preview
- Links still open URL on screenshot click, PDFs/images open detail

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 18:57:14 -05:00
Yusuf Suleman
b179386a57 feat: brain PDF/image text extraction — pymupdf + tesseract OCR + vision API
- PDF: extracts selectable text via pymupdf, falls back to Tesseract OCR for scanned docs
- PDF: renders first page as screenshot thumbnail
- Images: Tesseract OCR for text extraction, OpenAI vision API fallback for photos
- Plain text files: direct decode
- All extracted text stored in extracted_text field for search/embedding
- Tested: PDF upload → text extracted → AI classified → searchable

New deps: pymupdf, pytesseract, Pillow
System dep: tesseract-ocr added to both Dockerfiles

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 18:49:04 -05:00
Yusuf Suleman
2c3f0d263b feat: brain detail sheet — screenshot for links, editable notes, spelling fix
- Link detail: shows screenshot image (clickable to open URL), URL, summary, tags
- Note detail: click note text to edit, save/cancel buttons
- Notes: AI now fixes spelling/grammar instead of rewriting
- AI returns corrected_text field for notes, worker replaces raw_content
- Removed verbose meta grid (folder/confidence/status/saved)
- Folder shown as a pill badge in meta line

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 18:27:27 -05:00
Yusuf Suleman
6694795726 fix: brain UX — links open URL, notes are editable, remove meta grid
- Link card screenshots now open the original URL in new tab
- Card content area opens the detail sheet
- Notes: clicking the note body in detail sheet enters edit mode
- Removed Folder/Confidence/Status/Saved meta grid from detail
- Replaced with single inline folder + date line
- Tags still clickable for filtering

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 17:56:04 -05:00
Yusuf Suleman
b26392a2ca feat: brain tag filtering — click any tag to filter, clear pill, auto-poll
- Tags are now clickable buttons on cards and detail sheet
- Active tag filter shows as a pill with clear button
- Items filtered by tag via API query param
- Auto-polling every 3s for pending/processing items
- Detail sheet shows raw_content for notes with "Note" label

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 17:49:53 -05:00
Yusuf Suleman
6565b23deb feat: brain masonry card grid — Karakeep-style layout with Atelier aesthetics
- 3-column CSS masonry grid (2 on tablet, 1 on mobile)
- Link cards show screenshot thumbnails
- Note cards show content body inline
- Tags as pills, folder/date in meta footer
- Screenshot serving endpoint added to brain API
- Auto-polling for pending items (3s interval)
- Detail sheet shows raw_content for notes
- Warm frosted glass card styling matching Atelier design

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 17:42:59 -05:00
Yusuf Suleman
477188f542 feat: brain frontend — Atelier-style page with capture, search, feed, detail sheet
- AtelierBrainPage.svelte with full CRUD UI
- Capture bar: paste URL or type note, saves instantly
- Folder signal cards with counts
- Hybrid search (keyword + semantic)
- Item feed with metadata, tags, confidence indicators
- Detail slide-over sheet with summary, metadata, actions
- Added to AppShell nav, legacy Navbar, and layout allApps
- Route at /brain

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 17:18:36 -05:00
Yusuf Suleman
2072c359aa feat: wire brain service to platform gateway
- Gateway proxies /api/brain/* to brain-api:8200/api/* via pangolin network
- User identity injected via X-Gateway-User-Id header
- Brain app registered in gateway database (sort_order 9)
- Added to GATEWAY_KEY_SERVICES for dashboard integration
- Tested: health, config, list, create all working through gateway

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:32:53 -05:00
Yusuf Suleman
c9e776df59 fix: brain service — pgvector extension init, meili key length
Brain service fully operational:
- All 6 containers running
- API responds on /api/health
- Worker processes items (fetch, screenshot, classify, index)
- Tested: link creation, background processing, asset archival

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:53:25 -05:00
Yusuf Suleman
8275f3a71b feat: brain service — self-contained second brain knowledge manager
Full backend service with:
- FastAPI REST API with CRUD, search, reprocess endpoints
- PostgreSQL + pgvector for items and semantic search
- Redis + RQ for background job processing
- Meilisearch for fast keyword/filter search
- Browserless/Chrome for JS rendering and screenshots
- OpenAI structured output for AI classification
- Local file storage with S3-ready abstraction
- Gateway auth via X-Gateway-User-Id header
- Own docker-compose stack (6 containers)

Classification: fixed folders (Home/Family/Work/Travel/Knowledge/Faith/Projects)
and fixed tags (28 predefined). AI assigns exactly 1 folder, 2-3 tags, title,
summary, and confidence score per item.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:48:29 -05:00
Yusuf Suleman
51a8157fd4 fix: module grid ratio now matches mockup (7fr/3fr = 855/367px)
Added min-width:0 to fix grid fr unit calculation.
Budget module: 855px, Issues: 367px — exact mockup match.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 22:06:36 -05:00
Yusuf Suleman
40a459e752 fix: match mockup container width — layout main uncapped to 1380px, remove padding conflict
Dashboard surface now renders at 1280px matching the React mockup exactly.
All 9 pages verified: zero mobile overflow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 21:57:18 -05:00
Yusuf Suleman
5803973a15 fix: media page mobile overflow on kindle select row
All 9 pages verified: zero horizontal overflow on 390px mobile viewport.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 21:28:53 -05:00