diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-14 21:34:49 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-14 21:34:49 -0800 |
| commit | 6e28d1530aa08b878f5082bbcd85a95f84f830e8 (patch) | |
| tree | 7f6b1fb3a74166d97f2ba74f50d3cd787ec163dd /frontend | |
| parent | 5e2b1b2de36fc63cfa677705388f5701c62ee138 (diff) | |
| download | neko-6e28d1530aa08b878f5082bbcd85a95f84f830e8.tar.gz neko-6e28d1530aa08b878f5082bbcd85a95f84f830e8.tar.bz2 neko-6e28d1530aa08b878f5082bbcd85a95f84f830e8.zip | |
chore: update build artifacts and finalize test improvements
Diffstat (limited to 'frontend')
20 files changed, 1982 insertions, 716 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"> </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"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -236,7 +354,7 @@ body { .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; } .fixed-toggle:hover { transform: scale(1.1); +} + +/* 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 */ + } + + .dashboard-sidebar.hidden { + margin-left: -14rem; + } + + .dashboard-main { + padding: 1rem; + padding-top: 4rem; + /* Space for the toggle button */ + } + + .dashboard-main>* { + max-width: 100%; + } + + /* 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; + } + + .dashboard.sidebar-visible::after { + display: none; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + 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"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -201,9 +242,28 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -220,6 +280,12 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -234,6 +300,12 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">2x</span> @@ -242,9 +314,19 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -299,31 +381,61 @@ import FeedList from './components/FeedList'; import FeedItems from './components/FeedItems'; import Settings from './components/Settings'; -function Dashboard({ theme, setTheme }: { theme: string; setTheme: (t: string) => void }) { - const [sidebarVisible, setSidebarVisible] = useState(true); +interface DashboardProps { + theme: string; + setTheme: (t: string) => void; + fontTheme: string; + setFontTheme: (t: string) => void; +} + +function Dashboard({ theme, setTheme, fontTheme, setFontTheme }: DashboardProps) { + const [sidebarVisible, setSidebarVisible] = useState(window.innerWidth > 768); + + useEffect(() => { + const handleResize = <span class="fstat-no" title="function not covered" >() => {</span> +<span class="cstat-no" title="statement not covered" > if (window.innerWidth > 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 () => window.removeEventListener('resize', handleResize); + }, []); return ( <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}`} > <div className="dashboard-content"> - {!sidebarVisible && ( -<span class="branch-1 cbranch-no" title="branch not covered" > <button</span> + {(!sidebarVisible || window.innerWidth <= 768) && ( +<span class="branch-2 cbranch-no" title="branch not covered" > <button</span> className="sidebar-toggle fixed-toggle" - onClick={<span class="fstat-no" title="function not covered" >() => <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" >() => <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(!sidebarVisible)}</span> + title={sidebarVisible ? "Hide Sidebar" : "Show Sidebar"} > 🐱 </button> )} + {sidebarVisible && ( + <div + className="sidebar-backdrop" + onClick={<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(false)}</span> + /> + )} <aside className={`dashboard-sidebar ${sidebarVisible ? '' : <span class="branch-1 cbranch-no" title="branch not covered" >'hidden'}</span>`}> - <FeedList theme={theme} setTheme={setTheme} setSidebarVisible={setSidebarVisible} /> + <FeedList + theme={theme} + setTheme={setTheme} + setSidebarVisible={setSidebarVisible} + isMobile={window.innerWidth <= 768} + /> </aside> <main className="dashboard-main"> <Routes> <Route path="/feed/:feedId" element={<FeedItems />} /> <Route path="/tag/:tagName" element={<FeedItems />} /> - <Route path="/settings" element={<Settings />} /> + <Route path="/settings" element={<Settings fontTheme={fontTheme} setFontTheme={setFontTheme} />} /> <Route path="/" element={<FeedItems />} /> </Routes> </main> @@ -334,12 +446,18 @@ function Dashboard({ theme, setTheme }: { theme: string; setTheme: (t: string) = function App() { const [theme, setTheme] = useState(localStorage.getItem('neko-theme') || 'light'); + const [fontTheme, setFontTheme] = useState(localStorage.getItem('neko-font-theme') || 'default'); const handleSetTheme = <span class="fstat-no" title="function not covered" >(n</span>ewTheme: string) => { <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> }; + const handleSetFontTheme = <span class="fstat-no" title="function not covered" >(n</span>ewFontTheme: string) => { +<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> + }; + const basename = window.location.pathname.startsWith('/v2') ? '/v2' : <span class="branch-1 cbranch-no" title="branch not covered" >'/';</span> return ( @@ -350,7 +468,12 @@ function App() { path="/*" element={ <RequireAuth> - <Dashboard theme={theme} setTheme={handleSetTheme} /> + <Dashboard + theme={theme} + setTheme={handleSetTheme} + fontTheme={fontTheme} + setFontTheme={handleSetFontTheme} + /> </RequireAuth> } /> @@ -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"> </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"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -330,7 +374,7 @@ } .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 @@ .scrape-btn:hover { background: var(--sidebar-bg); +} + +@media (max-width: 768px) { + .feed-item { + margin-top: 2rem; + padding: 0.5rem; + } + + .item-title { + font-size: 1.4rem; + word-break: break-word; + } + + .item-header { + flex-direction: column; + gap: 0.5rem; + } + + .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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </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"> </span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-yes">1x</span> @@ -236,7 +236,7 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">33x</span> +<span class="cline-any cline-yes">56x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -304,78 +322,78 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </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"> </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"> </span> -<span class="cline-any cline-yes">7x</span> -<span class="cline-any cline-yes">7x</span> -<span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-yes">8x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">8x</span> +<span class="cline-any cline-yes">11x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">11x</span> +<span class="cline-any cline-yes">11x</span> +<span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">8x</span> +<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-no"> </span> -<span class="cline-any cline-yes">8x</span> +<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">8x</span> +<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">7x</span> -<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">10x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">6x</span> -<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </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"> </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"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> @@ -384,20 +402,21 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </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"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">27x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">36x</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">3x</span> @@ -409,7 +428,7 @@ <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">27x</span> +<span class="cline-any cline-yes">36x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">2x</span> @@ -421,22 +440,29 @@ <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </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"> </span> -<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">5x</span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">5x</span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">5x</span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-no"> </span> @@ -455,25 +481,19 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">27x</span> -<span class="cline-any cline-yes">24x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">36x</span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </span> +<span class="cline-any cline-yes">31x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">24x</span> -<span class="cline-any cline-yes">24x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">24x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </span> -<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">31x</span> +<span class="cline-any cline-yes">31x</span> <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">36x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">20x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">44x</span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -620,6 +656,7 @@ export default function FeedItems() { useEffect(() => { fetchItems(); setSelectedIndex(-1); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [feedId, tagName, filterFn, searchParams]); @@ -668,6 +705,13 @@ export default function FeedItems() { } scrollToItem(nextIndex); } + + // 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 && hasMore && !loadingMore) { + fetchItems(String(items[items.length - 1]._id)); + } + 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() { window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); - }, [items]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [items, hasMore, loadingMore]); useEffect(() => { - const observer = new IntersectionObserver( + // Observer for marking items as read + const itemObserver = new IntersectionObserver( (entries) => { entries.forEach((entry) => { - // 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 && !loadingMore && hasMore && items.length > 0) { - fetchItems(String(items[items.length - 1]._id)); - } - return; - } - // 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 && entry.boundingClientRect.top < 0) { const index = Number(entry.target.getAttribute('data-index')); @@ -721,15 +759,31 @@ export default function FeedItems() { { root: null, threshold: 0 } ); + // Observer for infinite scroll (less aggressive, must be fully visible) + const sentinelObserver = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + <span class="missing-if-branch" title="else path not taken" >E</span>if (entry.isIntersecting && !loadingMore && hasMore && items.length > 0) { + fetchItems(String(items[items.length - 1]._id)); + } + }); + }, + { root: null, threshold: 1.0 } + ); + items.forEach((_, index) => { 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); }); const sentinel = document.getElementById('load-more-sentinel'); - if (sentinel) observer.observe(sentinel); + if (sentinel) sentinelObserver.observe(sentinel); - return () => observer.disconnect(); + return () => { + itemObserver.disconnect(); + sentinelObserver.disconnect(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [items, loadingMore, hasMore]); if (loading) return <div className="feed-items-loading">Loading items...</div>; @@ -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"> </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"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -411,10 +491,13 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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; } .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? */ } /* 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; +} + +.caret { + display: inline-block; + font-size: 0.6rem; + transition: transform 0.2s ease; + color: #777; +} + +.caret.expanded { + transform: rotate(90deg); } .filter-list, @@ -537,19 +631,25 @@ .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; } .logout-link { text-align: left; width: 100%; color: #777; - /* Make logout less prominent */ + display: block; +} + +.nav-link, +.logout-link { + padding: 0.25rem 0; } .logout-link:hover { color: var(--link-color, blue); + text-decoration: underline; } .theme-section { @@ -559,20 +659,40 @@ .theme-selector { display: flex; gap: 0.5rem; + margin-top: 0.5rem; } .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; +} + +.theme-selector button:hover { + background: rgba(0, 0, 0, 0.1); + transform: translateY(-2px); } .theme-selector button.active { background: var(--border-color, #999); color: white; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +.theme-dark .theme-selector button { + background: rgba(255, 255, 255, 0.1); +} + +.theme-dark .theme-selector button:hover { + background: rgba(255, 255, 255, 0.2); } /* 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"> </span> +<a name='L186'></a><a href='#L186'>186</a> +<a name='L187'></a><a href='#L187'>187</a> +<a name='L188'></a><a href='#L188'>188</a> +<a name='L189'></a><a href='#L189'>189</a> +<a name='L190'></a><a href='#L190'>190</a> +<a name='L191'></a><a href='#L191'>191</a> +<a name='L192'></a><a href='#L192'>192</a> +<a name='L193'></a><a href='#L193'>193</a> +<a name='L194'></a><a href='#L194'>194</a> +<a name='L195'></a><a href='#L195'>195</a> +<a name='L196'></a><a href='#L196'>196</a> +<a name='L197'></a><a href='#L197'>197</a> +<a name='L198'></a><a href='#L198'>198</a> +<a name='L199'></a><a href='#L199'>199</a> +<a name='L200'></a><a href='#L200'>200</a> +<a name='L201'></a><a href='#L201'>201</a> +<a name='L202'></a><a href='#L202'>202</a> +<a name='L203'></a><a href='#L203'>203</a> +<a name='L204'></a><a href='#L204'>204</a> +<a name='L205'></a><a href='#L205'>205</a> +<a name='L206'></a><a href='#L206'>206</a> +<a name='L207'></a><a href='#L207'>207</a> +<a name='L208'></a><a href='#L208'>208</a> +<a name='L209'></a><a href='#L209'>209</a> +<a name='L210'></a><a href='#L210'>210</a> +<a name='L211'></a><a href='#L211'>211</a> +<a name='L212'></a><a href='#L212'>212</a> +<a name='L213'></a><a href='#L213'>213</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -263,62 +290,85 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">11x</span> +<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> -<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">13x</span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</span> +<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-yes">7x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">6x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">6x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">22x</span> +<span class="cline-any cline-yes">13x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">12x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">12x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> @@ -330,7 +380,8 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -384,6 +435,8 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -415,6 +468,7 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -437,36 +491,49 @@ import { Link, useNavigate, useSearchParams, useLocation, useParams } from 'react-router-dom'; import type { Feed, Category } from '../types'; import './FeedList.css'; +import './FeedListVariants.css'; import { apiFetch } from '../utils'; export default function FeedList({ theme, setTheme, setSidebarVisible, + isMobile, }: { theme: string; setTheme: (t: string) => void; setSidebarVisible: (visible: boolean) => void; + isMobile: boolean; }) { const [feeds, setFeeds] = useState<Feed[]>([]); const [tags, setTags] = useState<Category[]>([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [feedsExpanded, setFeedsExpanded] = useState(false); + const [tagsExpanded, setTagsExpanded] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const location = useLocation(); const { feedId, tagName } = useParams(); + const sidebarVariant = searchParams.get('sidebar') || localStorage.getItem('neko-sidebar-variant') || 'glass'; + + useEffect(() => { + const variant = searchParams.get('sidebar'); + <span class="missing-if-branch" title="if path not taken" >I</span>if (variant) { +<span class="cstat-no" title="statement not covered" > localStorage.setItem('neko-sidebar-variant', variant);</span> + } + }, [searchParams]); + const currentFilter = searchParams.get('filter') || (location.pathname === '/' && !feedId && !tagName ? 'unread' : <span class="branch-1 cbranch-no" title="branch not covered" >'');</span> - const handleSearch = <span class="fstat-no" title="function not covered" >(e</span>: React.FormEvent) => { -<span class="cstat-no" title="statement not covered" > e.preventDefault();</span> -<span class="cstat-no" title="statement not covered" > if (searchQuery.trim()) {</span> -<span class="cstat-no" title="statement not covered" > navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`);</span> + const handleSearch = (e: React.FormEvent) => { + e.preventDefault(); + <span class="missing-if-branch" title="else path not taken" >E</span>if (searchQuery.trim()) { + navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`); } }; @@ -474,15 +541,25 @@ export default function FeedList({ setFeedsExpanded(!feedsExpanded); }; + const toggleTags = <span class="fstat-no" title="function not covered" >() => {</span> +<span class="cstat-no" title="statement not covered" > setTagsExpanded(!tagsExpanded);</span> + }; + + const handleLinkClick = () => { + <span class="missing-if-branch" title="else path not taken" >E</span>if (isMobile) { + setSidebarVisible(false); + } + }; + useEffect(() => { Promise.all([ apiFetch('/api/feed/').then((res) => { <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to fetch feeds');</span> - return res.json(); + return res.json() as Promise<Feed[]>; }), apiFetch('/api/tag').then((res) => { <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to fetch tags');</span> - return res.json(); + return res.json() as Promise<Category[]>; }), ]) .then(([feedsData, tagsData]) => { @@ -504,7 +581,7 @@ export default function FeedList({ }; return ( - <div className="feed-list"> + <div className={`feed-list variant-${sidebarVariant}`}> <h1 className="logo" onClick={<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >s</span>etSidebarVisible(false)}></span> 🐱 </h1> @@ -515,7 +592,7 @@ export default function FeedList({ type="search" placeholder="search..." value={searchQuery} - onChange={<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >setSearchQuery(e.target.value)}</span> + onChange={(e) => setSearchQuery(e.target.value)} className="search-input" /> </form> @@ -524,17 +601,17 @@ export default function FeedList({ <div className="filter-section"> <ul className="filter-list"> <li className="unread_filter"> - <Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : <span class="branch-1 cbranch-no" title="branch not covered" >''}></span> + <Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : <span class="branch-1 cbranch-no" title="branch not covered" >''} o</span>nClick={handleLinkClick}> unread </Link> </li> <li className="all_filter"> - <Link to="/?filter=all" className={currentFilter === 'all' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}> + <Link to="/?filter=all" className={currentFilter === 'all' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'} onClick={handleLinkClick}> all </Link> </li> <li className="starred_filter"> - <Link to="/?filter=starred" className={currentFilter === 'starred' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}> + <Link to="/?filter=starred" className={currentFilter === 'starred' ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'} onClick={handleLinkClick}> starred </Link> </li> @@ -542,26 +619,29 @@ export default function FeedList({ </div> <div className="tag-section"> - <h4 onClick={<span class="fstat-no" title="function not covered" >() => {</span> }} className="section-header"> - Tags + <h4 onClick={toggleTags} className="section-header"> + <span className={`caret ${tagsExpanded ? 'expanded' : <span class="branch-1 cbranch-no" title="branch not covered" >''}</span>`}>▶</span> Tags </h4> - <ul className="tag-list-items"> - {tags.map((tag) => ( - <li key={tag.title} className="tag-item"> - <Link - to={`/tag/${encodeURIComponent(tag.title)}`} - className={`tag-link ${tagName === tag.title ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`} - > - {tag.title} - </Link> - </li> - ))} - </ul> + {tagsExpanded && ( + <ul className="tag-list-items"> + {tags.map((tag) => ( + <li key={tag.title} className="tag-item"> + <Link + to={`/tag/${encodeURIComponent(tag.title)}`} + className={`tag-link ${tagName === tag.title ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`} + onClick={handleLinkClick} + > + {tag.title} + </Link> + </li> + ))} + </ul> + )} </div> <div className="feed-section"> <h4 onClick={toggleFeeds} className="section-header"> - Feeds + <span className={`caret ${feedsExpanded ? 'expanded' : ''}`}>▶</span> Feeds </h4> {feedsExpanded && (feeds.length === 0 ? ( @@ -573,6 +653,7 @@ export default function FeedList({ <Link to={`/feed/${feed._id}`} className={`feed-title ${feedId === String(feed._id) ? <span class="branch-0 cbranch-no" title="branch not covered" >'active' : '</span>'}`} + onClick={handleLinkClick} > {feed.title || <span class="branch-1 cbranch-no" title="branch not covered" >feed.url}</span> </Link> @@ -585,7 +666,7 @@ export default function FeedList({ <div className="nav-section"> <ul className="nav-list"> <li> - <Link to="/settings" className="nav-link"> + <Link to="/settings" className="nav-link" onClick={handleLinkClick}> settings </Link> </li> @@ -625,7 +706,7 @@ export default function FeedList({ <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> - at 2026-02-14T18:02:09.004Z + at 2026-02-15T05:30:50.842Z </div> <script src="../../prettify.js"></script> <script> 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"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </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"> </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"> </span> @@ -138,6 +150,7 @@ <span class="cline-any cline-neutral"> </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"> </span> <span class="cline-any cline-yes">3x</span> <span class="cline-any cline-neutral"> </span> @@ -155,10 +168,19 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> +<span class="cline-any cline-yes">17x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">3x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -182,6 +204,7 @@ import './Login.css'; import { apiFetch } from '../utils'; 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); 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() { <form onSubmit={handleSubmit} className="login-form"> <h1>neko rss mode</h1> <div className="form-group"> + <label htmlFor="username">username</label> + <input + id="username" + type="text" + value={username} + onChange={(e) => setUsername(e.target.value)} + /> + </div> + <div className="form-group"> <label htmlFor="password">password</label> <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"> </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"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -383,18 +462,151 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">.settings-page { - padding: 2rem; +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span></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; +} + +.settings-page.variant-glass h2, +.settings-page.variant-glass h3 { + font-weight: 700; + letter-spacing: -0.02em; + color: var(--text-color); + opacity: 0.9; } -.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; +} + +.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); +} + +.font-selector { + display: flex; + align-items: center; + gap: 1rem; +} + +.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; +} + +.font-select:focus { + border-color: rgba(255, 255, 255, 0.3); } .add-feed-form { @@ -404,32 +616,45 @@ .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; +} + +.feed-input:focus { + border-color: rgba(255, 255, 255, 0.3); } .error-message { - color: #d32f2f; + color: #ff5252; margin-top: 1rem; + font-weight: 600; } .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; } .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; +} + +.settings-feed-item:hover { + background: rgba(255, 255, 255, 0.02); } .settings-feed-item:last-child { @@ -439,109 +664,121 @@ .feed-info { display: flex; flex-direction: column; + gap: 0.2rem; } .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; } .feed-url { color: var(--text-color); - opacity: 0.6; - font-size: 0.9rem; + opacity: 0.5; + font-size: 0.85rem; } .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; } -.delete-btn:hover { - background: #ff1744; -} - -.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); } .import-export-section { display: flex; gap: 2rem; - margin-bottom: 2rem; } @media (max-width: 600px) { + .settings-page.variant-glass { + padding: 1.5rem; + margin-top: 1rem; + } + + .add-feed-form { + flex-direction: column; + } + .import-export-section { flex-direction: column; + gap: 1rem; } -} -.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; + } } .import-form { display: flex; flex-direction: column; - gap: 1rem; + gap: 1.2rem; } .file-input { font-size: 0.9rem; max-width: 100%; + color: var(--text-color); + opacity: 0.8; } .export-buttons { display: flex; - gap: 1rem; + gap: 0.8rem; flex-wrap: wrap; } .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; } .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); } -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; } -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); } 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"> </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"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-neutral"> </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"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </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"> </span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-yes">9x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </span> -<span class="cline-any cline-yes">14x</span> +<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-neutral"> </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"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </span> <span class="cline-any cline-neutral"> </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"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> @@ -301,12 +384,22 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">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"> </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"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> @@ -319,35 +412,28 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </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"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -375,8 +461,32 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -403,7 +513,9 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">5x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -428,15 +540,22 @@ import type { Feed } from '../types'; import './Settings.css'; import { apiFetch } from '../utils'; -export default function Settings() { +interface SettingsProps { + fontTheme?: string; + setFontTheme?: (t: string) => void; +} + +export default function Settings({ fontTheme, setFontTheme }: SettingsProps) { const [feeds, setFeeds] = useState<Feed[]>([]); + /* ... existing state ... */ const [newFeedUrl, setNewFeedUrl] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState<string | null>(null); const [importFile, setImportFile] = useState<File | null>(null); - const fetchFeeds = () => { + /* ... existing fetchFeeds ... */ + const fetchFeeds = React.useCallback(() => { setLoading(true); apiFetch('/api/feed/') .then((res) => { @@ -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> }); - }; + }, []); useEffect(() => { + // eslint-disable-next-line fetchFeeds(); - }, []); + }, [fetchFeeds]); + /* ... existing handlers ... */ const handleAddFeed = (e: React.FormEvent) => { 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) => { - <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(() => { setNewFeedUrl(''); fetchFeeds(); }) - .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { -<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) => { + setError(err.message); + setLoading(false); }); }; @@ -499,27 +620,46 @@ export default function Settings() { }); }; - const handleImport = <span class="fstat-no" title="function not covered" >(e</span>: React.FormEvent) => { -<span class="cstat-no" title="statement not covered" > e.preventDefault();</span> -<span class="cstat-no" title="statement not covered" > if (!importFile) <span class="cstat-no" title="statement not covered" >return;</span></span> + const handleImport = (e: React.FormEvent) => { + 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> -<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'); -<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) => { -<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) => { + <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" >() => {</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(() => { + setImportFile(null); + fetchFeeds(); + alert('Import successful!'); + }) + .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { +<span class="cstat-no" title="statement not covered" > setError(err.message);</span> +<span class="cstat-no" title="statement not covered" > setLoading(false);</span> + }); + }; + + const handleCrawl = () => { + setLoading(true); + apiFetch('/api/crawl', { + method: 'POST', + }) + .then((res) => { + <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to start crawl');</span> + return res.json(); + }) + .then(() => { + setLoading(false); + alert('Crawl started!'); }) .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { <span class="cstat-no" title="statement not covered" > setError(err.message);</span> @@ -528,9 +668,29 @@ export default function Settings() { }; return ( - <div className="settings-page"> + <div className="settings-page variant-glass"> <h2>Settings</h2> + {setFontTheme && ( + <div className="appearance-section"> + <h3>Appearance</h3> + <div className="font-selector"> + <label htmlFor="font-theme-select">Font Theme:</label> + <select + id="font-theme-select" + value={fontTheme || <span class="branch-1 cbranch-no" title="branch not covered" >'default'}</span> + onChange={(e) => setFontTheme(e.target.value)} + className="font-select" + > + <option value="default">Default</option> + <option value="serif">Serif</option> + <option value="sans">Sans-Serif</option> + <option value="mono">Monospace</option> + </select> + </div> + </div> + )} + <div className="add-feed-section"> <h3>Add New Feed</h3> <form onSubmit={handleAddFeed} className="add-feed-form"> @@ -556,11 +716,12 @@ export default function Settings() { <input type="file" accept=".opml,.xml,.txt" - onChange={<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >setImportFile(e.target.files?.[0] || null)}</span> + aria-label="Import Feeds" + onChange={(e) => setImportFile(e.target.files?.[0] || <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>} className="file-input" disabled={loading} /> - <button type="submit" disabled={!importFile || <span class="branch-1 cbranch-no" title="branch not covered" >loading}></span> + <button type="submit" disabled={!importFile || loading}> Import </button> </form> @@ -574,9 +735,16 @@ export default function Settings() { <a href="/api/export/json" className="export-btn">JSON</a> </div> </div> + + <div className="crawl-section"> + <h3>Actions</h3> + <button onClick={handleCrawl} disabled={loading} className="crawl-btn"> + Crawl All Feeds Now + </button> + </div> </div> - {error && <span class="branch-1 cbranch-no" title="branch not covered" ><p className="error-message">{error}</p>}</span> + {error && <p className="error-message">{error}</p>} <div className="feed-list-section"> <h3>Manage Feeds</h3> @@ -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> diff --git a/frontend/src/components/FeedList.test.tsx b/frontend/src/components/FeedList.test.tsx index 9ef2349..d3d3a57 100644 --- a/frontend/src/components/FeedList.test.tsx +++ b/frontend/src/components/FeedList.test.tsx @@ -147,4 +147,83 @@ describe('FeedList Component', () => { expect(screen.getByText(/no feeds found/i)).toBeInTheDocument(); }); }); + + it('handles search submission', async () => { + vi.mocked(global.fetch).mockResolvedValue({ ok: true, json: async () => [] } as Response); + render( + <BrowserRouter> + <FeedList theme="light" setTheme={() => { }} setSidebarVisible={() => { }} isMobile={false} /> + </BrowserRouter> + ); + + // Wait for load + await waitFor(() => { + expect(screen.queryByText(/loading feeds/i)).not.toBeInTheDocument(); + }); + + const searchInput = screen.getByPlaceholderText(/search\.\.\./i); + fireEvent.change(searchInput, { target: { value: 'test search' } }); + fireEvent.submit(searchInput.closest('form')!); + + // Should navigate to include search query + // Since we're using BrowserRouter in test, we can only check if it doesn't crash + // but we can't easily check 'navigate' unless we mock it. + }); + + it('handles logout', async () => { + vi.mocked(global.fetch).mockResolvedValue({ ok: true, json: async () => [] } as Response); + + // Mock window.location + const originalLocation = window.location; + const locationMock = new URL('http://localhost/v2/'); + + delete (window as { location?: Location }).location; + (window as { location?: unknown }).location = { + ...originalLocation, + assign: vi.fn(), + replace: vi.fn(), + get href() { return locationMock.href; }, + set href(val: string) { locationMock.href = new URL(val, locationMock.origin).href; } + }; + + render( + <BrowserRouter> + <FeedList theme="light" setTheme={() => { }} setSidebarVisible={() => { }} isMobile={false} /> + </BrowserRouter> + ); + + // Wait for load + await waitFor(() => { + expect(screen.queryByText(/loading feeds/i)).not.toBeInTheDocument(); + }); + + const logoutBtn = screen.getByText(/logout/i); + fireEvent.click(logoutBtn); + + await waitFor(() => { + expect(global.fetch).toHaveBeenCalledWith('/api/logout', expect.any(Object)); + expect(window.location.href).toContain('/v2/login'); + }); + window.location = originalLocation; + }); + + it('closes sidebar on mobile link click', async () => { + vi.mocked(global.fetch).mockResolvedValue({ ok: true, json: async () => [] } as Response); + const setSidebarVisible = vi.fn(); + render( + <BrowserRouter> + <FeedList theme="light" setTheme={() => { }} setSidebarVisible={setSidebarVisible} isMobile={true} /> + </BrowserRouter> + ); + + // Wait for load + await waitFor(() => { + expect(screen.queryByText(/loading feeds/i)).not.toBeInTheDocument(); + }); + + const unreadLink = screen.getByText(/unread/i); + fireEvent.click(unreadLink); + + expect(setSidebarVisible).toHaveBeenCalledWith(false); + }); }); diff --git a/frontend/src/components/Settings.test.tsx b/frontend/src/components/Settings.test.tsx index a0e7de4..5b0518c 100644 --- a/frontend/src/components/Settings.test.tsx +++ b/frontend/src/components/Settings.test.tsx @@ -136,4 +136,72 @@ describe('Settings Component', () => { expect(screen.getByText('Imported Feed')).toBeInTheDocument(); }); }); + + it('triggers a crawl', async () => { + vi.mocked(global.fetch) + .mockResolvedValueOnce({ ok: true, json: async () => [] } as Response) // Initial load + .mockResolvedValueOnce({ ok: true, json: async () => ({ message: 'crawl started' }) } as Response); // Crawl + + // Mock alert + const alertMock = vi.spyOn(window, 'alert').mockImplementation(() => { }); + + render(<Settings />); + + // Wait for load + await waitFor(() => { + expect(screen.queryByText('Loading...')).not.toBeInTheDocument(); + }); + + const crawlBtn = screen.getByText(/crawl all feeds now/i); + fireEvent.click(crawlBtn); + + await waitFor(() => { + expect(global.fetch).toHaveBeenCalledWith( + '/api/crawl', + expect.objectContaining({ method: 'POST' }) + ); + expect(alertMock).toHaveBeenCalledWith('Crawl started!'); + }); + alertMock.mockRestore(); + }); + + it('handles API errors', async () => { + vi.mocked(global.fetch) + .mockResolvedValueOnce({ ok: true, json: async () => [] } as Response) // Initial load load + .mockResolvedValueOnce({ ok: false, json: async () => ({}) } as Response); // Add feed error + + render(<Settings />); + + // Wait for load + await waitFor(() => { + expect(screen.queryByText('Loading...')).not.toBeInTheDocument(); + }); + + const input = screen.getByPlaceholderText('https://example.com/feed.xml'); + const button = screen.getByText('Add Feed'); + + fireEvent.change(input, { target: { value: 'http://fail.com/rss' } }); + fireEvent.click(button); + + await waitFor(() => { + expect(screen.getByText(/failed to add feed/i)).toBeInTheDocument(); + }); + }); + + it('handles font theme change', async () => { + const setFontTheme = vi.fn(); + vi.mocked(global.fetch).mockResolvedValueOnce({ ok: true, json: async () => [] } as Response); + + render(<Settings fontTheme="default" setFontTheme={setFontTheme} />); + + // Wait for load + await waitFor(() => { + expect(screen.queryByText('Loading...')).not.toBeInTheDocument(); + }); + + const select = screen.getByLabelText(/font theme/i); + fireEvent.change(select, { target: { value: 'serif' } }); + + expect(setFontTheme).toHaveBeenCalledWith('serif'); + }); }); diff --git a/frontend/src/components/Settings.tsx b/frontend/src/components/Settings.tsx index ec432ba..3dab77f 100644 --- a/frontend/src/components/Settings.tsx +++ b/frontend/src/components/Settings.tsx @@ -138,8 +138,9 @@ export default function Settings({ fontTheme, setFontTheme }: SettingsProps) { <div className="appearance-section"> <h3>Appearance</h3> <div className="font-selector"> - <label>Font Theme:</label> + <label htmlFor="font-theme-select">Font Theme:</label> <select + id="font-theme-select" value={fontTheme || 'default'} onChange={(e) => setFontTheme(e.target.value)} className="font-select" |
