diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-14 21:34:49 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-14 21:34:49 -0800 |
| commit | 6e28d1530aa08b878f5082bbcd85a95f84f830e8 (patch) | |
| tree | 7f6b1fb3a74166d97f2ba74f50d3cd787ec163dd /frontend/coverage/src/components/FeedList.tsx.html | |
| parent | 5e2b1b2de36fc63cfa677705388f5701c62ee138 (diff) | |
| download | neko-6e28d1530aa08b878f5082bbcd85a95f84f830e8.tar.gz neko-6e28d1530aa08b878f5082bbcd85a95f84f830e8.tar.bz2 neko-6e28d1530aa08b878f5082bbcd85a95f84f830e8.zip | |
chore: update build artifacts and finalize test improvements
Diffstat (limited to 'frontend/coverage/src/components/FeedList.tsx.html')
| -rw-r--r-- | frontend/coverage/src/components/FeedList.tsx.html | 215 |
1 files changed, 148 insertions, 67 deletions
diff --git a/frontend/coverage/src/components/FeedList.tsx.html b/frontend/coverage/src/components/FeedList.tsx.html index acb2ede..4061422 100644 --- a/frontend/coverage/src/components/FeedList.tsx.html +++ b/frontend/coverage/src/components/FeedList.tsx.html @@ -23,30 +23,30 @@ <div class='clearfix'> <div class='fl pad1y space-right2'> - <span class="strong">79.54% </span> + <span class="strong">87.27% </span> <span class="quiet">Statements</span> - <span class='fraction'>35/44</span> + <span class='fraction'>48/55</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">64.86% </span> + <span class="strong">70% </span> <span class="quiet">Branches</span> - <span class='fraction'>24/37</span> + <span class='fraction'>35/50</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">64.7% </span> + <span class="strong">78.94% </span> <span class="quiet">Functions</span> - <span class='fraction'>11/17</span> + <span class='fraction'>15/19</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">82.05% </span> + <span class="strong">90% </span> <span class="quiet">Lines</span> - <span class='fraction'>32/39</span> + <span class='fraction'>45/50</span> </div> @@ -61,7 +61,7 @@ </div> </template> </div> - <div class='status-line medium'></div> + <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> <a name='L2'></a><a href='#L2'>2</a> @@ -248,7 +248,34 @@ <a name='L183'></a><a href='#L183'>183</a> <a name='L184'></a><a href='#L184'>184</a> <a name='L185'></a><a href='#L185'>185</a> -<a name='L186'></a><a href='#L186'>186</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L186'></a><a href='#L186'>186</a> +<a name='L187'></a><a href='#L187'>187</a> +<a name='L188'></a><a href='#L188'>188</a> +<a name='L189'></a><a href='#L189'>189</a> +<a name='L190'></a><a href='#L190'>190</a> +<a name='L191'></a><a href='#L191'>191</a> +<a name='L192'></a><a href='#L192'>192</a> +<a name='L193'></a><a href='#L193'>193</a> +<a name='L194'></a><a href='#L194'>194</a> +<a name='L195'></a><a href='#L195'>195</a> +<a name='L196'></a><a href='#L196'>196</a> +<a name='L197'></a><a href='#L197'>197</a> +<a name='L198'></a><a href='#L198'>198</a> +<a name='L199'></a><a href='#L199'>199</a> +<a name='L200'></a><a href='#L200'>200</a> +<a name='L201'></a><a href='#L201'>201</a> +<a name='L202'></a><a href='#L202'>202</a> +<a name='L203'></a><a href='#L203'>203</a> +<a name='L204'></a><a href='#L204'>204</a> +<a name='L205'></a><a href='#L205'>205</a> +<a name='L206'></a><a href='#L206'>206</a> +<a name='L207'></a><a href='#L207'>207</a> +<a name='L208'></a><a href='#L208'>208</a> +<a name='L209'></a><a href='#L209'>209</a> +<a name='L210'></a><a href='#L210'>210</a> +<a name='L211'></a><a href='#L211'>211</a> +<a name='L212'></a><a href='#L212'>212</a> +<a name='L213'></a><a href='#L213'>213</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -263,62 +290,85 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">11x</span> +<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">6x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">6x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">13x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">12x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">12x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> @@ -330,7 +380,8 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -384,6 +435,8 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -415,6 +468,7 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -437,36 +491,49 @@ import { Link, useNavigate, useSearchParams, useLocation, useParams } from 'react-router-dom'; import type { Feed, Category } from '../types'; import './FeedList.css'; +import './FeedListVariants.css'; import { apiFetch } from '../utils'; export default function FeedList({ theme, setTheme, setSidebarVisible, + isMobile, }: { theme: string; setTheme: (t: string) => void; setSidebarVisible: (visible: boolean) => void; + isMobile: boolean; }) { const [feeds, setFeeds] = useState<Feed[]>([]); const [tags, setTags] = useState<Category[]>([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [feedsExpanded, setFeedsExpanded] = useState(false); + const [tagsExpanded, setTagsExpanded] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const location = useLocation(); const { feedId, tagName } = useParams(); + const sidebarVariant = searchParams.get('sidebar') || localStorage.getItem('neko-sidebar-variant') || 'glass'; + + useEffect(() => { + const variant = searchParams.get('sidebar'); + <span class="missing-if-branch" title="if path not taken" >I</span>if (variant) { +<span class="cstat-no" title="statement not covered" > localStorage.setItem('neko-sidebar-variant', variant);</span> + } + }, [searchParams]); + const currentFilter = searchParams.get('filter') || (location.pathname === '/' && !feedId && !tagName ? 'unread' : <span class="branch-1 cbranch-no" title="branch not covered" >'');</span> - const handleSearch = <span class="fstat-no" title="function not covered" >(e</span>: React.FormEvent) => { -<span class="cstat-no" title="statement not covered" > e.preventDefault();</span> -<span class="cstat-no" title="statement not covered" > if (searchQuery.trim()) {</span> -<span class="cstat-no" title="statement not covered" > navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`);</span> + const handleSearch = (e: React.FormEvent) => { + e.preventDefault(); + <span class="missing-if-branch" title="else path not taken" >E</span>if (searchQuery.trim()) { + navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`); } }; @@ -474,15 +541,25 @@ export default function FeedList({ setFeedsExpanded(!feedsExpanded); }; + const toggleTags = <span class="fstat-no" title="function not covered" >() => {</span> +<span class="cstat-no" title="statement not covered" > setTagsExpanded(!tagsExpanded);</span> + }; + + const handleLinkClick = () => { + <span class="missing-if-branch" title="else path not taken" >E</span>if (isMobile) { + setSidebarVisible(false); + } + }; + useEffect(() => { Promise.all([ apiFetch('/api/feed/').then((res) => { <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to fetch feeds');</span> - return res.json(); + return res.json() as Promise<Feed[]>; }), apiFetch('/api/tag').then((res) => { <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to fetch tags');</span> - return res.json(); + return res.json() as Promise<Category[]>; }), ]) .then(([feedsData, tagsData]) => { @@ -504,7 +581,7 @@ export default function FeedList({ }; return ( - <div className="feed-list"> + <div className={`feed-list variant-${sidebarVariant}`}> <h1 className="logo" onClick={<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(false)}></span> 🐱 </h1> @@ -515,7 +592,7 @@ export default function FeedList({ type="search" placeholder="search..." value={searchQuery} - onChange={<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >setSearchQuery(e.target.value)}</span> + onChange={(e) => setSearchQuery(e.target.value)} className="search-input" /> </form> @@ -524,17 +601,17 @@ export default function FeedList({ <div className="filter-section"> <ul className="filter-list"> <li className="unread_filter"> - <Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : <span class="branch-1 cbranch-no" title="branch not covered" >''}></span> + <Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : <span class="branch-1 cbranch-no" title="branch not covered" >''} o</span>nClick={handleLinkClick}> unread </Link> </li> <li className="all_filter"> - <Link to="/?filter=all" className={currentFilter === 'all' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}> + <Link to="/?filter=all" className={currentFilter === 'all' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'} onClick={handleLinkClick}> all </Link> </li> <li className="starred_filter"> - <Link to="/?filter=starred" className={currentFilter === 'starred' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}> + <Link to="/?filter=starred" className={currentFilter === 'starred' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'} onClick={handleLinkClick}> starred </Link> </li> @@ -542,26 +619,29 @@ export default function FeedList({ </div> <div className="tag-section"> - <h4 onClick={<span class="fstat-no" title="function not covered" >() => {</span> }} className="section-header"> - Tags + <h4 onClick={toggleTags} className="section-header"> + <span className={`caret ${tagsExpanded ? 'expanded' : <span class="branch-1 cbranch-no" title="branch not covered" >''}</span>`}>▶</span> Tags </h4> - <ul className="tag-list-items"> - {tags.map((tag) => ( - <li key={tag.title} className="tag-item"> - <Link - to={`/tag/${encodeURIComponent(tag.title)}`} - className={`tag-link ${tagName === tag.title ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`} - > - {tag.title} - </Link> - </li> - ))} - </ul> + {tagsExpanded && ( + <ul className="tag-list-items"> + {tags.map((tag) => ( + <li key={tag.title} className="tag-item"> + <Link + to={`/tag/${encodeURIComponent(tag.title)}`} + className={`tag-link ${tagName === tag.title ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`} + onClick={handleLinkClick} + > + {tag.title} + </Link> + </li> + ))} + </ul> + )} </div> <div className="feed-section"> <h4 onClick={toggleFeeds} className="section-header"> - Feeds + <span className={`caret ${feedsExpanded ? 'expanded' : ''}`}>▶</span> Feeds </h4> {feedsExpanded && (feeds.length === 0 ? ( @@ -573,6 +653,7 @@ export default function FeedList({ <Link to={`/feed/${feed._id}`} className={`feed-title ${feedId === String(feed._id) ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`} + onClick={handleLinkClick} > {feed.title || <span class="branch-1 cbranch-no" title="branch not covered" >feed.url}</span> </Link> @@ -585,7 +666,7 @@ export default function FeedList({ <div className="nav-section"> <ul className="nav-list"> <li> - <Link to="/settings" className="nav-link"> + <Link to="/settings" className="nav-link" onClick={handleLinkClick}> settings </Link> </li> @@ -625,7 +706,7 @@ export default function FeedList({ <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> - at 2026-02-14T18:02:09.004Z + at 2026-02-15T05:30:50.842Z </div> <script src="../../prettify.js"></script> <script> |
