aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-14 09:59:56 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-14 09:59:56 -0800
commit7fbb0c3838e188ba3b810156ff6546239e89923e (patch)
tree857f8e86a7796cdb0e1c4c4dac5c1d4ea7bd71b2
parentc9c3469ce90f5e1cf624a9a97d66fd6db3aba8cb (diff)
downloadneko-7fbb0c3838e188ba3b810156ff6546239e89923e.tar.gz
neko-7fbb0c3838e188ba3b810156ff6546239e89923e.tar.bz2
neko-7fbb0c3838e188ba3b810156ff6546239e89923e.zip
fix: ensure neko toggle button is always accessible (fixing NK-zvt8hi)
-rw-r--r--.thicket/tickets.jsonl4
-rw-r--r--frontend/src/App.css65
-rw-r--r--frontend/src/App.tsx9
-rw-r--r--frontend/src/components/FeedList.css5
4 files changed, 32 insertions, 51 deletions
diff --git a/.thicket/tickets.jsonl b/.thicket/tickets.jsonl
index 7ea6528..ec21934 100644
--- a/.thicket/tickets.jsonl
+++ b/.thicket/tickets.jsonl
@@ -17,9 +17,10 @@
{"id":"NK-6b4a2e","title":"v2 frontend BLUE LINKS","description":"Make most of the links BLUE and BOLD like in the old legacy version. Thanks","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T00:44:47.147880845Z","updated":"2026-02-14T01:09:26.770086073Z"}
{"id":"NK-6o87rr","title":"Vanilla JS: Implement Pagination","description":"Implement 'Load More' or infinite scroll for item list in vanilla JS prototype.","type":"feature","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T04:47:40.618957267Z","updated":"2026-02-14T04:47:40.618957267Z"}
{"id":"NK-6q9nyg","title":"Refactor HTTP-dependent functions for testability","description":"Several functions use http.Get or external libraries directly (GetFullContent uses goose, ResolveFeedURL uses http.Get + goquery, imageProxyHandler uses http.Client). Refactor these to accept interfaces for HTTP fetching so they can be unit tested with mocks. This is the primary blocker for reaching 90% coverage.","type":"cleanup","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T03:54:37.630148644Z","updated":"2026-02-14T02:44:05.328784994Z"}
+{"id":"NK-7jh6re","title":"sidebar still ugly","description":"still very ugly, even compared to the original v1 static version\n\neither make it nicer or just copy the v1 version more directly","type":"feature","status":"open","priority":0,"labels":null,"assignee":"","created":"2026-02-14T17:59:17.948112909Z","updated":"2026-02-14T17:59:17.948112909Z"}
{"id":"NK-7tzbql","title":"Fix TUI Content View Navigation and Interaction","description":"The TUI content view (reading a single item) is currently non-functional or severely limited. Users cannot easily navigate back, scroll, or interact with the content. This task involves improving the 'viewContent' state in the TUI.","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T05:02:57.382793121Z","updated":"2026-02-13T05:06:15.144485446Z"}
{"id":"NK-7xuajb","title":"[security] Add HTTP Security Headers","description":"Add middleware to set standard security headers: Content-Security-Policy (restrict sources), X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T16:35:59.320775688Z","updated":"2026-02-14T17:20:46.397582923Z"}
-{"id":"NK-8hu7z1","title":"scrape full text button","description":"add this feature back in to the v2 ui and verify it is still working (not sure if we have any tests)","type":"feature","status":"open","priority":1,"labels":null,"assignee":"","created":"2026-02-14T17:27:49.815938946Z","updated":"2026-02-14T17:27:49.815938946Z"}
+{"id":"NK-8hu7z1","title":"scrape full text button","description":"add this feature back in to the v2 ui and verify it is still working (not sure if we have any tests)","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T17:27:49.815938946Z","updated":"2026-02-14T17:58:19.083695149Z"}
{"id":"NK-8rhpp3","title":"v2 frontend: when selected, don't change style of feed items","description":"Just leave them the same when j/k \"selects\" an item. No blue side thing, no change in background, it's distracting. Just scroll it to the right place.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T00:39:50.01934312Z","updated":"2026-02-14T01:02:54.204739756Z"}
{"id":"NK-8s75ec","title":"page size and performance","description":"Do some analysis of page size (css/html/javascript) on the legacy version vs. new version and give me a report. We want it to be small and fast! If the new version is much worse file some tickets to investigate further.","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T20:16:13.898081788Z","updated":"2026-02-13T21:50:12.004391671Z"}
{"id":"NK-9hx0y7","title":"Implement Frontend Login","description":"Create login page and auth logic in the new React frontend. Port functionality from legacy login.html.","type":"","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T05:44:01.546395342Z","updated":"2026-02-13T05:50:33.877452063Z"}
@@ -88,6 +89,7 @@
{"id":"NK-zl922p","title":"slow scrolling in v2 ui compared to v1","description":"When using j/k to go to the next feed, they appeared instantly, now it feels like a slow scroll. Make it speedy again.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T03:41:02.267766275Z","updated":"2026-02-14T04:27:10.368160216Z"}
{"id":"NK-zs9we8","title":"UI Styling: Sidebar (Fixed, Gray Background)","description":"","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T18:05:16.188317572Z","updated":"2026-02-13T18:11:46.213993245Z"}
{"id":"NK-zt4e32","title":"Implement Frontend Feed List","description":"Create feed list view in new frontend. Fetch feeds from API.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T05:44:01.58866298Z","updated":"2026-02-13T05:59:46.132148641Z"}
+{"id":"NK-zvt8hi","title":"neko button always must be visible","description":"once you hide the sidebar with the nekoo button, there's no way to unhide it in the v2 ui after the recent changes","type":"bug","status":"open","priority":0,"labels":null,"assignee":"","created":"2026-02-14T17:58:18.468707709Z","updated":"2026-02-14T17:58:18.468707709Z"}
{"id":"NK-d0ghccy","from_ticket_id":"NK-ric1zs","to_ticket_id":"NK-1phdpf","type":"created_from","created":"2026-02-13T04:26:55.875394997Z"}
{"id":"NK-d0lgaab","from_ticket_id":"NK-sne5ox","to_ticket_id":"NK-0ppv3f","type":"created_from","created":"2026-02-13T15:05:23.289745853Z"}
{"id":"NK-d1q1e8a","from_ticket_id":"NK-wjnczv","to_ticket_id":"NK-chns2b","type":"created_from","created":"2026-02-14T05:13:23.323181359Z"}
diff --git a/frontend/src/App.css b/frontend/src/App.css
index 97b7d65..7478777 100644
--- a/frontend/src/App.css
+++ b/frontend/src/App.css
@@ -16,45 +16,7 @@ body {
/* Prevent body scroll */
}
-.dashboard-header {
- /* Legacy didn't really have a top header, but we need one for settings/logout.
- Keeping it minimal/flat or matching sidebar bg if we want to blend in.
- For now, let's make it dark gray to stand out less or match legacy dark mode if applicable.
- Actually, let's keep it distinct but apply the font styles. */
- background: #222;
- color: white;
- padding: 0.5rem 1rem;
- display: flex;
- justify-content: space-between;
- align-items: center;
- font-weight: bold;
-}
-
-.dashboard-header .logo {
- margin: 0;
- font-size: 2rem;
- cursor: pointer;
- line-height: 1;
-}
-
-.nav-link,
-.logout-btn {
- font-weight: bold;
- font-variant: small-caps;
- text-transform: lowercase;
- font-size: 1rem;
- background: transparent;
- border: none;
- color: #ccc;
- cursor: pointer;
- margin-left: 1rem;
-}
-
-.nav-link:hover,
-.logout-btn:hover {
- color: white;
- text-decoration: underline;
-}
+/* Header styles removed as we moved to sidebar navigation */
.dashboard-content {
display: flex;
@@ -70,8 +32,8 @@ body {
display: flex;
flex-direction: column;
overflow-y: auto;
- padding: 1rem;
transition: margin-left 0.4s ease;
+ /* No padding here, handled in FeedList */
}
.dashboard-sidebar.hidden {
@@ -91,18 +53,21 @@ body {
margin: 0 auto;
}
-.logout-btn {
+.fixed-toggle {
+ position: absolute;
+ top: 1rem;
+ left: 1rem;
+ z-index: 1000;
background: transparent;
- border: 1px solid rgba(255, 255, 255, 0.3);
- color: white;
- padding: 0.5rem 1rem;
- border-radius: 4px;
+ border: none;
+ font-size: 2rem;
+ line-height: 1;
cursor: pointer;
- transition: all 0.2s;
- font-size: 0.9rem;
+ padding: 0;
+ color: var(--text-color);
+ /* Inherit didn't work well if parent is transparent */
}
-.logout-btn:hover {
- background: rgba(255, 255, 255, 0.1);
- border-color: rgba(255, 255, 255, 0.5);
+.fixed-toggle:hover {
+ transform: scale(1.1);
} \ No newline at end of file
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 732d9ef..74ae89e 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -44,6 +44,15 @@ function Dashboard({ theme, setTheme }: { theme: string; setTheme: (t: string) =
className={`dashboard ${sidebarVisible ? 'sidebar-visible' : 'sidebar-hidden'} theme-${theme}`}
>
<div className="dashboard-content">
+ {!sidebarVisible && (
+ <button
+ className="sidebar-toggle fixed-toggle"
+ onClick={() => setSidebarVisible(true)}
+ title="Show Sidebar"
+ >
+ 🐱
+ </button>
+ )}
<aside className={`dashboard-sidebar ${sidebarVisible ? '' : 'hidden'}`}>
<FeedList theme={theme} setTheme={setTheme} setSidebarVisible={setSidebarVisible} />
</aside>
diff --git a/frontend/src/components/FeedList.css b/frontend/src/components/FeedList.css
index 1b83aed..41b8f73 100644
--- a/frontend/src/components/FeedList.css
+++ b/frontend/src/components/FeedList.css
@@ -9,6 +9,11 @@
margin: 0 0 1rem 0;
line-height: 1;
cursor: pointer;
+ position: sticky;
+ top: 0;
+ background: var(--sidebar-bg);
+ z-index: 10;
+ padding-bottom: 0.5rem;
}
.search-section {