aboutsummaryrefslogtreecommitdiffstats
path: root/web
Commit message (Collapse)AuthorAgeFilesLines
* Remove visual 'selected' state highlight from feed itemsAdam Mathes8 days3-12/+12
|
* Fix scrolling behavior, CI linting, and update DockerfileAdam Mathes8 days2-2/+2
|
* Replace sidebar style cycle button with 5 emoji iconsClaude8 days5-182/+187
| | | | | | | | | Swap the single cycle button for individual emoji per theme: ○ Default, ◆ Refined, ▮ Terminal, ❧ Codex, ❀ Sakura. Active theme gets a highlighted state. Separated from the light/dark toggle with a thin divider. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
* Refine themes, add sidebar controls, and theme docsClaude8 days7-258/+304
| | | | | | | | | | | | | | | | | | | | Refined: softer dark-mode link color (#a0c4e8), fix export button vertical alignment with inline-flex, tighten settings page spacing (reduce gaps from 3rem to 1.5rem). Terminal: switch accent from cyan to green (#4ae54a dark / #1a7a2e light), add proper light mode with pale steel background, scanlines only in dark mode. Sidebar: add quick-access controls in footer — moon/sun icon toggles light/dark, circle icon cycles through style themes showing current name. Both update reactively on state change. Add THEMES.md with full documentation on creating new themes: variable reference, selector guide, light/dark mode tips, and the registration process. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
* Add 4 CSS style themes with runtime switcherClaude8 days7-162/+1804
| | | | | | | | | | | | | | | | Adds a style theme system that layers additional CSS files on top of the base stylesheet. Themes are loaded/unloaded dynamically via <link> tags. - Default: existing look, unchanged - Refined: typographic rhythm fixes, consistent spacing on settings page - Terminal: monospace, dark phosphor CRT aesthetic (scanlines, cyan glow) - Codex: book/Tufte-inspired with warm paper tones, serif type, fleurons - Sakura: Japanese-inspired calm aesthetic (named for neko = cat) Each theme supports both light and dark mode. Style selection persists in localStorage and is independent of the light/dark toggle. https://claude.ai/code/session_01Jv3c8GdaDQMm5WYwHUJMVe
* Refine Settings labels and apply heading font to sidebarAdam Mathes8 days4-6/+6
|
* Refine Settings UI: Fix dark mode text colors, split font controls for ↵Adam Mathes8 days5-155/+164
| | | | headers and body, update monospace stack, and soft-deprecate tags
* Soft deprecate tags feature in Sidebar and fix lint errorsAdam Mathes8 days2-24/+20
|
* Soft deprecate tags feature in SettingsAdam Mathes8 days2-6/+8
|
* Refine Settings UI: Full-width feed list, simplified data section, removed ↵Adam Mathes8 days3-28/+23
| | | | dividers
* Refine Settings page: Consistently use Helvetica fonts, remove dividers, ↵Adam Mathes8 days3-3/+3
| | | | simplify Feed list to rows
* Redesign Settings page: grid layout and extended import/export optionsAdam Mathes8 days4-151/+162
|
* Fix regression: mark-as-read not triggering on window scrollAdam Mathes8 days2-25/+25
|
* Fix infinite scroll not triggering on scrollAdam Mathes8 days2-20/+20
|
* fix: add explicit height to .main-content so overflow-y scrollsClaude8 days4-3/+3
| | | | | | | | | | | | | | | | When the sidebar was changed to position:fixed (overlay mode), flex:1 was removed from .main-content. Without flex:1 or an explicit height, .main-content relied on align-items:stretch for its height constraint. This is unreliable for establishing a definite height that overflow-y:auto respects — the element can grow with its content instead of constraining at 100vh and scrolling. Add height:100% to .main-content so it has a definite height from the parent chain (body 100vh → #app 100% → .layout 100% → .main-content 100%). This ensures overflow-y:auto creates a proper scroll container, which is required for both the scroll-based infinite loading and mark-as-read to work. https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
* fix: replace IntersectionObserver with scroll-position check for infinite scrollClaude8 days2-9/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | The IntersectionObserver approach for infinite scroll was unreliable — items would not load when scrolling to the bottom in v3, while v1's polling approach worked fine. The issue was that IntersectionObserver with a custom root element (main-content, whose height comes from flex align-items:stretch rather than an explicit height) didn't fire reliably, and renderItems() being called 3 times per fetch cycle (from both items-updated and loading-state-changed events) kept destroying and recreating the observer. Replace with a simple scroll-position check in the existing onscroll handler, matching v1's proven approach: when the user scrolls within 200px of the bottom of #main-content, trigger loadMore(). This runs on every scroll event (cheap arithmetic comparison) and only fires when content actually overflows the container. Remove the unused itemObserver module-level variable. Update regression tests to simulate scroll position instead of IntersectionObserver callbacks, with 4 cases: scroll near bottom triggers load, scroll far from bottom doesn't, loading=true blocks, and hasMore=false hides sentinel. https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
* fix: store sentinel IntersectionObserver in module-level variable to prevent GCClaude8 days2-9/+9
| | | | | | | | | | | | | | | | | | The load-more sentinel observer was assigned to a local `const observer` that fell out of scope after renderItems() returned. Without a persistent JS reference, engines can garbage-collect the observer, silently breaking infinite scroll (no more items loaded on scroll). Fix: assign to the existing module-level `itemObserver` variable, which is already disconnected/replaced at the top of each renderItems() call. Add three regression tests in regression.test.ts that use a class-based IntersectionObserver mock to capture the callback and verify: - sentinel visible → loadMore fires - sentinel visible while loading → loadMore suppressed - hasMore=false → no sentinel rendered, no loadMore https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
* build: rebuild frontend dist (fix ui-check CI failure)Claude8 days4-9/+14
| | | | | Source changes since last dist commit shifted Vite content hashes. Rebuilding ensures web/dist/v3/ matches a fresh `make ui-vanilla`.
* Complete V2 removal from Makefile and check in updated V3 production assetsAdam Mathes9 days3-4/+4
|
* Remove legacy V2 React frontend and update build/test scripts to focus on ↵Adam Mathes9 days7-38/+5
| | | | Vanilla JS (V3)
* Fix CSP violation on login page by moving inline script to external fileAdam Mathes9 days2-5/+13
|
* Update frontend build artifacts and fix test lint errorsAdam Mathes9 days5-21/+21
|
* Fix scroll-to-read functionality across all UIs (V1, V2, V3)Adam Mathes9 days1-139/+156
|
* Remove circle styling from NEKO sidebar toggle buttonclaude/thicket-ready-crank-RmQuIClaude9 days8-20/+20
| | | | | | | Strip border-radius, box-shadow, background, and backdrop-filter from the sidebar toggle in both v2 and v3 frontends so the logo appears flat. https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
* Add tests for CSRF exclusions, Filter includeContent, multi-feed, and routingClaude9 days2-0/+93
| | | | | | | | | | | - CSRF: test excluded paths (/api/login, /api/logout), PUT/DELETE methods - Item model: test Filter includeContent flag, ItemById returns content, multiple feed_ids filtering - API: test read_filter=all param, feed_ids comma-separated filter, full_content exclusion from stream - Routing: add v3 frontend route test https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
* Align sidebar CSS breakpoints with JS threshold at 1024pxClaude9 days4-11/+11
| | | | | | | | The sidebar default-closed JS logic used 1024px but CSS media queries used 768px, causing inconsistent behavior on tablets. Updated all sidebar-related breakpoints to 1024px/1025px to match. https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
* Enhance CSRF protection for login pageAdam Mathes9 days3-33/+61
| | | | | | | | | | Login form now includes a CSRF token from the cookie as a hidden form field. The CSRF middleware accepts tokens from either the X-CSRF-Token header (for JS clients) or the csrf_token form field (for HTML forms). Removed /login from the CSRF exclusion list so login POSTs are now validated. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* v3 ui: require 100% visibility before marking items as readClaude9 days2-2/+2
| | | | | | | | | | | | | Change IntersectionObserver threshold from 0.5 to 1.0 so items are only marked as read when fully scrolled into view, reducing accidental mark-as-read during fast scrolling. Also fix unused Category import in perf test and add thicket config.json to repository so future agents can use thicket CLI commands. Closes NK-s2g59a https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
* V3 UI Polish: Improved keyboard navigation, fixed logo position, and updated ↵Adam Mathes9 days6-26/+26
| | | | | | | | | | | branding - Fix V3 keyboard navigation delay (resolved NK-wjats7) - Update V3 document title to 'neko' (resolved NK-4p3s91) - Fix V3 neko logo/button position to be top-left fixed (resolved NK-89za3s) - Improve FeedItems (React) stability with ref-based index tracking and robust tests - Sync V3 styling and selection feedback with V2 patterns - Rebuild production assets
* Fix v3ui: neko button fixed positionAdam Mathes9 days4-4/+3
| | | | | | | - Remove duplicate neko logo from v3 sidebar - Keep sidebar toggle button fixed at top-left even when sidebar is open - Add top padding to v3 sidebar to prevent overlap with the fixed toggle button - Update v3 tests to match UI changes
* Add performance benchmarks, stress tests, and frontend perf testsClaude9 days1-0/+92
| | | | | | | | | | | | Go benchmarks cover item CRUD/filter/sanitization, API endpoints (stream, item update, feed list), middleware stack (gzip, security headers, CSRF), and crawler pipeline (feed parsing, mocked crawl). Stress tests verify concurrent reads/writes and large dataset handling. Frontend perf tests measure template generation, DOM insertion, and store event throughput. New Makefile targets: bench, bench-short, stress, test-perf. https://claude.ai/code/session_01ChDVWFDrQoFjMYHpaLGr9s
* Fix v3 theme contrast and sync with v2 colors, add v3 logo, and fix v2 test ↵Adam Mathes9 days6-14/+15
| | | | | | | | | | stability - Sync v3 dark/light theme colors with v2 defaults - Fix v3 settings input/select contrast in dark mode - Add logo emoji to v3 sidebar - Fix duplicate key warnings and side-effect issues in FeedItems.tsx (v2) - Rebuild production assets
* Fix v3 build process and CSRF login/logout exclusionsAdam Mathes9 days5-17/+38
| | | | | | | - Update Makefile to correctly build and copy frontend-vanilla (v3) assets - Fix frontend-vanilla/vite.config.ts to build to its own dist directory - Normalize CSRF check path and exclude /api/logout to fix v3 session clearing - Include latest built assets for v3
* Fix restricted login access and modernize login pageAdam Mathes9 days3-21/+200
| | | | | | | | - Close NK-oqd24q: Fix login access for v3/api - Update web.go to exclude /login/ from CSRF check during initial submission - Modernize web/static/login.html with new CSS and structure - Add web/login_test.go to verify CSRF exclusion - Created NK-ngokc3 for further CSRF enhancements
* Web: Make vanilla (v3) frontend the default at root, move react (v2) to /v2/Adam Mathes10 days1-7/+6
|
* Vanilla JS (v3): Removed confusing secondary cat logo, fixed mobile ↵Adam Mathes10 days4-6/+3
| | | | overflow, cleaned up styles
* Vanilla JS (v3): Fix mobile horizontal scroll, simplify logo to 🐱 emoji, ↵Adam Mathes10 days5-108/+131
| | | | implement feed deselect, and complete Settings (Add Feed, Export/Import OPML)
* Vanilla JS (v3): Restore base font to 18px and keep sidebar fonts compactAdam Mathes10 days4-3/+3
|
* Vanilla JS (v3): Adjust font sizes to comfortable 16px middle groundAdam Mathes10 days4-3/+3
|
* Vanilla JS (v3): Reduce font size and implement collapsible sidebar sections ↵Adam Mathes10 days4-10/+10
| | | | for Tags and Feeds
* Vanilla JS (v3): Add Logout button, 'neko' cat emoji toggle, and mobile ↵Adam Mathes10 days4-106/+108
| | | | responsiveness with backdrop
* Vanilla JS (v3): Fix filtering logic, Settings navigation, and refine styles ↵Adam Mathes10 days4-8/+9
| | | | for v2 parity
* Vanilla JS (v3): Redesign to 2-pane glassmorphism, fix CSP errors, fix ↵Adam Mathes10 days5-105/+105
| | | | Settings view, and achieve 80% test coverage
* Vanilla JS (v3): Final parity with React (Search, Settings, Shortcuts)Adam Mathes10 days5-75/+105
|
* Vanilla JS (v3): Implement Tags, Filters, and Infinite ScrollAdam Mathes10 days5-51/+75
|
* Vanilla JS (v3): Implement 3-pane layout, item fetching, reading, and testingAdam Mathes10 days6-22/+52
|
* Scaffold Vanilla JS Frontend (v3): Create directory, update Makefile/web.go, ↵Adam Mathes10 days7-40/+79
| | | | embed dist/v3
* Optimize frontend with memoized FeedItem and efficient IntersectionObserverAdam Mathes10 days3-12/+12
|
* Switch to HashRouter to fix page reload issues (NK-hy162w)Adam Mathes10 days2-6/+6
|
* Frontend: Build and check in production assets for multi-select featureAdam Mathes10 days4-9/+9
|