aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/coverage')
-rw-r--r--frontend/coverage/clover.xml529
-rw-r--r--frontend/coverage/coverage-final.json15
-rw-r--r--frontend/coverage/index.html62
-rw-r--r--frontend/coverage/src/App.css.html189
-rw-r--r--frontend/coverage/src/App.tsx.html163
-rw-r--r--frontend/coverage/src/components/FeedItem.css.html74
-rw-r--r--frontend/coverage/src/components/FeedItem.tsx.html18
-rw-r--r--frontend/coverage/src/components/FeedItems.css.html2
-rw-r--r--frontend/coverage/src/components/FeedItems.tsx.html254
-rw-r--r--frontend/coverage/src/components/FeedList.css.html150
-rw-r--r--frontend/coverage/src/components/FeedList.tsx.html215
-rw-r--r--frontend/coverage/src/components/Login.css.html2
-rw-r--r--frontend/coverage/src/components/Login.tsx.html55
-rw-r--r--frontend/coverage/src/components/Settings.css.html361
-rw-r--r--frontend/coverage/src/components/Settings.tsx.html316
-rw-r--r--frontend/coverage/src/components/index.html105
-rw-r--r--frontend/coverage/src/index.html38
17 files changed, 1833 insertions, 715 deletions
diff --git a/frontend/coverage/clover.xml b/frontend/coverage/clover.xml
index 4679d59..8eba461 100644
--- a/frontend/coverage/clover.xml
+++ b/frontend/coverage/clover.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
-<coverage generated="1771092129074" clover="3.2.0">
- <project timestamp="1771092129074" name="All files">
- <metrics statements="291" coveredstatements="237" conditionals="197" coveredconditionals="138" methods="93" coveredmethods="70" elements="581" coveredelements="445" complexity="0" loc="291" ncloc="291" packages="2" files="13" classes="13"/>
+<coverage generated="1771133450877" clover="3.2.0">
+ <project timestamp="1771133450877" name="All files">
+ <metrics statements="331" coveredstatements="286" conditionals="228" coveredconditionals="167" methods="108" coveredmethods="88" elements="667" coveredelements="541" complexity="0" loc="331" ncloc="331" packages="2" files="14" classes="14"/>
<package name="src">
- <metrics statements="33" coveredstatements="26" conditionals="26" coveredconditionals="18" methods="10" coveredmethods="7"/>
+ <metrics statements="45" coveredstatements="32" conditionals="35" coveredconditionals="23" methods="15" coveredmethods="9"/>
<file name="App.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/App.css">
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="App.tsx" path="/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx">
- <metrics statements="22" coveredstatements="16" conditionals="16" coveredconditionals="10" methods="8" coveredmethods="5"/>
+ <metrics statements="34" coveredstatements="22" conditionals="25" coveredconditionals="15" methods="13" coveredmethods="7"/>
<line num="9" count="2" type="stmt"/>
<line num="10" count="2" type="stmt"/>
<line num="12" count="2" type="stmt"/>
@@ -22,45 +22,57 @@
<line num="28" count="1" type="cond" truecount="1" falsecount="1"/>
<line num="29" count="0" type="stmt"/>
<line num="32" count="1" type="stmt"/>
- <line num="40" count="1" type="stmt"/>
- <line num="42" count="1" type="stmt"/>
- <line num="50" count="0" type="stmt"/>
- <line num="73" count="2" type="cond" truecount="2" falsecount="0"/>
- <line num="75" count="2" type="stmt"/>
- <line num="76" count="0" type="stmt"/>
- <line num="77" count="0" type="stmt"/>
- <line num="80" count="2" type="cond" truecount="1" falsecount="1"/>
- <line num="82" count="2" type="stmt"/>
+ <line num="47" count="1" type="stmt"/>
+ <line num="49" count="1" type="stmt"/>
+ <line num="50" count="1" type="stmt"/>
+ <line num="51" count="0" type="cond" truecount="0" falsecount="2"/>
+ <line num="52" count="0" type="stmt"/>
+ <line num="54" count="0" type="stmt"/>
+ <line num="57" count="1" type="stmt"/>
+ <line num="58" count="1" type="stmt"/>
+ <line num="61" count="1" type="stmt"/>
+ <line num="69" count="0" type="stmt"/>
+ <line num="78" count="0" type="stmt"/>
+ <line num="103" count="2" type="cond" truecount="2" falsecount="0"/>
+ <line num="104" count="2" type="cond" truecount="2" falsecount="0"/>
+ <line num="106" count="2" type="stmt"/>
+ <line num="107" count="0" type="stmt"/>
+ <line num="108" count="0" type="stmt"/>
+ <line num="111" count="2" type="stmt"/>
+ <line num="112" count="0" type="stmt"/>
+ <line num="113" count="0" type="stmt"/>
+ <line num="116" count="2" type="cond" truecount="1" falsecount="1"/>
+ <line num="118" count="2" type="stmt"/>
</file>
<file name="utils.ts" path="/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts">
<metrics statements="11" coveredstatements="10" conditionals="10" coveredconditionals="8" methods="2" coveredmethods="2"/>
- <line num="2" count="10" type="stmt"/>
- <line num="3" count="10" type="stmt"/>
- <line num="4" count="10" type="cond" truecount="1" falsecount="1"/>
- <line num="12" count="36" type="cond" truecount="2" falsecount="0"/>
- <line num="13" count="36" type="stmt"/>
- <line num="15" count="36" type="cond" truecount="2" falsecount="0"/>
- <line num="17" count="36" type="cond" truecount="2" falsecount="0"/>
- <line num="18" count="10" type="stmt"/>
- <line num="19" count="10" type="cond" truecount="1" falsecount="1"/>
+ <line num="2" count="14" type="stmt"/>
+ <line num="3" count="14" type="stmt"/>
+ <line num="4" count="14" type="cond" truecount="1" falsecount="1"/>
+ <line num="12" count="54" type="cond" truecount="2" falsecount="0"/>
+ <line num="13" count="54" type="stmt"/>
+ <line num="15" count="54" type="cond" truecount="2" falsecount="0"/>
+ <line num="17" count="54" type="cond" truecount="2" falsecount="0"/>
+ <line num="18" count="14" type="stmt"/>
+ <line num="19" count="14" type="cond" truecount="1" falsecount="1"/>
<line num="20" count="0" type="stmt"/>
- <line num="27" count="36" type="stmt"/>
+ <line num="27" count="54" type="stmt"/>
</file>
</package>
<package name="src.components">
- <metrics statements="258" coveredstatements="211" conditionals="171" coveredconditionals="120" methods="83" coveredmethods="63"/>
+ <metrics statements="286" coveredstatements="254" conditionals="193" coveredconditionals="144" methods="93" coveredmethods="79"/>
<file name="FeedItem.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.css">
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="FeedItem.tsx" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx">
<metrics statements="31" coveredstatements="25" conditionals="23" coveredconditionals="20" methods="12" coveredmethods="10"/>
- <line num="12" count="33" type="stmt"/>
- <line num="13" count="33" type="stmt"/>
- <line num="15" count="33" type="stmt"/>
- <line num="16" count="16" type="stmt"/>
- <line num="19" count="33" type="stmt"/>
+ <line num="12" count="56" type="stmt"/>
+ <line num="13" count="56" type="stmt"/>
+ <line num="15" count="56" type="stmt"/>
+ <line num="16" count="22" type="stmt"/>
+ <line num="19" count="56" type="stmt"/>
<line num="20" count="1" type="stmt"/>
- <line num="23" count="33" type="stmt"/>
+ <line num="23" count="56" type="stmt"/>
<line num="24" count="1" type="stmt"/>
<line num="26" count="1" type="stmt"/>
<line num="27" count="1" type="stmt"/>
@@ -72,7 +84,7 @@
<line num="52" count="0" type="stmt"/>
<line num="54" count="0" type="stmt"/>
<line num="55" count="0" type="stmt"/>
- <line num="59" count="33" type="stmt"/>
+ <line num="59" count="56" type="stmt"/>
<line num="60" count="1" type="stmt"/>
<line num="61" count="1" type="stmt"/>
<line num="62" count="1" type="stmt"/>
@@ -82,7 +94,7 @@
<line num="69" count="1" type="stmt"/>
<line num="72" count="0" type="stmt"/>
<line num="73" count="0" type="stmt"/>
- <line num="77" count="33" type="stmt"/>
+ <line num="77" count="56" type="stmt"/>
<line num="85" count="1" type="stmt"/>
<line num="86" count="1" type="stmt"/>
</file>
@@ -90,252 +102,283 @@
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="FeedItems.tsx" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx">
- <metrics statements="115" coveredstatements="102" conditionals="81" coveredconditionals="61" methods="29" coveredmethods="25"/>
- <line num="9" count="27" type="stmt"/>
- <line num="10" count="27" type="stmt"/>
- <line num="11" count="27" type="cond" truecount="2" falsecount="0"/>
- <line num="13" count="27" type="stmt"/>
- <line num="14" count="27" type="stmt"/>
- <line num="15" count="27" type="stmt"/>
- <line num="16" count="27" type="stmt"/>
- <line num="17" count="27" type="stmt"/>
- <line num="18" count="27" type="stmt"/>
- <line num="20" count="27" type="stmt"/>
- <line num="21" count="8" type="cond" truecount="2" falsecount="0"/>
- <line num="22" count="1" type="stmt"/>
- <line num="24" count="7" type="stmt"/>
- <line num="25" count="7" type="stmt"/>
- <line num="27" count="8" type="stmt"/>
- <line num="29" count="8" type="stmt"/>
- <line num="30" count="8" type="stmt"/>
- <line num="32" count="8" type="cond" truecount="2" falsecount="0"/>
+ <metrics statements="119" coveredstatements="106" conditionals="84" coveredconditionals="64" methods="31" coveredmethods="27"/>
+ <line num="9" count="36" type="stmt"/>
+ <line num="10" count="36" type="stmt"/>
+ <line num="11" count="36" type="cond" truecount="2" falsecount="0"/>
+ <line num="13" count="36" type="stmt"/>
+ <line num="14" count="36" type="stmt"/>
+ <line num="15" count="36" type="stmt"/>
+ <line num="16" count="36" type="stmt"/>
+ <line num="17" count="36" type="stmt"/>
+ <line num="18" count="36" type="stmt"/>
+ <line num="20" count="36" type="stmt"/>
+ <line num="21" count="11" type="cond" truecount="2" falsecount="0"/>
+ <line num="22" count="3" type="stmt"/>
+ <line num="24" count="8" type="stmt"/>
+ <line num="25" count="8" type="stmt"/>
+ <line num="27" count="11" type="stmt"/>
+ <line num="29" count="11" type="stmt"/>
+ <line num="30" count="11" type="stmt"/>
+ <line num="32" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="33" count="2" type="stmt"/>
- <line num="34" count="6" type="cond" truecount="2" falsecount="0"/>
+ <line num="34" count="9" type="cond" truecount="2" falsecount="0"/>
<line num="35" count="1" type="stmt"/>
- <line num="38" count="8" type="cond" truecount="2" falsecount="0"/>
- <line num="39" count="1" type="stmt"/>
- <line num="43" count="8" type="stmt"/>
- <line num="44" count="8" type="cond" truecount="1" falsecount="1"/>
+ <line num="38" count="11" type="cond" truecount="2" falsecount="0"/>
+ <line num="39" count="3" type="stmt"/>
+ <line num="43" count="11" type="stmt"/>
+ <line num="44" count="11" type="cond" truecount="1" falsecount="1"/>
<line num="45" count="0" type="stmt"/>
- <line num="48" count="8" type="cond" truecount="1" falsecount="1"/>
+ <line num="48" count="11" type="cond" truecount="1" falsecount="1"/>
<line num="49" count="0" type="stmt"/>
- <line num="50" count="8" type="cond" truecount="1" falsecount="1"/>
+ <line num="50" count="11" type="cond" truecount="1" falsecount="1"/>
<line num="51" count="0" type="stmt"/>
<line num="52" count="0" type="stmt"/>
- <line num="55" count="8" type="cond" truecount="1" falsecount="1"/>
- <line num="56" count="8" type="stmt"/>
- <line num="60" count="8" type="stmt"/>
- <line num="61" count="8" type="cond" truecount="1" falsecount="1"/>
- <line num="62" count="8" type="stmt"/>
- <line num="65" count="8" type="stmt"/>
- <line num="67" count="7" type="cond" truecount="1" falsecount="1"/>
+ <line num="55" count="11" type="cond" truecount="1" falsecount="1"/>
+ <line num="56" count="11" type="stmt"/>
+ <line num="60" count="11" type="stmt"/>
+ <line num="61" count="11" type="cond" truecount="1" falsecount="1"/>
+ <line num="62" count="11" type="stmt"/>
+ <line num="65" count="11" type="stmt"/>
+ <line num="67" count="10" type="cond" truecount="1" falsecount="1"/>
<line num="68" count="0" type="stmt"/>
- <line num="70" count="7" type="stmt"/>
- <line num="73" count="6" type="cond" truecount="2" falsecount="0"/>
- <line num="74" count="1" type="stmt"/>
- <line num="76" count="5" type="stmt"/>
- <line num="78" count="6" type="stmt"/>
- <line num="79" count="6" type="stmt"/>
- <line num="80" count="6" type="stmt"/>
+ <line num="70" count="10" type="stmt"/>
+ <line num="73" count="9" type="cond" truecount="2" falsecount="0"/>
+ <line num="74" count="3" type="stmt"/>
+ <line num="76" count="6" type="stmt"/>
+ <line num="78" count="9" type="stmt"/>
+ <line num="79" count="9" type="stmt"/>
+ <line num="80" count="9" type="stmt"/>
<line num="83" count="1" type="stmt"/>
<line num="84" count="1" type="stmt"/>
<line num="85" count="1" type="stmt"/>
- <line num="89" count="27" type="stmt"/>
- <line num="90" count="7" type="stmt"/>
- <line num="91" count="7" type="stmt"/>
- <line num="95" count="27" type="stmt"/>
- <line num="96" count="2" type="stmt"/>
- <line num="97" count="2" type="cond" truecount="1" falsecount="1"/>
- <line num="98" count="2" type="stmt"/>
- <line num="102" count="27" type="stmt"/>
- <line num="103" count="2" type="stmt"/>
- <line num="105" count="3" type="cond" truecount="2" falsecount="0"/>
- <line num="107" count="2" type="stmt"/>
- <line num="111" count="0" type="stmt"/>
- <line num="114" count="27" type="stmt"/>
- <line num="115" count="1" type="stmt"/>
- <line num="117" count="2" type="cond" truecount="2" falsecount="0"/>
- <line num="119" count="1" type="stmt"/>
- <line num="123" count="0" type="stmt"/>
- <line num="126" count="27" type="stmt"/>
- <line num="127" count="23" type="stmt"/>
- <line num="128" count="3" type="cond" truecount="1" falsecount="1"/>
- <line num="130" count="3" type="cond" truecount="2" falsecount="0"/>
- <line num="131" count="2" type="stmt"/>
- <line num="132" count="2" type="stmt"/>
- <line num="133" count="2" type="cond" truecount="1" falsecount="1"/>
- <line num="134" count="2" type="stmt"/>
- <line num="135" count="2" type="cond" truecount="2" falsecount="0"/>
- <line num="136" count="1" type="stmt"/>
- <line num="138" count="2" type="stmt"/>
- <line num="140" count="2" type="stmt"/>
- <line num="142" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="143" count="0" type="stmt"/>
- <line num="144" count="0" type="stmt"/>
- <line num="145" count="0" type="cond" truecount="0" falsecount="2"/>
- <line num="146" count="0" type="stmt"/>
- <line num="148" count="0" type="stmt"/>
+ <line num="89" count="36" type="stmt"/>
+ <line num="90" count="8" type="stmt"/>
+ <line num="91" count="8" type="stmt"/>
+ <line num="96" count="36" type="stmt"/>
+ <line num="97" count="5" type="stmt"/>
+ <line num="98" count="5" type="cond" truecount="1" falsecount="1"/>
+ <line num="99" count="5" type="stmt"/>
+ <line num="103" count="36" type="stmt"/>
+ <line num="104" count="2" type="stmt"/>
+ <line num="106" count="3" type="cond" truecount="2" falsecount="0"/>
+ <line num="108" count="2" type="stmt"/>
+ <line num="112" count="0" type="stmt"/>
+ <line num="115" count="36" type="stmt"/>
+ <line num="116" count="1" type="stmt"/>
+ <line num="118" count="2" type="cond" truecount="2" falsecount="0"/>
+ <line num="120" count="1" type="stmt"/>
+ <line num="124" count="0" type="stmt"/>
+ <line num="127" count="36" type="stmt"/>
+ <line num="128" count="31" type="stmt"/>
+ <line num="129" count="6" type="cond" truecount="1" falsecount="1"/>
+ <line num="131" count="6" type="cond" truecount="2" falsecount="0"/>
+ <line num="132" count="5" type="stmt"/>
+ <line num="133" count="5" type="stmt"/>
+ <line num="134" count="5" type="cond" truecount="1" falsecount="1"/>
+ <line num="135" count="5" type="stmt"/>
+ <line num="136" count="5" type="cond" truecount="2" falsecount="0"/>
+ <line num="137" count="1" type="stmt"/>
+ <line num="139" count="5" type="stmt"/>
+ <line num="144" count="5" type="cond" truecount="5" falsecount="0"/>
+ <line num="145" count="2" type="stmt"/>
+ <line num="148" count="5" type="stmt"/>
<line num="150" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="151" count="1" type="stmt"/>
- <line num="152" count="1" type="cond" truecount="3" falsecount="1"/>
- <line num="153" count="1" type="stmt"/>
- <line num="155" count="1" type="stmt"/>
- <line num="160" count="23" type="stmt"/>
- <line num="161" count="23" type="stmt"/>
- <line num="166" count="27" type="stmt"/>
- <line num="167" count="24" type="stmt"/>
- <line num="169" count="2" type="stmt"/>
- <line num="171" count="2" type="cond" truecount="2" falsecount="0"/>
- <line num="172" count="1" type="cond" truecount="5" falsecount="1"/>
- <line num="173" count="1" type="stmt"/>
- <line num="175" count="1" type="stmt"/>
- <line num="179" count="1" type="cond" truecount="3" falsecount="1"/>
- <line num="180" count="1" type="stmt"/>
- <line num="181" count="1" type="cond" truecount="4" falsecount="1"/>
+ <line num="151" count="0" type="stmt"/>
+ <line num="152" count="0" type="stmt"/>
+ <line num="153" count="0" type="cond" truecount="0" falsecount="2"/>
+ <line num="154" count="0" type="stmt"/>
+ <line num="156" count="0" type="stmt"/>
+ <line num="158" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="159" count="1" type="stmt"/>
+ <line num="160" count="1" type="cond" truecount="3" falsecount="1"/>
+ <line num="161" count="1" type="stmt"/>
+ <line num="163" count="1" type="stmt"/>
+ <line num="168" count="31" type="stmt"/>
+ <line num="169" count="31" type="stmt"/>
+ <line num="175" count="36" type="stmt"/>
+ <line num="177" count="31" type="stmt"/>
+ <line num="179" count="1" type="stmt"/>
+ <line num="181" count="1" type="cond" truecount="3" falsecount="1"/>
<line num="182" count="1" type="stmt"/>
- <line num="183" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="183" count="1" type="cond" truecount="4" falsecount="1"/>
<line num="184" count="1" type="stmt"/>
- <line num="193" count="24" type="stmt"/>
- <line num="194" count="15" type="stmt"/>
- <line num="195" count="15" type="cond" truecount="1" falsecount="1"/>
- <line num="198" count="24" type="stmt"/>
- <line num="199" count="24" type="cond" truecount="2" falsecount="0"/>
- <line num="201" count="24" type="stmt"/>
- <line num="204" count="27" type="cond" truecount="2" falsecount="0"/>
- <line num="205" count="14" type="cond" truecount="2" falsecount="0"/>
- <line num="207" count="13" type="stmt"/>
- <line num="214" count="21" type="stmt"/>
- <line num="219" count="0" type="stmt"/>
+ <line num="185" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="186" count="1" type="stmt"/>
+ <line num="196" count="31" type="stmt"/>
+ <line num="198" count="1" type="stmt"/>
+ <line num="199" count="1" type="cond" truecount="5" falsecount="1"/>
+ <line num="200" count="1" type="stmt"/>
+ <line num="207" count="31" type="stmt"/>
+ <line num="208" count="31" type="stmt"/>
+ <line num="209" count="31" type="cond" truecount="1" falsecount="1"/>
+ <line num="212" count="31" type="stmt"/>
+ <line num="213" count="31" type="cond" truecount="2" falsecount="0"/>
+ <line num="215" count="31" type="stmt"/>
+ <line num="216" count="31" type="stmt"/>
+ <line num="217" count="31" type="stmt"/>
+ <line num="222" count="36" type="cond" truecount="2" falsecount="0"/>
+ <line num="223" count="21" type="cond" truecount="2" falsecount="0"/>
+ <line num="225" count="20" type="stmt"/>
+ <line num="232" count="44" type="stmt"/>
+ <line num="237" count="0" type="stmt"/>
</file>
<file name="FeedList.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.css">
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="FeedList.tsx" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx">
- <metrics statements="39" coveredstatements="32" conditionals="37" coveredconditionals="24" methods="17" coveredmethods="11"/>
- <line num="16" count="13" type="stmt"/>
- <line num="17" count="13" type="stmt"/>
- <line num="18" count="13" type="stmt"/>
- <line num="19" count="13" type="stmt"/>
- <line num="20" count="13" type="stmt"/>
- <line num="21" count="13" type="stmt"/>
- <line num="22" count="13" type="stmt"/>
- <line num="23" count="13" type="stmt"/>
- <line num="24" count="13" type="stmt"/>
- <line num="25" count="13" type="stmt"/>
- <line num="28" count="13" type="cond" truecount="2" falsecount="0"/>
- <line num="31" count="13" type="stmt"/>
- <line num="32" count="0" type="stmt"/>
- <line num="33" count="0" type="cond" truecount="0" falsecount="2"/>
- <line num="34" count="0" type="stmt"/>
- <line num="38" count="13" type="stmt"/>
- <line num="39" count="2" type="stmt"/>
- <line num="42" count="13" type="stmt"/>
- <line num="43" count="6" type="stmt"/>
- <line num="45" count="4" type="cond" truecount="1" falsecount="1"/>
- <line num="46" count="4" type="stmt"/>
- <line num="49" count="4" type="cond" truecount="1" falsecount="1"/>
- <line num="50" count="4" type="stmt"/>
- <line num="54" count="4" type="stmt"/>
- <line num="55" count="4" type="stmt"/>
- <line num="56" count="4" type="stmt"/>
- <line num="59" count="1" type="stmt"/>
- <line num="60" count="1" type="stmt"/>
- <line num="64" count="13" type="cond" truecount="2" falsecount="0"/>
- <line num="65" count="7" type="cond" truecount="2" falsecount="0"/>
- <line num="67" count="6" type="stmt"/>
- <line num="68" count="1" type="stmt"/>
- <line num="71" count="6" type="stmt"/>
- <line num="73" count="0" type="stmt"/>
- <line num="83" count="0" type="stmt"/>
- <line num="115" count="4" type="stmt"/>
- <line num="137" count="2" type="stmt"/>
- <line num="168" count="0" type="stmt"/>
- <line num="175" count="0" type="stmt"/>
+ <metrics statements="50" coveredstatements="45" conditionals="50" coveredconditionals="35" methods="19" coveredmethods="15"/>
+ <line num="19" count="22" type="stmt"/>
+ <line num="20" count="22" type="stmt"/>
+ <line num="21" count="22" type="stmt"/>
+ <line num="22" count="22" type="stmt"/>
+ <line num="23" count="22" type="stmt"/>
+ <line num="24" count="22" type="stmt"/>
+ <line num="25" count="22" type="stmt"/>
+ <line num="26" count="22" type="stmt"/>
+ <line num="27" count="22" type="stmt"/>
+ <line num="28" count="22" type="stmt"/>
+ <line num="29" count="22" type="stmt"/>
+ <line num="31" count="22" type="cond" truecount="3" falsecount="0"/>
+ <line num="33" count="22" type="stmt"/>
+ <line num="34" count="11" type="stmt"/>
+ <line num="35" count="11" type="cond" truecount="1" falsecount="1"/>
+ <line num="36" count="0" type="stmt"/>
+ <line num="41" count="22" type="cond" truecount="2" falsecount="0"/>
+ <line num="44" count="22" type="stmt"/>
+ <line num="45" count="1" type="stmt"/>
+ <line num="46" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="47" count="1" type="stmt"/>
+ <line num="51" count="22" type="stmt"/>
+ <line num="52" count="2" type="stmt"/>
+ <line num="55" count="22" type="stmt"/>
+ <line num="56" count="0" type="stmt"/>
+ <line num="59" count="22" type="stmt"/>
+ <line num="60" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="61" count="1" type="stmt"/>
+ <line num="65" count="22" type="stmt"/>
+ <line num="66" count="9" type="stmt"/>
+ <line num="68" count="7" type="cond" truecount="1" falsecount="1"/>
+ <line num="69" count="7" type="stmt"/>
+ <line num="72" count="7" type="cond" truecount="1" falsecount="1"/>
+ <line num="73" count="7" type="stmt"/>
+ <line num="77" count="7" type="stmt"/>
+ <line num="78" count="7" type="stmt"/>
+ <line num="79" count="7" type="stmt"/>
+ <line num="82" count="1" type="stmt"/>
+ <line num="83" count="1" type="stmt"/>
+ <line num="87" count="22" type="cond" truecount="2" falsecount="0"/>
+ <line num="88" count="13" type="cond" truecount="2" falsecount="0"/>
+ <line num="90" count="12" type="stmt"/>
+ <line num="91" count="2" type="stmt"/>
+ <line num="94" count="12" type="stmt"/>
+ <line num="96" count="0" type="stmt"/>
+ <line num="106" count="1" type="stmt"/>
+ <line num="139" count="4" type="stmt"/>
+ <line num="163" count="2" type="stmt"/>
+ <line num="195" count="0" type="stmt"/>
+ <line num="202" count="0" type="stmt"/>
+ </file>
+ <file name="FeedListVariants.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedListVariants.css">
+ <metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="Login.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.css">
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="Login.tsx" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx">
- <metrics statements="17" coveredstatements="17" conditionals="6" coveredconditionals="5" methods="3" coveredmethods="3"/>
- <line num="8" count="14" type="stmt"/>
- <line num="9" count="14" type="stmt"/>
- <line num="10" count="14" type="stmt"/>
- <line num="12" count="14" type="stmt"/>
- <line num="13" count="3" type="stmt"/>
+ <metrics statements="20" coveredstatements="20" conditionals="6" coveredconditionals="5" methods="4" coveredmethods="4"/>
+ <line num="8" count="17" type="stmt"/>
+ <line num="9" count="17" type="stmt"/>
+ <line num="10" count="17" type="stmt"/>
+ <line num="11" count="17" type="stmt"/>
+ <line num="13" count="17" type="stmt"/>
<line num="14" count="3" type="stmt"/>
- <line num="16" count="3" type="stmt"/>
- <line num="18" count="3" type="stmt"/>
+ <line num="15" count="3" type="stmt"/>
+ <line num="17" count="3" type="stmt"/>
<line num="19" count="3" type="stmt"/>
+ <line num="20" count="3" type="stmt"/>
<line num="21" count="3" type="stmt"/>
- <line num="26" count="2" type="cond" truecount="2" falsecount="0"/>
- <line num="27" count="1" type="stmt"/>
+ <line num="23" count="3" type="stmt"/>
+ <line num="28" count="2" type="cond" truecount="2" falsecount="0"/>
<line num="29" count="1" type="stmt"/>
- <line num="30" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="33" count="1" type="stmt"/>
- <line num="37" count="14" type="stmt"/>
- <line num="47" count="3" type="stmt"/>
+ <line num="31" count="1" type="stmt"/>
+ <line num="32" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="35" count="1" type="stmt"/>
+ <line num="39" count="17" type="stmt"/>
+ <line num="49" count="3" type="stmt"/>
+ <line num="58" count="3" type="stmt"/>
</file>
<file name="Settings.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.css">
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>
</file>
<file name="Settings.tsx" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx">
- <metrics statements="56" coveredstatements="35" conditionals="24" coveredconditionals="10" methods="22" coveredmethods="14"/>
- <line num="7" count="14" type="stmt"/>
- <line num="8" count="14" type="stmt"/>
- <line num="9" count="14" type="stmt"/>
- <line num="10" count="14" type="stmt"/>
- <line num="12" count="14" type="stmt"/>
- <line num="14" count="14" type="stmt"/>
- <line num="15" count="4" type="stmt"/>
- <line num="16" count="4" type="stmt"/>
- <line num="18" count="4" type="cond" truecount="1" falsecount="1"/>
- <line num="19" count="4" type="stmt"/>
- <line num="22" count="4" type="stmt"/>
- <line num="23" count="4" type="stmt"/>
- <line num="26" count="0" type="stmt"/>
- <line num="27" count="0" type="stmt"/>
- <line num="31" count="14" type="stmt"/>
- <line num="32" count="3" type="stmt"/>
- <line num="35" count="14" type="stmt"/>
- <line num="36" count="1" type="stmt"/>
- <line num="37" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="39" count="1" type="stmt"/>
- <line num="40" count="1" type="stmt"/>
- <line num="46" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="47" count="1" type="stmt"/>
- <line num="50" count="1" type="stmt"/>
- <line num="51" count="1" type="stmt"/>
- <line num="54" count="0" type="stmt"/>
- <line num="55" count="0" type="stmt"/>
- <line num="59" count="14" type="stmt"/>
- <line num="60" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="62" count="1" type="stmt"/>
+ <metrics statements="66" coveredstatements="58" conditionals="30" coveredconditionals="20" methods="27" coveredmethods="23"/>
+ <line num="12" count="34" type="stmt"/>
+ <line num="14" count="34" type="stmt"/>
+ <line num="15" count="34" type="stmt"/>
+ <line num="16" count="34" type="stmt"/>
+ <line num="18" count="34" type="stmt"/>
+ <line num="21" count="34" type="stmt"/>
+ <line num="22" count="9" type="stmt"/>
+ <line num="23" count="9" type="stmt"/>
+ <line num="25" count="9" type="cond" truecount="1" falsecount="1"/>
+ <line num="26" count="9" type="stmt"/>
+ <line num="29" count="9" type="stmt"/>
+ <line num="30" count="9" type="stmt"/>
+ <line num="33" count="0" type="stmt"/>
+ <line num="34" count="0" type="stmt"/>
+ <line num="38" count="34" type="stmt"/>
+ <line num="40" count="7" type="stmt"/>
+ <line num="44" count="34" type="stmt"/>
+ <line num="45" count="2" type="stmt"/>
+ <line num="46" count="2" type="cond" truecount="1" falsecount="1"/>
+ <line num="48" count="2" type="stmt"/>
+ <line num="49" count="2" type="stmt"/>
+ <line num="55" count="2" type="cond" truecount="2" falsecount="0"/>
+ <line num="56" count="1" type="stmt"/>
+ <line num="59" count="1" type="stmt"/>
+ <line num="60" count="1" type="stmt"/>
<line num="63" count="1" type="stmt"/>
- <line num="67" count="1" type="cond" truecount="1" falsecount="1"/>
- <line num="68" count="1" type="stmt"/>
- <line num="69" count="1" type="stmt"/>
- <line num="72" count="0" type="stmt"/>
- <line num="73" count="0" type="stmt"/>
- <line num="77" count="14" type="stmt"/>
- <line num="78" count="0" type="stmt"/>
- <line num="79" count="0" type="cond" truecount="0" falsecount="2"/>
+ <line num="64" count="1" type="stmt"/>
+ <line num="68" count="34" type="stmt"/>
+ <line num="69" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="71" count="1" type="stmt"/>
+ <line num="72" count="1" type="stmt"/>
+ <line num="76" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="77" count="1" type="stmt"/>
+ <line num="78" count="1" type="stmt"/>
<line num="81" count="0" type="stmt"/>
<line num="82" count="0" type="stmt"/>
- <line num="83" count="0" type="stmt"/>
- <line num="84" count="0" type="stmt"/>
- <line num="86" count="0" type="stmt"/>
- <line num="91" count="0" type="cond" truecount="0" falsecount="2"/>
- <line num="92" count="0" type="stmt"/>
- <line num="95" count="0" type="stmt"/>
- <line num="96" count="0" type="stmt"/>
- <line num="97" count="0" type="stmt"/>
- <line num="100" count="0" type="stmt"/>
- <line num="101" count="0" type="stmt"/>
- <line num="105" count="14" type="stmt"/>
+ <line num="86" count="34" type="stmt"/>
+ <line num="87" count="1" type="stmt"/>
+ <line num="88" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="90" count="1" type="stmt"/>
+ <line num="91" count="1" type="stmt"/>
+ <line num="92" count="1" type="stmt"/>
+ <line num="93" count="1" type="stmt"/>
+ <line num="95" count="1" type="stmt"/>
+ <line num="100" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="101" count="1" type="stmt"/>
+ <line num="104" count="1" type="stmt"/>
+ <line num="105" count="1" type="stmt"/>
+ <line num="106" count="1" type="stmt"/>
+ <line num="109" count="0" type="stmt"/>
+ <line num="110" count="0" type="stmt"/>
+ <line num="114" count="34" type="stmt"/>
<line num="115" count="1" type="stmt"/>
- <line num="134" count="0" type="cond" truecount="0" falsecount="2"/>
- <line num="161" count="5" type="stmt"/>
- <line num="167" count="1" type="stmt"/>
+ <line num="116" count="1" type="stmt"/>
+ <line num="120" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="121" count="1" type="stmt"/>
+ <line num="124" count="1" type="stmt"/>
+ <line num="125" count="1" type="stmt"/>
+ <line num="128" count="0" type="stmt"/>
+ <line num="129" count="0" type="stmt"/>
+ <line num="133" count="34" type="stmt"/>
+ <line num="145" count="1" type="stmt"/>
+ <line num="163" count="2" type="stmt"/>
+ <line num="183" count="1" type="cond" truecount="1" falsecount="1"/>
+ <line num="217" count="6" type="stmt"/>
+ <line num="223" count="1" type="stmt"/>
</file>
</package>
</project>
diff --git a/frontend/coverage/coverage-final.json b/frontend/coverage/coverage-final.json
index 141aa13..b8f97aa 100644
--- a/frontend/coverage/coverage-final.json
+++ b/frontend/coverage/coverage-final.json
@@ -1,14 +1,15 @@
{"/Users/adam/workspace/vibecode/neko/frontend/src/App.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/App.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx","statementMap":{"0":{"start":{"line":9,"column":22},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":8},"end":{"line":10,"column":null}},"2":{"start":{"line":12,"column":2},"end":{"line":22,"column":null}},"3":{"start":{"line":13,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"5":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"6":{"start":{"line":18,"column":10},"end":{"line":18,"column":null}},"7":{"start":{"line":21,"column":19},"end":{"line":21,"column":33}},"8":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"11":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"12":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"13":{"start":{"line":40,"column":42},"end":{"line":40,"column":null}},"14":{"start":{"line":42,"column":2},"end":{"line":68,"column":null}},"15":{"start":{"line":50,"column":27},"end":{"line":50,"column":null}},"16":{"start":{"line":73,"column":24},"end":{"line":73,"column":null}},"17":{"start":{"line":75,"column":25},"end":{"line":78,"column":null}},"18":{"start":{"line":76,"column":4},"end":{"line":76,"column":null}},"19":{"start":{"line":77,"column":4},"end":{"line":77,"column":null}},"20":{"start":{"line":80,"column":19},"end":{"line":80,"column":null}},"21":{"start":{"line":82,"column":2},"end":{"line":95,"column":null}}},"fnMap":{"0":{"name":"RequireAuth","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":21}},"loc":{"start":{"line":8,"column":69},"end":{"line":33,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":12},"end":{"line":12,"column":18}},"loc":{"start":{"line":12,"column":18},"end":{"line":22,"column":5}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":12},"end":{"line":14,"column":13}},"loc":{"start":{"line":14,"column":21},"end":{"line":20,"column":7}},"line":14},"3":{"name":"(anonymous_3)","decl":{"start":{"line":21,"column":13},"end":{"line":21,"column":19}},"loc":{"start":{"line":21,"column":19},"end":{"line":21,"column":33}},"line":21},"4":{"name":"Dashboard","decl":{"start":{"line":39,"column":9},"end":{"line":39,"column":19}},"loc":{"start":{"line":39,"column":90},"end":{"line":70,"column":null}},"line":39},"5":{"name":"(anonymous_5)","decl":{"start":{"line":50,"column":21},"end":{"line":50,"column":27}},"loc":{"start":{"line":50,"column":27},"end":{"line":50,"column":null}},"line":50},"6":{"name":"App","decl":{"start":{"line":72,"column":9},"end":{"line":72,"column":15}},"loc":{"start":{"line":72,"column":15},"end":{"line":97,"column":null}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":75,"column":25},"end":{"line":75,"column":26}},"loc":{"start":{"line":75,"column":47},"end":{"line":78,"column":null}},"line":75}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},{"start":{"line":17,"column":15},"end":{"line":19,"column":null}}],"line":15},"1":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":24},"2":{"loc":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":28},"3":{"loc":{"start":{"line":44,"column":30},"end":{"line":44,"column":83}},"type":"cond-expr","locations":[{"start":{"line":44,"column":47},"end":{"line":44,"column":67}},{"start":{"line":44,"column":67},"end":{"line":44,"column":83}}],"line":44},"4":{"loc":{"start":{"line":47,"column":9},"end":{"line":54,"column":null}},"type":"binary-expr","locations":[{"start":{"line":47,"column":9},"end":{"line":47,"column":null}},{"start":{"line":48,"column":10},"end":{"line":54,"column":null}}],"line":47},"5":{"loc":{"start":{"line":56,"column":47},"end":{"line":56,"column":77}},"type":"cond-expr","locations":[{"start":{"line":56,"column":64},"end":{"line":56,"column":69}},{"start":{"line":56,"column":69},"end":{"line":56,"column":77}}],"line":56},"6":{"loc":{"start":{"line":73,"column":37},"end":{"line":73,"column":82}},"type":"binary-expr","locations":[{"start":{"line":73,"column":37},"end":{"line":73,"column":75}},{"start":{"line":73,"column":75},"end":{"line":73,"column":82}}],"line":73},"7":{"loc":{"start":{"line":80,"column":19},"end":{"line":80,"column":null}},"type":"cond-expr","locations":[{"start":{"line":80,"column":64},"end":{"line":80,"column":72}},{"start":{"line":80,"column":72},"end":{"line":80,"column":null}}],"line":80}},"s":{"0":2,"1":2,"2":2,"3":1,"4":1,"5":1,"6":0,"7":0,"8":2,"9":1,"10":1,"11":0,"12":1,"13":1,"14":1,"15":0,"16":2,"17":2,"18":0,"19":0,"20":2,"21":2},"f":{"0":2,"1":1,"2":1,"3":0,"4":1,"5":0,"6":2,"7":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[1,0],"4":[1,0],"5":[1,0],"6":[2,2],"7":[2,0]},"meta":{"lastBranch":8,"lastFunction":8,"lastStatement":22,"seen":{"f:8:9:8:21":0,"s:9:22:9:Infinity":0,"s:10:8:10:Infinity":1,"s:12:2:22:Infinity":2,"f:12:12:12:18":1,"s:13:4:21:Infinity":3,"f:14:12:14:13":2,"b:15:8:19:Infinity:17:15:19:Infinity":0,"s:15:8:19:Infinity":4,"s:16:10:16:Infinity":5,"s:18:10:18:Infinity":6,"f:21:13:21:19":3,"s:21:19:21:33":7,"b:24:2:26:Infinity:undefined:undefined:undefined:undefined":1,"s:24:2:26:Infinity":8,"s:25:4:25:Infinity":9,"b:28:2:30:Infinity:undefined:undefined:undefined:undefined":2,"s:28:2:30:Infinity":10,"s:29:4:29:Infinity":11,"s:32:2:32:Infinity":12,"f:39:9:39:19":4,"s:40:42:40:Infinity":13,"s:42:2:68:Infinity":14,"b:44:47:44:67:44:67:44:83":3,"b:47:9:47:Infinity:48:10:54:Infinity":4,"f:50:21:50:27":5,"s:50:27:50:Infinity":15,"b:56:64:56:69:56:69:56:77":5,"f:72:9:72:15":6,"s:73:24:73:Infinity":16,"b:73:37:73:75:73:75:73:82":6,"s:75:25:78:Infinity":17,"f:75:25:75:26":7,"s:76:4:76:Infinity":18,"s:77:4:77:Infinity":19,"s:80:19:80:Infinity":20,"b:80:64:80:72:80:72:80:Infinity":7,"s:82:2:95:Infinity":21}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts","statementMap":{"0":{"start":{"line":2,"column":18},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"3":{"start":{"line":4,"column":28},"end":{"line":4,"column":null}},"4":{"start":{"line":12,"column":19},"end":{"line":12,"column":null}},"5":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"8":{"start":{"line":18,"column":22},"end":{"line":18,"column":null}},"9":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"10":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"11":{"start":{"line":27,"column":4},"end":{"line":30,"column":null}}},"fnMap":{"0":{"name":"getCookie","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":60},"end":{"line":5,"column":null}},"line":1},"1":{"name":"apiFetch","decl":{"start":{"line":11,"column":22},"end":{"line":11,"column":31}},"loc":{"start":{"line":11,"column":96},"end":{"line":31,"column":null}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},{"start":{},"end":{}}],"line":4},"1":{"loc":{"start":{"line":12,"column":19},"end":{"line":12,"column":null}},"type":"binary-expr","locations":[{"start":{"line":12,"column":19},"end":{"line":12,"column":50}},{"start":{"line":12,"column":50},"end":{"line":12,"column":null}}],"line":12},"2":{"loc":{"start":{"line":15,"column":32},"end":{"line":15,"column":51}},"type":"binary-expr","locations":[{"start":{"line":15,"column":32},"end":{"line":15,"column":49}},{"start":{"line":15,"column":49},"end":{"line":15,"column":51}}],"line":15},"3":{"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":17},"4":{"loc":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":19}},"s":{"0":10,"1":10,"2":10,"3":0,"4":36,"5":36,"6":36,"7":36,"8":10,"9":10,"10":0,"11":36},"f":{"0":10,"1":36},"b":{"0":[0,10],"1":[36,26],"2":[36,31],"3":[10,26],"4":[0,10]},"meta":{"lastBranch":5,"lastFunction":2,"lastStatement":12,"seen":{"f:1:16:1:26":0,"s:2:18:2:Infinity":0,"s:3:18:3:Infinity":1,"b:4:4:4:Infinity:undefined:undefined:undefined:undefined":0,"s:4:4:4:Infinity":2,"s:4:28:4:Infinity":3,"f:11:22:11:31":1,"s:12:19:12:Infinity":4,"b:12:19:12:50:12:50:12:Infinity":1,"s:13:28:13:Infinity":5,"s:15:20:15:Infinity":6,"b:15:32:15:49:15:49:15:51":2,"b:17:4:22:Infinity:undefined:undefined:undefined:undefined":3,"s:17:4:22:Infinity":7,"s:18:22:18:Infinity":8,"b:19:8:21:Infinity:undefined:undefined:undefined:undefined":4,"s:19:8:21:Infinity":9,"s:20:12:20:Infinity":10,"s:27:4:30:Infinity":11}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx","statementMap":{"0":{"start":{"line":9,"column":22},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":8},"end":{"line":10,"column":null}},"2":{"start":{"line":12,"column":2},"end":{"line":22,"column":null}},"3":{"start":{"line":13,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"5":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"6":{"start":{"line":18,"column":10},"end":{"line":18,"column":null}},"7":{"start":{"line":21,"column":19},"end":{"line":21,"column":33}},"8":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"11":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"12":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"13":{"start":{"line":47,"column":42},"end":{"line":47,"column":null}},"14":{"start":{"line":49,"column":2},"end":{"line":59,"column":null}},"15":{"start":{"line":50,"column":25},"end":{"line":56,"column":null}},"16":{"start":{"line":51,"column":6},"end":{"line":55,"column":null}},"17":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"18":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"19":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"20":{"start":{"line":58,"column":4},"end":{"line":58,"column":null}},"21":{"start":{"line":58,"column":17},"end":{"line":58,"column":null}},"22":{"start":{"line":61,"column":2},"end":{"line":98,"column":null}},"23":{"start":{"line":69,"column":27},"end":{"line":69,"column":null}},"24":{"start":{"line":78,"column":27},"end":{"line":78,"column":null}},"25":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"26":{"start":{"line":104,"column":32},"end":{"line":104,"column":null}},"27":{"start":{"line":106,"column":25},"end":{"line":109,"column":null}},"28":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"29":{"start":{"line":108,"column":4},"end":{"line":108,"column":null}},"30":{"start":{"line":111,"column":29},"end":{"line":114,"column":null}},"31":{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},"32":{"start":{"line":113,"column":4},"end":{"line":113,"column":null}},"33":{"start":{"line":116,"column":19},"end":{"line":116,"column":null}},"34":{"start":{"line":118,"column":2},"end":{"line":136,"column":null}}},"fnMap":{"0":{"name":"RequireAuth","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":21}},"loc":{"start":{"line":8,"column":69},"end":{"line":33,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":12},"end":{"line":12,"column":18}},"loc":{"start":{"line":12,"column":18},"end":{"line":22,"column":5}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":12},"end":{"line":14,"column":13}},"loc":{"start":{"line":14,"column":21},"end":{"line":20,"column":7}},"line":14},"3":{"name":"(anonymous_3)","decl":{"start":{"line":21,"column":13},"end":{"line":21,"column":19}},"loc":{"start":{"line":21,"column":19},"end":{"line":21,"column":33}},"line":21},"4":{"name":"Dashboard","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":19}},"loc":{"start":{"line":46,"column":81},"end":{"line":100,"column":null}},"line":46},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":18}},"loc":{"start":{"line":49,"column":18},"end":{"line":59,"column":5}},"line":49},"6":{"name":"(anonymous_6)","decl":{"start":{"line":50,"column":25},"end":{"line":50,"column":31}},"loc":{"start":{"line":50,"column":31},"end":{"line":56,"column":null}},"line":50},"7":{"name":"(anonymous_7)","decl":{"start":{"line":58,"column":11},"end":{"line":58,"column":17}},"loc":{"start":{"line":58,"column":17},"end":{"line":58,"column":null}},"line":58},"8":{"name":"(anonymous_8)","decl":{"start":{"line":69,"column":21},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":27},"end":{"line":69,"column":null}},"line":69},"9":{"name":"(anonymous_9)","decl":{"start":{"line":78,"column":21},"end":{"line":78,"column":27}},"loc":{"start":{"line":78,"column":27},"end":{"line":78,"column":null}},"line":78},"10":{"name":"App","decl":{"start":{"line":102,"column":9},"end":{"line":102,"column":15}},"loc":{"start":{"line":102,"column":15},"end":{"line":138,"column":null}},"line":102},"11":{"name":"(anonymous_11)","decl":{"start":{"line":106,"column":25},"end":{"line":106,"column":26}},"loc":{"start":{"line":106,"column":47},"end":{"line":109,"column":null}},"line":106},"12":{"name":"(anonymous_12)","decl":{"start":{"line":111,"column":29},"end":{"line":111,"column":30}},"loc":{"start":{"line":111,"column":55},"end":{"line":114,"column":null}},"line":111}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},{"start":{"line":17,"column":15},"end":{"line":19,"column":null}}],"line":15},"1":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":24},"2":{"loc":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":28},"3":{"loc":{"start":{"line":51,"column":6},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":55,"column":null}},{"start":{"line":53,"column":13},"end":{"line":55,"column":null}}],"line":51},"4":{"loc":{"start":{"line":63,"column":30},"end":{"line":63,"column":83}},"type":"cond-expr","locations":[{"start":{"line":63,"column":47},"end":{"line":63,"column":67}},{"start":{"line":63,"column":67},"end":{"line":63,"column":83}}],"line":63},"5":{"loc":{"start":{"line":66,"column":10},"end":{"line":73,"column":null}},"type":"binary-expr","locations":[{"start":{"line":66,"column":10},"end":{"line":66,"column":29}},{"start":{"line":66,"column":29},"end":{"line":66,"column":null}},{"start":{"line":67,"column":10},"end":{"line":73,"column":null}}],"line":66},"6":{"loc":{"start":{"line":70,"column":19},"end":{"line":70,"column":null}},"type":"cond-expr","locations":[{"start":{"line":70,"column":36},"end":{"line":70,"column":53}},{"start":{"line":70,"column":53},"end":{"line":70,"column":null}}],"line":70},"7":{"loc":{"start":{"line":75,"column":9},"end":{"line":79,"column":null}},"type":"binary-expr","locations":[{"start":{"line":75,"column":9},"end":{"line":75,"column":null}},{"start":{"line":76,"column":10},"end":{"line":79,"column":null}}],"line":75},"8":{"loc":{"start":{"line":81,"column":47},"end":{"line":81,"column":77}},"type":"cond-expr","locations":[{"start":{"line":81,"column":64},"end":{"line":81,"column":69}},{"start":{"line":81,"column":69},"end":{"line":81,"column":77}}],"line":81},"9":{"loc":{"start":{"line":103,"column":37},"end":{"line":103,"column":82}},"type":"binary-expr","locations":[{"start":{"line":103,"column":37},"end":{"line":103,"column":75}},{"start":{"line":103,"column":75},"end":{"line":103,"column":82}}],"line":103},"10":{"loc":{"start":{"line":104,"column":45},"end":{"line":104,"column":97}},"type":"binary-expr","locations":[{"start":{"line":104,"column":45},"end":{"line":104,"column":88}},{"start":{"line":104,"column":88},"end":{"line":104,"column":97}}],"line":104},"11":{"loc":{"start":{"line":116,"column":19},"end":{"line":116,"column":null}},"type":"cond-expr","locations":[{"start":{"line":116,"column":64},"end":{"line":116,"column":72}},{"start":{"line":116,"column":72},"end":{"line":116,"column":null}}],"line":116}},"s":{"0":2,"1":2,"2":2,"3":1,"4":1,"5":1,"6":0,"7":0,"8":2,"9":1,"10":1,"11":0,"12":1,"13":1,"14":1,"15":1,"16":0,"17":0,"18":0,"19":1,"20":1,"21":1,"22":1,"23":0,"24":0,"25":2,"26":2,"27":2,"28":0,"29":0,"30":2,"31":0,"32":0,"33":2,"34":2},"f":{"0":2,"1":1,"2":1,"3":0,"4":1,"5":1,"6":0,"7":1,"8":0,"9":0,"10":2,"11":0,"12":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[0,0],"4":[1,0],"5":[1,1,0],"6":[0,0],"7":[1,1],"8":[1,0],"9":[2,2],"10":[2,2],"11":[2,0]},"meta":{"lastBranch":12,"lastFunction":13,"lastStatement":35,"seen":{"f:8:9:8:21":0,"s:9:22:9:Infinity":0,"s:10:8:10:Infinity":1,"s:12:2:22:Infinity":2,"f:12:12:12:18":1,"s:13:4:21:Infinity":3,"f:14:12:14:13":2,"b:15:8:19:Infinity:17:15:19:Infinity":0,"s:15:8:19:Infinity":4,"s:16:10:16:Infinity":5,"s:18:10:18:Infinity":6,"f:21:13:21:19":3,"s:21:19:21:33":7,"b:24:2:26:Infinity:undefined:undefined:undefined:undefined":1,"s:24:2:26:Infinity":8,"s:25:4:25:Infinity":9,"b:28:2:30:Infinity:undefined:undefined:undefined:undefined":2,"s:28:2:30:Infinity":10,"s:29:4:29:Infinity":11,"s:32:2:32:Infinity":12,"f:46:9:46:19":4,"s:47:42:47:Infinity":13,"s:49:2:59:Infinity":14,"f:49:12:49:18":5,"s:50:25:56:Infinity":15,"f:50:25:50:31":6,"b:51:6:55:Infinity:53:13:55:Infinity":3,"s:51:6:55:Infinity":16,"s:52:8:52:Infinity":17,"s:54:8:54:Infinity":18,"s:57:4:57:Infinity":19,"s:58:4:58:Infinity":20,"f:58:11:58:17":7,"s:58:17:58:Infinity":21,"s:61:2:98:Infinity":22,"b:63:47:63:67:63:67:63:83":4,"b:66:10:66:29:66:29:66:Infinity:67:10:73:Infinity":5,"f:69:21:69:27":8,"s:69:27:69:Infinity":23,"b:70:36:70:53:70:53:70:Infinity":6,"b:75:9:75:Infinity:76:10:79:Infinity":7,"f:78:21:78:27":9,"s:78:27:78:Infinity":24,"b:81:64:81:69:81:69:81:77":8,"f:102:9:102:15":10,"s:103:24:103:Infinity":25,"b:103:37:103:75:103:75:103:82":9,"s:104:32:104:Infinity":26,"b:104:45:104:88:104:88:104:97":10,"s:106:25:109:Infinity":27,"f:106:25:106:26":11,"s:107:4:107:Infinity":28,"s:108:4:108:Infinity":29,"s:111:29:114:Infinity":30,"f:111:29:111:30":12,"s:112:4:112:Infinity":31,"s:113:4:113:Infinity":32,"s:116:19:116:Infinity":33,"b:116:64:116:72:116:72:116:Infinity":11,"s:118:2:136:Infinity":34}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts","statementMap":{"0":{"start":{"line":2,"column":18},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"3":{"start":{"line":4,"column":28},"end":{"line":4,"column":null}},"4":{"start":{"line":12,"column":19},"end":{"line":12,"column":null}},"5":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"8":{"start":{"line":18,"column":22},"end":{"line":18,"column":null}},"9":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"10":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"11":{"start":{"line":27,"column":4},"end":{"line":31,"column":null}}},"fnMap":{"0":{"name":"getCookie","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":60},"end":{"line":5,"column":null}},"line":1},"1":{"name":"apiFetch","decl":{"start":{"line":11,"column":22},"end":{"line":11,"column":31}},"loc":{"start":{"line":11,"column":96},"end":{"line":32,"column":null}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},{"start":{},"end":{}}],"line":4},"1":{"loc":{"start":{"line":12,"column":19},"end":{"line":12,"column":null}},"type":"binary-expr","locations":[{"start":{"line":12,"column":19},"end":{"line":12,"column":50}},{"start":{"line":12,"column":50},"end":{"line":12,"column":null}}],"line":12},"2":{"loc":{"start":{"line":15,"column":32},"end":{"line":15,"column":51}},"type":"binary-expr","locations":[{"start":{"line":15,"column":32},"end":{"line":15,"column":49}},{"start":{"line":15,"column":49},"end":{"line":15,"column":51}}],"line":15},"3":{"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":17},"4":{"loc":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":19}},"s":{"0":14,"1":14,"2":14,"3":0,"4":54,"5":54,"6":54,"7":54,"8":14,"9":14,"10":0,"11":54},"f":{"0":14,"1":54},"b":{"0":[0,14],"1":[54,40],"2":[54,48],"3":[14,40],"4":[0,14]},"meta":{"lastBranch":5,"lastFunction":2,"lastStatement":12,"seen":{"f:1:16:1:26":0,"s:2:18:2:Infinity":0,"s:3:18:3:Infinity":1,"b:4:4:4:Infinity:undefined:undefined:undefined:undefined":0,"s:4:4:4:Infinity":2,"s:4:28:4:Infinity":3,"f:11:22:11:31":1,"s:12:19:12:Infinity":4,"b:12:19:12:50:12:50:12:Infinity":1,"s:13:28:13:Infinity":5,"s:15:20:15:Infinity":6,"b:15:32:15:49:15:49:15:51":2,"b:17:4:22:Infinity:undefined:undefined:undefined:undefined":3,"s:17:4:22:Infinity":7,"s:18:22:18:Infinity":8,"b:19:8:21:Infinity:undefined:undefined:undefined:undefined":4,"s:19:8:21:Infinity":9,"s:20:12:20:Infinity":10,"s:27:4:31:Infinity":11}}}
,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx","statementMap":{"0":{"start":{"line":12,"column":22},"end":{"line":12,"column":null}},"1":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"2":{"start":{"line":15,"column":2},"end":{"line":17,"column":null}},"3":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"4":{"start":{"line":19,"column":21},"end":{"line":21,"column":null}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"6":{"start":{"line":23,"column":21},"end":{"line":57,"column":null}},"7":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"8":{"start":{"line":26,"column":25},"end":{"line":26,"column":null}},"9":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"10":{"start":{"line":29,"column":4},"end":{"line":56,"column":null}},"11":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"12":{"start":{"line":42,"column":10},"end":{"line":42,"column":null}},"13":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"14":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"15":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"16":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"17":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"18":{"start":{"line":59,"column":26},"end":{"line":75,"column":null}},"19":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"20":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}},"21":{"start":{"line":62,"column":4},"end":{"line":74,"column":null}},"22":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"23":{"start":{"line":64,"column":21},"end":{"line":64,"column":null}},"24":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"25":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"26":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"27":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"28":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"29":{"start":{"line":77,"column":2},"end":{"line":113,"column":null}},"30":{"start":{"line":85,"column":12},"end":{"line":85,"column":null}},"31":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}}},"fnMap":{"0":{"name":"FeedItem","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":33}},"loc":{"start":{"line":11,"column":71},"end":{"line":115,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":12},"end":{"line":15,"column":18}},"loc":{"start":{"line":15,"column":18},"end":{"line":17,"column":5}},"line":15},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":21},"end":{"line":19,"column":27}},"loc":{"start":{"line":19,"column":27},"end":{"line":21,"column":null}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":21},"end":{"line":23,"column":22}},"loc":{"start":{"line":23,"column":40},"end":{"line":57,"column":null}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":12},"end":{"line":40,"column":13}},"loc":{"start":{"line":40,"column":21},"end":{"line":45,"column":7}},"line":40},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":12},"end":{"line":46,"column":18}},"loc":{"start":{"line":46,"column":18},"end":{"line":50,"column":7}},"line":46},"6":{"name":"(anonymous_6)","decl":{"start":{"line":51,"column":13},"end":{"line":51,"column":14}},"loc":{"start":{"line":51,"column":22},"end":{"line":56,"column":7}},"line":51},"7":{"name":"(anonymous_7)","decl":{"start":{"line":59,"column":26},"end":{"line":59,"column":27}},"loc":{"start":{"line":59,"column":51},"end":{"line":75,"column":null}},"line":59},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":12},"end":{"line":63,"column":13}},"loc":{"start":{"line":63,"column":21},"end":{"line":66,"column":7}},"line":63},"9":{"name":"(anonymous_9)","decl":{"start":{"line":67,"column":12},"end":{"line":67,"column":13}},"loc":{"start":{"line":67,"column":22},"end":{"line":70,"column":7}},"line":67},"10":{"name":"(anonymous_10)","decl":{"start":{"line":71,"column":13},"end":{"line":71,"column":14}},"loc":{"start":{"line":71,"column":22},"end":{"line":74,"column":7}},"line":71},"11":{"name":"(anonymous_11)","decl":{"start":{"line":84,"column":19},"end":{"line":84,"column":20}},"loc":{"start":{"line":84,"column":26},"end":{"line":87,"column":null}},"line":84}},"branchMap":{"0":{"loc":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},{"start":{},"end":{}}],"line":41},"1":{"loc":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":64},"2":{"loc":{"start":{"line":78,"column":32},"end":{"line":78,"column":61}},"type":"cond-expr","locations":[{"start":{"line":78,"column":44},"end":{"line":78,"column":53}},{"start":{"line":78,"column":53},"end":{"line":78,"column":61}}],"line":78},"3":{"loc":{"start":{"line":78,"column":65},"end":{"line":78,"column":89}},"type":"cond-expr","locations":[{"start":{"line":78,"column":75},"end":{"line":78,"column":87}},{"start":{"line":78,"column":87},"end":{"line":78,"column":89}}],"line":78},"4":{"loc":{"start":{"line":81,"column":11},"end":{"line":81,"column":null}},"type":"binary-expr","locations":[{"start":{"line":81,"column":11},"end":{"line":81,"column":25}},{"start":{"line":81,"column":25},"end":{"line":81,"column":null}}],"line":81},"5":{"loc":{"start":{"line":88,"column":33},"end":{"line":88,"column":77}},"type":"cond-expr","locations":[{"start":{"line":88,"column":48},"end":{"line":88,"column":63}},{"start":{"line":88,"column":63},"end":{"line":88,"column":77}}],"line":88},"6":{"loc":{"start":{"line":89,"column":17},"end":{"line":89,"column":null}},"type":"cond-expr","locations":[{"start":{"line":89,"column":32},"end":{"line":89,"column":43}},{"start":{"line":89,"column":43},"end":{"line":89,"column":null}}],"line":89},"7":{"loc":{"start":{"line":97,"column":11},"end":{"line":97,"column":null}},"type":"binary-expr","locations":[{"start":{"line":97,"column":11},"end":{"line":97,"column":30}},{"start":{"line":97,"column":30},"end":{"line":97,"column":null}}],"line":97},"8":{"loc":{"start":{"line":100,"column":11},"end":{"line":103,"column":null}},"type":"binary-expr","locations":[{"start":{"line":100,"column":11},"end":{"line":100,"column":null}},{"start":{"line":101,"column":12},"end":{"line":103,"column":null}}],"line":100},"9":{"loc":{"start":{"line":106,"column":6},"end":{"line":111,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":29}},{"start":{"line":107,"column":29},"end":{"line":107,"column":null}},{"start":{"line":108,"column":8},"end":{"line":111,"column":null}}],"line":106},"10":{"loc":{"start":{"line":110,"column":45},"end":{"line":110,"column":83}},"type":"binary-expr","locations":[{"start":{"line":110,"column":45},"end":{"line":110,"column":66}},{"start":{"line":110,"column":66},"end":{"line":110,"column":83}}],"line":110}},"s":{"0":33,"1":33,"2":33,"3":16,"4":33,"5":1,"6":33,"7":1,"8":1,"9":1,"10":1,"11":1,"12":0,"13":1,"14":1,"15":0,"16":0,"17":0,"18":33,"19":1,"20":1,"21":1,"22":1,"23":0,"24":1,"25":1,"26":1,"27":0,"28":0,"29":33,"30":1,"31":1},"f":{"0":33,"1":16,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1,"8":1,"9":1,"10":0,"11":1},"b":{"0":[0,1],"1":[0,1],"2":[16,17],"3":[4,29],"4":[33,0],"5":[4,29],"6":[4,29],"7":[33,13],"8":[33,32],"9":[33,32,12],"10":[12,11]},"meta":{"lastBranch":11,"lastFunction":12,"lastStatement":32,"seen":{"f:11:24:11:33":0,"s:12:22:12:Infinity":0,"s:13:28:13:Infinity":1,"s:15:2:17:Infinity":2,"f:15:12:15:18":1,"s:16:4:16:Infinity":3,"s:19:21:21:Infinity":4,"f:19:21:19:27":2,"s:20:4:20:Infinity":5,"s:23:21:57:Infinity":6,"f:23:21:23:22":3,"s:24:4:24:Infinity":7,"s:26:25:26:Infinity":8,"s:27:4:27:Infinity":9,"s:29:4:56:Infinity":10,"f:40:12:40:13":4,"b:41:8:43:Infinity:undefined:undefined:undefined:undefined":0,"s:41:8:43:Infinity":11,"s:42:10:42:Infinity":12,"s:44:8:44:Infinity":13,"f:46:12:46:18":5,"s:49:8:49:Infinity":14,"f:51:13:51:14":6,"s:52:8:52:Infinity":15,"s:54:8:54:Infinity":16,"s:55:8:55:Infinity":17,"s:59:26:75:Infinity":18,"f:59:26:59:27":7,"s:60:4:60:Infinity":19,"s:61:4:61:Infinity":20,"s:62:4:74:Infinity":21,"f:63:12:63:13":8,"b:64:8:64:Infinity:undefined:undefined:undefined:undefined":1,"s:64:8:64:Infinity":22,"s:64:21:64:Infinity":23,"s:65:8:65:Infinity":24,"f:67:12:67:13":9,"s:68:8:68:Infinity":25,"s:69:8:69:Infinity":26,"f:71:13:71:14":10,"s:72:8:72:Infinity":27,"s:73:8:73:Infinity":28,"s:77:2:113:Infinity":29,"b:78:44:78:53:78:53:78:61":2,"b:78:75:78:87:78:87:78:89":3,"b:81:11:81:25:81:25:81:Infinity":4,"f:84:19:84:20":11,"s:85:12:85:Infinity":30,"s:86:12:86:Infinity":31,"b:88:48:88:63:88:63:88:77":5,"b:89:32:89:43:89:43:89:Infinity":6,"b:97:11:97:30:97:30:97:Infinity":7,"b:100:11:100:Infinity:101:12:103:Infinity":8,"b:107:8:107:29:107:29:107:Infinity:108:8:111:Infinity":9,"b:110:45:110:66:110:66:110:83":10}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx","statementMap":{"0":{"start":{"line":12,"column":22},"end":{"line":12,"column":null}},"1":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"2":{"start":{"line":15,"column":2},"end":{"line":17,"column":null}},"3":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"4":{"start":{"line":19,"column":21},"end":{"line":21,"column":null}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"6":{"start":{"line":23,"column":21},"end":{"line":57,"column":null}},"7":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"8":{"start":{"line":26,"column":25},"end":{"line":26,"column":null}},"9":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"10":{"start":{"line":29,"column":4},"end":{"line":56,"column":null}},"11":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"12":{"start":{"line":42,"column":10},"end":{"line":42,"column":null}},"13":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"14":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"15":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"16":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"17":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"18":{"start":{"line":59,"column":26},"end":{"line":75,"column":null}},"19":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"20":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}},"21":{"start":{"line":62,"column":4},"end":{"line":74,"column":null}},"22":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"23":{"start":{"line":64,"column":21},"end":{"line":64,"column":null}},"24":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"25":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"26":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"27":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"28":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"29":{"start":{"line":77,"column":2},"end":{"line":113,"column":null}},"30":{"start":{"line":85,"column":12},"end":{"line":85,"column":null}},"31":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}}},"fnMap":{"0":{"name":"FeedItem","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":33}},"loc":{"start":{"line":11,"column":71},"end":{"line":115,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":12},"end":{"line":15,"column":18}},"loc":{"start":{"line":15,"column":18},"end":{"line":17,"column":5}},"line":15},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":21},"end":{"line":19,"column":27}},"loc":{"start":{"line":19,"column":27},"end":{"line":21,"column":null}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":21},"end":{"line":23,"column":22}},"loc":{"start":{"line":23,"column":40},"end":{"line":57,"column":null}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":12},"end":{"line":40,"column":13}},"loc":{"start":{"line":40,"column":21},"end":{"line":45,"column":7}},"line":40},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":12},"end":{"line":46,"column":18}},"loc":{"start":{"line":46,"column":18},"end":{"line":50,"column":7}},"line":46},"6":{"name":"(anonymous_6)","decl":{"start":{"line":51,"column":13},"end":{"line":51,"column":14}},"loc":{"start":{"line":51,"column":22},"end":{"line":56,"column":7}},"line":51},"7":{"name":"(anonymous_7)","decl":{"start":{"line":59,"column":26},"end":{"line":59,"column":27}},"loc":{"start":{"line":59,"column":51},"end":{"line":75,"column":null}},"line":59},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":12},"end":{"line":63,"column":13}},"loc":{"start":{"line":63,"column":21},"end":{"line":66,"column":7}},"line":63},"9":{"name":"(anonymous_9)","decl":{"start":{"line":67,"column":12},"end":{"line":67,"column":13}},"loc":{"start":{"line":67,"column":22},"end":{"line":70,"column":7}},"line":67},"10":{"name":"(anonymous_10)","decl":{"start":{"line":71,"column":13},"end":{"line":71,"column":14}},"loc":{"start":{"line":71,"column":22},"end":{"line":74,"column":7}},"line":71},"11":{"name":"(anonymous_11)","decl":{"start":{"line":84,"column":19},"end":{"line":84,"column":20}},"loc":{"start":{"line":84,"column":26},"end":{"line":87,"column":null}},"line":84}},"branchMap":{"0":{"loc":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},{"start":{},"end":{}}],"line":41},"1":{"loc":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":64},"2":{"loc":{"start":{"line":78,"column":32},"end":{"line":78,"column":61}},"type":"cond-expr","locations":[{"start":{"line":78,"column":44},"end":{"line":78,"column":53}},{"start":{"line":78,"column":53},"end":{"line":78,"column":61}}],"line":78},"3":{"loc":{"start":{"line":78,"column":65},"end":{"line":78,"column":89}},"type":"cond-expr","locations":[{"start":{"line":78,"column":75},"end":{"line":78,"column":87}},{"start":{"line":78,"column":87},"end":{"line":78,"column":89}}],"line":78},"4":{"loc":{"start":{"line":81,"column":11},"end":{"line":81,"column":null}},"type":"binary-expr","locations":[{"start":{"line":81,"column":11},"end":{"line":81,"column":25}},{"start":{"line":81,"column":25},"end":{"line":81,"column":null}}],"line":81},"5":{"loc":{"start":{"line":88,"column":33},"end":{"line":88,"column":77}},"type":"cond-expr","locations":[{"start":{"line":88,"column":48},"end":{"line":88,"column":63}},{"start":{"line":88,"column":63},"end":{"line":88,"column":77}}],"line":88},"6":{"loc":{"start":{"line":89,"column":17},"end":{"line":89,"column":null}},"type":"cond-expr","locations":[{"start":{"line":89,"column":32},"end":{"line":89,"column":43}},{"start":{"line":89,"column":43},"end":{"line":89,"column":null}}],"line":89},"7":{"loc":{"start":{"line":97,"column":11},"end":{"line":97,"column":null}},"type":"binary-expr","locations":[{"start":{"line":97,"column":11},"end":{"line":97,"column":30}},{"start":{"line":97,"column":30},"end":{"line":97,"column":null}}],"line":97},"8":{"loc":{"start":{"line":100,"column":11},"end":{"line":103,"column":null}},"type":"binary-expr","locations":[{"start":{"line":100,"column":11},"end":{"line":100,"column":null}},{"start":{"line":101,"column":12},"end":{"line":103,"column":null}}],"line":100},"9":{"loc":{"start":{"line":106,"column":6},"end":{"line":111,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":29}},{"start":{"line":107,"column":29},"end":{"line":107,"column":null}},{"start":{"line":108,"column":8},"end":{"line":111,"column":null}}],"line":106},"10":{"loc":{"start":{"line":110,"column":45},"end":{"line":110,"column":83}},"type":"binary-expr","locations":[{"start":{"line":110,"column":45},"end":{"line":110,"column":66}},{"start":{"line":110,"column":66},"end":{"line":110,"column":83}}],"line":110}},"s":{"0":56,"1":56,"2":56,"3":22,"4":56,"5":1,"6":56,"7":1,"8":1,"9":1,"10":1,"11":1,"12":0,"13":1,"14":1,"15":0,"16":0,"17":0,"18":56,"19":1,"20":1,"21":1,"22":1,"23":0,"24":1,"25":1,"26":1,"27":0,"28":0,"29":56,"30":1,"31":1},"f":{"0":56,"1":22,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1,"8":1,"9":1,"10":0,"11":1},"b":{"0":[0,1],"1":[0,1],"2":[38,18],"3":[4,52],"4":[56,0],"5":[5,51],"6":[5,51],"7":[56,13],"8":[56,55],"9":[56,55,12],"10":[12,11]},"meta":{"lastBranch":11,"lastFunction":12,"lastStatement":32,"seen":{"f:11:24:11:33":0,"s:12:22:12:Infinity":0,"s:13:28:13:Infinity":1,"s:15:2:17:Infinity":2,"f:15:12:15:18":1,"s:16:4:16:Infinity":3,"s:19:21:21:Infinity":4,"f:19:21:19:27":2,"s:20:4:20:Infinity":5,"s:23:21:57:Infinity":6,"f:23:21:23:22":3,"s:24:4:24:Infinity":7,"s:26:25:26:Infinity":8,"s:27:4:27:Infinity":9,"s:29:4:56:Infinity":10,"f:40:12:40:13":4,"b:41:8:43:Infinity:undefined:undefined:undefined:undefined":0,"s:41:8:43:Infinity":11,"s:42:10:42:Infinity":12,"s:44:8:44:Infinity":13,"f:46:12:46:18":5,"s:49:8:49:Infinity":14,"f:51:13:51:14":6,"s:52:8:52:Infinity":15,"s:54:8:54:Infinity":16,"s:55:8:55:Infinity":17,"s:59:26:75:Infinity":18,"f:59:26:59:27":7,"s:60:4:60:Infinity":19,"s:61:4:61:Infinity":20,"s:62:4:74:Infinity":21,"f:63:12:63:13":8,"b:64:8:64:Infinity:undefined:undefined:undefined:undefined":1,"s:64:8:64:Infinity":22,"s:64:21:64:Infinity":23,"s:65:8:65:Infinity":24,"f:67:12:67:13":9,"s:68:8:68:Infinity":25,"s:69:8:69:Infinity":26,"f:71:13:71:14":10,"s:72:8:72:Infinity":27,"s:73:8:73:Infinity":28,"s:77:2:113:Infinity":29,"b:78:44:78:53:78:53:78:61":2,"b:78:75:78:87:78:87:78:89":3,"b:81:11:81:25:81:25:81:Infinity":4,"f:84:19:84:20":11,"s:85:12:85:Infinity":30,"s:86:12:86:Infinity":31,"b:88:48:88:63:88:63:88:77":5,"b:89:32:89:43:89:43:89:Infinity":6,"b:97:11:97:30:97:30:97:Infinity":7,"b:100:11:100:Infinity:101:12:103:Infinity":8,"b:107:8:107:29:107:29:107:Infinity:108:8:111:Infinity":9,"b:110:45:110:66:110:66:110:83":10}}}
,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx","statementMap":{"0":{"start":{"line":9,"column":26},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":21},"end":{"line":10,"column":null}},"2":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"3":{"start":{"line":13,"column":24},"end":{"line":13,"column":null}},"4":{"start":{"line":14,"column":28},"end":{"line":14,"column":null}},"5":{"start":{"line":15,"column":36},"end":{"line":15,"column":null}},"6":{"start":{"line":16,"column":28},"end":{"line":16,"column":null}},"7":{"start":{"line":17,"column":24},"end":{"line":17,"column":null}},"8":{"start":{"line":18,"column":40},"end":{"line":18,"column":null}},"9":{"start":{"line":20,"column":21},"end":{"line":87,"column":null}},"10":{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},"11":{"start":{"line":22,"column":6},"end":{"line":22,"column":null}},"12":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"13":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"14":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"15":{"start":{"line":29,"column":14},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":19},"end":{"line":30,"column":null}},"17":{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},"18":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"19":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"20":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"21":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"22":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"23":{"start":{"line":43,"column":24},"end":{"line":43,"column":null}},"24":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"25":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"26":{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},"27":{"start":{"line":49,"column":6},"end":{"line":49,"column":null}},"28":{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},"29":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"30":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"31":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"32":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"33":{"start":{"line":60,"column":24},"end":{"line":60,"column":null}},"34":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"35":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"36":{"start":{"line":65,"column":4},"end":{"line":86,"column":null}},"37":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"38":{"start":{"line":68,"column":10},"end":{"line":68,"column":null}},"39":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"40":{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},"41":{"start":{"line":74,"column":10},"end":{"line":74,"column":null}},"42":{"start":{"line":74,"column":29},"end":{"line":74,"column":47}},"43":{"start":{"line":76,"column":10},"end":{"line":76,"column":null}},"44":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"45":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"46":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"47":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"48":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"49":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"50":{"start":{"line":89,"column":2},"end":{"line":92,"column":null}},"51":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"52":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"53":{"start":{"line":95,"column":23},"end":{"line":100,"column":null}},"54":{"start":{"line":96,"column":20},"end":{"line":96,"column":null}},"55":{"start":{"line":97,"column":4},"end":{"line":99,"column":null}},"56":{"start":{"line":98,"column":6},"end":{"line":98,"column":null}},"57":{"start":{"line":102,"column":21},"end":{"line":112,"column":null}},"58":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"59":{"start":{"line":105,"column":4},"end":{"line":105,"column":null}},"60":{"start":{"line":105,"column":28},"end":{"line":105,"column":88}},"61":{"start":{"line":105,"column":50},"end":{"line":105,"column":87}},"62":{"start":{"line":107,"column":4},"end":{"line":111,"column":null}},"63":{"start":{"line":111,"column":22},"end":{"line":111,"column":63}},"64":{"start":{"line":114,"column":21},"end":{"line":124,"column":null}},"65":{"start":{"line":115,"column":24},"end":{"line":115,"column":null}},"66":{"start":{"line":117,"column":4},"end":{"line":117,"column":null}},"67":{"start":{"line":117,"column":28},"end":{"line":117,"column":88}},"68":{"start":{"line":117,"column":50},"end":{"line":117,"column":87}},"69":{"start":{"line":119,"column":4},"end":{"line":123,"column":null}},"70":{"start":{"line":123,"column":22},"end":{"line":123,"column":65}},"71":{"start":{"line":126,"column":2},"end":{"line":162,"column":null}},"72":{"start":{"line":127,"column":26},"end":{"line":158,"column":null}},"73":{"start":{"line":128,"column":6},"end":{"line":128,"column":null}},"74":{"start":{"line":128,"column":30},"end":{"line":128,"column":null}},"75":{"start":{"line":130,"column":6},"end":{"line":157,"column":null}},"76":{"start":{"line":131,"column":8},"end":{"line":141,"column":null}},"77":{"start":{"line":132,"column":28},"end":{"line":132,"column":null}},"78":{"start":{"line":133,"column":10},"end":{"line":139,"column":null}},"79":{"start":{"line":134,"column":25},"end":{"line":134,"column":null}},"80":{"start":{"line":135,"column":12},"end":{"line":137,"column":null}},"81":{"start":{"line":136,"column":14},"end":{"line":136,"column":null}},"82":{"start":{"line":138,"column":12},"end":{"line":138,"column":null}},"83":{"start":{"line":140,"column":10},"end":{"line":140,"column":null}},"84":{"start":{"line":142,"column":6},"end":{"line":157,"column":null}},"85":{"start":{"line":143,"column":8},"end":{"line":149,"column":null}},"86":{"start":{"line":144,"column":28},"end":{"line":144,"column":null}},"87":{"start":{"line":145,"column":10},"end":{"line":147,"column":null}},"88":{"start":{"line":146,"column":12},"end":{"line":146,"column":null}},"89":{"start":{"line":148,"column":10},"end":{"line":148,"column":null}},"90":{"start":{"line":150,"column":6},"end":{"line":157,"column":null}},"91":{"start":{"line":151,"column":8},"end":{"line":156,"column":null}},"92":{"start":{"line":152,"column":10},"end":{"line":154,"column":null}},"93":{"start":{"line":153,"column":12},"end":{"line":153,"column":null}},"94":{"start":{"line":155,"column":10},"end":{"line":155,"column":null}},"95":{"start":{"line":160,"column":4},"end":{"line":160,"column":null}},"96":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"97":{"start":{"line":161,"column":17},"end":{"line":161,"column":null}},"98":{"start":{"line":166,"column":2},"end":{"line":202,"column":null}},"99":{"start":{"line":167,"column":21},"end":{"line":191,"column":null}},"100":{"start":{"line":169,"column":8},"end":{"line":188,"column":null}},"101":{"start":{"line":171,"column":10},"end":{"line":176,"column":null}},"102":{"start":{"line":172,"column":12},"end":{"line":174,"column":null}},"103":{"start":{"line":173,"column":14},"end":{"line":173,"column":null}},"104":{"start":{"line":175,"column":12},"end":{"line":175,"column":null}},"105":{"start":{"line":179,"column":10},"end":{"line":187,"column":null}},"106":{"start":{"line":180,"column":26},"end":{"line":180,"column":null}},"107":{"start":{"line":181,"column":12},"end":{"line":186,"column":null}},"108":{"start":{"line":182,"column":27},"end":{"line":182,"column":null}},"109":{"start":{"line":183,"column":14},"end":{"line":185,"column":null}},"110":{"start":{"line":184,"column":16},"end":{"line":184,"column":null}},"111":{"start":{"line":193,"column":4},"end":{"line":196,"column":null}},"112":{"start":{"line":194,"column":17},"end":{"line":194,"column":null}},"113":{"start":{"line":195,"column":6},"end":{"line":195,"column":null}},"114":{"start":{"line":195,"column":14},"end":{"line":195,"column":null}},"115":{"start":{"line":198,"column":21},"end":{"line":198,"column":null}},"116":{"start":{"line":199,"column":4},"end":{"line":199,"column":null}},"117":{"start":{"line":199,"column":18},"end":{"line":199,"column":null}},"118":{"start":{"line":201,"column":4},"end":{"line":201,"column":null}},"119":{"start":{"line":201,"column":17},"end":{"line":201,"column":null}},"120":{"start":{"line":204,"column":2},"end":{"line":204,"column":null}},"121":{"start":{"line":204,"column":15},"end":{"line":204,"column":null}},"122":{"start":{"line":205,"column":2},"end":{"line":205,"column":null}},"123":{"start":{"line":205,"column":13},"end":{"line":205,"column":null}},"124":{"start":{"line":207,"column":2},"end":{"line":231,"column":null}},"125":{"start":{"line":214,"column":12},"end":{"line":222,"column":null}},"126":{"start":{"line":219,"column":29},"end":{"line":219,"column":null}}},"fnMap":{"0":{"name":"FeedItems","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":36}},"loc":{"start":{"line":8,"column":36},"end":{"line":233,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":21},"end":{"line":20,"column":22}},"loc":{"start":{"line":20,"column":41},"end":{"line":87,"column":null}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":66,"column":12},"end":{"line":66,"column":13}},"loc":{"start":{"line":66,"column":21},"end":{"line":71,"column":7}},"line":66},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":12},"end":{"line":72,"column":13}},"loc":{"start":{"line":72,"column":22},"end":{"line":81,"column":7}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":74,"column":19},"end":{"line":74,"column":20}},"loc":{"start":{"line":74,"column":29},"end":{"line":74,"column":47}},"line":74},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":13},"end":{"line":82,"column":14}},"loc":{"start":{"line":82,"column":22},"end":{"line":86,"column":7}},"line":82},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":12},"end":{"line":89,"column":18}},"loc":{"start":{"line":89,"column":18},"end":{"line":92,"column":5}},"line":89},"7":{"name":"(anonymous_7)","decl":{"start":{"line":95,"column":23},"end":{"line":95,"column":24}},"loc":{"start":{"line":95,"column":42},"end":{"line":100,"column":null}},"line":95},"8":{"name":"(anonymous_8)","decl":{"start":{"line":102,"column":21},"end":{"line":102,"column":22}},"loc":{"start":{"line":102,"column":37},"end":{"line":112,"column":null}},"line":102},"9":{"name":"(anonymous_9)","decl":{"start":{"line":105,"column":13},"end":{"line":105,"column":14}},"loc":{"start":{"line":105,"column":28},"end":{"line":105,"column":88}},"line":105},"10":{"name":"(anonymous_10)","decl":{"start":{"line":105,"column":42},"end":{"line":105,"column":43}},"loc":{"start":{"line":105,"column":50},"end":{"line":105,"column":87}},"line":105},"11":{"name":"(anonymous_11)","decl":{"start":{"line":111,"column":13},"end":{"line":111,"column":14}},"loc":{"start":{"line":111,"column":22},"end":{"line":111,"column":63}},"line":111},"12":{"name":"(anonymous_12)","decl":{"start":{"line":114,"column":21},"end":{"line":114,"column":22}},"loc":{"start":{"line":114,"column":37},"end":{"line":124,"column":null}},"line":114},"13":{"name":"(anonymous_13)","decl":{"start":{"line":117,"column":13},"end":{"line":117,"column":14}},"loc":{"start":{"line":117,"column":28},"end":{"line":117,"column":88}},"line":117},"14":{"name":"(anonymous_14)","decl":{"start":{"line":117,"column":42},"end":{"line":117,"column":43}},"loc":{"start":{"line":117,"column":50},"end":{"line":117,"column":87}},"line":117},"15":{"name":"(anonymous_15)","decl":{"start":{"line":123,"column":13},"end":{"line":123,"column":14}},"loc":{"start":{"line":123,"column":22},"end":{"line":123,"column":65}},"line":123},"16":{"name":"(anonymous_16)","decl":{"start":{"line":126,"column":12},"end":{"line":126,"column":18}},"loc":{"start":{"line":126,"column":18},"end":{"line":162,"column":5}},"line":126},"17":{"name":"(anonymous_17)","decl":{"start":{"line":127,"column":26},"end":{"line":127,"column":27}},"loc":{"start":{"line":127,"column":48},"end":{"line":158,"column":null}},"line":127},"18":{"name":"(anonymous_18)","decl":{"start":{"line":131,"column":25},"end":{"line":131,"column":26}},"loc":{"start":{"line":131,"column":35},"end":{"line":141,"column":9}},"line":131},"19":{"name":"(anonymous_19)","decl":{"start":{"line":143,"column":25},"end":{"line":143,"column":26}},"loc":{"start":{"line":143,"column":35},"end":{"line":149,"column":9}},"line":143},"20":{"name":"(anonymous_20)","decl":{"start":{"line":151,"column":25},"end":{"line":151,"column":26}},"loc":{"start":{"line":151,"column":43},"end":{"line":156,"column":9}},"line":151},"21":{"name":"(anonymous_21)","decl":{"start":{"line":161,"column":11},"end":{"line":161,"column":17}},"loc":{"start":{"line":161,"column":17},"end":{"line":161,"column":null}},"line":161},"22":{"name":"(anonymous_22)","decl":{"start":{"line":166,"column":12},"end":{"line":166,"column":18}},"loc":{"start":{"line":166,"column":18},"end":{"line":202,"column":5}},"line":166},"23":{"name":"(anonymous_23)","decl":{"start":{"line":168,"column":6},"end":{"line":168,"column":7}},"loc":{"start":{"line":168,"column":19},"end":{"line":189,"column":null}},"line":168},"24":{"name":"(anonymous_24)","decl":{"start":{"line":169,"column":24},"end":{"line":169,"column":25}},"loc":{"start":{"line":169,"column":35},"end":{"line":188,"column":9}},"line":169},"25":{"name":"(anonymous_25)","decl":{"start":{"line":193,"column":18},"end":{"line":193,"column":19}},"loc":{"start":{"line":193,"column":32},"end":{"line":196,"column":5}},"line":193},"26":{"name":"(anonymous_26)","decl":{"start":{"line":201,"column":11},"end":{"line":201,"column":17}},"loc":{"start":{"line":201,"column":17},"end":{"line":201,"column":null}},"line":201},"27":{"name":"(anonymous_27)","decl":{"start":{"line":213,"column":21},"end":{"line":213,"column":22}},"loc":{"start":{"line":214,"column":12},"end":{"line":222,"column":null}},"line":214},"28":{"name":"(anonymous_28)","decl":{"start":{"line":219,"column":23},"end":{"line":219,"column":29}},"loc":{"start":{"line":219,"column":29},"end":{"line":219,"column":null}},"line":219}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"type":"binary-expr","locations":[{"start":{"line":11,"column":19},"end":{"line":11,"column":49}},{"start":{"line":11,"column":49},"end":{"line":11,"column":null}}],"line":11},"1":{"loc":{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},{"start":{"line":23,"column":11},"end":{"line":26,"column":null}}],"line":21},"2":{"loc":{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},{"start":{"line":34,"column":4},"end":{"line":36,"column":null}}],"line":32},"3":{"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":34},"4":{"loc":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":38},"5":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},{"start":{},"end":{}}],"line":44},"6":{"loc":{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},{"start":{"line":50,"column":4},"end":{"line":58,"column":null}}],"line":48},"7":{"loc":{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},{"start":{"line":53,"column":11},"end":{"line":58,"column":null}}],"line":50},"8":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":55},"9":{"loc":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},{"start":{},"end":{}}],"line":61},"10":{"loc":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":67},"11":{"loc":{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},{"start":{"line":75,"column":15},"end":{"line":77,"column":null}}],"line":73},"12":{"loc":{"start":{"line":97,"column":4},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":97,"column":4},"end":{"line":99,"column":null}},{"start":{},"end":{}}],"line":97},"13":{"loc":{"start":{"line":105,"column":50},"end":{"line":105,"column":87}},"type":"cond-expr","locations":[{"start":{"line":105,"column":71},"end":{"line":105,"column":85}},{"start":{"line":105,"column":85},"end":{"line":105,"column":87}}],"line":105},"14":{"loc":{"start":{"line":117,"column":50},"end":{"line":117,"column":87}},"type":"cond-expr","locations":[{"start":{"line":117,"column":71},"end":{"line":117,"column":85}},{"start":{"line":117,"column":85},"end":{"line":117,"column":87}}],"line":117},"15":{"loc":{"start":{"line":128,"column":6},"end":{"line":128,"column":null}},"type":"if","locations":[{"start":{"line":128,"column":6},"end":{"line":128,"column":null}},{"start":{},"end":{}}],"line":128},"16":{"loc":{"start":{"line":130,"column":6},"end":{"line":157,"column":null}},"type":"if","locations":[{"start":{"line":130,"column":6},"end":{"line":157,"column":null}},{"start":{"line":142,"column":6},"end":{"line":157,"column":null}}],"line":130},"17":{"loc":{"start":{"line":133,"column":10},"end":{"line":139,"column":null}},"type":"if","locations":[{"start":{"line":133,"column":10},"end":{"line":139,"column":null}},{"start":{},"end":{}}],"line":133},"18":{"loc":{"start":{"line":135,"column":12},"end":{"line":137,"column":null}},"type":"if","locations":[{"start":{"line":135,"column":12},"end":{"line":137,"column":null}},{"start":{},"end":{}}],"line":135},"19":{"loc":{"start":{"line":142,"column":6},"end":{"line":157,"column":null}},"type":"if","locations":[{"start":{"line":142,"column":6},"end":{"line":157,"column":null}},{"start":{"line":150,"column":6},"end":{"line":157,"column":null}}],"line":142},"20":{"loc":{"start":{"line":145,"column":10},"end":{"line":147,"column":null}},"type":"if","locations":[{"start":{"line":145,"column":10},"end":{"line":147,"column":null}},{"start":{},"end":{}}],"line":145},"21":{"loc":{"start":{"line":150,"column":6},"end":{"line":157,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":6},"end":{"line":157,"column":null}},{"start":{},"end":{}}],"line":150},"22":{"loc":{"start":{"line":152,"column":10},"end":{"line":154,"column":null}},"type":"if","locations":[{"start":{"line":152,"column":10},"end":{"line":154,"column":null}},{"start":{},"end":{}}],"line":152},"23":{"loc":{"start":{"line":152,"column":14},"end":{"line":152,"column":64}},"type":"binary-expr","locations":[{"start":{"line":152,"column":14},"end":{"line":152,"column":35}},{"start":{"line":152,"column":35},"end":{"line":152,"column":64}}],"line":152},"24":{"loc":{"start":{"line":171,"column":10},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":171,"column":10},"end":{"line":176,"column":null}},{"start":{},"end":{}}],"line":171},"25":{"loc":{"start":{"line":172,"column":12},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":12},"end":{"line":174,"column":null}},{"start":{},"end":{}}],"line":172},"26":{"loc":{"start":{"line":172,"column":16},"end":{"line":172,"column":85}},"type":"binary-expr","locations":[{"start":{"line":172,"column":16},"end":{"line":172,"column":40}},{"start":{"line":172,"column":40},"end":{"line":172,"column":56}},{"start":{"line":172,"column":56},"end":{"line":172,"column":67}},{"start":{"line":172,"column":67},"end":{"line":172,"column":85}}],"line":172},"27":{"loc":{"start":{"line":179,"column":10},"end":{"line":187,"column":null}},"type":"if","locations":[{"start":{"line":179,"column":10},"end":{"line":187,"column":null}},{"start":{},"end":{}}],"line":179},"28":{"loc":{"start":{"line":179,"column":14},"end":{"line":179,"column":73}},"type":"binary-expr","locations":[{"start":{"line":179,"column":14},"end":{"line":179,"column":39}},{"start":{"line":179,"column":39},"end":{"line":179,"column":73}}],"line":179},"29":{"loc":{"start":{"line":181,"column":12},"end":{"line":186,"column":null}},"type":"if","locations":[{"start":{"line":181,"column":12},"end":{"line":186,"column":null}},{"start":{},"end":{}}],"line":181},"30":{"loc":{"start":{"line":181,"column":16},"end":{"line":181,"column":69}},"type":"binary-expr","locations":[{"start":{"line":181,"column":16},"end":{"line":181,"column":33}},{"start":{"line":181,"column":33},"end":{"line":181,"column":47}},{"start":{"line":181,"column":47},"end":{"line":181,"column":69}}],"line":181},"31":{"loc":{"start":{"line":183,"column":14},"end":{"line":185,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":14},"end":{"line":185,"column":null}},{"start":{},"end":{}}],"line":183},"32":{"loc":{"start":{"line":195,"column":6},"end":{"line":195,"column":null}},"type":"if","locations":[{"start":{"line":195,"column":6},"end":{"line":195,"column":null}},{"start":{},"end":{}}],"line":195},"33":{"loc":{"start":{"line":199,"column":4},"end":{"line":199,"column":null}},"type":"if","locations":[{"start":{"line":199,"column":4},"end":{"line":199,"column":null}},{"start":{},"end":{}}],"line":199},"34":{"loc":{"start":{"line":204,"column":2},"end":{"line":204,"column":null}},"type":"if","locations":[{"start":{"line":204,"column":2},"end":{"line":204,"column":null}},{"start":{},"end":{}}],"line":204},"35":{"loc":{"start":{"line":205,"column":2},"end":{"line":205,"column":null}},"type":"if","locations":[{"start":{"line":205,"column":2},"end":{"line":205,"column":null}},{"start":{},"end":{}}],"line":205},"36":{"loc":{"start":{"line":209,"column":7},"end":{"line":229,"column":null}},"type":"cond-expr","locations":[{"start":{"line":210,"column":8},"end":{"line":210,"column":null}},{"start":{"line":212,"column":8},"end":{"line":229,"column":null}}],"line":209},"37":{"loc":{"start":{"line":224,"column":11},"end":{"line":227,"column":null}},"type":"binary-expr","locations":[{"start":{"line":224,"column":11},"end":{"line":224,"column":null}},{"start":{"line":225,"column":12},"end":{"line":227,"column":null}}],"line":224},"38":{"loc":{"start":{"line":226,"column":15},"end":{"line":226,"column":null}},"type":"cond-expr","locations":[{"start":{"line":226,"column":29},"end":{"line":226,"column":49}},{"start":{"line":226,"column":49},"end":{"line":226,"column":null}}],"line":226}},"s":{"0":27,"1":27,"2":27,"3":27,"4":27,"5":27,"6":27,"7":27,"8":27,"9":27,"10":8,"11":1,"12":7,"13":7,"14":8,"15":8,"16":8,"17":8,"18":2,"19":6,"20":1,"21":8,"22":1,"23":8,"24":8,"25":0,"26":8,"27":0,"28":8,"29":0,"30":0,"31":8,"32":8,"33":8,"34":8,"35":8,"36":8,"37":7,"38":0,"39":7,"40":6,"41":1,"42":1,"43":5,"44":6,"45":6,"46":6,"47":1,"48":1,"49":1,"50":27,"51":7,"52":7,"53":27,"54":2,"55":2,"56":2,"57":27,"58":2,"59":2,"60":2,"61":3,"62":2,"63":0,"64":27,"65":1,"66":1,"67":1,"68":2,"69":1,"70":0,"71":27,"72":23,"73":3,"74":0,"75":3,"76":2,"77":2,"78":2,"79":2,"80":2,"81":1,"82":2,"83":2,"84":1,"85":0,"86":0,"87":0,"88":0,"89":0,"90":1,"91":1,"92":1,"93":1,"94":1,"95":23,"96":23,"97":23,"98":27,"99":24,"100":2,"101":2,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":24,"112":15,"113":15,"114":15,"115":24,"116":24,"117":10,"118":24,"119":24,"120":27,"121":13,"122":14,"123":14,"124":13,"125":21,"126":0},"f":{"0":27,"1":8,"2":7,"3":6,"4":1,"5":1,"6":7,"7":2,"8":2,"9":2,"10":3,"11":0,"12":1,"13":1,"14":2,"15":0,"16":23,"17":3,"18":2,"19":0,"20":1,"21":23,"22":24,"23":2,"24":2,"25":15,"26":24,"27":21,"28":0},"b":{"0":[27,27],"1":[1,7],"2":[2,6],"3":[1,5],"4":[1,7],"5":[0,8],"6":[0,8],"7":[0,8],"8":[8,0],"9":[8,0],"10":[0,7],"11":[1,5],"12":[2,0],"13":[2,1],"14":[1,1],"15":[0,3],"16":[2,1],"17":[2,0],"18":[1,1],"19":[0,1],"20":[0,0],"21":[1,0],"22":[1,0],"23":[1,1],"24":[1,1],"25":[1,0],"26":[1,1,1,1],"27":[1,0],"28":[1,1],"29":[1,0],"30":[1,1,1],"31":[1,0],"32":[15,0],"33":[10,14],"34":[13,14],"35":[1,13],"36":[0,13],"37":[13,13],"38":[1,12]},"meta":{"lastBranch":39,"lastFunction":29,"lastStatement":127,"seen":{"f:8:24:8:36":0,"s:9:26:9:Infinity":0,"s:10:21:10:Infinity":1,"s:11:19:11:Infinity":2,"b:11:19:11:49:11:49:11:Infinity":0,"s:13:24:13:Infinity":3,"s:14:28:14:Infinity":4,"s:15:36:15:Infinity":5,"s:16:28:16:Infinity":6,"s:17:24:17:Infinity":7,"s:18:40:18:Infinity":8,"s:20:21:87:Infinity":9,"f:20:21:20:22":1,"b:21:4:26:Infinity:23:11:26:Infinity":1,"s:21:4:26:Infinity":10,"s:22:6:22:Infinity":11,"s:24:6:24:Infinity":12,"s:25:6:25:Infinity":13,"s:27:4:27:Infinity":14,"s:29:14:29:Infinity":15,"s:30:19:30:Infinity":16,"b:32:4:36:Infinity:34:4:36:Infinity":2,"s:32:4:36:Infinity":17,"s:33:6:33:Infinity":18,"b:34:4:36:Infinity:undefined:undefined:undefined:undefined":3,"s:34:4:36:Infinity":19,"s:35:6:35:Infinity":20,"b:38:4:40:Infinity:undefined:undefined:undefined:undefined":4,"s:38:4:40:Infinity":21,"s:39:6:39:Infinity":22,"s:43:24:43:Infinity":23,"b:44:4:46:Infinity:undefined:undefined:undefined:undefined":5,"s:44:4:46:Infinity":24,"s:45:6:45:Infinity":25,"b:48:4:58:Infinity:50:4:58:Infinity":6,"s:48:4:58:Infinity":26,"s:49:6:49:Infinity":27,"b:50:4:58:Infinity:53:11:58:Infinity":7,"s:50:4:58:Infinity":28,"s:51:6:51:Infinity":29,"s:52:6:52:Infinity":30,"b:55:6:57:Infinity:undefined:undefined:undefined:undefined":8,"s:55:6:57:Infinity":31,"s:56:8:56:Infinity":32,"s:60:24:60:Infinity":33,"b:61:4:63:Infinity:undefined:undefined:undefined:undefined":9,"s:61:4:63:Infinity":34,"s:62:6:62:Infinity":35,"s:65:4:86:Infinity":36,"f:66:12:66:13":2,"b:67:8:69:Infinity:undefined:undefined:undefined:undefined":10,"s:67:8:69:Infinity":37,"s:68:10:68:Infinity":38,"s:70:8:70:Infinity":39,"f:72:12:72:13":3,"b:73:8:77:Infinity:75:15:77:Infinity":11,"s:73:8:77:Infinity":40,"s:74:10:74:Infinity":41,"f:74:19:74:20":4,"s:74:29:74:47":42,"s:76:10:76:Infinity":43,"s:78:8:78:Infinity":44,"s:79:8:79:Infinity":45,"s:80:8:80:Infinity":46,"f:82:13:82:14":5,"s:83:8:83:Infinity":47,"s:84:8:84:Infinity":48,"s:85:8:85:Infinity":49,"s:89:2:92:Infinity":50,"f:89:12:89:18":6,"s:90:4:90:Infinity":51,"s:91:4:91:Infinity":52,"s:95:23:100:Infinity":53,"f:95:23:95:24":7,"s:96:20:96:Infinity":54,"b:97:4:99:Infinity:undefined:undefined:undefined:undefined":12,"s:97:4:99:Infinity":55,"s:98:6:98:Infinity":56,"s:102:21:112:Infinity":57,"f:102:21:102:22":8,"s:103:24:103:Infinity":58,"s:105:4:105:Infinity":59,"f:105:13:105:14":9,"s:105:28:105:88":60,"f:105:42:105:43":10,"s:105:50:105:87":61,"b:105:71:105:85:105:85:105:87":13,"s:107:4:111:Infinity":62,"f:111:13:111:14":11,"s:111:22:111:63":63,"s:114:21:124:Infinity":64,"f:114:21:114:22":12,"s:115:24:115:Infinity":65,"s:117:4:117:Infinity":66,"f:117:13:117:14":13,"s:117:28:117:88":67,"f:117:42:117:43":14,"s:117:50:117:87":68,"b:117:71:117:85:117:85:117:87":14,"s:119:4:123:Infinity":69,"f:123:13:123:14":15,"s:123:22:123:65":70,"s:126:2:162:Infinity":71,"f:126:12:126:18":16,"s:127:26:158:Infinity":72,"f:127:26:127:27":17,"b:128:6:128:Infinity:undefined:undefined:undefined:undefined":15,"s:128:6:128:Infinity":73,"s:128:30:128:Infinity":74,"b:130:6:157:Infinity:142:6:157:Infinity":16,"s:130:6:157:Infinity":75,"s:131:8:141:Infinity":76,"f:131:25:131:26":18,"s:132:28:132:Infinity":77,"b:133:10:139:Infinity:undefined:undefined:undefined:undefined":17,"s:133:10:139:Infinity":78,"s:134:25:134:Infinity":79,"b:135:12:137:Infinity:undefined:undefined:undefined:undefined":18,"s:135:12:137:Infinity":80,"s:136:14:136:Infinity":81,"s:138:12:138:Infinity":82,"s:140:10:140:Infinity":83,"b:142:6:157:Infinity:150:6:157:Infinity":19,"s:142:6:157:Infinity":84,"s:143:8:149:Infinity":85,"f:143:25:143:26":19,"s:144:28:144:Infinity":86,"b:145:10:147:Infinity:undefined:undefined:undefined:undefined":20,"s:145:10:147:Infinity":87,"s:146:12:146:Infinity":88,"s:148:10:148:Infinity":89,"b:150:6:157:Infinity:undefined:undefined:undefined:undefined":21,"s:150:6:157:Infinity":90,"s:151:8:156:Infinity":91,"f:151:25:151:26":20,"b:152:10:154:Infinity:undefined:undefined:undefined:undefined":22,"s:152:10:154:Infinity":92,"b:152:14:152:35:152:35:152:64":23,"s:153:12:153:Infinity":93,"s:155:10:155:Infinity":94,"s:160:4:160:Infinity":95,"s:161:4:161:Infinity":96,"f:161:11:161:17":21,"s:161:17:161:Infinity":97,"s:166:2:202:Infinity":98,"f:166:12:166:18":22,"s:167:21:191:Infinity":99,"f:168:6:168:7":23,"s:169:8:188:Infinity":100,"f:169:24:169:25":24,"b:171:10:176:Infinity:undefined:undefined:undefined:undefined":24,"s:171:10:176:Infinity":101,"b:172:12:174:Infinity:undefined:undefined:undefined:undefined":25,"s:172:12:174:Infinity":102,"b:172:16:172:40:172:40:172:56:172:56:172:67:172:67:172:85":26,"s:173:14:173:Infinity":103,"s:175:12:175:Infinity":104,"b:179:10:187:Infinity:undefined:undefined:undefined:undefined":27,"s:179:10:187:Infinity":105,"b:179:14:179:39:179:39:179:73":28,"s:180:26:180:Infinity":106,"b:181:12:186:Infinity:undefined:undefined:undefined:undefined":29,"s:181:12:186:Infinity":107,"b:181:16:181:33:181:33:181:47:181:47:181:69":30,"s:182:27:182:Infinity":108,"b:183:14:185:Infinity:undefined:undefined:undefined:undefined":31,"s:183:14:185:Infinity":109,"s:184:16:184:Infinity":110,"s:193:4:196:Infinity":111,"f:193:18:193:19":25,"s:194:17:194:Infinity":112,"b:195:6:195:Infinity:undefined:undefined:undefined:undefined":32,"s:195:6:195:Infinity":113,"s:195:14:195:Infinity":114,"s:198:21:198:Infinity":115,"b:199:4:199:Infinity:undefined:undefined:undefined:undefined":33,"s:199:4:199:Infinity":116,"s:199:18:199:Infinity":117,"s:201:4:201:Infinity":118,"f:201:11:201:17":26,"s:201:17:201:Infinity":119,"b:204:2:204:Infinity:undefined:undefined:undefined:undefined":34,"s:204:2:204:Infinity":120,"s:204:15:204:Infinity":121,"b:205:2:205:Infinity:undefined:undefined:undefined:undefined":35,"s:205:2:205:Infinity":122,"s:205:13:205:Infinity":123,"s:207:2:231:Infinity":124,"b:210:8:210:Infinity:212:8:229:Infinity":36,"f:213:21:213:22":27,"s:214:12:222:Infinity":125,"f:219:23:219:29":28,"s:219:29:219:Infinity":126,"b:224:11:224:Infinity:225:12:227:Infinity":37,"b:226:29:226:49:226:49:226:Infinity":38}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx","statementMap":{"0":{"start":{"line":9,"column":26},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":21},"end":{"line":10,"column":null}},"2":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"3":{"start":{"line":13,"column":24},"end":{"line":13,"column":null}},"4":{"start":{"line":14,"column":28},"end":{"line":14,"column":null}},"5":{"start":{"line":15,"column":36},"end":{"line":15,"column":null}},"6":{"start":{"line":16,"column":28},"end":{"line":16,"column":null}},"7":{"start":{"line":17,"column":24},"end":{"line":17,"column":null}},"8":{"start":{"line":18,"column":40},"end":{"line":18,"column":null}},"9":{"start":{"line":20,"column":21},"end":{"line":87,"column":null}},"10":{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},"11":{"start":{"line":22,"column":6},"end":{"line":22,"column":null}},"12":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"13":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"14":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"15":{"start":{"line":29,"column":14},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":19},"end":{"line":30,"column":null}},"17":{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},"18":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"19":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"20":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"21":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"22":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"23":{"start":{"line":43,"column":24},"end":{"line":43,"column":null}},"24":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"25":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"26":{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},"27":{"start":{"line":49,"column":6},"end":{"line":49,"column":null}},"28":{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},"29":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"30":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"31":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"32":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"33":{"start":{"line":60,"column":24},"end":{"line":60,"column":null}},"34":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"35":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"36":{"start":{"line":65,"column":4},"end":{"line":86,"column":null}},"37":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"38":{"start":{"line":68,"column":10},"end":{"line":68,"column":null}},"39":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"40":{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},"41":{"start":{"line":74,"column":10},"end":{"line":74,"column":null}},"42":{"start":{"line":74,"column":29},"end":{"line":74,"column":47}},"43":{"start":{"line":76,"column":10},"end":{"line":76,"column":null}},"44":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"45":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"46":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"47":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"48":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"49":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"50":{"start":{"line":89,"column":2},"end":{"line":93,"column":null}},"51":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"52":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"53":{"start":{"line":96,"column":23},"end":{"line":101,"column":null}},"54":{"start":{"line":97,"column":20},"end":{"line":97,"column":null}},"55":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"56":{"start":{"line":99,"column":6},"end":{"line":99,"column":null}},"57":{"start":{"line":103,"column":21},"end":{"line":113,"column":null}},"58":{"start":{"line":104,"column":24},"end":{"line":104,"column":null}},"59":{"start":{"line":106,"column":4},"end":{"line":106,"column":null}},"60":{"start":{"line":106,"column":28},"end":{"line":106,"column":88}},"61":{"start":{"line":106,"column":50},"end":{"line":106,"column":87}},"62":{"start":{"line":108,"column":4},"end":{"line":112,"column":null}},"63":{"start":{"line":112,"column":22},"end":{"line":112,"column":63}},"64":{"start":{"line":115,"column":21},"end":{"line":125,"column":null}},"65":{"start":{"line":116,"column":24},"end":{"line":116,"column":null}},"66":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"67":{"start":{"line":118,"column":28},"end":{"line":118,"column":88}},"68":{"start":{"line":118,"column":50},"end":{"line":118,"column":87}},"69":{"start":{"line":120,"column":4},"end":{"line":124,"column":null}},"70":{"start":{"line":124,"column":22},"end":{"line":124,"column":65}},"71":{"start":{"line":127,"column":2},"end":{"line":171,"column":null}},"72":{"start":{"line":128,"column":26},"end":{"line":166,"column":null}},"73":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"74":{"start":{"line":129,"column":30},"end":{"line":129,"column":null}},"75":{"start":{"line":131,"column":6},"end":{"line":165,"column":null}},"76":{"start":{"line":132,"column":8},"end":{"line":149,"column":null}},"77":{"start":{"line":133,"column":28},"end":{"line":133,"column":null}},"78":{"start":{"line":134,"column":10},"end":{"line":140,"column":null}},"79":{"start":{"line":135,"column":25},"end":{"line":135,"column":null}},"80":{"start":{"line":136,"column":12},"end":{"line":138,"column":null}},"81":{"start":{"line":137,"column":14},"end":{"line":137,"column":null}},"82":{"start":{"line":139,"column":12},"end":{"line":139,"column":null}},"83":{"start":{"line":144,"column":10},"end":{"line":146,"column":null}},"84":{"start":{"line":145,"column":12},"end":{"line":145,"column":null}},"85":{"start":{"line":148,"column":10},"end":{"line":148,"column":null}},"86":{"start":{"line":150,"column":6},"end":{"line":165,"column":null}},"87":{"start":{"line":151,"column":8},"end":{"line":157,"column":null}},"88":{"start":{"line":152,"column":28},"end":{"line":152,"column":null}},"89":{"start":{"line":153,"column":10},"end":{"line":155,"column":null}},"90":{"start":{"line":154,"column":12},"end":{"line":154,"column":null}},"91":{"start":{"line":156,"column":10},"end":{"line":156,"column":null}},"92":{"start":{"line":158,"column":6},"end":{"line":165,"column":null}},"93":{"start":{"line":159,"column":8},"end":{"line":164,"column":null}},"94":{"start":{"line":160,"column":10},"end":{"line":162,"column":null}},"95":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"96":{"start":{"line":163,"column":10},"end":{"line":163,"column":null}},"97":{"start":{"line":168,"column":4},"end":{"line":168,"column":null}},"98":{"start":{"line":169,"column":4},"end":{"line":169,"column":null}},"99":{"start":{"line":169,"column":17},"end":{"line":169,"column":null}},"100":{"start":{"line":175,"column":2},"end":{"line":220,"column":null}},"101":{"start":{"line":177,"column":25},"end":{"line":193,"column":null}},"102":{"start":{"line":179,"column":8},"end":{"line":190,"column":null}},"103":{"start":{"line":181,"column":10},"end":{"line":189,"column":null}},"104":{"start":{"line":182,"column":26},"end":{"line":182,"column":null}},"105":{"start":{"line":183,"column":12},"end":{"line":188,"column":null}},"106":{"start":{"line":184,"column":27},"end":{"line":184,"column":null}},"107":{"start":{"line":185,"column":14},"end":{"line":187,"column":null}},"108":{"start":{"line":186,"column":16},"end":{"line":186,"column":null}},"109":{"start":{"line":196,"column":29},"end":{"line":205,"column":null}},"110":{"start":{"line":198,"column":8},"end":{"line":202,"column":null}},"111":{"start":{"line":199,"column":10},"end":{"line":201,"column":null}},"112":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"113":{"start":{"line":207,"column":4},"end":{"line":210,"column":null}},"114":{"start":{"line":208,"column":17},"end":{"line":208,"column":null}},"115":{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},"116":{"start":{"line":209,"column":14},"end":{"line":209,"column":null}},"117":{"start":{"line":212,"column":21},"end":{"line":212,"column":null}},"118":{"start":{"line":213,"column":4},"end":{"line":213,"column":null}},"119":{"start":{"line":213,"column":18},"end":{"line":213,"column":null}},"120":{"start":{"line":215,"column":4},"end":{"line":218,"column":null}},"121":{"start":{"line":216,"column":6},"end":{"line":216,"column":null}},"122":{"start":{"line":217,"column":6},"end":{"line":217,"column":null}},"123":{"start":{"line":222,"column":2},"end":{"line":222,"column":null}},"124":{"start":{"line":222,"column":15},"end":{"line":222,"column":null}},"125":{"start":{"line":223,"column":2},"end":{"line":223,"column":null}},"126":{"start":{"line":223,"column":13},"end":{"line":223,"column":null}},"127":{"start":{"line":225,"column":2},"end":{"line":249,"column":null}},"128":{"start":{"line":232,"column":12},"end":{"line":240,"column":null}},"129":{"start":{"line":237,"column":29},"end":{"line":237,"column":null}}},"fnMap":{"0":{"name":"FeedItems","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":36}},"loc":{"start":{"line":8,"column":36},"end":{"line":251,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":21},"end":{"line":20,"column":22}},"loc":{"start":{"line":20,"column":41},"end":{"line":87,"column":null}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":66,"column":12},"end":{"line":66,"column":13}},"loc":{"start":{"line":66,"column":21},"end":{"line":71,"column":7}},"line":66},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":12},"end":{"line":72,"column":13}},"loc":{"start":{"line":72,"column":22},"end":{"line":81,"column":7}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":74,"column":19},"end":{"line":74,"column":20}},"loc":{"start":{"line":74,"column":29},"end":{"line":74,"column":47}},"line":74},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":13},"end":{"line":82,"column":14}},"loc":{"start":{"line":82,"column":22},"end":{"line":86,"column":7}},"line":82},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":12},"end":{"line":89,"column":18}},"loc":{"start":{"line":89,"column":18},"end":{"line":93,"column":5}},"line":89},"7":{"name":"(anonymous_7)","decl":{"start":{"line":96,"column":23},"end":{"line":96,"column":24}},"loc":{"start":{"line":96,"column":42},"end":{"line":101,"column":null}},"line":96},"8":{"name":"(anonymous_8)","decl":{"start":{"line":103,"column":21},"end":{"line":103,"column":22}},"loc":{"start":{"line":103,"column":37},"end":{"line":113,"column":null}},"line":103},"9":{"name":"(anonymous_9)","decl":{"start":{"line":106,"column":13},"end":{"line":106,"column":14}},"loc":{"start":{"line":106,"column":28},"end":{"line":106,"column":88}},"line":106},"10":{"name":"(anonymous_10)","decl":{"start":{"line":106,"column":42},"end":{"line":106,"column":43}},"loc":{"start":{"line":106,"column":50},"end":{"line":106,"column":87}},"line":106},"11":{"name":"(anonymous_11)","decl":{"start":{"line":112,"column":13},"end":{"line":112,"column":14}},"loc":{"start":{"line":112,"column":22},"end":{"line":112,"column":63}},"line":112},"12":{"name":"(anonymous_12)","decl":{"start":{"line":115,"column":21},"end":{"line":115,"column":22}},"loc":{"start":{"line":115,"column":37},"end":{"line":125,"column":null}},"line":115},"13":{"name":"(anonymous_13)","decl":{"start":{"line":118,"column":13},"end":{"line":118,"column":14}},"loc":{"start":{"line":118,"column":28},"end":{"line":118,"column":88}},"line":118},"14":{"name":"(anonymous_14)","decl":{"start":{"line":118,"column":42},"end":{"line":118,"column":43}},"loc":{"start":{"line":118,"column":50},"end":{"line":118,"column":87}},"line":118},"15":{"name":"(anonymous_15)","decl":{"start":{"line":124,"column":13},"end":{"line":124,"column":14}},"loc":{"start":{"line":124,"column":22},"end":{"line":124,"column":65}},"line":124},"16":{"name":"(anonymous_16)","decl":{"start":{"line":127,"column":12},"end":{"line":127,"column":18}},"loc":{"start":{"line":127,"column":18},"end":{"line":171,"column":5}},"line":127},"17":{"name":"(anonymous_17)","decl":{"start":{"line":128,"column":26},"end":{"line":128,"column":27}},"loc":{"start":{"line":128,"column":48},"end":{"line":166,"column":null}},"line":128},"18":{"name":"(anonymous_18)","decl":{"start":{"line":132,"column":25},"end":{"line":132,"column":26}},"loc":{"start":{"line":132,"column":35},"end":{"line":149,"column":9}},"line":132},"19":{"name":"(anonymous_19)","decl":{"start":{"line":151,"column":25},"end":{"line":151,"column":26}},"loc":{"start":{"line":151,"column":35},"end":{"line":157,"column":9}},"line":151},"20":{"name":"(anonymous_20)","decl":{"start":{"line":159,"column":25},"end":{"line":159,"column":26}},"loc":{"start":{"line":159,"column":43},"end":{"line":164,"column":9}},"line":159},"21":{"name":"(anonymous_21)","decl":{"start":{"line":169,"column":11},"end":{"line":169,"column":17}},"loc":{"start":{"line":169,"column":17},"end":{"line":169,"column":null}},"line":169},"22":{"name":"(anonymous_22)","decl":{"start":{"line":175,"column":12},"end":{"line":175,"column":18}},"loc":{"start":{"line":175,"column":18},"end":{"line":220,"column":5}},"line":175},"23":{"name":"(anonymous_23)","decl":{"start":{"line":178,"column":6},"end":{"line":178,"column":7}},"loc":{"start":{"line":178,"column":19},"end":{"line":191,"column":null}},"line":178},"24":{"name":"(anonymous_24)","decl":{"start":{"line":179,"column":24},"end":{"line":179,"column":25}},"loc":{"start":{"line":179,"column":35},"end":{"line":190,"column":9}},"line":179},"25":{"name":"(anonymous_25)","decl":{"start":{"line":197,"column":6},"end":{"line":197,"column":7}},"loc":{"start":{"line":197,"column":19},"end":{"line":203,"column":null}},"line":197},"26":{"name":"(anonymous_26)","decl":{"start":{"line":198,"column":24},"end":{"line":198,"column":25}},"loc":{"start":{"line":198,"column":35},"end":{"line":202,"column":9}},"line":198},"27":{"name":"(anonymous_27)","decl":{"start":{"line":207,"column":18},"end":{"line":207,"column":19}},"loc":{"start":{"line":207,"column":32},"end":{"line":210,"column":5}},"line":207},"28":{"name":"(anonymous_28)","decl":{"start":{"line":215,"column":11},"end":{"line":215,"column":17}},"loc":{"start":{"line":215,"column":17},"end":{"line":218,"column":null}},"line":215},"29":{"name":"(anonymous_29)","decl":{"start":{"line":231,"column":21},"end":{"line":231,"column":22}},"loc":{"start":{"line":232,"column":12},"end":{"line":240,"column":null}},"line":232},"30":{"name":"(anonymous_30)","decl":{"start":{"line":237,"column":23},"end":{"line":237,"column":29}},"loc":{"start":{"line":237,"column":29},"end":{"line":237,"column":null}},"line":237}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"type":"binary-expr","locations":[{"start":{"line":11,"column":19},"end":{"line":11,"column":49}},{"start":{"line":11,"column":49},"end":{"line":11,"column":null}}],"line":11},"1":{"loc":{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},{"start":{"line":23,"column":11},"end":{"line":26,"column":null}}],"line":21},"2":{"loc":{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},{"start":{"line":34,"column":4},"end":{"line":36,"column":null}}],"line":32},"3":{"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":34},"4":{"loc":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":38},"5":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},{"start":{},"end":{}}],"line":44},"6":{"loc":{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},{"start":{"line":50,"column":4},"end":{"line":58,"column":null}}],"line":48},"7":{"loc":{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},{"start":{"line":53,"column":11},"end":{"line":58,"column":null}}],"line":50},"8":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":55},"9":{"loc":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},{"start":{},"end":{}}],"line":61},"10":{"loc":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":67},"11":{"loc":{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},{"start":{"line":75,"column":15},"end":{"line":77,"column":null}}],"line":73},"12":{"loc":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},{"start":{},"end":{}}],"line":98},"13":{"loc":{"start":{"line":106,"column":50},"end":{"line":106,"column":87}},"type":"cond-expr","locations":[{"start":{"line":106,"column":71},"end":{"line":106,"column":85}},{"start":{"line":106,"column":85},"end":{"line":106,"column":87}}],"line":106},"14":{"loc":{"start":{"line":118,"column":50},"end":{"line":118,"column":87}},"type":"cond-expr","locations":[{"start":{"line":118,"column":71},"end":{"line":118,"column":85}},{"start":{"line":118,"column":85},"end":{"line":118,"column":87}}],"line":118},"15":{"loc":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"type":"if","locations":[{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},{"start":{},"end":{}}],"line":129},"16":{"loc":{"start":{"line":131,"column":6},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":6},"end":{"line":165,"column":null}},{"start":{"line":150,"column":6},"end":{"line":165,"column":null}}],"line":131},"17":{"loc":{"start":{"line":134,"column":10},"end":{"line":140,"column":null}},"type":"if","locations":[{"start":{"line":134,"column":10},"end":{"line":140,"column":null}},{"start":{},"end":{}}],"line":134},"18":{"loc":{"start":{"line":136,"column":12},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":136,"column":12},"end":{"line":138,"column":null}},{"start":{},"end":{}}],"line":136},"19":{"loc":{"start":{"line":144,"column":10},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":144,"column":10},"end":{"line":146,"column":null}},{"start":{},"end":{}}],"line":144},"20":{"loc":{"start":{"line":144,"column":14},"end":{"line":144,"column":73}},"type":"binary-expr","locations":[{"start":{"line":144,"column":14},"end":{"line":144,"column":48}},{"start":{"line":144,"column":48},"end":{"line":144,"column":59}},{"start":{"line":144,"column":59},"end":{"line":144,"column":73}}],"line":144},"21":{"loc":{"start":{"line":150,"column":6},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":6},"end":{"line":165,"column":null}},{"start":{"line":158,"column":6},"end":{"line":165,"column":null}}],"line":150},"22":{"loc":{"start":{"line":153,"column":10},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":153,"column":10},"end":{"line":155,"column":null}},{"start":{},"end":{}}],"line":153},"23":{"loc":{"start":{"line":158,"column":6},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":158,"column":6},"end":{"line":165,"column":null}},{"start":{},"end":{}}],"line":158},"24":{"loc":{"start":{"line":160,"column":10},"end":{"line":162,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":10},"end":{"line":162,"column":null}},{"start":{},"end":{}}],"line":160},"25":{"loc":{"start":{"line":160,"column":14},"end":{"line":160,"column":64}},"type":"binary-expr","locations":[{"start":{"line":160,"column":14},"end":{"line":160,"column":35}},{"start":{"line":160,"column":35},"end":{"line":160,"column":64}}],"line":160},"26":{"loc":{"start":{"line":181,"column":10},"end":{"line":189,"column":null}},"type":"if","locations":[{"start":{"line":181,"column":10},"end":{"line":189,"column":null}},{"start":{},"end":{}}],"line":181},"27":{"loc":{"start":{"line":181,"column":14},"end":{"line":181,"column":73}},"type":"binary-expr","locations":[{"start":{"line":181,"column":14},"end":{"line":181,"column":39}},{"start":{"line":181,"column":39},"end":{"line":181,"column":73}}],"line":181},"28":{"loc":{"start":{"line":183,"column":12},"end":{"line":188,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":12},"end":{"line":188,"column":null}},{"start":{},"end":{}}],"line":183},"29":{"loc":{"start":{"line":183,"column":16},"end":{"line":183,"column":69}},"type":"binary-expr","locations":[{"start":{"line":183,"column":16},"end":{"line":183,"column":33}},{"start":{"line":183,"column":33},"end":{"line":183,"column":47}},{"start":{"line":183,"column":47},"end":{"line":183,"column":69}}],"line":183},"30":{"loc":{"start":{"line":185,"column":14},"end":{"line":187,"column":null}},"type":"if","locations":[{"start":{"line":185,"column":14},"end":{"line":187,"column":null}},{"start":{},"end":{}}],"line":185},"31":{"loc":{"start":{"line":199,"column":10},"end":{"line":201,"column":null}},"type":"if","locations":[{"start":{"line":199,"column":10},"end":{"line":201,"column":null}},{"start":{},"end":{}}],"line":199},"32":{"loc":{"start":{"line":199,"column":14},"end":{"line":199,"column":83}},"type":"binary-expr","locations":[{"start":{"line":199,"column":14},"end":{"line":199,"column":38}},{"start":{"line":199,"column":38},"end":{"line":199,"column":54}},{"start":{"line":199,"column":54},"end":{"line":199,"column":65}},{"start":{"line":199,"column":65},"end":{"line":199,"column":83}}],"line":199},"33":{"loc":{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},{"start":{},"end":{}}],"line":209},"34":{"loc":{"start":{"line":213,"column":4},"end":{"line":213,"column":null}},"type":"if","locations":[{"start":{"line":213,"column":4},"end":{"line":213,"column":null}},{"start":{},"end":{}}],"line":213},"35":{"loc":{"start":{"line":222,"column":2},"end":{"line":222,"column":null}},"type":"if","locations":[{"start":{"line":222,"column":2},"end":{"line":222,"column":null}},{"start":{},"end":{}}],"line":222},"36":{"loc":{"start":{"line":223,"column":2},"end":{"line":223,"column":null}},"type":"if","locations":[{"start":{"line":223,"column":2},"end":{"line":223,"column":null}},{"start":{},"end":{}}],"line":223},"37":{"loc":{"start":{"line":227,"column":7},"end":{"line":247,"column":null}},"type":"cond-expr","locations":[{"start":{"line":228,"column":8},"end":{"line":228,"column":null}},{"start":{"line":230,"column":8},"end":{"line":247,"column":null}}],"line":227},"38":{"loc":{"start":{"line":242,"column":11},"end":{"line":245,"column":null}},"type":"binary-expr","locations":[{"start":{"line":242,"column":11},"end":{"line":242,"column":null}},{"start":{"line":243,"column":12},"end":{"line":245,"column":null}}],"line":242},"39":{"loc":{"start":{"line":244,"column":15},"end":{"line":244,"column":null}},"type":"cond-expr","locations":[{"start":{"line":244,"column":29},"end":{"line":244,"column":49}},{"start":{"line":244,"column":49},"end":{"line":244,"column":null}}],"line":244}},"s":{"0":36,"1":36,"2":36,"3":36,"4":36,"5":36,"6":36,"7":36,"8":36,"9":36,"10":11,"11":3,"12":8,"13":8,"14":11,"15":11,"16":11,"17":11,"18":2,"19":9,"20":1,"21":11,"22":3,"23":11,"24":11,"25":0,"26":11,"27":0,"28":11,"29":0,"30":0,"31":11,"32":11,"33":11,"34":11,"35":11,"36":11,"37":10,"38":0,"39":10,"40":9,"41":3,"42":3,"43":6,"44":9,"45":9,"46":9,"47":1,"48":1,"49":1,"50":36,"51":8,"52":8,"53":36,"54":5,"55":5,"56":5,"57":36,"58":2,"59":2,"60":2,"61":3,"62":2,"63":0,"64":36,"65":1,"66":1,"67":1,"68":2,"69":1,"70":0,"71":36,"72":31,"73":6,"74":0,"75":6,"76":5,"77":5,"78":5,"79":5,"80":5,"81":1,"82":5,"83":5,"84":2,"85":5,"86":1,"87":0,"88":0,"89":0,"90":0,"91":0,"92":1,"93":1,"94":1,"95":1,"96":1,"97":31,"98":31,"99":31,"100":36,"101":31,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":31,"110":1,"111":1,"112":1,"113":31,"114":31,"115":31,"116":31,"117":31,"118":31,"119":15,"120":31,"121":31,"122":31,"123":36,"124":15,"125":21,"126":21,"127":20,"128":44,"129":0},"f":{"0":36,"1":11,"2":10,"3":9,"4":3,"5":1,"6":8,"7":5,"8":2,"9":2,"10":3,"11":0,"12":1,"13":1,"14":2,"15":0,"16":31,"17":6,"18":5,"19":0,"20":1,"21":31,"22":31,"23":1,"24":1,"25":1,"26":1,"27":31,"28":31,"29":44,"30":0},"b":{"0":[36,36],"1":[3,8],"2":[2,9],"3":[1,8],"4":[3,8],"5":[0,11],"6":[0,11],"7":[0,11],"8":[11,0],"9":[11,0],"10":[0,10],"11":[3,6],"12":[5,0],"13":[2,1],"14":[1,1],"15":[0,6],"16":[5,1],"17":[5,0],"18":[1,4],"19":[2,3],"20":[5,2,2],"21":[0,1],"22":[0,0],"23":[1,0],"24":[1,0],"25":[1,1],"26":[1,0],"27":[1,1],"28":[1,0],"29":[1,1,1],"30":[1,0],"31":[1,0],"32":[1,1,1,1],"33":[31,0],"34":[15,16],"35":[15,21],"36":[1,20],"37":[0,20],"38":[20,20],"39":[5,15]},"meta":{"lastBranch":40,"lastFunction":31,"lastStatement":130,"seen":{"f:8:24:8:36":0,"s:9:26:9:Infinity":0,"s:10:21:10:Infinity":1,"s:11:19:11:Infinity":2,"b:11:19:11:49:11:49:11:Infinity":0,"s:13:24:13:Infinity":3,"s:14:28:14:Infinity":4,"s:15:36:15:Infinity":5,"s:16:28:16:Infinity":6,"s:17:24:17:Infinity":7,"s:18:40:18:Infinity":8,"s:20:21:87:Infinity":9,"f:20:21:20:22":1,"b:21:4:26:Infinity:23:11:26:Infinity":1,"s:21:4:26:Infinity":10,"s:22:6:22:Infinity":11,"s:24:6:24:Infinity":12,"s:25:6:25:Infinity":13,"s:27:4:27:Infinity":14,"s:29:14:29:Infinity":15,"s:30:19:30:Infinity":16,"b:32:4:36:Infinity:34:4:36:Infinity":2,"s:32:4:36:Infinity":17,"s:33:6:33:Infinity":18,"b:34:4:36:Infinity:undefined:undefined:undefined:undefined":3,"s:34:4:36:Infinity":19,"s:35:6:35:Infinity":20,"b:38:4:40:Infinity:undefined:undefined:undefined:undefined":4,"s:38:4:40:Infinity":21,"s:39:6:39:Infinity":22,"s:43:24:43:Infinity":23,"b:44:4:46:Infinity:undefined:undefined:undefined:undefined":5,"s:44:4:46:Infinity":24,"s:45:6:45:Infinity":25,"b:48:4:58:Infinity:50:4:58:Infinity":6,"s:48:4:58:Infinity":26,"s:49:6:49:Infinity":27,"b:50:4:58:Infinity:53:11:58:Infinity":7,"s:50:4:58:Infinity":28,"s:51:6:51:Infinity":29,"s:52:6:52:Infinity":30,"b:55:6:57:Infinity:undefined:undefined:undefined:undefined":8,"s:55:6:57:Infinity":31,"s:56:8:56:Infinity":32,"s:60:24:60:Infinity":33,"b:61:4:63:Infinity:undefined:undefined:undefined:undefined":9,"s:61:4:63:Infinity":34,"s:62:6:62:Infinity":35,"s:65:4:86:Infinity":36,"f:66:12:66:13":2,"b:67:8:69:Infinity:undefined:undefined:undefined:undefined":10,"s:67:8:69:Infinity":37,"s:68:10:68:Infinity":38,"s:70:8:70:Infinity":39,"f:72:12:72:13":3,"b:73:8:77:Infinity:75:15:77:Infinity":11,"s:73:8:77:Infinity":40,"s:74:10:74:Infinity":41,"f:74:19:74:20":4,"s:74:29:74:47":42,"s:76:10:76:Infinity":43,"s:78:8:78:Infinity":44,"s:79:8:79:Infinity":45,"s:80:8:80:Infinity":46,"f:82:13:82:14":5,"s:83:8:83:Infinity":47,"s:84:8:84:Infinity":48,"s:85:8:85:Infinity":49,"s:89:2:93:Infinity":50,"f:89:12:89:18":6,"s:90:4:90:Infinity":51,"s:91:4:91:Infinity":52,"s:96:23:101:Infinity":53,"f:96:23:96:24":7,"s:97:20:97:Infinity":54,"b:98:4:100:Infinity:undefined:undefined:undefined:undefined":12,"s:98:4:100:Infinity":55,"s:99:6:99:Infinity":56,"s:103:21:113:Infinity":57,"f:103:21:103:22":8,"s:104:24:104:Infinity":58,"s:106:4:106:Infinity":59,"f:106:13:106:14":9,"s:106:28:106:88":60,"f:106:42:106:43":10,"s:106:50:106:87":61,"b:106:71:106:85:106:85:106:87":13,"s:108:4:112:Infinity":62,"f:112:13:112:14":11,"s:112:22:112:63":63,"s:115:21:125:Infinity":64,"f:115:21:115:22":12,"s:116:24:116:Infinity":65,"s:118:4:118:Infinity":66,"f:118:13:118:14":13,"s:118:28:118:88":67,"f:118:42:118:43":14,"s:118:50:118:87":68,"b:118:71:118:85:118:85:118:87":14,"s:120:4:124:Infinity":69,"f:124:13:124:14":15,"s:124:22:124:65":70,"s:127:2:171:Infinity":71,"f:127:12:127:18":16,"s:128:26:166:Infinity":72,"f:128:26:128:27":17,"b:129:6:129:Infinity:undefined:undefined:undefined:undefined":15,"s:129:6:129:Infinity":73,"s:129:30:129:Infinity":74,"b:131:6:165:Infinity:150:6:165:Infinity":16,"s:131:6:165:Infinity":75,"s:132:8:149:Infinity":76,"f:132:25:132:26":18,"s:133:28:133:Infinity":77,"b:134:10:140:Infinity:undefined:undefined:undefined:undefined":17,"s:134:10:140:Infinity":78,"s:135:25:135:Infinity":79,"b:136:12:138:Infinity:undefined:undefined:undefined:undefined":18,"s:136:12:138:Infinity":80,"s:137:14:137:Infinity":81,"s:139:12:139:Infinity":82,"b:144:10:146:Infinity:undefined:undefined:undefined:undefined":19,"s:144:10:146:Infinity":83,"b:144:14:144:48:144:48:144:59:144:59:144:73":20,"s:145:12:145:Infinity":84,"s:148:10:148:Infinity":85,"b:150:6:165:Infinity:158:6:165:Infinity":21,"s:150:6:165:Infinity":86,"s:151:8:157:Infinity":87,"f:151:25:151:26":19,"s:152:28:152:Infinity":88,"b:153:10:155:Infinity:undefined:undefined:undefined:undefined":22,"s:153:10:155:Infinity":89,"s:154:12:154:Infinity":90,"s:156:10:156:Infinity":91,"b:158:6:165:Infinity:undefined:undefined:undefined:undefined":23,"s:158:6:165:Infinity":92,"s:159:8:164:Infinity":93,"f:159:25:159:26":20,"b:160:10:162:Infinity:undefined:undefined:undefined:undefined":24,"s:160:10:162:Infinity":94,"b:160:14:160:35:160:35:160:64":25,"s:161:12:161:Infinity":95,"s:163:10:163:Infinity":96,"s:168:4:168:Infinity":97,"s:169:4:169:Infinity":98,"f:169:11:169:17":21,"s:169:17:169:Infinity":99,"s:175:2:220:Infinity":100,"f:175:12:175:18":22,"s:177:25:193:Infinity":101,"f:178:6:178:7":23,"s:179:8:190:Infinity":102,"f:179:24:179:25":24,"b:181:10:189:Infinity:undefined:undefined:undefined:undefined":26,"s:181:10:189:Infinity":103,"b:181:14:181:39:181:39:181:73":27,"s:182:26:182:Infinity":104,"b:183:12:188:Infinity:undefined:undefined:undefined:undefined":28,"s:183:12:188:Infinity":105,"b:183:16:183:33:183:33:183:47:183:47:183:69":29,"s:184:27:184:Infinity":106,"b:185:14:187:Infinity:undefined:undefined:undefined:undefined":30,"s:185:14:187:Infinity":107,"s:186:16:186:Infinity":108,"s:196:29:205:Infinity":109,"f:197:6:197:7":25,"s:198:8:202:Infinity":110,"f:198:24:198:25":26,"b:199:10:201:Infinity:undefined:undefined:undefined:undefined":31,"s:199:10:201:Infinity":111,"b:199:14:199:38:199:38:199:54:199:54:199:65:199:65:199:83":32,"s:200:12:200:Infinity":112,"s:207:4:210:Infinity":113,"f:207:18:207:19":27,"s:208:17:208:Infinity":114,"b:209:6:209:Infinity:undefined:undefined:undefined:undefined":33,"s:209:6:209:Infinity":115,"s:209:14:209:Infinity":116,"s:212:21:212:Infinity":117,"b:213:4:213:Infinity:undefined:undefined:undefined:undefined":34,"s:213:4:213:Infinity":118,"s:213:18:213:Infinity":119,"s:215:4:218:Infinity":120,"f:215:11:215:17":28,"s:216:6:216:Infinity":121,"s:217:6:217:Infinity":122,"b:222:2:222:Infinity:undefined:undefined:undefined:undefined":35,"s:222:2:222:Infinity":123,"s:222:15:222:Infinity":124,"b:223:2:223:Infinity:undefined:undefined:undefined:undefined":36,"s:223:2:223:Infinity":125,"s:223:13:223:Infinity":126,"s:225:2:249:Infinity":127,"b:228:8:228:Infinity:230:8:247:Infinity":37,"f:231:21:231:22":29,"s:232:12:240:Infinity":128,"f:237:23:237:29":30,"s:237:29:237:Infinity":129,"b:242:11:242:Infinity:243:12:245:Infinity":38,"b:244:29:244:49:244:49:244:Infinity":39}}}
,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx","statementMap":{"0":{"start":{"line":16,"column":24},"end":{"line":16,"column":null}},"1":{"start":{"line":17,"column":22},"end":{"line":17,"column":null}},"2":{"start":{"line":18,"column":28},"end":{"line":18,"column":null}},"3":{"start":{"line":19,"column":24},"end":{"line":19,"column":null}},"4":{"start":{"line":20,"column":40},"end":{"line":20,"column":null}},"5":{"start":{"line":21,"column":36},"end":{"line":21,"column":null}},"6":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":21},"end":{"line":23,"column":null}},"8":{"start":{"line":24,"column":8},"end":{"line":24,"column":null}},"9":{"start":{"line":25,"column":26},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":4},"end":{"line":29,"column":null}},"11":{"start":{"line":31,"column":23},"end":{"line":36,"column":null}},"12":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"13":{"start":{"line":33,"column":4},"end":{"line":35,"column":null}},"14":{"start":{"line":34,"column":6},"end":{"line":34,"column":null}},"15":{"start":{"line":38,"column":22},"end":{"line":40,"column":null}},"16":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"17":{"start":{"line":42,"column":2},"end":{"line":62,"column":null}},"18":{"start":{"line":43,"column":4},"end":{"line":61,"column":null}},"19":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"20":{"start":{"line":45,"column":21},"end":{"line":45,"column":null}},"21":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"22":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"23":{"start":{"line":49,"column":21},"end":{"line":49,"column":null}},"24":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"25":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"26":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"27":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"28":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"29":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"30":{"start":{"line":64,"column":2},"end":{"line":64,"column":null}},"31":{"start":{"line":64,"column":15},"end":{"line":64,"column":null}},"32":{"start":{"line":65,"column":2},"end":{"line":65,"column":null}},"33":{"start":{"line":65,"column":13},"end":{"line":65,"column":null}},"34":{"start":{"line":67,"column":23},"end":{"line":69,"column":null}},"35":{"start":{"line":68,"column":4},"end":{"line":68,"column":null}},"36":{"start":{"line":68,"column":60},"end":{"line":68,"column":95}},"37":{"start":{"line":71,"column":2},"end":{"line":183,"column":null}},"38":{"start":{"line":73,"column":42},"end":{"line":73,"column":68}},"39":{"start":{"line":83,"column":29},"end":{"line":83,"column":null}},"40":{"start":{"line":115,"column":12},"end":{"line":122,"column":null}},"41":{"start":{"line":137,"column":16},"end":{"line":144,"column":null}},"42":{"start":{"line":168,"column":27},"end":{"line":168,"column":null}},"43":{"start":{"line":175,"column":27},"end":{"line":175,"column":null}}},"fnMap":{"0":{"name":"FeedList","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":33}},"loc":{"start":{"line":15,"column":3},"end":{"line":185,"column":null}},"line":15},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":23},"end":{"line":31,"column":24}},"loc":{"start":{"line":31,"column":47},"end":{"line":36,"column":null}},"line":31},"2":{"name":"(anonymous_2)","decl":{"start":{"line":38,"column":22},"end":{"line":38,"column":28}},"loc":{"start":{"line":38,"column":28},"end":{"line":40,"column":null}},"line":38},"3":{"name":"(anonymous_3)","decl":{"start":{"line":42,"column":12},"end":{"line":42,"column":18}},"loc":{"start":{"line":42,"column":18},"end":{"line":62,"column":5}},"line":42},"4":{"name":"(anonymous_4)","decl":{"start":{"line":44,"column":34},"end":{"line":44,"column":35}},"loc":{"start":{"line":44,"column":43},"end":{"line":47,"column":7}},"line":44},"5":{"name":"(anonymous_5)","decl":{"start":{"line":48,"column":32},"end":{"line":48,"column":33}},"loc":{"start":{"line":48,"column":41},"end":{"line":51,"column":7}},"line":48},"6":{"name":"(anonymous_6)","decl":{"start":{"line":53,"column":12},"end":{"line":53,"column":13}},"loc":{"start":{"line":53,"column":39},"end":{"line":57,"column":7}},"line":53},"7":{"name":"(anonymous_7)","decl":{"start":{"line":58,"column":13},"end":{"line":58,"column":14}},"loc":{"start":{"line":58,"column":22},"end":{"line":61,"column":7}},"line":58},"8":{"name":"(anonymous_8)","decl":{"start":{"line":67,"column":23},"end":{"line":67,"column":29}},"loc":{"start":{"line":67,"column":29},"end":{"line":69,"column":null}},"line":67},"9":{"name":"(anonymous_9)","decl":{"start":{"line":68,"column":53},"end":{"line":68,"column":60}},"loc":{"start":{"line":68,"column":60},"end":{"line":68,"column":95}},"line":68},"10":{"name":"(anonymous_10)","decl":{"start":{"line":73,"column":36},"end":{"line":73,"column":42}},"loc":{"start":{"line":73,"column":42},"end":{"line":73,"column":68}},"line":73},"11":{"name":"(anonymous_11)","decl":{"start":{"line":83,"column":22},"end":{"line":83,"column":23}},"loc":{"start":{"line":83,"column":29},"end":{"line":83,"column":null}},"line":83},"12":{"name":"(anonymous_12)","decl":{"start":{"line":110,"column":21},"end":{"line":110,"column":27}},"loc":{"start":{"line":110,"column":27},"end":{"line":110,"column":32}},"line":110},"13":{"name":"(anonymous_13)","decl":{"start":{"line":114,"column":20},"end":{"line":114,"column":21}},"loc":{"start":{"line":115,"column":12},"end":{"line":122,"column":null}},"line":115},"14":{"name":"(anonymous_14)","decl":{"start":{"line":136,"column":25},"end":{"line":136,"column":26}},"loc":{"start":{"line":137,"column":16},"end":{"line":144,"column":null}},"line":137},"15":{"name":"(anonymous_15)","decl":{"start":{"line":168,"column":21},"end":{"line":168,"column":27}},"loc":{"start":{"line":168,"column":27},"end":{"line":168,"column":null}},"line":168},"16":{"name":"(anonymous_16)","decl":{"start":{"line":175,"column":21},"end":{"line":175,"column":27}},"loc":{"start":{"line":175,"column":27},"end":{"line":175,"column":null}},"line":175}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":4},"end":{"line":29,"column":null}},"type":"binary-expr","locations":[{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},{"start":{"line":29,"column":5},"end":{"line":29,"column":null}}],"line":28},"1":{"loc":{"start":{"line":29,"column":5},"end":{"line":29,"column":null}},"type":"cond-expr","locations":[{"start":{"line":29,"column":56},"end":{"line":29,"column":67}},{"start":{"line":29,"column":67},"end":{"line":29,"column":null}}],"line":29},"2":{"loc":{"start":{"line":29,"column":5},"end":{"line":29,"column":56}},"type":"binary-expr","locations":[{"start":{"line":29,"column":5},"end":{"line":29,"column":34}},{"start":{"line":29,"column":34},"end":{"line":29,"column":45}},{"start":{"line":29,"column":45},"end":{"line":29,"column":56}}],"line":29},"3":{"loc":{"start":{"line":33,"column":4},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":35,"column":null}},{"start":{},"end":{}}],"line":33},"4":{"loc":{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},"type":"if","locations":[{"start":{"line":45,"column":8},"end":{"line":45,"column":null}},{"start":{},"end":{}}],"line":45},"5":{"loc":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":49},"6":{"loc":{"start":{"line":64,"column":2},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":64},"7":{"loc":{"start":{"line":65,"column":2},"end":{"line":65,"column":null}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":65,"column":null}},{"start":{},"end":{}}],"line":65},"8":{"loc":{"start":{"line":92,"column":50},"end":{"line":92,"column":94}},"type":"cond-expr","locations":[{"start":{"line":92,"column":79},"end":{"line":92,"column":90}},{"start":{"line":92,"column":90},"end":{"line":92,"column":94}}],"line":92},"9":{"loc":{"start":{"line":97,"column":47},"end":{"line":97,"column":88}},"type":"cond-expr","locations":[{"start":{"line":97,"column":73},"end":{"line":97,"column":84}},{"start":{"line":97,"column":84},"end":{"line":97,"column":88}}],"line":97},"10":{"loc":{"start":{"line":102,"column":51},"end":{"line":102,"column":96}},"type":"cond-expr","locations":[{"start":{"line":102,"column":81},"end":{"line":102,"column":92}},{"start":{"line":102,"column":92},"end":{"line":102,"column":96}}],"line":102},"11":{"loc":{"start":{"line":118,"column":39},"end":{"line":118,"column":76}},"type":"cond-expr","locations":[{"start":{"line":118,"column":63},"end":{"line":118,"column":74}},{"start":{"line":118,"column":74},"end":{"line":118,"column":76}}],"line":118},"12":{"loc":{"start":{"line":131,"column":9},"end":{"line":146,"column":null}},"type":"binary-expr","locations":[{"start":{"line":131,"column":9},"end":{"line":131,"column":null}},{"start":{"line":132,"column":11},"end":{"line":146,"column":null}}],"line":131},"13":{"loc":{"start":{"line":132,"column":11},"end":{"line":146,"column":null}},"type":"cond-expr","locations":[{"start":{"line":133,"column":12},"end":{"line":133,"column":null}},{"start":{"line":135,"column":12},"end":{"line":146,"column":null}}],"line":132},"14":{"loc":{"start":{"line":140,"column":45},"end":{"line":140,"column":88}},"type":"cond-expr","locations":[{"start":{"line":140,"column":75},"end":{"line":140,"column":86}},{"start":{"line":140,"column":86},"end":{"line":140,"column":88}}],"line":140},"15":{"loc":{"start":{"line":142,"column":21},"end":{"line":142,"column":null}},"type":"binary-expr","locations":[{"start":{"line":142,"column":21},"end":{"line":142,"column":35}},{"start":{"line":142,"column":35},"end":{"line":142,"column":null}}],"line":142},"16":{"loc":{"start":{"line":169,"column":23},"end":{"line":169,"column":null}},"type":"cond-expr","locations":[{"start":{"line":169,"column":43},"end":{"line":169,"column":54}},{"start":{"line":169,"column":54},"end":{"line":169,"column":null}}],"line":169},"17":{"loc":{"start":{"line":176,"column":23},"end":{"line":176,"column":null}},"type":"cond-expr","locations":[{"start":{"line":176,"column":42},"end":{"line":176,"column":53}},{"start":{"line":176,"column":53},"end":{"line":176,"column":null}}],"line":176}},"s":{"0":13,"1":13,"2":13,"3":13,"4":13,"5":13,"6":13,"7":13,"8":13,"9":13,"10":13,"11":13,"12":0,"13":0,"14":0,"15":13,"16":2,"17":13,"18":6,"19":4,"20":0,"21":4,"22":4,"23":0,"24":4,"25":4,"26":4,"27":4,"28":1,"29":1,"30":13,"31":6,"32":7,"33":7,"34":6,"35":1,"36":1,"37":6,"38":0,"39":0,"40":4,"41":2,"42":0,"43":0},"f":{"0":13,"1":0,"2":2,"3":6,"4":4,"5":4,"6":4,"7":1,"8":1,"9":1,"10":0,"11":0,"12":0,"13":4,"14":2,"15":0,"16":0},"b":{"0":[13,13],"1":[13,0],"2":[13,13,13],"3":[0,0],"4":[0,4],"5":[0,4],"6":[6,7],"7":[1,6],"8":[6,0],"9":[0,6],"10":[0,6],"11":[0,4],"12":[13,2],"13":[1,1],"14":[0,2],"15":[2,0],"16":[6,0],"17":[0,6]},"meta":{"lastBranch":18,"lastFunction":17,"lastStatement":44,"seen":{"f:7:24:7:33":0,"s:16:24:16:Infinity":0,"s:17:22:17:Infinity":1,"s:18:28:18:Infinity":2,"s:19:24:19:Infinity":3,"s:20:40:20:Infinity":4,"s:21:36:21:Infinity":5,"s:22:8:22:Infinity":6,"s:23:21:23:Infinity":7,"s:24:8:24:Infinity":8,"s:25:26:25:Infinity":9,"s:28:4:29:Infinity":10,"b:28:4:28:Infinity:29:5:29:Infinity":0,"b:29:56:29:67:29:67:29:Infinity":1,"b:29:5:29:34:29:34:29:45:29:45:29:56":2,"s:31:23:36:Infinity":11,"f:31:23:31:24":1,"s:32:4:32:Infinity":12,"b:33:4:35:Infinity:undefined:undefined:undefined:undefined":3,"s:33:4:35:Infinity":13,"s:34:6:34:Infinity":14,"s:38:22:40:Infinity":15,"f:38:22:38:28":2,"s:39:4:39:Infinity":16,"s:42:2:62:Infinity":17,"f:42:12:42:18":3,"s:43:4:61:Infinity":18,"f:44:34:44:35":4,"b:45:8:45:Infinity:undefined:undefined:undefined:undefined":4,"s:45:8:45:Infinity":19,"s:45:21:45:Infinity":20,"s:46:8:46:Infinity":21,"f:48:32:48:33":5,"b:49:8:49:Infinity:undefined:undefined:undefined:undefined":5,"s:49:8:49:Infinity":22,"s:49:21:49:Infinity":23,"s:50:8:50:Infinity":24,"f:53:12:53:13":6,"s:54:8:54:Infinity":25,"s:55:8:55:Infinity":26,"s:56:8:56:Infinity":27,"f:58:13:58:14":7,"s:59:8:59:Infinity":28,"s:60:8:60:Infinity":29,"b:64:2:64:Infinity:undefined:undefined:undefined:undefined":6,"s:64:2:64:Infinity":30,"s:64:15:64:Infinity":31,"b:65:2:65:Infinity:undefined:undefined:undefined:undefined":7,"s:65:2:65:Infinity":32,"s:65:13:65:Infinity":33,"s:67:23:69:Infinity":34,"f:67:23:67:29":8,"s:68:4:68:Infinity":35,"f:68:53:68:60":9,"s:68:60:68:95":36,"s:71:2:183:Infinity":37,"f:73:36:73:42":10,"s:73:42:73:68":38,"f:83:22:83:23":11,"s:83:29:83:Infinity":39,"b:92:79:92:90:92:90:92:94":8,"b:97:73:97:84:97:84:97:88":9,"b:102:81:102:92:102:92:102:96":10,"f:110:21:110:27":12,"f:114:20:114:21":13,"s:115:12:122:Infinity":40,"b:118:63:118:74:118:74:118:76":11,"b:131:9:131:Infinity:132:11:146:Infinity":12,"b:133:12:133:Infinity:135:12:146:Infinity":13,"f:136:25:136:26":14,"s:137:16:144:Infinity":41,"b:140:75:140:86:140:86:140:88":14,"b:142:21:142:35:142:35:142:Infinity":15,"f:168:21:168:27":15,"s:168:27:168:Infinity":42,"b:169:43:169:54:169:54:169:Infinity":16,"f:175:21:175:27":16,"s:175:27:175:Infinity":43,"b:176:42:176:53:176:53:176:Infinity":17}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx","statementMap":{"0":{"start":{"line":19,"column":24},"end":{"line":19,"column":null}},"1":{"start":{"line":20,"column":22},"end":{"line":20,"column":null}},"2":{"start":{"line":21,"column":28},"end":{"line":21,"column":null}},"3":{"start":{"line":22,"column":24},"end":{"line":22,"column":null}},"4":{"start":{"line":23,"column":40},"end":{"line":23,"column":null}},"5":{"start":{"line":24,"column":38},"end":{"line":24,"column":null}},"6":{"start":{"line":25,"column":36},"end":{"line":25,"column":null}},"7":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"8":{"start":{"line":27,"column":21},"end":{"line":27,"column":null}},"9":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"10":{"start":{"line":29,"column":26},"end":{"line":29,"column":null}},"11":{"start":{"line":31,"column":25},"end":{"line":31,"column":null}},"12":{"start":{"line":33,"column":2},"end":{"line":38,"column":null}},"13":{"start":{"line":34,"column":20},"end":{"line":34,"column":null}},"14":{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},"15":{"start":{"line":36,"column":6},"end":{"line":36,"column":null}},"16":{"start":{"line":41,"column":4},"end":{"line":42,"column":null}},"17":{"start":{"line":44,"column":23},"end":{"line":49,"column":null}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"19":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"20":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"21":{"start":{"line":51,"column":22},"end":{"line":53,"column":null}},"22":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"23":{"start":{"line":55,"column":21},"end":{"line":57,"column":null}},"24":{"start":{"line":56,"column":4},"end":{"line":56,"column":null}},"25":{"start":{"line":59,"column":26},"end":{"line":63,"column":null}},"26":{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},"27":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"28":{"start":{"line":65,"column":2},"end":{"line":85,"column":null}},"29":{"start":{"line":66,"column":4},"end":{"line":84,"column":null}},"30":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"31":{"start":{"line":68,"column":21},"end":{"line":68,"column":null}},"32":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"33":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"34":{"start":{"line":72,"column":21},"end":{"line":72,"column":null}},"35":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"36":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"37":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"38":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"39":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"40":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"41":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"42":{"start":{"line":87,"column":15},"end":{"line":87,"column":null}},"43":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"44":{"start":{"line":88,"column":13},"end":{"line":88,"column":null}},"45":{"start":{"line":90,"column":23},"end":{"line":92,"column":null}},"46":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"47":{"start":{"line":91,"column":60},"end":{"line":91,"column":95}},"48":{"start":{"line":94,"column":2},"end":{"line":210,"column":null}},"49":{"start":{"line":96,"column":42},"end":{"line":96,"column":68}},"50":{"start":{"line":106,"column":29},"end":{"line":106,"column":null}},"51":{"start":{"line":139,"column":14},"end":{"line":147,"column":null}},"52":{"start":{"line":163,"column":16},"end":{"line":171,"column":null}},"53":{"start":{"line":195,"column":27},"end":{"line":195,"column":null}},"54":{"start":{"line":202,"column":27},"end":{"line":202,"column":null}}},"fnMap":{"0":{"name":"FeedList","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":33}},"loc":{"start":{"line":18,"column":3},"end":{"line":212,"column":null}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":12},"end":{"line":33,"column":18}},"loc":{"start":{"line":33,"column":18},"end":{"line":38,"column":5}},"line":33},"2":{"name":"(anonymous_2)","decl":{"start":{"line":44,"column":23},"end":{"line":44,"column":24}},"loc":{"start":{"line":44,"column":47},"end":{"line":49,"column":null}},"line":44},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":22},"end":{"line":51,"column":28}},"loc":{"start":{"line":51,"column":28},"end":{"line":53,"column":null}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":21},"end":{"line":55,"column":27}},"loc":{"start":{"line":55,"column":27},"end":{"line":57,"column":null}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":26},"end":{"line":59,"column":32}},"loc":{"start":{"line":59,"column":32},"end":{"line":63,"column":null}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":65,"column":12},"end":{"line":65,"column":18}},"loc":{"start":{"line":65,"column":18},"end":{"line":85,"column":5}},"line":65},"7":{"name":"(anonymous_7)","decl":{"start":{"line":67,"column":34},"end":{"line":67,"column":35}},"loc":{"start":{"line":67,"column":43},"end":{"line":70,"column":7}},"line":67},"8":{"name":"(anonymous_8)","decl":{"start":{"line":71,"column":32},"end":{"line":71,"column":33}},"loc":{"start":{"line":71,"column":41},"end":{"line":74,"column":7}},"line":71},"9":{"name":"(anonymous_9)","decl":{"start":{"line":76,"column":12},"end":{"line":76,"column":13}},"loc":{"start":{"line":76,"column":39},"end":{"line":80,"column":7}},"line":76},"10":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":13},"end":{"line":81,"column":14}},"loc":{"start":{"line":81,"column":22},"end":{"line":84,"column":7}},"line":81},"11":{"name":"(anonymous_11)","decl":{"start":{"line":90,"column":23},"end":{"line":90,"column":29}},"loc":{"start":{"line":90,"column":29},"end":{"line":92,"column":null}},"line":90},"12":{"name":"(anonymous_12)","decl":{"start":{"line":91,"column":53},"end":{"line":91,"column":60}},"loc":{"start":{"line":91,"column":60},"end":{"line":91,"column":95}},"line":91},"13":{"name":"(anonymous_13)","decl":{"start":{"line":96,"column":36},"end":{"line":96,"column":42}},"loc":{"start":{"line":96,"column":42},"end":{"line":96,"column":68}},"line":96},"14":{"name":"(anonymous_14)","decl":{"start":{"line":106,"column":22},"end":{"line":106,"column":23}},"loc":{"start":{"line":106,"column":29},"end":{"line":106,"column":null}},"line":106},"15":{"name":"(anonymous_15)","decl":{"start":{"line":138,"column":22},"end":{"line":138,"column":23}},"loc":{"start":{"line":139,"column":14},"end":{"line":147,"column":null}},"line":139},"16":{"name":"(anonymous_16)","decl":{"start":{"line":162,"column":25},"end":{"line":162,"column":26}},"loc":{"start":{"line":163,"column":16},"end":{"line":171,"column":null}},"line":163},"17":{"name":"(anonymous_17)","decl":{"start":{"line":195,"column":21},"end":{"line":195,"column":27}},"loc":{"start":{"line":195,"column":27},"end":{"line":195,"column":null}},"line":195},"18":{"name":"(anonymous_18)","decl":{"start":{"line":202,"column":21},"end":{"line":202,"column":27}},"loc":{"start":{"line":202,"column":27},"end":{"line":202,"column":null}},"line":202}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":25},"end":{"line":31,"column":null}},"type":"binary-expr","locations":[{"start":{"line":31,"column":25},"end":{"line":31,"column":56}},{"start":{"line":31,"column":56},"end":{"line":31,"column":104}},{"start":{"line":31,"column":104},"end":{"line":31,"column":null}}],"line":31},"1":{"loc":{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":35},"2":{"loc":{"start":{"line":41,"column":4},"end":{"line":42,"column":null}},"type":"binary-expr","locations":[{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},{"start":{"line":42,"column":5},"end":{"line":42,"column":null}}],"line":41},"3":{"loc":{"start":{"line":42,"column":5},"end":{"line":42,"column":null}},"type":"cond-expr","locations":[{"start":{"line":42,"column":56},"end":{"line":42,"column":67}},{"start":{"line":42,"column":67},"end":{"line":42,"column":null}}],"line":42},"4":{"loc":{"start":{"line":42,"column":5},"end":{"line":42,"column":56}},"type":"binary-expr","locations":[{"start":{"line":42,"column":5},"end":{"line":42,"column":34}},{"start":{"line":42,"column":34},"end":{"line":42,"column":45}},{"start":{"line":42,"column":45},"end":{"line":42,"column":56}}],"line":42},"5":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},{"start":{},"end":{}}],"line":46},"6":{"loc":{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":60},"7":{"loc":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},{"start":{},"end":{}}],"line":68},"8":{"loc":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},{"start":{},"end":{}}],"line":72},"9":{"loc":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":87},"10":{"loc":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},{"start":{},"end":{}}],"line":88},"11":{"loc":{"start":{"line":115,"column":50},"end":{"line":115,"column":94}},"type":"cond-expr","locations":[{"start":{"line":115,"column":79},"end":{"line":115,"column":90}},{"start":{"line":115,"column":90},"end":{"line":115,"column":94}}],"line":115},"12":{"loc":{"start":{"line":120,"column":47},"end":{"line":120,"column":88}},"type":"cond-expr","locations":[{"start":{"line":120,"column":73},"end":{"line":120,"column":84}},{"start":{"line":120,"column":84},"end":{"line":120,"column":88}}],"line":120},"13":{"loc":{"start":{"line":125,"column":51},"end":{"line":125,"column":96}},"type":"cond-expr","locations":[{"start":{"line":125,"column":81},"end":{"line":125,"column":92}},{"start":{"line":125,"column":92},"end":{"line":125,"column":96}}],"line":125},"14":{"loc":{"start":{"line":134,"column":36},"end":{"line":134,"column":66}},"type":"cond-expr","locations":[{"start":{"line":134,"column":51},"end":{"line":134,"column":64}},{"start":{"line":134,"column":64},"end":{"line":134,"column":66}}],"line":134},"15":{"loc":{"start":{"line":136,"column":9},"end":{"line":149,"column":null}},"type":"binary-expr","locations":[{"start":{"line":136,"column":9},"end":{"line":136,"column":null}},{"start":{"line":137,"column":10},"end":{"line":149,"column":null}}],"line":136},"16":{"loc":{"start":{"line":142,"column":41},"end":{"line":142,"column":78}},"type":"cond-expr","locations":[{"start":{"line":142,"column":65},"end":{"line":142,"column":76}},{"start":{"line":142,"column":76},"end":{"line":142,"column":78}}],"line":142},"17":{"loc":{"start":{"line":155,"column":36},"end":{"line":155,"column":67}},"type":"cond-expr","locations":[{"start":{"line":155,"column":52},"end":{"line":155,"column":65}},{"start":{"line":155,"column":65},"end":{"line":155,"column":67}}],"line":155},"18":{"loc":{"start":{"line":157,"column":9},"end":{"line":173,"column":null}},"type":"binary-expr","locations":[{"start":{"line":157,"column":9},"end":{"line":157,"column":null}},{"start":{"line":158,"column":11},"end":{"line":173,"column":null}}],"line":157},"19":{"loc":{"start":{"line":158,"column":11},"end":{"line":173,"column":null}},"type":"cond-expr","locations":[{"start":{"line":159,"column":12},"end":{"line":159,"column":null}},{"start":{"line":161,"column":12},"end":{"line":173,"column":null}}],"line":158},"20":{"loc":{"start":{"line":166,"column":45},"end":{"line":166,"column":88}},"type":"cond-expr","locations":[{"start":{"line":166,"column":75},"end":{"line":166,"column":86}},{"start":{"line":166,"column":86},"end":{"line":166,"column":88}}],"line":166},"21":{"loc":{"start":{"line":169,"column":21},"end":{"line":169,"column":null}},"type":"binary-expr","locations":[{"start":{"line":169,"column":21},"end":{"line":169,"column":35}},{"start":{"line":169,"column":35},"end":{"line":169,"column":null}}],"line":169},"22":{"loc":{"start":{"line":196,"column":23},"end":{"line":196,"column":null}},"type":"cond-expr","locations":[{"start":{"line":196,"column":43},"end":{"line":196,"column":54}},{"start":{"line":196,"column":54},"end":{"line":196,"column":null}}],"line":196},"23":{"loc":{"start":{"line":203,"column":23},"end":{"line":203,"column":null}},"type":"cond-expr","locations":[{"start":{"line":203,"column":42},"end":{"line":203,"column":53}},{"start":{"line":203,"column":53},"end":{"line":203,"column":null}}],"line":203}},"s":{"0":22,"1":22,"2":22,"3":22,"4":22,"5":22,"6":22,"7":22,"8":22,"9":22,"10":22,"11":22,"12":22,"13":11,"14":11,"15":0,"16":22,"17":22,"18":1,"19":1,"20":1,"21":22,"22":2,"23":22,"24":0,"25":22,"26":1,"27":1,"28":22,"29":9,"30":7,"31":0,"32":7,"33":7,"34":0,"35":7,"36":7,"37":7,"38":7,"39":1,"40":1,"41":22,"42":9,"43":13,"44":13,"45":12,"46":2,"47":2,"48":12,"49":0,"50":1,"51":4,"52":2,"53":0,"54":0},"f":{"0":22,"1":11,"2":1,"3":2,"4":0,"5":1,"6":9,"7":7,"8":7,"9":7,"10":1,"11":2,"12":2,"13":0,"14":1,"15":4,"16":2,"17":0,"18":0},"b":{"0":[22,22,22],"1":[0,11],"2":[22,21],"3":[21,0],"4":[21,21,21],"5":[1,0],"6":[1,0],"7":[0,7],"8":[0,7],"9":[9,13],"10":[1,12],"11":[12,0],"12":[0,12],"13":[0,12],"14":[12,0],"15":[22,12],"16":[0,4],"17":[2,10],"18":[22,2],"19":[1,1],"20":[0,2],"21":[2,0],"22":[12,0],"23":[0,12]},"meta":{"lastBranch":24,"lastFunction":19,"lastStatement":55,"seen":{"f:8:24:8:33":0,"s:19:24:19:Infinity":0,"s:20:22:20:Infinity":1,"s:21:28:21:Infinity":2,"s:22:24:22:Infinity":3,"s:23:40:23:Infinity":4,"s:24:38:24:Infinity":5,"s:25:36:25:Infinity":6,"s:26:8:26:Infinity":7,"s:27:21:27:Infinity":8,"s:28:8:28:Infinity":9,"s:29:26:29:Infinity":10,"s:31:25:31:Infinity":11,"b:31:25:31:56:31:56:31:104:31:104:31:Infinity":0,"s:33:2:38:Infinity":12,"f:33:12:33:18":1,"s:34:20:34:Infinity":13,"b:35:4:37:Infinity:undefined:undefined:undefined:undefined":1,"s:35:4:37:Infinity":14,"s:36:6:36:Infinity":15,"s:41:4:42:Infinity":16,"b:41:4:41:Infinity:42:5:42:Infinity":2,"b:42:56:42:67:42:67:42:Infinity":3,"b:42:5:42:34:42:34:42:45:42:45:42:56":4,"s:44:23:49:Infinity":17,"f:44:23:44:24":2,"s:45:4:45:Infinity":18,"b:46:4:48:Infinity:undefined:undefined:undefined:undefined":5,"s:46:4:48:Infinity":19,"s:47:6:47:Infinity":20,"s:51:22:53:Infinity":21,"f:51:22:51:28":3,"s:52:4:52:Infinity":22,"s:55:21:57:Infinity":23,"f:55:21:55:27":4,"s:56:4:56:Infinity":24,"s:59:26:63:Infinity":25,"f:59:26:59:32":5,"b:60:4:62:Infinity:undefined:undefined:undefined:undefined":6,"s:60:4:62:Infinity":26,"s:61:6:61:Infinity":27,"s:65:2:85:Infinity":28,"f:65:12:65:18":6,"s:66:4:84:Infinity":29,"f:67:34:67:35":7,"b:68:8:68:Infinity:undefined:undefined:undefined:undefined":7,"s:68:8:68:Infinity":30,"s:68:21:68:Infinity":31,"s:69:8:69:Infinity":32,"f:71:32:71:33":8,"b:72:8:72:Infinity:undefined:undefined:undefined:undefined":8,"s:72:8:72:Infinity":33,"s:72:21:72:Infinity":34,"s:73:8:73:Infinity":35,"f:76:12:76:13":9,"s:77:8:77:Infinity":36,"s:78:8:78:Infinity":37,"s:79:8:79:Infinity":38,"f:81:13:81:14":10,"s:82:8:82:Infinity":39,"s:83:8:83:Infinity":40,"b:87:2:87:Infinity:undefined:undefined:undefined:undefined":9,"s:87:2:87:Infinity":41,"s:87:15:87:Infinity":42,"b:88:2:88:Infinity:undefined:undefined:undefined:undefined":10,"s:88:2:88:Infinity":43,"s:88:13:88:Infinity":44,"s:90:23:92:Infinity":45,"f:90:23:90:29":11,"s:91:4:91:Infinity":46,"f:91:53:91:60":12,"s:91:60:91:95":47,"s:94:2:210:Infinity":48,"f:96:36:96:42":13,"s:96:42:96:68":49,"f:106:22:106:23":14,"s:106:29:106:Infinity":50,"b:115:79:115:90:115:90:115:94":11,"b:120:73:120:84:120:84:120:88":12,"b:125:81:125:92:125:92:125:96":13,"b:134:51:134:64:134:64:134:66":14,"b:136:9:136:Infinity:137:10:149:Infinity":15,"f:138:22:138:23":15,"s:139:14:147:Infinity":51,"b:142:65:142:76:142:76:142:78":16,"b:155:52:155:65:155:65:155:67":17,"b:157:9:157:Infinity:158:11:173:Infinity":18,"b:159:12:159:Infinity:161:12:173:Infinity":19,"f:162:25:162:26":16,"s:163:16:171:Infinity":52,"b:166:75:166:86:166:86:166:88":20,"b:169:21:169:35:169:35:169:Infinity":21,"f:195:21:195:27":17,"s:195:27:195:Infinity":53,"b:196:43:196:54:196:54:196:Infinity":22,"f:202:21:202:27":18,"s:202:27:202:Infinity":54,"b:203:42:203:53:203:53:203:Infinity":23}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedListVariants.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedListVariants.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx","statementMap":{"0":{"start":{"line":8,"column":30},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":24},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":8},"end":{"line":10,"column":null}},"3":{"start":{"line":12,"column":23},"end":{"line":35,"column":null}},"4":{"start":{"line":13,"column":4},"end":{"line":13,"column":null}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"6":{"start":{"line":16,"column":4},"end":{"line":34,"column":null}},"7":{"start":{"line":18,"column":21},"end":{"line":18,"column":null}},"8":{"start":{"line":19,"column":6},"end":{"line":19,"column":null}},"9":{"start":{"line":21,"column":18},"end":{"line":24,"column":null}},"10":{"start":{"line":26,"column":6},"end":{"line":31,"column":null}},"11":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"12":{"start":{"line":29,"column":21},"end":{"line":29,"column":null}},"13":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"14":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"15":{"start":{"line":37,"column":2},"end":{"line":54,"column":null}},"16":{"start":{"line":47,"column":29},"end":{"line":47,"column":null}}},"fnMap":{"0":{"name":"Login","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":32}},"loc":{"start":{"line":7,"column":32},"end":{"line":56,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":23},"end":{"line":12,"column":30}},"loc":{"start":{"line":12,"column":47},"end":{"line":35,"column":null}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":22},"end":{"line":47,"column":23}},"loc":{"start":{"line":47,"column":29},"end":{"line":47,"column":null}},"line":47}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":6},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":6},"end":{"line":31,"column":null}},{"start":{"line":28,"column":13},"end":{"line":31,"column":null}}],"line":26},"1":{"loc":{"start":{"line":30,"column":17},"end":{"line":30,"column":47}},"type":"binary-expr","locations":[{"start":{"line":30,"column":17},"end":{"line":30,"column":33}},{"start":{"line":30,"column":33},"end":{"line":30,"column":47}}],"line":30},"2":{"loc":{"start":{"line":51,"column":9},"end":{"line":51,"column":null}},"type":"binary-expr","locations":[{"start":{"line":51,"column":9},"end":{"line":51,"column":18}},{"start":{"line":51,"column":18},"end":{"line":51,"column":null}}],"line":51}},"s":{"0":14,"1":14,"2":14,"3":14,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":2,"11":1,"12":1,"13":1,"14":1,"15":14,"16":3},"f":{"0":14,"1":3,"2":3},"b":{"0":[1,1],"1":[1,0],"2":[14,2]},"meta":{"lastBranch":3,"lastFunction":3,"lastStatement":17,"seen":{"f:7:24:7:32":0,"s:8:30:8:Infinity":0,"s:9:24:9:Infinity":1,"s:10:8:10:Infinity":2,"s:12:23:35:Infinity":3,"f:12:23:12:30":1,"s:13:4:13:Infinity":4,"s:14:4:14:Infinity":5,"s:16:4:34:Infinity":6,"s:18:21:18:Infinity":7,"s:19:6:19:Infinity":8,"s:21:18:24:Infinity":9,"b:26:6:31:Infinity:28:13:31:Infinity":0,"s:26:6:31:Infinity":10,"s:27:8:27:Infinity":11,"s:29:21:29:Infinity":12,"s:30:8:30:Infinity":13,"b:30:17:30:33:30:33:30:47":1,"s:33:6:33:Infinity":14,"s:37:2:54:Infinity":15,"f:47:22:47:23":2,"s:47:29:47:Infinity":16,"b:51:9:51:18:51:18:51:Infinity":2}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx","statementMap":{"0":{"start":{"line":8,"column":30},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":30},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":24},"end":{"line":10,"column":null}},"3":{"start":{"line":11,"column":8},"end":{"line":11,"column":null}},"4":{"start":{"line":13,"column":23},"end":{"line":37,"column":null}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":4},"end":{"line":36,"column":null}},"8":{"start":{"line":19,"column":21},"end":{"line":19,"column":null}},"9":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"10":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"11":{"start":{"line":23,"column":18},"end":{"line":26,"column":null}},"12":{"start":{"line":28,"column":6},"end":{"line":33,"column":null}},"13":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"14":{"start":{"line":31,"column":21},"end":{"line":31,"column":null}},"15":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"16":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"17":{"start":{"line":39,"column":2},"end":{"line":65,"column":null}},"18":{"start":{"line":49,"column":29},"end":{"line":49,"column":null}},"19":{"start":{"line":58,"column":29},"end":{"line":58,"column":null}}},"fnMap":{"0":{"name":"Login","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":32}},"loc":{"start":{"line":7,"column":32},"end":{"line":67,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":23},"end":{"line":13,"column":30}},"loc":{"start":{"line":13,"column":47},"end":{"line":37,"column":null}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":49,"column":22},"end":{"line":49,"column":23}},"loc":{"start":{"line":49,"column":29},"end":{"line":49,"column":null}},"line":49},"3":{"name":"(anonymous_3)","decl":{"start":{"line":58,"column":22},"end":{"line":58,"column":23}},"loc":{"start":{"line":58,"column":29},"end":{"line":58,"column":null}},"line":58}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":6},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":6},"end":{"line":33,"column":null}},{"start":{"line":30,"column":13},"end":{"line":33,"column":null}}],"line":28},"1":{"loc":{"start":{"line":32,"column":17},"end":{"line":32,"column":47}},"type":"binary-expr","locations":[{"start":{"line":32,"column":17},"end":{"line":32,"column":33}},{"start":{"line":32,"column":33},"end":{"line":32,"column":47}}],"line":32},"2":{"loc":{"start":{"line":62,"column":9},"end":{"line":62,"column":null}},"type":"binary-expr","locations":[{"start":{"line":62,"column":9},"end":{"line":62,"column":18}},{"start":{"line":62,"column":18},"end":{"line":62,"column":null}}],"line":62}},"s":{"0":17,"1":17,"2":17,"3":17,"4":17,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":2,"13":1,"14":1,"15":1,"16":1,"17":17,"18":3,"19":3},"f":{"0":17,"1":3,"2":3,"3":3},"b":{"0":[1,1],"1":[1,0],"2":[17,2]},"meta":{"lastBranch":3,"lastFunction":4,"lastStatement":20,"seen":{"f:7:24:7:32":0,"s:8:30:8:Infinity":0,"s:9:30:9:Infinity":1,"s:10:24:10:Infinity":2,"s:11:8:11:Infinity":3,"s:13:23:37:Infinity":4,"f:13:23:13:30":1,"s:14:4:14:Infinity":5,"s:15:4:15:Infinity":6,"s:17:4:36:Infinity":7,"s:19:21:19:Infinity":8,"s:20:6:20:Infinity":9,"s:21:6:21:Infinity":10,"s:23:18:26:Infinity":11,"b:28:6:33:Infinity:30:13:33:Infinity":0,"s:28:6:33:Infinity":12,"s:29:8:29:Infinity":13,"s:31:21:31:Infinity":14,"s:32:8:32:Infinity":15,"b:32:17:32:33:32:33:32:47":1,"s:35:6:35:Infinity":16,"s:39:2:65:Infinity":17,"f:49:22:49:23":2,"s:49:29:49:Infinity":18,"f:58:22:58:23":3,"s:58:29:58:Infinity":19,"b:62:9:62:18:62:18:62:Infinity":2}}}
,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}}
-,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx","statementMap":{"0":{"start":{"line":7,"column":24},"end":{"line":7,"column":null}},"1":{"start":{"line":8,"column":34},"end":{"line":8,"column":null}},"2":{"start":{"line":9,"column":28},"end":{"line":9,"column":null}},"3":{"start":{"line":10,"column":24},"end":{"line":10,"column":null}},"4":{"start":{"line":12,"column":34},"end":{"line":12,"column":null}},"5":{"start":{"line":14,"column":21},"end":{"line":29,"column":null}},"6":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"7":{"start":{"line":16,"column":4},"end":{"line":28,"column":null}},"8":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"9":{"start":{"line":18,"column":21},"end":{"line":18,"column":null}},"10":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"11":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"12":{"start":{"line":23,"column":8},"end":{"line":23,"column":null}},"13":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"14":{"start":{"line":27,"column":8},"end":{"line":27,"column":null}},"15":{"start":{"line":31,"column":2},"end":{"line":33,"column":null}},"16":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"17":{"start":{"line":35,"column":24},"end":{"line":57,"column":null}},"18":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"19":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"20":{"start":{"line":37,"column":21},"end":{"line":37,"column":null}},"21":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"22":{"start":{"line":40,"column":4},"end":{"line":56,"column":null}},"23":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"24":{"start":{"line":46,"column":21},"end":{"line":46,"column":null}},"25":{"start":{"line":47,"column":8},"end":{"line":47,"column":null}},"26":{"start":{"line":50,"column":8},"end":{"line":50,"column":null}},"27":{"start":{"line":51,"column":8},"end":{"line":51,"column":null}},"28":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"29":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"30":{"start":{"line":59,"column":27},"end":{"line":75,"column":null}},"31":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"32":{"start":{"line":60,"column":75},"end":{"line":60,"column":null}},"33":{"start":{"line":62,"column":4},"end":{"line":62,"column":null}},"34":{"start":{"line":63,"column":4},"end":{"line":74,"column":null}},"35":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"36":{"start":{"line":67,"column":21},"end":{"line":67,"column":null}},"37":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"38":{"start":{"line":68,"column":37},"end":{"line":68,"column":49}},"39":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"40":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"41":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"42":{"start":{"line":77,"column":23},"end":{"line":103,"column":null}},"43":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"44":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"45":{"start":{"line":79,"column":21},"end":{"line":79,"column":null}},"46":{"start":{"line":81,"column":4},"end":{"line":81,"column":null}},"47":{"start":{"line":82,"column":21},"end":{"line":82,"column":null}},"48":{"start":{"line":83,"column":4},"end":{"line":83,"column":null}},"49":{"start":{"line":84,"column":4},"end":{"line":84,"column":null}},"50":{"start":{"line":86,"column":4},"end":{"line":102,"column":null}},"51":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"52":{"start":{"line":91,"column":21},"end":{"line":91,"column":null}},"53":{"start":{"line":92,"column":8},"end":{"line":92,"column":null}},"54":{"start":{"line":95,"column":8},"end":{"line":95,"column":null}},"55":{"start":{"line":96,"column":8},"end":{"line":96,"column":null}},"56":{"start":{"line":97,"column":8},"end":{"line":97,"column":null}},"57":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"58":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"59":{"start":{"line":105,"column":2},"end":{"line":178,"column":null}},"60":{"start":{"line":115,"column":29},"end":{"line":115,"column":null}},"61":{"start":{"line":134,"column":31},"end":{"line":134,"column":null}},"62":{"start":{"line":161,"column":12},"end":{"line":174,"column":null}},"63":{"start":{"line":167,"column":31},"end":{"line":167,"column":null}}},"fnMap":{"0":{"name":"Settings","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":35}},"loc":{"start":{"line":6,"column":35},"end":{"line":180,"column":null}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":21},"end":{"line":14,"column":27}},"loc":{"start":{"line":14,"column":27},"end":{"line":29,"column":null}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":12},"end":{"line":17,"column":13}},"loc":{"start":{"line":17,"column":21},"end":{"line":20,"column":7}},"line":17},"3":{"name":"(anonymous_3)","decl":{"start":{"line":21,"column":12},"end":{"line":21,"column":13}},"loc":{"start":{"line":21,"column":22},"end":{"line":24,"column":7}},"line":21},"4":{"name":"(anonymous_4)","decl":{"start":{"line":25,"column":13},"end":{"line":25,"column":14}},"loc":{"start":{"line":25,"column":22},"end":{"line":28,"column":7}},"line":25},"5":{"name":"(anonymous_5)","decl":{"start":{"line":31,"column":12},"end":{"line":31,"column":18}},"loc":{"start":{"line":31,"column":18},"end":{"line":33,"column":5}},"line":31},"6":{"name":"(anonymous_6)","decl":{"start":{"line":35,"column":24},"end":{"line":35,"column":25}},"loc":{"start":{"line":35,"column":48},"end":{"line":57,"column":null}},"line":35},"7":{"name":"(anonymous_7)","decl":{"start":{"line":45,"column":12},"end":{"line":45,"column":13}},"loc":{"start":{"line":45,"column":21},"end":{"line":48,"column":7}},"line":45},"8":{"name":"(anonymous_8)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":18}},"loc":{"start":{"line":49,"column":18},"end":{"line":52,"column":7}},"line":49},"9":{"name":"(anonymous_9)","decl":{"start":{"line":53,"column":13},"end":{"line":53,"column":14}},"loc":{"start":{"line":53,"column":22},"end":{"line":56,"column":7}},"line":53},"10":{"name":"(anonymous_10)","decl":{"start":{"line":59,"column":27},"end":{"line":59,"column":28}},"loc":{"start":{"line":59,"column":43},"end":{"line":75,"column":null}},"line":59},"11":{"name":"(anonymous_11)","decl":{"start":{"line":66,"column":12},"end":{"line":66,"column":13}},"loc":{"start":{"line":66,"column":21},"end":{"line":70,"column":7}},"line":66},"12":{"name":"(anonymous_12)","decl":{"start":{"line":68,"column":30},"end":{"line":68,"column":31}},"loc":{"start":{"line":68,"column":37},"end":{"line":68,"column":49}},"line":68},"13":{"name":"(anonymous_13)","decl":{"start":{"line":71,"column":13},"end":{"line":71,"column":14}},"loc":{"start":{"line":71,"column":22},"end":{"line":74,"column":7}},"line":71},"14":{"name":"(anonymous_14)","decl":{"start":{"line":77,"column":23},"end":{"line":77,"column":24}},"loc":{"start":{"line":77,"column":47},"end":{"line":103,"column":null}},"line":77},"15":{"name":"(anonymous_15)","decl":{"start":{"line":90,"column":12},"end":{"line":90,"column":13}},"loc":{"start":{"line":90,"column":21},"end":{"line":93,"column":7}},"line":90},"16":{"name":"(anonymous_16)","decl":{"start":{"line":94,"column":12},"end":{"line":94,"column":18}},"loc":{"start":{"line":94,"column":18},"end":{"line":98,"column":7}},"line":94},"17":{"name":"(anonymous_17)","decl":{"start":{"line":99,"column":13},"end":{"line":99,"column":14}},"loc":{"start":{"line":99,"column":22},"end":{"line":102,"column":7}},"line":99},"18":{"name":"(anonymous_18)","decl":{"start":{"line":115,"column":22},"end":{"line":115,"column":23}},"loc":{"start":{"line":115,"column":29},"end":{"line":115,"column":null}},"line":115},"19":{"name":"(anonymous_19)","decl":{"start":{"line":134,"column":24},"end":{"line":134,"column":25}},"loc":{"start":{"line":134,"column":31},"end":{"line":134,"column":null}},"line":134},"20":{"name":"(anonymous_20)","decl":{"start":{"line":160,"column":21},"end":{"line":160,"column":22}},"loc":{"start":{"line":161,"column":12},"end":{"line":174,"column":null}},"line":161},"21":{"name":"(anonymous_21)","decl":{"start":{"line":167,"column":25},"end":{"line":167,"column":31}},"loc":{"start":{"line":167,"column":31},"end":{"line":167,"column":null}},"line":167}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},{"start":{},"end":{}}],"line":18},"1":{"loc":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":37},"2":{"loc":{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":8},"end":{"line":46,"column":null}},{"start":{},"end":{}}],"line":46},"3":{"loc":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},{"start":{},"end":{}}],"line":60},"4":{"loc":{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":67,"column":null}},{"start":{},"end":{}}],"line":67},"5":{"loc":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},{"start":{},"end":{}}],"line":79},"6":{"loc":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"type":"if","locations":[{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},{"start":{},"end":{}}],"line":91},"7":{"loc":{"start":{"line":134,"column":45},"end":{"line":134,"column":72}},"type":"binary-expr","locations":[{"start":{"line":134,"column":45},"end":{"line":134,"column":68}},{"start":{"line":134,"column":68},"end":{"line":134,"column":72}}],"line":134},"8":{"loc":{"start":{"line":138,"column":44},"end":{"line":138,"column":68}},"type":"binary-expr","locations":[{"start":{"line":138,"column":44},"end":{"line":138,"column":59}},{"start":{"line":138,"column":59},"end":{"line":138,"column":68}}],"line":138},"9":{"loc":{"start":{"line":154,"column":7},"end":{"line":154,"column":null}},"type":"binary-expr","locations":[{"start":{"line":154,"column":7},"end":{"line":154,"column":16}},{"start":{"line":154,"column":16},"end":{"line":154,"column":null}}],"line":154},"10":{"loc":{"start":{"line":158,"column":9},"end":{"line":158,"column":null}},"type":"binary-expr","locations":[{"start":{"line":158,"column":9},"end":{"line":158,"column":20}},{"start":{"line":158,"column":20},"end":{"line":158,"column":null}}],"line":158},"11":{"loc":{"start":{"line":163,"column":46},"end":{"line":163,"column":73}},"type":"binary-expr","locations":[{"start":{"line":163,"column":46},"end":{"line":163,"column":60}},{"start":{"line":163,"column":60},"end":{"line":163,"column":73}}],"line":163}},"s":{"0":14,"1":14,"2":14,"3":14,"4":14,"5":14,"6":4,"7":4,"8":4,"9":0,"10":4,"11":4,"12":4,"13":0,"14":0,"15":14,"16":3,"17":14,"18":1,"19":1,"20":0,"21":1,"22":1,"23":1,"24":0,"25":1,"26":1,"27":1,"28":0,"29":0,"30":14,"31":1,"32":0,"33":1,"34":1,"35":1,"36":0,"37":1,"38":1,"39":1,"40":0,"41":0,"42":14,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":14,"60":1,"61":0,"62":5,"63":1},"f":{"0":14,"1":4,"2":4,"3":4,"4":0,"5":3,"6":1,"7":1,"8":1,"9":0,"10":1,"11":1,"12":1,"13":0,"14":0,"15":0,"16":0,"17":0,"18":1,"19":0,"20":5,"21":1},"b":{"0":[0,4],"1":[0,1],"2":[0,1],"3":[0,1],"4":[0,1],"5":[0,0],"6":[0,0],"7":[0,0],"8":[14,0],"9":[14,0],"10":[14,5],"11":[5,0]},"meta":{"lastBranch":12,"lastFunction":22,"lastStatement":64,"seen":{"f:6:24:6:35":0,"s:7:24:7:Infinity":0,"s:8:34:8:Infinity":1,"s:9:28:9:Infinity":2,"s:10:24:10:Infinity":3,"s:12:34:12:Infinity":4,"s:14:21:29:Infinity":5,"f:14:21:14:27":1,"s:15:4:15:Infinity":6,"s:16:4:28:Infinity":7,"f:17:12:17:13":2,"b:18:8:18:Infinity:undefined:undefined:undefined:undefined":0,"s:18:8:18:Infinity":8,"s:18:21:18:Infinity":9,"s:19:8:19:Infinity":10,"f:21:12:21:13":3,"s:22:8:22:Infinity":11,"s:23:8:23:Infinity":12,"f:25:13:25:14":4,"s:26:8:26:Infinity":13,"s:27:8:27:Infinity":14,"s:31:2:33:Infinity":15,"f:31:12:31:18":5,"s:32:4:32:Infinity":16,"s:35:24:57:Infinity":17,"f:35:24:35:25":6,"s:36:4:36:Infinity":18,"b:37:4:37:Infinity:undefined:undefined:undefined:undefined":1,"s:37:4:37:Infinity":19,"s:37:21:37:Infinity":20,"s:39:4:39:Infinity":21,"s:40:4:56:Infinity":22,"f:45:12:45:13":7,"b:46:8:46:Infinity:undefined:undefined:undefined:undefined":2,"s:46:8:46:Infinity":23,"s:46:21:46:Infinity":24,"s:47:8:47:Infinity":25,"f:49:12:49:18":8,"s:50:8:50:Infinity":26,"s:51:8:51:Infinity":27,"f:53:13:53:14":9,"s:54:8:54:Infinity":28,"s:55:8:55:Infinity":29,"s:59:27:75:Infinity":30,"f:59:27:59:28":10,"b:60:4:60:Infinity:undefined:undefined:undefined:undefined":3,"s:60:4:60:Infinity":31,"s:60:75:60:Infinity":32,"s:62:4:62:Infinity":33,"s:63:4:74:Infinity":34,"f:66:12:66:13":11,"b:67:8:67:Infinity:undefined:undefined:undefined:undefined":4,"s:67:8:67:Infinity":35,"s:67:21:67:Infinity":36,"s:68:8:68:Infinity":37,"f:68:30:68:31":12,"s:68:37:68:49":38,"s:69:8:69:Infinity":39,"f:71:13:71:14":13,"s:72:8:72:Infinity":40,"s:73:8:73:Infinity":41,"s:77:23:103:Infinity":42,"f:77:23:77:24":14,"s:78:4:78:Infinity":43,"b:79:4:79:Infinity:undefined:undefined:undefined:undefined":5,"s:79:4:79:Infinity":44,"s:79:21:79:Infinity":45,"s:81:4:81:Infinity":46,"s:82:21:82:Infinity":47,"s:83:4:83:Infinity":48,"s:84:4:84:Infinity":49,"s:86:4:102:Infinity":50,"f:90:12:90:13":15,"b:91:8:91:Infinity:undefined:undefined:undefined:undefined":6,"s:91:8:91:Infinity":51,"s:91:21:91:Infinity":52,"s:92:8:92:Infinity":53,"f:94:12:94:18":16,"s:95:8:95:Infinity":54,"s:96:8:96:Infinity":55,"s:97:8:97:Infinity":56,"f:99:13:99:14":17,"s:100:8:100:Infinity":57,"s:101:8:101:Infinity":58,"s:105:2:178:Infinity":59,"f:115:22:115:23":18,"s:115:29:115:Infinity":60,"f:134:24:134:25":19,"s:134:31:134:Infinity":61,"b:134:45:134:68:134:68:134:72":7,"b:138:44:138:59:138:59:138:68":8,"b:154:7:154:16:154:16:154:Infinity":9,"b:158:9:158:20:158:20:158:Infinity":10,"f:160:21:160:22":20,"s:161:12:174:Infinity":62,"b:163:46:163:60:163:60:163:73":11,"f:167:25:167:31":21,"s:167:31:167:Infinity":63}}}
+,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx","statementMap":{"0":{"start":{"line":12,"column":24},"end":{"line":12,"column":null}},"1":{"start":{"line":14,"column":34},"end":{"line":14,"column":null}},"2":{"start":{"line":15,"column":28},"end":{"line":15,"column":null}},"3":{"start":{"line":16,"column":24},"end":{"line":16,"column":null}},"4":{"start":{"line":18,"column":34},"end":{"line":18,"column":null}},"5":{"start":{"line":21,"column":21},"end":{"line":36,"column":null}},"6":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":4},"end":{"line":35,"column":null}},"8":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"9":{"start":{"line":25,"column":21},"end":{"line":25,"column":null}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"11":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"12":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"13":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"14":{"start":{"line":34,"column":8},"end":{"line":34,"column":null}},"15":{"start":{"line":38,"column":2},"end":{"line":41,"column":null}},"16":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"17":{"start":{"line":44,"column":24},"end":{"line":66,"column":null}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"19":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"20":{"start":{"line":46,"column":21},"end":{"line":46,"column":null}},"21":{"start":{"line":48,"column":4},"end":{"line":48,"column":null}},"22":{"start":{"line":49,"column":4},"end":{"line":65,"column":null}},"23":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"24":{"start":{"line":55,"column":21},"end":{"line":55,"column":null}},"25":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"26":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"27":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"28":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"29":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"30":{"start":{"line":68,"column":27},"end":{"line":84,"column":null}},"31":{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},"32":{"start":{"line":69,"column":75},"end":{"line":69,"column":null}},"33":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"34":{"start":{"line":72,"column":4},"end":{"line":83,"column":null}},"35":{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},"36":{"start":{"line":76,"column":21},"end":{"line":76,"column":null}},"37":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"38":{"start":{"line":77,"column":37},"end":{"line":77,"column":49}},"39":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"40":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"41":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"42":{"start":{"line":86,"column":23},"end":{"line":112,"column":null}},"43":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"44":{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},"45":{"start":{"line":88,"column":21},"end":{"line":88,"column":null}},"46":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"47":{"start":{"line":91,"column":21},"end":{"line":91,"column":null}},"48":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"49":{"start":{"line":93,"column":4},"end":{"line":93,"column":null}},"50":{"start":{"line":95,"column":4},"end":{"line":111,"column":null}},"51":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"52":{"start":{"line":100,"column":21},"end":{"line":100,"column":null}},"53":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"54":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"55":{"start":{"line":105,"column":8},"end":{"line":105,"column":null}},"56":{"start":{"line":106,"column":8},"end":{"line":106,"column":null}},"57":{"start":{"line":109,"column":8},"end":{"line":109,"column":null}},"58":{"start":{"line":110,"column":8},"end":{"line":110,"column":null}},"59":{"start":{"line":114,"column":22},"end":{"line":131,"column":null}},"60":{"start":{"line":115,"column":4},"end":{"line":115,"column":null}},"61":{"start":{"line":116,"column":4},"end":{"line":130,"column":null}},"62":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"63":{"start":{"line":120,"column":21},"end":{"line":120,"column":null}},"64":{"start":{"line":121,"column":8},"end":{"line":121,"column":null}},"65":{"start":{"line":124,"column":8},"end":{"line":124,"column":null}},"66":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":null}},"68":{"start":{"line":129,"column":8},"end":{"line":129,"column":null}},"69":{"start":{"line":133,"column":2},"end":{"line":234,"column":null}},"70":{"start":{"line":145,"column":31},"end":{"line":145,"column":null}},"71":{"start":{"line":163,"column":29},"end":{"line":163,"column":null}},"72":{"start":{"line":183,"column":31},"end":{"line":183,"column":null}},"73":{"start":{"line":217,"column":12},"end":{"line":230,"column":null}},"74":{"start":{"line":223,"column":31},"end":{"line":223,"column":null}}},"fnMap":{"0":{"name":"Settings","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":33}},"loc":{"start":{"line":11,"column":77},"end":{"line":236,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":39},"end":{"line":21,"column":45}},"loc":{"start":{"line":21,"column":45},"end":{"line":36,"column":5}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":12},"end":{"line":24,"column":13}},"loc":{"start":{"line":24,"column":21},"end":{"line":27,"column":7}},"line":24},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":12},"end":{"line":28,"column":13}},"loc":{"start":{"line":28,"column":22},"end":{"line":31,"column":7}},"line":28},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":13},"end":{"line":32,"column":14}},"loc":{"start":{"line":32,"column":22},"end":{"line":35,"column":7}},"line":32},"5":{"name":"(anonymous_5)","decl":{"start":{"line":38,"column":12},"end":{"line":38,"column":18}},"loc":{"start":{"line":38,"column":18},"end":{"line":41,"column":5}},"line":38},"6":{"name":"(anonymous_6)","decl":{"start":{"line":44,"column":24},"end":{"line":44,"column":25}},"loc":{"start":{"line":44,"column":48},"end":{"line":66,"column":null}},"line":44},"7":{"name":"(anonymous_7)","decl":{"start":{"line":54,"column":12},"end":{"line":54,"column":13}},"loc":{"start":{"line":54,"column":21},"end":{"line":57,"column":7}},"line":54},"8":{"name":"(anonymous_8)","decl":{"start":{"line":58,"column":12},"end":{"line":58,"column":18}},"loc":{"start":{"line":58,"column":18},"end":{"line":61,"column":7}},"line":58},"9":{"name":"(anonymous_9)","decl":{"start":{"line":62,"column":13},"end":{"line":62,"column":14}},"loc":{"start":{"line":62,"column":22},"end":{"line":65,"column":7}},"line":62},"10":{"name":"(anonymous_10)","decl":{"start":{"line":68,"column":27},"end":{"line":68,"column":28}},"loc":{"start":{"line":68,"column":43},"end":{"line":84,"column":null}},"line":68},"11":{"name":"(anonymous_11)","decl":{"start":{"line":75,"column":12},"end":{"line":75,"column":13}},"loc":{"start":{"line":75,"column":21},"end":{"line":79,"column":7}},"line":75},"12":{"name":"(anonymous_12)","decl":{"start":{"line":77,"column":30},"end":{"line":77,"column":31}},"loc":{"start":{"line":77,"column":37},"end":{"line":77,"column":49}},"line":77},"13":{"name":"(anonymous_13)","decl":{"start":{"line":80,"column":13},"end":{"line":80,"column":14}},"loc":{"start":{"line":80,"column":22},"end":{"line":83,"column":7}},"line":80},"14":{"name":"(anonymous_14)","decl":{"start":{"line":86,"column":23},"end":{"line":86,"column":24}},"loc":{"start":{"line":86,"column":47},"end":{"line":112,"column":null}},"line":86},"15":{"name":"(anonymous_15)","decl":{"start":{"line":99,"column":12},"end":{"line":99,"column":13}},"loc":{"start":{"line":99,"column":21},"end":{"line":102,"column":7}},"line":99},"16":{"name":"(anonymous_16)","decl":{"start":{"line":103,"column":12},"end":{"line":103,"column":18}},"loc":{"start":{"line":103,"column":18},"end":{"line":107,"column":7}},"line":103},"17":{"name":"(anonymous_17)","decl":{"start":{"line":108,"column":13},"end":{"line":108,"column":14}},"loc":{"start":{"line":108,"column":22},"end":{"line":111,"column":7}},"line":108},"18":{"name":"(anonymous_18)","decl":{"start":{"line":114,"column":22},"end":{"line":114,"column":28}},"loc":{"start":{"line":114,"column":28},"end":{"line":131,"column":null}},"line":114},"19":{"name":"(anonymous_19)","decl":{"start":{"line":119,"column":12},"end":{"line":119,"column":13}},"loc":{"start":{"line":119,"column":21},"end":{"line":122,"column":7}},"line":119},"20":{"name":"(anonymous_20)","decl":{"start":{"line":123,"column":12},"end":{"line":123,"column":18}},"loc":{"start":{"line":123,"column":18},"end":{"line":126,"column":7}},"line":123},"21":{"name":"(anonymous_21)","decl":{"start":{"line":127,"column":13},"end":{"line":127,"column":14}},"loc":{"start":{"line":127,"column":22},"end":{"line":130,"column":7}},"line":127},"22":{"name":"(anonymous_22)","decl":{"start":{"line":145,"column":24},"end":{"line":145,"column":25}},"loc":{"start":{"line":145,"column":31},"end":{"line":145,"column":null}},"line":145},"23":{"name":"(anonymous_23)","decl":{"start":{"line":163,"column":22},"end":{"line":163,"column":23}},"loc":{"start":{"line":163,"column":29},"end":{"line":163,"column":null}},"line":163},"24":{"name":"(anonymous_24)","decl":{"start":{"line":183,"column":24},"end":{"line":183,"column":25}},"loc":{"start":{"line":183,"column":31},"end":{"line":183,"column":null}},"line":183},"25":{"name":"(anonymous_25)","decl":{"start":{"line":216,"column":21},"end":{"line":216,"column":22}},"loc":{"start":{"line":217,"column":12},"end":{"line":230,"column":null}},"line":217},"26":{"name":"(anonymous_26)","decl":{"start":{"line":223,"column":25},"end":{"line":223,"column":31}},"loc":{"start":{"line":223,"column":31},"end":{"line":223,"column":null}},"line":223}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":25},"1":{"loc":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},{"start":{},"end":{}}],"line":46},"2":{"loc":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":55},"3":{"loc":{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":69},"4":{"loc":{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},{"start":{},"end":{}}],"line":76},"5":{"loc":{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},{"start":{},"end":{}}],"line":88},"6":{"loc":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},{"start":{},"end":{}}],"line":100},"7":{"loc":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},{"start":{},"end":{}}],"line":120},"8":{"loc":{"start":{"line":137,"column":7},"end":{"line":154,"column":null}},"type":"binary-expr","locations":[{"start":{"line":137,"column":7},"end":{"line":137,"column":null}},{"start":{"line":138,"column":8},"end":{"line":154,"column":null}}],"line":137},"9":{"loc":{"start":{"line":144,"column":21},"end":{"line":144,"column":null}},"type":"binary-expr","locations":[{"start":{"line":144,"column":21},"end":{"line":144,"column":34}},{"start":{"line":144,"column":34},"end":{"line":144,"column":null}}],"line":144},"10":{"loc":{"start":{"line":183,"column":45},"end":{"line":183,"column":72}},"type":"binary-expr","locations":[{"start":{"line":183,"column":45},"end":{"line":183,"column":68}},{"start":{"line":183,"column":68},"end":{"line":183,"column":72}}],"line":183},"11":{"loc":{"start":{"line":187,"column":44},"end":{"line":187,"column":68}},"type":"binary-expr","locations":[{"start":{"line":187,"column":44},"end":{"line":187,"column":59}},{"start":{"line":187,"column":59},"end":{"line":187,"column":68}}],"line":187},"12":{"loc":{"start":{"line":210,"column":7},"end":{"line":210,"column":null}},"type":"binary-expr","locations":[{"start":{"line":210,"column":7},"end":{"line":210,"column":16}},{"start":{"line":210,"column":16},"end":{"line":210,"column":null}}],"line":210},"13":{"loc":{"start":{"line":214,"column":9},"end":{"line":214,"column":null}},"type":"binary-expr","locations":[{"start":{"line":214,"column":9},"end":{"line":214,"column":20}},{"start":{"line":214,"column":20},"end":{"line":214,"column":null}}],"line":214},"14":{"loc":{"start":{"line":219,"column":46},"end":{"line":219,"column":73}},"type":"binary-expr","locations":[{"start":{"line":219,"column":46},"end":{"line":219,"column":60}},{"start":{"line":219,"column":60},"end":{"line":219,"column":73}}],"line":219}},"s":{"0":34,"1":34,"2":34,"3":34,"4":34,"5":34,"6":9,"7":9,"8":9,"9":0,"10":9,"11":9,"12":9,"13":0,"14":0,"15":34,"16":7,"17":34,"18":2,"19":2,"20":0,"21":2,"22":2,"23":2,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":34,"31":1,"32":0,"33":1,"34":1,"35":1,"36":0,"37":1,"38":1,"39":1,"40":0,"41":0,"42":34,"43":1,"44":1,"45":0,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":0,"53":1,"54":1,"55":1,"56":1,"57":0,"58":0,"59":34,"60":1,"61":1,"62":1,"63":0,"64":1,"65":1,"66":1,"67":0,"68":0,"69":34,"70":1,"71":2,"72":1,"73":6,"74":1},"f":{"0":34,"1":9,"2":9,"3":9,"4":0,"5":7,"6":2,"7":2,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":1,"15":1,"16":1,"17":0,"18":1,"19":1,"20":1,"21":0,"22":1,"23":2,"24":1,"25":6,"26":1},"b":{"0":[0,9],"1":[0,2],"2":[1,1],"3":[0,1],"4":[0,1],"5":[0,1],"6":[0,1],"7":[0,1],"8":[34,3],"9":[3,0],"10":[1,0],"11":[34,3],"12":[34,1],"13":[34,13],"14":[6,0]},"meta":{"lastBranch":15,"lastFunction":27,"lastStatement":75,"seen":{"f:11:24:11:33":0,"s:12:24:12:Infinity":0,"s:14:34:14:Infinity":1,"s:15:28:15:Infinity":2,"s:16:24:16:Infinity":3,"s:18:34:18:Infinity":4,"s:21:21:36:Infinity":5,"f:21:39:21:45":1,"s:22:4:22:Infinity":6,"s:23:4:35:Infinity":7,"f:24:12:24:13":2,"b:25:8:25:Infinity:undefined:undefined:undefined:undefined":0,"s:25:8:25:Infinity":8,"s:25:21:25:Infinity":9,"s:26:8:26:Infinity":10,"f:28:12:28:13":3,"s:29:8:29:Infinity":11,"s:30:8:30:Infinity":12,"f:32:13:32:14":4,"s:33:8:33:Infinity":13,"s:34:8:34:Infinity":14,"s:38:2:41:Infinity":15,"f:38:12:38:18":5,"s:40:4:40:Infinity":16,"s:44:24:66:Infinity":17,"f:44:24:44:25":6,"s:45:4:45:Infinity":18,"b:46:4:46:Infinity:undefined:undefined:undefined:undefined":1,"s:46:4:46:Infinity":19,"s:46:21:46:Infinity":20,"s:48:4:48:Infinity":21,"s:49:4:65:Infinity":22,"f:54:12:54:13":7,"b:55:8:55:Infinity:undefined:undefined:undefined:undefined":2,"s:55:8:55:Infinity":23,"s:55:21:55:Infinity":24,"s:56:8:56:Infinity":25,"f:58:12:58:18":8,"s:59:8:59:Infinity":26,"s:60:8:60:Infinity":27,"f:62:13:62:14":9,"s:63:8:63:Infinity":28,"s:64:8:64:Infinity":29,"s:68:27:84:Infinity":30,"f:68:27:68:28":10,"b:69:4:69:Infinity:undefined:undefined:undefined:undefined":3,"s:69:4:69:Infinity":31,"s:69:75:69:Infinity":32,"s:71:4:71:Infinity":33,"s:72:4:83:Infinity":34,"f:75:12:75:13":11,"b:76:8:76:Infinity:undefined:undefined:undefined:undefined":4,"s:76:8:76:Infinity":35,"s:76:21:76:Infinity":36,"s:77:8:77:Infinity":37,"f:77:30:77:31":12,"s:77:37:77:49":38,"s:78:8:78:Infinity":39,"f:80:13:80:14":13,"s:81:8:81:Infinity":40,"s:82:8:82:Infinity":41,"s:86:23:112:Infinity":42,"f:86:23:86:24":14,"s:87:4:87:Infinity":43,"b:88:4:88:Infinity:undefined:undefined:undefined:undefined":5,"s:88:4:88:Infinity":44,"s:88:21:88:Infinity":45,"s:90:4:90:Infinity":46,"s:91:21:91:Infinity":47,"s:92:4:92:Infinity":48,"s:93:4:93:Infinity":49,"s:95:4:111:Infinity":50,"f:99:12:99:13":15,"b:100:8:100:Infinity:undefined:undefined:undefined:undefined":6,"s:100:8:100:Infinity":51,"s:100:21:100:Infinity":52,"s:101:8:101:Infinity":53,"f:103:12:103:18":16,"s:104:8:104:Infinity":54,"s:105:8:105:Infinity":55,"s:106:8:106:Infinity":56,"f:108:13:108:14":17,"s:109:8:109:Infinity":57,"s:110:8:110:Infinity":58,"s:114:22:131:Infinity":59,"f:114:22:114:28":18,"s:115:4:115:Infinity":60,"s:116:4:130:Infinity":61,"f:119:12:119:13":19,"b:120:8:120:Infinity:undefined:undefined:undefined:undefined":7,"s:120:8:120:Infinity":62,"s:120:21:120:Infinity":63,"s:121:8:121:Infinity":64,"f:123:12:123:18":20,"s:124:8:124:Infinity":65,"s:125:8:125:Infinity":66,"f:127:13:127:14":21,"s:128:8:128:Infinity":67,"s:129:8:129:Infinity":68,"s:133:2:234:Infinity":69,"b:137:7:137:Infinity:138:8:154:Infinity":8,"b:144:21:144:34:144:34:144:Infinity":9,"f:145:24:145:25":22,"s:145:31:145:Infinity":70,"f:163:22:163:23":23,"s:163:29:163:Infinity":71,"f:183:24:183:25":24,"s:183:31:183:Infinity":72,"b:183:45:183:68:183:68:183:72":10,"b:187:44:187:59:187:59:187:68":11,"b:210:7:210:16:210:16:210:Infinity":12,"b:214:9:214:20:214:20:214:Infinity":13,"f:216:21:216:22":25,"s:217:12:230:Infinity":73,"b:219:46:219:60:219:60:219:73":14,"f:223:25:223:31":26,"s:223:31:223:Infinity":74}}}
}
diff --git a/frontend/coverage/index.html b/frontend/coverage/index.html
index ad1f79d..3c8ce1b 100644
--- a/frontend/coverage/index.html
+++ b/frontend/coverage/index.html
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
- <span class="strong">79.24% </span>
+ <span class="strong">84.12% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>252/318</span>
+ <span class='fraction'>302/359</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">70.05% </span>
+ <span class="strong">73.24% </span>
<span class="quiet">Branches</span>
- <span class='fraction'>138/197</span>
+ <span class='fraction'>167/228</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">75.26% </span>
+ <span class="strong">81.48% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>70/93</span>
+ <span class='fraction'>88/108</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">81.44% </span>
+ <span class="strong">86.4% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>237/291</span>
+ <span class='fraction'>286/331</span>
</div>
@@ -61,7 +61,7 @@
</div>
</template>
</div>
- <div class='status-line medium'></div>
+ <div class='status-line high'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
@@ -80,32 +80,32 @@
</thead>
<tbody><tr>
<td class="file medium" data-value="src"><a href="src/index.html">src</a></td>
- <td data-value="76.47" class="pic medium">
- <div class="chart"><div class="cover-fill" style="width: 76%"></div><div class="cover-empty" style="width: 24%"></div></div>
+ <td data-value="70.21" class="pic medium">
+ <div class="chart"><div class="cover-fill" style="width: 70%"></div><div class="cover-empty" style="width: 30%"></div></div>
</td>
- <td data-value="76.47" class="pct medium">76.47%</td>
- <td data-value="34" class="abs medium">26/34</td>
- <td data-value="69.23" class="pct medium">69.23%</td>
- <td data-value="26" class="abs medium">18/26</td>
- <td data-value="70" class="pct medium">70%</td>
- <td data-value="10" class="abs medium">7/10</td>
- <td data-value="78.78" class="pct medium">78.78%</td>
- <td data-value="33" class="abs medium">26/33</td>
+ <td data-value="70.21" class="pct medium">70.21%</td>
+ <td data-value="47" class="abs medium">33/47</td>
+ <td data-value="65.71" class="pct medium">65.71%</td>
+ <td data-value="35" class="abs medium">23/35</td>
+ <td data-value="60" class="pct medium">60%</td>
+ <td data-value="15" class="abs medium">9/15</td>
+ <td data-value="71.11" class="pct medium">71.11%</td>
+ <td data-value="45" class="abs medium">32/45</td>
</tr>
<tr>
- <td class="file medium" data-value="src/components"><a href="src/components/index.html">src/components</a></td>
- <td data-value="79.57" class="pic medium">
- <div class="chart"><div class="cover-fill" style="width: 79%"></div><div class="cover-empty" style="width: 21%"></div></div>
+ <td class="file high" data-value="src/components"><a href="src/components/index.html">src/components</a></td>
+ <td data-value="86.21" class="pic high">
+ <div class="chart"><div class="cover-fill" style="width: 86%"></div><div class="cover-empty" style="width: 14%"></div></div>
</td>
- <td data-value="79.57" class="pct medium">79.57%</td>
- <td data-value="284" class="abs medium">226/284</td>
- <td data-value="70.17" class="pct medium">70.17%</td>
- <td data-value="171" class="abs medium">120/171</td>
- <td data-value="75.9" class="pct medium">75.9%</td>
- <td data-value="83" class="abs medium">63/83</td>
- <td data-value="81.78" class="pct high">81.78%</td>
- <td data-value="258" class="abs high">211/258</td>
+ <td data-value="86.21" class="pct high">86.21%</td>
+ <td data-value="312" class="abs high">269/312</td>
+ <td data-value="74.61" class="pct medium">74.61%</td>
+ <td data-value="193" class="abs medium">144/193</td>
+ <td data-value="84.94" class="pct high">84.94%</td>
+ <td data-value="93" class="abs high">79/93</td>
+ <td data-value="88.81" class="pct high">88.81%</td>
+ <td data-value="286" class="abs high">254/286</td>
</tr>
</tbody>
@@ -116,7 +116,7 @@
<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>
diff --git a/frontend/coverage/src/App.css.html b/frontend/coverage/src/App.css.html
index 5fca2a7..d23e87b 100644
--- a/frontend/coverage/src/App.css.html
+++ b/frontend/coverage/src/App.css.html
@@ -135,7 +135,125 @@
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
-<a name='L73'></a><a href='#L73'>73</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L73'></a><a href='#L73'>73</a>
+<a name='L74'></a><a href='#L74'>74</a>
+<a name='L75'></a><a href='#L75'>75</a>
+<a name='L76'></a><a href='#L76'>76</a>
+<a name='L77'></a><a href='#L77'>77</a>
+<a name='L78'></a><a href='#L78'>78</a>
+<a name='L79'></a><a href='#L79'>79</a>
+<a name='L80'></a><a href='#L80'>80</a>
+<a name='L81'></a><a href='#L81'>81</a>
+<a name='L82'></a><a href='#L82'>82</a>
+<a name='L83'></a><a href='#L83'>83</a>
+<a name='L84'></a><a href='#L84'>84</a>
+<a name='L85'></a><a href='#L85'>85</a>
+<a name='L86'></a><a href='#L86'>86</a>
+<a name='L87'></a><a href='#L87'>87</a>
+<a name='L88'></a><a href='#L88'>88</a>
+<a name='L89'></a><a href='#L89'>89</a>
+<a name='L90'></a><a href='#L90'>90</a>
+<a name='L91'></a><a href='#L91'>91</a>
+<a name='L92'></a><a href='#L92'>92</a>
+<a name='L93'></a><a href='#L93'>93</a>
+<a name='L94'></a><a href='#L94'>94</a>
+<a name='L95'></a><a href='#L95'>95</a>
+<a name='L96'></a><a href='#L96'>96</a>
+<a name='L97'></a><a href='#L97'>97</a>
+<a name='L98'></a><a href='#L98'>98</a>
+<a name='L99'></a><a href='#L99'>99</a>
+<a name='L100'></a><a href='#L100'>100</a>
+<a name='L101'></a><a href='#L101'>101</a>
+<a name='L102'></a><a href='#L102'>102</a>
+<a name='L103'></a><a href='#L103'>103</a>
+<a name='L104'></a><a href='#L104'>104</a>
+<a name='L105'></a><a href='#L105'>105</a>
+<a name='L106'></a><a href='#L106'>106</a>
+<a name='L107'></a><a href='#L107'>107</a>
+<a name='L108'></a><a href='#L108'>108</a>
+<a name='L109'></a><a href='#L109'>109</a>
+<a name='L110'></a><a href='#L110'>110</a>
+<a name='L111'></a><a href='#L111'>111</a>
+<a name='L112'></a><a href='#L112'>112</a>
+<a name='L113'></a><a href='#L113'>113</a>
+<a name='L114'></a><a href='#L114'>114</a>
+<a name='L115'></a><a href='#L115'>115</a>
+<a name='L116'></a><a href='#L116'>116</a>
+<a name='L117'></a><a href='#L117'>117</a>
+<a name='L118'></a><a href='#L118'>118</a>
+<a name='L119'></a><a href='#L119'>119</a>
+<a name='L120'></a><a href='#L120'>120</a>
+<a name='L121'></a><a href='#L121'>121</a>
+<a name='L122'></a><a href='#L122'>122</a>
+<a name='L123'></a><a href='#L123'>123</a>
+<a name='L124'></a><a href='#L124'>124</a>
+<a name='L125'></a><a href='#L125'>125</a>
+<a name='L126'></a><a href='#L126'>126</a>
+<a name='L127'></a><a href='#L127'>127</a>
+<a name='L128'></a><a href='#L128'>128</a>
+<a name='L129'></a><a href='#L129'>129</a>
+<a name='L130'></a><a href='#L130'>130</a>
+<a name='L131'></a><a href='#L131'>131</a>
+<a name='L132'></a><a href='#L132'>132</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>
+<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-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-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-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-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-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-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-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-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-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-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-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>
@@ -236,7 +354,7 @@ body {
&nbsp;
.dashboard-sidebar {
width: 11rem;
- background: var(--sidebar-bg);
+ background: transparent;
border-right: 1px solid var(--border-color);
display: flex;
flex-direction: column;
@@ -267,18 +385,77 @@ body {
top: 1rem;
left: 1rem;
z-index: 1000;
- background: transparent;
+ background: var(--bg-color);
+ /* Added bg to be visible over content if needed */
border: none;
font-size: 2rem;
line-height: 1;
cursor: pointer;
- padding: 0;
+ padding: 0.2rem;
color: var(--text-color);
- /* Inherit didn't work well if parent is transparent */
+ border-radius: 50%;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
&nbsp;
.fixed-toggle:hover {
transform: scale(1.1);
+}
+&nbsp;
+/* Mobile Responsiveness */
+@media (max-width: 768px) {
+ .dashboard-sidebar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ z-index: 1100;
+ box-shadow: 2px 0 10px rgba(0, 0, 0, 0.2);
+ width: 14rem;
+ /* Slightly wider on mobile for better target area */
+ }
+&nbsp;
+ .dashboard-sidebar.hidden {
+ margin-left: -14rem;
+ }
+&nbsp;
+ .dashboard-main {
+ padding: 1rem;
+ padding-top: 4rem;
+ /* Space for the toggle button */
+ }
+&nbsp;
+ .dashboard-main&gt;* {
+ max-width: 100%;
+ }
+&nbsp;
+ /* When sidebar is visible on mobile, we show a backdrop */
+ .sidebar-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.4);
+ z-index: 1050;
+ animation: fadeIn 0.3s ease;
+ }
+&nbsp;
+ .dashboard.sidebar-visible::after {
+ display: none;
+ }
+}
+&nbsp;
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+&nbsp;
+ to {
+ opacity: 1;
+ }
}</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
@@ -286,7 +463,7 @@ body {
<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>
diff --git a/frontend/coverage/src/App.tsx.html b/frontend/coverage/src/App.tsx.html
index cd305cc..6ec66af 100644
--- a/frontend/coverage/src/App.tsx.html
+++ b/frontend/coverage/src/App.tsx.html
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
- <span class="strong">72.72% </span>
+ <span class="strong">65.71% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>16/22</span>
+ <span class='fraction'>23/35</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">62.5% </span>
+ <span class="strong">60% </span>
<span class="quiet">Branches</span>
- <span class='fraction'>10/16</span>
+ <span class='fraction'>15/25</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">62.5% </span>
+ <span class="strong">53.84% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>5/8</span>
+ <span class='fraction'>7/13</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">72.72% </span>
+ <span class="strong">64.7% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>16/22</span>
+ <span class='fraction'>22/34</span>
</div>
@@ -162,7 +162,48 @@
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
-<a name='L100'></a><a href='#L100'>100</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L100'></a><a href='#L100'>100</a>
+<a name='L101'></a><a href='#L101'>101</a>
+<a name='L102'></a><a href='#L102'>102</a>
+<a name='L103'></a><a href='#L103'>103</a>
+<a name='L104'></a><a href='#L104'>104</a>
+<a name='L105'></a><a href='#L105'>105</a>
+<a name='L106'></a><a href='#L106'>106</a>
+<a name='L107'></a><a href='#L107'>107</a>
+<a name='L108'></a><a href='#L108'>108</a>
+<a name='L109'></a><a href='#L109'>109</a>
+<a name='L110'></a><a href='#L110'>110</a>
+<a name='L111'></a><a href='#L111'>111</a>
+<a name='L112'></a><a href='#L112'>112</a>
+<a name='L113'></a><a href='#L113'>113</a>
+<a name='L114'></a><a href='#L114'>114</a>
+<a name='L115'></a><a href='#L115'>115</a>
+<a name='L116'></a><a href='#L116'>116</a>
+<a name='L117'></a><a href='#L117'>117</a>
+<a name='L118'></a><a href='#L118'>118</a>
+<a name='L119'></a><a href='#L119'>119</a>
+<a name='L120'></a><a href='#L120'>120</a>
+<a name='L121'></a><a href='#L121'>121</a>
+<a name='L122'></a><a href='#L122'>122</a>
+<a name='L123'></a><a href='#L123'>123</a>
+<a name='L124'></a><a href='#L124'>124</a>
+<a name='L125'></a><a href='#L125'>125</a>
+<a name='L126'></a><a href='#L126'>126</a>
+<a name='L127'></a><a href='#L127'>127</a>
+<a name='L128'></a><a href='#L128'>128</a>
+<a name='L129'></a><a href='#L129'>129</a>
+<a name='L130'></a><a href='#L130'>130</a>
+<a name='L131'></a><a href='#L131'>131</a>
+<a name='L132'></a><a href='#L132'>132</a>
+<a name='L133'></a><a href='#L133'>133</a>
+<a name='L134'></a><a href='#L134'>134</a>
+<a name='L135'></a><a href='#L135'>135</a>
+<a name='L136'></a><a href='#L136'>136</a>
+<a name='L137'></a><a href='#L137'>137</a>
+<a name='L138'></a><a href='#L138'>138</a>
+<a name='L139'></a><a href='#L139'>139</a>
+<a name='L140'></a><a href='#L140'>140</a>
+<a name='L141'></a><a href='#L141'>141</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>
@@ -201,9 +242,28 @@
<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-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">1x</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-no">&nbsp;</span>
+<span class="cline-any cline-no">&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>
+<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">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>
@@ -220,6 +280,12 @@
<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>
+<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-neutral">&nbsp;</span>
@@ -234,6 +300,12 @@
<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-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-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
@@ -242,9 +314,19 @@
<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-no">&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>
<span class="cline-any cline-yes">2x</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>
+<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-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -299,31 +381,61 @@ import FeedList from './components/FeedList';
import FeedItems from './components/FeedItems';
import Settings from './components/Settings';
&nbsp;
-function Dashboard({ theme, setTheme }: { theme: string; setTheme: (t: string) =&gt; void }) {
- const [sidebarVisible, setSidebarVisible] = useState(true);
+interface DashboardProps {
+ theme: string;
+ setTheme: (t: string) =&gt; void;
+ fontTheme: string;
+ setFontTheme: (t: string) =&gt; void;
+}
+&nbsp;
+function Dashboard({ theme, setTheme, fontTheme, setFontTheme }: DashboardProps) {
+ const [sidebarVisible, setSidebarVisible] = useState(window.innerWidth &gt; 768);
+&nbsp;
+ useEffect(() =&gt; {
+ const handleResize = <span class="fstat-no" title="function not covered" >() =&gt; {</span>
+<span class="cstat-no" title="statement not covered" > if (window.innerWidth &gt; 768) {</span>
+<span class="cstat-no" title="statement not covered" > setSidebarVisible(true);</span>
+ } else {
+<span class="cstat-no" title="statement not covered" > setSidebarVisible(false);</span>
+ }
+ };
+ window.addEventListener('resize', handleResize);
+ return () =&gt; window.removeEventListener('resize', handleResize);
+ }, []);
&nbsp;
return (
&lt;div
- className={`dashboard ${sidebarVisible ? 'sidebar-visible' : <span class="branch-1 cbranch-no" title="branch not covered" >'sidebar-hidden'}</span> theme-${theme}`}
+ className={`dashboard ${sidebarVisible ? 'sidebar-visible' : <span class="branch-1 cbranch-no" title="branch not covered" >'sidebar-hidden'}</span> theme-${theme} font-${fontTheme}`}
&gt;
&lt;div className="dashboard-content"&gt;
- {!sidebarVisible &amp;&amp; (
-<span class="branch-1 cbranch-no" title="branch not covered" > &lt;button</span>
+ {(!sidebarVisible || window.innerWidth &lt;= 768) &amp;&amp; (
+<span class="branch-2 cbranch-no" title="branch not covered" > &lt;button</span>
className="sidebar-toggle fixed-toggle"
- onClick={<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(true)}</span>
- title="Show Sidebar"
+ onClick={<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(!sidebarVisible)}</span>
+ title={sidebarVisible ? "Hide Sidebar" : "Show Sidebar"}
&gt;
🐱
&lt;/button&gt;
)}
+ {sidebarVisible &amp;&amp; (
+ &lt;div
+ className="sidebar-backdrop"
+ onClick={<span class="fstat-no" title="function not covered" >() =&gt; <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(false)}</span>
+ /&gt;
+ )}
&lt;aside className={`dashboard-sidebar ${sidebarVisible ? '' : <span class="branch-1 cbranch-no" title="branch not covered" >'hidden'}</span>`}&gt;
- &lt;FeedList theme={theme} setTheme={setTheme} setSidebarVisible={setSidebarVisible} /&gt;
+ &lt;FeedList
+ theme={theme}
+ setTheme={setTheme}
+ setSidebarVisible={setSidebarVisible}
+ isMobile={window.innerWidth &lt;= 768}
+ /&gt;
&lt;/aside&gt;
&lt;main className="dashboard-main"&gt;
&lt;Routes&gt;
&lt;Route path="/feed/:feedId" element={&lt;FeedItems /&gt;} /&gt;
&lt;Route path="/tag/:tagName" element={&lt;FeedItems /&gt;} /&gt;
- &lt;Route path="/settings" element={&lt;Settings /&gt;} /&gt;
+ &lt;Route path="/settings" element={&lt;Settings fontTheme={fontTheme} setFontTheme={setFontTheme} /&gt;} /&gt;
&lt;Route path="/" element={&lt;FeedItems /&gt;} /&gt;
&lt;/Routes&gt;
&lt;/main&gt;
@@ -334,12 +446,18 @@ function Dashboard({ theme, setTheme }: { theme: string; setTheme: (t: string) =
&nbsp;
function App() {
const [theme, setTheme] = useState(localStorage.getItem('neko-theme') || 'light');
+ const [fontTheme, setFontTheme] = useState(localStorage.getItem('neko-font-theme') || 'default');
&nbsp;
const handleSetTheme = <span class="fstat-no" title="function not covered" >(n</span>ewTheme: string) =&gt; {
<span class="cstat-no" title="statement not covered" > setTheme(newTheme);</span>
<span class="cstat-no" title="statement not covered" > localStorage.setItem('neko-theme', newTheme);</span>
};
&nbsp;
+ const handleSetFontTheme = <span class="fstat-no" title="function not covered" >(n</span>ewFontTheme: string) =&gt; {
+<span class="cstat-no" title="statement not covered" > setFontTheme(newFontTheme);</span>
+<span class="cstat-no" title="statement not covered" > localStorage.setItem('neko-font-theme', newFontTheme);</span>
+ };
+&nbsp;
const basename = window.location.pathname.startsWith('/v2') ? '/v2' : <span class="branch-1 cbranch-no" title="branch not covered" >'/';</span>
&nbsp;
return (
@@ -350,7 +468,12 @@ function App() {
path="/*"
element={
&lt;RequireAuth&gt;
- &lt;Dashboard theme={theme} setTheme={handleSetTheme} /&gt;
+ &lt;Dashboard
+ theme={theme}
+ setTheme={handleSetTheme}
+ fontTheme={fontTheme}
+ setFontTheme={handleSetFontTheme}
+ /&gt;
&lt;/RequireAuth&gt;
}
/&gt;
@@ -367,7 +490,7 @@ export default App;
<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>
diff --git a/frontend/coverage/src/components/FeedItem.css.html b/frontend/coverage/src/components/FeedItem.css.html
index 213077f..192959f 100644
--- a/frontend/coverage/src/components/FeedItem.css.html
+++ b/frontend/coverage/src/components/FeedItem.css.html
@@ -188,7 +188,51 @@
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
-<a name='L126'></a><a href='#L126'>126</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L126'></a><a href='#L126'>126</a>
+<a name='L127'></a><a href='#L127'>127</a>
+<a name='L128'></a><a href='#L128'>128</a>
+<a name='L129'></a><a href='#L129'>129</a>
+<a name='L130'></a><a href='#L130'>130</a>
+<a name='L131'></a><a href='#L131'>131</a>
+<a name='L132'></a><a href='#L132'>132</a>
+<a name='L133'></a><a href='#L133'>133</a>
+<a name='L134'></a><a href='#L134'>134</a>
+<a name='L135'></a><a href='#L135'>135</a>
+<a name='L136'></a><a href='#L136'>136</a>
+<a name='L137'></a><a href='#L137'>137</a>
+<a name='L138'></a><a href='#L138'>138</a>
+<a name='L139'></a><a href='#L139'>139</a>
+<a name='L140'></a><a href='#L140'>140</a>
+<a name='L141'></a><a href='#L141'>141</a>
+<a name='L142'></a><a href='#L142'>142</a>
+<a name='L143'></a><a href='#L143'>143</a>
+<a name='L144'></a><a href='#L144'>144</a>
+<a name='L145'></a><a href='#L145'>145</a>
+<a name='L146'></a><a href='#L146'>146</a>
+<a name='L147'></a><a href='#L147'>147</a>
+<a name='L148'></a><a href='#L148'>148</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>
+<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-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-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-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-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -330,7 +374,7 @@
}
&nbsp;
.item-title {
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: var(--font-heading);
font-size: 1.8rem;
font-weight: bold;
text-decoration: none;
@@ -429,7 +473,7 @@
border: 1px solid var(--border-color, #ccc);
color: blue;
cursor: pointer;
- font-family: 'Helvetica Neue';
+ font-family: var(--font-heading);
font-weight: bold;
font-size: 0.8rem;
padding: 2px 6px;
@@ -438,6 +482,28 @@
&nbsp;
.scrape-btn:hover {
background: var(--sidebar-bg);
+}
+&nbsp;
+@media (max-width: 768px) {
+ .feed-item {
+ margin-top: 2rem;
+ padding: 0.5rem;
+ }
+&nbsp;
+ .item-title {
+ font-size: 1.4rem;
+ word-break: break-word;
+ }
+&nbsp;
+ .item-header {
+ flex-direction: column;
+ gap: 0.5rem;
+ }
+&nbsp;
+ .item-actions {
+ margin-left: 0;
+ margin-bottom: 0.5rem;
+ }
}</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
@@ -445,7 +511,7 @@
<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>
diff --git a/frontend/coverage/src/components/FeedItem.tsx.html b/frontend/coverage/src/components/FeedItem.tsx.html
index 6e76131..6df1fec 100644
--- a/frontend/coverage/src/components/FeedItem.tsx.html
+++ b/frontend/coverage/src/components/FeedItem.tsx.html
@@ -189,18 +189,18 @@
<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">33x</span>
-<span class="cline-any cline-yes">33x</span>
+<span class="cline-any cline-yes">56x</span>
+<span class="cline-any cline-yes">56x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">33x</span>
-<span class="cline-any cline-yes">16x</span>
+<span class="cline-any cline-yes">56x</span>
+<span class="cline-any cline-yes">22x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">33x</span>
+<span class="cline-any cline-yes">56x</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">33x</span>
+<span class="cline-any cline-yes">56x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
@@ -236,7 +236,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-yes">33x</span>
+<span class="cline-any cline-yes">56x</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>
@@ -254,7 +254,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-yes">33x</span>
+<span class="cline-any cline-yes">56x</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>
@@ -415,7 +415,7 @@ export default function FeedItem({ item: initialItem }: FeedItemProps) {
<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>
diff --git a/frontend/coverage/src/components/FeedItems.css.html b/frontend/coverage/src/components/FeedItems.css.html
index 7a971c6..66a3307 100644
--- a/frontend/coverage/src/components/FeedItems.css.html
+++ b/frontend/coverage/src/components/FeedItems.css.html
@@ -136,7 +136,7 @@
<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>
diff --git a/frontend/coverage/src/components/FeedItems.tsx.html b/frontend/coverage/src/components/FeedItems.tsx.html
index f6b7493..9811743 100644
--- a/frontend/coverage/src/components/FeedItems.tsx.html
+++ b/frontend/coverage/src/components/FeedItems.tsx.html
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
- <span class="strong">88.97% </span>
+ <span class="strong">89.23% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>113/127</span>
+ <span class='fraction'>116/130</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">75.3% </span>
+ <span class="strong">76.19% </span>
<span class="quiet">Branches</span>
- <span class='fraction'>61/81</span>
+ <span class='fraction'>64/84</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">86.2% </span>
+ <span class="strong">87.09% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>25/29</span>
+ <span class='fraction'>27/31</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">88.69% </span>
+ <span class="strong">89.07% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>102/115</span>
+ <span class='fraction'>106/119</span>
</div>
@@ -296,7 +296,25 @@
<a name='L231'></a><a href='#L231'>231</a>
<a name='L232'></a><a href='#L232'>232</a>
<a name='L233'></a><a href='#L233'>233</a>
-<a name='L234'></a><a href='#L234'>234</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L234'></a><a href='#L234'>234</a>
+<a name='L235'></a><a href='#L235'>235</a>
+<a name='L236'></a><a href='#L236'>236</a>
+<a name='L237'></a><a href='#L237'>237</a>
+<a name='L238'></a><a href='#L238'>238</a>
+<a name='L239'></a><a href='#L239'>239</a>
+<a name='L240'></a><a href='#L240'>240</a>
+<a name='L241'></a><a href='#L241'>241</a>
+<a name='L242'></a><a href='#L242'>242</a>
+<a name='L243'></a><a href='#L243'>243</a>
+<a name='L244'></a><a href='#L244'>244</a>
+<a name='L245'></a><a href='#L245'>245</a>
+<a name='L246'></a><a href='#L246'>246</a>
+<a name='L247'></a><a href='#L247'>247</a>
+<a name='L248'></a><a href='#L248'>248</a>
+<a name='L249'></a><a href='#L249'>249</a>
+<a name='L250'></a><a href='#L250'>250</a>
+<a name='L251'></a><a href='#L251'>251</a>
+<a name='L252'></a><a href='#L252'>252</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>
@@ -304,78 +322,78 @@
<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">27x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">27x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">1x</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-yes">8x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">8x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">6x</span>
+<span class="cline-any cline-yes">9x</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">8x</span>
-<span class="cline-any cline-yes">1x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-yes">3x</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">8x</span>
-<span class="cline-any cline-yes">8x</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-yes">8x</span>
+<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-yes">8x</span>
+<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-no">&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>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">8x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-yes">11x</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">8x</span>
-<span class="cline-any cline-yes">8x</span>
-<span class="cline-any cline-yes">8x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-yes">11x</span>
+<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">8x</span>
+<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">7x</span>
+<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">7x</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
-<span class="cline-any cline-yes">6x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
@@ -384,20 +402,21 @@
<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">27x</span>
-<span class="cline-any cline-yes">7x</span>
-<span class="cline-any cline-yes">7x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">8x</span>
+<span class="cline-any cline-yes">8x</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">27x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">27x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
@@ -409,7 +428,7 @@
<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">27x</span>
+<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
@@ -421,22 +440,29 @@
<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">27x</span>
-<span class="cline-any cline-yes">23x</span>
-<span class="cline-any cline-yes">3x</span>
+<span class="cline-any cline-yes">36x</span>
+<span class="cline-any cline-yes">31x</span>
+<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">3x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">2x</span>
+<span class="cline-any cline-yes">6x</span>
+<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">5x</span>
+<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
+<span class="cline-any cline-yes">5x</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">5x</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">5x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
@@ -455,25 +481,19 @@
<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">23x</span>
-<span class="cline-any cline-yes">23x</span>
+<span class="cline-any cline-yes">31x</span>
+<span class="cline-any cline-yes">31x</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">27x</span>
-<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
+<span class="cline-any cline-yes">36x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">2x</span>
-<span class="cline-any cline-yes">1x</span>
-<span class="cline-any cline-yes">1x</span>
+<span class="cline-any cline-yes">31x</span>
<span class="cline-any cline-neutral">&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-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
@@ -488,29 +508,45 @@
<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">24x</span>
-<span class="cline-any cline-yes">15x</span>
-<span class="cline-any cline-yes">15x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">31x</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-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">24x</span>
-<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">24x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">27x</span>
-<span class="cline-any cline-yes">14x</span>
+<span class="cline-any cline-yes">31x</span>
+<span class="cline-any cline-yes">31x</span>
+<span class="cline-any cline-yes">31x</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">31x</span>
+<span class="cline-any cline-yes">31x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">31x</span>
+<span class="cline-any cline-yes">31x</span>
+<span class="cline-any cline-yes">31x</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">36x</span>
<span class="cline-any cline-yes">21x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">20x</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-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">44x</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>
@@ -620,6 +656,7 @@ export default function FeedItems() {
useEffect(() =&gt; {
fetchItems();
setSelectedIndex(-1);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, [feedId, tagName, filterFn, searchParams]);
&nbsp;
&nbsp;
@@ -668,6 +705,13 @@ export default function FeedItems() {
}
scrollToItem(nextIndex);
}
+&nbsp;
+ // If we're now on the last item and there are more items to load,
+ // trigger loading them so the next 'j' press will work
+ if (nextIndex === items.length - 1 &amp;&amp; hasMore &amp;&amp; !loadingMore) {
+ fetchItems(String(items[items.length - 1]._id));
+ }
+&nbsp;
return nextIndex;
});
<span class="missing-if-branch" title="if path not taken" >I</span>} else if (e.key === 'k') {
@@ -690,22 +734,16 @@ export default function FeedItems() {
&nbsp;
window.addEventListener('keydown', handleKeyDown);
return () =&gt; window.removeEventListener('keydown', handleKeyDown);
- }, [items]);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [items, hasMore, loadingMore]);
&nbsp;
&nbsp;
&nbsp;
useEffect(() =&gt; {
- const observer = new IntersectionObserver(
+ // Observer for marking items as read
+ const itemObserver = new IntersectionObserver(
(entries) =&gt; {
entries.forEach((entry) =&gt; {
- // Infinity scroll sentinel
- if (entry.target.id === 'load-more-sentinel') {
- <span class="missing-if-branch" title="else path not taken" >E</span>if (entry.isIntersecting &amp;&amp; !loadingMore &amp;&amp; hasMore &amp;&amp; items.length &gt; 0) {
- fetchItems(String(items[items.length - 1]._id));
- }
- return;
- }
-&nbsp;
// If item is not intersecting and is above the viewport, it's been scrolled past
<span class="missing-if-branch" title="else path not taken" >E</span>if (!entry.isIntersecting &amp;&amp; entry.boundingClientRect.top &lt; 0) {
const index = Number(entry.target.getAttribute('data-index'));
@@ -721,15 +759,31 @@ export default function FeedItems() {
{ root: null, threshold: 0 }
);
&nbsp;
+ // Observer for infinite scroll (less aggressive, must be fully visible)
+ const sentinelObserver = new IntersectionObserver(
+ (entries) =&gt; {
+ entries.forEach((entry) =&gt; {
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (entry.isIntersecting &amp;&amp; !loadingMore &amp;&amp; hasMore &amp;&amp; items.length &gt; 0) {
+ fetchItems(String(items[items.length - 1]._id));
+ }
+ });
+ },
+ { root: null, threshold: 1.0 }
+ );
+&nbsp;
items.forEach((_, index) =&gt; {
const el = document.getElementById(`item-${index}`);
- <span class="missing-if-branch" title="else path not taken" >E</span>if (el) observer.observe(el);
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (el) itemObserver.observe(el);
});
&nbsp;
const sentinel = document.getElementById('load-more-sentinel');
- if (sentinel) observer.observe(sentinel);
+ if (sentinel) sentinelObserver.observe(sentinel);
&nbsp;
- return () =&gt; observer.disconnect();
+ return () =&gt; {
+ itemObserver.disconnect();
+ sentinelObserver.disconnect();
+ };
+ // eslint-disable-next-line react-hooks/exhaustive-deps
}, [items, loadingMore, hasMore]);
&nbsp;
if (loading) return &lt;div className="feed-items-loading"&gt;Loading items...&lt;/div&gt;;
@@ -769,7 +823,7 @@ export default function FeedItems() {
<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>
diff --git a/frontend/coverage/src/components/FeedList.css.html b/frontend/coverage/src/components/FeedList.css.html
index 2b93e18..d892e77 100644
--- a/frontend/coverage/src/components/FeedList.css.html
+++ b/frontend/coverage/src/components/FeedList.css.html
@@ -236,7 +236,87 @@
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
-<a name='L174'></a><a href='#L174'>174</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L174'></a><a href='#L174'>174</a>
+<a name='L175'></a><a href='#L175'>175</a>
+<a name='L176'></a><a href='#L176'>176</a>
+<a name='L177'></a><a href='#L177'>177</a>
+<a name='L178'></a><a href='#L178'>178</a>
+<a name='L179'></a><a href='#L179'>179</a>
+<a name='L180'></a><a href='#L180'>180</a>
+<a name='L181'></a><a href='#L181'>181</a>
+<a name='L182'></a><a href='#L182'>182</a>
+<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>
+<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>
+<a name='L214'></a><a href='#L214'>214</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>
+<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-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-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-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-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-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-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-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>
@@ -411,10 +491,13 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">.feed-list {
padding: 1rem;
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: var(--font-heading);
color: #777;
/* specific v1 color */
font-size: 0.8rem;
+ background: var(--sidebar-bg);
+ min-height: 100%;
+ flex: 1;
}
&nbsp;
.feed-list h1.logo {
@@ -429,9 +512,6 @@
z-index: 10;
padding-bottom: 0.5rem;
color: var(--text-color);
- /* Usually dark/white depending on theme, v1 was white on blue? No, white on fixed header? No, v1 logo class says color: white. But sidebar is #ccc. */
- /* In v1 logo was fixed top left (blue header bar?). In v2 sidebar is #ccc.
- Let's use theme text color but maybe bolder? */
}
&nbsp;
/* Override logo color if necessary for themes */
@@ -466,11 +546,25 @@
margin: 1rem 0 0.25rem 0;
cursor: pointer;
user-select: none;
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-family: var(--font-heading);
color: #333;
/* Darker than list items */
text-transform: lowercase;
font-variant: small-caps;
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+}
+&nbsp;
+.caret {
+ display: inline-block;
+ font-size: 0.6rem;
+ transition: transform 0.2s ease;
+ color: #777;
+}
+&nbsp;
+.caret.expanded {
+ transform: rotate(90deg);
}
&nbsp;
.filter-list,
@@ -537,19 +631,25 @@
&nbsp;
.nav-section {
margin-top: 2rem;
- border-top: 1px solid var(--border-color, #999);
- padding-top: 0.5rem;
+ border-top: 1px solid var(--border-color, #eee);
+ padding-top: 1rem;
}
&nbsp;
.logout-link {
text-align: left;
width: 100%;
color: #777;
- /* Make logout less prominent */
+ display: block;
+}
+&nbsp;
+.nav-link,
+.logout-link {
+ padding: 0.25rem 0;
}
&nbsp;
.logout-link:hover {
color: var(--link-color, blue);
+ text-decoration: underline;
}
&nbsp;
.theme-section {
@@ -559,20 +659,40 @@
.theme-selector {
display: flex;
gap: 0.5rem;
+ margin-top: 0.5rem;
}
&nbsp;
.theme-selector button {
- background: transparent;
- border: 1px solid var(--border-color, #999);
+ background: rgba(0, 0, 0, 0.05);
+ border: none;
cursor: pointer;
- padding: 0.1rem 0.3rem;
- font-size: 0.9rem;
- border-radius: 0;
+ padding: 0.4rem;
+ font-size: 1rem;
+ border-radius: 8px;
+ line-height: 1;
+ transition: all 0.2s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+&nbsp;
+.theme-selector button:hover {
+ background: rgba(0, 0, 0, 0.1);
+ transform: translateY(-2px);
}
&nbsp;
.theme-selector button.active {
background: var(--border-color, #999);
color: white;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+}
+&nbsp;
+.theme-dark .theme-selector button {
+ background: rgba(255, 255, 255, 0.1);
+}
+&nbsp;
+.theme-dark .theme-selector button:hover {
+ background: rgba(255, 255, 255, 0.2);
}
&nbsp;
/* Scrollbar styling for webkit */
@@ -589,7 +709,7 @@
<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>
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>
diff --git a/frontend/coverage/src/components/Login.css.html b/frontend/coverage/src/components/Login.css.html
index 031618b..140a86b 100644
--- a/frontend/coverage/src/components/Login.css.html
+++ b/frontend/coverage/src/components/Login.css.html
@@ -259,7 +259,7 @@ button[type='submit']:hover {
<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>
diff --git a/frontend/coverage/src/components/Login.tsx.html b/frontend/coverage/src/components/Login.tsx.html
index 43fb613..111dcba 100644
--- a/frontend/coverage/src/components/Login.tsx.html
+++ b/frontend/coverage/src/components/Login.tsx.html
@@ -25,7 +25,7 @@
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>17/17</span>
+ <span class='fraction'>20/20</span>
</div>
@@ -39,14 +39,14 @@
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>3/3</span>
+ <span class='fraction'>4/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>17/17</span>
+ <span class='fraction'>20/20</span>
</div>
@@ -119,18 +119,30 @@
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
-<a name='L57'></a><a href='#L57'>57</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L57'></a><a href='#L57'>57</a>
+<a name='L58'></a><a href='#L58'>58</a>
+<a name='L59'></a><a href='#L59'>59</a>
+<a name='L60'></a><a href='#L60'>60</a>
+<a name='L61'></a><a href='#L61'>61</a>
+<a name='L62'></a><a href='#L62'>62</a>
+<a name='L63'></a><a href='#L63'>63</a>
+<a name='L64'></a><a href='#L64'>64</a>
+<a name='L65'></a><a href='#L65'>65</a>
+<a name='L66'></a><a href='#L66'>66</a>
+<a name='L67'></a><a href='#L67'>67</a>
+<a name='L68'></a><a href='#L68'>68</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>
<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">14x</span>
-<span class="cline-any cline-yes">14x</span>
-<span class="cline-any cline-yes">14x</span>
+<span class="cline-any cline-yes">17x</span>
+<span class="cline-any cline-yes">17x</span>
+<span class="cline-any cline-yes">17x</span>
+<span class="cline-any cline-yes">17x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">14x</span>
+<span class="cline-any cline-yes">17x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -138,6 +150,7 @@
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
+<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -155,10 +168,19 @@
<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">14x</span>
+<span class="cline-any cline-yes">17x</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-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">3x</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-neutral">&nbsp;</span>
@@ -182,6 +204,7 @@ import './Login.css';
import { apiFetch } from '../utils';
&nbsp;
export default function Login() {
+ const [username, setUsername] = useState('neko');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const navigate = useNavigate();
@@ -193,6 +216,7 @@ export default function Login() {
try {
// Use URLSearchParams to send as form-urlencoded, matching backend expectation
const params = new URLSearchParams();
+ params.append('username', username);
params.append('password', password);
&nbsp;
const res = await apiFetch('/api/login', {
@@ -206,7 +230,7 @@ export default function Login() {
const data = await res.json();
setError(data.message || <span class="branch-1 cbranch-no" title="branch not covered" >'Login failed')</span>;
}
- } catch (err) {
+ } catch (_err) {
setError('Network error');
}
};
@@ -216,6 +240,15 @@ export default function Login() {
&lt;form onSubmit={handleSubmit} className="login-form"&gt;
&lt;h1&gt;neko rss mode&lt;/h1&gt;
&lt;div className="form-group"&gt;
+ &lt;label htmlFor="username"&gt;username&lt;/label&gt;
+ &lt;input
+ id="username"
+ type="text"
+ value={username}
+ onChange={(e) =&gt; setUsername(e.target.value)}
+ /&gt;
+ &lt;/div&gt;
+ &lt;div className="form-group"&gt;
&lt;label htmlFor="password"&gt;password&lt;/label&gt;
&lt;input
id="password"
@@ -238,7 +271,7 @@ export default function Login() {
<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>
diff --git a/frontend/coverage/src/components/Settings.css.html b/frontend/coverage/src/components/Settings.css.html
index 28a1915..4109bba 100644
--- a/frontend/coverage/src/components/Settings.css.html
+++ b/frontend/coverage/src/components/Settings.css.html
@@ -223,7 +223,86 @@
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
-<a name='L161'></a><a href='#L161'>161</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L161'></a><a href='#L161'>161</a>
+<a name='L162'></a><a href='#L162'>162</a>
+<a name='L163'></a><a href='#L163'>163</a>
+<a name='L164'></a><a href='#L164'>164</a>
+<a name='L165'></a><a href='#L165'>165</a>
+<a name='L166'></a><a href='#L166'>166</a>
+<a name='L167'></a><a href='#L167'>167</a>
+<a name='L168'></a><a href='#L168'>168</a>
+<a name='L169'></a><a href='#L169'>169</a>
+<a name='L170'></a><a href='#L170'>170</a>
+<a name='L171'></a><a href='#L171'>171</a>
+<a name='L172'></a><a href='#L172'>172</a>
+<a name='L173'></a><a href='#L173'>173</a>
+<a name='L174'></a><a href='#L174'>174</a>
+<a name='L175'></a><a href='#L175'>175</a>
+<a name='L176'></a><a href='#L176'>176</a>
+<a name='L177'></a><a href='#L177'>177</a>
+<a name='L178'></a><a href='#L178'>178</a>
+<a name='L179'></a><a href='#L179'>179</a>
+<a name='L180'></a><a href='#L180'>180</a>
+<a name='L181'></a><a href='#L181'>181</a>
+<a name='L182'></a><a href='#L182'>182</a>
+<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>
+<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>
+<a name='L214'></a><a href='#L214'>214</a>
+<a name='L215'></a><a href='#L215'>215</a>
+<a name='L216'></a><a href='#L216'>216</a>
+<a name='L217'></a><a href='#L217'>217</a>
+<a name='L218'></a><a href='#L218'>218</a>
+<a name='L219'></a><a href='#L219'>219</a>
+<a name='L220'></a><a href='#L220'>220</a>
+<a name='L221'></a><a href='#L221'>221</a>
+<a name='L222'></a><a href='#L222'>222</a>
+<a name='L223'></a><a href='#L223'>223</a>
+<a name='L224'></a><a href='#L224'>224</a>
+<a name='L225'></a><a href='#L225'>225</a>
+<a name='L226'></a><a href='#L226'>226</a>
+<a name='L227'></a><a href='#L227'>227</a>
+<a name='L228'></a><a href='#L228'>228</a>
+<a name='L229'></a><a href='#L229'>229</a>
+<a name='L230'></a><a href='#L230'>230</a>
+<a name='L231'></a><a href='#L231'>231</a>
+<a name='L232'></a><a href='#L232'>232</a>
+<a name='L233'></a><a href='#L233'>233</a>
+<a name='L234'></a><a href='#L234'>234</a>
+<a name='L235'></a><a href='#L235'>235</a>
+<a name='L236'></a><a href='#L236'>236</a>
+<a name='L237'></a><a href='#L237'>237</a>
+<a name='L238'></a><a href='#L238'>238</a>
+<a name='L239'></a><a href='#L239'>239</a>
+<a name='L240'></a><a href='#L240'>240</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>
@@ -383,18 +462,151 @@
<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></td><td class="text"><pre class="prettyprint lang-js">.settings-page {
- padding: 2rem;
+<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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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></td><td class="text"><pre class="prettyprint lang-js">.settings-page.variant-glass {
+ padding: 2.5rem;
max-width: 800px;
margin: 0 auto;
+ background: rgba(255, 255, 255, 0.05);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border-radius: 24px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ font-family: system-ui, -apple-system, sans-serif;
+ color: var(--text-color);
+ margin-top: 2rem;
+ margin-bottom: 2rem;
+}
+&nbsp;
+.settings-page.variant-glass h2,
+.settings-page.variant-glass h3 {
+ font-weight: 700;
+ letter-spacing: -0.02em;
+ color: var(--text-color);
+ opacity: 0.9;
}
&nbsp;
-.add-feed-section {
- background: var(--sidebar-bg);
+.add-feed-section,
+.appearance-section,
+.import-section,
+.export-section,
+.feed-list-section {
+ background: rgba(255, 255, 255, 0.03);
padding: 1.5rem;
- border-radius: 8px;
+ border-radius: 16px;
margin-bottom: 2rem;
- border: 1px solid var(--border-color);
+ border: 1px solid rgba(255, 255, 255, 0.05);
+ transition: all 0.3s ease;
+}
+&nbsp;
+.add-feed-section:hover,
+.appearance-section:hover,
+.import-section:hover,
+.export-section:hover,
+.feed-list-section:hover {
+ background: rgba(255, 255, 255, 0.06);
+ border-color: rgba(255, 255, 255, 0.1);
+}
+&nbsp;
+.font-selector {
+ display: flex;
+ align-items: center;
+ gap: 1rem;
+}
+&nbsp;
+.font-select {
+ padding: 0.6rem 1rem;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ background: rgba(0, 0, 0, 0.1);
+ color: var(--text-color);
+ border-radius: 20px;
+ font-size: 1rem;
+ min-width: 200px;
+ cursor: pointer;
+ outline: none;
+ transition: border-color 0.2s;
+}
+&nbsp;
+.font-select:focus {
+ border-color: rgba(255, 255, 255, 0.3);
}
&nbsp;
.add-feed-form {
@@ -404,32 +616,45 @@
&nbsp;
.feed-input {
flex: 1;
- padding: 0.5rem;
- border: 1px solid var(--border-color);
- background: var(--bg-color);
+ padding: 0.6rem 1.2rem;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ background: rgba(0, 0, 0, 0.1);
color: var(--text-color);
- border-radius: 4px;
+ border-radius: 20px;
font-size: 1rem;
+ outline: none;
+ transition: border-color 0.2s;
+}
+&nbsp;
+.feed-input:focus {
+ border-color: rgba(255, 255, 255, 0.3);
}
&nbsp;
.error-message {
- color: #d32f2f;
+ color: #ff5252;
margin-top: 1rem;
+ font-weight: 600;
}
&nbsp;
.settings-feed-list {
list-style: none;
padding: 0;
- border: 1px solid var(--border-color);
- border-radius: 8px;
+ border: 1px solid rgba(255, 255, 255, 0.05);
+ border-radius: 12px;
+ overflow: hidden;
}
&nbsp;
.settings-feed-item {
display: flex;
justify-content: space-between;
align-items: center;
- padding: 1rem;
- border-bottom: 1px solid var(--border-color);
+ padding: 1.2rem;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+ transition: background 0.2s;
+}
+&nbsp;
+.settings-feed-item:hover {
+ background: rgba(255, 255, 255, 0.02);
}
&nbsp;
.settings-feed-item:last-child {
@@ -439,109 +664,121 @@
.feed-info {
display: flex;
flex-direction: column;
+ gap: 0.2rem;
}
&nbsp;
.feed-title {
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- font-weight: bold;
- font-size: 1.1rem;
+ font-weight: 600;
+ font-size: 1.05rem;
+ opacity: 0.9;
}
&nbsp;
.feed-url {
color: var(--text-color);
- opacity: 0.6;
- font-size: 0.9rem;
+ opacity: 0.5;
+ font-size: 0.85rem;
}
&nbsp;
.delete-btn {
- background: #ff5252;
- color: white;
- border: none;
+ background: rgba(255, 82, 82, 0.15);
+ color: #ff8a80;
+ border: 1px solid rgba(255, 82, 82, 0.2);
padding: 0.5rem 1rem;
- border-radius: 4px;
+ border-radius: 12px;
cursor: pointer;
+ font-weight: 600;
+ transition: all 0.2s;
}
&nbsp;
-.delete-btn:hover {
- background: #ff1744;
-}
-&nbsp;
-.delete-btn:disabled {
- background: #ffcdd2;
- cursor: not-allowed;
+.delete-btn:hover:not(:disabled) {
+ background: rgba(255, 82, 82, 0.3);
+ color: #fff;
+ border-color: rgba(255, 82, 82, 0.4);
+ transform: scale(1.05);
}
&nbsp;
.import-export-section {
display: flex;
gap: 2rem;
- margin-bottom: 2rem;
}
&nbsp;
@media (max-width: 600px) {
+ .settings-page.variant-glass {
+ padding: 1.5rem;
+ margin-top: 1rem;
+ }
+&nbsp;
+ .add-feed-form {
+ flex-direction: column;
+ }
+&nbsp;
.import-export-section {
flex-direction: column;
+ gap: 1rem;
}
-}
&nbsp;
-.import-section,
-.export-section {
- flex: 1;
- background: var(--sidebar-bg);
- padding: 1.5rem;
- border-radius: 8px;
- border: 1px solid var(--border-color);
+ .settings-feed-item {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 1rem;
+ }
}
&nbsp;
.import-form {
display: flex;
flex-direction: column;
- gap: 1rem;
+ gap: 1.2rem;
}
&nbsp;
.file-input {
font-size: 0.9rem;
max-width: 100%;
+ color: var(--text-color);
+ opacity: 0.8;
}
&nbsp;
.export-buttons {
display: flex;
- gap: 1rem;
+ gap: 0.8rem;
flex-wrap: wrap;
}
&nbsp;
.export-btn {
display: inline-block;
- padding: 0.5rem 1rem;
- background: var(--bg-color);
- color: var(--link-color);
+ padding: 0.6rem 1.2rem;
+ background: rgba(255, 255, 255, 0.05);
+ color: var(--text-color);
text-decoration: none;
- border: 1px solid var(--border-color);
- border-radius: 4px;
- font-weight: bold;
- text-align: center;
- min-width: 70px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 12px;
+ font-weight: 600;
+ transition: all 0.2s;
}
&nbsp;
.export-btn:hover {
- background: var(--sidebar-bg);
+ background: rgba(255, 255, 255, 0.1);
+ transform: translateY(-2px);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
&nbsp;
-button {
+button:not(.delete-btn) {
cursor: pointer;
- padding: 0.5rem 1rem;
- border-radius: 4px;
- border: 1px solid var(--border-color);
- background: var(--bg-color);
+ padding: 0.6rem 1.2rem;
+ border-radius: 12px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ background: rgba(255, 255, 255, 0.1);
color: var(--text-color);
- font-weight: bold;
+ font-weight: 600;
+ transition: all 0.2s;
}
&nbsp;
-button:hover:not(:disabled) {
- background: var(--sidebar-bg);
+button:not(.delete-btn):hover:not(:disabled) {
+ background: rgba(255, 255, 255, 0.2);
+ transform: scale(1.02);
}
&nbsp;
button:disabled {
- opacity: 0.5;
+ opacity: 0.4;
cursor: not-allowed;
}</pre></td></tr></table></pre>
@@ -550,7 +787,7 @@ button:disabled {
<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>
diff --git a/frontend/coverage/src/components/Settings.tsx.html b/frontend/coverage/src/components/Settings.tsx.html
index 3d8d219..892218e 100644
--- a/frontend/coverage/src/components/Settings.tsx.html
+++ b/frontend/coverage/src/components/Settings.tsx.html
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
- <span class="strong">56.25% </span>
+ <span class="strong">80% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>36/64</span>
+ <span class='fraction'>60/75</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">41.66% </span>
+ <span class="strong">66.66% </span>
<span class="quiet">Branches</span>
- <span class='fraction'>10/24</span>
+ <span class='fraction'>20/30</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">63.63% </span>
+ <span class="strong">85.18% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>14/22</span>
+ <span class='fraction'>23/27</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">62.5% </span>
+ <span class="strong">87.87% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>35/56</span>
+ <span class='fraction'>58/66</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>
@@ -243,55 +243,138 @@
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
-<a name='L181'></a><a href='#L181'>181</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
+<a name='L181'></a><a href='#L181'>181</a>
+<a name='L182'></a><a href='#L182'>182</a>
+<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>
+<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>
+<a name='L214'></a><a href='#L214'>214</a>
+<a name='L215'></a><a href='#L215'>215</a>
+<a name='L216'></a><a href='#L216'>216</a>
+<a name='L217'></a><a href='#L217'>217</a>
+<a name='L218'></a><a href='#L218'>218</a>
+<a name='L219'></a><a href='#L219'>219</a>
+<a name='L220'></a><a href='#L220'>220</a>
+<a name='L221'></a><a href='#L221'>221</a>
+<a name='L222'></a><a href='#L222'>222</a>
+<a name='L223'></a><a href='#L223'>223</a>
+<a name='L224'></a><a href='#L224'>224</a>
+<a name='L225'></a><a href='#L225'>225</a>
+<a name='L226'></a><a href='#L226'>226</a>
+<a name='L227'></a><a href='#L227'>227</a>
+<a name='L228'></a><a href='#L228'>228</a>
+<a name='L229'></a><a href='#L229'>229</a>
+<a name='L230'></a><a href='#L230'>230</a>
+<a name='L231'></a><a href='#L231'>231</a>
+<a name='L232'></a><a href='#L232'>232</a>
+<a name='L233'></a><a href='#L233'>233</a>
+<a name='L234'></a><a href='#L234'>234</a>
+<a name='L235'></a><a href='#L235'>235</a>
+<a name='L236'></a><a href='#L236'>236</a>
+<a name='L237'></a><a href='#L237'>237</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>
+<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-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">9x</span>
+<span class="cline-any cline-yes">9x</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-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">14x</span>
-<span class="cline-any cline-yes">14x</span>
-<span class="cline-any cline-yes">14x</span>
-<span class="cline-any cline-yes">14x</span>
+<span class="cline-any cline-yes">34x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">14x</span>
+<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">14x</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">4x</span>
-<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-yes">2x</span>
+<span class="cline-any cline-yes">2x</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">2x</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-no">&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>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">14x</span>
-<span class="cline-any cline-yes">3x</span>
+<span class="cline-any cline-yes">2x</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">14x</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">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-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
+<span class="cline-any cline-yes">1x</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-neutral">&nbsp;</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>
@@ -301,12 +384,22 @@
<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">14x</span>
+<span class="cline-any cline-yes">34x</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-yes">1x</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-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>
+<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">1x</span>
@@ -319,35 +412,28 @@
<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">14x</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
+<span class="cline-any cline-yes">34x</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-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">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-no">&nbsp;</span>
-<span class="cline-any cline-no">&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-no">&nbsp;</span>
<span class="cline-any cline-no">&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>
-<span class="cline-any cline-no">&nbsp;</span>
-<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
+<span class="cline-any cline-yes">34x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
-<span class="cline-any cline-yes">14x</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>
@@ -375,8 +461,32 @@
<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>
+<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-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-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-neutral">&nbsp;</span>
+<span class="cline-any cline-neutral">&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>
<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>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -403,7 +513,9 @@
<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">5x</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-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
@@ -428,15 +540,22 @@ import type { Feed } from '../types';
import './Settings.css';
import { apiFetch } from '../utils';
&nbsp;
-export default function Settings() {
+interface SettingsProps {
+ fontTheme?: string;
+ setFontTheme?: (t: string) =&gt; void;
+}
+&nbsp;
+export default function Settings({ fontTheme, setFontTheme }: SettingsProps) {
const [feeds, setFeeds] = useState&lt;Feed[]&gt;([]);
+ /* ... existing state ... */
const [newFeedUrl, setNewFeedUrl] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState&lt;string | null&gt;(null);
&nbsp;
const [importFile, setImportFile] = useState&lt;File | null&gt;(null);
&nbsp;
- const fetchFeeds = () =&gt; {
+ /* ... existing fetchFeeds ... */
+ const fetchFeeds = React.useCallback(() =&gt; {
setLoading(true);
apiFetch('/api/feed/')
.then((res) =&gt; {
@@ -451,12 +570,14 @@ export default function Settings() {
<span class="cstat-no" title="statement not covered" > setError(err.message);</span>
<span class="cstat-no" title="statement not covered" > setLoading(false);</span>
});
- };
+ }, []);
&nbsp;
useEffect(() =&gt; {
+ // eslint-disable-next-line
fetchFeeds();
- }, []);
+ }, [fetchFeeds]);
&nbsp;
+ /* ... existing handlers ... */
const handleAddFeed = (e: React.FormEvent) =&gt; {
e.preventDefault();
<span class="missing-if-branch" title="if path not taken" >I</span>if (!newFeedUrl) <span class="cstat-no" title="statement not covered" >return;</span>
@@ -468,16 +589,16 @@ export default function Settings() {
body: JSON.stringify({ url: newFeedUrl }),
})
.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 add feed');</span>
+ if (!res.ok) throw new Error('Failed to add feed');
return res.json();
})
.then(() =&gt; {
setNewFeedUrl('');
fetchFeeds();
})
- .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) =&gt; {
-<span class="cstat-no" title="statement not covered" > setError(err.message);</span>
-<span class="cstat-no" title="statement not covered" > setLoading(false);</span>
+ .catch((err) =&gt; {
+ setError(err.message);
+ setLoading(false);
});
};
&nbsp;
@@ -499,27 +620,46 @@ export default function Settings() {
});
};
&nbsp;
- const handleImport = <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 (!importFile) <span class="cstat-no" title="statement not covered" >return;</span></span>
+ const handleImport = (e: React.FormEvent) =&gt; {
+ e.preventDefault();
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!importFile) <span class="cstat-no" title="statement not covered" >return;</span>
&nbsp;
-<span class="cstat-no" title="statement not covered" > setLoading(true);</span>
- const formData = <span class="cstat-no" title="statement not covered" >new FormData();</span>
-<span class="cstat-no" title="statement not covered" > formData.append('file', importFile);</span>
-<span class="cstat-no" title="statement not covered" > formData.append('format', 'opml');</span>
+ setLoading(true);
+ const formData = new FormData();
+ formData.append('file', importFile);
+ formData.append('format', 'opml');
&nbsp;
-<span class="cstat-no" title="statement not covered" > apiFetch('/api/import', {</span>
+ apiFetch('/api/import', {
method: 'POST',
body: formData,
})
- .then(<span class="fstat-no" title="function not covered" >(r</span>es) =&gt; {
-<span class="cstat-no" title="statement not covered" > if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to import feeds');</span></span>
-<span class="cstat-no" title="statement not covered" > return res.json();</span>
+ .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 import feeds');</span>
+ return res.json();
})
- .then(<span class="fstat-no" title="function not covered" >() =&gt; {</span>
-<span class="cstat-no" title="statement not covered" > setImportFile(null);</span>
-<span class="cstat-no" title="statement not covered" > fetchFeeds();</span>
-<span class="cstat-no" title="statement not covered" > alert('Import successful!');</span>
+ .then(() =&gt; {
+ setImportFile(null);
+ fetchFeeds();
+ alert('Import successful!');
+ })
+ .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) =&gt; {
+<span class="cstat-no" title="statement not covered" > setError(err.message);</span>
+<span class="cstat-no" title="statement not covered" > setLoading(false);</span>
+ });
+ };
+&nbsp;
+ const handleCrawl = () =&gt; {
+ setLoading(true);
+ apiFetch('/api/crawl', {
+ method: 'POST',
+ })
+ .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 start crawl');</span>
+ return res.json();
+ })
+ .then(() =&gt; {
+ setLoading(false);
+ alert('Crawl started!');
})
.catch(<span class="fstat-no" title="function not covered" >(e</span>rr) =&gt; {
<span class="cstat-no" title="statement not covered" > setError(err.message);</span>
@@ -528,9 +668,29 @@ export default function Settings() {
};
&nbsp;
return (
- &lt;div className="settings-page"&gt;
+ &lt;div className="settings-page variant-glass"&gt;
&lt;h2&gt;Settings&lt;/h2&gt;
&nbsp;
+ {setFontTheme &amp;&amp; (
+ &lt;div className="appearance-section"&gt;
+ &lt;h3&gt;Appearance&lt;/h3&gt;
+ &lt;div className="font-selector"&gt;
+ &lt;label htmlFor="font-theme-select"&gt;Font Theme:&lt;/label&gt;
+ &lt;select
+ id="font-theme-select"
+ value={fontTheme || <span class="branch-1 cbranch-no" title="branch not covered" >'default'}</span>
+ onChange={(e) =&gt; setFontTheme(e.target.value)}
+ className="font-select"
+ &gt;
+ &lt;option value="default"&gt;Default&lt;/option&gt;
+ &lt;option value="serif"&gt;Serif&lt;/option&gt;
+ &lt;option value="sans"&gt;Sans-Serif&lt;/option&gt;
+ &lt;option value="mono"&gt;Monospace&lt;/option&gt;
+ &lt;/select&gt;
+ &lt;/div&gt;
+ &lt;/div&gt;
+ )}
+&nbsp;
&lt;div className="add-feed-section"&gt;
&lt;h3&gt;Add New Feed&lt;/h3&gt;
&lt;form onSubmit={handleAddFeed} className="add-feed-form"&gt;
@@ -556,11 +716,12 @@ export default function Settings() {
&lt;input
type="file"
accept=".opml,.xml,.txt"
- onChange={<span class="fstat-no" title="function not covered" >(e</span>) =&gt; <span class="cstat-no" title="statement not covered" >setImportFile(e.target.files?.[0] || null)}</span>
+ aria-label="Import Feeds"
+ onChange={(e) =&gt; setImportFile(e.target.files?.[0] || <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>}
className="file-input"
disabled={loading}
/&gt;
- &lt;button type="submit" disabled={!importFile || <span class="branch-1 cbranch-no" title="branch not covered" >loading}&gt;</span>
+ &lt;button type="submit" disabled={!importFile || loading}&gt;
Import
&lt;/button&gt;
&lt;/form&gt;
@@ -574,9 +735,16 @@ export default function Settings() {
&lt;a href="/api/export/json" className="export-btn"&gt;JSON&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
+&nbsp;
+ &lt;div className="crawl-section"&gt;
+ &lt;h3&gt;Actions&lt;/h3&gt;
+ &lt;button onClick={handleCrawl} disabled={loading} className="crawl-btn"&gt;
+ Crawl All Feeds Now
+ &lt;/button&gt;
+ &lt;/div&gt;
&lt;/div&gt;
&nbsp;
- {error &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >&lt;p className="error-message"&gt;{error}&lt;/p&gt;}</span>
+ {error &amp;&amp; &lt;p className="error-message"&gt;{error}&lt;/p&gt;}
&nbsp;
&lt;div className="feed-list-section"&gt;
&lt;h3&gt;Manage Feeds&lt;/h3&gt;
@@ -610,7 +778,7 @@ export default function Settings() {
<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>
diff --git a/frontend/coverage/src/components/index.html b/frontend/coverage/src/components/index.html
index 66ca900..fc333bb 100644
--- a/frontend/coverage/src/components/index.html
+++ b/frontend/coverage/src/components/index.html
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
- <span class="strong">79.57% </span>
+ <span class="strong">86.21% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>226/284</span>
+ <span class='fraction'>269/312</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">70.17% </span>
+ <span class="strong">74.61% </span>
<span class="quiet">Branches</span>
- <span class='fraction'>120/171</span>
+ <span class='fraction'>144/193</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">75.9% </span>
+ <span class="strong">84.94% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>63/83</span>
+ <span class='fraction'>79/93</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">81.78% </span>
+ <span class="strong">88.81% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>211/258</span>
+ <span class='fraction'>254/286</span>
</div>
@@ -61,7 +61,7 @@
</div>
</template>
</div>
- <div class='status-line medium'></div>
+ <div class='status-line high'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
@@ -125,17 +125,17 @@
<tr>
<td class="file high" data-value="FeedItems.tsx"><a href="FeedItems.tsx.html">FeedItems.tsx</a></td>
- <td data-value="88.97" class="pic high">
- <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div>
+ <td data-value="89.23" class="pic high">
+ <div class="chart"><div class="cover-fill" style="width: 89%"></div><div class="cover-empty" style="width: 11%"></div></div>
</td>
- <td data-value="88.97" class="pct high">88.97%</td>
- <td data-value="127" class="abs high">113/127</td>
- <td data-value="75.3" class="pct medium">75.3%</td>
- <td data-value="81" class="abs medium">61/81</td>
- <td data-value="86.2" class="pct high">86.2%</td>
- <td data-value="29" class="abs high">25/29</td>
- <td data-value="88.69" class="pct high">88.69%</td>
- <td data-value="115" class="abs high">102/115</td>
+ <td data-value="89.23" class="pct high">89.23%</td>
+ <td data-value="130" class="abs high">116/130</td>
+ <td data-value="76.19" class="pct medium">76.19%</td>
+ <td data-value="84" class="abs medium">64/84</td>
+ <td data-value="87.09" class="pct high">87.09%</td>
+ <td data-value="31" class="abs high">27/31</td>
+ <td data-value="89.07" class="pct high">89.07%</td>
+ <td data-value="119" class="abs high">106/119</td>
</tr>
<tr>
@@ -154,18 +154,33 @@
</tr>
<tr>
- <td class="file medium" data-value="FeedList.tsx"><a href="FeedList.tsx.html">FeedList.tsx</a></td>
- <td data-value="79.54" class="pic medium">
- <div class="chart"><div class="cover-fill" style="width: 79%"></div><div class="cover-empty" style="width: 21%"></div></div>
+ <td class="file high" data-value="FeedList.tsx"><a href="FeedList.tsx.html">FeedList.tsx</a></td>
+ <td data-value="87.27" class="pic high">
+ <div class="chart"><div class="cover-fill" style="width: 87%"></div><div class="cover-empty" style="width: 13%"></div></div>
</td>
- <td data-value="79.54" class="pct medium">79.54%</td>
- <td data-value="44" class="abs medium">35/44</td>
- <td data-value="64.86" class="pct medium">64.86%</td>
- <td data-value="37" class="abs medium">24/37</td>
- <td data-value="64.7" class="pct medium">64.7%</td>
- <td data-value="17" class="abs medium">11/17</td>
- <td data-value="82.05" class="pct high">82.05%</td>
- <td data-value="39" class="abs high">32/39</td>
+ <td data-value="87.27" class="pct high">87.27%</td>
+ <td data-value="55" class="abs high">48/55</td>
+ <td data-value="70" class="pct medium">70%</td>
+ <td data-value="50" class="abs medium">35/50</td>
+ <td data-value="78.94" class="pct medium">78.94%</td>
+ <td data-value="19" class="abs medium">15/19</td>
+ <td data-value="90" class="pct high">90%</td>
+ <td data-value="50" class="abs high">45/50</td>
+ </tr>
+
+<tr>
+ <td class="file empty" data-value="FeedListVariants.css"><a href="FeedListVariants.css.html">FeedListVariants.css</a></td>
+ <td data-value="0" class="pic empty">
+ <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
+ </td>
+ <td data-value="0" class="pct empty">0%</td>
+ <td data-value="0" class="abs empty">0/0</td>
+ <td data-value="0" class="pct empty">0%</td>
+ <td data-value="0" class="abs empty">0/0</td>
+ <td data-value="0" class="pct empty">0%</td>
+ <td data-value="0" class="abs empty">0/0</td>
+ <td data-value="0" class="pct empty">0%</td>
+ <td data-value="0" class="abs empty">0/0</td>
</tr>
<tr>
@@ -189,13 +204,13 @@
<div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
</td>
<td data-value="100" class="pct high">100%</td>
- <td data-value="17" class="abs high">17/17</td>
+ <td data-value="20" class="abs high">20/20</td>
<td data-value="83.33" class="pct high">83.33%</td>
<td data-value="6" class="abs high">5/6</td>
<td data-value="100" class="pct high">100%</td>
- <td data-value="3" class="abs high">3/3</td>
+ <td data-value="4" class="abs high">4/4</td>
<td data-value="100" class="pct high">100%</td>
- <td data-value="17" class="abs high">17/17</td>
+ <td data-value="20" class="abs high">20/20</td>
</tr>
<tr>
@@ -214,18 +229,18 @@
</tr>
<tr>
- <td class="file medium" data-value="Settings.tsx"><a href="Settings.tsx.html">Settings.tsx</a></td>
- <td data-value="56.25" class="pic medium">
- <div class="chart"><div class="cover-fill" style="width: 56%"></div><div class="cover-empty" style="width: 44%"></div></div>
+ <td class="file high" data-value="Settings.tsx"><a href="Settings.tsx.html">Settings.tsx</a></td>
+ <td data-value="80" class="pic high">
+ <div class="chart"><div class="cover-fill" style="width: 80%"></div><div class="cover-empty" style="width: 20%"></div></div>
</td>
- <td data-value="56.25" class="pct medium">56.25%</td>
- <td data-value="64" class="abs medium">36/64</td>
- <td data-value="41.66" class="pct low">41.66%</td>
- <td data-value="24" class="abs low">10/24</td>
- <td data-value="63.63" class="pct medium">63.63%</td>
- <td data-value="22" class="abs medium">14/22</td>
- <td data-value="62.5" class="pct medium">62.5%</td>
- <td data-value="56" class="abs medium">35/56</td>
+ <td data-value="80" class="pct high">80%</td>
+ <td data-value="75" class="abs high">60/75</td>
+ <td data-value="66.66" class="pct medium">66.66%</td>
+ <td data-value="30" class="abs medium">20/30</td>
+ <td data-value="85.18" class="pct high">85.18%</td>
+ <td data-value="27" class="abs high">23/27</td>
+ <td data-value="87.87" class="pct high">87.87%</td>
+ <td data-value="66" class="abs high">58/66</td>
</tr>
</tbody>
@@ -236,7 +251,7 @@
<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>
diff --git a/frontend/coverage/src/index.html b/frontend/coverage/src/index.html
index 19a8dfd..091ffa0 100644
--- a/frontend/coverage/src/index.html
+++ b/frontend/coverage/src/index.html
@@ -23,30 +23,30 @@
<div class='clearfix'>
<div class='fl pad1y space-right2'>
- <span class="strong">76.47% </span>
+ <span class="strong">70.21% </span>
<span class="quiet">Statements</span>
- <span class='fraction'>26/34</span>
+ <span class='fraction'>33/47</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">69.23% </span>
+ <span class="strong">65.71% </span>
<span class="quiet">Branches</span>
- <span class='fraction'>18/26</span>
+ <span class='fraction'>23/35</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">70% </span>
+ <span class="strong">60% </span>
<span class="quiet">Functions</span>
- <span class='fraction'>7/10</span>
+ <span class='fraction'>9/15</span>
</div>
<div class='fl pad1y space-right2'>
- <span class="strong">78.78% </span>
+ <span class="strong">71.11% </span>
<span class="quiet">Lines</span>
- <span class='fraction'>26/33</span>
+ <span class='fraction'>32/45</span>
</div>
@@ -95,17 +95,17 @@
<tr>
<td class="file medium" data-value="App.tsx"><a href="App.tsx.html">App.tsx</a></td>
- <td data-value="72.72" class="pic medium">
- <div class="chart"><div class="cover-fill" style="width: 72%"></div><div class="cover-empty" style="width: 28%"></div></div>
+ <td data-value="65.71" class="pic medium">
+ <div class="chart"><div class="cover-fill" style="width: 65%"></div><div class="cover-empty" style="width: 35%"></div></div>
</td>
- <td data-value="72.72" class="pct medium">72.72%</td>
- <td data-value="22" class="abs medium">16/22</td>
- <td data-value="62.5" class="pct medium">62.5%</td>
- <td data-value="16" class="abs medium">10/16</td>
- <td data-value="62.5" class="pct medium">62.5%</td>
- <td data-value="8" class="abs medium">5/8</td>
- <td data-value="72.72" class="pct medium">72.72%</td>
- <td data-value="22" class="abs medium">16/22</td>
+ <td data-value="65.71" class="pct medium">65.71%</td>
+ <td data-value="35" class="abs medium">23/35</td>
+ <td data-value="60" class="pct medium">60%</td>
+ <td data-value="25" class="abs medium">15/25</td>
+ <td data-value="53.84" class="pct medium">53.84%</td>
+ <td data-value="13" class="abs medium">7/13</td>
+ <td data-value="64.7" class="pct medium">64.7%</td>
+ <td data-value="34" class="abs medium">22/34</td>
</tr>
<tr>
@@ -131,7 +131,7 @@
<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>