six-degrees 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +13 -13
  4. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  10. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  13. package/.next/standalone/.next/server/app/_not-found.rsc +18 -17
  14. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +18 -17
  15. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -13
  16. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  17. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/import/page.js +1 -1
  46. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/import.html +1 -1
  49. package/.next/standalone/.next/server/app/import.rsc +22 -21
  50. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +22 -21
  51. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
  52. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +16 -15
  53. package/.next/standalone/.next/server/app/index.html +1 -1
  54. package/.next/standalone/.next/server/app/index.rsc +20 -19
  55. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +16 -15
  56. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +20 -19
  57. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/launch/page.js +1 -1
  59. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/launch.html +2 -2
  62. package/.next/standalone/.next/server/app/launch.rsc +22 -21
  63. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +22 -21
  64. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
  65. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +16 -15
  66. package/.next/standalone/.next/server/app/page.js +1 -1
  67. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/paths/page.js +1 -1
  70. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/paths.html +1 -1
  73. package/.next/standalone/.next/server/app/paths.rsc +22 -21
  74. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +22 -21
  75. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
  76. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +16 -15
  77. package/.next/standalone/.next/server/app/profile/page.js +1 -1
  78. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/profile.html +1 -1
  81. package/.next/standalone/.next/server/app/profile.rsc +22 -21
  82. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +22 -21
  83. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
  84. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +16 -15
  85. package/.next/standalone/.next/server/app/queue/page.js +1 -1
  86. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/queue.html +1 -1
  89. package/.next/standalone/.next/server/app/queue.rsc +22 -21
  90. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +22 -21
  91. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
  92. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +16 -15
  93. package/.next/standalone/.next/server/app/scores/page.js +1 -1
  94. package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/scores.html +1 -1
  97. package/.next/standalone/.next/server/app/scores.rsc +22 -21
  98. package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +22 -21
  99. package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
  100. package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +16 -15
  101. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  102. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/settings.html +1 -1
  105. package/.next/standalone/.next/server/app/settings.rsc +22 -21
  106. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +22 -21
  107. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  108. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +16 -15
  109. package/.next/standalone/.next/server/app/setup/page.js +1 -1
  110. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/setup.html +1 -1
  113. package/.next/standalone/.next/server/app/setup.rsc +22 -21
  114. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +22 -21
  115. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  116. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +16 -15
  117. package/.next/standalone/.next/server/chunks/_1_fynia._.js +6 -6
  118. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
  119. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +1 -1
  120. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0d3vjsq._.js +3 -0
  121. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m4vk0b._.js +3 -0
  122. package/.next/standalone/.next/server/chunks/ssr/{_15xuwkv._.js → _012mop3._.js} +2 -2
  123. package/.next/standalone/.next/server/chunks/ssr/_1163x49._.js +3 -0
  124. package/.next/standalone/.next/server/chunks/ssr/_1av11ws._.js +3 -0
  125. package/.next/standalone/.next/server/chunks/ssr/_1ig7em7._.js +3 -0
  126. package/.next/standalone/.next/server/chunks/ssr/_20w06i-._.js +1 -1
  127. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +4 -4
  128. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +1 -1
  129. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  130. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  131. package/.next/standalone/.next/server/pages/404.html +1 -1
  132. package/.next/standalone/.next/server/pages/500.html +1 -1
  133. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  135. package/.next/standalone/.next/static/chunks/{3e8zg6ctvvb8p.js → 0_3ubivay59bq.js} +4 -4
  136. package/.next/standalone/.next/static/chunks/{2p6o90z0vgcwr.css → 0bo1dxn5gwzpk.css} +1 -1
  137. package/.next/standalone/.next/static/chunks/0f4ugd6v3ph0-.js +1 -0
  138. package/.next/standalone/.next/static/chunks/10ogurbcuf3nq.js +1 -0
  139. package/.next/standalone/.next/static/chunks/1489t7jrjojk_.js +1 -0
  140. package/.next/standalone/.next/static/chunks/{0ax_9zzboyv6d.js → 17-rhp8sg4m1b.js} +2 -2
  141. package/.next/standalone/.next/static/chunks/1zunq4tk-u3ng.js +1 -0
  142. package/.next/standalone/.next/static/chunks/1zwjy1mmpkdrg.js +6 -0
  143. package/.next/standalone/.next/static/chunks/2_wcobfqry2uj.js +1 -0
  144. package/.next/standalone/.next/static/chunks/2dwtoszeq91us.js +1 -0
  145. package/.next/standalone/.next/static/chunks/2pyo4j84prgp6.js +18 -0
  146. package/.next/standalone/.next/static/chunks/2wwmljnf7yn_5.js +1 -0
  147. package/.next/{static/chunks/2xjho0lroiwlq.js → standalone/.next/static/chunks/3kllnkb3hof1s.js} +1 -1
  148. package/.next/standalone/CHANGELOG.md +54 -0
  149. package/.next/standalone/app/api/scraper/route.js +27 -2
  150. package/.next/standalone/app/components/ChainView.js +17 -10
  151. package/.next/standalone/app/components/FilterPanel.js +37 -5
  152. package/.next/standalone/app/components/ForceGraph.js +106 -13
  153. package/.next/standalone/app/components/OrbitGraph.js +105 -30
  154. package/.next/standalone/app/components/ScanStatusBar.js +82 -0
  155. package/.next/standalone/app/globals.css +4 -0
  156. package/.next/standalone/app/layout.js +3 -0
  157. package/.next/standalone/app/page.js +8 -4
  158. package/.next/standalone/app/setup/page.js +13 -1
  159. package/.next/standalone/lib/dot-rings.js +21 -0
  160. package/.next/standalone/lib/reach.js +22 -1
  161. package/.next/standalone/lib/scraper-client.js +1 -0
  162. package/.next/standalone/package-lock.json +2 -2
  163. package/.next/standalone/package.json +1 -1
  164. package/.next/standalone/scripts/scrape.py +229 -5
  165. package/.next/static/chunks/{3e8zg6ctvvb8p.js → 0_3ubivay59bq.js} +4 -4
  166. package/.next/static/chunks/{2p6o90z0vgcwr.css → 0bo1dxn5gwzpk.css} +1 -1
  167. package/.next/static/chunks/0f4ugd6v3ph0-.js +1 -0
  168. package/.next/static/chunks/10ogurbcuf3nq.js +1 -0
  169. package/.next/static/chunks/1489t7jrjojk_.js +1 -0
  170. package/.next/static/chunks/{0ax_9zzboyv6d.js → 17-rhp8sg4m1b.js} +2 -2
  171. package/.next/static/chunks/1zunq4tk-u3ng.js +1 -0
  172. package/.next/static/chunks/1zwjy1mmpkdrg.js +6 -0
  173. package/.next/static/chunks/2_wcobfqry2uj.js +1 -0
  174. package/.next/static/chunks/2dwtoszeq91us.js +1 -0
  175. package/.next/static/chunks/2pyo4j84prgp6.js +18 -0
  176. package/.next/static/chunks/2wwmljnf7yn_5.js +1 -0
  177. package/.next/{standalone/.next/static/chunks/2xjho0lroiwlq.js → static/chunks/3kllnkb3hof1s.js} +1 -1
  178. package/CHANGELOG.md +54 -0
  179. package/lib/dot-rings.js +21 -0
  180. package/lib/reach.js +22 -1
  181. package/lib/scraper-client.js +1 -0
  182. package/package.json +1 -1
  183. package/scripts/scrape.py +229 -5
  184. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h1_f_2._.js +0 -3
  185. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__19ip1qq._.js +0 -3
  186. package/.next/standalone/.next/server/chunks/ssr/_06w_gl4._.js +0 -3
  187. package/.next/standalone/.next/server/chunks/ssr/_13kzrwv._.js +0 -3
  188. package/.next/standalone/.next/server/chunks/ssr/_1hgd5dp._.js +0 -3
  189. package/.next/standalone/.next/server/chunks/ssr/node_modules_1f8t_rp._.js +0 -23
  190. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_server-async-storage_0t1dato.js +0 -3
  191. package/.next/standalone/.next/static/chunks/10784r7w7t5gw.js +0 -18
  192. package/.next/standalone/.next/static/chunks/18xu0fbgo_qz-.js +0 -1
  193. package/.next/standalone/.next/static/chunks/28bu26ausqzmn.js +0 -1
  194. package/.next/standalone/.next/static/chunks/2jz311xl1pp_8.js +0 -1
  195. package/.next/standalone/.next/static/chunks/2ot61qsv6_0eq.js +0 -1
  196. package/.next/standalone/.next/static/chunks/2pnbm1z6j7xab.js +0 -1
  197. package/.next/standalone/.next/static/chunks/3ol1xux1-ofm4.js +0 -6
  198. package/.next/standalone/.next/static/chunks/3zs_6-nn0dapb.js +0 -1
  199. package/.next/static/chunks/10784r7w7t5gw.js +0 -18
  200. package/.next/static/chunks/18xu0fbgo_qz-.js +0 -1
  201. package/.next/static/chunks/28bu26ausqzmn.js +0 -1
  202. package/.next/static/chunks/2jz311xl1pp_8.js +0 -1
  203. package/.next/static/chunks/2ot61qsv6_0eq.js +0 -1
  204. package/.next/static/chunks/2pnbm1z6j7xab.js +0 -1
  205. package/.next/static/chunks/3ol1xux1-ofm4.js +0 -6
  206. package/.next/static/chunks/3zs_6-nn0dapb.js +0 -1
  207. /package/.next/standalone/.next/static/{LlDgA9g8ToBkDLlo9Qtov → 814ehZBeFO2rUKle7mzX-}/_buildManifest.js +0 -0
  208. /package/.next/standalone/.next/static/{LlDgA9g8ToBkDLlo9Qtov → 814ehZBeFO2rUKle7mzX-}/_clientMiddlewareManifest.js +0 -0
  209. /package/.next/standalone/.next/static/{LlDgA9g8ToBkDLlo9Qtov → 814ehZBeFO2rUKle7mzX-}/_ssgManifest.js +0 -0
  210. /package/.next/static/{LlDgA9g8ToBkDLlo9Qtov → 814ehZBeFO2rUKle7mzX-}/_buildManifest.js +0 -0
  211. /package/.next/static/{LlDgA9g8ToBkDLlo9Qtov → 814ehZBeFO2rUKle7mzX-}/_clientMiddlewareManifest.js +0 -0
  212. /package/.next/static/{LlDgA9g8ToBkDLlo9Qtov → 814ehZBeFO2rUKle7mzX-}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:i}=(0,n.useUser)();return i&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:i?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},99201,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(19821),i=e.i(5258),o=e.i(48235);let l={height:10,borderRadius:6},s={background:"rgba(52,152,219,0.06)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(52,152,219,0.2)"};function a({degree1:e=[],degree2:n=[],skips:r=[]}){let c=function(e=[],t=[],n=[]){let r=(0,o.reachIndex)(e,t,{skips:n}),i=e=>{let t=(0,o.circleState)(e,r);return"scanned"===t?"mapped":t},l={mapped:0,hidden:0,todo:0},s={};for(let t of e){let e=i(t);l[e]+=1;let n=t.tier||"D";s[n]=s[n]||{mapped:0,hidden:0,todo:0,total:0},s[n][e]+=1,s[n].total+=1}let a=e.length,d=l.mapped+l.hidden;return{...l,total:a,resolved:d,percent:a?Math.round(d/a*100):0,batches:Math.ceil(l.todo/25),byTier:s}}(e,n,r);if(!c.total)return null;let u=e=>c.total?e/c.total*100:0,g=0===c.todo;return(0,t.jsxs)("div",{style:s,children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:10},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,margin:0,color:"#3498DB"},children:"2nd-degree mapping"}),(0,t.jsx)("span",{style:{fontSize:12,color:g?"#00ff88":"#8b9a9a",fontWeight:600},children:g?"Everything reachable is mapped":`${c.percent}%`})]}),(0,t.jsxs)("div",{style:{...l,display:"flex",overflow:"hidden",background:"rgba(255,255,255,0.06)"},children:[(0,t.jsx)("div",{style:{width:`${u(c.mapped)}%`,background:"#00ff88"}}),(0,t.jsx)("div",{style:{width:`${u(c.hidden)}%`,background:"rgba(255,255,255,0.22)"}})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:16,marginTop:10,fontSize:12,flexWrap:"wrap"},children:[(0,t.jsx)(d,{color:"#00ff88",label:"mapped",value:c.mapped}),(0,t.jsx)(d,{color:"rgba(255,255,255,0.35)",label:"hidden",value:c.hidden}),(0,t.jsx)(d,{color:"rgba(255,255,255,0.12)",label:"to go",value:c.todo}),(0,t.jsxs)("span",{style:{color:"#667",marginLeft:"auto"},children:["of ",c.total]})]}),c.hidden>0&&(0,t.jsx)("p",{style:{fontSize:11.5,color:"#667",margin:"10px 0 0",lineHeight:1.6},children:"Hidden means they keep their connections private — that will not change, and it does not count against you."}),!g&&(0,t.jsxs)("p",{style:{fontSize:11.5,color:"#8b9a9a",margin:"10px 0 0",lineHeight:1.6},children:[c.todo," left — about ",(0,t.jsxs)("b",{children:[c.batches," ",1===c.batches?"batch":"batches"]})," of ",25,". Run one, leave it a while, run another. Long unbroken runs are what gets an account restricted."]}),(0,t.jsx)("div",{style:{marginTop:16,display:"flex",flexDirection:"column",gap:7},children:["S","A","B","C","D"].filter(e=>c.byTier[e]?.total).map(e=>{let n=c.byTier[e];return(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,fontSize:11},children:[(0,t.jsx)("span",{style:{width:14,color:i.TIER_COLORS_CLASSIC[e],fontWeight:700},children:e}),(0,t.jsxs)("div",{style:{flex:1,height:5,borderRadius:3,display:"flex",overflow:"hidden",background:"rgba(255,255,255,0.06)"},children:[(0,t.jsx)("div",{style:{width:`${n.mapped/n.total*100}%`,background:i.TIER_COLORS_CLASSIC[e]}}),(0,t.jsx)("div",{style:{width:`${n.hidden/n.total*100}%`,background:"rgba(255,255,255,0.22)"}})]}),(0,t.jsxs)("span",{style:{color:"#667",width:62,textAlign:"right"},children:[n.mapped,"/",n.total]})]},e)})})]})}function d({color:e,label:n,value:r}){return(0,t.jsxs)("span",{style:{display:"flex",alignItems:"center",gap:6,color:"#8b9a9a"},children:[(0,t.jsx)("span",{style:{width:8,height:8,borderRadius:2,background:e}}),(0,t.jsx)("b",{style:{color:"#e2e8f0"},children:r})," ",n]})}var c=e.i(64745),u=e.i(2776),g=e.i(15812),h=e.i(69083),f=e.i(22016);let p={1:"Observer",11:"Connector",31:"Networker",51:"Strategist",76:"Architect"};function y(){let{userId:e,userName:i,userProfile:o}=(0,g.useUser)(),l=o||{name:i||"User",headline:"",sectors:[],goals:[]},[s,d]=(0,n.useState)(null),[u,y]=(0,n.useState)(!0),[b,x]=(0,n.useState)([]),[v,S]=(0,n.useState)({total:0,sent:0,accepted:0}),[j,w]=(0,n.useState)({degree1:[],degree2:[],skips:[]}),[k,C]=(0,n.useState)(null);if((0,n.useEffect)(()=>{!c.IS_DEMO&&e&&t();async function t(){fetch("/api/settings").then(e=>e.json().then(t=>e.ok&&t.settings?t:Promise.reject(Error(t.error)))).then(e=>C(e.settings.sectorFocus||{sectors:[],strength:"lean"})).catch(()=>C({failed:!0}));let t=await (0,r.loadNetwork)(e),n=t.degree1,i=t.degree2,o={S:0,A:0,B:0,C:0,D:0};n.forEach(e=>{o[e.tier]=(o[e.tier]||0)+1});let l={S:0,A:0,B:0,C:0,D:0};i.forEach(e=>{l[e.tier]=(l[e.tier]||0)+1});let s=[...new Set(i.map(e=>e.source_connection_id).filter(Boolean))].length,a=n.filter(e=>e.is_catalyst).length,c={};n.forEach(e=>{e.company&&(c[e.company]=(c[e.company]||0)+1)});let u=Object.entries(c).sort((e,t)=>t[1]-e[1]).slice(0,10),g=100*o.S+40*o.A+15*o.B+5*o.C+ +o.D+200*s+150*a+50*l.S+n.length,h=Math.floor(Math.sqrt(g/10)),f=h*h*10,p=(h+1)*(h+1)*10;d({d1Count:n.length,d2Count:i.length,tiers:o,d2Tiers:l,clusters:s,catalysts:a,networkPower:g,level:h,xpProgress:(g-f)/(p-f)*100,topCompanies:u,unlockedPaths:0}),fetch("/api/scraper").then(e=>e.json()).then(e=>w({degree1:n,degree2:i,skips:e.skips||[]})).catch(()=>w({degree1:n,degree2:i,skips:[]})),fetch(`/api/notifications?userId=${e}`).then(e=>e.json()).then(e=>x(e.notifications||[])).catch(()=>{}),fetch("/api/queue").then(e=>e.json()).then(e=>{let t=e.items||[];S({total:t.length,sent:t.filter(e=>"sent"===e.status).length,accepted:t.filter(e=>"accepted"===e.status).length})}).catch(()=>{}),y(!1)}},[e]),c.IS_DEMO)return(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"rgba(255,255,255,0.7)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,textAlign:"center",padding:24,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:[(0,t.jsx)("h2",{style:{margin:0,fontSize:20,fontWeight:700,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{margin:0,fontSize:13},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(f.default,{href:"/",style:{fontSize:12,color:"rgba(255,255,255,0.5)",textDecoration:"none"},children:"← Back to the network"})]});if(u)return(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff"},children:"Loading profile..."});let B={S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},I=[{label:"First S-Tier",done:s.tiers.S>0,icon:"👑"},{label:"100 Connections",done:s.d1Count>=100,icon:"🔗"},{label:"500 Connections",done:s.d1Count>=500,icon:"🌐"},{label:"First Cluster",done:s.clusters>0,icon:"🔭"},{label:"10 Clusters",done:s.clusters>=10,icon:"🏰"},{label:"50 S-Tier",done:s.tiers.S>=50,icon:"💎"},{label:"Catalyst Found",done:s.catalysts>0,icon:"⚡"},{label:"Level 25",done:s.level>=25,icon:"🎯"},{label:"Level 50",done:s.level>=50,icon:"🚀"},{label:"D2 S-Tier > 50",done:s.d2Tiers.S>=50,icon:"🌟"}];return(0,t.jsxs)("div",{style:{height:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:"1px solid rgba(255,255,255,0.1)",display:"flex",alignItems:"center",gap:16},children:[(0,t.jsxs)(f.default,{href:"/",style:{display:"flex",alignItems:"center",gap:6,color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:"1px solid rgba(255,255,255,0.1)"},children:[(0,t.jsx)("span",{style:{fontSize:16},children:"←"})," Back to Map"]}),(0,t.jsx)("h1",{style:{fontSize:22,fontWeight:700,margin:0,background:"linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Profile"})]}),(0,t.jsx)("div",{style:{flex:1,overflow:"auto",padding:"30px 20px"},children:(0,t.jsxs)("div",{style:{maxWidth:700,margin:"0 auto"},children:[(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.05)",borderRadius:16,padding:32,marginBottom:24,border:"1px solid rgba(255,215,0,0.2)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{width:100,height:100,borderRadius:"50%",margin:"0 auto 16px",background:"linear-gradient(135deg, #FFD700, #FF6B35)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:36,fontWeight:800,color:"#000",boxShadow:"0 0 30px rgba(255,215,0,0.3)"},children:s.level}),(0,t.jsx)("div",{style:{fontSize:24,fontWeight:700,marginBottom:4},children:l.name}),(0,t.jsx)("div",{style:{fontSize:14,color:"#888",marginBottom:4},children:l.headline}),(0,t.jsx)("div",{style:{display:"inline-block",padding:"4px 16px",borderRadius:20,background:"rgba(255,215,0,0.15)",border:"1px solid rgba(255,215,0,0.3)",color:"#FFD700",fontSize:13,fontWeight:700,marginBottom:16},children:function(e){let t="Observer";for(let[n,r]of Object.entries(p))e>=parseInt(n)&&(t=r);return t}(s.level)}),(0,t.jsxs)("div",{style:{maxWidth:300,margin:"0 auto"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",fontSize:10,color:"#666",marginBottom:4},children:[(0,t.jsxs)("span",{children:["Level ",s.level]}),(0,t.jsxs)("span",{children:["Level ",s.level+1]})]}),(0,t.jsx)("div",{style:{height:8,background:"rgba(255,255,255,0.1)",borderRadius:4},children:(0,t.jsx)("div",{style:{height:"100%",width:`${Math.min(s.xpProgress,100)}%`,background:"linear-gradient(90deg, #FFD700, #FF6B35)",borderRadius:4,transition:"width 1s ease"}})}),(0,t.jsxs)("div",{style:{fontSize:10,color:"#888",marginTop:4},children:["Network Power: ",s.networkPower.toLocaleString()]})]})]}),(0,t.jsx)(a,{degree1:j.degree1,degree2:j.degree2,skips:j.skips}),(0,t.jsxs)("div",{style:{background:"rgba(255,107,53,0.06)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,107,53,0.2)"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,margin:0,color:"#FF6B35"},children:"Queue Progress"}),(0,t.jsx)(f.default,{href:"/queue",style:{fontSize:11,color:"#FF6B35",textDecoration:"none",fontWeight:600},children:"View Queue →"})]}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:12},children:[(0,t.jsxs)("div",{style:{textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:"#FFA500"},children:v.total}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888"},children:"In Queue"})]}),(0,t.jsxs)("div",{style:{textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:"#3498DB"},children:v.sent}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888"},children:"Sent"})]}),(0,t.jsxs)("div",{style:{textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:"#00ff88"},children:v.accepted}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888"},children:"Accepted"})]})]})]}),b.length>0&&(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsxs)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:["Recent Activity (",b.filter(e=>!e.seen).length," new)"]}),(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:6,maxHeight:200,overflowY:"auto"},children:b.slice(0,10).map(e=>(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",padding:"6px 8px",borderRadius:6,background:e.seen?"transparent":"rgba(255,215,0,0.05)",borderLeft:e.seen?"none":"2px solid #FFD700"},children:[(0,t.jsx)("span",{style:{fontSize:16},children:e.icon||"📌"}),(0,t.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,t.jsx)("div",{style:{fontSize:12,fontWeight:600,color:e.seen?"#888":"#fff"},children:e.title}),e.message&&(0,t.jsx)("div",{style:{fontSize:10,color:"#666"},children:e.message})]}),(0,t.jsx)("span",{style:{fontSize:9,color:"#555",flexShrink:0},children:new Date(e.created_at).toLocaleDateString()})]},e.id))})]}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:12,marginBottom:24},children:[(0,t.jsx)(m,{label:"Connections",value:s.d1Count}),(0,t.jsx)(m,{label:"Degree-2 Reach",value:s.d2Count}),(0,t.jsx)(m,{label:"Clusters",value:s.clusters}),(0,t.jsx)(m,{label:"S-Tier",value:s.tiers.S,color:"#FFD700"}),(0,t.jsx)(m,{label:"A-Tier",value:s.tiers.A,color:"#9B59B6"}),(0,t.jsx)(m,{label:"Catalysts",value:s.catalysts,color:"#00ff88"})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:"Tier Distribution"}),["S","A","B","C","D"].map(e=>{let n=s.tiers[e]||0,r=s.d1Count>0?n/s.d1Count*100:0;return(0,t.jsxs)("div",{style:{marginBottom:8},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",fontSize:11,marginBottom:2},children:[(0,t.jsxs)("span",{style:{color:B[e],fontWeight:600},children:[e,"-Tier"]}),(0,t.jsxs)("span",{style:{color:"#888"},children:[n," (",r.toFixed(1),"%)"]})]}),(0,t.jsx)("div",{style:{height:6,background:"rgba(255,255,255,0.08)",borderRadius:3},children:(0,t.jsx)("div",{style:{height:"100%",width:`${r}%`,background:B[e],borderRadius:3}})})]},e)})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:"Degree-2 Reach"}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:12},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:24,fontWeight:700,color:"#FF6B35"},children:s.d2Count}),(0,t.jsx)("div",{style:{fontSize:11,color:"#888"},children:"People reachable via bridges"})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:24,fontWeight:700,color:"#FFD700"},children:s.d2Tiers.S}),(0,t.jsx)("div",{style:{fontSize:11,color:"#888"},children:"S-Tier degree-2"})]})]})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsxs)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:["Milestones (",I.filter(e=>e.done).length,"/",I.length,")"]}),(0,t.jsx)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:8},children:I.map((e,n)=>(0,t.jsxs)("div",{style:{padding:"8px 10px",borderRadius:8,fontSize:12,background:e.done?"rgba(255,215,0,0.08)":"rgba(255,255,255,0.02)",border:`1px solid ${e.done?"rgba(255,215,0,0.2)":"rgba(255,255,255,0.05)"}`,color:e.done?"#FFD700":"#555",display:"flex",alignItems:"center",gap:6},children:[(0,t.jsx)("span",{style:{fontSize:16},children:e.done?e.icon:"🔒"}),(0,t.jsx)("span",{style:{fontWeight:e.done?600:400},children:e.label})]},n))})]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,marginBottom:24,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,marginTop:0,marginBottom:12},children:"Top Companies in Your Network"}),s.topCompanies.map(([e,n],r)=>(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",padding:"4px 0",borderBottom:r<s.topCompanies.length-1?"1px solid rgba(255,255,255,0.04)":"none",fontSize:12},children:[(0,t.jsx)("span",{children:e}),(0,t.jsx)("span",{style:{color:"#888"},children:n})]},r))]}),(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:12,padding:20,border:"1px solid rgba(255,255,255,0.08)"},children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:12},children:[(0,t.jsx)("h3",{style:{fontSize:14,fontWeight:700,margin:0},children:"Your Sectors"}),(0,t.jsxs)(f.default,{href:"/scores#sector",style:{fontSize:11,color:"#3498DB",textDecoration:"none",fontWeight:600},children:[k?.sectors?.length?"Change":k&&!k.failed?"Pick on Scores":"Scores"," →"]})]}),k?k.failed?(0,t.jsx)("div",{style:{fontSize:12,color:"#ff7676"},children:"Couldn’t load your sectors. Reload this page, or open Settings to see them."}):k.sectors?.length?(0,t.jsxs)("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center"},children:[k.sectors.map(e=>{let n=(0,h.sectorByKey)(e);return(0,t.jsx)("span",{style:{padding:"4px 12px",borderRadius:20,fontSize:11,fontWeight:600,background:`${n.color}26`,border:`1px solid ${n.color}66`,color:n.color},children:n.label},e)}),(0,t.jsxs)("span",{style:{fontSize:11,color:"#888"},children:["strong"===k.strength?"Strong":"Lean",": companies here count for more in your scores."]})]}):(0,t.jsx)("div",{style:{fontSize:12,color:"#888"},children:"None picked. Pick up to three in Settings and companies in them count for more in your scores."}):(0,t.jsx)("div",{style:{fontSize:12,color:"#888"},children:"Loading…"})]})]})})]})}function m({label:e,value:n,color:r}){return(0,t.jsxs)("div",{style:{background:"rgba(255,255,255,0.04)",borderRadius:10,padding:"14px 12px",border:"1px solid rgba(255,255,255,0.08)",textAlign:"center"},children:[(0,t.jsx)("div",{style:{fontSize:22,fontWeight:700,color:r||"#fff"},children:n}),(0,t.jsx)("div",{style:{fontSize:10,color:"#888",marginTop:2},children:e})]})}e.s(["default",0,function(){return(0,t.jsx)(u.default,{children:(0,t.jsx)(y,{})})}],99201)},89154,e=>{"use strict";var t=e.i(90179);function n(e){let n=(0,t.readTitle)(e);return{key:n.key,label:n.label,level:n.level}}function r(e){return(0,t.currentCompany)(e)}let i=[{key:"defense",label:"Government, Defense & Aerospace",color:"#7f8c8d",words:/\b(government|federal|state of|county|city of|defen[cs]e|army|navy|air force|marine corps|military|dod|nasa|aerospace|lockheed|northrop|boeing|raytheon|l3harris|leidos|blue origin|spacex|public sector)\b/i},{key:"finance",label:"Finance & Investing",color:"#2ecc71",words:/\b(bank|banking|capital|ventures?|vc|investments?|investor|fund|private equity|growth equity|asset management|wealth|trading|trader|hedge|crypto|blockchain|web3|defi|fintech|stripe|coinbase|blackrock|robinhood|goldman|morgan stanley|jpmorgan|chase|bny|mellon|wells fargo|citi|citigroup|capital one|fidelity|vanguard|schwab|visa|mastercard|amex|american express|paypal|insurance|accounting|cpa|financial)\b/i},{key:"health",label:"Healthcare & Biotech",color:"#e74c3c",words:/\b(health|healthcare|medical|medicine|hospital|clinic|pharma|pharmaceutical|biotech|nurse|nursing|physician|doctor|dental|therapy|therapist|wellness)\b/i},{key:"education",label:"Education",color:"#f1c40f",words:/\b(university|college|school|education|student|professor|teacher|academy|phd|faculty|alumni)\b/i},{key:"media",label:"Marketing & Media",color:"#e67e22",words:/\b(marketing|brand|branding|advertising|agency|media|content|social media|creative|creator|influencer|pr|public relations|communications|tiktok|pinterest|youtube|growth marketing)\b/i},{key:"entertainment",label:"Entertainment & Gaming",color:"#9b59b6",words:/\b(entertainment|film|movie|music|records|gaming|games?|esports|studio|studios|netflix|disney|spotify|hollywood|theater|theatre|sports)\b/i},{key:"tech",label:"Tech, Software & AI",color:"#3498db",words:/\b(software|saas|engineer|engineering|developer|tech|technology|technologies|ai|artificial intelligence|machine learning|ml|data|cloud|cyber|security|devops|product manager|google|microsoft|apple|meta|amazon|nvidia|openai|anthropic|palantir|salesforce|oracle|ibm|intel|app|apps|startup|platform|labs?)\b/i},{key:"consulting",label:"Consulting, Legal & Services",color:"#1abc9c",words:/\b(consulting|consultant|consultancy|deloitte|accenture|mckinsey|kpmg|pwc|ey|bain|bcg|legal|law|lawyer|attorney|paralegal|recruiting|recruiter|staffing|talent)\b/i},{key:"realestate",label:"Real Estate & Construction",color:"#d35400",words:/\b(real estate|realtor|realty|property|properties|construction|architecture|architect|mortgage|homes|housing|builders?)\b/i},{key:"consumer",label:"Retail, Consumer & Hospitality",color:"#ff79c6",words:/\b(retail|e-?commerce|shopify|consumer|cpg|fashion|apparel|beauty|cosmetics|food|beverage|restaurant|hospitality|hotel|travel|tourism|coca-cola|nike|store|shop)\b/i},{key:"industry",label:"Manufacturing, Energy & Logistics",color:"#95a5a6",words:/\b(manufacturing|energy|oil|gas|solar|utilities|automotive|tesla|siemens|ge|general electric|honeywell|3m|logistics|supply chain|shipping|freight|fedex|ups|industrial|mining|chemicals?)\b/i},{key:"nonprofit",label:"Nonprofit & Community",color:"#bdc3c7",words:/\b(nonprofit|non-profit|foundation|charity|ngo|church|ministry|volunteer)\b/i}],o={key:"unknown",label:"Unclear",color:"#555c66"},l=Object.fromEntries([...i,o].map(e=>[e.key,e])),s=e=>l[e]||o;function a(e,t){for(let n of[e,t]){if(!n)continue;let e=i.find(e=>e.words.test(n));if(e)return e}return o}let d=(e,t)=>a(e,t).key,c=e=>n(e).level>=4;e.s(["INDUSTRIES",0,i,"UNKNOWN_INDUSTRY",0,o,"buildCompanyIndex",0,function(e=[]){let n=new Map,r=e=>(n.has(e)||n.set(e,(0,t.rolesWithCompanies)(e)),n.get(e)),{industries:i}=(0,t.networkCompanies)(e,{industryOf:d,rolesOf:r}),o=new Map;for(let t of e){let e=t.profile_url||`id:${t.id}`,n=o.get(e);(!n||(t.degree||9)<(n.degree||9))&&o.set(e,t)}let l=new Map;for(let e of o.values()){let t=r(e).find(e=>!e.former)?.company;if(!t)continue;let n=l.get(t);n||(n={name:t,people:[],d1:0,d2:0,d3:0,S:0,A:0,senior:0},l.set(t,n)),n.people.push(e),1===e.degree?n.d1++:2===e.degree?n.d2++:n.d3++,"S"===e.tier&&n.S++,"A"===e.tier&&n.A++,c(e.headline)&&n.senior++}for(let e of l.values())e.industry=s(i.get(e.name));return l},"companyLinks",0,function(e=[],t=[]){let n=new Map;for(let t of e){let e=r(t);e&&n.set(t.id,e)}let i=new Map;for(let e of t){let t=n.get(e.source_connection_id),o=r(e);if(!t||!o||t===o)continue;let[l,s]=t<o?[t,o]:[o,t],a=`${l}\u0000${s}`,d=i.get(a);d||(d={a:l,b:s,weight:0,via:new Set},i.set(a,d)),d.weight++,d.via.add(e.source_connection_id)}return[...i.values()]},"companyOf",0,r,"getSeniority",0,n,"industryByKey",0,s,"industryOf",0,a,"isSenior",0,c,"waysInto",0,function(e,t=[],n=[]){let i=t.filter(t=>r(t)===e),o=new Map;for(let t of n)r(t)===e&&o.set(t.source_connection_id,(o.get(t.source_connection_id)||0)+1);let l=new Map(t.map(e=>[e.id,e]));return{direct:i,bridges:[...o.entries()].map(([e,t])=>({bridge:l.get(e),n:t})).filter(e=>e.bridge).sort((e,t)=>t.n-e.n||(Number(t.bridge.power_score)||0)-(Number(e.bridge.power_score)||0))}}])},19821,e=>{"use strict";async function t(e){let t=e?`/api/network?userId=${encodeURIComponent(e)}`:"/api/network",n=await fetch(t);if(!n.ok)throw Error(`Failed to load network (${n.status})`);let r=await n.json();return{degree1:r.degree1||[],degree2:r.degree2||[],degree3:r.degree3||[]}}e.s(["loadNetwork",0,t])},36774,e=>{"use strict";let t=/^[A-Za-z0-9_-]+\.(webp|jpg|jpeg|png)$/,n="/avatars/";e.s(["localPhoto",0,function(e){return"string"==typeof e&&e.startsWith(n)&&t.test(e.slice(n.length))?e:null}])},48235,7214,e=>{"use strict";var t=e.i(36774);let n={S:0,A:1,B:2,C:3,D:4};function r(e){let t=parseFloat(e?.power_score);return Number.isFinite(t)?t:0}function i(e){return Math.round(10*r(e))/10}function o(e){return String(e?.profile_url||"").split(/[?#]/)[0].replace(/\/+$/,"")||`id:${e?.id}`}let l=(e,t)=>String(e??"").localeCompare(String(t??""),void 0,{numeric:!0});function s(e,t){return(n[e.tier]??9)-(n[t.tier]??9)||r(t)-r(e)||String(e.name||"").localeCompare(String(t.name||""))||l(e.id,t.id)}function a(e,t){return e.bridge&&t.bridge?s(e.bridge,t.bridge):e.bridge?-1:t.bridge?1:l(e.id,t.id)}function d(e,t){return t.score-e.score||t.waysIn-e.waysIn||a(e.routes[0]||c,t.routes[0]||c)||String(e.person.name||"").localeCompare(String(t.person.name||""))||(e.key<t.key?-1:+(e.key>t.key))}let c={id:null,bridge:null};function u(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return t.length<2?t[0]||"":`${t[0]} ${t[t.length-1].charAt(0)}.`}function g(e,t){let n=String(e||"");return t<=1?n?"…":"":n.length>t?`${n.slice(0,t-1)}…`:n}function h(e,t){return e?t.scanned.has(e.id)||e.profile_url&&t.read?.has(o(e))?"scanned":e.profile_url&&t.hidden.has(o(e))?"hidden":"todo":"todo"}function f(e,t){if(!e||1!==e.degree||null==e.unlocked_from_bridge_id)return null;let n=h(e,t);return"todo"===n?"ready":n}e.s(["TIERS",0,["S","A","B","C","D"],"compareBridges",0,s,"compareWaysIn",0,function(e,t){return t.waysIn-e.waysIn||d(e,t)},"keyFor",0,o,"routeIndex",0,function(e=[]){let t=new Map;for(let n of e||[]){let e=o(n),r=t.get(e);r||(r=new Set,t.set(e,r)),r.add(n.source_connection_id??null)}return t},"routesFor",0,function(e,t,n){return e?[...t?.get(o(e))??(null!=e.source_connection_id?new Set([e.source_connection_id]):new Set)].map(e=>({id:e,bridge:n?.get(e)??null})).sort(a):[]},"score",0,r,"score1",0,i,"separationPeople",0,function(e=[],n=[]){let r=new Map;for(let e of n||[])r.set(e.id,e);let s=new Map,c=new Map;for(let n of e||[]){let e=o(n);c.set(n.id,e);let r=s.get(e);r?function(e,n){let r=i(e)-i(n);if(r)return r>0;let o=!!(0,t.localPhoto)(e.profile_image_url);return!!(0,t.localPhoto)(n.profile_image_url)!==o?o:0>l(e.id,n.id)}(n,r.person)&&(r.person=n):(r={key:e,person:n,rowIds:[],routeIds:new Set},s.set(e,r)),r.rowIds.push(n.id),r.routeIds.add(n.source_connection_id??null)}let u={people:s.size,byTier:{S:0,A:0,B:0,C:0,D:0},multi:0,bridges:0,unresolvedIds:0,peopleOnlyUnresolved:0,onlyUnresolvedVia:0},g=new Set,h=new Set,f=new Set,p=[];for(let e of s.values()){let t=[...e.routeIds].map(e=>({id:e,bridge:r.get(e)??null}));t.sort(a);let n=t.filter(e=>e.bridge);for(let e of t)(e.bridge?g:h).add(e.id);if(!n.length)for(let e of(u.peopleOnlyUnresolved++,t))f.add(e.id);let{person:o}=e,l=o.tier;void 0!==u.byTier[l]&&u.byTier[l]++,t.length>1&&u.multi++,p.push({key:e.key,person:o,score:i(o),tier:l,routes:t,waysIn:t.length,rowIds:e.rowIds,haystack:[o.name,o.headline,o.company,o.role,...n.map(e=>e.bridge.name)].filter(Boolean).join("\n").toLowerCase(),rank:0,tied:!1})}return u.bridges=g.size,u.unresolvedIds=h.size,u.onlyUnresolvedVia=f.size,p.sort(d),function(e){for(let t=0;t<e.length;t++){let n=e[t],r=e[t-1],i=r&&r.score===n.score&&r.waysIn===n.waysIn;n.rank=i?r.rank:t+1,i&&(n.tied=!0,r.tied=!0)}}(p),{people:p,rowToKey:c,summary:u}},"shortName",0,u,"summitLayout",0,function(e=[],t=800,n=!1){let r=n?36:26,i=Math.round(.42*t),o=Math.round(.58*t),l=e.map((e,n)=>{var i;return{key:e.key,p:e,x:o,y:16+n*r,r:(i=e.waysIn)>=4?8.5:3===i?7:2===i?5.5:4,label:g(`#${e.rank}${e.tied?"=":""} ${e.person.name||""}`,Math.floor((t-o-60)/6.2))}}),a=new Map,d="\0unresolved";for(let e of l)for(let t of e.p.routes){let n=t.bridge?t.id:d,r=a.get(n);r||(r={id:t.bridge?t.id:null,bridge:t.bridge,unresolved:!t.bridge,ys:[],count:0},a.set(n,r)),r.count++,r.ys.push(e.y)}let c=[...a.values()].map(e=>({...e,bary:e.ys.reduce((e,t)=>e+t,0)/e.ys.length}));c.sort((e,t)=>e.bary-t.bary||e.unresolved-t.unresolved||(e.bridge&&t.bridge?s(e.bridge,t.bridge):0));let h=l.length?l[l.length-1].y:16,f=c.length>1?Math.max(18,(h-16)/(c.length-1)):0,p=Math.max(4,Math.floor((i-10-42)/6));c.forEach((e,t)=>{if(e.x=i,e.y=1===c.length?(16+h)/2:16+t*f,e.r=5,e.unresolved)e.label=g(`can't be named (${e.count})`,p);else{let t=e.bridge.name||"";e.label=t.length<=p?t:g(u(t),p)}delete e.ys});let y=new Map(c.map(e=>[e.unresolved?d:e.id,e])),m=[];for(let e of l){let t=new Set;e.p.routes.forEach((n,r)=>{let i=n.bridge?n.id:d;if(t.has(i))return;t.add(i);let o=y.get(i);m.push({key:e.key,bridgeId:o.id,primary:0===r&&!o.unresolved,unresolved:o.unresolved,tier:o.bridge?.tier??null,x1:o.x,y1:o.y,x2:e.x,y2:e.y})})}let b=Math.max(h,c.length?c[c.length-1].y:0),x=l.length?Math.ceil(b+16):0,v={x:20,y:l.length?(16+Math.max(h,b))/2:16,r:14},S=c.map(e=>({id:e.id,x1:v.x,y1:v.y,x2:e.x,y2:e.y}));return{width:t,height:x,you:v,people:l,bridges:c,links:m,spokes:S}}],7214),e.s(["circleScanCost",0,function(e=100){let t=Math.max(1,Math.min(100,Math.round(e)||100));return{profileViews:1,searches:t,minutes:t>=100?55:Math.max(5,Math.round(.55*t))}},"circleState",0,h,"reachIndex",0,function(e=[],t=[],n={}){let r=new Set;for(let e of t||[])e?.source_connection_id!=null&&r.add(e.source_connection_id);let i=new Set;for(let e of n?.skips||[])e?.profileUrl&&i.add(o({profile_url:e.profileUrl}));let l=new Set;for(let e of n?.read||[])e&&l.add(o({profile_url:e}));let s=new Map;for(let[e,t]of Object.entries(n?.lists||{}))e&&t&&s.set(o({profile_url:e}),t);let a=new Map;for(let t of e||[]){let e=t?.unlocked_from_bridge_id;if(null==e||1!==t.degree)continue;let n=a.get(e);n||a.set(e,n=[]),n.push(t)}return{scanned:r,read:l,hidden:i,reachedFrom:a,lists:s}},"reachState",0,f,"readyByCircle",0,function(e){let t=new Map;for(let[n,r]of e.reachedFrom){let i=r.filter(t=>"ready"===f(t,e)).length;i&&t.set(n,i)}return t},"readyToScan",0,function(e,t){return(e||[]).filter(e=>"ready"===f(e,t)).sort(s)},"scanBars",0,function(e,t){let n=h(e,t),r=e?.profile_url?t.lists?.get(o(e)):null;return"hidden"===n?null:r?r.more?r.total?Math.max(1,Math.min(4,Math.round(5*Math.min(1,10*r.pages/r.total)))):2:5:"scanned"===n?2:null}],48235)},69083,e=>{"use strict";var t=e.i(89154);let n=new Map(t.INDUSTRIES.map(e=>[e.key,e.color])),r=new Map([...t.INDUSTRIES.map(e=>[e.key,Object.freeze({key:e.key,label:e.label,color:e.color,group:e.key,kind:"industry"})]),...Object.entries({software:["Software & SaaS","tech","function"],"ai-data":["AI & Data","tech","function"],cybersecurity:["Cybersecurity","tech","function"],telecom:["Telecom","tech","industry"],fintech:["Fintech & Payments","finance","industry"],banking:["Banking & Lending","finance","industry"],"vc-pe":["Venture Capital & Private Equity","finance","industry"],wealth:["Wealth & Asset Management","finance","industry"],insurance:["Insurance","finance","industry"],accounting:["Accounting & Tax","finance","function"],crypto:["Crypto & Web3","finance","industry"],hospitals:["Hospitals & Clinics","health","industry"],dental:["Dental","health","industry"],"pharma-biotech":["Pharma & Biotech","health","industry"],"medical-devices":["Medical Devices","health","industry"],"mental-health":["Mental Health","health","industry"],"fitness-wellness":["Fitness & Wellness","health","industry"],veterinary:["Veterinary & Animal Care","health","industry"],k12:["K-12 Education","education","industry"],"higher-ed":["Higher Education","education","industry"],"marketing-advertising":["Marketing & Advertising","media","function"],"pr-comms":["PR & Communications","media","function"],"media-publishing":["Media & Publishing","media","industry"],"creator-economy":["Creator Economy","media","industry"],"film-tv-music":["Film, TV & Music","entertainment","industry"],"gaming-esports":["Gaming & Esports","entertainment","industry"],sports:["Sports","entertainment","industry"],"ecommerce-retail":["E-commerce & Retail","consumer","industry"],"consumer-goods":["Consumer Goods","consumer","industry"],restaurants:["Restaurants & Food Service","consumer","industry"],"hospitality-travel":["Hospitality & Travel","consumer","industry"],"beauty-personal-care":["Beauty & Personal Care","consumer","industry"],logistics:["Logistics & Supply Chain","industry","industry"],manufacturing:["Manufacturing","industry","industry"],energy:["Energy & Utilities","industry","industry"],automotive:["Automotive","industry","industry"],agriculture:["Agriculture & Farming","industry","industry"],"aerospace-defense":["Aerospace & Defense","defense","industry"],military:["Military","defense","industry"],government:["Government & Public Sector","defense","industry"],legal:["Legal","consulting","function"],"management-consulting":["Management Consulting","consulting","function"],"hr-recruiting":["HR & Recruiting","consulting","function"],"security-services":["Security Services","consulting","function"],"real-estate":["Real Estate","realestate","industry"],"construction-trades":["Construction & Trades","realestate","industry"],charities:["Nonprofits & Charities","nonprofit","industry"],"social-work":["Social Work & Human Services","nonprofit","industry"],faith:["Faith & Ministry","nonprofit","industry"]}).map(([e,[r,i,o]])=>[e,Object.freeze({key:e,label:r,color:n.get(i)||t.UNKNOWN_INDUSTRY.color,group:i,kind:o})])]);e.s(["sectorByKey",0,function(e){return r.get(e)||{key:e,label:t.UNKNOWN_INDUSTRY.label,color:t.UNKNOWN_INDUSTRY.color,group:null,kind:null}}])},5258,e=>{"use strict";e.s(["TIER_COLORS",0,{S:"#f6c344",A:"#a78bfa",B:"#60a5fa",C:"#94a3b8",D:"#6b7280"},"TIER_COLORS_CLASSIC",0,{S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},"TIER_ORDER",0,["S","A","B","C","D"],"TIER_RING_RADIUS",0,{S:150,A:230,B:310,C:390,D:470},"initialsFor",0,function(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return 0===t.length?"?":(t[0].charAt(0)+(t.length>1?t[t.length-1].charAt(0):"")).toUpperCase()}])}]);
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,94657,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(7837);let o=e=>`${e.name} ${e.was} → ${e.estimated?"estimated":e.now}`,i=e=>({padding:"6px 12px",borderRadius:7,cursor:"pointer",fontSize:12,fontWeight:700,border:e?"none":"1px solid rgba(255,255,255,0.15)",background:e?"linear-gradient(135deg, #00ff88, #3498DB)":"transparent",color:e?"#000":"#cfd8d8"});function s({onAnswered:e}){var a;let l,c,[u,d]=(0,n.useState)(null),[p,f]=(0,n.useState)(!1),[h,g]=(0,n.useState)(()=>new Set),[y,m]=(0,n.useState)(!1),[b,x]=(0,n.useState)(null);if((0,n.useEffect)(()=>{if((0,r.csvNetworkSource)())return;let e=!1;return fetch("/api/company-scores/legacy").then(e=>e.json()).then(t=>{!e&&t.offer?.companies?.length&&(d(t.offer),g(new Set(t.offer.companies.map(e=>e.name))))}).catch(()=>{}),()=>{e=!0}},[]),!u)return null;let w=async t=>{m(!0),x(null);try{let n=await fetch("/api/company-scores/legacy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({keep:t})}),r=await n.json();if(!n.ok&&!r.kept)throw Error(r.error||"Could not save your answer.");d(null),e?.({kept:r.kept||[],scored:r.scored||0,error:n.ok?null:r.error})}catch(e){x(e.message)}finally{m(!1)}};return(0,t.jsxs)("section",{"aria-label":"Built-in scores changed",style:{marginBottom:14,padding:14,borderRadius:10,border:"1px solid rgba(255,215,0,0.35)",background:"rgba(255,215,0,0.06)",fontSize:12.5,color:"#cfd8d8",lineHeight:1.6},children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"Built-in scores changed in this version:"})," ",(l=(a=u.companies).slice(0,3).map(o).join(", "),(c=a.length-3)>0?`${l} and ${c} more`:l),"."," ","Keep any of the old ones as your own?",(0,t.jsx)("div",{style:{marginTop:4,color:"#8b9a9a"},children:"The built-in list now holds only companies most professionals would recognise, scored the same for everyone; anything else is estimated from your network. A score you keep is yours, like one you set below, and Auto hands it back."}),p&&(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:"10px 0 0",display:"grid",gap:4},children:u.companies.map(e=>(0,t.jsx)("li",{children:(0,t.jsxs)("label",{style:{display:"flex",gap:8,alignItems:"baseline",cursor:"pointer"},children:[(0,t.jsx)("input",{type:"checkbox",checked:h.has(e.name),disabled:y,onChange:()=>{let t;return t=e.name,g(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})}}),(0,t.jsxs)("span",{children:[(0,t.jsx)("b",{style:{color:"#fff"},children:e.name})," ",e.was," → ",e.estimated?`estimated (${e.now})`:e.now,(0,t.jsxs)("span",{style:{color:"#778"},children:[` \xb7 ${e.people} ${1===e.people?"person":"people"} there now`,e.names.length>1&&` \xb7 for ${e.names.join(", ")}`]})]})]})},e.name))}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,marginTop:10,flexWrap:"wrap"},children:[p?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("button",{disabled:y||!h.size,onClick:()=>w([...h]),style:{...i(!0),opacity:y||!h.size?.5:1},children:["Keep ",h.size," ",1===h.size?"score":"scores"]}),(0,t.jsx)("button",{disabled:y,onClick:()=>f(!1),style:i(!1),children:"Back"})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{disabled:y,onClick:()=>w(u.companies.map(e=>e.name)),style:i(!0),children:"Keep all"}),(0,t.jsx)("button",{disabled:y,onClick:()=>f(!0),style:i(!1),children:"Choose…"})]}),(0,t.jsx)("button",{disabled:y,onClick:()=>w([]),style:i(!1),children:"No thanks"})]}),b&&(0,t.jsx)("div",{role:"alert",style:{marginTop:8,color:"#e74c3c"},children:b})]})}let a="1px solid rgba(255,255,255,0.1)",l={yours:{label:"your score",color:"#00ff88"},known:{label:"known list",color:"#3498DB"},data:{label:"public data",color:"#1abc9c"},network:{label:"estimated: many of your people",color:"#FF6B35"},default:{label:"unknown company",color:"#778"}};async function c(){let e=await fetch("/api/company-scores"),t=await e.json();if(!e.ok)throw Error(t.error||"Could not load company scores");return t.companies}function u(){let[e,t]=(0,n.useState)(null),[r,o]=(0,n.useState)(null);return(0,n.useEffect)(()=>{let e=!1;return c().then(n=>{e||t(n)}).catch(t=>{e||o(t.message)}),()=>{e=!0}},[]),{companies:e,error:r,setScore:(0,n.useCallback)(async(e,n)=>{let r=await fetch("/api/company-scores",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,score:n})}),o=await r.json();if(!r.ok)throw Error(o.error||"Could not save");return t(await c()),o},[]),reload:(0,n.useCallback)(async()=>t(await c()),[])}}function d({company:e,onSet:r,compact:o}){let[i,s]=(0,n.useState)(!1),l=async t=>{s(!0);try{await r(e.name,"auto"===t?null:Number(t))}finally{s(!1)}};return(0,t.jsxs)("select",{disabled:i,value:"yours"===e.source?String(e.score):"auto",onChange:e=>l(e.target.value),title:"Set this company's score. Auto uses the known list or an estimate.",style:{padding:o?"2px 4px":"4px 6px",borderRadius:6,border:a,background:"#11131c",color:"#dfe6e9",fontSize:12},children:[(0,t.jsxs)("option",{value:"auto",children:["Auto (","yours"===e.source?e.suggested??"est.":e.score,")"]}),[10,9,8,7,6,5,4,3,2,1].map(e=>(0,t.jsx)("option",{value:e,children:e},e))]})}e.s(["ScorePicker",0,d,"default",0,function({onRescored:e,version:r=0}){let{companies:o,error:i,setScore:c,reload:p}=u();(0,n.useEffect)(()=>{r&&p().catch(()=>{})},[r,p]);let[f,h]=(0,n.useState)(""),[g,y]=(0,n.useState)("all"),[m,b]=(0,n.useState)(150),[x,w]=(0,n.useState)(null),S=e=>{w(e),setTimeout(()=>w(null),3500)},v=async(t,n)=>{let r=await c(t,n);S(`${t}: ${null==n?"back to auto":`set to ${n}`} \xb7 rescored ${r.scored} people`),e?.()},k=async({kept:t,scored:n,error:r})=>{if(!t.length)return S("Keeping the new built-in scores.");S(r||`Kept ${t.length} old ${1===t.length?"score":"scores"} as your own \xb7 rescored ${n} people`),await p().catch(()=>{}),e?.()},j=(0,n.useMemo)(()=>{if(!o)return[];let e=f.trim().toLowerCase();return o.filter(t=>(!e||t.name.toLowerCase().includes(e))&&("all"===g||t.source===g))},[o,f,g]);if(i)return(0,t.jsx)("div",{style:{padding:24,color:"#e74c3c"},children:i});if(!o)return(0,t.jsx)("div",{style:{padding:24,color:"#778"},children:"Loading companies…"});let C=e=>o.filter(t=>t.source===e).length;return(0,t.jsxs)("div",{style:{flex:1,overflow:"auto",padding:16},children:[(0,t.jsxs)("div",{style:{maxWidth:980,margin:"0 auto"},children:[(0,t.jsx)(s,{onAnswered:k}),(0,t.jsxs)("div",{style:{padding:14,borderRadius:10,border:a,background:"rgba(255,255,255,0.03)",fontSize:12.5,color:"#cfd8d8",lineHeight:1.6},children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"How a power score works."})," power = ",(0,t.jsx)("b",{children:"title"})," × ",(0,t.jsx)("b",{children:"company weight"})," + bonus. The title (student 1 … founder or C-suite 10) comes from someone’s roles, with former roles at 70%; an audience of their own counts like a title (1M+ followers like a director). The company weight runs from 0.725 for a company we don’t know (or none found), the middle of the scale, to 1.0 (a company scored 10), so seniority counts for more at a bigger company. The bonus is at most +1.5, for investor, YC, an audience in the millions or the top award of any field, and counts half at an unknown company. A 1st-degree person whose circle is unusually strong gets up to +2 more: up to +1 for a high share of it at A or S, or +1 for every 25 people there. Tiers are graded on your network’s curve unless you choose the fixed scale (",(0,t.jsx)("a",{href:"#tiers",style:{color:"#3498DB"},children:"Tiers"}),", above): your top 3% are S, the next 12% A, the next 25% B (it only lifts, and never lifts anyone under 4 into S or A). On the fixed scale, S ≥ 7.5 · A ≥ 5.5 · B ≥ 4 · C ≥ 2.5.",(0,t.jsxs)("div",{style:{marginTop:6,color:"#8b9a9a"},children:["So a VP at a 10 scores 9.0, a founder at an unknown company 7.3, a director at an unknown company 5.4, and an intern at a 10 scores 2.0. Set a company’s score below and everyone there is rescored. Companies in the sectors you pick (",(0,t.jsx)("a",{href:"#sector",style:{color:"#3498DB"},children:"Your sector"}),", above) get +1 or +2; a score you set is never changed."]})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap",margin:"14px 0 10px"},children:[(0,t.jsx)("input",{value:f,onChange:e=>h(e.target.value),placeholder:"Find a company",style:{padding:"6px 10px",borderRadius:7,border:a,background:"rgba(255,255,255,0.05)",color:"#fff",fontSize:13,minWidth:180}}),[["all",`All ${o.length}`],["known",`Known list ${C("known")}`],["data",`Public data ${C("data")}`],["yours",`Yours ${C("yours")}`],["network",`Estimated ${C("network")}`],["default",`Unknown ${C("default")}`]].map(([e,n])=>(0,t.jsx)("button",{onClick:()=>y(e),style:{padding:"5px 10px",borderRadius:7,border:a,cursor:"pointer",fontSize:11.5,fontWeight:600,background:g===e?"rgba(52,152,219,0.25)":"transparent",color:g===e?"#cfe6f7":"#8b9a9a"},children:n},e))]}),(0,t.jsxs)("div",{style:{borderRadius:10,border:a,overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 70px 70px 70px 60px 180px 110px",gap:8,padding:"8px 12px",fontSize:10.5,letterSpacing:.6,color:"#8b9a9a",background:"rgba(255,255,255,0.04)"},children:[(0,t.jsx)("span",{children:"COMPANY"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"PEOPLE"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"YOU KNOW"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"DIRECTOR+"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"SCORE"}),(0,t.jsx)("span",{children:"SOURCE"}),(0,t.jsx)("span",{children:"SET"})]}),j.slice(0,m).map(e=>(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 70px 70px 70px 60px 180px 110px",gap:8,padding:"7px 12px",alignItems:"center",borderTop:"1px solid rgba(255,255,255,0.05)",fontSize:12.5},children:[(0,t.jsxs)("span",{style:{display:"flex",alignItems:"center",gap:8,minWidth:0},children:[(0,t.jsx)("span",{title:`${e.industry.label} (inferred)`,style:{width:8,height:8,borderRadius:"50%",background:e.industry.color,flexShrink:0}}),(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name})]}),(0,t.jsx)("span",{style:{textAlign:"right"},children:e.people}),(0,t.jsx)("span",{style:{textAlign:"right",color:e.d1?"#00ff88":"#556"},children:e.d1}),(0,t.jsx)("span",{style:{textAlign:"right",color:e.senior?"#FFD700":"#556"},children:e.senior}),(0,t.jsx)("b",{style:{textAlign:"right",fontSize:15},children:e.score}),(0,t.jsxs)("span",{style:{fontSize:11,color:l[e.source]?.color},children:[l[e.source]?.label,e.sectorBonus>0&&(0,t.jsxs)("span",{style:{color:"#00ff88"},children:[" + ",e.sectorBonus," your sector"]})]}),(0,t.jsx)(d,{company:e,onSet:v,compact:!0})]},e.name))]}),j.length>m&&(0,t.jsxs)("button",{onClick:()=>b(e=>e+300),style:{marginTop:10,padding:"7px 14px",borderRadius:8,border:a,background:"rgba(255,255,255,0.05)",color:"#dfe6e9",cursor:"pointer",fontSize:12},children:["Show more (",j.length-m," left)"]})]}),x&&(0,t.jsx)("div",{role:"status",style:{position:"fixed",bottom:24,left:"50%",transform:"translateX(-50%)",padding:"10px 18px",borderRadius:24,background:"linear-gradient(135deg, #00ff88, #3498DB)",color:"#000",fontWeight:800,fontSize:13,zIndex:50},children:x})]})},"useCompanyScores",0,u],94657)},2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:o}=(0,n.useUser)();return o&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:o?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},8819,e=>{"use strict";var t=e.i(43476);let n="1px solid rgba(255,255,255,0.1)";function r({children:e,style:n}){return(0,t.jsx)("div",{style:{fontSize:13.5,color:"#8b9a9a",lineHeight:1.6,marginTop:4,...n},children:e})}e.s(["Body",0,r,"Btn",0,function({children:e,onClick:r,disabled:o,primary:i,tone:s,type:a="button"}){return(0,t.jsx)("button",{type:a,onClick:r,disabled:o,style:{padding:"9px 18px",borderRadius:7,fontSize:13.5,fontWeight:650,color:o?"#667":"#fff",border:n,background:o?"rgba(255,255,255,0.05)":"bad"===s?"rgba(255,80,80,0.15)":i?"linear-gradient(135deg, #9B59B6, #3498DB)":"rgba(255,255,255,0.08)",cursor:o?"not-allowed":"pointer"},children:e})},"FONT",0,'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',"LINE",0,n,"Mono",0,function({children:e}){return(0,t.jsx)("code",{style:{background:"rgba(255,255,255,0.08)",padding:"1px 5px",borderRadius:4,wordBreak:"break-all"},children:e})},"Section",0,function({id:e,title:o,intro:i,children:s}){return(0,t.jsxs)("section",{id:e,style:{padding:"24px 0",borderBottom:n,scrollMarginTop:16},children:[(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:650,margin:"0 0 6px"},children:o}),i&&(0,t.jsx)(r,{style:{marginTop:0,marginBottom:12},children:i}),s]})},"Status",0,function({children:e,tone:n}){return(0,t.jsxs)("div",{role:"status",style:{marginTop:10,padding:"10px 14px",borderRadius:8,fontSize:13.5,lineHeight:1.6,color:"ok"===n?"#00ff88":"bad"===n?"#ff7676":"#e8e8ee",background:"ok"===n?"rgba(0,255,136,0.08)":"bad"===n?"rgba(255,80,80,0.08)":"rgba(255,255,255,0.05)",border:`1px solid ${"ok"===n?"rgba(0,255,136,0.3)":"bad"===n?"rgba(255,80,80,0.3)":"rgba(255,255,255,0.12)"}`},children:["ok"===n&&"✓ ",e]})}])},98083,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(22016),o=e.i(2776),i=e.i(8819),s=e.i(98197),a=e.i(44944),l=e.i(77170),c=e.i(69083),u=e.i(90179),d=e.i(5258),p=e.i(7837),f=e.i(56899);let h={lean:"Lean",strong:"Strong"},g=["wheel","touchstart","keydown","pointerdown"],y={1:"1st",2:"2nd",3:"3rd"},m=(e,t,n=`${t}s`)=>`${e.toLocaleString()} ${1===e?t:n}`,b=l.DIRECTORY.filter(e=>"function"===e.kind).map(e=>e.label);function x(e,t,n){let[r,o]=n?["moved","moved"]:["moves","move"];if(!e&&!t)return n?"No one changed tier.":"No one changes tier.";let i=e=>1===e?r:o;return e&&t?`${m(e,"person","people")} ${i(e)} up a tier and ${t.toLocaleString()} ${i(t)} down.`:e?`${m(e,"person","people")} ${i(e)} up a tier.`:`${m(t,"person","people")} ${i(t)} down a tier.`}function w({onSaved:e}={}){let[r,o]=(0,n.useState)(null),[l,d]=(0,n.useState)(null),[y,v]=(0,n.useState)(null),[k,j]=(0,n.useState)(!1),[C,T]=(0,n.useState)(null),[E,R]=(0,n.useState)(null),[O,A]=(0,n.useState)({loading:!0}),[$]=(0,n.useState)(()=>(0,p.csvNetworkSource)()),B=(0,n.useRef)(null),N=(0,n.useRef)(0),I=(0,n.useRef)(!1);function _(e){d(e),T(null),clearTimeout(B.current);let t=++N.current;if((0,a.sameFocus)(e,r))return void v(null);let n=(0,a.focusFingerprint)(e);v({key:n,loading:!0}),B.current=setTimeout(async()=>{try{let r=await fetch("/api/settings/sector-preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sectorFocus:e})}),o=await r.json();if(t!==N.current)return;v(r.ok?{key:n,...o}:{key:n,error:o.error||"Could not work out what would change."})}catch{t===N.current&&v({key:n,error:"Could not reach the app to work out what would change."})}},250)}async function P(){var t,n;let r;j(!0),T(null),clearTimeout(B.current),N.current++;let i=await (0,f.saveSettings)({sectorFocus:l});(j(!1),i.settings&&(o(i.settings.sectorFocus),d(i.settings.sectorFocus),v(null)),i.error)?T({tone:"bad",text:i.error}):(T({tone:"ok",text:(t=i.settings.sectorFocus,n=i.effects?.sectorFocus,r=t.sectors.length?`Saved: ${t.sectors.map(e=>(0,c.sectorByKey)(e).label).join(" · ")} (${h[t.strength].toLowerCase()}).`:"Saved: no sector.",n?n.scored?`${r} Rescored your network (${m(n.people??n.scored,"person","people")}). ${x(n.up,n.down,!0)}`:`${r} There's no scanned network yet; it will apply when you scan.`:r)}),e?.())}(0,n.useEffect)(()=>{let e=!1;return fetch("/api/settings").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load your sector.")))).then(t=>{if(e)return;let n=t.settings?.sectorFocus||{sectors:[],strength:"lean"};o(n),d(n)}).catch(t=>{e||R(t.message)}),fetch("/api/settings/sector-suggestions").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load suggestions.")))).then(t=>{e||A({scored:t.scored,list:t.suggestions||[]})}).catch(t=>{e||A({error:t.message})}),()=>{e=!0,clearTimeout(B.current)}},[]),(0,n.useEffect)(()=>{if(I.current||!l&&!E)return;I.current=!0;let e=document.getElementById("sector");if("#sector"!==window.location.hash||!e)return;let t=()=>e.scrollIntoView({block:"start"});t();let n=new ResizeObserver(t);n.observe(document.body);let r=()=>{for(let e of(n.disconnect(),clearTimeout(o),g))window.removeEventListener(e,r,!0)},o=setTimeout(r,2e3);for(let e of g)window.addEventListener(e,r,{capture:!0,passive:!0});return r},[l,E]);let D=l&&r&&!(0,a.sameFocus)(l,r);return(0,t.jsxs)(i.Section,{id:"sector",title:"Your sector",intro:"Pick up to three sectors you work in. Companies in them count for more when your network is scored, so the people there rank higher.",children:[E&&(0,t.jsx)(i.Status,{tone:"bad",children:E}),!l&&!E&&(0,t.jsx)(i.Body,{children:"Loading…"}),l&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.default,{sectors:l.sectors,onChange:e=>_({...l,sectors:e}),disabled:k,suggest:O}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:8,marginTop:14},children:[(0,t.jsx)("span",{style:{fontSize:13,color:"#8b9a9a"},children:"How much:"}),Object.keys(u.SECTOR_BONUS).map(e=>(0,t.jsxs)("button",{type:"button","aria-pressed":l.strength===e,disabled:k,onClick:()=>_({...l,strength:e}),style:{padding:"5px 12px",borderRadius:7,fontSize:12.5,fontWeight:600,cursor:"pointer",color:l.strength===e?"#fff":"#8b9a9a",background:l.strength===e?"rgba(52,152,219,0.25)":"transparent",border:i.LINE},children:[h[e]," · +",u.SECTOR_BONUS[e]]},e))]}),(0,t.jsx)(i.Body,{style:{fontSize:12.5},children:"Each company in your sectors gets +1 (lean) or +2 (strong) on its score out of 10, never above 10. A company in more than one of your picks still gets it once."}),(0,t.jsx)(S,{preview:D?y:null,draft:l}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,flexWrap:"wrap",marginTop:14},children:[(0,t.jsx)(i.Btn,{primary:!0,onClick:P,disabled:!D||k,children:k?"Saving and rescoring…":"Save"}),D&&!k&&(0,t.jsx)(i.Btn,{onClick:()=>_(r),children:"Cancel"}),!D&&l.sectors.length>0&&!k&&(0,t.jsx)(i.Btn,{onClick:()=>_({...l,sectors:[]}),children:"Turn off"})]}),C&&(0,t.jsx)(i.Status,{tone:C.tone,children:C.text}),(0,t.jsxs)("ul",{style:{margin:"16px 0 0",paddingLeft:18,fontSize:12.5,color:"#778",lineHeight:1.7},children:[(0,t.jsx)("li",{children:"Tiers rank how reachable someone is through your network, not the people themselves."}),(0,t.jsxs)("li",{children:["A company score you set on ",(0,t.jsx)("a",{href:"#companies",style:{color:"#3498DB"},children:"Company scores"}),", below, always wins. Your sector never changes it."]}),(0,t.jsx)("li",{children:"If you scan highest tier first, people in your sectors come up sooner. Scanning newest first, the default, doesn’t go by tier."}),(0,t.jsx)("li",{children:"An industry includes its sectors. It counts a company in any of its sectors (Healthcare & Biotech counts a practice that is only in Dental), and a company whose industry the app’s list of well-known companies or the company’s own name gives (Meridian Health). Not one known only from its people’s job titles: a recruiter at Acme Widgets doesn’t make Acme a consulting firm."}),(0,t.jsx)("li",{children:"A narrower sector counts a company when its name says so (Smith Family Dental), it’s a well-known company in that sector, or at least half of the people you know there say so in their headlines (dentist, DDS, orthodontist). The words are a fixed list that comes with the app, the same on every computer. Nothing is sent anywhere."}),(0,t.jsxs)("li",{children:["Some sectors are work every kind of company has: ",b.length>1?`${b.slice(0,-1).join(", ")} and ${b.at(-1)}`:b.join(""),". For those a job title doesn’t count, since a recruiter at Acme Widgets doesn’t make it a recruiting firm. The company’s name does (Acme Staffing, Smith CPA), and so does a kind of firm in a headline (staffing agency, law firm, SaaS)."]}),$&&(0,t.jsxs)("li",{style:{color:"#FFD700"},children:["sample"===$?"The sample network":"The CSV import"," open in this window isn’t changed by this, and isn’t counted in the suggestions. Your sector applies to networks you’ve scanned."]})]})]})]})}function S({preview:e,draft:n}){if(!e||e.key!==(0,a.focusFingerprint)(n))return null;let r={marginTop:12,padding:"10px 14px",borderRadius:8,fontSize:13,lineHeight:1.6,border:i.LINE,background:"rgba(255,255,255,0.03)",color:"#cfd8d8"};if(e.loading)return(0,t.jsx)("div",{style:r,"aria-live":"polite",children:"Working out what would change…"});if(e.error)return(0,t.jsx)(i.Status,{tone:"bad",children:e.error});if(!e.scored)return(0,t.jsx)("div",{style:r,"aria-live":"polite",children:"There’s no scanned network yet, so nothing changes now. Your choice applies once you scan."});let o=(e,t)=>`${m(e,"company","companies")} ${1===e?"scores":"score"} ${t}`,s=[e.companiesUp&&o(e.companiesUp,"higher"),e.companiesDown&&o(e.companiesDown,"lower")].filter(Boolean).join(" and ");return(0,t.jsxs)("div",{style:r,"aria-live":"polite",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"If you save:"})," ",s?`${s}.`:"No company changes score."," ",x(e.up,e.down,!1)]}),e.examples?.length>0&&(0,t.jsx)("div",{style:{marginTop:6,display:"flex",flexWrap:"wrap",gap:"4px 12px",fontSize:12.5},children:e.examples.map((e,n)=>(0,t.jsxs)("span",{title:e.company||void 0,children:[e.name,e.degree?(0,t.jsxs)("span",{style:{color:"#667"},children:[" (",y[e.degree]||`${e.degree}th`,")"]}):null," ",(0,t.jsx)("b",{style:{color:d.TIER_COLORS_CLASSIC[e.from]||"#889"},children:e.from||"–"})," → ",(0,t.jsx)("b",{style:{color:d.TIER_COLORS_CLASSIC[e.to]||"#889"},children:e.to})]},n))}),e.companyExamples?.length>0&&(0,t.jsx)("div",{style:{marginTop:4,fontSize:12,color:"#8b9a9a"},children:e.companyExamples.slice(0,3).map(e=>`${e.name} ${e.from} → ${e.to}`).join(" · ")})]})}let v=e=>`${Math.round(100*e)}%`,[k,j,C]=u.CURVE.map(([,e])=>e),T=[{key:"curve",label:"On your network's curve",note:`Your top ${v(k)} are S, the next ${v(j-k)} A and the next ${v(C-j)} B, so any network has a top, even one full of companies the app doesn't know. It only lifts: nobody drops a tier because their network is strong, and nobody under ${u.CURVE_FLOOR} is lifted into S or A.`},{key:"fixed",label:"On the fixed scale",note:"The same lines for everyone: S from 7.5, A from 5.5, B from 4, C from 2.5. Easy to compare from one network to another, but a network outside well-known companies has almost nobody in S or A."}];function E({onSaved:e}={}){let[r,o]=(0,n.useState)(null),[s,a]=(0,n.useState)(!1),[l,c]=(0,n.useState)(null),[u,d]=(0,n.useState)(null),[h]=(0,n.useState)(()=>(0,p.csvNetworkSource)());async function g(t){if(s||t===r)return;a(!0),c(null);let{settings:n,effects:i,error:l}=await (0,f.saveSettings)({tierScale:t});if(n&&o(n.tierScale),l)c({tone:"bad",text:l});else{let t,n=i?.tierScale;c({tone:"ok",text:n?`Saved. ${t=n.moved,`${t.toLocaleString()} ${1===t?"person":"people"}`} changed tier.`:"Saved."}),e?.()}a(!1)}return(0,n.useEffect)(()=>{let e=!1;return fetch("/api/settings").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load how tiers are graded.")))).then(t=>{e||o(t.settings?.tierScale||"curve")}).catch(t=>{e||d(t.message)}),()=>{e=!0}},[]),(0,t.jsxs)(i.Section,{id:"tiers",title:"Tiers",intro:"How the S to D rings are drawn. A tier says where someone sits in your network, not what they're worth.",children:[u&&(0,t.jsx)(i.Status,{tone:"bad",children:u}),r&&(0,t.jsx)("div",{role:"radiogroup","aria-label":"How tiers are graded",style:{display:"grid",gap:8},children:T.map(e=>{let n=r===e.key;return(0,t.jsxs)("button",{type:"button",role:"radio","aria-checked":n,disabled:s,onClick:()=>g(e.key),style:{textAlign:"left",padding:"12px 14px",borderRadius:8,cursor:s?"wait":n?"default":"pointer",color:"#fff",background:n?"rgba(155,89,182,0.14)":"rgba(255,255,255,0.03)",border:n?"1px solid rgba(155,89,182,0.6)":i.LINE},children:[(0,t.jsxs)("div",{style:{fontSize:14,fontWeight:650},children:[n?"● ":"○ ",e.label,"curve"===e.key?" (recommended)":""]}),(0,t.jsx)(i.Body,{style:{marginTop:4},children:e.note})]},e.key)})}),h&&(0,t.jsxs)(i.Body,{style:{color:"#FFD700",marginTop:10},children:["sample"===h?"The sample network open in this window keeps its own tiers (they’re the same either way).":"The CSV import open in this window is always graded on its own curve."," ","This applies to networks you’ve scanned."]}),l&&(0,t.jsx)(i.Status,{tone:l.tone,children:l.text})]})}var R=e.i(94657),O=e.i(64745);let A={color:"#3498DB",textDecoration:"none",fontWeight:600};function $(){let[e,o]=(0,n.useState)(0),s=()=>o(e=>e+1);return O.IS_DEMO?(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"rgba(255,255,255,0.7)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,textAlign:"center",padding:24,fontFamily:i.FONT},children:[(0,t.jsx)("h2",{style:{margin:0,fontSize:20,fontWeight:700,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{margin:0,fontSize:13},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(r.default,{href:"/",style:{fontSize:12,color:"rgba(255,255,255,0.5)",textDecoration:"none"},children:"← Back to the network"})]}):(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:i.FONT},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:i.LINE,display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)(r.default,{href:"/",style:{display:"flex",alignItems:"center",gap:6,color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:i.LINE},children:"← Back to Map"}),(0,t.jsx)("h1",{style:{fontSize:22,fontWeight:700,margin:0,background:"linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Scores"})]}),(0,t.jsxs)("main",{style:{maxWidth:980,margin:"0 auto",padding:"8px 24px 64px"},children:[(0,t.jsxs)(i.Body,{style:{marginTop:16},children:["How someone’s power score is worked out, and the three things you can change about it:"," ",(0,t.jsx)("a",{href:"#sector",style:A,children:"your field"}),", ",(0,t.jsx)("a",{href:"#tiers",style:A,children:"how tiers are graded"})," and"," ",(0,t.jsx)("a",{href:"#companies",style:A,children:"any company’s score"}),". A change here rescores everyone."]}),(0,t.jsx)(w,{onSaved:s}),(0,t.jsx)(E,{onSaved:s}),(0,t.jsx)("div",{id:"companies",style:{marginTop:28},children:(0,t.jsx)(R.default,{version:e})})]})]})}e.s(["default",0,function(){return(0,t.jsx)(o.default,{children:(0,t.jsx)($,{})})}],98083)},89154,e=>{"use strict";var t=e.i(90179);function n(e){let n=(0,t.readTitle)(e);return{key:n.key,label:n.label,level:n.level}}function r(e){return(0,t.currentCompany)(e)}let o=[{key:"defense",label:"Government, Defense & Aerospace",color:"#7f8c8d",words:/\b(government|federal|state of|county|city of|defen[cs]e|army|navy|air force|marine corps|military|dod|nasa|aerospace|lockheed|northrop|boeing|raytheon|l3harris|leidos|blue origin|spacex|public sector)\b/i},{key:"finance",label:"Finance & Investing",color:"#2ecc71",words:/\b(bank|banking|capital|ventures?|vc|investments?|investor|fund|private equity|growth equity|asset management|wealth|trading|trader|hedge|crypto|blockchain|web3|defi|fintech|stripe|coinbase|blackrock|robinhood|goldman|morgan stanley|jpmorgan|chase|bny|mellon|wells fargo|citi|citigroup|capital one|fidelity|vanguard|schwab|visa|mastercard|amex|american express|paypal|insurance|accounting|cpa|financial)\b/i},{key:"health",label:"Healthcare & Biotech",color:"#e74c3c",words:/\b(health|healthcare|medical|medicine|hospital|clinic|pharma|pharmaceutical|biotech|nurse|nursing|physician|doctor|dental|therapy|therapist|wellness)\b/i},{key:"education",label:"Education",color:"#f1c40f",words:/\b(university|college|school|education|student|professor|teacher|academy|phd|faculty|alumni)\b/i},{key:"media",label:"Marketing & Media",color:"#e67e22",words:/\b(marketing|brand|branding|advertising|agency|media|content|social media|creative|creator|influencer|pr|public relations|communications|tiktok|pinterest|youtube|growth marketing)\b/i},{key:"entertainment",label:"Entertainment & Gaming",color:"#9b59b6",words:/\b(entertainment|film|movie|music|records|gaming|games?|esports|studio|studios|netflix|disney|spotify|hollywood|theater|theatre|sports)\b/i},{key:"tech",label:"Tech, Software & AI",color:"#3498db",words:/\b(software|saas|engineer|engineering|developer|tech|technology|technologies|ai|artificial intelligence|machine learning|ml|data|cloud|cyber|security|devops|product manager|google|microsoft|apple|meta|amazon|nvidia|openai|anthropic|palantir|salesforce|oracle|ibm|intel|app|apps|startup|platform|labs?)\b/i},{key:"consulting",label:"Consulting, Legal & Services",color:"#1abc9c",words:/\b(consulting|consultant|consultancy|deloitte|accenture|mckinsey|kpmg|pwc|ey|bain|bcg|legal|law|lawyer|attorney|paralegal|recruiting|recruiter|staffing|talent)\b/i},{key:"realestate",label:"Real Estate & Construction",color:"#d35400",words:/\b(real estate|realtor|realty|property|properties|construction|architecture|architect|mortgage|homes|housing|builders?)\b/i},{key:"consumer",label:"Retail, Consumer & Hospitality",color:"#ff79c6",words:/\b(retail|e-?commerce|shopify|consumer|cpg|fashion|apparel|beauty|cosmetics|food|beverage|restaurant|hospitality|hotel|travel|tourism|coca-cola|nike|store|shop)\b/i},{key:"industry",label:"Manufacturing, Energy & Logistics",color:"#95a5a6",words:/\b(manufacturing|energy|oil|gas|solar|utilities|automotive|tesla|siemens|ge|general electric|honeywell|3m|logistics|supply chain|shipping|freight|fedex|ups|industrial|mining|chemicals?)\b/i},{key:"nonprofit",label:"Nonprofit & Community",color:"#bdc3c7",words:/\b(nonprofit|non-profit|foundation|charity|ngo|church|ministry|volunteer)\b/i}],i={key:"unknown",label:"Unclear",color:"#555c66"},s=Object.fromEntries([...o,i].map(e=>[e.key,e])),a=e=>s[e]||i;function l(e,t){for(let n of[e,t]){if(!n)continue;let e=o.find(e=>e.words.test(n));if(e)return e}return i}let c=(e,t)=>l(e,t).key,u=e=>n(e).level>=4;e.s(["INDUSTRIES",0,o,"UNKNOWN_INDUSTRY",0,i,"buildCompanyIndex",0,function(e=[]){let n=new Map,r=e=>(n.has(e)||n.set(e,(0,t.rolesWithCompanies)(e)),n.get(e)),{industries:o}=(0,t.networkCompanies)(e,{industryOf:c,rolesOf:r}),i=new Map;for(let t of e){let e=t.profile_url||`id:${t.id}`,n=i.get(e);(!n||(t.degree||9)<(n.degree||9))&&i.set(e,t)}let s=new Map;for(let e of i.values()){let t=r(e).find(e=>!e.former)?.company;if(!t)continue;let n=s.get(t);n||(n={name:t,people:[],d1:0,d2:0,d3:0,S:0,A:0,senior:0},s.set(t,n)),n.people.push(e),1===e.degree?n.d1++:2===e.degree?n.d2++:n.d3++,"S"===e.tier&&n.S++,"A"===e.tier&&n.A++,u(e.headline)&&n.senior++}for(let e of s.values())e.industry=a(o.get(e.name));return s},"companyLinks",0,function(e=[],t=[]){let n=new Map;for(let t of e){let e=r(t);e&&n.set(t.id,e)}let o=new Map;for(let e of t){let t=n.get(e.source_connection_id),i=r(e);if(!t||!i||t===i)continue;let[s,a]=t<i?[t,i]:[i,t],l=`${s}\u0000${a}`,c=o.get(l);c||(c={a:s,b:a,weight:0,via:new Set},o.set(l,c)),c.weight++,c.via.add(e.source_connection_id)}return[...o.values()]},"companyOf",0,r,"getSeniority",0,n,"industryByKey",0,a,"industryOf",0,l,"isSenior",0,u,"waysInto",0,function(e,t=[],n=[]){let o=t.filter(t=>r(t)===e),i=new Map;for(let t of n)r(t)===e&&i.set(t.source_connection_id,(i.get(t.source_connection_id)||0)+1);let s=new Map(t.map(e=>[e.id,e]));return{direct:o,bridges:[...i.entries()].map(([e,t])=>({bridge:s.get(e),n:t})).filter(e=>e.bridge).sort((e,t)=>t.n-e.n||(Number(t.bridge.power_score)||0)-(Number(e.bridge.power_score)||0))}}])},69083,e=>{"use strict";var t=e.i(89154);let n=new Map(t.INDUSTRIES.map(e=>[e.key,e.color])),r=new Map([...t.INDUSTRIES.map(e=>[e.key,Object.freeze({key:e.key,label:e.label,color:e.color,group:e.key,kind:"industry"})]),...Object.entries({software:["Software & SaaS","tech","function"],"ai-data":["AI & Data","tech","function"],cybersecurity:["Cybersecurity","tech","function"],telecom:["Telecom","tech","industry"],fintech:["Fintech & Payments","finance","industry"],banking:["Banking & Lending","finance","industry"],"vc-pe":["Venture Capital & Private Equity","finance","industry"],wealth:["Wealth & Asset Management","finance","industry"],insurance:["Insurance","finance","industry"],accounting:["Accounting & Tax","finance","function"],crypto:["Crypto & Web3","finance","industry"],hospitals:["Hospitals & Clinics","health","industry"],dental:["Dental","health","industry"],"pharma-biotech":["Pharma & Biotech","health","industry"],"medical-devices":["Medical Devices","health","industry"],"mental-health":["Mental Health","health","industry"],"fitness-wellness":["Fitness & Wellness","health","industry"],veterinary:["Veterinary & Animal Care","health","industry"],k12:["K-12 Education","education","industry"],"higher-ed":["Higher Education","education","industry"],"marketing-advertising":["Marketing & Advertising","media","function"],"pr-comms":["PR & Communications","media","function"],"media-publishing":["Media & Publishing","media","industry"],"creator-economy":["Creator Economy","media","industry"],"film-tv-music":["Film, TV & Music","entertainment","industry"],"gaming-esports":["Gaming & Esports","entertainment","industry"],sports:["Sports","entertainment","industry"],"ecommerce-retail":["E-commerce & Retail","consumer","industry"],"consumer-goods":["Consumer Goods","consumer","industry"],restaurants:["Restaurants & Food Service","consumer","industry"],"hospitality-travel":["Hospitality & Travel","consumer","industry"],"beauty-personal-care":["Beauty & Personal Care","consumer","industry"],logistics:["Logistics & Supply Chain","industry","industry"],manufacturing:["Manufacturing","industry","industry"],energy:["Energy & Utilities","industry","industry"],automotive:["Automotive","industry","industry"],agriculture:["Agriculture & Farming","industry","industry"],"aerospace-defense":["Aerospace & Defense","defense","industry"],military:["Military","defense","industry"],government:["Government & Public Sector","defense","industry"],legal:["Legal","consulting","function"],"management-consulting":["Management Consulting","consulting","function"],"hr-recruiting":["HR & Recruiting","consulting","function"],"security-services":["Security Services","consulting","function"],"real-estate":["Real Estate","realestate","industry"],"construction-trades":["Construction & Trades","realestate","industry"],charities:["Nonprofits & Charities","nonprofit","industry"],"social-work":["Social Work & Human Services","nonprofit","industry"],faith:["Faith & Ministry","nonprofit","industry"]}).map(([e,[r,o,i]])=>[e,Object.freeze({key:e,label:r,color:n.get(o)||t.UNKNOWN_INDUSTRY.color,group:o,kind:i})])]);e.s(["sectorByKey",0,function(e){return r.get(e)||{key:e,label:t.UNKNOWN_INDUSTRY.label,color:t.UNKNOWN_INDUSTRY.color,group:null,kind:null}}])},5258,e=>{"use strict";e.s(["TIER_COLORS",0,{S:"#f6c344",A:"#a78bfa",B:"#60a5fa",C:"#94a3b8",D:"#6b7280"},"TIER_COLORS_CLASSIC",0,{S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},"TIER_ORDER",0,["S","A","B","C","D"],"TIER_RING_RADIUS",0,{S:150,A:230,B:310,C:390,D:470},"initialsFor",0,function(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return 0===t.length?"?":(t[0].charAt(0)+(t.length>1?t[t.length-1].charAt(0):"")).toUpperCase()}])},22016,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={default:function(){return m},useLinkStatus:function(){return x}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=e.r(90809),s=e.r(43476),a=i._(e.r(71645)),l=e.r(95057),c=e.r(8372),u=e.r(18581),d=e.r(18967),p=e.r(5550),f=e.r(88540),h=e.r(91949),g=e.r(73668),y=e.r(9396);function m(t){var n;let r,o,i,[m,x]=(0,a.useOptimistic)(h.IDLE_LINK_STATUS),w=(0,a.useRef)(null),{href:S,as:v,children:k,prefetch:j=null,passHref:C,replace:T,shallow:E,scroll:R,onClick:O,onMouseEnter:A,onTouchStart:$,legacyBehavior:B=!1,onNavigate:N,transitionTypes:I,ref:_,unstable_dynamicOnHover:P,...D}=t;r=k,B&&("string"==typeof r||"number"==typeof r)&&(r=(0,s.jsx)("a",{children:r}));let F=a.default.useContext(c.AppRouterContext),L=!1!==j,M=!1===j?"none":!0===j?"full":"auto",z="none"!==M?"auto"===M?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,U="string"==typeof(n=v||S)?n:(0,l.formatUrl)(n);if(B){if(r?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=a.default.Children.only(r)}let W=B?o&&"object"==typeof o&&o.ref:_,H,K=a.default.useCallback(e=>(null!==F&&(w.current=(0,h.mountLinkInstance)(e,U,F,z,L,x,H)),()=>{w.current&&((0,h.unmountLinkForCurrentNavigation)(w.current),w.current=null),(0,h.unmountPrefetchableInstance)(e)}),[L,U,F,z,x,H]),Y={ref:(0,u.useMergedRef)(K,W),onClick(t){B||"function"!=typeof O||O(t),B&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!F||t.defaultPrevented||function(t,n,r,o,i,s,l,c="none"){if("u">typeof window){let u,{nodeName:d}=t.currentTarget;if("A"===d.toUpperCase()&&((u=t.currentTarget.getAttribute("target"))&&"_self"!==u||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(n)){o&&(t.preventDefault(),location.replace(n));return}if(t.preventDefault(),s){let e=!1;if(s({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:p}=e.r(99781);a.default.startTransition(()=>{p(n,o?"replace":"push",!1===i?f.ScrollBehavior.NoScroll:f.ScrollBehavior.Default,r.current,l,c)})}}(t,U,w,T,R,N,I,M)},onMouseEnter(e){B||"function"!=typeof A||A(e),B&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),F&&L&&(0,h.onNavigationIntent)(e.currentTarget,!0===P)},onTouchStart:function(e){B||"function"!=typeof $||$(e),B&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),F&&L&&(0,h.onNavigationIntent)(e.currentTarget,!0===P)}};return(0,d.isAbsoluteUrl)(U)?Y.href=U:B&&!C&&("a"!==o.type||"href"in o.props)||(Y.href=(0,p.addBasePath)(U)),i=B?a.default.cloneElement(o,Y):(0,s.jsx)("a",{...D,...Y,children:r}),(0,s.jsx)(b.Provider,{value:m,children:i})}let b=(0,a.createContext)(h.IDLE_LINK_STATUS),x=()=>(0,a.useContext)(b);("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18581,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"useMergedRef",{enumerable:!0,get:function(){return o}});let r=e.r(71645);function o(e,t){let n=(0,r.useRef)(null),o=(0,r.useRef)(null);return(0,r.useCallback)(r=>{if(null===r){let e=n.current;e&&(n.current=null,e());let t=o.current;t&&(o.current=null,t())}else e&&(n.current=i(e,r)),t&&(o.current=i(t,r))},[e,t])}function i(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let n=e(t);return"function"==typeof n?n:()=>e(null)}}("function"==typeof n.default||"object"==typeof n.default&&null!==n.default)&&void 0===n.default.__esModule&&(Object.defineProperty(n.default,"__esModule",{value:!0}),Object.assign(n.default,n),t.exports=n.default)},18967,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={DecodeError:function(){return m},MiddlewareNotFoundError:function(){return S},MissingStaticPage:function(){return w},NormalizeError:function(){return b},PageNotFoundError:function(){return x},SP:function(){return g},ST:function(){return y},WEB_VITALS:function(){return i},execOnce:function(){return s},getDisplayName:function(){return d},getLocationOrigin:function(){return c},getURL:function(){return u},isAbsoluteUrl:function(){return l},isResSent:function(){return p},loadGetInitialProps:function(){return h},normalizeRepeatedSlashes:function(){return f},stringifyError:function(){return v}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=["CLS","FCP","FID","INP","LCP","TTFB"];function s(e){let t,n=!1;return(...r)=>(n||(n=!0,t=e(...r)),t)}let a=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,l=e=>{let t=e.charCodeAt(0);return!!(t>=65&&t<=90||t>=97&&t<=122)&&a.test(e)};function c(){let{protocol:e,hostname:t,port:n}=window.location;return`${e}//${t}${n?":"+n:""}`}function u(){let{href:e}=window.location,t=c();return e.substring(t.length)}function d(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function p(e){return e.finished||e.headersSent}function f(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?`?${t.slice(1).join("?")}`:"")}async function h(e,t){let n=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await h(t.Component,t.ctx)}:{};let r=await e.getInitialProps(t);if(n&&p(n))return r;if(!r)throw Object.defineProperty(Error(`"${d(e)}.getInitialProps()" should resolve to an object. But found "${r}" instead.`),"__NEXT_ERROR_CODE",{value:"E1025",enumerable:!1,configurable:!0});return r}let g="u">typeof performance,y=g&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class m extends Error{}class b extends Error{}class x extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message=`Cannot find module for page: ${e}`}}class w extends Error{constructor(e,t){super(),this.message=`Failed to load static file for page: ${e} ${t}`}}class S extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function v(e){return JSON.stringify({message:e.message,stack:e.stack})}},73668,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"isLocalURL",{enumerable:!0,get:function(){return i}});let r=e.r(18967),o=e.r(52817);function i(e){if(!(0,r.isAbsoluteUrl)(e))return!0;try{let t=(0,r.getLocationOrigin)(),n=new URL(e,t);return n.origin===t&&(0,o.hasBasePath)(n.pathname)}catch(e){return!1}}},98183,(e,t,n)=>{"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r={assign:function(){return l},searchParamsToUrlQuery:function(){return i},urlQueryToSearchParams:function(){return a}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});function i(e){let t={};for(let[n,r]of e.entries()){let e=t[n];void 0===e?t[n]=r:Array.isArray(e)?e.push(r):t[n]=[e,r]}return t}function s(e){return"string"==typeof e?e:("number"!=typeof e||isNaN(e))&&"boolean"!=typeof e?"":String(e)}function a(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(Array.isArray(r))for(let e of r)t.append(n,s(e));else t.set(n,s(r));return t}function l(e,...t){for(let n of t){for(let t of n.keys())e.delete(t);for(let[t,r]of n.entries())e.append(t,r)}return e}},95057,(e,t,n)=>{"use strict";e.i(47167),Object.defineProperty(n,"__esModule",{value:!0});var r={formatUrl:function(){return a},formatWithValidation:function(){return c},urlObjectKeys:function(){return l}};for(var o in r)Object.defineProperty(n,o,{enumerable:!0,get:r[o]});let i=e.r(90809)._(e.r(98183)),s=/https?|ftp|gopher|file/;function a(e){let{auth:t,hostname:n}=e,r=e.protocol||"",o=e.pathname||"",a=e.hash||"",l=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:n&&(c=t+(~n.indexOf(":")?`[${n}]`:n),e.port&&(c+=":"+e.port)),l&&"object"==typeof l&&(l=String(i.urlQueryToSearchParams(l)));let u=e.search||l&&`?${l}`||"";return r&&!r.endsWith(":")&&(r+=":"),e.slashes||(!r||s.test(r))&&!1!==c?(c="//"+(c||""),o&&"/"!==o[0]&&(o="/"+o)):c||(c=""),a&&"#"!==a[0]&&(a="#"+a),u&&"?"!==u[0]&&(u="?"+u),o=o.replace(/[?#]/g,encodeURIComponent),u=u.replace("#","%23"),`${r}${c}${o}${u}${a}`}let l=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return a(e)}}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,94657,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(7837);let o=e=>`${e.name} ${e.was} → ${e.estimated?"estimated":e.now}`,i=e=>({padding:"6px 12px",borderRadius:7,cursor:"pointer",fontSize:12,fontWeight:700,border:e?"none":"1px solid rgba(255,255,255,0.15)",background:e?"linear-gradient(135deg, #00ff88, #3498DB)":"transparent",color:e?"#000":"#cfd8d8"});function s({onAnswered:e}){var a;let l,c,[d,u]=(0,n.useState)(null),[p,h]=(0,n.useState)(!1),[g,y]=(0,n.useState)(()=>new Set),[f,m]=(0,n.useState)(!1),[b,x]=(0,n.useState)(null);if((0,n.useEffect)(()=>{if((0,r.csvNetworkSource)())return;let e=!1;return fetch("/api/company-scores/legacy").then(e=>e.json()).then(t=>{!e&&t.offer?.companies?.length&&(u(t.offer),y(new Set(t.offer.companies.map(e=>e.name))))}).catch(()=>{}),()=>{e=!0}},[]),!d)return null;let w=async t=>{m(!0),x(null);try{let n=await fetch("/api/company-scores/legacy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({keep:t})}),r=await n.json();if(!n.ok&&!r.kept)throw Error(r.error||"Could not save your answer.");u(null),e?.({kept:r.kept||[],scored:r.scored||0,error:n.ok?null:r.error})}catch(e){x(e.message)}finally{m(!1)}};return(0,t.jsxs)("section",{"aria-label":"Built-in scores changed",style:{marginBottom:14,padding:14,borderRadius:10,border:"1px solid rgba(255,215,0,0.35)",background:"rgba(255,215,0,0.06)",fontSize:12.5,color:"#cfd8d8",lineHeight:1.6},children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"Built-in scores changed in this version:"})," ",(l=(a=d.companies).slice(0,3).map(o).join(", "),(c=a.length-3)>0?`${l} and ${c} more`:l),"."," ","Keep any of the old ones as your own?",(0,t.jsx)("div",{style:{marginTop:4,color:"#8b9a9a"},children:"The built-in list now holds only companies most professionals would recognise, scored the same for everyone; anything else is estimated from your network. A score you keep is yours, like one you set below, and Auto hands it back."}),p&&(0,t.jsx)("ul",{style:{listStyle:"none",padding:0,margin:"10px 0 0",display:"grid",gap:4},children:d.companies.map(e=>(0,t.jsx)("li",{children:(0,t.jsxs)("label",{style:{display:"flex",gap:8,alignItems:"baseline",cursor:"pointer"},children:[(0,t.jsx)("input",{type:"checkbox",checked:g.has(e.name),disabled:f,onChange:()=>{let t;return t=e.name,y(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})}}),(0,t.jsxs)("span",{children:[(0,t.jsx)("b",{style:{color:"#fff"},children:e.name})," ",e.was," → ",e.estimated?`estimated (${e.now})`:e.now,(0,t.jsxs)("span",{style:{color:"#778"},children:[` \xb7 ${e.people} ${1===e.people?"person":"people"} there now`,e.names.length>1&&` \xb7 for ${e.names.join(", ")}`]})]})]})},e.name))}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,marginTop:10,flexWrap:"wrap"},children:[p?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("button",{disabled:f||!g.size,onClick:()=>w([...g]),style:{...i(!0),opacity:f||!g.size?.5:1},children:["Keep ",g.size," ",1===g.size?"score":"scores"]}),(0,t.jsx)("button",{disabled:f,onClick:()=>h(!1),style:i(!1),children:"Back"})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{disabled:f,onClick:()=>w(d.companies.map(e=>e.name)),style:i(!0),children:"Keep all"}),(0,t.jsx)("button",{disabled:f,onClick:()=>h(!0),style:i(!1),children:"Choose…"})]}),(0,t.jsx)("button",{disabled:f,onClick:()=>w([]),style:i(!1),children:"No thanks"})]}),b&&(0,t.jsx)("div",{role:"alert",style:{marginTop:8,color:"#e74c3c"},children:b})]})}let a="1px solid rgba(255,255,255,0.1)",l={yours:{label:"your score",color:"#00ff88"},known:{label:"known list",color:"#3498DB"},data:{label:"public data",color:"#1abc9c"},network:{label:"estimated: many of your people",color:"#FF6B35"},default:{label:"unknown company",color:"#778"}};async function c(){let e=await fetch("/api/company-scores"),t=await e.json();if(!e.ok)throw Error(t.error||"Could not load company scores");return t.companies}function d(){let[e,t]=(0,n.useState)(null),[r,o]=(0,n.useState)(null);return(0,n.useEffect)(()=>{let e=!1;return c().then(n=>{e||t(n)}).catch(t=>{e||o(t.message)}),()=>{e=!0}},[]),{companies:e,error:r,setScore:(0,n.useCallback)(async(e,n)=>{let r=await fetch("/api/company-scores",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,score:n})}),o=await r.json();if(!r.ok)throw Error(o.error||"Could not save");return t(await c()),o},[]),reload:(0,n.useCallback)(async()=>t(await c()),[])}}function u({company:e,onSet:r,compact:o}){let[i,s]=(0,n.useState)(!1),l=async t=>{s(!0);try{await r(e.name,"auto"===t?null:Number(t))}finally{s(!1)}};return(0,t.jsxs)("select",{disabled:i,value:"yours"===e.source?String(e.score):"auto",onChange:e=>l(e.target.value),title:"Set this company's score. Auto uses the known list or an estimate.",style:{padding:o?"2px 4px":"4px 6px",borderRadius:6,border:a,background:"#11131c",color:"#dfe6e9",fontSize:12},children:[(0,t.jsxs)("option",{value:"auto",children:["Auto (","yours"===e.source?e.suggested??"est.":e.score,")"]}),[10,9,8,7,6,5,4,3,2,1].map(e=>(0,t.jsx)("option",{value:e,children:e},e))]})}e.s(["ScorePicker",0,u,"default",0,function({onRescored:e,version:r=0}){let{companies:o,error:i,setScore:c,reload:p}=d();(0,n.useEffect)(()=>{r&&p().catch(()=>{})},[r,p]);let[h,g]=(0,n.useState)(""),[y,f]=(0,n.useState)("all"),[m,b]=(0,n.useState)(150),[x,w]=(0,n.useState)(null),k=e=>{w(e),setTimeout(()=>w(null),3500)},S=async(t,n)=>{let r=await c(t,n);k(`${t}: ${null==n?"back to auto":`set to ${n}`} \xb7 rescored ${r.scored} people`),e?.()},v=async({kept:t,scored:n,error:r})=>{if(!t.length)return k("Keeping the new built-in scores.");k(r||`Kept ${t.length} old ${1===t.length?"score":"scores"} as your own \xb7 rescored ${n} people`),await p().catch(()=>{}),e?.()},j=(0,n.useMemo)(()=>{if(!o)return[];let e=h.trim().toLowerCase();return o.filter(t=>(!e||t.name.toLowerCase().includes(e))&&("all"===y||t.source===y))},[o,h,y]);if(i)return(0,t.jsx)("div",{style:{padding:24,color:"#e74c3c"},children:i});if(!o)return(0,t.jsx)("div",{style:{padding:24,color:"#778"},children:"Loading companies…"});let C=e=>o.filter(t=>t.source===e).length;return(0,t.jsxs)("div",{style:{flex:1,overflow:"auto",padding:16},children:[(0,t.jsxs)("div",{style:{maxWidth:980,margin:"0 auto"},children:[(0,t.jsx)(s,{onAnswered:v}),(0,t.jsxs)("div",{style:{padding:14,borderRadius:10,border:a,background:"rgba(255,255,255,0.03)",fontSize:12.5,color:"#cfd8d8",lineHeight:1.6},children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"How a power score works."})," power = ",(0,t.jsx)("b",{children:"title"})," × ",(0,t.jsx)("b",{children:"company weight"})," + bonus. The title (student 1 … founder or C-suite 10) comes from someone’s roles, with former roles at 70%; an audience of their own counts like a title (1M+ followers like a director). The company weight runs from 0.725 for a company we don’t know (or none found), the middle of the scale, to 1.0 (a company scored 10), so seniority counts for more at a bigger company. The bonus is at most +1.5, for investor, YC, an audience in the millions or the top award of any field, and counts half at an unknown company. A 1st-degree person whose circle is unusually strong gets up to +2 more: up to +1 for a high share of it at A or S, or +1 for every 25 people there. Tiers are graded on your network’s curve unless you choose the fixed scale (",(0,t.jsx)("a",{href:"#tiers",style:{color:"#3498DB"},children:"Tiers"}),", above): your top 3% are S, the next 12% A, the next 25% B (it only lifts, and never lifts anyone under 4 into S or A). On the fixed scale, S ≥ 7.5 · A ≥ 5.5 · B ≥ 4 · C ≥ 2.5.",(0,t.jsxs)("div",{style:{marginTop:6,color:"#8b9a9a"},children:["So a VP at a 10 scores 9.0, a founder at an unknown company 7.3, a director at an unknown company 5.4, and an intern at a 10 scores 2.0. Set a company’s score below and everyone there is rescored. Companies in the sectors you pick (",(0,t.jsx)("a",{href:"#sector",style:{color:"#3498DB"},children:"Your sector"}),", above) get +1 or +2; a score you set is never changed."]})]}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,alignItems:"center",flexWrap:"wrap",margin:"14px 0 10px"},children:[(0,t.jsx)("input",{value:h,onChange:e=>g(e.target.value),placeholder:"Find a company",style:{padding:"6px 10px",borderRadius:7,border:a,background:"rgba(255,255,255,0.05)",color:"#fff",fontSize:13,minWidth:180}}),[["all",`All ${o.length}`],["known",`Known list ${C("known")}`],["data",`Public data ${C("data")}`],["yours",`Yours ${C("yours")}`],["network",`Estimated ${C("network")}`],["default",`Unknown ${C("default")}`]].map(([e,n])=>(0,t.jsx)("button",{onClick:()=>f(e),style:{padding:"5px 10px",borderRadius:7,border:a,cursor:"pointer",fontSize:11.5,fontWeight:600,background:y===e?"rgba(52,152,219,0.25)":"transparent",color:y===e?"#cfe6f7":"#8b9a9a"},children:n},e))]}),(0,t.jsxs)("div",{style:{borderRadius:10,border:a,overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 70px 70px 70px 60px 180px 110px",gap:8,padding:"8px 12px",fontSize:10.5,letterSpacing:.6,color:"#8b9a9a",background:"rgba(255,255,255,0.04)"},children:[(0,t.jsx)("span",{children:"COMPANY"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"PEOPLE"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"YOU KNOW"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"DIRECTOR+"}),(0,t.jsx)("span",{style:{textAlign:"right"},children:"SCORE"}),(0,t.jsx)("span",{children:"SOURCE"}),(0,t.jsx)("span",{children:"SET"})]}),j.slice(0,m).map(e=>(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 70px 70px 70px 60px 180px 110px",gap:8,padding:"7px 12px",alignItems:"center",borderTop:"1px solid rgba(255,255,255,0.05)",fontSize:12.5},children:[(0,t.jsxs)("span",{style:{display:"flex",alignItems:"center",gap:8,minWidth:0},children:[(0,t.jsx)("span",{title:`${e.industry.label} (inferred)`,style:{width:8,height:8,borderRadius:"50%",background:e.industry.color,flexShrink:0}}),(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name})]}),(0,t.jsx)("span",{style:{textAlign:"right"},children:e.people}),(0,t.jsx)("span",{style:{textAlign:"right",color:e.d1?"#00ff88":"#556"},children:e.d1}),(0,t.jsx)("span",{style:{textAlign:"right",color:e.senior?"#FFD700":"#556"},children:e.senior}),(0,t.jsx)("b",{style:{textAlign:"right",fontSize:15},children:e.score}),(0,t.jsxs)("span",{style:{fontSize:11,color:l[e.source]?.color},children:[l[e.source]?.label,e.sectorBonus>0&&(0,t.jsxs)("span",{style:{color:"#00ff88"},children:[" + ",e.sectorBonus," your sector"]})]}),(0,t.jsx)(u,{company:e,onSet:S,compact:!0})]},e.name))]}),j.length>m&&(0,t.jsxs)("button",{onClick:()=>b(e=>e+300),style:{marginTop:10,padding:"7px 14px",borderRadius:8,border:a,background:"rgba(255,255,255,0.05)",color:"#dfe6e9",cursor:"pointer",fontSize:12},children:["Show more (",j.length-m," left)"]})]}),x&&(0,t.jsx)("div",{role:"status",style:{position:"fixed",bottom:24,left:"50%",transform:"translateX(-50%)",padding:"10px 18px",borderRadius:24,background:"linear-gradient(135deg, #00ff88, #3498DB)",color:"#000",fontWeight:800,fontSize:13,zIndex:50},children:x})]})},"useCompanyScores",0,d],94657)},2776,e=>{"use strict";var t=e.i(43476),n=e.i(15812);e.s(["default",0,function({children:e}){let{userId:r,ready:o}=(0,n.useUser)();return o&&r?e:(0,t.jsx)("div",{style:{minHeight:"100vh",display:"flex",alignItems:"center",justifyContent:"center",background:"#0a0a1a",color:"#fff",padding:24,textAlign:"center",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'},children:o?(0,t.jsxs)("div",{style:{maxWidth:420},children:[(0,t.jsx)("div",{style:{fontSize:18,fontWeight:700,marginBottom:8},children:"Can’t reach Six Degrees’ local server"}),(0,t.jsx)("div",{style:{color:"#888",fontSize:14,lineHeight:1.6},children:"The page loaded but the app behind it is not answering. If you started it from a terminal, check that window for an error, then reload this page."})]}):(0,t.jsx)("div",{style:{fontSize:18,fontWeight:600},children:"Loading…"})})}])},8819,e=>{"use strict";var t=e.i(43476);let n="1px solid rgba(255,255,255,0.1)";function r({children:e,style:n}){return(0,t.jsx)("div",{style:{fontSize:13.5,color:"#8b9a9a",lineHeight:1.6,marginTop:4,...n},children:e})}e.s(["Body",0,r,"Btn",0,function({children:e,onClick:r,disabled:o,primary:i,tone:s,type:a="button"}){return(0,t.jsx)("button",{type:a,onClick:r,disabled:o,style:{padding:"9px 18px",borderRadius:7,fontSize:13.5,fontWeight:650,color:o?"#667":"#fff",border:n,background:o?"rgba(255,255,255,0.05)":"bad"===s?"rgba(255,80,80,0.15)":i?"linear-gradient(135deg, #9B59B6, #3498DB)":"rgba(255,255,255,0.08)",cursor:o?"not-allowed":"pointer"},children:e})},"FONT",0,'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',"LINE",0,n,"Mono",0,function({children:e}){return(0,t.jsx)("code",{style:{background:"rgba(255,255,255,0.08)",padding:"1px 5px",borderRadius:4,wordBreak:"break-all"},children:e})},"Section",0,function({id:e,title:o,intro:i,children:s}){return(0,t.jsxs)("section",{id:e,style:{padding:"24px 0",borderBottom:n,scrollMarginTop:16},children:[(0,t.jsx)("h2",{style:{fontSize:16,fontWeight:650,margin:"0 0 6px"},children:o}),i&&(0,t.jsx)(r,{style:{marginTop:0,marginBottom:12},children:i}),s]})},"Status",0,function({children:e,tone:n}){return(0,t.jsxs)("div",{role:"status",style:{marginTop:10,padding:"10px 14px",borderRadius:8,fontSize:13.5,lineHeight:1.6,color:"ok"===n?"#00ff88":"bad"===n?"#ff7676":"#e8e8ee",background:"ok"===n?"rgba(0,255,136,0.08)":"bad"===n?"rgba(255,80,80,0.08)":"rgba(255,255,255,0.05)",border:`1px solid ${"ok"===n?"rgba(0,255,136,0.3)":"bad"===n?"rgba(255,80,80,0.3)":"rgba(255,255,255,0.12)"}`},children:["ok"===n&&"✓ ",e]})}])},98083,e=>{"use strict";var t=e.i(43476),n=e.i(71645),r=e.i(22016),o=e.i(2776),i=e.i(8819),s=e.i(98197),a=e.i(44944),l=e.i(77170),c=e.i(69083),d=e.i(90179),u=e.i(5258),p=e.i(7837),h=e.i(56899);let g={lean:"Lean",strong:"Strong"},y=["wheel","touchstart","keydown","pointerdown"],f={1:"1st",2:"2nd",3:"3rd"},m=(e,t,n=`${t}s`)=>`${e.toLocaleString()} ${1===e?t:n}`,b=l.DIRECTORY.filter(e=>"function"===e.kind).map(e=>e.label);function x(e,t,n){let[r,o]=n?["moved","moved"]:["moves","move"];if(!e&&!t)return n?"No one changed tier.":"No one changes tier.";let i=e=>1===e?r:o;return e&&t?`${m(e,"person","people")} ${i(e)} up a tier and ${t.toLocaleString()} ${i(t)} down.`:e?`${m(e,"person","people")} ${i(e)} up a tier.`:`${m(t,"person","people")} ${i(t)} down a tier.`}function w({onSaved:e}={}){let[r,o]=(0,n.useState)(null),[l,u]=(0,n.useState)(null),[f,S]=(0,n.useState)(null),[v,j]=(0,n.useState)(!1),[C,T]=(0,n.useState)(null),[B,R]=(0,n.useState)(null),[A,$]=(0,n.useState)({loading:!0}),[E]=(0,n.useState)(()=>(0,p.csvNetworkSource)()),I=(0,n.useRef)(null),N=(0,n.useRef)(0),O=(0,n.useRef)(!1);function D(e){u(e),T(null),clearTimeout(I.current);let t=++N.current;if((0,a.sameFocus)(e,r))return void S(null);let n=(0,a.focusFingerprint)(e);S({key:n,loading:!0}),I.current=setTimeout(async()=>{try{let r=await fetch("/api/settings/sector-preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sectorFocus:e})}),o=await r.json();if(t!==N.current)return;S(r.ok?{key:n,...o}:{key:n,error:o.error||"Could not work out what would change."})}catch{t===N.current&&S({key:n,error:"Could not reach the app to work out what would change."})}},250)}async function F(){var t,n;let r;j(!0),T(null),clearTimeout(I.current),N.current++;let i=await (0,h.saveSettings)({sectorFocus:l});(j(!1),i.settings&&(o(i.settings.sectorFocus),u(i.settings.sectorFocus),S(null)),i.error)?T({tone:"bad",text:i.error}):(T({tone:"ok",text:(t=i.settings.sectorFocus,n=i.effects?.sectorFocus,r=t.sectors.length?`Saved: ${t.sectors.map(e=>(0,c.sectorByKey)(e).label).join(" · ")} (${g[t.strength].toLowerCase()}).`:"Saved: no sector.",n?n.scored?`${r} Rescored your network (${m(n.people??n.scored,"person","people")}). ${x(n.up,n.down,!0)}`:`${r} There's no scanned network yet; it will apply when you scan.`:r)}),e?.())}(0,n.useEffect)(()=>{let e=!1;return fetch("/api/settings").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load your sector.")))).then(t=>{if(e)return;let n=t.settings?.sectorFocus||{sectors:[],strength:"lean"};o(n),u(n)}).catch(t=>{e||R(t.message)}),fetch("/api/settings/sector-suggestions").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load suggestions.")))).then(t=>{e||$({scored:t.scored,list:t.suggestions||[]})}).catch(t=>{e||$({error:t.message})}),()=>{e=!0,clearTimeout(I.current)}},[]),(0,n.useEffect)(()=>{if(O.current||!l&&!B)return;O.current=!0;let e=document.getElementById("sector");if("#sector"!==window.location.hash||!e)return;let t=()=>e.scrollIntoView({block:"start"});t();let n=new ResizeObserver(t);n.observe(document.body);let r=()=>{for(let e of(n.disconnect(),clearTimeout(o),y))window.removeEventListener(e,r,!0)},o=setTimeout(r,2e3);for(let e of y)window.addEventListener(e,r,{capture:!0,passive:!0});return r},[l,B]);let z=l&&r&&!(0,a.sameFocus)(l,r);return(0,t.jsxs)(i.Section,{id:"sector",title:"Your sector",intro:"Pick up to three sectors you work in. Companies in them count for more when your network is scored, so the people there rank higher.",children:[B&&(0,t.jsx)(i.Status,{tone:"bad",children:B}),!l&&!B&&(0,t.jsx)(i.Body,{children:"Loading…"}),l&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.default,{sectors:l.sectors,onChange:e=>D({...l,sectors:e}),disabled:v,suggest:A}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",flexWrap:"wrap",gap:8,marginTop:14},children:[(0,t.jsx)("span",{style:{fontSize:13,color:"#8b9a9a"},children:"How much:"}),Object.keys(d.SECTOR_BONUS).map(e=>(0,t.jsxs)("button",{type:"button","aria-pressed":l.strength===e,disabled:v,onClick:()=>D({...l,strength:e}),style:{padding:"5px 12px",borderRadius:7,fontSize:12.5,fontWeight:600,cursor:"pointer",color:l.strength===e?"#fff":"#8b9a9a",background:l.strength===e?"rgba(52,152,219,0.25)":"transparent",border:i.LINE},children:[g[e]," · +",d.SECTOR_BONUS[e]]},e))]}),(0,t.jsx)(i.Body,{style:{fontSize:12.5},children:"Each company in your sectors gets +1 (lean) or +2 (strong) on its score out of 10, never above 10. A company in more than one of your picks still gets it once."}),(0,t.jsx)(k,{preview:z?f:null,draft:l}),(0,t.jsxs)("div",{style:{display:"flex",gap:8,flexWrap:"wrap",marginTop:14},children:[(0,t.jsx)(i.Btn,{primary:!0,onClick:F,disabled:!z||v,children:v?"Saving and rescoring…":"Save"}),z&&!v&&(0,t.jsx)(i.Btn,{onClick:()=>D(r),children:"Cancel"}),!z&&l.sectors.length>0&&!v&&(0,t.jsx)(i.Btn,{onClick:()=>D({...l,sectors:[]}),children:"Turn off"})]}),C&&(0,t.jsx)(i.Status,{tone:C.tone,children:C.text}),(0,t.jsxs)("ul",{style:{margin:"16px 0 0",paddingLeft:18,fontSize:12.5,color:"#778",lineHeight:1.7},children:[(0,t.jsx)("li",{children:"Tiers rank how reachable someone is through your network, not the people themselves."}),(0,t.jsxs)("li",{children:["A company score you set on ",(0,t.jsx)("a",{href:"#companies",style:{color:"#3498DB"},children:"Company scores"}),", below, always wins. Your sector never changes it."]}),(0,t.jsx)("li",{children:"If you scan highest tier first, people in your sectors come up sooner. Scanning newest first, the default, doesn’t go by tier."}),(0,t.jsx)("li",{children:"An industry includes its sectors. It counts a company in any of its sectors (Healthcare & Biotech counts a practice that is only in Dental), and a company whose industry the app’s list of well-known companies or the company’s own name gives (Meridian Health). Not one known only from its people’s job titles: a recruiter at Acme Widgets doesn’t make Acme a consulting firm."}),(0,t.jsx)("li",{children:"A narrower sector counts a company when its name says so (Smith Family Dental), it’s a well-known company in that sector, or at least half of the people you know there say so in their headlines (dentist, DDS, orthodontist). The words are a fixed list that comes with the app, the same on every computer. Nothing is sent anywhere."}),(0,t.jsxs)("li",{children:["Some sectors are work every kind of company has: ",b.length>1?`${b.slice(0,-1).join(", ")} and ${b.at(-1)}`:b.join(""),". For those a job title doesn’t count, since a recruiter at Acme Widgets doesn’t make it a recruiting firm. The company’s name does (Acme Staffing, Smith CPA), and so does a kind of firm in a headline (staffing agency, law firm, SaaS)."]}),E&&(0,t.jsxs)("li",{style:{color:"#FFD700"},children:["sample"===E?"The sample network":"The CSV import"," open in this window isn’t changed by this, and isn’t counted in the suggestions. Your sector applies to networks you’ve scanned."]})]})]})]})}function k({preview:e,draft:n}){if(!e||e.key!==(0,a.focusFingerprint)(n))return null;let r={marginTop:12,padding:"10px 14px",borderRadius:8,fontSize:13,lineHeight:1.6,border:i.LINE,background:"rgba(255,255,255,0.03)",color:"#cfd8d8"};if(e.loading)return(0,t.jsx)("div",{style:r,"aria-live":"polite",children:"Working out what would change…"});if(e.error)return(0,t.jsx)(i.Status,{tone:"bad",children:e.error});if(!e.scored)return(0,t.jsx)("div",{style:r,"aria-live":"polite",children:"There’s no scanned network yet, so nothing changes now. Your choice applies once you scan."});let o=(e,t)=>`${m(e,"company","companies")} ${1===e?"scores":"score"} ${t}`,s=[e.companiesUp&&o(e.companiesUp,"higher"),e.companiesDown&&o(e.companiesDown,"lower")].filter(Boolean).join(" and ");return(0,t.jsxs)("div",{style:r,"aria-live":"polite",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("b",{style:{color:"#fff"},children:"If you save:"})," ",s?`${s}.`:"No company changes score."," ",x(e.up,e.down,!1)]}),e.examples?.length>0&&(0,t.jsx)("div",{style:{marginTop:6,display:"flex",flexWrap:"wrap",gap:"4px 12px",fontSize:12.5},children:e.examples.map((e,n)=>(0,t.jsxs)("span",{title:e.company||void 0,children:[e.name,e.degree?(0,t.jsxs)("span",{style:{color:"#667"},children:[" (",f[e.degree]||`${e.degree}th`,")"]}):null," ",(0,t.jsx)("b",{style:{color:u.TIER_COLORS_CLASSIC[e.from]||"#889"},children:e.from||"–"})," → ",(0,t.jsx)("b",{style:{color:u.TIER_COLORS_CLASSIC[e.to]||"#889"},children:e.to})]},n))}),e.companyExamples?.length>0&&(0,t.jsx)("div",{style:{marginTop:4,fontSize:12,color:"#8b9a9a"},children:e.companyExamples.slice(0,3).map(e=>`${e.name} ${e.from} → ${e.to}`).join(" · ")})]})}let S=e=>`${Math.round(100*e)}%`,[v,j,C]=d.CURVE.map(([,e])=>e),T=[{key:"curve",label:"On your network's curve",note:`Your top ${S(v)} are S, the next ${S(j-v)} A and the next ${S(C-j)} B, so any network has a top, even one full of companies the app doesn't know. It only lifts: nobody drops a tier because their network is strong, and nobody under ${d.CURVE_FLOOR} is lifted into S or A.`},{key:"fixed",label:"On the fixed scale",note:"The same lines for everyone: S from 7.5, A from 5.5, B from 4, C from 2.5. Easy to compare from one network to another, but a network outside well-known companies has almost nobody in S or A."}];function B({onSaved:e}={}){let[r,o]=(0,n.useState)(null),[s,a]=(0,n.useState)(!1),[l,c]=(0,n.useState)(null),[d,u]=(0,n.useState)(null),[g]=(0,n.useState)(()=>(0,p.csvNetworkSource)());async function y(t){if(s||t===r)return;a(!0),c(null);let{settings:n,effects:i,error:l}=await (0,h.saveSettings)({tierScale:t});if(n&&o(n.tierScale),l)c({tone:"bad",text:l});else{let t,n=i?.tierScale;c({tone:"ok",text:n?`Saved. ${t=n.moved,`${t.toLocaleString()} ${1===t?"person":"people"}`} changed tier.`:"Saved."}),e?.()}a(!1)}return(0,n.useEffect)(()=>{let e=!1;return fetch("/api/settings").then(e=>e.json().then(t=>e.ok?t:Promise.reject(Error(t.error||"Could not load how tiers are graded.")))).then(t=>{e||o(t.settings?.tierScale||"curve")}).catch(t=>{e||u(t.message)}),()=>{e=!0}},[]),(0,t.jsxs)(i.Section,{id:"tiers",title:"Tiers",intro:"How the S to D rings are drawn. A tier says where someone sits in your network, not what they're worth.",children:[d&&(0,t.jsx)(i.Status,{tone:"bad",children:d}),r&&(0,t.jsx)("div",{role:"radiogroup","aria-label":"How tiers are graded",style:{display:"grid",gap:8},children:T.map(e=>{let n=r===e.key;return(0,t.jsxs)("button",{type:"button",role:"radio","aria-checked":n,disabled:s,onClick:()=>y(e.key),style:{textAlign:"left",padding:"12px 14px",borderRadius:8,cursor:s?"wait":n?"default":"pointer",color:"#fff",background:n?"rgba(155,89,182,0.14)":"rgba(255,255,255,0.03)",border:n?"1px solid rgba(155,89,182,0.6)":i.LINE},children:[(0,t.jsxs)("div",{style:{fontSize:14,fontWeight:650},children:[n?"● ":"○ ",e.label,"curve"===e.key?" (recommended)":""]}),(0,t.jsx)(i.Body,{style:{marginTop:4},children:e.note})]},e.key)})}),g&&(0,t.jsxs)(i.Body,{style:{color:"#FFD700",marginTop:10},children:["sample"===g?"The sample network open in this window keeps its own tiers (they’re the same either way).":"The CSV import open in this window is always graded on its own curve."," ","This applies to networks you’ve scanned."]}),l&&(0,t.jsx)(i.Status,{tone:l.tone,children:l.text})]})}var R=e.i(94657),A=e.i(64745);let $={color:"#3498DB",textDecoration:"none",fontWeight:600};function E(){let[e,o]=(0,n.useState)(0),s=()=>o(e=>e+1);return A.IS_DEMO?(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"rgba(255,255,255,0.7)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,textAlign:"center",padding:24,fontFamily:i.FONT},children:[(0,t.jsx)("h2",{style:{margin:0,fontSize:20,fontWeight:700,color:"#fff"},children:"Not part of the demo"}),(0,t.jsx)("p",{style:{margin:0,fontSize:13},children:"The public demo includes the Network Circle and Degrees views only."}),(0,t.jsx)(r.default,{href:"/",style:{fontSize:12,color:"rgba(255,255,255,0.5)",textDecoration:"none"},children:"← Back to the network"})]}):(0,t.jsxs)("div",{style:{minHeight:"100vh",background:"#0a0a1a",color:"#fff",fontFamily:i.FONT},children:[(0,t.jsxs)("header",{style:{padding:"16px 24px",borderBottom:i.LINE,display:"flex",alignItems:"center",gap:16},children:[(0,t.jsx)(r.default,{href:"/",style:{display:"flex",alignItems:"center",gap:6,color:"#888",textDecoration:"none",fontSize:13,fontWeight:600,padding:"6px 14px",borderRadius:6,background:"rgba(255,255,255,0.06)",border:i.LINE},children:"← Back to Map"}),(0,t.jsx)("h1",{style:{fontSize:22,fontWeight:700,margin:0,background:"linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:"Scores"})]}),(0,t.jsxs)("main",{style:{maxWidth:980,margin:"0 auto",padding:"8px 24px 64px"},children:[(0,t.jsxs)(i.Body,{style:{marginTop:16},children:["How someone’s power score is worked out, and the three things you can change about it:"," ",(0,t.jsx)("a",{href:"#sector",style:$,children:"your field"}),", ",(0,t.jsx)("a",{href:"#tiers",style:$,children:"how tiers are graded"})," and"," ",(0,t.jsx)("a",{href:"#companies",style:$,children:"any company’s score"}),". A change here rescores everyone."]}),(0,t.jsx)(w,{onSaved:s}),(0,t.jsx)(B,{onSaved:s}),(0,t.jsx)("div",{id:"companies",style:{marginTop:28},children:(0,t.jsx)(R.default,{version:e})})]})]})}e.s(["default",0,function(){return(0,t.jsx)(o.default,{children:(0,t.jsx)(E,{})})}],98083)},89154,e=>{"use strict";var t=e.i(90179);function n(e){let n=(0,t.readTitle)(e);return{key:n.key,label:n.label,level:n.level}}function r(e){return(0,t.currentCompany)(e)}let o=[{key:"defense",label:"Government, Defense & Aerospace",color:"#7f8c8d",words:/\b(government|federal|state of|county|city of|defen[cs]e|army|navy|air force|marine corps|military|dod|nasa|aerospace|lockheed|northrop|boeing|raytheon|l3harris|leidos|blue origin|spacex|public sector)\b/i},{key:"finance",label:"Finance & Investing",color:"#2ecc71",words:/\b(bank|banking|capital|ventures?|vc|investments?|investor|fund|private equity|growth equity|asset management|wealth|trading|trader|hedge|crypto|blockchain|web3|defi|fintech|stripe|coinbase|blackrock|robinhood|goldman|morgan stanley|jpmorgan|chase|bny|mellon|wells fargo|citi|citigroup|capital one|fidelity|vanguard|schwab|visa|mastercard|amex|american express|paypal|insurance|accounting|cpa|financial)\b/i},{key:"health",label:"Healthcare & Biotech",color:"#e74c3c",words:/\b(health|healthcare|medical|medicine|hospital|clinic|pharma|pharmaceutical|biotech|nurse|nursing|physician|doctor|dental|therapy|therapist|wellness)\b/i},{key:"education",label:"Education",color:"#f1c40f",words:/\b(university|college|school|education|student|professor|teacher|academy|phd|faculty|alumni)\b/i},{key:"media",label:"Marketing & Media",color:"#e67e22",words:/\b(marketing|brand|branding|advertising|agency|media|content|social media|creative|creator|influencer|pr|public relations|communications|tiktok|pinterest|youtube|growth marketing)\b/i},{key:"entertainment",label:"Entertainment & Gaming",color:"#9b59b6",words:/\b(entertainment|film|movie|music|records|gaming|games?|esports|studio|studios|netflix|disney|spotify|hollywood|theater|theatre|sports)\b/i},{key:"tech",label:"Tech, Software & AI",color:"#3498db",words:/\b(software|saas|engineer|engineering|developer|tech|technology|technologies|ai|artificial intelligence|machine learning|ml|data|cloud|cyber|security|devops|product manager|google|microsoft|apple|meta|amazon|nvidia|openai|anthropic|palantir|salesforce|oracle|ibm|intel|app|apps|startup|platform|labs?)\b/i},{key:"consulting",label:"Consulting, Legal & Services",color:"#1abc9c",words:/\b(consulting|consultant|consultancy|deloitte|accenture|mckinsey|kpmg|pwc|ey|bain|bcg|legal|law|lawyer|attorney|paralegal|recruiting|recruiter|staffing|talent)\b/i},{key:"realestate",label:"Real Estate & Construction",color:"#d35400",words:/\b(real estate|realtor|realty|property|properties|construction|architecture|architect|mortgage|homes|housing|builders?)\b/i},{key:"consumer",label:"Retail, Consumer & Hospitality",color:"#ff79c6",words:/\b(retail|e-?commerce|shopify|consumer|cpg|fashion|apparel|beauty|cosmetics|food|beverage|restaurant|hospitality|hotel|travel|tourism|coca-cola|nike|store|shop)\b/i},{key:"industry",label:"Manufacturing, Energy & Logistics",color:"#95a5a6",words:/\b(manufacturing|energy|oil|gas|solar|utilities|automotive|tesla|siemens|ge|general electric|honeywell|3m|logistics|supply chain|shipping|freight|fedex|ups|industrial|mining|chemicals?)\b/i},{key:"nonprofit",label:"Nonprofit & Community",color:"#bdc3c7",words:/\b(nonprofit|non-profit|foundation|charity|ngo|church|ministry|volunteer)\b/i}],i={key:"unknown",label:"Unclear",color:"#555c66"},s=Object.fromEntries([...o,i].map(e=>[e.key,e])),a=e=>s[e]||i;function l(e,t){for(let n of[e,t]){if(!n)continue;let e=o.find(e=>e.words.test(n));if(e)return e}return i}let c=(e,t)=>l(e,t).key,d=e=>n(e).level>=4;e.s(["INDUSTRIES",0,o,"UNKNOWN_INDUSTRY",0,i,"buildCompanyIndex",0,function(e=[]){let n=new Map,r=e=>(n.has(e)||n.set(e,(0,t.rolesWithCompanies)(e)),n.get(e)),{industries:o}=(0,t.networkCompanies)(e,{industryOf:c,rolesOf:r}),i=new Map;for(let t of e){let e=t.profile_url||`id:${t.id}`,n=i.get(e);(!n||(t.degree||9)<(n.degree||9))&&i.set(e,t)}let s=new Map;for(let e of i.values()){let t=r(e).find(e=>!e.former)?.company;if(!t)continue;let n=s.get(t);n||(n={name:t,people:[],d1:0,d2:0,d3:0,S:0,A:0,senior:0},s.set(t,n)),n.people.push(e),1===e.degree?n.d1++:2===e.degree?n.d2++:n.d3++,"S"===e.tier&&n.S++,"A"===e.tier&&n.A++,d(e.headline)&&n.senior++}for(let e of s.values())e.industry=a(o.get(e.name));return s},"companyLinks",0,function(e=[],t=[]){let n=new Map;for(let t of e){let e=r(t);e&&n.set(t.id,e)}let o=new Map;for(let e of t){let t=n.get(e.source_connection_id),i=r(e);if(!t||!i||t===i)continue;let[s,a]=t<i?[t,i]:[i,t],l=`${s}\u0000${a}`,c=o.get(l);c||(c={a:s,b:a,weight:0,via:new Set},o.set(l,c)),c.weight++,c.via.add(e.source_connection_id)}return[...o.values()]},"companyOf",0,r,"getSeniority",0,n,"industryByKey",0,a,"industryOf",0,l,"isSenior",0,d,"waysInto",0,function(e,t=[],n=[]){let o=t.filter(t=>r(t)===e),i=new Map;for(let t of n)r(t)===e&&i.set(t.source_connection_id,(i.get(t.source_connection_id)||0)+1);let s=new Map(t.map(e=>[e.id,e]));return{direct:o,bridges:[...i.entries()].map(([e,t])=>({bridge:s.get(e),n:t})).filter(e=>e.bridge).sort((e,t)=>t.n-e.n||(Number(t.bridge.power_score)||0)-(Number(e.bridge.power_score)||0))}}])},69083,e=>{"use strict";var t=e.i(89154);let n=new Map(t.INDUSTRIES.map(e=>[e.key,e.color])),r=new Map([...t.INDUSTRIES.map(e=>[e.key,Object.freeze({key:e.key,label:e.label,color:e.color,group:e.key,kind:"industry"})]),...Object.entries({software:["Software & SaaS","tech","function"],"ai-data":["AI & Data","tech","function"],cybersecurity:["Cybersecurity","tech","function"],telecom:["Telecom","tech","industry"],fintech:["Fintech & Payments","finance","industry"],banking:["Banking & Lending","finance","industry"],"vc-pe":["Venture Capital & Private Equity","finance","industry"],wealth:["Wealth & Asset Management","finance","industry"],insurance:["Insurance","finance","industry"],accounting:["Accounting & Tax","finance","function"],crypto:["Crypto & Web3","finance","industry"],hospitals:["Hospitals & Clinics","health","industry"],dental:["Dental","health","industry"],"pharma-biotech":["Pharma & Biotech","health","industry"],"medical-devices":["Medical Devices","health","industry"],"mental-health":["Mental Health","health","industry"],"fitness-wellness":["Fitness & Wellness","health","industry"],veterinary:["Veterinary & Animal Care","health","industry"],k12:["K-12 Education","education","industry"],"higher-ed":["Higher Education","education","industry"],"marketing-advertising":["Marketing & Advertising","media","function"],"pr-comms":["PR & Communications","media","function"],"media-publishing":["Media & Publishing","media","industry"],"creator-economy":["Creator Economy","media","industry"],"film-tv-music":["Film, TV & Music","entertainment","industry"],"gaming-esports":["Gaming & Esports","entertainment","industry"],sports:["Sports","entertainment","industry"],"ecommerce-retail":["E-commerce & Retail","consumer","industry"],"consumer-goods":["Consumer Goods","consumer","industry"],restaurants:["Restaurants & Food Service","consumer","industry"],"hospitality-travel":["Hospitality & Travel","consumer","industry"],"beauty-personal-care":["Beauty & Personal Care","consumer","industry"],logistics:["Logistics & Supply Chain","industry","industry"],manufacturing:["Manufacturing","industry","industry"],energy:["Energy & Utilities","industry","industry"],automotive:["Automotive","industry","industry"],agriculture:["Agriculture & Farming","industry","industry"],"aerospace-defense":["Aerospace & Defense","defense","industry"],military:["Military","defense","industry"],government:["Government & Public Sector","defense","industry"],legal:["Legal","consulting","function"],"management-consulting":["Management Consulting","consulting","function"],"hr-recruiting":["HR & Recruiting","consulting","function"],"security-services":["Security Services","consulting","function"],"real-estate":["Real Estate","realestate","industry"],"construction-trades":["Construction & Trades","realestate","industry"],charities:["Nonprofits & Charities","nonprofit","industry"],"social-work":["Social Work & Human Services","nonprofit","industry"],faith:["Faith & Ministry","nonprofit","industry"]}).map(([e,[r,o,i]])=>[e,Object.freeze({key:e,label:r,color:n.get(o)||t.UNKNOWN_INDUSTRY.color,group:o,kind:i})])]);e.s(["sectorByKey",0,function(e){return r.get(e)||{key:e,label:t.UNKNOWN_INDUSTRY.label,color:t.UNKNOWN_INDUSTRY.color,group:null,kind:null}}])},5258,e=>{"use strict";e.s(["TIER_COLORS",0,{S:"#f6c344",A:"#a78bfa",B:"#60a5fa",C:"#94a3b8",D:"#6b7280"},"TIER_COLORS_CLASSIC",0,{S:"#FFD700",A:"#9B59B6",B:"#3498DB",C:"#95A5A6",D:"#BDC3C7"},"TIER_ORDER",0,["S","A","B","C","D"],"TIER_RING_RADIUS",0,{S:150,A:230,B:310,C:390,D:470},"initialsFor",0,function(e){let t=String(e||"").trim().split(/\s+/).filter(Boolean);return 0===t.length?"?":(t[0].charAt(0)+(t.length>1?t[t.length-1].charAt(0):"")).toUpperCase()}])}]);
@@ -6,6 +6,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.3] - 2026-09-29
10
+
11
+ ### Added
12
+ - **Experimental Auto-Bridge (a switch on the Scan page).** All-day pacing that stays openly
13
+ slow: up to 10 pages in a sitting, then a 45-minute rest; searches only from 09:00 to 19:00 on
14
+ this computer's clock; at the daily budget it waits for it to free up instead of stopping;
15
+ and every page is saved as it's read. It also reads the data LinkedIn already sends for each
16
+ page of results (no extra requests) beside the page text. That fills in headlines, photos and
17
+ mutual counts the page text missed, and gives each list's real length for the scan bars. Each
18
+ page logs how the two compare, and a few raw responses are kept in the data folder
19
+ (`wire-samples/`) to tune it. People only LinkedIn's data shows are logged, not added. The
20
+ timing is never randomised to look like a person. Not yet tried on a live account.
21
+ - **A status bar while a scan runs, on every page.** It shows what's running and for whom, how
22
+ far it's got, today's LinkedIn searches against your daily budget (green, then amber past 60%,
23
+ red past 90%), what the scanner is doing right now (for example the wait before the next
24
+ profile), a link to the Scan page and Stop. Stop saves what was read, and Resume carries on
25
+ from the same page. It sits just under the header's tabs, on every page, the Scan page too.
26
+
27
+ ### Changed
28
+ - **Network Circle's tiers switch on and off.** In the Filter panel, click a tier to hide it or
29
+ show it again, so C and D can go while S, A and B stay. *All* shows everyone. Degrees still
30
+ picks one bridge tier at a time.
31
+ - **Orbit: the circles behind added people sit behind their bridge.** They're centred on the
32
+ bridge's slice, side by side, with a line back to whoever they came through, wherever that
33
+ person sits. Before, each was centred on that person and could spill into the next bridge's
34
+ space.
35
+
36
+ ## [0.4.2] - 2026-09-29
37
+
38
+ ### Added
39
+ - **Orbit goes past 2nd degree.** Someone you added through a circle, whose own circle is
40
+ scanned, now sits in the fan of the circle they came from, green-ringed, and their people fan
41
+ out behind them a band further out, fainter, with a faint line to each. Their added people's
42
+ circles go further out again, to 6th degree. Before, they sat on the ring as one more bridge,
43
+ and Orbit showed only 2nd degree.
44
+ - **A ring round each connection's dot.** Five thin bars show how much of their circle is
45
+ scanned: all five once their list is read to the end, and part-way the pages read against
46
+ LinkedIn's own count of the list, which scans now keep (no extra traffic). Lists read before
47
+ scans kept a count show two. A small badge counts the people in their circle ready to scan,
48
+ and a catalyst is the green outline on the dot. It's on the Galaxy and on Bridge Chains'
49
+ bridges.
50
+
51
+ ### Changed
52
+ - **The Galaxy in bands when more than your connections are drawn.** With 2nd (or 3rd) degree
53
+ on, your connections sit on a tighter inner ring, their circles in a band outside it, and past
54
+ someone you added through a circle, their people further out again. Each band is sorted by
55
+ tier, S nearest, and has a faint label. Lines follow the chain: from you to your connections,
56
+ from each connection to their circle, and from someone you added to theirs. Your connections
57
+ alone keep the roomier tier rings.
58
+
59
+ ### Removed
60
+ - **The "N only here" line under each bridge in Bridge Chains.** Their card still says who is
61
+ reached only through them.
62
+
9
63
  ## [0.4.1] - 2026-09-29
10
64
 
11
65
  ### Added
@@ -139,11 +139,19 @@ function bridgeSkips() {
139
139
  */
140
140
  function scanNotes() {
141
141
  let read = [];
142
+ const lists = {};
142
143
  try {
143
144
  const me = resolveProfile({ create: false });
144
- if (me) read = Object.keys(readProgress(dataDir(), me.id));
145
+ if (me) {
146
+ const progress = readProgress(dataDir(), me.id);
147
+ read = Object.keys(progress);
148
+ // How far each list was read, for the rings round a dot (lib/reach.js scanBars).
149
+ for (const [url, e] of Object.entries(progress)) {
150
+ lists[url] = { pages: Number(e?.pages) || 0, more: !!e?.more, total: Number(e?.total) || null };
151
+ }
152
+ }
145
153
  } catch {}
146
- return { skips: bridgeSkips(), read };
154
+ return { skips: bridgeSkips(), read, lists };
147
155
  }
148
156
 
149
157
  /**
@@ -334,9 +342,23 @@ function job() {
334
342
  progress: state.running ? scanProgress(state.log, state.action) : null,
335
343
  log: state.log.slice(-120),
336
344
  recent: state.recent,
345
+ budget: state.running ? budgetNow() : null,
337
346
  };
338
347
  }
339
348
 
349
+ /** Today's LinkedIn budget, for the status bar every page shows while a scan runs. */
350
+ function budgetNow() {
351
+ try {
352
+ const li = linkedinState(dataDir());
353
+ return {
354
+ searches: li.searchesToday ?? 0, cap: li.limits?.daily ?? null,
355
+ profiles: li.profilesToday ?? 0, profileCap: li.limits?.profiles ?? null,
356
+ };
357
+ } catch {
358
+ return null;
359
+ }
360
+ }
361
+
340
362
  /**
341
363
  * Where Resume would carry on with one of your connections, for their profile
342
364
  * card: { nextPage, pagesRead, legacy }, or null when there is nothing to carry
@@ -625,6 +647,9 @@ export async function POST(request) {
625
647
  ...(maxBridges && (action.startsWith('auto-bridge') || action === 'resume-all') ? [`--max-bridges=${maxBridges}`] : []),
626
648
  ...(tiers.length && action.startsWith('auto-bridge') ? [`--tiers=${tiers.join(',')}`] : []),
627
649
  ...(action.startsWith('auto-bridge') ? [`--order=${order}`] : []),
650
+ // Experimental Auto-Bridge (Scan page switch): all-day pacing and LinkedIn's
651
+ // own data read beside the page text (scripts/scrape.py EXPERIMENT).
652
+ ...(body.experimental === true && action.startsWith('auto-bridge') ? ['--experimental'] : []),
628
653
  // Resuming always reads to the end: a remembered "10 pages" would
629
654
  // otherwise leave everyone paused at page 11 and do nothing.
630
655
  ...(readsCircles ? [`--max-pages=${action.startsWith('resume') ? 100 : maxPages}`] : []),
@@ -31,9 +31,10 @@ import Link from 'next/link';
31
31
  import { useRouter } from 'next/navigation';
32
32
  import { circleIndex } from '../../lib/circle';
33
33
  import { localPhoto } from '../../lib/photos';
34
- import { reachIndex, reachState, circleState, readyByCircle, circleScanCost } from '../../lib/reach';
34
+ import { reachIndex, reachState, circleState, readyByCircle, circleScanCost, scanBars } from '../../lib/reach';
35
+ import { ringSegments, RING } from '../../lib/dot-rings';
35
36
  import { ringLayout, dotRadius, previewBand, tierBandLayout, outerFans } from '../../lib/chain-layout';
36
- import { exclusiveReach, redundancy } from '../../lib/brokerage';
37
+ import { redundancy } from '../../lib/brokerage';
37
38
  import { keyFor, score } from '../../lib/separation';
38
39
  import { hasRequest } from '../../lib/requests-client';
39
40
  import { watchScanner, scannerNow, isCircleScan } from '../../lib/scraper-client';
@@ -139,8 +140,6 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
139
140
  const index = useMemo(() => circleIndex(all1, all2), [all1, all2]);
140
141
  const reach = useMemo(() => reachIndex(all1, all2, scanNotes), [all1, all2, scanNotes]);
141
142
  const readyCount = useMemo(() => readyByCircle(reach), [reach]);
142
- // Who only this bridge reaches, across every circle scanned (lib/brokerage.js).
143
- const exclusive = useMemo(() => exclusiveReach(fullDegree2 || degree2, fullDegree1 || connections), [fullDegree2, degree2, fullDegree1, connections]);
144
143
  const twoWays = useMemo(() => redundancy(fullDegree2 || degree2, fullDegree1 || connections), [fullDegree2, degree2, fullDegree1, connections]);
145
144
  const rowById = useMemo(() => {
146
145
  const m = new Map();
@@ -294,6 +293,20 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
294
293
  <circle cx={b.x} cy={b.y} r={isHov ? 20 : 16}
295
294
  fill={`${TIER_COLORS[b.tier]}08`}
296
295
  stroke={`${TIER_COLORS[b.tier]}${isHov ? '60' : '25'}`} strokeWidth={1} />
296
+ {/* How much of their circle is scanned: five thin bars (design C) */}
297
+ {(() => {
298
+ const bars = scanBars(b, reach);
299
+ if (bars == null) return null;
300
+ return (
301
+ <g transform={`translate(${b.x} ${b.y})`} pointerEvents="none">
302
+ {ringSegments((isHov ? 20 : 16) + 3.5).map((seg) => (
303
+ <path key={seg.i} d={seg.d} fill="none" strokeLinecap="round" strokeWidth={1.6}
304
+ stroke={seg.i < bars ? RING.filled : RING.empty} />
305
+ ))}
306
+ <title>{bars === 5 ? 'Their whole list is scanned' : `About ${bars * 20}% of their list is scanned`}</title>
307
+ </g>
308
+ );
309
+ })()}
297
310
  {/* Node */}
298
311
  <circle cx={b.x} cy={b.y} r={isHov ? 13 : 11}
299
312
  fill={localPhoto(b.profile_image_url) ? '#1a1a2e' : TIER_COLORS[b.tier]}
@@ -329,12 +342,6 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
329
342
  <text x={b.x} y={b.y + (isHov ? 34 : 32)} textAnchor="middle" fill="#888" fontSize={7}>
330
343
  {b.clusterSize} · {sCount > 0 ? sCount + 'S ' : ''}{aCount > 0 ? aCount + 'A' : ''}
331
344
  </text>
332
- {exclusive.get(b.id)?.only > 0 && (
333
- <text x={b.x} y={b.y + (isHov ? 43 : 41)} textAnchor="middle" fill="#00ff88" fillOpacity={0.75} fontSize={6.5}>
334
- {exclusive.get(b.id).only.toLocaleString()} only here
335
- <title>{`${exclusive.get(b.id).only.toLocaleString()} of the people in ${b.name?.split(' ')[0]}’s circle are reached by none of your other connections`}</title>
336
- </text>
337
- )}
338
345
  </g>
339
346
  );
340
347
  })}
@@ -12,9 +12,12 @@ function useIsMobile() {
12
12
  const TIER_COLORS = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
13
13
 
14
14
 
15
- export default function FilterPanel({ collapsed, onToggle, mode, filter, onFilterChange, visualMode, onVisualModeChange, tierCounts, bridgeTierCounts, degrees = [1], onDegreesChange, degreeCounts = {} }) {
15
+ export default function FilterPanel({ collapsed, onToggle, mode, filter, onFilterChange, visualMode, onVisualModeChange, tierCounts, bridgeTierCounts, degrees = [1], onDegreesChange, degreeCounts = {}, hiddenTiers = [], onHiddenTiersChange }) {
16
16
  const isMobile = useIsMobile();
17
17
  const isDegreesMode = mode === 'degrees';
18
+ // Network Circle: each tier switches on and off, so the noisy ones (C, D) can go
19
+ // while the rest stay. Degrees keeps one tier at a time.
20
+ const toggles = !isDegreesMode && !!onHiddenTiersChange;
18
21
  // Same source of truth the renderer uses, so the menu can never offer a
19
22
  // view that does not exist or miss one that does.
20
23
  const modes = viewsForMode(isDegreesMode ? 'degrees' : 'network');
@@ -151,19 +154,48 @@ export default function FilterPanel({ collapsed, onToggle, mode, filter, onFilte
151
154
  <div style={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
152
155
  {/* All button */}
153
156
  <button
154
- onClick={() => onFilterChange && onFilterChange('all')}
157
+ onClick={() => (toggles ? onHiddenTiersChange([]) : onFilterChange && onFilterChange('all'))}
155
158
  style={{
156
159
  display: 'flex', alignItems: 'center', justifyContent: 'space-between',
157
160
  padding: '7px 10px', borderRadius: 6, border: 'none', cursor: 'pointer', width: '100%',
158
- background: filter === 'all' ? 'rgba(255,255,255,0.12)' : 'rgba(255,255,255,0.03)',
159
- color: filter === 'all' ? '#fff' : '#888',
161
+ background: (toggles ? !hiddenTiers.length : filter === 'all') ? 'rgba(255,255,255,0.12)' : 'rgba(255,255,255,0.03)',
162
+ color: (toggles ? !hiddenTiers.length : filter === 'all') ? '#fff' : '#888',
160
163
  }}
161
164
  >
162
165
  <span style={{ fontSize: 11, fontWeight: 600 }}>All</span>
163
166
  <span style={{ fontSize: 10, color: '#555' }}>{allCount}</span>
164
167
  </button>
165
168
  {/* Tier buttons */}
166
- {['S', 'A', 'B', 'C', 'D'].map(t => (
169
+ {toggles && (
170
+ <div style={{ fontSize: 10, color: '#667', margin: '2px 2px 4px' }}>Click a tier to hide or show it</div>
171
+ )}
172
+ {toggles && ['S', 'A', 'B', 'C', 'D'].map(t => {
173
+ const on = !hiddenTiers.includes(t);
174
+ const last = on && hiddenTiers.length >= 4;
175
+ return (
176
+ <button
177
+ key={t}
178
+ aria-pressed={on}
179
+ title={last ? 'Keep at least one tier showing' : on ? `Hide ${t}-Tier` : `Show ${t}-Tier`}
180
+ onClick={() => !last && onHiddenTiersChange(on ? [...hiddenTiers, t] : hiddenTiers.filter(x => x !== t))}
181
+ style={{
182
+ display: 'flex', alignItems: 'center', justifyContent: 'space-between',
183
+ padding: '7px 10px', borderRadius: 6, border: 'none', cursor: last ? 'default' : 'pointer', width: '100%',
184
+ background: on ? `${TIER_COLORS[t]}14` : 'rgba(255,255,255,0.02)',
185
+ color: on ? TIER_COLORS[t] : '#555',
186
+ borderLeft: on ? `3px solid ${TIER_COLORS[t]}` : '3px solid transparent',
187
+ }}
188
+ >
189
+ <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
190
+ <div style={{ width: 8, height: 8, borderRadius: '50%', background: TIER_COLORS[t], opacity: on ? 1 : 0.2 }} />
191
+ <span style={{ fontSize: 11, fontWeight: 600, textDecoration: on ? 'none' : 'line-through' }}>{t}-Tier</span>
192
+ {!on && <span style={{ fontSize: 9.5, color: '#667' }}>hidden</span>}
193
+ </div>
194
+ <span style={{ fontSize: 10, color: '#555' }}>{counts[t] || 0}</span>
195
+ </button>
196
+ );
197
+ })}
198
+ {!toggles && ['S', 'A', 'B', 'C', 'D'].map(t => (
167
199
  <button
168
200
  key={t}
169
201
  onClick={() => onFilterChange && onFilterChange(t)}