aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/coverage/src/components/FeedList.tsx.html
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/coverage/src/components/FeedList.tsx.html')
-rw-r--r--frontend/coverage/src/components/FeedList.tsx.html215
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">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -263,62 +290,85 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
-<span class="cline-any cline-yes">13x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
+<span class="cline-any cline-yes">22x</span>
+<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">13x</span>
-<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">22x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">13x</span>
-<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">4x</span>
-<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">22x</span>
+<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
+<span class="cline-any cline-yes">7x</span>
+<span class="cline-any cline-yes">7x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">7x</span>
+<span class="cline-any cline-yes">7x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">22x</span>
+<span class="cline-any cline-yes">13x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">12x</span>
+<span class="cline-any cline-yes">2x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -330,7 +380,8 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
+<span class="cline-any cline-yes">1x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -384,6 +435,8 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -415,6 +468,7 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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';
&nbsp;
export default function FeedList({
theme,
setTheme,
setSidebarVisible,
+ isMobile,
}: {
theme: string;
setTheme: (t: string) =&gt; void;
setSidebarVisible: (visible: boolean) =&gt; void;
+ isMobile: boolean;
}) {
const [feeds, setFeeds] = useState&lt;Feed[]&gt;([]);
const [tags, setTags] = useState&lt;Category[]&gt;([]);
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();
&nbsp;
+ const sidebarVariant = searchParams.get('sidebar') || localStorage.getItem('neko-sidebar-variant') || 'glass';
+&nbsp;
+ useEffect(() =&gt; {
+ 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]);
+&nbsp;
const currentFilter =
searchParams.get('filter') ||
(location.pathname === '/' &amp;&amp; !feedId &amp;&amp; !tagName ? 'unread' : <span class="branch-1 cbranch-no" title="branch not covered" >'');</span>
&nbsp;
- const handleSearch = <span class="fstat-no" title="function not covered" >(e</span>: React.FormEvent) =&gt; {
-<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) =&gt; {
+ e.preventDefault();
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (searchQuery.trim()) {
+ navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`);
}
};
&nbsp;
@@ -474,15 +541,25 @@ export default function FeedList({
setFeedsExpanded(!feedsExpanded);
};
&nbsp;
+ const toggleTags = <span class="fstat-no" title="function not covered" >() =&gt; {</span>
+<span class="cstat-no" title="statement not covered" > setTagsExpanded(!tagsExpanded);</span>
+ };
+&nbsp;
+ const handleLinkClick = () =&gt; {
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (isMobile) {
+ setSidebarVisible(false);
+ }
+ };
+&nbsp;
useEffect(() =&gt; {
Promise.all([
apiFetch('/api/feed/').then((res) =&gt; {
<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&lt;Feed[]&gt;;
}),
apiFetch('/api/tag').then((res) =&gt; {
<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&lt;Category[]&gt;;
}),
])
.then(([feedsData, tagsData]) =&gt; {
@@ -504,7 +581,7 @@ export default function FeedList({
};
&nbsp;
return (
- &lt;div className="feed-list"&gt;
+ &lt;div className={`feed-list variant-${sidebarVariant}`}&gt;
&lt;h1 className="logo" onClick={<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(false)}&gt;</span>
🐱
&lt;/h1&gt;
@@ -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>) =&gt; <span class="cstat-no" title="statement not covered" >setSearchQuery(e.target.value)}</span>
+ onChange={(e) =&gt; setSearchQuery(e.target.value)}
className="search-input"
/&gt;
&lt;/form&gt;
@@ -524,17 +601,17 @@ export default function FeedList({
&lt;div className="filter-section"&gt;
&lt;ul className="filter-list"&gt;
&lt;li className="unread_filter"&gt;
- &lt;Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : <span class="branch-1 cbranch-no" title="branch not covered" >''}&gt;</span>
+ &lt;Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : <span class="branch-1 cbranch-no" title="branch not covered" >''} o</span>nClick={handleLinkClick}&gt;
unread
&lt;/Link&gt;
&lt;/li&gt;
&lt;li className="all_filter"&gt;
- &lt;Link to="/?filter=all" className={currentFilter === 'all' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}&gt;
+ &lt;Link to="/?filter=all" className={currentFilter === 'all' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'} onClick={handleLinkClick}&gt;
all
&lt;/Link&gt;
&lt;/li&gt;
&lt;li className="starred_filter"&gt;
- &lt;Link to="/?filter=starred" className={currentFilter === 'starred' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}&gt;
+ &lt;Link to="/?filter=starred" className={currentFilter === 'starred' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'} onClick={handleLinkClick}&gt;
starred
&lt;/Link&gt;
&lt;/li&gt;
@@ -542,26 +619,29 @@ export default function FeedList({
&lt;/div&gt;
&nbsp;
&lt;div className="tag-section"&gt;
- &lt;h4 onClick={<span class="fstat-no" title="function not covered" >() =&gt; {</span> }} className="section-header"&gt;
- Tags
+ &lt;h4 onClick={toggleTags} className="section-header"&gt;
+ &lt;span className={`caret ${tagsExpanded ? 'expanded' : <span class="branch-1 cbranch-no" title="branch not covered" >''}</span>`}&gt;▶&lt;/span&gt; Tags
&lt;/h4&gt;
- &lt;ul className="tag-list-items"&gt;
- {tags.map((tag) =&gt; (
- &lt;li key={tag.title} className="tag-item"&gt;
- &lt;Link
- to={`/tag/${encodeURIComponent(tag.title)}`}
- className={`tag-link ${tagName === tag.title ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`}
- &gt;
- {tag.title}
- &lt;/Link&gt;
- &lt;/li&gt;
- ))}
- &lt;/ul&gt;
+ {tagsExpanded &amp;&amp; (
+ &lt;ul className="tag-list-items"&gt;
+ {tags.map((tag) =&gt; (
+ &lt;li key={tag.title} className="tag-item"&gt;
+ &lt;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}
+ &gt;
+ {tag.title}
+ &lt;/Link&gt;
+ &lt;/li&gt;
+ ))}
+ &lt;/ul&gt;
+ )}
&lt;/div&gt;
&nbsp;
&lt;div className="feed-section"&gt;
&lt;h4 onClick={toggleFeeds} className="section-header"&gt;
- Feeds
+ &lt;span className={`caret ${feedsExpanded ? 'expanded' : ''}`}&gt;▶&lt;/span&gt; Feeds
&lt;/h4&gt;
{feedsExpanded &amp;&amp;
(feeds.length === 0 ? (
@@ -573,6 +653,7 @@ export default function FeedList({
&lt;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}
&gt;
{feed.title || <span class="branch-1 cbranch-no" title="branch not covered" >feed.url}</span>
&lt;/Link&gt;
@@ -585,7 +666,7 @@ export default function FeedList({
&lt;div className="nav-section"&gt;
&lt;ul className="nav-list"&gt;
&lt;li&gt;
- &lt;Link to="/settings" className="nav-link"&gt;
+ &lt;Link to="/settings" className="nav-link" onClick={handleLinkClick}&gt;
settings
&lt;/Link&gt;
&lt;/li&gt;
@@ -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>