diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-13 13:50:25 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-13 13:50:25 -0800 |
| commit | e014ded82a630bd91b15be4307125f5580119f4d (patch) | |
| tree | 416712eef67ba5cac1c3e55780b80ab04c9aec47 /frontend/coverage | |
| parent | e7f0e40b3563a56a06f5bedd3efd40b750e74521 (diff) | |
| download | neko-e014ded82a630bd91b15be4307125f5580119f4d.tar.gz neko-e014ded82a630bd91b15be4307125f5580119f4d.tar.bz2 neko-e014ded82a630bd91b15be4307125f5580119f4d.zip | |
Analyze page size and fix frontend tests
Diffstat (limited to 'frontend/coverage')
| -rw-r--r-- | frontend/coverage/clover.xml | 230 | ||||
| -rw-r--r-- | frontend/coverage/coverage-final.json | 8 | ||||
| -rw-r--r-- | frontend/coverage/index.html | 48 | ||||
| -rw-r--r-- | frontend/coverage/src/App.css.html | 112 | ||||
| -rw-r--r-- | frontend/coverage/src/App.tsx.html | 46 | ||||
| -rw-r--r-- | frontend/coverage/src/components/FeedItem.css.html | 158 | ||||
| -rw-r--r-- | frontend/coverage/src/components/FeedItem.tsx.html | 111 | ||||
| -rw-r--r-- | frontend/coverage/src/components/FeedItems.css.html | 55 | ||||
| -rw-r--r-- | frontend/coverage/src/components/FeedItems.tsx.html | 571 | ||||
| -rw-r--r-- | frontend/coverage/src/components/FeedList.css.html | 200 | ||||
| -rw-r--r-- | frontend/coverage/src/components/FeedList.tsx.html | 175 | ||||
| -rw-r--r-- | frontend/coverage/src/components/Login.css.html | 2 | ||||
| -rw-r--r-- | frontend/coverage/src/components/Login.tsx.html | 2 | ||||
| -rw-r--r-- | frontend/coverage/src/components/Settings.css.html | 2 | ||||
| -rw-r--r-- | frontend/coverage/src/components/Settings.tsx.html | 2 | ||||
| -rw-r--r-- | frontend/coverage/src/components/index.html | 78 | ||||
| -rw-r--r-- | frontend/coverage/src/index.html | 22 |
17 files changed, 1432 insertions, 390 deletions
diff --git a/frontend/coverage/clover.xml b/frontend/coverage/clover.xml index 26fec33..f05aeb1 100644 --- a/frontend/coverage/clover.xml +++ b/frontend/coverage/clover.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> -<coverage generated="1770995023032" clover="3.2.0"> - <project timestamp="1770995023032" name="All files"> - <metrics statements="130" coveredstatements="114" conditionals="74" coveredconditionals="56" methods="48" coveredmethods="42" elements="252" coveredelements="212" complexity="0" loc="130" ncloc="130" packages="2" files="12" classes="12"/> +<coverage generated="1771019398957" clover="3.2.0"> + <project timestamp="1771019398957" name="All files"> + <metrics statements="224" coveredstatements="198" conditionals="142" coveredconditionals="109" methods="73" coveredmethods="63" elements="439" coveredelements="370" complexity="0" loc="224" ncloc="224" packages="2" files="12" classes="12"/> <package name="src"> - <metrics statements="19" coveredstatements="14" conditionals="6" coveredconditionals="4" methods="9" coveredmethods="7"/> + <metrics statements="19" coveredstatements="15" conditionals="6" coveredconditionals="4" methods="9" coveredmethods="7"/> <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="19" coveredstatements="14" conditionals="6" coveredconditionals="4" methods="9" coveredmethods="7"/> + <metrics statements="19" coveredstatements="15" conditionals="6" coveredconditionals="4" methods="9" coveredmethods="7"/> <line num="8" count="2" type="stmt"/> <line num="9" count="2" type="stmt"/> <line num="11" count="2" type="stmt"/> @@ -23,87 +23,181 @@ <line num="28" count="0" type="stmt"/> <line num="31" count="1" type="stmt"/> <line num="39" count="1" type="stmt"/> + <line num="40" count="1" type="stmt"/> <line num="45" count="0" type="stmt"/> - <line num="46" count="0" type="stmt"/> - <line num="55" count="1" type="stmt"/> - <line num="56" count="1" type="stmt"/> - <line num="79" count="2" type="stmt"/> + <line num="48" count="1" type="stmt"/> + <line num="49" count="1" type="stmt"/> + <line num="73" count="2" type="stmt"/> </file> </package> <package name="src.components"> - <metrics statements="111" coveredstatements="100" conditionals="68" coveredconditionals="52" methods="39" coveredmethods="35"/> + <metrics statements="205" coveredstatements="183" conditionals="136" coveredconditionals="105" methods="64" coveredmethods="56"/> <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="19" coveredstatements="18" conditionals="24" coveredconditionals="22" methods="7" coveredmethods="7"/> - <line num="10" count="12" type="stmt"/> - <line num="11" count="12" type="stmt"/> - <line num="13" count="12" type="stmt"/> - <line num="14" count="2" type="stmt"/> - <line num="17" count="12" type="stmt"/> - <line num="18" count="1" type="stmt"/> - <line num="21" count="12" type="stmt"/> - <line num="22" count="3" type="stmt"/> - <line num="24" count="3" type="stmt"/> - <line num="25" count="3" type="stmt"/> - <line num="27" count="3" type="stmt"/> - <line num="39" count="2" type="cond" truecount="1" falsecount="1"/> - <line num="40" count="0" type="stmt"/> - <line num="42" count="2" type="stmt"/> - <line num="47" count="2" type="stmt"/> - <line num="50" count="1" type="stmt"/> - <line num="52" count="1" type="stmt"/> - <line num="53" count="1" type="stmt"/> - <line num="57" count="12" type="stmt"/> + <metrics statements="19" coveredstatements="15" conditionals="18" coveredconditionals="16" methods="7" coveredmethods="6"/> + <line num="10" count="21" type="stmt"/> + <line num="11" count="21" type="stmt"/> + <line num="14" count="21" type="stmt"/> + <line num="15" count="1" type="stmt"/> + <line num="18" count="21" type="stmt"/> + <line num="19" count="1" type="stmt"/> + <line num="21" count="1" type="stmt"/> + <line num="22" count="1" type="stmt"/> + <line num="24" count="1" type="stmt"/> + <line num="36" count="1" type="cond" truecount="1" falsecount="1"/> + <line num="37" count="0" type="stmt"/> + <line num="39" count="1" type="stmt"/> + <line num="44" count="1" type="stmt"/> + <line num="47" count="0" type="stmt"/> + <line num="49" count="0" type="stmt"/> + <line num="50" count="0" type="stmt"/> + <line num="54" count="21" type="stmt"/> + <line num="59" count="1" type="stmt"/> + <line num="60" count="1" type="stmt"/> </file> <file name="FeedItems.css" path="/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.css"> <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="20" coveredstatements="17" conditionals="10" coveredconditionals="6" methods="6" coveredmethods="5"/> - <line num="8" count="3" type="stmt"/> - <line num="9" count="3" type="stmt"/> - <line num="10" count="3" type="stmt"/> - <line num="11" count="3" type="stmt"/> - <line num="13" count="3" type="stmt"/> - <line num="14" count="2" type="stmt"/> - <line num="15" count="2" type="stmt"/> - <line num="17" count="2" type="cond" truecount="1" falsecount="1"/> - <line num="21" count="2" type="stmt"/> - <line num="23" count="1" type="cond" truecount="1" falsecount="1"/> - <line num="24" count="0" type="stmt"/> - <line num="26" count="1" type="stmt"/> - <line num="29" count="1" type="stmt"/> - <line num="30" count="1" type="stmt"/> - <line num="33" count="0" type="stmt"/> - <line num="34" count="0" type="stmt"/> - <line num="38" count="3" type="cond" truecount="2" falsecount="0"/> - <line num="39" count="1" type="cond" truecount="1" falsecount="1"/> - <line num="41" count="1" type="stmt"/> - <line num="50" count="2" type="stmt"/> + <metrics statements="110" coveredstatements="98" conditionals="79" coveredconditionals="61" methods="29" coveredmethods="25"/> + <line num="8" count="27" type="stmt"/> + <line num="9" count="27" type="stmt"/> + <line num="10" count="27" type="cond" truecount="2" falsecount="0"/> + <line num="12" count="27" type="stmt"/> + <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="18" count="27" type="stmt"/> + <line num="19" count="8" type="cond" truecount="2" falsecount="0"/> + <line num="20" count="1" type="stmt"/> + <line num="22" count="7" type="stmt"/> + <line num="23" count="7" type="stmt"/> + <line num="25" count="8" type="stmt"/> + <line num="27" count="8" type="stmt"/> + <line num="28" count="8" type="stmt"/> + <line num="30" count="8" type="cond" truecount="2" falsecount="0"/> + <line num="31" count="2" type="stmt"/> + <line num="32" count="6" type="cond" truecount="2" falsecount="0"/> + <line num="33" count="1" type="stmt"/> + <line num="36" count="8" type="cond" truecount="2" falsecount="0"/> + <line num="37" count="1" type="stmt"/> + <line num="41" count="8" type="cond" truecount="1" falsecount="1"/> + <line num="42" count="0" type="stmt"/> + <line num="43" count="8" type="cond" truecount="1" falsecount="1"/> + <line num="44" count="0" type="stmt"/> + <line num="45" count="0" type="stmt"/> + <line num="48" count="8" type="stmt"/> + <line num="51" count="8" type="stmt"/> + <line num="52" count="8" type="cond" truecount="1" falsecount="1"/> + <line num="53" count="8" type="stmt"/> + <line num="56" count="8" type="stmt"/> + <line num="58" count="7" type="cond" truecount="1" falsecount="1"/> + <line num="59" count="0" type="stmt"/> + <line num="61" count="7" type="stmt"/> + <line num="64" count="6" type="cond" truecount="2" falsecount="0"/> + <line num="65" count="1" type="stmt"/> + <line num="67" count="5" type="stmt"/> + <line num="69" count="6" type="stmt"/> + <line num="70" count="6" type="stmt"/> + <line num="71" count="6" type="stmt"/> + <line num="74" count="1" type="stmt"/> + <line num="75" count="1" type="stmt"/> + <line num="76" count="1" type="stmt"/> + <line num="80" count="27" type="stmt"/> + <line num="81" count="7" type="stmt"/> + <line num="84" count="27" type="stmt"/> + <line num="86" count="27" type="stmt"/> + <line num="87" count="23" type="stmt"/> + <line num="88" count="3" type="cond" truecount="1" falsecount="1"/> + <line num="90" count="3" type="cond" truecount="2" falsecount="0"/> + <line num="91" count="2" type="stmt"/> + <line num="92" count="2" type="stmt"/> + <line num="93" count="2" type="cond" truecount="1" falsecount="1"/> + <line num="94" count="2" type="stmt"/> + <line num="95" count="2" type="cond" truecount="2" falsecount="0"/> + <line num="96" count="1" type="stmt"/> + <line num="98" count="2" type="stmt"/> + <line num="100" count="2" type="stmt"/> + <line num="102" count="1" type="cond" truecount="1" falsecount="1"/> + <line num="103" count="0" type="stmt"/> + <line num="104" count="0" type="stmt"/> + <line num="105" count="0" type="cond" truecount="0" falsecount="2"/> + <line num="106" count="0" type="stmt"/> + <line num="108" count="0" type="stmt"/> + <line num="110" count="1" type="cond" truecount="1" falsecount="1"/> + <line num="111" count="1" type="stmt"/> + <line num="112" count="1" type="cond" truecount="3" falsecount="1"/> + <line num="113" count="1" type="stmt"/> + <line num="115" count="1" type="stmt"/> + <line num="120" count="23" type="stmt"/> + <line num="121" count="23" type="stmt"/> + <line num="124" count="27" type="stmt"/> + <line num="125" count="2" type="stmt"/> + <line num="126" count="2" type="cond" truecount="1" falsecount="1"/> + <line num="127" count="2" type="stmt"/> + <line num="131" count="27" type="stmt"/> + <line num="132" count="2" type="stmt"/> + <line num="134" count="3" type="cond" truecount="2" falsecount="0"/> + <line num="136" count="2" type="stmt"/> + <line num="140" count="0" type="stmt"/> + <line num="143" count="27" type="stmt"/> + <line num="144" count="1" type="stmt"/> + <line num="146" count="2" type="cond" truecount="2" falsecount="0"/> + <line num="148" count="1" type="stmt"/> + <line num="152" count="0" type="stmt"/> + <line num="155" count="27" type="stmt"/> + <line num="156" count="24" type="stmt"/> + <line num="158" count="2" type="stmt"/> + <line num="160" count="2" type="cond" truecount="2" falsecount="0"/> + <line num="161" count="1" type="cond" truecount="5" falsecount="1"/> + <line num="162" count="1" type="stmt"/> + <line num="164" count="1" type="stmt"/> + <line num="168" count="1" type="cond" truecount="3" falsecount="1"/> + <line num="169" count="1" type="stmt"/> + <line num="170" count="1" type="cond" truecount="4" falsecount="1"/> + <line num="171" count="1" type="stmt"/> + <line num="172" count="1" type="cond" truecount="1" falsecount="1"/> + <line num="173" count="1" type="stmt"/> + <line num="182" count="24" type="stmt"/> + <line num="183" count="15" type="stmt"/> + <line num="184" count="15" type="cond" truecount="1" falsecount="1"/> + <line num="187" count="24" type="stmt"/> + <line num="188" count="24" type="cond" truecount="2" falsecount="0"/> + <line num="190" count="24" type="stmt"/> + <line num="193" count="27" type="cond" truecount="2" falsecount="0"/> + <line num="194" count="14" type="cond" truecount="2" falsecount="0"/> + <line num="197" count="13" type="stmt"/> + <line num="204" count="21" type="stmt"/> + <line num="209" 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="16" coveredstatements="15" conditionals="12" coveredconditionals="10" methods="6" coveredmethods="6"/> - <line num="7" count="9" type="stmt"/> - <line num="8" count="9" type="stmt"/> - <line num="9" count="9" type="stmt"/> - <line num="11" count="9" type="stmt"/> - <line num="12" count="5" type="stmt"/> - <line num="14" count="3" type="cond" truecount="1" falsecount="1"/> - <line num="15" count="0" type="stmt"/> - <line num="17" count="3" type="stmt"/> - <line num="20" count="3" type="stmt"/> - <line num="21" count="3" type="stmt"/> - <line num="24" count="1" type="stmt"/> - <line num="25" count="1" type="stmt"/> - <line num="29" count="9" type="cond" truecount="2" falsecount="0"/> - <line num="30" count="4" type="cond" truecount="2" falsecount="0"/> - <line num="32" count="3" type="stmt"/> - <line num="40" count="2" type="stmt"/> + <metrics statements="20" coveredstatements="20" conditionals="17" coveredconditionals="14" methods="8" coveredmethods="8"/> + <line num="7" count="11" type="stmt"/> + <line num="8" count="11" type="stmt"/> + <line num="9" count="11" type="stmt"/> + <line num="10" count="11" type="stmt"/> + <line num="12" count="11" type="stmt"/> + <line num="13" count="6" type="stmt"/> + <line num="15" count="4" type="cond" truecount="1" falsecount="1"/> + <line num="16" count="4" type="stmt"/> + <line num="19" count="4" type="cond" truecount="1" falsecount="1"/> + <line num="20" count="4" type="stmt"/> + <line num="24" count="4" type="stmt"/> + <line num="25" count="4" type="stmt"/> + <line num="26" count="4" type="stmt"/> + <line num="29" count="1" type="stmt"/> + <line num="30" count="1" type="stmt"/> + <line num="34" count="11" type="cond" truecount="2" falsecount="0"/> + <line num="35" count="5" type="cond" truecount="2" falsecount="0"/> + <line num="37" count="4" type="stmt"/> + <line num="53" count="3" type="stmt"/> + <line num="69" count="3" type="stmt"/> </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"/> diff --git a/frontend/coverage/coverage-final.json b/frontend/coverage/coverage-final.json index 14d4351..80fb28a 100644 --- a/frontend/coverage/coverage-final.json +++ b/frontend/coverage/coverage-final.json @@ -1,11 +1,11 @@ {"/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":8,"column":22},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"2":{"start":{"line":11,"column":2},"end":{"line":21,"column":null}},"3":{"start":{"line":12,"column":4},"end":{"line":20,"column":null}},"4":{"start":{"line":14,"column":8},"end":{"line":18,"column":null}},"5":{"start":{"line":15,"column":10},"end":{"line":15,"column":null}},"6":{"start":{"line":17,"column":10},"end":{"line":17,"column":null}},"7":{"start":{"line":20,"column":19},"end":{"line":20,"column":33}},"8":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"9":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"10":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"11":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"12":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"13":{"start":{"line":39,"column":2},"end":{"line":74,"column":null}},"14":{"start":{"line":45,"column":12},"end":{"line":45,"column":null}},"15":{"start":{"line":46,"column":12},"end":{"line":46,"column":null}},"16":{"start":{"line":55,"column":12},"end":{"line":56,"column":null}},"17":{"start":{"line":56,"column":26},"end":{"line":56,"column":58}},"18":{"start":{"line":79,"column":2},"end":{"line":92,"column":null}}},"fnMap":{"0":{"name":"RequireAuth","decl":{"start":{"line":7,"column":9},"end":{"line":7,"column":21}},"loc":{"start":{"line":7,"column":69},"end":{"line":32,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":12},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":18},"end":{"line":21,"column":5}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":12},"end":{"line":13,"column":13}},"loc":{"start":{"line":13,"column":21},"end":{"line":19,"column":7}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":13},"end":{"line":20,"column":19}},"loc":{"start":{"line":20,"column":19},"end":{"line":20,"column":33}},"line":20},"4":{"name":"Dashboard","decl":{"start":{"line":38,"column":9},"end":{"line":38,"column":21}},"loc":{"start":{"line":38,"column":21},"end":{"line":76,"column":null}},"line":38},"5":{"name":"(anonymous_5)","decl":{"start":{"line":44,"column":39},"end":{"line":44,"column":40}},"loc":{"start":{"line":44,"column":46},"end":{"line":52,"column":13}},"line":44},"6":{"name":"(anonymous_6)","decl":{"start":{"line":54,"column":27},"end":{"line":54,"column":33}},"loc":{"start":{"line":54,"column":33},"end":{"line":57,"column":13}},"line":54},"7":{"name":"(anonymous_7)","decl":{"start":{"line":56,"column":20},"end":{"line":56,"column":26}},"loc":{"start":{"line":56,"column":26},"end":{"line":56,"column":58}},"line":56},"8":{"name":"App","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":15}},"loc":{"start":{"line":78,"column":15},"end":{"line":94,"column":null}},"line":78}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":18,"column":null}},{"start":{"line":16,"column":15},"end":{"line":18,"column":null}}],"line":14},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":23},"2":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},{"start":{},"end":{}}],"line":27}},"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":0,"15":0,"16":1,"17":1,"18":2},"f":{"0":2,"1":1,"2":1,"3":0,"4":1,"5":0,"6":1,"7":1,"8":2},"b":{"0":[1,0],"1":[1,1],"2":[0,1]},"meta":{"lastBranch":3,"lastFunction":9,"lastStatement":19,"seen":{"f:7:9:7:21":0,"s:8:22:8:Infinity":0,"s:9:8:9:Infinity":1,"s:11:2:21:Infinity":2,"f:11:12:11:18":1,"s:12:4:20:Infinity":3,"f:13:12:13:13":2,"b:14:8:18:Infinity:16:15:18:Infinity":0,"s:14:8:18:Infinity":4,"s:15:10:15:Infinity":5,"s:17:10:17:Infinity":6,"f:20:13:20:19":3,"s:20:19:20:33":7,"b:23:2:25:Infinity:undefined:undefined:undefined:undefined":1,"s:23:2:25:Infinity":8,"s:24:4:24:Infinity":9,"b:27:2:29:Infinity:undefined:undefined:undefined:undefined":2,"s:27:2:29:Infinity":10,"s:28:4:28:Infinity":11,"s:31:2:31:Infinity":12,"f:38:9:38:21":4,"s:39:2:74:Infinity":13,"f:44:39:44:40":5,"s:45:12:45:Infinity":14,"s:46:12:46:Infinity":15,"f:54:27:54:33":6,"s:55:12:56:Infinity":16,"f:56:20:56:26":7,"s:56:26:56:58":17,"f:78:9:78:15":8,"s:79:2:92:Infinity":18}}} +,"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx","statementMap":{"0":{"start":{"line":8,"column":22},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":8},"end":{"line":9,"column":null}},"2":{"start":{"line":11,"column":2},"end":{"line":21,"column":null}},"3":{"start":{"line":12,"column":4},"end":{"line":20,"column":null}},"4":{"start":{"line":14,"column":8},"end":{"line":18,"column":null}},"5":{"start":{"line":15,"column":10},"end":{"line":15,"column":null}},"6":{"start":{"line":17,"column":10},"end":{"line":17,"column":null}},"7":{"start":{"line":20,"column":19},"end":{"line":20,"column":33}},"8":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"9":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"10":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"11":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"12":{"start":{"line":31,"column":2},"end":{"line":31,"column":null}},"13":{"start":{"line":39,"column":8},"end":{"line":39,"column":null}},"14":{"start":{"line":40,"column":2},"end":{"line":68,"column":null}},"15":{"start":{"line":45,"column":33},"end":{"line":45,"column":56}},"16":{"start":{"line":48,"column":12},"end":{"line":49,"column":null}},"17":{"start":{"line":49,"column":26},"end":{"line":49,"column":60}},"18":{"start":{"line":73,"column":2},"end":{"line":86,"column":null}}},"fnMap":{"0":{"name":"RequireAuth","decl":{"start":{"line":7,"column":9},"end":{"line":7,"column":21}},"loc":{"start":{"line":7,"column":69},"end":{"line":32,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":12},"end":{"line":11,"column":18}},"loc":{"start":{"line":11,"column":18},"end":{"line":21,"column":5}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":12},"end":{"line":13,"column":13}},"loc":{"start":{"line":13,"column":21},"end":{"line":19,"column":7}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":13},"end":{"line":20,"column":19}},"loc":{"start":{"line":20,"column":19},"end":{"line":20,"column":33}},"line":20},"4":{"name":"Dashboard","decl":{"start":{"line":38,"column":9},"end":{"line":38,"column":21}},"loc":{"start":{"line":38,"column":21},"end":{"line":70,"column":null}},"line":38},"5":{"name":"(anonymous_5)","decl":{"start":{"line":45,"column":27},"end":{"line":45,"column":33}},"loc":{"start":{"line":45,"column":33},"end":{"line":45,"column":56}},"line":45},"6":{"name":"(anonymous_6)","decl":{"start":{"line":47,"column":27},"end":{"line":47,"column":33}},"loc":{"start":{"line":47,"column":33},"end":{"line":50,"column":13}},"line":47},"7":{"name":"(anonymous_7)","decl":{"start":{"line":49,"column":20},"end":{"line":49,"column":26}},"loc":{"start":{"line":49,"column":26},"end":{"line":49,"column":60}},"line":49},"8":{"name":"App","decl":{"start":{"line":72,"column":9},"end":{"line":72,"column":15}},"loc":{"start":{"line":72,"column":15},"end":{"line":88,"column":null}},"line":72}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":8},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":8},"end":{"line":18,"column":null}},{"start":{"line":16,"column":15},"end":{"line":18,"column":null}}],"line":14},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":23},"2":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":null}},{"start":{},"end":{}}],"line":27}},"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":1,"17":1,"18":2},"f":{"0":2,"1":1,"2":1,"3":0,"4":1,"5":0,"6":1,"7":1,"8":2},"b":{"0":[1,0],"1":[1,1],"2":[0,1]},"meta":{"lastBranch":3,"lastFunction":9,"lastStatement":19,"seen":{"f:7:9:7:21":0,"s:8:22:8:Infinity":0,"s:9:8:9:Infinity":1,"s:11:2:21:Infinity":2,"f:11:12:11:18":1,"s:12:4:20:Infinity":3,"f:13:12:13:13":2,"b:14:8:18:Infinity:16:15:18:Infinity":0,"s:14:8:18:Infinity":4,"s:15:10:15:Infinity":5,"s:17:10:17:Infinity":6,"f:20:13:20:19":3,"s:20:19:20:33":7,"b:23:2:25:Infinity:undefined:undefined:undefined:undefined":1,"s:23:2:25:Infinity":8,"s:24:4:24:Infinity":9,"b:27:2:29:Infinity:undefined:undefined:undefined:undefined":2,"s:27:2:29:Infinity":10,"s:28:4:28:Infinity":11,"s:31:2:31:Infinity":12,"f:38:9:38:21":4,"s:39:8:39:Infinity":13,"s:40:2:68:Infinity":14,"f:45:27:45:33":5,"s:45:33:45:56":15,"f:47:27:47:33":6,"s:48:12:49:Infinity":16,"f:49:20:49:26":7,"s:49:26:49:60":17,"f:72:9:72:15":8,"s:73:2:86:Infinity":18}}} ,"/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":10,"column":24},"end":{"line":10,"column":null}},"1":{"start":{"line":11,"column":30},"end":{"line":11,"column":null}},"2":{"start":{"line":13,"column":23},"end":{"line":15,"column":null}},"3":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"4":{"start":{"line":17,"column":23},"end":{"line":19,"column":null}},"5":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"6":{"start":{"line":21,"column":23},"end":{"line":55,"column":null}},"7":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"8":{"start":{"line":24,"column":29},"end":{"line":24,"column":null}},"9":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"10":{"start":{"line":27,"column":8},"end":{"line":54,"column":null}},"11":{"start":{"line":39,"column":16},"end":{"line":41,"column":null}},"12":{"start":{"line":40,"column":20},"end":{"line":40,"column":null}},"13":{"start":{"line":42,"column":16},"end":{"line":42,"column":null}},"14":{"start":{"line":47,"column":16},"end":{"line":47,"column":null}},"15":{"start":{"line":50,"column":16},"end":{"line":50,"column":null}},"16":{"start":{"line":52,"column":16},"end":{"line":52,"column":null}},"17":{"start":{"line":53,"column":16},"end":{"line":53,"column":null}},"18":{"start":{"line":57,"column":4},"end":{"line":87,"column":null}}},"fnMap":{"0":{"name":"FeedItem","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":33}},"loc":{"start":{"line":9,"column":71},"end":{"line":89,"column":null}},"line":9},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":23},"end":{"line":13,"column":29}},"loc":{"start":{"line":13,"column":29},"end":{"line":15,"column":null}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":23},"end":{"line":17,"column":29}},"loc":{"start":{"line":17,"column":29},"end":{"line":19,"column":null}},"line":17},"3":{"name":"(anonymous_3)","decl":{"start":{"line":21,"column":23},"end":{"line":21,"column":24}},"loc":{"start":{"line":21,"column":42},"end":{"line":55,"column":null}},"line":21},"4":{"name":"(anonymous_4)","decl":{"start":{"line":38,"column":18},"end":{"line":38,"column":19}},"loc":{"start":{"line":38,"column":27},"end":{"line":43,"column":13}},"line":38},"5":{"name":"(anonymous_5)","decl":{"start":{"line":44,"column":18},"end":{"line":44,"column":24}},"loc":{"start":{"line":44,"column":24},"end":{"line":48,"column":13}},"line":44},"6":{"name":"(anonymous_6)","decl":{"start":{"line":49,"column":19},"end":{"line":49,"column":20}},"loc":{"start":{"line":49,"column":28},"end":{"line":54,"column":13}},"line":49}},"branchMap":{"0":{"loc":{"start":{"line":39,"column":16},"end":{"line":41,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":16},"end":{"line":41,"column":null}},{"start":{},"end":{}}],"line":39},"1":{"loc":{"start":{"line":58,"column":36},"end":{"line":58,"column":65}},"type":"cond-expr","locations":[{"start":{"line":58,"column":48},"end":{"line":58,"column":57}},{"start":{"line":58,"column":57},"end":{"line":58,"column":65}}],"line":58},"2":{"loc":{"start":{"line":58,"column":69},"end":{"line":58,"column":93}},"type":"cond-expr","locations":[{"start":{"line":58,"column":79},"end":{"line":58,"column":91}},{"start":{"line":58,"column":91},"end":{"line":58,"column":93}}],"line":58},"3":{"loc":{"start":{"line":61,"column":21},"end":{"line":61,"column":null}},"type":"binary-expr","locations":[{"start":{"line":61,"column":21},"end":{"line":61,"column":35}},{"start":{"line":61,"column":35},"end":{"line":61,"column":null}}],"line":61},"4":{"loc":{"start":{"line":66,"column":49},"end":{"line":66,"column":84}},"type":"cond-expr","locations":[{"start":{"line":66,"column":61},"end":{"line":66,"column":73}},{"start":{"line":66,"column":73},"end":{"line":66,"column":84}}],"line":66},"5":{"loc":{"start":{"line":67,"column":31},"end":{"line":67,"column":null}},"type":"cond-expr","locations":[{"start":{"line":67,"column":43},"end":{"line":67,"column":62}},{"start":{"line":67,"column":62},"end":{"line":67,"column":null}}],"line":67},"6":{"loc":{"start":{"line":69,"column":25},"end":{"line":69,"column":null}},"type":"cond-expr","locations":[{"start":{"line":69,"column":37},"end":{"line":69,"column":44}},{"start":{"line":69,"column":44},"end":{"line":69,"column":null}}],"line":69},"7":{"loc":{"start":{"line":73,"column":49},"end":{"line":73,"column":93}},"type":"cond-expr","locations":[{"start":{"line":73,"column":64},"end":{"line":73,"column":79}},{"start":{"line":73,"column":79},"end":{"line":73,"column":93}}],"line":73},"8":{"loc":{"start":{"line":74,"column":31},"end":{"line":74,"column":null}},"type":"cond-expr","locations":[{"start":{"line":74,"column":46},"end":{"line":74,"column":57}},{"start":{"line":74,"column":57},"end":{"line":74,"column":null}}],"line":74},"9":{"loc":{"start":{"line":76,"column":25},"end":{"line":76,"column":null}},"type":"cond-expr","locations":[{"start":{"line":76,"column":40},"end":{"line":76,"column":46}},{"start":{"line":76,"column":46},"end":{"line":76,"column":null}}],"line":76},"10":{"loc":{"start":{"line":82,"column":17},"end":{"line":82,"column":null}},"type":"binary-expr","locations":[{"start":{"line":82,"column":17},"end":{"line":82,"column":36}},{"start":{"line":82,"column":36},"end":{"line":82,"column":null}}],"line":82},"11":{"loc":{"start":{"line":84,"column":13},"end":{"line":85,"column":null}},"type":"binary-expr","locations":[{"start":{"line":84,"column":13},"end":{"line":84,"column":null}},{"start":{"line":85,"column":16},"end":{"line":85,"column":null}}],"line":84}},"s":{"0":12,"1":12,"2":12,"3":2,"4":12,"5":1,"6":12,"7":3,"8":3,"9":3,"10":3,"11":2,"12":0,"13":2,"14":2,"15":1,"16":1,"17":1,"18":12},"f":{"0":12,"1":2,"2":1,"3":3,"4":2,"5":2,"6":1},"b":{"0":[0,2],"1":[4,8],"2":[3,9],"3":[12,0],"4":[4,8],"5":[4,8],"6":[4,8],"7":[2,10],"8":[2,10],"9":[2,10],"10":[12,10],"11":[12,10]},"meta":{"lastBranch":12,"lastFunction":7,"lastStatement":19,"seen":{"f:9:24:9:33":0,"s:10:24:10:Infinity":0,"s:11:30:11:Infinity":1,"s:13:23:15:Infinity":2,"f:13:23:13:29":1,"s:14:8:14:Infinity":3,"s:17:23:19:Infinity":4,"f:17:23:17:29":2,"s:18:8:18:Infinity":5,"s:21:23:55:Infinity":6,"f:21:23:21:24":3,"s:22:8:22:Infinity":7,"s:24:29:24:Infinity":8,"s:25:8:25:Infinity":9,"s:27:8:54:Infinity":10,"f:38:18:38:19":4,"b:39:16:41:Infinity:undefined:undefined:undefined:undefined":0,"s:39:16:41:Infinity":11,"s:40:20:40:Infinity":12,"s:42:16:42:Infinity":13,"f:44:18:44:24":5,"s:47:16:47:Infinity":14,"f:49:19:49:20":6,"s:50:16:50:Infinity":15,"s:52:16:52:Infinity":16,"s:53:16:53:Infinity":17,"s:57:4:87:Infinity":18,"b:58:48:58:57:58:57:58:65":1,"b:58:79:58:91:58:91:58:93":2,"b:61:21:61:35:61:35:61:Infinity":3,"b:66:61:66:73:66:73:66:84":4,"b:67:43:67:62:67:62:67:Infinity":5,"b:69:37:69:44:69:44:69:Infinity":6,"b:73:64:73:79:73:79:73:93":7,"b:74:46:74:57:74:57:74:Infinity":8,"b:76:40:76:46:76:46:76:Infinity":9,"b:82:17:82:36:82:36:82:Infinity":10,"b:84:13:84:Infinity:85:16:85:Infinity":11}}} +,"/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":10,"column":24},"end":{"line":10,"column":null}},"1":{"start":{"line":11,"column":30},"end":{"line":11,"column":null}},"2":{"start":{"line":14,"column":23},"end":{"line":16,"column":null}},"3":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"4":{"start":{"line":18,"column":23},"end":{"line":52,"column":null}},"5":{"start":{"line":19,"column":8},"end":{"line":19,"column":null}},"6":{"start":{"line":21,"column":29},"end":{"line":21,"column":null}},"7":{"start":{"line":22,"column":8},"end":{"line":22,"column":null}},"8":{"start":{"line":24,"column":8},"end":{"line":51,"column":null}},"9":{"start":{"line":36,"column":16},"end":{"line":38,"column":null}},"10":{"start":{"line":37,"column":20},"end":{"line":37,"column":null}},"11":{"start":{"line":39,"column":16},"end":{"line":39,"column":null}},"12":{"start":{"line":44,"column":16},"end":{"line":44,"column":null}},"13":{"start":{"line":47,"column":16},"end":{"line":47,"column":null}},"14":{"start":{"line":49,"column":16},"end":{"line":49,"column":null}},"15":{"start":{"line":50,"column":16},"end":{"line":50,"column":null}},"16":{"start":{"line":54,"column":4},"end":{"line":82,"column":null}},"17":{"start":{"line":59,"column":24},"end":{"line":59,"column":null}},"18":{"start":{"line":60,"column":24},"end":{"line":60,"column":null}}},"fnMap":{"0":{"name":"FeedItem","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":33}},"loc":{"start":{"line":9,"column":71},"end":{"line":84,"column":null}},"line":9},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":23},"end":{"line":14,"column":29}},"loc":{"start":{"line":14,"column":29},"end":{"line":16,"column":null}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":23},"end":{"line":18,"column":24}},"loc":{"start":{"line":18,"column":42},"end":{"line":52,"column":null}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":35,"column":18},"end":{"line":35,"column":19}},"loc":{"start":{"line":35,"column":27},"end":{"line":40,"column":13}},"line":35},"4":{"name":"(anonymous_4)","decl":{"start":{"line":41,"column":18},"end":{"line":41,"column":24}},"loc":{"start":{"line":41,"column":24},"end":{"line":45,"column":13}},"line":41},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":19},"end":{"line":46,"column":20}},"loc":{"start":{"line":46,"column":28},"end":{"line":51,"column":13}},"line":46},"6":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":29},"end":{"line":58,"column":30}},"loc":{"start":{"line":58,"column":36},"end":{"line":61,"column":null}},"line":58}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":16},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":16},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":36},"1":{"loc":{"start":{"line":55,"column":36},"end":{"line":55,"column":65}},"type":"cond-expr","locations":[{"start":{"line":55,"column":48},"end":{"line":55,"column":57}},{"start":{"line":55,"column":57},"end":{"line":55,"column":65}}],"line":55},"2":{"loc":{"start":{"line":55,"column":69},"end":{"line":55,"column":93}},"type":"cond-expr","locations":[{"start":{"line":55,"column":79},"end":{"line":55,"column":91}},{"start":{"line":55,"column":91},"end":{"line":55,"column":93}}],"line":55},"3":{"loc":{"start":{"line":62,"column":43},"end":{"line":62,"column":87}},"type":"cond-expr","locations":[{"start":{"line":62,"column":58},"end":{"line":62,"column":73}},{"start":{"line":62,"column":73},"end":{"line":62,"column":87}}],"line":62},"4":{"loc":{"start":{"line":63,"column":27},"end":{"line":63,"column":null}},"type":"cond-expr","locations":[{"start":{"line":63,"column":42},"end":{"line":63,"column":53}},{"start":{"line":63,"column":53},"end":{"line":63,"column":null}}],"line":63},"5":{"loc":{"start":{"line":65,"column":21},"end":{"line":65,"column":null}},"type":"cond-expr","locations":[{"start":{"line":65,"column":36},"end":{"line":65,"column":42}},{"start":{"line":65,"column":42},"end":{"line":65,"column":null}}],"line":65},"6":{"loc":{"start":{"line":68,"column":21},"end":{"line":68,"column":null}},"type":"binary-expr","locations":[{"start":{"line":68,"column":21},"end":{"line":68,"column":35}},{"start":{"line":68,"column":35},"end":{"line":68,"column":null}}],"line":68},"7":{"loc":{"start":{"line":74,"column":21},"end":{"line":74,"column":null}},"type":"binary-expr","locations":[{"start":{"line":74,"column":21},"end":{"line":74,"column":40}},{"start":{"line":74,"column":40},"end":{"line":74,"column":null}}],"line":74},"8":{"loc":{"start":{"line":79,"column":13},"end":{"line":80,"column":null}},"type":"binary-expr","locations":[{"start":{"line":79,"column":13},"end":{"line":79,"column":null}},{"start":{"line":80,"column":16},"end":{"line":80,"column":null}}],"line":79}},"s":{"0":21,"1":21,"2":21,"3":1,"4":21,"5":1,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":1,"13":0,"14":0,"15":0,"16":21,"17":1,"18":1},"f":{"0":21,"1":1,"2":1,"3":1,"4":1,"5":0,"6":1},"b":{"0":[0,1],"1":[9,12],"2":[1,20],"3":[2,19],"4":[2,19],"5":[2,19],"6":[21,0],"7":[21,5],"8":[21,4]},"meta":{"lastBranch":9,"lastFunction":7,"lastStatement":19,"seen":{"f:9:24:9:33":0,"s:10:24:10:Infinity":0,"s:11:30:11:Infinity":1,"s:14:23:16:Infinity":2,"f:14:23:14:29":1,"s:15:8:15:Infinity":3,"s:18:23:52:Infinity":4,"f:18:23:18:24":2,"s:19:8:19:Infinity":5,"s:21:29:21:Infinity":6,"s:22:8:22:Infinity":7,"s:24:8:51:Infinity":8,"f:35:18:35:19":3,"b:36:16:38:Infinity:undefined:undefined:undefined:undefined":0,"s:36:16:38:Infinity":9,"s:37:20:37:Infinity":10,"s:39:16:39:Infinity":11,"f:41:18:41:24":4,"s:44:16:44:Infinity":12,"f:46:19:46:20":5,"s:47:16:47:Infinity":13,"s:49:16:49:Infinity":14,"s:50:16:50:Infinity":15,"s:54:4:82:Infinity":16,"b:55:48:55:57:55:57:55:65":1,"b:55:79:55:91:55:91:55:93":2,"f:58:29:58:30":6,"s:59:24:59:Infinity":17,"s:60:24:60:Infinity":18,"b:62:58:62:73:62:73:62:87":3,"b:63:42:63:53:63:53:63:Infinity":4,"b:65:36:65:42:65:42:65:Infinity":5,"b:68:21:68:35:68:35:68:Infinity":6,"b:74:21:74:40:74:40:74:Infinity":7,"b:79:13:79:Infinity:80:16:80:Infinity":8}}} ,"/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":8,"column":19},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":26},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":30},"end":{"line":10,"column":null}},"3":{"start":{"line":11,"column":26},"end":{"line":11,"column":null}},"4":{"start":{"line":13,"column":4},"end":{"line":36,"column":null}},"5":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":20},"end":{"line":19,"column":null}},"8":{"start":{"line":21,"column":8},"end":{"line":35,"column":null}},"9":{"start":{"line":23,"column":16},"end":{"line":25,"column":null}},"10":{"start":{"line":24,"column":20},"end":{"line":24,"column":null}},"11":{"start":{"line":26,"column":16},"end":{"line":26,"column":null}},"12":{"start":{"line":29,"column":16},"end":{"line":29,"column":null}},"13":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"14":{"start":{"line":33,"column":16},"end":{"line":33,"column":null}},"15":{"start":{"line":34,"column":16},"end":{"line":34,"column":null}},"16":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"17":{"start":{"line":38,"column":17},"end":{"line":38,"column":null}},"18":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"19":{"start":{"line":39,"column":15},"end":{"line":39,"column":null}},"20":{"start":{"line":41,"column":4},"end":{"line":54,"column":null}},"21":{"start":{"line":50,"column":24},"end":{"line":50,"column":null}}},"fnMap":{"0":{"name":"FeedItems","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":36}},"loc":{"start":{"line":7,"column":36},"end":{"line":56,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":14},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":20},"end":{"line":36,"column":7}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":18},"end":{"line":22,"column":19}},"loc":{"start":{"line":22,"column":27},"end":{"line":27,"column":13}},"line":22},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":18},"end":{"line":28,"column":19}},"loc":{"start":{"line":28,"column":28},"end":{"line":31,"column":13}},"line":28},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":19},"end":{"line":32,"column":20}},"loc":{"start":{"line":32,"column":28},"end":{"line":35,"column":13}},"line":32},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":31},"end":{"line":49,"column":32}},"loc":{"start":{"line":50,"column":24},"end":{"line":50,"column":null}},"line":50}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":20},"end":{"line":19,"column":null}},"type":"cond-expr","locations":[{"start":{"line":18,"column":14},"end":{"line":18,"column":null}},{"start":{"line":19,"column":14},"end":{"line":19,"column":null}}],"line":17},"1":{"loc":{"start":{"line":23,"column":16},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":23,"column":16},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":23},"2":{"loc":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":38},"3":{"loc":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},{"start":{},"end":{}}],"line":39},"4":{"loc":{"start":{"line":45,"column":13},"end":{"line":52,"column":null}},"type":"cond-expr","locations":[{"start":{"line":46,"column":16},"end":{"line":46,"column":null}},{"start":{"line":48,"column":16},"end":{"line":52,"column":null}}],"line":45}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":2,"6":2,"7":2,"8":2,"9":1,"10":0,"11":1,"12":1,"13":1,"14":0,"15":0,"16":3,"17":2,"18":1,"19":1,"20":1,"21":2},"f":{"0":3,"1":2,"2":1,"3":1,"4":0,"5":2},"b":{"0":[2,0],"1":[0,1],"2":[2,1],"3":[0,1],"4":[0,1]},"meta":{"lastBranch":5,"lastFunction":6,"lastStatement":22,"seen":{"f:7:24:7:36":0,"s:8:19:8:Infinity":0,"s:9:26:9:Infinity":1,"s:10:30:10:Infinity":2,"s:11:26:11:Infinity":3,"s:13:4:36:Infinity":4,"f:13:14:13:20":1,"s:14:8:14:Infinity":5,"s:15:8:15:Infinity":6,"s:17:20:19:Infinity":7,"b:18:14:18:Infinity:19:14:19:Infinity":0,"s:21:8:35:Infinity":8,"f:22:18:22:19":2,"b:23:16:25:Infinity:undefined:undefined:undefined:undefined":1,"s:23:16:25:Infinity":9,"s:24:20:24:Infinity":10,"s:26:16:26:Infinity":11,"f:28:18:28:19":3,"s:29:16:29:Infinity":12,"s:30:16:30:Infinity":13,"f:32:19:32:20":4,"s:33:16:33:Infinity":14,"s:34:16:34:Infinity":15,"b:38:4:38:Infinity:undefined:undefined:undefined:undefined":2,"s:38:4:38:Infinity":16,"s:38:17:38:Infinity":17,"b:39:4:39:Infinity:undefined:undefined:undefined:undefined":3,"s:39:4:39:Infinity":18,"s:39:15:39:Infinity":19,"s:41:4:54:Infinity":20,"b:46:16:46:Infinity:48:16:52:Infinity":4,"f:49:31:49:32":5,"s:50:24:50:Infinity":21}}} +,"/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":8,"column":28},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":23},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":21},"end":{"line":10,"column":null}},"3":{"start":{"line":12,"column":26},"end":{"line":12,"column":null}},"4":{"start":{"line":13,"column":30},"end":{"line":13,"column":null}},"5":{"start":{"line":14,"column":38},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":30},"end":{"line":15,"column":null}},"7":{"start":{"line":16,"column":26},"end":{"line":16,"column":null}},"8":{"start":{"line":18,"column":23},"end":{"line":78,"column":null}},"9":{"start":{"line":19,"column":8},"end":{"line":24,"column":null}},"10":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"11":{"start":{"line":22,"column":12},"end":{"line":22,"column":null}},"12":{"start":{"line":23,"column":12},"end":{"line":23,"column":null}},"13":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"14":{"start":{"line":27,"column":18},"end":{"line":27,"column":null}},"15":{"start":{"line":28,"column":23},"end":{"line":28,"column":null}},"16":{"start":{"line":30,"column":8},"end":{"line":34,"column":null}},"17":{"start":{"line":31,"column":12},"end":{"line":31,"column":null}},"18":{"start":{"line":32,"column":8},"end":{"line":34,"column":null}},"19":{"start":{"line":33,"column":12},"end":{"line":33,"column":null}},"20":{"start":{"line":36,"column":8},"end":{"line":38,"column":null}},"21":{"start":{"line":37,"column":12},"end":{"line":37,"column":null}},"22":{"start":{"line":41,"column":8},"end":{"line":49,"column":null}},"23":{"start":{"line":42,"column":12},"end":{"line":42,"column":null}},"24":{"start":{"line":43,"column":8},"end":{"line":49,"column":null}},"25":{"start":{"line":44,"column":12},"end":{"line":44,"column":null}},"26":{"start":{"line":45,"column":12},"end":{"line":45,"column":null}},"27":{"start":{"line":48,"column":12},"end":{"line":48,"column":null}},"28":{"start":{"line":51,"column":28},"end":{"line":51,"column":null}},"29":{"start":{"line":52,"column":8},"end":{"line":54,"column":null}},"30":{"start":{"line":53,"column":12},"end":{"line":53,"column":null}},"31":{"start":{"line":56,"column":8},"end":{"line":77,"column":null}},"32":{"start":{"line":58,"column":16},"end":{"line":60,"column":null}},"33":{"start":{"line":59,"column":20},"end":{"line":59,"column":null}},"34":{"start":{"line":61,"column":16},"end":{"line":61,"column":null}},"35":{"start":{"line":64,"column":16},"end":{"line":68,"column":null}},"36":{"start":{"line":65,"column":20},"end":{"line":65,"column":null}},"37":{"start":{"line":65,"column":39},"end":{"line":65,"column":57}},"38":{"start":{"line":67,"column":20},"end":{"line":67,"column":null}},"39":{"start":{"line":69,"column":16},"end":{"line":69,"column":null}},"40":{"start":{"line":70,"column":16},"end":{"line":70,"column":null}},"41":{"start":{"line":71,"column":16},"end":{"line":71,"column":null}},"42":{"start":{"line":74,"column":16},"end":{"line":74,"column":null}},"43":{"start":{"line":75,"column":16},"end":{"line":75,"column":null}},"44":{"start":{"line":76,"column":16},"end":{"line":76,"column":null}},"45":{"start":{"line":80,"column":4},"end":{"line":82,"column":null}},"46":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"47":{"start":{"line":84,"column":42},"end":{"line":84,"column":null}},"48":{"start":{"line":86,"column":4},"end":{"line":122,"column":null}},"49":{"start":{"line":87,"column":30},"end":{"line":118,"column":null}},"50":{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},"51":{"start":{"line":88,"column":36},"end":{"line":88,"column":null}},"52":{"start":{"line":90,"column":12},"end":{"line":117,"column":null}},"53":{"start":{"line":91,"column":16},"end":{"line":101,"column":null}},"54":{"start":{"line":92,"column":38},"end":{"line":92,"column":null}},"55":{"start":{"line":93,"column":20},"end":{"line":99,"column":null}},"56":{"start":{"line":94,"column":37},"end":{"line":94,"column":null}},"57":{"start":{"line":95,"column":24},"end":{"line":97,"column":null}},"58":{"start":{"line":96,"column":28},"end":{"line":96,"column":null}},"59":{"start":{"line":98,"column":24},"end":{"line":98,"column":null}},"60":{"start":{"line":100,"column":20},"end":{"line":100,"column":null}},"61":{"start":{"line":102,"column":12},"end":{"line":117,"column":null}},"62":{"start":{"line":103,"column":16},"end":{"line":109,"column":null}},"63":{"start":{"line":104,"column":38},"end":{"line":104,"column":null}},"64":{"start":{"line":105,"column":20},"end":{"line":107,"column":null}},"65":{"start":{"line":106,"column":24},"end":{"line":106,"column":null}},"66":{"start":{"line":108,"column":20},"end":{"line":108,"column":null}},"67":{"start":{"line":110,"column":12},"end":{"line":117,"column":null}},"68":{"start":{"line":111,"column":16},"end":{"line":116,"column":null}},"69":{"start":{"line":112,"column":20},"end":{"line":114,"column":null}},"70":{"start":{"line":113,"column":24},"end":{"line":113,"column":null}},"71":{"start":{"line":115,"column":20},"end":{"line":115,"column":null}},"72":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"73":{"start":{"line":121,"column":8},"end":{"line":121,"column":null}},"74":{"start":{"line":121,"column":21},"end":{"line":121,"column":null}},"75":{"start":{"line":124,"column":25},"end":{"line":129,"column":null}},"76":{"start":{"line":125,"column":24},"end":{"line":125,"column":null}},"77":{"start":{"line":126,"column":8},"end":{"line":128,"column":null}},"78":{"start":{"line":127,"column":12},"end":{"line":127,"column":null}},"79":{"start":{"line":131,"column":23},"end":{"line":141,"column":null}},"80":{"start":{"line":132,"column":28},"end":{"line":132,"column":null}},"81":{"start":{"line":134,"column":8},"end":{"line":134,"column":null}},"82":{"start":{"line":134,"column":32},"end":{"line":134,"column":92}},"83":{"start":{"line":134,"column":54},"end":{"line":134,"column":91}},"84":{"start":{"line":136,"column":8},"end":{"line":140,"column":null}},"85":{"start":{"line":140,"column":26},"end":{"line":140,"column":67}},"86":{"start":{"line":143,"column":23},"end":{"line":153,"column":null}},"87":{"start":{"line":144,"column":28},"end":{"line":144,"column":null}},"88":{"start":{"line":146,"column":8},"end":{"line":146,"column":null}},"89":{"start":{"line":146,"column":32},"end":{"line":146,"column":92}},"90":{"start":{"line":146,"column":54},"end":{"line":146,"column":91}},"91":{"start":{"line":148,"column":8},"end":{"line":152,"column":null}},"92":{"start":{"line":152,"column":26},"end":{"line":152,"column":69}},"93":{"start":{"line":155,"column":4},"end":{"line":191,"column":null}},"94":{"start":{"line":156,"column":25},"end":{"line":180,"column":null}},"95":{"start":{"line":158,"column":16},"end":{"line":177,"column":null}},"96":{"start":{"line":160,"column":20},"end":{"line":165,"column":null}},"97":{"start":{"line":161,"column":24},"end":{"line":163,"column":null}},"98":{"start":{"line":162,"column":28},"end":{"line":162,"column":null}},"99":{"start":{"line":164,"column":24},"end":{"line":164,"column":null}},"100":{"start":{"line":168,"column":20},"end":{"line":176,"column":null}},"101":{"start":{"line":169,"column":38},"end":{"line":169,"column":null}},"102":{"start":{"line":170,"column":24},"end":{"line":175,"column":null}},"103":{"start":{"line":171,"column":41},"end":{"line":171,"column":null}},"104":{"start":{"line":172,"column":28},"end":{"line":174,"column":null}},"105":{"start":{"line":173,"column":32},"end":{"line":173,"column":null}},"106":{"start":{"line":182,"column":8},"end":{"line":185,"column":null}},"107":{"start":{"line":183,"column":23},"end":{"line":183,"column":null}},"108":{"start":{"line":184,"column":12},"end":{"line":184,"column":null}},"109":{"start":{"line":184,"column":20},"end":{"line":184,"column":null}},"110":{"start":{"line":187,"column":25},"end":{"line":187,"column":null}},"111":{"start":{"line":188,"column":8},"end":{"line":188,"column":null}},"112":{"start":{"line":188,"column":22},"end":{"line":188,"column":null}},"113":{"start":{"line":190,"column":8},"end":{"line":190,"column":null}},"114":{"start":{"line":190,"column":21},"end":{"line":190,"column":null}},"115":{"start":{"line":193,"column":4},"end":{"line":193,"column":null}},"116":{"start":{"line":193,"column":17},"end":{"line":193,"column":null}},"117":{"start":{"line":194,"column":4},"end":{"line":194,"column":null}},"118":{"start":{"line":194,"column":15},"end":{"line":194,"column":null}},"119":{"start":{"line":197,"column":4},"end":{"line":221,"column":null}},"120":{"start":{"line":204,"column":24},"end":{"line":212,"column":null}},"121":{"start":{"line":209,"column":43},"end":{"line":209,"column":null}}},"fnMap":{"0":{"name":"FeedItems","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":36}},"loc":{"start":{"line":7,"column":36},"end":{"line":223,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":23},"end":{"line":18,"column":24}},"loc":{"start":{"line":18,"column":43},"end":{"line":78,"column":null}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":57,"column":18},"end":{"line":57,"column":19}},"loc":{"start":{"line":57,"column":27},"end":{"line":62,"column":13}},"line":57},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":18},"end":{"line":63,"column":19}},"loc":{"start":{"line":63,"column":28},"end":{"line":72,"column":13}},"line":63},"4":{"name":"(anonymous_4)","decl":{"start":{"line":65,"column":29},"end":{"line":65,"column":30}},"loc":{"start":{"line":65,"column":39},"end":{"line":65,"column":57}},"line":65},"5":{"name":"(anonymous_5)","decl":{"start":{"line":73,"column":19},"end":{"line":73,"column":20}},"loc":{"start":{"line":73,"column":28},"end":{"line":77,"column":13}},"line":73},"6":{"name":"(anonymous_6)","decl":{"start":{"line":80,"column":14},"end":{"line":80,"column":20}},"loc":{"start":{"line":80,"column":20},"end":{"line":82,"column":7}},"line":80},"7":{"name":"(anonymous_7)","decl":{"start":{"line":86,"column":14},"end":{"line":86,"column":20}},"loc":{"start":{"line":86,"column":20},"end":{"line":122,"column":7}},"line":86},"8":{"name":"(anonymous_8)","decl":{"start":{"line":87,"column":30},"end":{"line":87,"column":31}},"loc":{"start":{"line":87,"column":52},"end":{"line":118,"column":null}},"line":87},"9":{"name":"(anonymous_9)","decl":{"start":{"line":91,"column":33},"end":{"line":91,"column":34}},"loc":{"start":{"line":91,"column":43},"end":{"line":101,"column":17}},"line":91},"10":{"name":"(anonymous_10)","decl":{"start":{"line":103,"column":33},"end":{"line":103,"column":34}},"loc":{"start":{"line":103,"column":43},"end":{"line":109,"column":17}},"line":103},"11":{"name":"(anonymous_11)","decl":{"start":{"line":111,"column":33},"end":{"line":111,"column":34}},"loc":{"start":{"line":111,"column":51},"end":{"line":116,"column":17}},"line":111},"12":{"name":"(anonymous_12)","decl":{"start":{"line":121,"column":15},"end":{"line":121,"column":21}},"loc":{"start":{"line":121,"column":21},"end":{"line":121,"column":null}},"line":121},"13":{"name":"(anonymous_13)","decl":{"start":{"line":124,"column":25},"end":{"line":124,"column":26}},"loc":{"start":{"line":124,"column":44},"end":{"line":129,"column":null}},"line":124},"14":{"name":"(anonymous_14)","decl":{"start":{"line":131,"column":23},"end":{"line":131,"column":24}},"loc":{"start":{"line":131,"column":39},"end":{"line":141,"column":null}},"line":131},"15":{"name":"(anonymous_15)","decl":{"start":{"line":134,"column":17},"end":{"line":134,"column":18}},"loc":{"start":{"line":134,"column":32},"end":{"line":134,"column":92}},"line":134},"16":{"name":"(anonymous_16)","decl":{"start":{"line":134,"column":46},"end":{"line":134,"column":47}},"loc":{"start":{"line":134,"column":54},"end":{"line":134,"column":91}},"line":134},"17":{"name":"(anonymous_17)","decl":{"start":{"line":140,"column":17},"end":{"line":140,"column":18}},"loc":{"start":{"line":140,"column":26},"end":{"line":140,"column":67}},"line":140},"18":{"name":"(anonymous_18)","decl":{"start":{"line":143,"column":23},"end":{"line":143,"column":24}},"loc":{"start":{"line":143,"column":39},"end":{"line":153,"column":null}},"line":143},"19":{"name":"(anonymous_19)","decl":{"start":{"line":146,"column":17},"end":{"line":146,"column":18}},"loc":{"start":{"line":146,"column":32},"end":{"line":146,"column":92}},"line":146},"20":{"name":"(anonymous_20)","decl":{"start":{"line":146,"column":46},"end":{"line":146,"column":47}},"loc":{"start":{"line":146,"column":54},"end":{"line":146,"column":91}},"line":146},"21":{"name":"(anonymous_21)","decl":{"start":{"line":152,"column":17},"end":{"line":152,"column":18}},"loc":{"start":{"line":152,"column":26},"end":{"line":152,"column":69}},"line":152},"22":{"name":"(anonymous_22)","decl":{"start":{"line":155,"column":14},"end":{"line":155,"column":20}},"loc":{"start":{"line":155,"column":20},"end":{"line":191,"column":7}},"line":155},"23":{"name":"(anonymous_23)","decl":{"start":{"line":157,"column":12},"end":{"line":157,"column":13}},"loc":{"start":{"line":157,"column":25},"end":{"line":178,"column":null}},"line":157},"24":{"name":"(anonymous_24)","decl":{"start":{"line":158,"column":32},"end":{"line":158,"column":33}},"loc":{"start":{"line":158,"column":43},"end":{"line":177,"column":17}},"line":158},"25":{"name":"(anonymous_25)","decl":{"start":{"line":182,"column":22},"end":{"line":182,"column":23}},"loc":{"start":{"line":182,"column":36},"end":{"line":185,"column":9}},"line":182},"26":{"name":"(anonymous_26)","decl":{"start":{"line":190,"column":15},"end":{"line":190,"column":21}},"loc":{"start":{"line":190,"column":21},"end":{"line":190,"column":null}},"line":190},"27":{"name":"(anonymous_27)","decl":{"start":{"line":203,"column":31},"end":{"line":203,"column":32}},"loc":{"start":{"line":204,"column":24},"end":{"line":212,"column":null}},"line":204},"28":{"name":"(anonymous_28)","decl":{"start":{"line":209,"column":37},"end":{"line":209,"column":43}},"loc":{"start":{"line":209,"column":43},"end":{"line":209,"column":null}},"line":209}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":21},"end":{"line":10,"column":null}},"type":"binary-expr","locations":[{"start":{"line":10,"column":21},"end":{"line":10,"column":51}},{"start":{"line":10,"column":51},"end":{"line":10,"column":null}}],"line":10},"1":{"loc":{"start":{"line":19,"column":8},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":24,"column":null}},{"start":{"line":21,"column":15},"end":{"line":24,"column":null}}],"line":19},"2":{"loc":{"start":{"line":30,"column":8},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":8},"end":{"line":34,"column":null}},{"start":{"line":32,"column":8},"end":{"line":34,"column":null}}],"line":30},"3":{"loc":{"start":{"line":32,"column":8},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":8},"end":{"line":34,"column":null}},{"start":{},"end":{}}],"line":32},"4":{"loc":{"start":{"line":36,"column":8},"end":{"line":38,"column":null}},"type":"if","locations":[{"start":{"line":36,"column":8},"end":{"line":38,"column":null}},{"start":{},"end":{}}],"line":36},"5":{"loc":{"start":{"line":41,"column":8},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":49,"column":null}},{"start":{"line":43,"column":8},"end":{"line":49,"column":null}}],"line":41},"6":{"loc":{"start":{"line":43,"column":8},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":8},"end":{"line":49,"column":null}},{"start":{"line":46,"column":15},"end":{"line":49,"column":null}}],"line":43},"7":{"loc":{"start":{"line":52,"column":8},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":52,"column":8},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":52},"8":{"loc":{"start":{"line":58,"column":16},"end":{"line":60,"column":null}},"type":"if","locations":[{"start":{"line":58,"column":16},"end":{"line":60,"column":null}},{"start":{},"end":{}}],"line":58},"9":{"loc":{"start":{"line":64,"column":16},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":16},"end":{"line":68,"column":null}},{"start":{"line":66,"column":23},"end":{"line":68,"column":null}}],"line":64},"10":{"loc":{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":12},"end":{"line":88,"column":null}},{"start":{},"end":{}}],"line":88},"11":{"loc":{"start":{"line":90,"column":12},"end":{"line":117,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":12},"end":{"line":117,"column":null}},{"start":{"line":102,"column":12},"end":{"line":117,"column":null}}],"line":90},"12":{"loc":{"start":{"line":93,"column":20},"end":{"line":99,"column":null}},"type":"if","locations":[{"start":{"line":93,"column":20},"end":{"line":99,"column":null}},{"start":{},"end":{}}],"line":93},"13":{"loc":{"start":{"line":95,"column":24},"end":{"line":97,"column":null}},"type":"if","locations":[{"start":{"line":95,"column":24},"end":{"line":97,"column":null}},{"start":{},"end":{}}],"line":95},"14":{"loc":{"start":{"line":102,"column":12},"end":{"line":117,"column":null}},"type":"if","locations":[{"start":{"line":102,"column":12},"end":{"line":117,"column":null}},{"start":{"line":110,"column":12},"end":{"line":117,"column":null}}],"line":102},"15":{"loc":{"start":{"line":105,"column":20},"end":{"line":107,"column":null}},"type":"if","locations":[{"start":{"line":105,"column":20},"end":{"line":107,"column":null}},{"start":{},"end":{}}],"line":105},"16":{"loc":{"start":{"line":110,"column":12},"end":{"line":117,"column":null}},"type":"if","locations":[{"start":{"line":110,"column":12},"end":{"line":117,"column":null}},{"start":{},"end":{}}],"line":110},"17":{"loc":{"start":{"line":112,"column":20},"end":{"line":114,"column":null}},"type":"if","locations":[{"start":{"line":112,"column":20},"end":{"line":114,"column":null}},{"start":{},"end":{}}],"line":112},"18":{"loc":{"start":{"line":112,"column":24},"end":{"line":112,"column":74}},"type":"binary-expr","locations":[{"start":{"line":112,"column":24},"end":{"line":112,"column":45}},{"start":{"line":112,"column":45},"end":{"line":112,"column":74}}],"line":112},"19":{"loc":{"start":{"line":126,"column":8},"end":{"line":128,"column":null}},"type":"if","locations":[{"start":{"line":126,"column":8},"end":{"line":128,"column":null}},{"start":{},"end":{}}],"line":126},"20":{"loc":{"start":{"line":134,"column":54},"end":{"line":134,"column":91}},"type":"cond-expr","locations":[{"start":{"line":134,"column":75},"end":{"line":134,"column":89}},{"start":{"line":134,"column":89},"end":{"line":134,"column":91}}],"line":134},"21":{"loc":{"start":{"line":146,"column":54},"end":{"line":146,"column":91}},"type":"cond-expr","locations":[{"start":{"line":146,"column":75},"end":{"line":146,"column":89}},{"start":{"line":146,"column":89},"end":{"line":146,"column":91}}],"line":146},"22":{"loc":{"start":{"line":160,"column":20},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":20},"end":{"line":165,"column":null}},{"start":{},"end":{}}],"line":160},"23":{"loc":{"start":{"line":161,"column":24},"end":{"line":163,"column":null}},"type":"if","locations":[{"start":{"line":161,"column":24},"end":{"line":163,"column":null}},{"start":{},"end":{}}],"line":161},"24":{"loc":{"start":{"line":161,"column":28},"end":{"line":161,"column":97}},"type":"binary-expr","locations":[{"start":{"line":161,"column":28},"end":{"line":161,"column":52}},{"start":{"line":161,"column":52},"end":{"line":161,"column":68}},{"start":{"line":161,"column":68},"end":{"line":161,"column":79}},{"start":{"line":161,"column":79},"end":{"line":161,"column":97}}],"line":161},"25":{"loc":{"start":{"line":168,"column":20},"end":{"line":176,"column":null}},"type":"if","locations":[{"start":{"line":168,"column":20},"end":{"line":176,"column":null}},{"start":{},"end":{}}],"line":168},"26":{"loc":{"start":{"line":168,"column":24},"end":{"line":168,"column":83}},"type":"binary-expr","locations":[{"start":{"line":168,"column":24},"end":{"line":168,"column":49}},{"start":{"line":168,"column":49},"end":{"line":168,"column":83}}],"line":168},"27":{"loc":{"start":{"line":170,"column":24},"end":{"line":175,"column":null}},"type":"if","locations":[{"start":{"line":170,"column":24},"end":{"line":175,"column":null}},{"start":{},"end":{}}],"line":170},"28":{"loc":{"start":{"line":170,"column":28},"end":{"line":170,"column":81}},"type":"binary-expr","locations":[{"start":{"line":170,"column":28},"end":{"line":170,"column":45}},{"start":{"line":170,"column":45},"end":{"line":170,"column":59}},{"start":{"line":170,"column":59},"end":{"line":170,"column":81}}],"line":170},"29":{"loc":{"start":{"line":172,"column":28},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":28},"end":{"line":174,"column":null}},{"start":{},"end":{}}],"line":172},"30":{"loc":{"start":{"line":184,"column":12},"end":{"line":184,"column":null}},"type":"if","locations":[{"start":{"line":184,"column":12},"end":{"line":184,"column":null}},{"start":{},"end":{}}],"line":184},"31":{"loc":{"start":{"line":188,"column":8},"end":{"line":188,"column":null}},"type":"if","locations":[{"start":{"line":188,"column":8},"end":{"line":188,"column":null}},{"start":{},"end":{}}],"line":188},"32":{"loc":{"start":{"line":193,"column":4},"end":{"line":193,"column":null}},"type":"if","locations":[{"start":{"line":193,"column":4},"end":{"line":193,"column":null}},{"start":{},"end":{}}],"line":193},"33":{"loc":{"start":{"line":194,"column":4},"end":{"line":194,"column":null}},"type":"if","locations":[{"start":{"line":194,"column":4},"end":{"line":194,"column":null}},{"start":{},"end":{}}],"line":194},"34":{"loc":{"start":{"line":199,"column":13},"end":{"line":219,"column":null}},"type":"cond-expr","locations":[{"start":{"line":200,"column":16},"end":{"line":200,"column":null}},{"start":{"line":202,"column":16},"end":{"line":219,"column":null}}],"line":199},"35":{"loc":{"start":{"line":208,"column":39},"end":{"line":208,"column":null}},"type":"cond-expr","locations":[{"start":{"line":208,"column":65},"end":{"line":208,"column":93}},{"start":{"line":208,"column":93},"end":{"line":208,"column":null}}],"line":208},"36":{"loc":{"start":{"line":214,"column":21},"end":{"line":217,"column":null}},"type":"binary-expr","locations":[{"start":{"line":214,"column":21},"end":{"line":214,"column":null}},{"start":{"line":215,"column":24},"end":{"line":217,"column":null}}],"line":214},"37":{"loc":{"start":{"line":216,"column":29},"end":{"line":216,"column":null}},"type":"cond-expr","locations":[{"start":{"line":216,"column":43},"end":{"line":216,"column":63}},{"start":{"line":216,"column":63},"end":{"line":216,"column":null}}],"line":216}},"s":{"0":27,"1":27,"2":27,"3":27,"4":27,"5":27,"6":27,"7":27,"8":27,"9":8,"10":1,"11":7,"12":7,"13":8,"14":8,"15":8,"16":8,"17":2,"18":6,"19":1,"20":8,"21":1,"22":8,"23":0,"24":8,"25":0,"26":0,"27":8,"28":8,"29":8,"30":8,"31":8,"32":7,"33":0,"34":7,"35":6,"36":1,"37":1,"38":5,"39":6,"40":6,"41":6,"42":1,"43":1,"44":1,"45":27,"46":7,"47":27,"48":27,"49":23,"50":3,"51":0,"52":3,"53":2,"54":2,"55":2,"56":2,"57":2,"58":1,"59":2,"60":2,"61":1,"62":0,"63":0,"64":0,"65":0,"66":0,"67":1,"68":1,"69":1,"70":1,"71":1,"72":23,"73":23,"74":23,"75":27,"76":2,"77":2,"78":2,"79":27,"80":2,"81":2,"82":2,"83":3,"84":2,"85":0,"86":27,"87":1,"88":1,"89":1,"90":2,"91":1,"92":0,"93":27,"94":24,"95":2,"96":2,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":24,"107":15,"108":15,"109":15,"110":24,"111":24,"112":10,"113":24,"114":24,"115":27,"116":13,"117":14,"118":14,"119":13,"120":21,"121":0},"f":{"0":27,"1":8,"2":7,"3":6,"4":1,"5":1,"6":7,"7":23,"8":3,"9":2,"10":0,"11":1,"12":23,"13":2,"14":2,"15":2,"16":3,"17":0,"18":1,"19":1,"20":2,"21":0,"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":[8,0],"8":[0,7],"9":[1,5],"10":[0,3],"11":[2,1],"12":[2,0],"13":[1,1],"14":[0,1],"15":[0,0],"16":[1,0],"17":[1,0],"18":[1,1],"19":[2,0],"20":[2,1],"21":[1,1],"22":[1,1],"23":[1,0],"24":[1,1,1,1],"25":[1,0],"26":[1,1],"27":[1,0],"28":[1,1,1],"29":[1,0],"30":[15,0],"31":[10,14],"32":[13,14],"33":[1,13],"34":[0,13],"35":[5,16],"36":[13,13],"37":[1,12]},"meta":{"lastBranch":38,"lastFunction":29,"lastStatement":122,"seen":{"f:7:24:7:36":0,"s:8:28:8:Infinity":0,"s:9:23:9:Infinity":1,"s:10:21:10:Infinity":2,"b:10:21:10:51:10:51:10:Infinity":0,"s:12:26:12:Infinity":3,"s:13:30:13:Infinity":4,"s:14:38:14:Infinity":5,"s:15:30:15:Infinity":6,"s:16:26:16:Infinity":7,"s:18:23:78:Infinity":8,"f:18:23:18:24":1,"b:19:8:24:Infinity:21:15:24:Infinity":1,"s:19:8:24:Infinity":9,"s:20:12:20:Infinity":10,"s:22:12:22:Infinity":11,"s:23:12:23:Infinity":12,"s:25:8:25:Infinity":13,"s:27:18:27:Infinity":14,"s:28:23:28:Infinity":15,"b:30:8:34:Infinity:32:8:34:Infinity":2,"s:30:8:34:Infinity":16,"s:31:12:31:Infinity":17,"b:32:8:34:Infinity:undefined:undefined:undefined:undefined":3,"s:32:8:34:Infinity":18,"s:33:12:33:Infinity":19,"b:36:8:38:Infinity:undefined:undefined:undefined:undefined":4,"s:36:8:38:Infinity":20,"s:37:12:37:Infinity":21,"b:41:8:49:Infinity:43:8:49:Infinity":5,"s:41:8:49:Infinity":22,"s:42:12:42:Infinity":23,"b:43:8:49:Infinity:46:15:49:Infinity":6,"s:43:8:49:Infinity":24,"s:44:12:44:Infinity":25,"s:45:12:45:Infinity":26,"s:48:12:48:Infinity":27,"s:51:28:51:Infinity":28,"b:52:8:54:Infinity:undefined:undefined:undefined:undefined":7,"s:52:8:54:Infinity":29,"s:53:12:53:Infinity":30,"s:56:8:77:Infinity":31,"f:57:18:57:19":2,"b:58:16:60:Infinity:undefined:undefined:undefined:undefined":8,"s:58:16:60:Infinity":32,"s:59:20:59:Infinity":33,"s:61:16:61:Infinity":34,"f:63:18:63:19":3,"b:64:16:68:Infinity:66:23:68:Infinity":9,"s:64:16:68:Infinity":35,"s:65:20:65:Infinity":36,"f:65:29:65:30":4,"s:65:39:65:57":37,"s:67:20:67:Infinity":38,"s:69:16:69:Infinity":39,"s:70:16:70:Infinity":40,"s:71:16:71:Infinity":41,"f:73:19:73:20":5,"s:74:16:74:Infinity":42,"s:75:16:75:Infinity":43,"s:76:16:76:Infinity":44,"s:80:4:82:Infinity":45,"f:80:14:80:20":6,"s:81:8:81:Infinity":46,"s:84:42:84:Infinity":47,"s:86:4:122:Infinity":48,"f:86:14:86:20":7,"s:87:30:118:Infinity":49,"f:87:30:87:31":8,"b:88:12:88:Infinity:undefined:undefined:undefined:undefined":10,"s:88:12:88:Infinity":50,"s:88:36:88:Infinity":51,"b:90:12:117:Infinity:102:12:117:Infinity":11,"s:90:12:117:Infinity":52,"s:91:16:101:Infinity":53,"f:91:33:91:34":9,"s:92:38:92:Infinity":54,"b:93:20:99:Infinity:undefined:undefined:undefined:undefined":12,"s:93:20:99:Infinity":55,"s:94:37:94:Infinity":56,"b:95:24:97:Infinity:undefined:undefined:undefined:undefined":13,"s:95:24:97:Infinity":57,"s:96:28:96:Infinity":58,"s:98:24:98:Infinity":59,"s:100:20:100:Infinity":60,"b:102:12:117:Infinity:110:12:117:Infinity":14,"s:102:12:117:Infinity":61,"s:103:16:109:Infinity":62,"f:103:33:103:34":10,"s:104:38:104:Infinity":63,"b:105:20:107:Infinity:undefined:undefined:undefined:undefined":15,"s:105:20:107:Infinity":64,"s:106:24:106:Infinity":65,"s:108:20:108:Infinity":66,"b:110:12:117:Infinity:undefined:undefined:undefined:undefined":16,"s:110:12:117:Infinity":67,"s:111:16:116:Infinity":68,"f:111:33:111:34":11,"b:112:20:114:Infinity:undefined:undefined:undefined:undefined":17,"s:112:20:114:Infinity":69,"b:112:24:112:45:112:45:112:74":18,"s:113:24:113:Infinity":70,"s:115:20:115:Infinity":71,"s:120:8:120:Infinity":72,"s:121:8:121:Infinity":73,"f:121:15:121:21":12,"s:121:21:121:Infinity":74,"s:124:25:129:Infinity":75,"f:124:25:124:26":13,"s:125:24:125:Infinity":76,"b:126:8:128:Infinity:undefined:undefined:undefined:undefined":19,"s:126:8:128:Infinity":77,"s:127:12:127:Infinity":78,"s:131:23:141:Infinity":79,"f:131:23:131:24":14,"s:132:28:132:Infinity":80,"s:134:8:134:Infinity":81,"f:134:17:134:18":15,"s:134:32:134:92":82,"f:134:46:134:47":16,"s:134:54:134:91":83,"b:134:75:134:89:134:89:134:91":20,"s:136:8:140:Infinity":84,"f:140:17:140:18":17,"s:140:26:140:67":85,"s:143:23:153:Infinity":86,"f:143:23:143:24":18,"s:144:28:144:Infinity":87,"s:146:8:146:Infinity":88,"f:146:17:146:18":19,"s:146:32:146:92":89,"f:146:46:146:47":20,"s:146:54:146:91":90,"b:146:75:146:89:146:89:146:91":21,"s:148:8:152:Infinity":91,"f:152:17:152:18":21,"s:152:26:152:69":92,"s:155:4:191:Infinity":93,"f:155:14:155:20":22,"s:156:25:180:Infinity":94,"f:157:12:157:13":23,"s:158:16:177:Infinity":95,"f:158:32:158:33":24,"b:160:20:165:Infinity:undefined:undefined:undefined:undefined":22,"s:160:20:165:Infinity":96,"b:161:24:163:Infinity:undefined:undefined:undefined:undefined":23,"s:161:24:163:Infinity":97,"b:161:28:161:52:161:52:161:68:161:68:161:79:161:79:161:97":24,"s:162:28:162:Infinity":98,"s:164:24:164:Infinity":99,"b:168:20:176:Infinity:undefined:undefined:undefined:undefined":25,"s:168:20:176:Infinity":100,"b:168:24:168:49:168:49:168:83":26,"s:169:38:169:Infinity":101,"b:170:24:175:Infinity:undefined:undefined:undefined:undefined":27,"s:170:24:175:Infinity":102,"b:170:28:170:45:170:45:170:59:170:59:170:81":28,"s:171:41:171:Infinity":103,"b:172:28:174:Infinity:undefined:undefined:undefined:undefined":29,"s:172:28:174:Infinity":104,"s:173:32:173:Infinity":105,"s:182:8:185:Infinity":106,"f:182:22:182:23":25,"s:183:23:183:Infinity":107,"b:184:12:184:Infinity:undefined:undefined:undefined:undefined":30,"s:184:12:184:Infinity":108,"s:184:20:184:Infinity":109,"s:187:25:187:Infinity":110,"b:188:8:188:Infinity:undefined:undefined:undefined:undefined":31,"s:188:8:188:Infinity":111,"s:188:22:188:Infinity":112,"s:190:8:190:Infinity":113,"f:190:15:190:21":26,"s:190:21:190:Infinity":114,"b:193:4:193:Infinity:undefined:undefined:undefined:undefined":32,"s:193:4:193:Infinity":115,"s:193:17:193:Infinity":116,"b:194:4:194:Infinity:undefined:undefined:undefined:undefined":33,"s:194:4:194:Infinity":117,"s:194:15:194:Infinity":118,"s:197:4:221:Infinity":119,"b:200:16:200:Infinity:202:16:219:Infinity":34,"f:203:31:203:32":27,"s:204:24:212:Infinity":120,"b:208:65:208:93:208:93:208:Infinity":35,"f:209:37:209:43":28,"s:209:43:209:Infinity":121,"b:214:21:214:Infinity:215:24:217:Infinity":36,"b:216:43:216:63:216:63:216:Infinity":37}}} ,"/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":7,"column":26},"end":{"line":7,"column":null}},"1":{"start":{"line":8,"column":30},"end":{"line":8,"column":null}},"2":{"start":{"line":9,"column":26},"end":{"line":9,"column":null}},"3":{"start":{"line":11,"column":4},"end":{"line":27,"column":null}},"4":{"start":{"line":12,"column":8},"end":{"line":26,"column":null}},"5":{"start":{"line":14,"column":16},"end":{"line":16,"column":null}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":16},"end":{"line":17,"column":null}},"8":{"start":{"line":20,"column":16},"end":{"line":20,"column":null}},"9":{"start":{"line":21,"column":16},"end":{"line":21,"column":null}},"10":{"start":{"line":24,"column":16},"end":{"line":24,"column":null}},"11":{"start":{"line":25,"column":16},"end":{"line":25,"column":null}},"12":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"13":{"start":{"line":29,"column":17},"end":{"line":29,"column":null}},"14":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"15":{"start":{"line":30,"column":15},"end":{"line":30,"column":null}},"16":{"start":{"line":32,"column":4},"end":{"line":49,"column":null}},"17":{"start":{"line":40,"column":24},"end":{"line":45,"column":null}}},"fnMap":{"0":{"name":"FeedList","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":35}},"loc":{"start":{"line":6,"column":35},"end":{"line":51,"column":null}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":14},"end":{"line":11,"column":20}},"loc":{"start":{"line":11,"column":20},"end":{"line":27,"column":7}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":18},"end":{"line":13,"column":19}},"loc":{"start":{"line":13,"column":27},"end":{"line":18,"column":13}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":18},"end":{"line":19,"column":19}},"loc":{"start":{"line":19,"column":28},"end":{"line":22,"column":13}},"line":19},"4":{"name":"(anonymous_4)","decl":{"start":{"line":23,"column":19},"end":{"line":23,"column":20}},"loc":{"start":{"line":23,"column":28},"end":{"line":26,"column":13}},"line":23},"5":{"name":"(anonymous_5)","decl":{"start":{"line":39,"column":31},"end":{"line":39,"column":32}},"loc":{"start":{"line":40,"column":24},"end":{"line":45,"column":null}},"line":40}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":16},"end":{"line":16,"column":null}},"type":"if","locations":[{"start":{"line":14,"column":16},"end":{"line":16,"column":null}},{"start":{},"end":{}}],"line":14},"1":{"loc":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},{"start":{},"end":{}}],"line":29},"2":{"loc":{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":30},"3":{"loc":{"start":{"line":35,"column":13},"end":{"line":47,"column":null}},"type":"cond-expr","locations":[{"start":{"line":36,"column":16},"end":{"line":36,"column":null}},{"start":{"line":38,"column":16},"end":{"line":47,"column":null}}],"line":35},"4":{"loc":{"start":{"line":42,"column":33},"end":{"line":42,"column":null}},"type":"binary-expr","locations":[{"start":{"line":42,"column":33},"end":{"line":42,"column":47}},{"start":{"line":42,"column":47},"end":{"line":42,"column":null}}],"line":42},"5":{"loc":{"start":{"line":44,"column":29},"end":{"line":44,"column":null}},"type":"binary-expr","locations":[{"start":{"line":44,"column":29},"end":{"line":44,"column":46}},{"start":{"line":44,"column":46},"end":{"line":44,"column":null}}],"line":44}},"s":{"0":9,"1":9,"2":9,"3":9,"4":5,"5":3,"6":0,"7":3,"8":3,"9":3,"10":1,"11":1,"12":9,"13":5,"14":4,"15":4,"16":3,"17":2},"f":{"0":9,"1":5,"2":3,"3":3,"4":1,"5":2},"b":{"0":[0,3],"1":[5,4],"2":[1,3],"3":[2,1],"4":[2,0],"5":[2,2]},"meta":{"lastBranch":6,"lastFunction":6,"lastStatement":18,"seen":{"f:6:24:6:35":0,"s:7:26:7:Infinity":0,"s:8:30:8:Infinity":1,"s:9:26:9:Infinity":2,"s:11:4:27:Infinity":3,"f:11:14:11:20":1,"s:12:8:26:Infinity":4,"f:13:18:13:19":2,"b:14:16:16:Infinity:undefined:undefined:undefined:undefined":0,"s:14:16:16:Infinity":5,"s:15:20:15:Infinity":6,"s:17:16:17:Infinity":7,"f:19:18:19:19":3,"s:20:16:20:Infinity":8,"s:21:16:21:Infinity":9,"f:23:19:23:20":4,"s:24:16:24:Infinity":10,"s:25:16:25:Infinity":11,"b:29:4:29:Infinity:undefined:undefined:undefined:undefined":1,"s:29:4:29:Infinity":12,"s:29:17:29:Infinity":13,"b:30:4:30:Infinity:undefined:undefined:undefined:undefined":2,"s:30:4:30:Infinity":14,"s:30:15:30:Infinity":15,"s:32:4:49:Infinity":16,"b:36:16:36:Infinity:38:16:47:Infinity":3,"f:39:31:39:32":5,"s:40:24:45:Infinity":17,"b:42:33:42:47:42:47:42:Infinity":4,"b:44:29:44:46:44:46:44:Infinity":5}}} +,"/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":7,"column":26},"end":{"line":7,"column":null}},"1":{"start":{"line":8,"column":24},"end":{"line":8,"column":null}},"2":{"start":{"line":9,"column":30},"end":{"line":9,"column":null}},"3":{"start":{"line":10,"column":26},"end":{"line":10,"column":null}},"4":{"start":{"line":12,"column":4},"end":{"line":32,"column":null}},"5":{"start":{"line":13,"column":8},"end":{"line":31,"column":null}},"6":{"start":{"line":15,"column":16},"end":{"line":15,"column":null}},"7":{"start":{"line":15,"column":29},"end":{"line":15,"column":null}},"8":{"start":{"line":16,"column":16},"end":{"line":16,"column":null}},"9":{"start":{"line":19,"column":16},"end":{"line":19,"column":null}},"10":{"start":{"line":19,"column":29},"end":{"line":19,"column":null}},"11":{"start":{"line":20,"column":16},"end":{"line":20,"column":null}},"12":{"start":{"line":24,"column":16},"end":{"line":24,"column":null}},"13":{"start":{"line":25,"column":16},"end":{"line":25,"column":null}},"14":{"start":{"line":26,"column":16},"end":{"line":26,"column":null}},"15":{"start":{"line":29,"column":16},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"17":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"18":{"start":{"line":34,"column":17},"end":{"line":34,"column":null}},"19":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"20":{"start":{"line":35,"column":15},"end":{"line":35,"column":null}},"21":{"start":{"line":37,"column":4},"end":{"line":78,"column":null}},"22":{"start":{"line":53,"column":28},"end":{"line":58,"column":null}},"23":{"start":{"line":69,"column":28},"end":{"line":73,"column":null}}},"fnMap":{"0":{"name":"FeedList","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":35}},"loc":{"start":{"line":6,"column":35},"end":{"line":80,"column":null}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":14},"end":{"line":12,"column":20}},"loc":{"start":{"line":12,"column":20},"end":{"line":32,"column":7}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":37},"end":{"line":14,"column":44}},"loc":{"start":{"line":14,"column":44},"end":{"line":17,"column":13}},"line":14},"3":{"name":"(anonymous_3)","decl":{"start":{"line":18,"column":35},"end":{"line":18,"column":42}},"loc":{"start":{"line":18,"column":42},"end":{"line":21,"column":13}},"line":18},"4":{"name":"(anonymous_4)","decl":{"start":{"line":23,"column":18},"end":{"line":23,"column":19}},"loc":{"start":{"line":23,"column":45},"end":{"line":27,"column":13}},"line":23},"5":{"name":"(anonymous_5)","decl":{"start":{"line":28,"column":19},"end":{"line":28,"column":20}},"loc":{"start":{"line":28,"column":28},"end":{"line":31,"column":13}},"line":28},"6":{"name":"(anonymous_6)","decl":{"start":{"line":52,"column":35},"end":{"line":52,"column":36}},"loc":{"start":{"line":53,"column":28},"end":{"line":58,"column":null}},"line":53},"7":{"name":"(anonymous_7)","decl":{"start":{"line":68,"column":34},"end":{"line":68,"column":35}},"loc":{"start":{"line":69,"column":28},"end":{"line":73,"column":null}},"line":69}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":16},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":16},"end":{"line":15,"column":null}},{"start":{},"end":{}}],"line":15},"1":{"loc":{"start":{"line":19,"column":16},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":16},"end":{"line":19,"column":null}},{"start":{},"end":{}}],"line":19},"2":{"loc":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},{"start":{},"end":{}}],"line":34},"3":{"loc":{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":35,"column":null}},{"start":{},"end":{}}],"line":35},"4":{"loc":{"start":{"line":48,"column":17},"end":{"line":60,"column":null}},"type":"cond-expr","locations":[{"start":{"line":49,"column":20},"end":{"line":49,"column":null}},{"start":{"line":51,"column":20},"end":{"line":60,"column":null}}],"line":48},"5":{"loc":{"start":{"line":55,"column":37},"end":{"line":55,"column":null}},"type":"binary-expr","locations":[{"start":{"line":55,"column":37},"end":{"line":55,"column":51}},{"start":{"line":55,"column":51},"end":{"line":55,"column":null}}],"line":55},"6":{"loc":{"start":{"line":57,"column":33},"end":{"line":57,"column":null}},"type":"binary-expr","locations":[{"start":{"line":57,"column":33},"end":{"line":57,"column":50}},{"start":{"line":57,"column":50},"end":{"line":57,"column":null}}],"line":57},"7":{"loc":{"start":{"line":64,"column":13},"end":{"line":76,"column":null}},"type":"binary-expr","locations":[{"start":{"line":64,"column":13},"end":{"line":64,"column":21}},{"start":{"line":64,"column":21},"end":{"line":64,"column":null}},{"start":{"line":65,"column":16},"end":{"line":76,"column":null}}],"line":64}},"s":{"0":11,"1":11,"2":11,"3":11,"4":11,"5":6,"6":4,"7":0,"8":4,"9":4,"10":0,"11":4,"12":4,"13":4,"14":4,"15":1,"16":1,"17":11,"18":6,"19":5,"20":5,"21":4,"22":3,"23":3},"f":{"0":11,"1":6,"2":4,"3":4,"4":4,"5":1,"6":3,"7":3},"b":{"0":[0,4],"1":[0,4],"2":[6,5],"3":[1,4],"4":[2,2],"5":[3,0],"6":[3,3],"7":[11,4,2]},"meta":{"lastBranch":8,"lastFunction":8,"lastStatement":24,"seen":{"f:6:24:6:35":0,"s:7:26:7:Infinity":0,"s:8:24:8:Infinity":1,"s:9:30:9:Infinity":2,"s:10:26:10:Infinity":3,"s:12:4:32:Infinity":4,"f:12:14:12:20":1,"s:13:8:31:Infinity":5,"f:14:37:14:44":2,"b:15:16:15:Infinity:undefined:undefined:undefined:undefined":0,"s:15:16:15:Infinity":6,"s:15:29:15:Infinity":7,"s:16:16:16:Infinity":8,"f:18:35:18:42":3,"b:19:16:19:Infinity:undefined:undefined:undefined:undefined":1,"s:19:16:19:Infinity":9,"s:19:29:19:Infinity":10,"s:20:16:20:Infinity":11,"f:23:18:23:19":4,"s:24:16:24:Infinity":12,"s:25:16:25:Infinity":13,"s:26:16:26:Infinity":14,"f:28:19:28:20":5,"s:29:16:29:Infinity":15,"s:30:16:30:Infinity":16,"b:34:4:34:Infinity:undefined:undefined:undefined:undefined":2,"s:34:4:34:Infinity":17,"s:34:17:34:Infinity":18,"b:35:4:35:Infinity:undefined:undefined:undefined:undefined":3,"s:35:4:35:Infinity":19,"s:35:15:35:Infinity":20,"s:37:4:78:Infinity":21,"b:49:20:49:Infinity:51:20:60:Infinity":4,"f:52:35:52:36":6,"s:53:28:58:Infinity":22,"b:55:37:55:51:55:51:55:Infinity":5,"b:57:33:57:50:57:50:57:Infinity":6,"b:64:13:64:21:64:21:64:Infinity:65:16:76:Infinity":7,"f:68:34:68:35":7,"s:69:28:73:Infinity":23}}} ,"/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":6,"column":32},"end":{"line":6,"column":null}},"1":{"start":{"line":7,"column":26},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":10},"end":{"line":8,"column":null}},"3":{"start":{"line":10,"column":25},"end":{"line":33,"column":null}},"4":{"start":{"line":11,"column":8},"end":{"line":11,"column":null}},"5":{"start":{"line":12,"column":8},"end":{"line":12,"column":null}},"6":{"start":{"line":14,"column":8},"end":{"line":32,"column":null}},"7":{"start":{"line":16,"column":27},"end":{"line":16,"column":null}},"8":{"start":{"line":17,"column":12},"end":{"line":17,"column":null}},"9":{"start":{"line":19,"column":24},"end":{"line":22,"column":null}},"10":{"start":{"line":24,"column":12},"end":{"line":29,"column":null}},"11":{"start":{"line":25,"column":16},"end":{"line":25,"column":null}},"12":{"start":{"line":27,"column":29},"end":{"line":27,"column":null}},"13":{"start":{"line":28,"column":16},"end":{"line":28,"column":null}},"14":{"start":{"line":31,"column":12},"end":{"line":31,"column":null}},"15":{"start":{"line":35,"column":4},"end":{"line":52,"column":null}},"16":{"start":{"line":45,"column":41},"end":{"line":45,"column":null}}},"fnMap":{"0":{"name":"Login","decl":{"start":{"line":5,"column":24},"end":{"line":5,"column":32}},"loc":{"start":{"line":5,"column":32},"end":{"line":54,"column":null}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":25},"end":{"line":10,"column":32}},"loc":{"start":{"line":10,"column":49},"end":{"line":33,"column":null}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":45,"column":34},"end":{"line":45,"column":35}},"loc":{"start":{"line":45,"column":41},"end":{"line":45,"column":null}},"line":45}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":12},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":12},"end":{"line":29,"column":null}},{"start":{"line":26,"column":19},"end":{"line":29,"column":null}}],"line":24},"1":{"loc":{"start":{"line":28,"column":25},"end":{"line":28,"column":55}},"type":"binary-expr","locations":[{"start":{"line":28,"column":25},"end":{"line":28,"column":41}},{"start":{"line":28,"column":41},"end":{"line":28,"column":55}}],"line":28},"2":{"loc":{"start":{"line":49,"column":17},"end":{"line":49,"column":null}},"type":"binary-expr","locations":[{"start":{"line":49,"column":17},"end":{"line":49,"column":26}},{"start":{"line":49,"column":26},"end":{"line":49,"column":null}}],"line":49}},"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:5:24:5:32":0,"s:6:32:6:Infinity":0,"s:7:26:7:Infinity":1,"s:8:10:8:Infinity":2,"s:10:25:33:Infinity":3,"f:10:25:10:32":1,"s:11:8:11:Infinity":4,"s:12:8:12:Infinity":5,"s:14:8:32:Infinity":6,"s:16:27:16:Infinity":7,"s:17:12:17:Infinity":8,"s:19:24:22:Infinity":9,"b:24:12:29:Infinity:26:19:29:Infinity":0,"s:24:12:29:Infinity":10,"s:25:16:25:Infinity":11,"s:27:29:27:Infinity":12,"s:28:16:28:Infinity":13,"b:28:25:28:41:28:41:28:55":1,"s:31:12:31:Infinity":14,"s:35:4:52:Infinity":15,"f:45:34:45:35":2,"s:45:41:45:Infinity":16,"b:49:17:49:26:49:26:49: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":{}}} diff --git a/frontend/coverage/index.html b/frontend/coverage/index.html index 279afdf..450975d 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">85% </span> + <span class="strong">86.17% </span> <span class="quiet">Statements</span> - <span class='fraction'>119/140</span> + <span class='fraction'>212/246</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">75.67% </span> + <span class="strong">76.76% </span> <span class="quiet">Branches</span> - <span class='fraction'>56/74</span> + <span class='fraction'>109/142</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">87.5% </span> + <span class="strong">86.3% </span> <span class="quiet">Functions</span> - <span class='fraction'>42/48</span> + <span class='fraction'>63/73</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">87.69% </span> + <span class="strong">88.39% </span> <span class="quiet">Lines</span> - <span class='fraction'>114/130</span> + <span class='fraction'>198/224</span> </div> @@ -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="73.68" class="pic medium"> - <div class="chart"><div class="cover-fill" style="width: 73%"></div><div class="cover-empty" style="width: 27%"></div></div> + <td data-value="78.94" class="pic medium"> + <div class="chart"><div class="cover-fill" style="width: 78%"></div><div class="cover-empty" style="width: 22%"></div></div> </td> - <td data-value="73.68" class="pct medium">73.68%</td> - <td data-value="19" class="abs medium">14/19</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="66.66" class="pct medium">66.66%</td> <td data-value="6" class="abs medium">4/6</td> <td data-value="77.77" class="pct medium">77.77%</td> <td data-value="9" class="abs medium">7/9</td> - <td data-value="73.68" class="pct medium">73.68%</td> - <td data-value="19" class="abs medium">14/19</td> + <td data-value="78.94" class="pct medium">78.94%</td> + <td data-value="19" class="abs medium">15/19</td> </tr> <tr> <td class="file high" data-value="src/components"><a href="src/components/index.html">src/components</a></td> - <td data-value="86.77" class="pic high"> + <td data-value="86.78" 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="86.77" class="pct high">86.77%</td> - <td data-value="121" class="abs high">105/121</td> - <td data-value="76.47" class="pct medium">76.47%</td> - <td data-value="68" class="abs medium">52/68</td> - <td data-value="89.74" class="pct high">89.74%</td> - <td data-value="39" class="abs high">35/39</td> - <td data-value="90.09" class="pct high">90.09%</td> - <td data-value="111" class="abs high">100/111</td> + <td data-value="86.78" class="pct high">86.78%</td> + <td data-value="227" class="abs high">197/227</td> + <td data-value="77.2" class="pct medium">77.2%</td> + <td data-value="136" class="abs medium">105/136</td> + <td data-value="87.5" class="pct high">87.5%</td> + <td data-value="64" class="abs high">56/64</td> + <td data-value="89.26" class="pct high">89.26%</td> + <td data-value="205" class="abs high">183/205</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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </div> <script src="prettify.js"></script> <script> diff --git a/frontend/coverage/src/App.css.html b/frontend/coverage/src/App.css.html index a833e51..213109e 100644 --- a/frontend/coverage/src/App.css.html +++ b/frontend/coverage/src/App.css.html @@ -138,7 +138,63 @@ <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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<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></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> @@ -220,9 +276,6 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @@ -237,19 +290,43 @@ body { } .dashboard-header { - background: #2c3e50; + /* Legacy didn't really have a top header, but we need one for settings/logout. + Keeping it minimal/flat or matching sidebar bg if we want to blend in. + For now, let's make it dark gray to stand out less or match legacy dark mode if applicable. + Actually, let's keep it distinct but apply the font styles. */ + background: #222; color: white; - padding: 0.75rem 1.5rem; + padding: 0.5rem 1rem; display: flex; justify-content: space-between; align-items: center; - flex-shrink: 0; + font-weight: bold; } .dashboard-header h1 { margin: 0; - font-size: 1.25rem; - font-weight: 600; + font-size: 1.2rem; + font-variant: small-caps; + text-transform: lowercase; +} + +.nav-link, +.logout-btn { + font-weight: bold; + font-variant: small-caps; + text-transform: lowercase; + font-size: 1rem; + background: transparent; + border: none; + color: #ccc; + cursor: pointer; + margin-left: 1rem; +} + +.nav-link:hover, +.logout-btn:hover { + color: white; + text-decoration: underline; } .dashboard-content { @@ -259,19 +336,26 @@ body { } .dashboard-sidebar { - width: 300px; - background: #f8f9fa; - border-right: 1px solid #ddd; + width: 15rem; + background: var(--sidebar-bg); + border-right: 1px solid #999; display: flex; flex-direction: column; overflow-y: auto; + padding: 1rem; } .dashboard-main { flex: 1; padding: 2rem; overflow-y: auto; - background: #fff; + background: var(--bg-color); + margin-left: 0; +} + +.dashboard-main>* { + max-width: 600px; + margin: 0; } .logout-btn { @@ -295,7 +379,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </div> <script src="../prettify.js"></script> <script> diff --git a/frontend/coverage/src/App.tsx.html b/frontend/coverage/src/App.tsx.html index 956b16a..0d5195d 100644 --- a/frontend/coverage/src/App.tsx.html +++ b/frontend/coverage/src/App.tsx.html @@ -23,9 +23,9 @@ <div class='clearfix'> <div class='fl pad1y space-right2'> - <span class="strong">73.68% </span> + <span class="strong">78.94% </span> <span class="quiet">Statements</span> - <span class='fraction'>14/19</span> + <span class='fraction'>15/19</span> </div> @@ -44,9 +44,9 @@ <div class='fl pad1y space-right2'> - <span class="strong">73.68% </span> + <span class="strong">78.94% </span> <span class="quiet">Lines</span> - <span class='fraction'>14/19</span> + <span class='fraction'>15/19</span> </div> @@ -153,13 +153,7 @@ <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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L91'></a><a href='#L91'>91</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> @@ -198,21 +192,14 @@ <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-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-neutral"> </span> -<span class="cline-any cline-neutral"> </span> -<span class="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> @@ -237,6 +224,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-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -256,7 +244,7 @@ <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">import React, { useEffect, useState } from 'react'; -import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom'; +import { BrowserRouter, Routes, Route, Navigate, useLocation, useNavigate } from 'react-router-dom'; import Login from './components/Login'; import './App.css'; @@ -293,24 +281,17 @@ import FeedItems from './components/FeedItems'; import Settings from './components/Settings'; function Dashboard() { + const navigate = useNavigate(); return ( <div className="dashboard"> <header className="dashboard-header"> <h1>Neko Reader</h1> <nav> - <a href="/settings" onClick={<span class="fstat-no" title="function not covered" >(e</span>) => { -<span class="cstat-no" title="statement not covered" > e.preventDefault();</span> -<span class="cstat-no" title="statement not covered" > window.history.pushState({}, '', '/settings');</span> - // Quick hack for navigation without full router link if inside Router context, - // but here we are inside BrowserRouter so we should use Link or just simple navigation - // actually let's just use a real Link if we can, but we need import. - // For now, let's just rely on the Router catching the URL change if we use proper Link - // or just a button that navigates. - }} style={{ color: 'white', marginRight: '1rem' }}>Settings</a> + <button onClick={<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >n</span>avigate('/settings')} c</span>lassName="nav-link" style={{ color: 'white', marginRight: '1rem', background: 'none', border: 'none', cursor: 'pointer', fontSize: 'inherit', fontFamily: 'inherit' }}>Settings</button> <button onClick={() => { fetch('/api/logout', { method: 'POST' }) - .then(() => window.location.href = '/login/'); + .then(() => window.location.href = '/v2/login'); }} className="logout-btn"> Logout </button> @@ -323,8 +304,9 @@ function Dashboard() { <main className="dashboard-main"> <Routes> <Route path="/feed/:feedId" element={<FeedItems />} /> + <Route path="/tag/:tagName" element={<FeedItems />} /> <Route path="/settings" element={<Settings />} /> - <Route path="/" element={<p>Select a feed to view items.</p>} /> + <Route path="/" element={<FeedItems />} /> </Routes> </main> </div> @@ -358,7 +340,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 aa1f94f..dd239a3 100644 --- a/frontend/coverage/src/components/FeedItem.css.html +++ b/frontend/coverage/src/components/FeedItem.css.html @@ -143,7 +143,79 @@ <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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<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></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> @@ -224,10 +296,10 @@ <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">.feed-item { - border-bottom: 1px solid #f0f0f0; - padding: 1rem 0; + padding: 1rem; + margin-top: 5rem; list-style: none; - /* Ensure no bullets if used in ul */ + border-bottom: none; } .feed-item.read .item-title { @@ -243,21 +315,23 @@ display: flex; justify-content: space-between; align-items: flex-start; + margin-bottom: 0.5rem; } .item-title { - font-size: 1.2rem; + font-size: 1.25rem; + font-weight: bold; + /* Legacy headers were bold */ text-decoration: none; color: #333; display: block; - margin-bottom: 0.5rem; flex: 1; - /* Take up remaining space */ } .item-title:hover { - text-decoration: underline; - color: #007bff; + text-decoration: none; + color: blue; + /* Legacy link color */ } .item-actions { @@ -266,36 +340,63 @@ margin-left: 1rem; } -.action-btn { +/* Legacy controls were simple text/links, but buttons are fine if minimal */ +.star-btn { background: none; - border: 1px solid #ddd; - border-radius: 4px; + border: none; + cursor: pointer; + font-size: 1.2rem; + padding: 0 0.5rem 0 0; + vertical-align: middle; + transition: color 0.2s; + line-height: 1; +} + +.star-btn.is-starred { + color: #ffd700; + /* Gold */ +} + +.star-btn.is-unstarred { + color: #ccc; +} + +.star-btn:hover { + color: #ffeb3b; +} + +.action-btn { + background: whitesmoke; + border: none; cursor: pointer; padding: 2px 6px; font-size: 1rem; - line-height: 1; + color: blue; + font-weight: bold; } .action-btn:hover { - background-color: #f8f9fa; - border-color: #ccc; + background-color: #eee; } -.action-btn.is-starred { - color: gold; - border-color: gold; +.dateline { + margin-top: 0; + font-weight: normal; + font-size: .75em; + color: #ccc; + margin-bottom: 1rem; } -.item-meta { - font-size: 0.85rem; - color: #666; - margin-bottom: 0.5rem; +.dateline a { + color: #ccc; + text-decoration: none; } .item-description { - color: #444; + color: #000; line-height: 1.5; - font-size: 0.95rem; + font-size: 1rem; + margin-top: 1rem; } .item-description img { @@ -303,6 +404,13 @@ height: auto; display: block; margin: 1rem 0; +} + +.item-description blockquote { + padding: 1rem 1rem 0 1rem; + border-left: 4px solid #ddd; + color: #666; + margin-left: 0; }</pre></td></tr></table></pre> <div class='push'></div><!-- for sticky footer --> @@ -310,7 +418,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 893040e..f6b08e5 100644 --- a/frontend/coverage/src/components/FeedItem.tsx.html +++ b/frontend/coverage/src/components/FeedItem.tsx.html @@ -23,30 +23,30 @@ <div class='clearfix'> <div class='fl pad1y space-right2'> - <span class="strong">94.73% </span> + <span class="strong">78.94% </span> <span class="quiet">Statements</span> - <span class='fraction'>18/19</span> + <span class='fraction'>15/19</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">91.66% </span> + <span class="strong">88.88% </span> <span class="quiet">Branches</span> - <span class='fraction'>22/24</span> + <span class='fraction'>16/18</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">100% </span> + <span class="strong">85.71% </span> <span class="quiet">Functions</span> - <span class='fraction'>7/7</span> + <span class='fraction'>6/7</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">94.73% </span> + <span class="strong">78.94% </span> <span class="quiet">Lines</span> - <span class='fraction'>18/19</span> + <span class='fraction'>15/19</span> </div> @@ -61,7 +61,7 @@ </div> </template> </div> - <div class='status-line high'></div> + <div class='status-line medium'></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> @@ -147,12 +147,7 @@ <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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L85'></a><a href='#L85'>85</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> @@ -161,24 +156,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">12x</span> -<span class="cline-any cline-yes">12x</span> +<span class="cline-any cline-yes">21x</span> +<span class="cline-any cline-yes">21x</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-yes">21x</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">12x</span> -<span class="cline-any cline-yes">3x</span> +<span class="cline-any cline-yes">21x</span> +<span class="cline-any cline-yes">1x</span> <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">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">3x</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> @@ -190,33 +182,31 @@ <span class="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">1x</span> <span class="cline-any cline-no"> </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-yes">1x</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-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-no"> </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-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">21x</span> <span class="cline-any cline-neutral"> </span> <span class="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-neutral"> </span> @@ -253,9 +243,6 @@ export default function FeedItem({ item: initialItem }: FeedItemProps) { const [item, setItem] = useState(initialItem); const [loading, setLoading] = useState(false); - const toggleRead = () => { - updateItem({ ...item, read: !item.read }); - }; const toggleStar = () => { updateItem({ ...item, starred: !item.starred }); @@ -289,40 +276,38 @@ export default function FeedItem({ item: initialItem }: FeedItemProps) { // or we could setItem(updated) if the server returns the full object setLoading(false); }) - .catch((err) => { - console.error('Error updating item:', err); + .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { +<span class="cstat-no" title="statement not covered" > console.error('Error updating item:', err);</span> // Revert on error - setItem(previousItem); - setLoading(false); +<span class="cstat-no" title="statement not covered" > setItem(previousItem);</span> +<span class="cstat-no" title="statement not covered" > setLoading(false);</span> }); }; return ( <li className={`feed-item ${item.read ? 'read' : 'unread'} ${loading ? 'loading' : ''}`}> <div className="item-header"> + <button + onClick={(e) => { + e.stopPropagation(); + toggleStar(); + }} + className={`star-btn ${item.starred ? 'is-starred' : 'is-unstarred'}`} + title={item.starred ? "Unstar" : "Star"} + > + {item.starred ? '★' : '☆'} + </button> <a href={item.url} target="_blank" rel="noopener noreferrer" className="item-title"> {item.title || <span class="branch-1 cbranch-no" title="branch not covered" >'(No Title)'}</span> </a> - <div className="item-actions"> - <button - onClick={toggleRead} - className={`action-btn ${item.read ? 'is-read' : 'is-unread'}`} - title={item.read ? "Mark as unread" : "Mark as read"} - > - {item.read ? '📖' : 'uo'} - </button> - <button - onClick={toggleStar} - className={`action-btn ${item.starred ? 'is-starred' : 'is-unstarred'}`} - title={item.starred ? "Unstar" : "Star"} - > - {item.starred ? '★' : '☆'} - </button> - </div> </div> - <div className="item-meta"> - <span className="item-date">{new Date(item.publish_date).toLocaleDateString()}</span> - {item.feed_title && <span className="item-feed"> - {item.feed_title}</span>} + <div className="dateline"> + <a href={item.url} target="_blank" rel="noopener noreferrer"> + {new Date(item.publish_date).toLocaleDateString()} + {item.feed_title && ` - ${item.feed_title}`} + </a> + <div className="item-actions" style={{ display: 'inline-block', float: 'right' }}> + </div> </div> {item.description && ( <div className="item-description" dangerouslySetInnerHTML={{ __html: item.description }} /> @@ -337,7 +322,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 826334f..b5d2c41 100644 --- a/frontend/coverage/src/components/FeedItems.css.html +++ b/frontend/coverage/src/components/FeedItems.css.html @@ -76,7 +76,41 @@ <a name='L11'></a><a href='#L11'>11</a> <a name='L12'></a><a href='#L12'>12</a> <a name='L13'></a><a href='#L13'>13</a> -<a name='L14'></a><a href='#L14'>14</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L14'></a><a href='#L14'>14</a> +<a name='L15'></a><a href='#L15'>15</a> +<a name='L16'></a><a href='#L16'>16</a> +<a name='L17'></a><a href='#L17'>17</a> +<a name='L18'></a><a href='#L18'>18</a> +<a name='L19'></a><a href='#L19'>19</a> +<a name='L20'></a><a href='#L20'>20</a> +<a name='L21'></a><a href='#L21'>21</a> +<a name='L22'></a><a href='#L22'>22</a> +<a name='L23'></a><a href='#L23'>23</a> +<a name='L24'></a><a href='#L24'>24</a> +<a name='L25'></a><a href='#L25'>25</a> +<a name='L26'></a><a href='#L26'>26</a> +<a name='L27'></a><a href='#L27'>27</a> +<a name='L28'></a><a href='#L28'>28</a> +<a name='L29'></a><a href='#L29'>29</a> +<a name='L30'></a><a href='#L30'>30</a> +<a name='L31'></a><a href='#L31'>31</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> @@ -102,6 +136,23 @@ .item-list { list-style: none; padding: 0; +} + +.selected-item-container { + border-left: 4px solid #007bff; + background-color: #f8f9fa; + padding-left: 0.5rem; + margin-left: -0.5rem; + /* Compensate for padding/border to keep alignment */ + transition: background-color 0.2s; +} + +.loading-more { + padding: 2rem; + text-align: center; + color: #888; + font-size: 0.9rem; + min-height: 50px; }</pre></td></tr></table></pre> <div class='push'></div><!-- for sticky footer --> @@ -109,7 +160,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 462491f..e0f73cf 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">86.36% </span> + <span class="strong">89.34% </span> <span class="quiet">Statements</span> - <span class='fraction'>19/22</span> + <span class='fraction'>109/122</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">60% </span> + <span class="strong">77.21% </span> <span class="quiet">Branches</span> - <span class='fraction'>6/10</span> + <span class='fraction'>61/79</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">83.33% </span> + <span class="strong">86.2% </span> <span class="quiet">Functions</span> - <span class='fraction'>5/6</span> + <span class='fraction'>25/29</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">85% </span> + <span class="strong">89.09% </span> <span class="quiet">Lines</span> - <span class='fraction'>17/20</span> + <span class='fraction'>98/110</span> </div> @@ -119,46 +119,345 @@ <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> +<a name='L69'></a><a href='#L69'>69</a> +<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> +<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> +<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> +<a name='L149'></a><a href='#L149'>149</a> +<a name='L150'></a><a href='#L150'>150</a> +<a name='L151'></a><a href='#L151'>151</a> +<a name='L152'></a><a href='#L152'>152</a> +<a name='L153'></a><a href='#L153'>153</a> +<a name='L154'></a><a href='#L154'>154</a> +<a name='L155'></a><a href='#L155'>155</a> +<a name='L156'></a><a href='#L156'>156</a> +<a name='L157'></a><a href='#L157'>157</a> +<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> +<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></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">27x</span> +<span class="cline-any cline-yes">27x</span> +<span class="cline-any cline-yes">27x</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-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-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">2x</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-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-yes">8x</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">8x</span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">8x</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-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-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">8x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">7x</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-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-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-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">27x</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">27x</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-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-neutral"> </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">1x</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-yes">1x</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-neutral"> </span> +<span class="cline-any cline-no"> </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">23x</span> +<span class="cline-any cline-yes">23x</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-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-neutral"> </span> +<span class="cline-any cline-yes">3x</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-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">1x</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">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-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">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-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-neutral"> </span> -<span class="cline-any cline-yes">3x</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-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> @@ -168,7 +467,42 @@ <span class="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">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-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-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-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="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">21x</span> +<span class="cline-any cline-neutral"> </span> +<span class="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> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -176,24 +510,59 @@ <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">import { useEffect, useState } from 'react'; -import { useParams } from 'react-router-dom'; +import { useParams, useSearchParams } from 'react-router-dom'; import type { Item } from '../types'; import FeedItem from './FeedItem'; import './FeedItems.css'; export default function FeedItems() { - const { feedId } = useParams<{ feedId: string }>(); + const { feedId, tagName } = useParams<{ feedId: string; tagName: string }>(); + const [searchParams] = useSearchParams(); + const filterFn = searchParams.get('filter') || 'unread'; + const [items, setItems] = useState<Item[]>([]); const [loading, setLoading] = useState(true); + const [loadingMore, setLoadingMore] = useState(false); + const [hasMore, setHasMore] = useState(true); const [error, setError] = useState(''); - useEffect(() => { - setLoading(true); + const fetchItems = (maxId?: string) => { + if (maxId) { + setLoadingMore(true); + } else { + setLoading(true); + setItems([]); + } setError(''); - const url = feedId - ? `/api/stream?feed_id=${feedId}` - : <span class="branch-1 cbranch-no" title="branch not covered" >'/api/stream'; // Default or "all" view? For now let's assume we need a feedId or handle "all" logic later</span> + let url = '/api/stream'; + const params = new URLSearchParams(); + + if (feedId) { + params.append('feed_id', feedId); + } else if (tagName) { + params.append('tag', tagName); + } + + if (maxId) { + params.append('max_id', maxId); + } + + // Apply filters + <span class="missing-if-branch" title="if path not taken" >I</span>if (filterFn === 'all') { +<span class="cstat-no" title="statement not covered" > params.append('read_filter', 'all');</span> + <span class="missing-if-branch" title="if path not taken" >I</span>} else if (filterFn === 'starred') { +<span class="cstat-no" title="statement not covered" > params.append('starred', 'true');</span> +<span class="cstat-no" title="statement not covered" > params.append('read_filter', 'all');</span> + } else { + // default to unread + params.append('read_filter', 'unread'); + } + + const queryString = params.toString(); + <span class="missing-if-branch" title="else path not taken" >E</span>if (queryString) { + url += `?${queryString}`; + } fetch(url) .then((res) => { @@ -203,29 +572,161 @@ export default function FeedItems() { return res.json(); }) .then((data) => { - setItems(data); + if (maxId) { + setItems((prev) => [...prev, ...data]); + } else { + setItems(data); + } + setHasMore(data.length > 0); setLoading(false); + setLoadingMore(false); }) - .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); + setLoadingMore(false); }); - }, [feedId]); + }; + + useEffect(() => { + fetchItems(); + }, [feedId, tagName, filterFn]); + + const [selectedIndex, setSelectedIndex] = useState(-1); + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + <span class="missing-if-branch" title="if path not taken" >I</span>if (items.length === 0) <span class="cstat-no" title="statement not covered" >return;</span> + + if (e.key === 'j') { + setSelectedIndex((prev) => { + const nextIndex = Math.min(prev + 1, items.length - 1); + <span class="missing-if-branch" title="else path not taken" >E</span>if (nextIndex !== prev) { + const item = items[nextIndex]; + if (!item.read) { + markAsRead(item); + } + scrollToItem(nextIndex); + } + return nextIndex; + }); + <span class="missing-if-branch" title="if path not taken" >I</span>} else if (e.key === 'k') { +<span class="cstat-no" title="statement not covered" > setSelectedIndex(<span class="fstat-no" title="function not covered" >(p</span>rev) => {</span> + const nextIndex = <span class="cstat-no" title="statement not covered" >Math.max(prev - 1, 0);</span> +<span class="cstat-no" title="statement not covered" > if (nextIndex !== prev) {</span> +<span class="cstat-no" title="statement not covered" > scrollToItem(nextIndex);</span> + } +<span class="cstat-no" title="statement not covered" > return nextIndex;</span> + }); + <span class="missing-if-branch" title="else path not taken" >E</span>} else if (e.key === 's') { + setSelectedIndex((currentIndex) => { + <span class="missing-if-branch" title="else path not taken" >E</span>if (currentIndex >= 0 && currentIndex < items.length) { + toggleStar(items[currentIndex]); + } + return currentIndex; + }); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [items]); + + const scrollToItem = (index: number) => { + const element = document.getElementById(`item-${index}`); + <span class="missing-if-branch" title="else path not taken" >E</span>if (element) { + element.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + }; + + const markAsRead = (item: Item) => { + const updatedItem = { ...item, read: true }; + // Optimistic update + setItems((prevItems) => prevItems.map((i) => (i._id === item._id ? updatedItem : i))); + + fetch(`/api/item/${item._id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ read: true, starred: item.starred }), + }).catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => <span class="cstat-no" title="statement not covered" >console.error('Failed to mark read', err))</span>; + }; + + const toggleStar = (item: Item) => { + const updatedItem = { ...item, starred: !item.starred }; + // Optimistic update + setItems((prevItems) => prevItems.map((i) => (i._id === item._id ? updatedItem : i))); + + fetch(`/api/item/${item._id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ read: item.read, starred: !item.starred }), + }).catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => <span class="cstat-no" title="statement not covered" >console.error('Failed to toggle star', err))</span>; + }; + + useEffect(() => { + const observer = 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')); + <span class="missing-if-branch" title="else path not taken" >E</span>if (!isNaN(index) && index >= 0 && index < items.length) { + const item = items[index]; + <span class="missing-if-branch" title="else path not taken" >E</span>if (!item.read) { + markAsRead(item); + } + } + } + }); + }, + { root: null, threshold: 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); + }); + + const sentinel = document.getElementById('load-more-sentinel'); + if (sentinel) observer.observe(sentinel); + + return () => observer.disconnect(); + }, [items, loadingMore, hasMore]); if (loading) return <div className="feed-items-loading">Loading items...</div>; - <span class="missing-if-branch" title="if path not taken" >I</span>if (error) return <div className="feed-items-error">Error: {error}</div>; + if (error) return <div className="feed-items-error">Error: {error}</div>; + return ( <div className="feed-items"> - <h2>Items</h2> - {/* TODO: Add Feed Title here if possible, maybe pass from location state or fetch feed details */} {items.length === 0 ? ( <span class="branch-0 cbranch-no" title="branch not covered" > <p>No items found.</p></span> ) : ( <ul className="item-list"> - {items.map((item) => ( - <FeedItem key={item._id} item={item} /> + {items.map((item, index) => ( + <div + id={`item-${index}`} + key={item._id} + data-index={index} + className={index === selectedIndex ? 'selected-item-container' : ''} + onClick={<span class="fstat-no" title="function not covered" >() => <span class="cstat-no" title="statement not covered" >s</span>etSelectedIndex(index)}</span> + > + <FeedItem item={item} /> + </div> ))} + {hasMore && ( + <div id="load-more-sentinel" className="loading-more"> + {loadingMore ? 'Loading more...' : ''} + </div> + )} </ul> )} </div> @@ -238,7 +739,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 b2087e7..ffaa1a9 100644 --- a/frontend/coverage/src/components/FeedList.css.html +++ b/frontend/coverage/src/components/FeedList.css.html @@ -110,7 +110,107 @@ <a name='L45'></a><a href='#L45'>45</a> <a name='L46'></a><a href='#L46'>46</a> <a name='L47'></a><a href='#L47'>47</a> -<a name='L48'></a><a href='#L48'>48</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L48'></a><a href='#L48'>48</a> +<a name='L49'></a><a href='#L49'>49</a> +<a name='L50'></a><a href='#L50'>50</a> +<a name='L51'></a><a href='#L51'>51</a> +<a name='L52'></a><a href='#L52'>52</a> +<a name='L53'></a><a href='#L53'>53</a> +<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> +<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> +<a name='L69'></a><a href='#L69'>69</a> +<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> +<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></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> @@ -158,52 +258,102 @@ <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">.feed-list { - padding: 1rem; - background: white; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + /* Removed card styling */ + padding: 0; + background: transparent; } .feed-list h2 { - margin-top: 0; - border-bottom: 1px solid #eee; - padding-bottom: 0.5rem; + font-size: 1.2rem; + margin-bottom: 0.5rem; + border-bottom: 1px solid #999; + padding-bottom: 0.25rem; + text-transform: uppercase; + letter-spacing: 1px; } -.feed-list-items { +.feed-list-items, +.tag-list-items, +.filter-list { list-style: none; padding: 0; margin: 0; } -.feed-item { - padding: 0.75rem 0; - border-bottom: 1px solid #f0f0f0; +.sidebar-feed-item { + padding: 0.25rem 0; + border-bottom: none; + /* Clean look */ display: flex; justify-content: space-between; align-items: center; } -.feed-item:last-child { - border-bottom: none; -} - .feed-title { - text-decoration: none; color: #333; - font-weight: 500; + text-decoration: none; + font-size: 0.9rem; } .feed-title:hover { - color: #007bff; + text-decoration: underline; + color: #000; } .feed-category { - background: #e9ecef; - padding: 0.2rem 0.5rem; - border-radius: 4px; - font-size: 0.8rem; - color: #666; + display: none; + /* Hide category in sidebar list to save space/match legacy simplicity if needed */ +} + +.tag-section { + margin-top: 2rem; +} + +.tag-link, +.filter-list li a { + color: #333; + text-decoration: none; + font-size: 0.9rem; + display: block; + padding: 0.1rem 0; +} + +.tag-link:hover, +.filter-list li a:hover { + text-decoration: underline; + background: transparent; + /* No hover bg */ + color: #000; +} + +.filter-section { + margin-bottom: 2rem; +} + +.filter-list { + display: block; + /* Stack vertically */ +} + +.filter-list { + display: block; +} + +.filter-list li a { + text-decoration: none; + color: #333; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: bold; + font-variant: small-caps; + text-transform: lowercase; + font-size: 1.1rem; + display: block; + margin-bottom: 0.5rem; +} + +.filter-list li a:hover { + color: blue; + background-color: transparent; }</pre></td></tr></table></pre> <div class='push'></div><!-- for sticky footer --> @@ -211,7 +361,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 75aeb6a..b1b0a27 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">94.44% </span> + <span class="strong">91.66% </span> <span class="quiet">Statements</span> - <span class='fraction'>17/18</span> + <span class='fraction'>22/24</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">83.33% </span> + <span class="strong">82.35% </span> <span class="quiet">Branches</span> - <span class='fraction'>10/12</span> + <span class='fraction'>14/17</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> - <span class='fraction'>6/6</span> + <span class='fraction'>8/8</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">93.75% </span> + <span class="strong">100% </span> <span class="quiet">Lines</span> - <span class='fraction'>15/16</span> + <span class='fraction'>20/20</span> </div> @@ -114,36 +114,86 @@ <a name='L49'></a><a href='#L49'>49</a> <a name='L50'></a><a href='#L50'>50</a> <a name='L51'></a><a href='#L51'>51</a> -<a name='L52'></a><a href='#L52'>52</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L52'></a><a href='#L52'>52</a> +<a name='L53'></a><a href='#L53'>53</a> +<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> +<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> +<a name='L69'></a><a href='#L69'>69</a> +<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> +<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></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-yes">11x</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-yes">11x</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-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-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-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">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-yes">9x</span> +<span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">5x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">3x</span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="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-yes">3x</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-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">9x</span> -<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">3x</span> <span class="cline-any cline-neutral"> </span> @@ -153,7 +203,15 @@ <span class="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-yes">3x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -167,24 +225,29 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; -import type { Feed } from '../types'; +import type { Feed, Category } from '../types'; import './FeedList.css'; export default function FeedList() { const [feeds, setFeeds] = useState<Feed[]>([]); + const [tags, setTags] = useState<Category[]>([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); useEffect(() => { - fetch('/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> - } + Promise.all([ + fetch('/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(); + }), + fetch('/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(); }) - .then((data) => { - setFeeds(data); + ]) + .then(([feedsData, tagsData]) => { + setFeeds(feedsData); + setTags(tagsData); setLoading(false); }) .catch((err) => { @@ -198,20 +261,44 @@ export default function FeedList() { return ( <div className="feed-list"> - <h2>Feeds</h2> - {feeds.length === 0 ? ( - <p>No feeds found.</p> - ) : ( - <ul className="feed-list-items"> - {feeds.map((feed) => ( - <li key={feed._id} className="feed-item"> - <Link to={`/feed/${feed._id}`} className="feed-title"> - {feed.title || <span class="branch-1 cbranch-no" title="branch not covered" >feed.url}</span> - </Link> - {feed.category && <span className="feed-category">{feed.category}</span>} - </li> - ))} + <div className="filter-section"> + <ul className="filter-list"> + <li><Link to="/?filter=unread">Unread</Link></li> + <li><Link to="/?filter=all">All</Link></li> + <li><Link to="/?filter=starred">Starred</Link></li> </ul> + </div> + <div className="feed-section"> + <h2>Feeds</h2> + {feeds.length === 0 ? ( + <p>No feeds found.</p> + ) : ( + <ul className="feed-list-items"> + {feeds.map((feed) => ( + <li key={feed._id} className="sidebar-feed-item"> + <Link to={`/feed/${feed._id}`} className="feed-title"> + {feed.title || <span class="branch-1 cbranch-no" title="branch not covered" >feed.url}</span> + </Link> + {feed.category && <span className="feed-category">{feed.category}</span>} + </li> + ))} + </ul> + )} + </div> + + {tags && tags.length > 0 && ( + <div className="tag-section"> + <h2>Tags</h2> + <ul className="tag-list-items"> + {tags.map((tag) => ( + <li key={tag.title} className="tag-item"> + <Link to={`/tag/${encodeURIComponent(tag.title)}`} className="tag-link"> + {tag.title} + </Link> + </li> + ))} + </ul> + </div> )} </div> ); @@ -223,7 +310,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 7a0a19e..2b2fe0d 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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 cc6a099..263fe57 100644 --- a/frontend/coverage/src/components/Login.tsx.html +++ b/frontend/coverage/src/components/Login.tsx.html @@ -232,7 +232,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 5bd4b53..428c9d2 100644 --- a/frontend/coverage/src/components/Settings.css.html +++ b/frontend/coverage/src/components/Settings.css.html @@ -316,7 +316,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </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 eaed089..62ca241 100644 --- a/frontend/coverage/src/components/Settings.tsx.html +++ b/frontend/coverage/src/components/Settings.tsx.html @@ -433,7 +433,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </div> <script src="../../prettify.js"></script> <script> diff --git a/frontend/coverage/src/components/index.html b/frontend/coverage/src/components/index.html index ec5db40..534e353 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">86.77% </span> + <span class="strong">86.78% </span> <span class="quiet">Statements</span> - <span class='fraction'>105/121</span> + <span class='fraction'>197/227</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">76.47% </span> + <span class="strong">77.2% </span> <span class="quiet">Branches</span> - <span class='fraction'>52/68</span> + <span class='fraction'>105/136</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">89.74% </span> + <span class="strong">87.5% </span> <span class="quiet">Functions</span> - <span class='fraction'>35/39</span> + <span class='fraction'>56/64</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">90.09% </span> + <span class="strong">89.26% </span> <span class="quiet">Lines</span> - <span class='fraction'>100/111</span> + <span class='fraction'>183/205</span> </div> @@ -94,18 +94,18 @@ </tr> <tr> - <td class="file high" data-value="FeedItem.tsx"><a href="FeedItem.tsx.html">FeedItem.tsx</a></td> - <td data-value="94.73" class="pic high"> - <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div> + <td class="file medium" data-value="FeedItem.tsx"><a href="FeedItem.tsx.html">FeedItem.tsx</a></td> + <td data-value="78.94" class="pic medium"> + <div class="chart"><div class="cover-fill" style="width: 78%"></div><div class="cover-empty" style="width: 22%"></div></div> </td> - <td data-value="94.73" class="pct high">94.73%</td> - <td data-value="19" class="abs high">18/19</td> - <td data-value="91.66" class="pct high">91.66%</td> - <td data-value="24" class="abs high">22/24</td> - <td data-value="100" class="pct high">100%</td> - <td data-value="7" class="abs high">7/7</td> - <td data-value="94.73" class="pct high">94.73%</td> - <td data-value="19" class="abs high">18/19</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="88.88" class="pct high">88.88%</td> + <td data-value="18" class="abs high">16/18</td> + <td data-value="85.71" class="pct high">85.71%</td> + <td data-value="7" class="abs high">6/7</td> + <td data-value="78.94" class="pct medium">78.94%</td> + <td data-value="19" class="abs medium">15/19</td> </tr> <tr> @@ -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="86.36" class="pic high"> - <div class="chart"><div class="cover-fill" style="width: 86%"></div><div class="cover-empty" style="width: 14%"></div></div> + <td data-value="89.34" 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="86.36" class="pct high">86.36%</td> - <td data-value="22" class="abs high">19/22</td> - <td data-value="60" class="pct medium">60%</td> - <td data-value="10" class="abs medium">6/10</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="85" class="pct high">85%</td> - <td data-value="20" class="abs high">17/20</td> + <td data-value="89.34" class="pct high">89.34%</td> + <td data-value="122" class="abs high">109/122</td> + <td data-value="77.21" class="pct medium">77.21%</td> + <td data-value="79" class="abs medium">61/79</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="89.09" class="pct high">89.09%</td> + <td data-value="110" class="abs high">98/110</td> </tr> <tr> @@ -155,17 +155,17 @@ <tr> <td class="file high" data-value="FeedList.tsx"><a href="FeedList.tsx.html">FeedList.tsx</a></td> - <td data-value="94.44" class="pic high"> - <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div> + <td data-value="91.66" class="pic high"> + <div class="chart"><div class="cover-fill" style="width: 91%"></div><div class="cover-empty" style="width: 9%"></div></div> </td> - <td data-value="94.44" class="pct high">94.44%</td> - <td data-value="18" class="abs high">17/18</td> - <td data-value="83.33" class="pct high">83.33%</td> - <td data-value="12" class="abs high">10/12</td> + <td data-value="91.66" class="pct high">91.66%</td> + <td data-value="24" class="abs high">22/24</td> + <td data-value="82.35" class="pct high">82.35%</td> + <td data-value="17" class="abs high">14/17</td> + <td data-value="100" class="pct high">100%</td> + <td data-value="8" class="abs high">8/8</td> <td data-value="100" class="pct high">100%</td> - <td data-value="6" class="abs high">6/6</td> - <td data-value="93.75" class="pct high">93.75%</td> - <td data-value="16" class="abs high">15/16</td> + <td data-value="20" class="abs high">20/20</td> </tr> <tr> @@ -236,7 +236,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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </div> <script src="../../prettify.js"></script> <script> diff --git a/frontend/coverage/src/index.html b/frontend/coverage/src/index.html index 5f85c77..023e9bb 100644 --- a/frontend/coverage/src/index.html +++ b/frontend/coverage/src/index.html @@ -23,9 +23,9 @@ <div class='clearfix'> <div class='fl pad1y space-right2'> - <span class="strong">73.68% </span> + <span class="strong">78.94% </span> <span class="quiet">Statements</span> - <span class='fraction'>14/19</span> + <span class='fraction'>15/19</span> </div> @@ -44,9 +44,9 @@ <div class='fl pad1y space-right2'> - <span class="strong">73.68% </span> + <span class="strong">78.94% </span> <span class="quiet">Lines</span> - <span class='fraction'>14/19</span> + <span class='fraction'>15/19</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="73.68" class="pic medium"> - <div class="chart"><div class="cover-fill" style="width: 73%"></div><div class="cover-empty" style="width: 27%"></div></div> + <td data-value="78.94" class="pic medium"> + <div class="chart"><div class="cover-fill" style="width: 78%"></div><div class="cover-empty" style="width: 22%"></div></div> </td> - <td data-value="73.68" class="pct medium">73.68%</td> - <td data-value="19" class="abs medium">14/19</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="66.66" class="pct medium">66.66%</td> <td data-value="6" class="abs medium">4/6</td> <td data-value="77.77" class="pct medium">77.77%</td> <td data-value="9" class="abs medium">7/9</td> - <td data-value="73.68" class="pct medium">73.68%</td> - <td data-value="19" class="abs medium">14/19</td> + <td data-value="78.94" class="pct medium">78.94%</td> + <td data-value="19" class="abs medium">15/19</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-13T15:03:42.999Z + at 2026-02-13T21:49:58.924Z </div> <script src="../prettify.js"></script> <script> |
