summaryrefslogtreecommitdiff
path: root/apps/web/app/reader
Commit message (Collapse)AuthorAgeFilesLines
* fix: space/shift+space scrolls focused panel, revert content font, fix share ↵Fuwn2026-02-074-36/+4
| | | | | | | | | modal text Space/Shift+Space now scrolls whichever panel is focused (entry list, detail panel, or sidebar) instead of only working in the detail panel. Removed content font setting. Fixed share modal placeholder casing and ellipsis spacing.
* feat: resolve 7 pre-ship QoL itemsFuwn2026-02-075-6/+118
| | | | | | | | | | | | | | | - Space/Shift+Space: page down/up in detail panel (80% scroll) - Content font: sans-serif/serif/monospace selector in appearance settings, applied to article content in detail panel - Accessibility: entry-list-item uses button instead of div, folder toggles have aria-expanded, shortcut keys have aria-labels - Share notes: replaced window.prompt with proper modal dialog matching existing UI patterns - Worker .env.example: template with all 10 environment variables - Worker poisoned messages: archive unprocessable queue messages instead of leaving them stuck forever - Worker pool Submit: check return value, reschedule dropped feeds 30s into the future, log warnings for rejected submissions
* fix: dynamically calculate detail panel equal split from current layoutFuwn2026-02-071-4/+9
|
* fix: reset panel sizes without page reload, prevent partial-data max width ↵Fuwn2026-02-073-37/+62
| | | | | | | | | | | | clamping Use imperative groupRef API to resize panels instantly instead of writing to localStorage and calling window.location.reload(). Register reset callbacks in Zustand store from layout components. Change sidebarMaxWidth early return from && to || so the generous 35% fallback is used until both subscriptions and custom feeds have loaded, preventing intermittent clamping to minimum size.
* fix: reset sidebar to midpoint of min/max, detail to 50/50 splitFuwn2026-02-071-6/+32
| | | | | | Read current panel dimensions from DOM, compute sidebar midpoint as (192px + maxWidth) / 2, and detail as equal halves. Write computed values to localStorage before reload.
* fix: prevent sidebar max width from clamping persisted size on loadFuwn2026-02-071-0/+1
| | | | | | Return 35% max until subscriptions/feeds data loads. Previously the useMemo computed a small max from just nav items on first render, causing the library to clamp and overwrite the stored sidebar width.
* fix: persist sidebar size across collapse/expand cyclesFuwn2026-02-071-1/+1
| | | | | | When sidebar is collapsed, the Group fires onLayoutChanged with only main-content, overwriting the stored sidebar size. Pass undefined for onLayoutChanged when collapsed so the stored layout is preserved.
* fix: api key prefix rename, revoke fix, and webhook validationFuwn2026-02-071-2/+2
| | | | | | Rename API key prefix from asn_ to asa_, fix key revoke by aligning response property names with frontend interface, and add server/client validation to prevent enabling webhooks without a URL.
* feat: dynamically compute sidebar max width from item text widthsFuwn2026-02-071-2/+105
| | | | | | Measures all sidebar items (nav links, feeds, folders, custom feeds, footer) using Canvas measureText to determine the narrowest width that avoids truncation, then passes it as the Panel maxSize.
* fix: use fixed rem-based sidebar min/default with whitespace-nowrapFuwn2026-02-073-79/+7
| | | | | | | | The dynamic measurement approach failed because the library caches Panel constraints at mount and ignores state-driven prop updates. Now uses fixed rem values (12rem min, 16rem default) which scale with font size, plus whitespace-nowrap on all sidebar items to prevent text wrapping at any width.
* fix: measure text nodes in sidebar min width calculationFuwn2026-02-072-26/+23
| | | | | | querySelectorAll(':scope > *') misses bare text nodes like 'notifications' in the footer button. Now walks childNodes to handle mixed text node + element children correctly.
* fix: include sidebar footer items in min width measurementFuwn2026-02-071-19/+48
| | | | | | Notifications button text is wider than all entries. Now measures all nav items AND footer links/buttons, taking the widest row plus badge reserve as the sidebar minimum width.
* fix: use Canvas text measurement for sidebar min widthFuwn2026-02-071-8/+23
| | | | | | getBoundingClientRect on wrapped text returns the narrow wrapped width, not the single-line width. Canvas measureText is layout- independent and gives the true single-line intrinsic text width.
* fix: measure sidebar min width from children intrinsic widthsFuwn2026-02-071-2/+16
| | | | | | scrollWidth on a block flex element returns parent width, not content width. Now sums getBoundingClientRect().width of each child element (text span + unread badge) for a screen-independent measurement.
* feat: derive sidebar min/default width from measured contentFuwn2026-02-071-2/+19
| | | | | | Measures the first sidebar nav item (all entries + unread badge) after mount and uses its scrollWidth + padding as minSize. Default is 1.4x the minimum for comfortable reading of feed titles.
* fix: persist detail panel sizes with panelIds-keyed storageFuwn2026-02-072-1/+2
| | | | | Without panelIds, the single-panel state (no entry selected) was overwriting the two-panel layout on every navigation.
* feat: persist sidebar panel sizes across page refreshesFuwn2026-02-072-2/+15
| | | | | Wire useDefaultLayout to sidebar Group with localStorage storage. Update reset command to clear both sidebar and detail layout keys.
* fix: use string percentages for react-resizable-panels v4 size propsFuwn2026-02-072-45/+56
| | | | | v4 treats numeric size props as pixels, not percentages. defaultSize={20} was rendering as 20px (~1.9% of viewport).
* feat: pre-ship polish — UI improvements, keyboard shortcuts, appearance ↵Fuwn2026-02-0716-422/+793
| | | | | | | | | | | | | | | | | | settings - Rename "muted keywords" to "muted phrases" throughout settings UI - Add header with navigation to auth pages (sign-in, sign-up, etc.) - Merge security tab (TOTP setup) into account settings tab - Fix TOTP name input truncation on Safari (w-64 → flex-1 min-w-0) - Add appearance settings: font size, time display format, entry images toggle, reading time toggle - Add keyboard shortcuts dialog (? key) with all keybindings documented - Add extended vim shortcuts: gg, G, n/N (next/prev unread), Ctrl+h/l (panel focus) - Add command palette shortcut (⌘K) to shortcuts dialog - Add icon URL fields for folders and custom feeds (DB + queries + settings UI) - Add data-has-unreads attribute for sidebar keyboard navigation - Fix SSR prerendering crash from Zustand persist and react-resizable-panels localStorage access - Add detail panel layout persistence via useDefaultLayout - Update marketing copy to advertise vim-like keyboard navigation
* style: lowercase all user-facing strings and add custom eslint ruleFuwn2026-02-079-55/+56
| | | | | | | | Comprehensive sweep of all user-facing text to enforce lowercase convention, including acronyms (api, rest, http, opml, json, totp, mfa, qr, hmac). Added asa-lowercase/lowercase-strings eslint rule that reports uppercase in notify() calls, error messages, jsx text, and checked attributes (placeholder, alt, title).
* feat: asa.news RSS reader with developer tier, REST API, and webhooksFuwn2026-02-0736-0/+6635
Full-stack RSS reader SaaS: Supabase + Next.js + Go worker. Includes three subscription tiers (free/pro/developer), API key auth, read-only REST API, webhook push notifications, Stripe billing with proration, and PWA support.