six-degrees 0.6.0 β 0.7.0
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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +3 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +14 -14
- package/.next/standalone/.next/routes-manifest.json +18 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +26 -18
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +26 -18
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +25 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin-delete/route.js +2 -2
- package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin-update/route.js +2 -2
- package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bridges/route.js +2 -2
- package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/bulk-import/route.js +2 -2
- package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +3 -3
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -3
- package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/connections/route.js +2 -2
- package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/backup/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/backup/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/backup/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/backup/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/backup/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/backup/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/backup/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/csv/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/csv/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/csv/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/csv/route.js +8 -0
- package/.next/standalone/.next/server/app/api/data/csv/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/csv/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/csv/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/export/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/import/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/restart/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/restore/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/restore/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/restore/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/restore/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/restore/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/restore/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/restore/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js +2 -2
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
- package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/route.js +2 -2
- package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/outreach/route.js +2 -2
- package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/queue/route.js +2 -2
- package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/scraper/route.js +4 -2
- package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js +3 -3
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +3 -3
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +3 -3
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/setup-profile/route.js +2 -2
- package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/crm/route.js +1 -1
- package/.next/standalone/.next/server/app/api/social/crm/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/messages/route.js +1 -1
- package/.next/standalone/.next/server/app/api/social/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js +2 -2
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/unlock/route.js +2 -2
- package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/update-images/route.js +2 -2
- package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/users/route.js +2 -2
- package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js +1 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page.js +1 -1
- package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/import.html +1 -1
- package/.next/standalone/.next/server/app/import.rsc +32 -24
- package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +29 -22
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +20 -15
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +29 -22
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch/page.js +1 -1
- package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/launch.html +2 -2
- package/.next/standalone/.next/server/app/launch.rsc +32 -24
- package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js +1 -1
- package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/paths.html +1 -1
- package/.next/standalone/.next/server/app/paths.rsc +32 -24
- package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +21 -18
- package/.next/standalone/.next/server/app/profile/page.js +1 -1
- package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/profile.html +1 -1
- package/.next/standalone/.next/server/app/profile.rsc +32 -24
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/queue/page.js +1 -1
- package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/queue.html +1 -1
- package/.next/standalone/.next/server/app/queue.rsc +32 -24
- package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +20 -18
- package/.next/standalone/.next/server/app/scores/page.js +1 -1
- package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/scores.html +1 -1
- package/.next/standalone/.next/server/app/scores.rsc +32 -24
- package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app/settings/page.js +1 -1
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +32 -24
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +20 -18
- package/.next/standalone/.next/server/app/setup/page.js +1 -1
- package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/setup.html +1 -1
- package/.next/standalone/.next/server/app/setup.rsc +32 -24
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +21 -18
- package/.next/standalone/.next/server/app/social/page.js +1 -1
- package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/social.html +1 -1
- package/.next/standalone/.next/server/app/social.rsc +32 -24
- package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +32 -24
- package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +23 -18
- package/.next/standalone/.next/server/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05_3-22._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__15wc9e-._.js β [root-of-the-server]__063s0x7._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__066rab1._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__13dx4sd._.js β [root-of-the-server]__0_4y8z7._.js} +3 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fooke1._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t6y79e._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x29muh._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a_6x37._.js +8 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an_8pa._.js +7 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ducpz2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xhyinn._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__20rwfdw._.js +1 -1
- package/.next/standalone/.next/server/chunks/_02twlca._.js +1 -1
- package/.next/standalone/.next/server/chunks/_072jl0y._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0sqqpzb._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1_fynia._.js +7 -7
- package/.next/standalone/.next/server/chunks/_1fn30_l._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_backup_route_actions_0zoj04p.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_csv_route_actions_0l6m7lg.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restore_route_actions_0-b05bv.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_02iz_9q._.js +4 -0
- package/.next/standalone/.next/server/chunks/lib_05agvk3._.js +4 -0
- package/.next/standalone/.next/server/chunks/lib_0v84u66._.js +4 -0
- package/.next/standalone/.next/server/chunks/lib_db-client_0_dch35.js +174 -0
- package/.next/standalone/.next/server/chunks/lib_linkedin-export_12imqxg.js +1 -1
- package/.next/standalone/.next/server/chunks/lib_rpc_005abye.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0b17r6v.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +7 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0doq0t-.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0fd2rlw.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0is4qoc.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0jnfp2e.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0nef_n7.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0plrzra.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_13a4m0c.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1if17c-.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1j-zw7v.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1sngt-q.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1v2sgme.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1vh-tgx.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1zaubz7.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qd8pzm._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qdeuyo._.js β [root-of-the-server]__1-012q1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_01o3i5y._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_02sband._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_06rgzfh._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_07zb7lu._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0_79idq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0gy11ar._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0hb-dhy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_14nxd3q._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_189g8lg._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1f_n00p._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1fm1ih_._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1k2nmbw._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1k9qfsk._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_141w189._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_0t908t-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_0uuff77._.js +25 -2
- package/.next/standalone/.next/server/chunks/ssr/app_components_1j3q-h5._.js +25 -2
- package/.next/standalone/.next/server/chunks/ssr/app_components_CompanyScores_1g0mytz.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +25 -13
- package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +11 -11
- package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +12 -13
- package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_1c4ieuw._.js β lib_csv_1ttiu_h.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_separation_1305zsx.js +3 -0
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/03-_esd2x_yk6.js +1 -0
- package/.next/standalone/.next/static/chunks/03-demj2iy-0p.js +44 -0
- package/.next/standalone/.next/static/chunks/0_1r-3csplxnj.js +1 -0
- package/.next/standalone/.next/static/chunks/0an_b6zi1r_qq.js +5 -0
- package/.next/standalone/.next/static/chunks/0e3g0sil79cus.js +21 -0
- package/.next/standalone/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
- package/.next/standalone/.next/static/chunks/0p3g5tfostsep.js +7 -0
- package/.next/standalone/.next/static/chunks/0zd0t7e60bn4z.js +1 -0
- package/.next/standalone/.next/static/chunks/163b-20vwa06i.js +34 -0
- package/.next/standalone/.next/static/chunks/{0ws7zy0w57ufi.js β 1eyajb9ntzlrl.js} +1 -1
- package/.next/standalone/.next/static/chunks/1pa-2v1ajvrko.js +1 -0
- package/.next/standalone/.next/static/chunks/1qbjermbf68xj.js +1 -0
- package/.next/standalone/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
- package/.next/standalone/.next/static/chunks/23_1z47al92nz.js +57 -0
- package/.next/standalone/.next/static/chunks/260bomtr214m8.js +34 -0
- package/.next/standalone/.next/static/chunks/2eo9pqq9gay3r.js +34 -0
- package/.next/standalone/.next/static/chunks/2xk2ra4piiuod.js +34 -0
- package/.next/standalone/.next/static/chunks/2z1-q0_vunbql.js +2 -0
- package/.next/standalone/.next/static/chunks/2zf4jmz9l3li2.js +1 -0
- package/.next/standalone/.next/static/chunks/34g73qhayuevu.js +1 -0
- package/.next/standalone/.next/static/chunks/3b0-14cxqsprt.js +1 -0
- package/.next/standalone/.next/static/chunks/3jarus1_38s2z.js +1 -0
- package/.next/standalone/.next/static/chunks/3ssu341hav_sq.css +3 -0
- package/.next/standalone/.next/static/chunks/3v1qd3sqhqn0d.js +1 -0
- package/.next/standalone/.next/static/chunks/43pg2sursiypz.js +1 -0
- package/.next/standalone/.next/static/chunks/44yn0tcd9dfk3.js +1 -0
- package/.next/standalone/CHANGELOG.md +143 -0
- package/.next/standalone/README.md +71 -49
- package/.next/standalone/SECURITY.md +17 -11
- package/.next/standalone/app/api/data/backup/route.js +25 -0
- package/.next/standalone/app/api/data/csv/route.js +74 -0
- package/.next/standalone/app/api/data/export/route.js +1 -1
- package/.next/standalone/app/api/data/restore/route.js +48 -0
- package/.next/standalone/app/api/data/reveal/route.js +19 -6
- package/.next/standalone/app/api/data/route.js +15 -4
- package/.next/standalone/app/api/ingest/route.js +1 -1
- package/.next/standalone/app/api/queue/route.js +1 -1
- package/.next/standalone/app/api/scraper/route.js +120 -32
- package/.next/standalone/app/api/social/crm/route.js +2 -1
- package/.next/standalone/app/components/AppHeader.js +20 -16
- package/.next/standalone/app/components/AppTabs.js +8 -8
- package/.next/standalone/app/components/AutoScanButton.js +2 -2
- package/.next/standalone/app/components/Avatar.js +1 -1
- package/.next/standalone/app/components/ChainView.js +184 -112
- package/.next/standalone/app/components/CirclePanel.js +16 -16
- package/.next/standalone/app/components/ClusterSpinner.js +64 -0
- package/.next/standalone/app/components/CompanyScores.js +20 -20
- package/.next/standalone/app/components/EmptyState.js +39 -18
- package/.next/standalone/app/components/FieldStep.js +15 -13
- package/.next/standalone/app/components/FilterPanel.js +17 -17
- package/.next/standalone/app/components/ForceGraph.js +49 -14
- package/.next/standalone/app/components/GalaxyLab.js +33 -33
- package/.next/standalone/app/components/GridView.js +18 -18
- package/.next/standalone/app/components/LegacyScoresCard.js +10 -11
- package/.next/standalone/app/components/LinkedInLimits.js +24 -19
- package/.next/standalone/app/components/LiquidGlass.js +99 -0
- package/.next/standalone/app/components/ListView.js +20 -20
- package/.next/standalone/app/components/MapControls.js +5 -5
- package/.next/standalone/app/components/MappingProgress.js +16 -16
- package/.next/standalone/app/components/NoteDetail.js +13 -13
- package/.next/standalone/app/components/OnboardingGate.js +4 -4
- package/.next/standalone/app/components/OutlinkQuest.js +25 -25
- package/.next/standalone/app/components/PathsAnalyzer.js +37 -36
- package/.next/standalone/app/components/PeopleMap.js +21 -21
- package/.next/standalone/app/components/RingsView.js +11 -11
- package/.next/standalone/app/components/ScanRadar.js +84 -39
- package/.next/standalone/app/components/ScanStatusBar.js +22 -18
- package/.next/standalone/app/components/ScanTrail.js +8 -5
- package/.next/standalone/app/components/SeparationView.js +168 -104
- package/.next/standalone/app/components/Sidebar.js +161 -161
- package/.next/standalone/app/components/StaleServerBanner.js +4 -4
- package/.next/standalone/app/components/TheirCircle.js +26 -26
- package/.next/standalone/app/components/ThemeDefs.js +42 -0
- package/.next/standalone/app/components/ThemeLoader.js +20 -1
- package/.next/standalone/app/components/UpdatePanel.js +22 -22
- package/.next/standalone/app/components/UserProvider.js +22 -15
- package/.next/standalone/app/components/settings/AppearanceSection.js +47 -24
- package/.next/standalone/app/components/settings/DataSection.js +276 -109
- package/.next/standalone/app/components/settings/NetworkHealthSection.js +13 -13
- package/.next/standalone/app/components/settings/SectorPicker.js +12 -12
- package/.next/standalone/app/components/settings/SectorSection.js +13 -14
- package/.next/standalone/app/components/settings/TierSection.js +9 -9
- package/.next/standalone/app/components/settings/TitleSection.js +11 -11
- package/.next/standalone/app/components/settings/UsageSection.js +313 -0
- package/.next/standalone/app/components/ui.js +8 -8
- package/.next/standalone/app/globals.css +159 -2
- package/.next/standalone/app/import/page.js +94 -38
- package/.next/standalone/app/launch/page.js +5 -5
- package/.next/standalone/app/layout.js +6 -2
- package/.next/standalone/app/page.js +53 -37
- package/.next/standalone/app/paths/page.js +63 -63
- package/.next/standalone/app/profile/page.js +58 -58
- package/.next/standalone/app/queue/page.js +54 -54
- package/.next/standalone/app/scores/page.js +2 -2
- package/.next/standalone/app/settings/page.js +16 -13
- package/.next/standalone/app/setup/page.js +221 -125
- package/.next/standalone/app/social/Crm.js +63 -62
- package/.next/standalone/app/social/SocialHub.js +22 -22
- package/.next/standalone/app/social/Thread.js +7 -7
- package/.next/standalone/app/social/page.js +2 -2
- package/.next/standalone/lib/backups.js +458 -0
- package/.next/standalone/lib/chain-layout.js +32 -0
- package/.next/standalone/lib/csv-store.js +131 -0
- package/.next/standalone/lib/csv.js +137 -39
- package/.next/standalone/lib/data-folder.js +19 -3
- package/.next/standalone/lib/data-import.js +5 -2
- package/.next/standalone/lib/db-client.js +78 -20
- package/.next/standalone/lib/demo.js +5 -4
- package/.next/standalone/lib/galaxy-export.js +9 -2
- package/.next/standalone/lib/galaxy-lab.js +19 -5
- package/.next/standalone/lib/galaxy-layouts.js +43 -0
- package/.next/standalone/lib/gate.js +10 -4
- package/.next/standalone/lib/ingest.js +1 -1
- package/.next/standalone/lib/linkedin-limits.js +212 -11
- package/.next/standalone/lib/liquid-glass.js +59 -0
- package/.next/standalone/lib/notifications.js +13 -0
- package/.next/standalone/lib/scan-pace.js +11 -0
- package/.next/standalone/lib/scan-progress.js +20 -0
- package/.next/standalone/lib/scan-risk.js +44 -0
- package/.next/standalone/lib/scanner-setup.js +97 -15
- package/.next/standalone/lib/scraper-client.js +17 -3
- package/.next/standalone/lib/search-risk.js +7 -3
- package/.next/standalone/lib/settings-client.js +5 -3
- package/.next/standalone/lib/settings.js +10 -0
- package/.next/standalone/lib/social-store.js +3 -2
- package/.next/standalone/lib/synced-setting.js +46 -0
- package/.next/standalone/lib/theme-store.js +42 -10
- package/.next/standalone/lib/themes.js +111 -21
- package/.next/standalone/lib/usage.js +195 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/scrape.py +26 -2
- package/.next/static/chunks/03-_esd2x_yk6.js +1 -0
- package/.next/static/chunks/03-demj2iy-0p.js +44 -0
- package/.next/static/chunks/0_1r-3csplxnj.js +1 -0
- package/.next/static/chunks/0an_b6zi1r_qq.js +5 -0
- package/.next/static/chunks/0e3g0sil79cus.js +21 -0
- package/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
- package/.next/static/chunks/0p3g5tfostsep.js +7 -0
- package/.next/static/chunks/0zd0t7e60bn4z.js +1 -0
- package/.next/static/chunks/163b-20vwa06i.js +34 -0
- package/.next/static/chunks/{0ws7zy0w57ufi.js β 1eyajb9ntzlrl.js} +1 -1
- package/.next/static/chunks/1pa-2v1ajvrko.js +1 -0
- package/.next/static/chunks/1qbjermbf68xj.js +1 -0
- package/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
- package/.next/static/chunks/23_1z47al92nz.js +57 -0
- package/.next/static/chunks/260bomtr214m8.js +34 -0
- package/.next/static/chunks/2eo9pqq9gay3r.js +34 -0
- package/.next/static/chunks/2xk2ra4piiuod.js +34 -0
- package/.next/static/chunks/2z1-q0_vunbql.js +2 -0
- package/.next/static/chunks/2zf4jmz9l3li2.js +1 -0
- package/.next/static/chunks/34g73qhayuevu.js +1 -0
- package/.next/static/chunks/3b0-14cxqsprt.js +1 -0
- package/.next/static/chunks/3jarus1_38s2z.js +1 -0
- package/.next/static/chunks/3ssu341hav_sq.css +3 -0
- package/.next/static/chunks/3v1qd3sqhqn0d.js +1 -0
- package/.next/static/chunks/43pg2sursiypz.js +1 -0
- package/.next/static/chunks/44yn0tcd9dfk3.js +1 -0
- package/CHANGELOG.md +143 -0
- package/README.md +71 -49
- package/SECURITY.md +17 -11
- package/lib/backups.js +458 -0
- package/lib/chain-layout.js +32 -0
- package/lib/csv-store.js +131 -0
- package/lib/csv.js +137 -39
- package/lib/data-folder.js +19 -3
- package/lib/data-import.js +5 -2
- package/lib/db-client.js +78 -20
- package/lib/demo.js +5 -4
- package/lib/galaxy-export.js +9 -2
- package/lib/galaxy-lab.js +19 -5
- package/lib/galaxy-layouts.js +43 -0
- package/lib/gate.js +10 -4
- package/lib/ingest.js +1 -1
- package/lib/linkedin-limits.js +212 -11
- package/lib/liquid-glass.js +59 -0
- package/lib/notifications.js +13 -0
- package/lib/scan-pace.js +11 -0
- package/lib/scan-progress.js +20 -0
- package/lib/scan-risk.js +44 -0
- package/lib/scanner-setup.js +97 -15
- package/lib/scraper-client.js +17 -3
- package/lib/search-risk.js +7 -3
- package/lib/settings-client.js +5 -3
- package/lib/settings.js +10 -0
- package/lib/social-store.js +3 -2
- package/lib/synced-setting.js +46 -0
- package/lib/theme-store.js +42 -10
- package/lib/themes.js +111 -21
- package/lib/usage.js +195 -0
- package/package.json +1 -1
- package/scripts/scrape.py +26 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_0851sk0._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_1q7p2ro._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_1r6l86l._.js +0 -8
- package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +0 -174
- package/.next/standalone/.next/server/chunks/lib_rpc_04s8mzr.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_053z7as.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0b_-2te.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0dhbxdm.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0dxlk31.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0f8b-qc.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0pzie7_.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0r76fq_.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_0ut7pjp.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_15zyqaz.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_18zpjtq.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1a8xkiz.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1e_55xo.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1oxfd1_.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_rpc_1s0lod0.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08oxiqh._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_03l7vge._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_08g31gm._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0gk_ofx._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0nwsf93._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0vho1lb._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1-658fq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1bc46kz._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_2105jz8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_components_settings_SectorPicker_1c-29qw.js +0 -3
- package/.next/standalone/.next/static/chunks/02pq76u7y4v9-.js +0 -22
- package/.next/standalone/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
- package/.next/standalone/.next/static/chunks/0i02yxppzds1o.js +0 -1
- package/.next/standalone/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
- package/.next/standalone/.next/static/chunks/0oyslj62jkubd.js +0 -1
- package/.next/standalone/.next/static/chunks/0vo-l8hxneba6.css +0 -3
- package/.next/standalone/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
- package/.next/standalone/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
- package/.next/standalone/.next/static/chunks/172e10mi-tpo_.js +0 -34
- package/.next/standalone/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
- package/.next/standalone/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
- package/.next/standalone/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
- package/.next/standalone/.next/static/chunks/1m3017gp790pw.js +0 -45
- package/.next/standalone/.next/static/chunks/1t20e8u0st7ep.js +0 -1
- package/.next/standalone/.next/static/chunks/2-ch9rm27eril.js +0 -11
- package/.next/standalone/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
- package/.next/standalone/.next/static/chunks/3bp284gjf7dyq.js +0 -1
- package/.next/standalone/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
- package/.next/standalone/.next/static/chunks/3l4t8je6iguzc.js +0 -1
- package/.next/standalone/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
- package/.next/standalone/.next/static/chunks/42m0bqr8pbovz.js +0 -11
- package/.next/static/chunks/02pq76u7y4v9-.js +0 -22
- package/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
- package/.next/static/chunks/0i02yxppzds1o.js +0 -1
- package/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
- package/.next/static/chunks/0oyslj62jkubd.js +0 -1
- package/.next/static/chunks/0vo-l8hxneba6.css +0 -3
- package/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
- package/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
- package/.next/static/chunks/172e10mi-tpo_.js +0 -34
- package/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
- package/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
- package/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
- package/.next/static/chunks/1m3017gp790pw.js +0 -45
- package/.next/static/chunks/1t20e8u0st7ep.js +0 -1
- package/.next/static/chunks/2-ch9rm27eril.js +0 -11
- package/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
- package/.next/static/chunks/3bp284gjf7dyq.js +0 -1
- package/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
- package/.next/static/chunks/3l4t8je6iguzc.js +0 -1
- package/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
- package/.next/static/chunks/42m0bqr8pbovz.js +0 -11
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT β ZVpLBK-2vpllv2HxOFs2d}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT β ZVpLBK-2vpllv2HxOFs2d}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT β ZVpLBK-2vpllv2HxOFs2d}/_ssgManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT β ZVpLBK-2vpllv2HxOFs2d}/_buildManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT β ZVpLBK-2vpllv2HxOFs2d}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT β ZVpLBK-2vpllv2HxOFs2d}/_ssgManifest.js +0 -0
|
@@ -82,12 +82,12 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
82
82
|
onClick={() => onSelect && onSelect(null)}
|
|
83
83
|
style={{
|
|
84
84
|
display: 'flex', alignItems: 'center', gap: 6, background: 'none', border: 'none',
|
|
85
|
-
color: '#888', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
|
|
85
|
+
color: 'var(--sd-fg-3, #888)', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
|
|
86
86
|
}}
|
|
87
87
|
>
|
|
88
88
|
<span style={{ fontSize: 16 }}>←</span> Back to list
|
|
89
89
|
</button>
|
|
90
|
-
<div style={{ fontSize: 10, color: '#888', marginBottom: 8, letterSpacing: 1, textTransform: 'uppercase' }}>
|
|
90
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 8, letterSpacing: 1, textTransform: 'uppercase' }}>
|
|
91
91
|
{selected.degree === 2 ? 'Degree 2 Connection' : 'Degree 1 Connection'}
|
|
92
92
|
</div>
|
|
93
93
|
<div style={{ display: 'flex', gap: 6, marginBottom: 8, flexWrap: 'wrap' }}>
|
|
@@ -108,7 +108,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
108
108
|
fontSize: 11.5, color: '#8fb8d6', lineHeight: 1.5,
|
|
109
109
|
}}>
|
|
110
110
|
{selected.degree === 1 ? 'You met them through ' : 'Reachable through '}
|
|
111
|
-
<b style={{ color: '#cfe6f7' }}>{selected.unlocked_from_name}</b>
|
|
111
|
+
<b style={{ color: 'var(--sd-fg-1, #cfe6f7)' }}>{selected.unlocked_from_name}</b>
|
|
112
112
|
</div>
|
|
113
113
|
)}
|
|
114
114
|
|
|
@@ -136,13 +136,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
136
136
|
background: tierColors[selected.tier] || '#555',
|
|
137
137
|
display: localPhoto(selected.profile_image_url) ? 'none' : 'flex',
|
|
138
138
|
alignItems: 'center', justifyContent: 'center',
|
|
139
|
-
fontSize: 20, fontWeight: 700, color: selected.tier === 'S' ? '#000' : '#fff',
|
|
139
|
+
fontSize: 20, fontWeight: 700, color: selected.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
140
140
|
}}>
|
|
141
141
|
{selected.name?.charAt(0)}
|
|
142
142
|
</div>
|
|
143
143
|
<div style={{ minWidth: 0 }}>
|
|
144
144
|
<h2 style={{ fontSize: 18, fontWeight: 700, margin: 0 }}>{selected.name}</h2>
|
|
145
|
-
<p style={{ color: '#aaa', fontSize: 11, margin: '3px 0 0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{selected.headline?.substring(0, 60)}</p>
|
|
145
|
+
<p style={{ color: 'var(--sd-fg-3, #aaa)', fontSize: 11, margin: '3px 0 0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{selected.headline?.substring(0, 60)}</p>
|
|
146
146
|
{selected.profile_url && (
|
|
147
147
|
<a href={selected.profile_url} target="_blank" rel="noopener noreferrer" style={{ fontSize: 10, color: '#0077B5', textDecoration: 'none', fontWeight: 600 }}>
|
|
148
148
|
View on LinkedIn
|
|
@@ -166,22 +166,22 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
166
166
|
if (!i) return null;
|
|
167
167
|
const first = selected.name?.split(' ')[0] || 'them';
|
|
168
168
|
const twin = i.twin && connections.find((c) => c.id === i.twin.id);
|
|
169
|
-
const row = { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 10, padding: '7px 0', borderTop: '1px solid rgba(255,255,255,0.05)' };
|
|
170
|
-
const label = { fontSize: 10.5, color: '#8b9a9a', minWidth: 92 };
|
|
171
|
-
const act = { background: 'none', border: 'none', padding: 0, color: '#3498DB', cursor: 'pointer', fontSize: 11.5, whiteSpace: 'nowrap' };
|
|
169
|
+
const row = { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 10, padding: '7px 0', borderTop: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.05)' };
|
|
170
|
+
const label = { fontSize: 10.5, color: 'var(--sd-fg-3, #8b9a9a)', minWidth: 92 };
|
|
171
|
+
const act = { background: 'none', border: 'none', padding: 0, color: 'var(--sd-blue, #3498DB)', cursor: 'pointer', fontSize: 11.5, whiteSpace: 'nowrap' };
|
|
172
172
|
const scanned = i.bars == null ? 'Not scanned yet' : i.bars === 5 ? 'Their whole list' : `About ${i.bars * 20}% of their list`;
|
|
173
173
|
return (
|
|
174
174
|
<div style={{ border: '1px solid rgba(52,152,219,0.25)', borderRadius: 8, marginBottom: 16, background: 'rgba(52,152,219,0.04)' }}>
|
|
175
175
|
<button onClick={() => setShowInsights((v) => !v)} aria-expanded={showInsights}
|
|
176
|
-
style={{ width: '100%', display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '9px 12px', background: 'none', border: 'none', cursor: 'pointer', color: '#cfe6f7' }}>
|
|
176
|
+
style={{ width: '100%', display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '9px 12px', background: 'none', border: 'none', cursor: 'pointer', color: 'var(--sd-fg-1, #cfe6f7)' }}>
|
|
177
177
|
<span style={{ fontSize: 11, fontWeight: 700, letterSpacing: 1 }}>INSIGHTS</span>
|
|
178
|
-
<span style={{ fontSize: 11, color: '#8b9a9a' }}>
|
|
178
|
+
<span style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)' }}>
|
|
179
179
|
{!showInsights && i.circle > 0 && `${i.circle.toLocaleString()} in their circle${i.only ? ` Β· ${i.only.toLocaleString()} only through ${first}` : ''} `}
|
|
180
180
|
{showInsights ? 'β²' : 'βΌ'}
|
|
181
181
|
</span>
|
|
182
182
|
</button>
|
|
183
183
|
{showInsights && (
|
|
184
|
-
<div style={{ padding: '0 12px 8px', fontSize: 12, color: '#ccc' }}>
|
|
184
|
+
<div style={{ padding: '0 12px 8px', fontSize: 12, color: 'var(--sd-fg-2, #ccc)' }}>
|
|
185
185
|
<div style={row}>
|
|
186
186
|
<span style={label}>Their circle</span>
|
|
187
187
|
<span style={{ flex: 1 }}>{i.circle ? `${i.circle.toLocaleString()} people` : 'None scanned yet'}</span>
|
|
@@ -190,7 +190,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
190
190
|
<div style={row}>
|
|
191
191
|
<span style={label}>Only through {first}</span>
|
|
192
192
|
<span style={{ flex: 1 }}>
|
|
193
|
-
{i.circle ? <><b style={{ color: '#00ff88' }}>{i.only.toLocaleString()}</b> ({Math.round(i.onlyShare * 100)}%): none of your other connections reach them</> : '
|
|
193
|
+
{i.circle ? <><b style={{ color: 'var(--sd-green, #00ff88)' }}>{i.only.toLocaleString()}</b> ({Math.round(i.onlyShare * 100)}%): none of your other connections reach them</> : '-'}
|
|
194
194
|
</span>
|
|
195
195
|
{i.only > 0 && onShowInSeparation && (
|
|
196
196
|
<button style={act} onClick={() => onShowInSeparation({ query: selected.name, rarity: 'only' })}>Show them β</button>
|
|
@@ -199,18 +199,18 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
199
199
|
<div style={row}>
|
|
200
200
|
<span style={label}>Closest overlap</span>
|
|
201
201
|
<span style={{ flex: 1 }}>
|
|
202
|
-
{twin ? <>Opens the same doors as <b style={{ color: '#fff' }}>{twin.name}</b> ({Math.round(i.twin.share * 100)}%, {i.twin.shared.toLocaleString()} people)</> : 'No one opens the same doors'}
|
|
202
|
+
{twin ? <>Opens the same doors as <b style={{ color: 'var(--sd-fg-1, #fff)' }}>{twin.name}</b> ({Math.round(i.twin.share * 100)}%, {i.twin.shared.toLocaleString()} people)</> : 'No one opens the same doors'}
|
|
203
203
|
</span>
|
|
204
204
|
{twin && <button style={act} onClick={() => onSelect?.(twin)}>Open β</button>}
|
|
205
205
|
</div>
|
|
206
206
|
<div style={row}>
|
|
207
207
|
<span style={label}>Tier mix</span>
|
|
208
|
-
<span style={{ flex: 1, display: 'flex', height: 8, borderRadius: 4, overflow: 'hidden', background: 'rgba(255,255,255,0.05)', alignSelf: 'center' }}>
|
|
208
|
+
<span style={{ flex: 1, display: 'flex', height: 8, borderRadius: 4, overflow: 'hidden', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', alignSelf: 'center' }}>
|
|
209
209
|
{i.circle > 0 && ['S', 'A', 'B', 'C', 'D'].map((t) => i.mix[t] > 0 && (
|
|
210
210
|
<span key={t} title={`${t}: ${i.mix[t]}`} style={{ width: `${(100 * i.mix[t]) / i.circle}%`, background: tierColors[t] }} />
|
|
211
211
|
))}
|
|
212
212
|
</span>
|
|
213
|
-
<span style={{ fontSize: 10.5, color: '#8b9a9a' }}>{i.circle ? `${i.mix.S} S Β· ${i.mix.A} A` : ''}</span>
|
|
213
|
+
<span style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #8b9a9a)' }}>{i.circle ? `${i.mix.S} S Β· ${i.mix.A} A` : ''}</span>
|
|
214
214
|
{i.mix.S > 0 && onShowInSeparation && (
|
|
215
215
|
<button style={act} onClick={() => onShowInSeparation({ query: selected.name, tier: 'S' })}>S only β</button>
|
|
216
216
|
)}
|
|
@@ -257,11 +257,11 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
257
257
|
background: 'rgba(0,255,136,0.08)', border: '1px solid rgba(0,255,136,0.3)',
|
|
258
258
|
borderRadius: 8, padding: 12, marginBottom: 16,
|
|
259
259
|
}}>
|
|
260
|
-
<div style={{ fontSize: 10, color: '#00ff88', fontWeight: 700, marginBottom: 4, letterSpacing: 1 }}>CATALYST NODE</div>
|
|
261
|
-
<div style={{ fontSize: 12, color: '#ccc' }}>
|
|
260
|
+
<div style={{ fontSize: 10, color: 'var(--sd-green, #00ff88)', fontWeight: 700, marginBottom: 4, letterSpacing: 1 }}>CATALYST NODE</div>
|
|
261
|
+
<div style={{ fontSize: 12, color: 'var(--sd-fg-2, #ccc)' }}>
|
|
262
262
|
This person's network power exceeds their own tier. They connect to{' '}
|
|
263
|
-
<strong style={{ color: '#00ff88' }}>{selected.catalyst_score} S+A tier</strong>{' '}
|
|
264
|
-
people
|
|
263
|
+
<strong style={{ color: 'var(--sd-green, #00ff88)' }}>{selected.catalyst_score} S+A tier</strong>{' '}
|
|
264
|
+
people, making them a high-value stepping stone to reach elite connections.
|
|
265
265
|
</div>
|
|
266
266
|
</div>
|
|
267
267
|
)}
|
|
@@ -271,43 +271,43 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
271
271
|
)}
|
|
272
272
|
|
|
273
273
|
{/* === SCORE CARD === */}
|
|
274
|
-
<div style={{ background: 'rgba(255,255,255,0.04)', borderRadius: 8, padding: 12, marginBottom: 16 }}>
|
|
274
|
+
<div style={{ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.04)', borderRadius: 8, padding: 12, marginBottom: 16 }}>
|
|
275
275
|
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', marginBottom: 8 }}>
|
|
276
|
-
<span style={{ fontSize: 11, color: '#888', fontWeight: 600, letterSpacing: 1, textTransform: 'uppercase' }}>Score</span>
|
|
276
|
+
<span style={{ fontSize: 11, color: 'var(--sd-fg-3, #888)', fontWeight: 600, letterSpacing: 1, textTransform: 'uppercase' }}>Score</span>
|
|
277
277
|
<span style={{ fontSize: 28, fontWeight: 800, color: tierColors[selected.tier] || '#fff' }}>
|
|
278
278
|
{parseFloat(selected.power_score).toFixed(1)}
|
|
279
279
|
</span>
|
|
280
280
|
</div>
|
|
281
281
|
{/* Why: title Γ company weight + bonuses (lib/scoring.js) */}
|
|
282
282
|
{selected.score_why && (
|
|
283
|
-
<div style={{ fontSize: 11, color: '#aab7b7', lineHeight: 1.5, marginBottom: 10 }}>{selected.score_why}</div>
|
|
283
|
+
<div style={{ fontSize: 11, color: 'var(--sd-fg-2, #aab7b7)', lineHeight: 1.5, marginBottom: 10 }}>{selected.score_why}</div>
|
|
284
284
|
)}
|
|
285
285
|
{/* Job Power bar */}
|
|
286
286
|
<div style={{ marginBottom: 6 }}>
|
|
287
|
-
<div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#888', marginBottom: 2 }}>
|
|
287
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>
|
|
288
288
|
<span>Title</span><span>{selected.seniority_score || 0}/10</span>
|
|
289
289
|
</div>
|
|
290
|
-
<div style={{ height: 4, background: 'rgba(255,255,255,0.08)', borderRadius: 2 }}>
|
|
290
|
+
<div style={{ height: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 2 }}>
|
|
291
291
|
<div style={{ height: '100%', width: `${(selected.seniority_score || 0) * 10}%`, background: tierColors[selected.tier] || '#FFD700', borderRadius: 2 }} />
|
|
292
292
|
</div>
|
|
293
293
|
</div>
|
|
294
294
|
{/* Status Power bar */}
|
|
295
295
|
<div style={{ marginBottom: selected.circle_power > 0 ? 6 : 0 }}>
|
|
296
|
-
<div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#888', marginBottom: 2 }}>
|
|
296
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>
|
|
297
297
|
<span>Company</span><span>{selected.company_prestige_score || 0}/10</span>
|
|
298
298
|
</div>
|
|
299
|
-
<div style={{ height: 4, background: 'rgba(255,255,255,0.08)', borderRadius: 2 }}>
|
|
299
|
+
<div style={{ height: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 2 }}>
|
|
300
300
|
<div style={{ height: '100%', width: `${(selected.company_prestige_score || 0) * 10}%`, background: '#3498DB', borderRadius: 2 }} />
|
|
301
301
|
</div>
|
|
302
302
|
</div>
|
|
303
303
|
{/* Circle Power bar β only shows for bridges with clusters */}
|
|
304
304
|
{selected.circle_power > 0 && (
|
|
305
305
|
<div>
|
|
306
|
-
<div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#888', marginBottom: 2 }}>
|
|
306
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>
|
|
307
307
|
<span>Circle Power</span>
|
|
308
|
-
<span style={{ color: '#FF6B35' }}>{selected.circle_s_count || 0}S Β· {selected.circle_a_count || 0}A</span>
|
|
308
|
+
<span style={{ color: 'var(--sd-orange, #FF6B35)' }}>{selected.circle_s_count || 0}S Β· {selected.circle_a_count || 0}A</span>
|
|
309
309
|
</div>
|
|
310
|
-
<div style={{ height: 4, background: 'rgba(255,255,255,0.08)', borderRadius: 2 }}>
|
|
310
|
+
<div style={{ height: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 2 }}>
|
|
311
311
|
<div style={{ height: '100%', width: `${Math.min(parseFloat(selected.circle_power) / 70 * 100, 100)}%`, background: '#FF6B35', borderRadius: 2 }} />
|
|
312
312
|
</div>
|
|
313
313
|
</div>
|
|
@@ -316,10 +316,10 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
316
316
|
|
|
317
317
|
{/* === WHY THIS MATTERS === */}
|
|
318
318
|
<div style={{ marginBottom: 16 }}>
|
|
319
|
-
<div style={{ fontSize: 10, fontWeight: 700, color: '#FFD700', letterSpacing: 1, marginBottom: 6, textTransform: 'uppercase' }}>
|
|
319
|
+
<div style={{ fontSize: 10, fontWeight: 700, color: 'var(--sd-gold, #FFD700)', letterSpacing: 1, marginBottom: 6, textTransform: 'uppercase' }}>
|
|
320
320
|
Why This Matters
|
|
321
321
|
</div>
|
|
322
|
-
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 11, color: '#ccc' }}>
|
|
322
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 11, color: 'var(--sd-fg-2, #ccc)' }}>
|
|
323
323
|
{generateInsights(selected, userProfile, connections, degree2, routes).map((insight, idx) => (
|
|
324
324
|
<div key={idx} style={{ display: 'flex', gap: 6, alignItems: 'flex-start' }}>
|
|
325
325
|
<span style={{ color: insight.color || '#888', fontSize: 13, lineHeight: 1 }}>{insight.icon}</span>
|
|
@@ -331,13 +331,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
331
331
|
|
|
332
332
|
{selected.company && (
|
|
333
333
|
<div style={{ marginBottom: 8 }}>
|
|
334
|
-
<div style={{ color: '#666', fontSize: 10 }}>Company</div>
|
|
334
|
+
<div style={{ color: 'var(--sd-fg-4, #666)', fontSize: 10 }}>Company</div>
|
|
335
335
|
<div style={{ fontWeight: 600, fontSize: 12 }}>{selected.company}</div>
|
|
336
336
|
</div>
|
|
337
337
|
)}
|
|
338
338
|
{selected.role && (
|
|
339
339
|
<div style={{ marginBottom: 12 }}>
|
|
340
|
-
<div style={{ color: '#666', fontSize: 10 }}>Role</div>
|
|
340
|
+
<div style={{ color: 'var(--sd-fg-4, #666)', fontSize: 10 }}>Role</div>
|
|
341
341
|
<div style={{ fontSize: 12 }}>{selected.role}</div>
|
|
342
342
|
</div>
|
|
343
343
|
)}
|
|
@@ -349,12 +349,12 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
349
349
|
const topPeople = [...bridgeConnections].sort((a, b) => (parseFloat(b.power_score) || 0) - (parseFloat(a.power_score) || 0)).slice(0, 8);
|
|
350
350
|
return (
|
|
351
351
|
<div style={{ marginBottom: 16 }}>
|
|
352
|
-
<div style={{ fontSize: 10, fontWeight: 700, color: '#FF6B35', letterSpacing: 1, marginBottom: 8, textTransform: 'uppercase' }}>
|
|
353
|
-
Cluster Overview
|
|
352
|
+
<div style={{ fontSize: 10, fontWeight: 700, color: 'var(--sd-orange, #FF6B35)', letterSpacing: 1, marginBottom: 8, textTransform: 'uppercase' }}>
|
|
353
|
+
Cluster Overview Β· {bridgeConnections.length} connections
|
|
354
354
|
</div>
|
|
355
355
|
<div style={{ display: 'flex', gap: 6, marginBottom: 8, fontSize: 10 }}>
|
|
356
|
-
{sTier.length > 0 && <span style={{ color: '#FFD700', fontWeight: 600 }}>{sTier.length} S-tier</span>}
|
|
357
|
-
{aTier.length > 0 && <span style={{ color: '#9B59B6', fontWeight: 600 }}>{aTier.length} A-tier</span>}
|
|
356
|
+
{sTier.length > 0 && <span style={{ color: 'var(--sd-gold, #FFD700)', fontWeight: 600 }}>{sTier.length} S-tier</span>}
|
|
357
|
+
{aTier.length > 0 && <span style={{ color: 'var(--sd-purple, #9B59B6)', fontWeight: 600 }}>{aTier.length} A-tier</span>}
|
|
358
358
|
</div>
|
|
359
359
|
{/* Outlink Bridge button */}
|
|
360
360
|
<a href={`/queue?bridge=${selected.id}&groupBy=bridge`} style={{
|
|
@@ -364,7 +364,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
364
364
|
}}>
|
|
365
365
|
Outlink Bridge β Add {bridgeConnections.filter(m => m.tier === 'S' || m.tier === 'A' || m.tier === 'B').length} People
|
|
366
366
|
</a>
|
|
367
|
-
<div style={{ fontSize: 10, color: '#888', marginBottom: 8 }}>Most valuable in this cluster:</div>
|
|
367
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 8 }}>Most valuable in this cluster:</div>
|
|
368
368
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
369
369
|
{topPeople.map(m => (
|
|
370
370
|
<div key={m.id}
|
|
@@ -372,10 +372,10 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
372
372
|
style={{
|
|
373
373
|
display: 'flex', alignItems: 'center', gap: 6, padding: '4px 6px',
|
|
374
374
|
borderRadius: 4, cursor: 'pointer', borderLeft: `2px solid ${tierColors[m.tier] || '#555'}`,
|
|
375
|
-
background: 'rgba(255,255,255,0.03)',
|
|
375
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)',
|
|
376
376
|
}}
|
|
377
|
-
onMouseEnter={e => e.currentTarget.style.background = 'rgba(255,255,255,0.08)'}
|
|
378
|
-
onMouseLeave={e => e.currentTarget.style.background = 'rgba(255,255,255,0.03)'}
|
|
377
|
+
onMouseEnter={e => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.08)'}
|
|
378
|
+
onMouseLeave={e => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.03)'}
|
|
379
379
|
>
|
|
380
380
|
{localPhoto(m.profile_image_url) ? (
|
|
381
381
|
<img src={localPhoto(m.profile_image_url)} alt="" style={{
|
|
@@ -385,12 +385,12 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
385
385
|
) : null}
|
|
386
386
|
<div style={{
|
|
387
387
|
width: 22, height: 22, borderRadius: '50%', flexShrink: 0, fontSize: 9, fontWeight: 700,
|
|
388
|
-
background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : '#fff',
|
|
388
|
+
background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
389
389
|
display: localPhoto(m.profile_image_url) ? 'none' : 'flex', alignItems: 'center', justifyContent: 'center',
|
|
390
390
|
}}>{m.name?.charAt(0)}</div>
|
|
391
391
|
<div style={{ flex: 1, minWidth: 0 }}>
|
|
392
392
|
<div style={{ fontSize: 10, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.name}</div>
|
|
393
|
-
<div style={{ fontSize: 8, color: '#666', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.headline?.substring(0, 40)}</div>
|
|
393
|
+
<div style={{ fontSize: 8, color: 'var(--sd-fg-4, #666)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.headline?.substring(0, 40)}</div>
|
|
394
394
|
</div>
|
|
395
395
|
<span style={{ fontSize: 9, color: tierColors[m.tier], fontWeight: 600, flexShrink: 0 }}>{parseFloat(m.power_score).toFixed(1)}</span>
|
|
396
396
|
</div>
|
|
@@ -402,7 +402,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
402
402
|
|
|
403
403
|
{isBridge && bridgeConnections.length > 0 && (
|
|
404
404
|
<div style={{ marginTop: 16 }}>
|
|
405
|
-
<div style={{ fontSize: 12, fontWeight: 600, color: '#FF6B35', marginBottom: 8 }}>
|
|
405
|
+
<div style={{ fontSize: 12, fontWeight: 600, color: 'var(--sd-orange, #FF6B35)', marginBottom: 8 }}>
|
|
406
406
|
Gateway to {bridgeConnections.length} degree-2 connections:
|
|
407
407
|
</div>
|
|
408
408
|
{bridgeConnections.sort((a, b) => (parseFloat(b.power_score) || 0) - (parseFloat(a.power_score) || 0)).slice(0, 10).map(c => (
|
|
@@ -411,8 +411,8 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
411
411
|
borderLeft: '3px solid #FF6B35', marginBottom: 4, fontSize: 12,
|
|
412
412
|
}}>
|
|
413
413
|
<div style={{ fontWeight: 600 }}>{c.name}</div>
|
|
414
|
-
<div style={{ color: '#888', fontSize: 11 }}>{c.role}{c.company ? ` @ ${c.company}` : ''}</div>
|
|
415
|
-
<div style={{ color: '#FF6B35', fontSize: 10 }}>Score: {parseFloat(c.power_score).toFixed(1)}</div>
|
|
414
|
+
<div style={{ color: 'var(--sd-fg-3, #888)', fontSize: 11 }}>{c.role}{c.company ? ` @ ${c.company}` : ''}</div>
|
|
415
|
+
<div style={{ color: 'var(--sd-orange, #FF6B35)', fontSize: 10 }}>Score: {parseFloat(c.power_score).toFixed(1)}</div>
|
|
416
416
|
</div>
|
|
417
417
|
))}
|
|
418
418
|
</div>
|
|
@@ -441,20 +441,20 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
441
441
|
background: 'rgba(255,215,0,0.06)', border: `1px ${asked ? 'dashed' : 'solid'} rgba(255,215,0,${asked ? 0.45 : 0.25})`,
|
|
442
442
|
borderRadius: 10, padding: 16, marginTop: 16, textAlign: 'center',
|
|
443
443
|
}}>
|
|
444
|
-
<div style={{ fontSize: 10, color: '#FFD700', fontWeight: 700, letterSpacing: 1, marginBottom: 6 }}>
|
|
444
|
+
<div style={{ fontSize: 10, color: 'var(--sd-gold, #FFD700)', fontWeight: 700, letterSpacing: 1, marginBottom: 6 }}>
|
|
445
445
|
{asked ? 'REQUEST SENT' : 'LOCKED PATH'}
|
|
446
446
|
</div>
|
|
447
|
-
<div style={{ fontSize: 13, color: '#ccc', marginBottom: 12 }}>
|
|
447
|
+
<div style={{ fontSize: 13, color: 'var(--sd-fg-2, #ccc)', marginBottom: 12 }}>
|
|
448
448
|
{asked
|
|
449
449
|
? `Waiting for ${selected.name} to accept. The next scan of your own connections notices when they do.`
|
|
450
450
|
: `Connect with ${selected.name} to unlock their network and extend your six degrees.`
|
|
451
451
|
}
|
|
452
452
|
</div>
|
|
453
453
|
<div style={{
|
|
454
|
-
width: '100%', height: 60, background: 'rgba(255,255,255,0.03)',
|
|
455
|
-
borderRadius: 8, border: '1px dashed rgba(255,255,255,0.1)',
|
|
454
|
+
width: '100%', height: 60, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)',
|
|
455
|
+
borderRadius: 8, border: '1px dashed rgba(var(--sd-ink, 255, 255, 255), 0.1)',
|
|
456
456
|
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
457
|
-
fontSize: 11, color: '#444', marginBottom: 12,
|
|
457
|
+
fontSize: 11, color: 'var(--sd-fg-5, #444)', marginBottom: 12,
|
|
458
458
|
}}>
|
|
459
459
|
{asked ? '[ Cluster Pending... ]' : '[ Hidden Network ]'}
|
|
460
460
|
</div>
|
|
@@ -462,7 +462,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
462
462
|
<button
|
|
463
463
|
onClick={() => { undoRequest(selected).catch(() => {}); }}
|
|
464
464
|
style={{
|
|
465
|
-
background: 'none', border: 'none', color: '#888', fontSize: 11, fontWeight: 600, cursor: 'pointer',
|
|
465
|
+
background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)', fontSize: 11, fontWeight: 600, cursor: 'pointer',
|
|
466
466
|
}}
|
|
467
467
|
>
|
|
468
468
|
Didn't send it? Undo
|
|
@@ -525,13 +525,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
525
525
|
onClick={onToggle}
|
|
526
526
|
style={{
|
|
527
527
|
display: 'flex', alignItems: 'center', gap: 6, background: 'none', border: 'none',
|
|
528
|
-
color: '#888', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
|
|
528
|
+
color: 'var(--sd-fg-3, #888)', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
|
|
529
529
|
}}
|
|
530
530
|
>
|
|
531
531
|
<span style={{ fontSize: 16 }}>←</span> Close
|
|
532
532
|
</button>
|
|
533
|
-
<h3 style={{ fontSize: 16, fontWeight: 700, marginTop: 0, color: '#FF6B35' }}>Degrees</h3>
|
|
534
|
-
<p style={{ fontSize: 12, color: '#888', marginBottom: 12 }}>
|
|
533
|
+
<h3 style={{ fontSize: 16, fontWeight: 700, marginTop: 0, color: 'var(--sd-orange, #FF6B35)' }}>Degrees</h3>
|
|
534
|
+
<p style={{ fontSize: 12, color: 'var(--sd-fg-3, #888)', marginBottom: 12 }}>
|
|
535
535
|
Your bridge connections and who they unlock.
|
|
536
536
|
</p>
|
|
537
537
|
|
|
@@ -556,8 +556,8 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
556
556
|
onChange={e => setSearchQuery(e.target.value)}
|
|
557
557
|
style={{
|
|
558
558
|
width: '100%', padding: '8px 12px', borderRadius: 8, fontSize: 12,
|
|
559
|
-
border: '1px solid rgba(255,255,255,0.1)', background: 'rgba(255,255,255,0.05)',
|
|
560
|
-
color: '#fff', outline: 'none', boxSizing: 'border-box',
|
|
559
|
+
border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)',
|
|
560
|
+
color: 'var(--sd-fg-1, #fff)', outline: 'none', boxSizing: 'border-box',
|
|
561
561
|
}}
|
|
562
562
|
/>
|
|
563
563
|
{searchQuery.length >= 2 && (() => {
|
|
@@ -575,7 +575,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
575
575
|
return (
|
|
576
576
|
<div style={{
|
|
577
577
|
position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 50,
|
|
578
|
-
background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(255,255,255,0.1)',
|
|
578
|
+
background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
|
|
579
579
|
borderRadius: 8, overflow: 'hidden', maxHeight: 200, overflowY: 'auto',
|
|
580
580
|
boxShadow: '0 8px 24px rgba(0,0,0,0.5)',
|
|
581
581
|
}}>
|
|
@@ -586,9 +586,9 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
586
586
|
if (onFocusNode && m._matchType === 'bridge') onFocusNode(m.id);
|
|
587
587
|
}} style={{
|
|
588
588
|
padding: '8px 12px', cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 8,
|
|
589
|
-
borderBottom: '1px solid rgba(255,255,255,0.05)',
|
|
589
|
+
borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.05)',
|
|
590
590
|
}}
|
|
591
|
-
onMouseEnter={e => e.currentTarget.style.background = 'rgba(255,255,255,0.06)'}
|
|
591
|
+
onMouseEnter={e => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.06)'}
|
|
592
592
|
onMouseLeave={e => e.currentTarget.style.background = 'transparent'}
|
|
593
593
|
>
|
|
594
594
|
{localPhoto(m.profile_image_url) ? (
|
|
@@ -598,7 +598,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
598
598
|
)}
|
|
599
599
|
<div style={{ flex: 1, minWidth: 0 }}>
|
|
600
600
|
<div style={{ fontSize: 11, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.name}</div>
|
|
601
|
-
<div style={{ fontSize: 8, color: '#666' }}>{m._matchType === 'bridge' ? 'Bridge' : 'Degree-2'}</div>
|
|
601
|
+
<div style={{ fontSize: 8, color: 'var(--sd-fg-4, #666)' }}>{m._matchType === 'bridge' ? 'Bridge' : 'Degree-2'}</div>
|
|
602
602
|
</div>
|
|
603
603
|
<span style={{ fontSize: 9, fontWeight: 700, color: tierColors[m.tier] }}>{m.tier}</span>
|
|
604
604
|
</div>
|
|
@@ -611,10 +611,10 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
611
611
|
{/* Pending Requests View */}
|
|
612
612
|
{filter === 'pending' && pending.length > 0 && (
|
|
613
613
|
<>
|
|
614
|
-
<h4 style={{ fontSize: 13, fontWeight: 600, color: '#FF6B35', marginBottom: 8 }}>
|
|
614
|
+
<h4 style={{ fontSize: 13, fontWeight: 600, color: 'var(--sd-orange, #FF6B35)', marginBottom: 8 }}>
|
|
615
615
|
β³ Pending Requests ({pending.length})
|
|
616
616
|
</h4>
|
|
617
|
-
<p style={{ fontSize: 10, color: '#666', marginBottom: 10, lineHeight: 1.4 }}>
|
|
617
|
+
<p style={{ fontSize: 10, color: 'var(--sd-fg-4, #666)', marginBottom: 10, lineHeight: 1.4 }}>
|
|
618
618
|
Friend requests you've sent. When accepted, their cluster unlocks for bridging.
|
|
619
619
|
</p>
|
|
620
620
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
|
@@ -635,7 +635,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
635
635
|
) : (
|
|
636
636
|
<div style={{
|
|
637
637
|
width: 32, height: 32, borderRadius: '50%', flexShrink: 0, fontSize: 12, fontWeight: 700,
|
|
638
|
-
background: tierColors[p.tier] || '#555', color: p.tier === 'S' ? '#000' : '#fff',
|
|
638
|
+
background: tierColors[p.tier] || '#555', color: p.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
639
639
|
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
640
640
|
}}>{p.name?.charAt(0)}</div>
|
|
641
641
|
)}
|
|
@@ -645,11 +645,11 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
645
645
|
<div style={{ fontSize: 11, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
646
646
|
{p.name}
|
|
647
647
|
</div>
|
|
648
|
-
<div style={{ fontSize: 8, color: '#888', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
648
|
+
<div style={{ fontSize: 8, color: 'var(--sd-fg-3, #888)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
649
649
|
{p.headline?.substring(0, 40)}
|
|
650
650
|
</div>
|
|
651
651
|
{bridge && (
|
|
652
|
-
<div style={{ fontSize: 8, color: '#FF6B35', marginTop: 1 }}>
|
|
652
|
+
<div style={{ fontSize: 8, color: 'var(--sd-orange, #FF6B35)', marginTop: 1 }}>
|
|
653
653
|
via {bridge.name?.split(' ')[0]}
|
|
654
654
|
</div>
|
|
655
655
|
)}
|
|
@@ -660,7 +660,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
660
660
|
<div style={{ fontSize: 9, fontWeight: 800, color: tierColors[p.tier] || '#888' }}>
|
|
661
661
|
{p.tier}
|
|
662
662
|
</div>
|
|
663
|
-
<div style={{ fontSize: 8, color: '#666' }}>
|
|
663
|
+
<div style={{ fontSize: 8, color: 'var(--sd-fg-4, #666)' }}>
|
|
664
664
|
{parseFloat(p.power_score || 0).toFixed(1)}
|
|
665
665
|
</div>
|
|
666
666
|
</div>
|
|
@@ -670,7 +670,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
670
670
|
onClick={() => onUndoPending && onUndoPending(p)}
|
|
671
671
|
title="Remove from pending"
|
|
672
672
|
style={{
|
|
673
|
-
background: 'none', border: 'none', color: '#555', cursor: 'pointer',
|
|
673
|
+
background: 'none', border: 'none', color: 'var(--sd-fg-5, #555)', cursor: 'pointer',
|
|
674
674
|
fontSize: 12, padding: 2, flexShrink: 0,
|
|
675
675
|
}}
|
|
676
676
|
>β</button>
|
|
@@ -683,7 +683,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
683
683
|
|
|
684
684
|
{/* Clusters View (hidden when viewing pending) */}
|
|
685
685
|
{filter !== 'pending' && (<>
|
|
686
|
-
<h4 style={{ fontSize: 13, fontWeight: 600, color: '#FF6B35', marginBottom: 8 }}>Most Valuable Clusters</h4>
|
|
686
|
+
<h4 style={{ fontSize: 13, fontWeight: 600, color: 'var(--sd-orange, #FF6B35)', marginBottom: 8 }}>Most Valuable Clusters</h4>
|
|
687
687
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
688
688
|
{(() => {
|
|
689
689
|
const clusterStats = Object.entries(bridgeMap).map(([bridgeId, members]) => {
|
|
@@ -757,8 +757,8 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
757
757
|
onClick={onToggle}
|
|
758
758
|
style={{
|
|
759
759
|
display: 'flex', alignItems: 'center', gap: 6,
|
|
760
|
-
background: 'rgba(255,255,255,0.06)', border: '1px solid rgba(255,255,255,0.1)',
|
|
761
|
-
borderRadius: 6, color: '#aaa', fontSize: 12, cursor: 'pointer',
|
|
760
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
|
|
761
|
+
borderRadius: 6, color: 'var(--sd-fg-3, #aaa)', fontSize: 12, cursor: 'pointer',
|
|
762
762
|
padding: '6px 12px', marginBottom: 12, fontWeight: 600,
|
|
763
763
|
}}
|
|
764
764
|
>
|
|
@@ -783,14 +783,14 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
783
783
|
onChange={(e) => setSearchQuery(e.target.value)}
|
|
784
784
|
style={{
|
|
785
785
|
width: '100%', padding: '8px 12px', borderRadius: 8, boxSizing: 'border-box',
|
|
786
|
-
border: '1px solid rgba(255,255,255,0.1)', background: 'rgba(0,0,0,0.3)',
|
|
787
|
-
color: '#fff', fontSize: 12, outline: 'none',
|
|
786
|
+
border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)', background: 'rgba(var(--sd-shade, 0, 0, 0), 0.3)',
|
|
787
|
+
color: 'var(--sd-fg-1, #fff)', fontSize: 12, outline: 'none',
|
|
788
788
|
}}
|
|
789
789
|
/>
|
|
790
790
|
{searchResults.length > 0 && (
|
|
791
791
|
<div style={{
|
|
792
792
|
position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 10,
|
|
793
|
-
background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(255,255,255,0.1)',
|
|
793
|
+
background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
|
|
794
794
|
borderRadius: 8, marginTop: 4, overflow: 'hidden',
|
|
795
795
|
boxShadow: '0 8px 24px rgba(0,0,0,0.5)',
|
|
796
796
|
}}>
|
|
@@ -804,9 +804,9 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
804
804
|
}}
|
|
805
805
|
style={{
|
|
806
806
|
display: 'flex', alignItems: 'center', gap: 8, padding: '8px 10px',
|
|
807
|
-
cursor: 'pointer', borderBottom: '1px solid rgba(255,255,255,0.04)',
|
|
807
|
+
cursor: 'pointer', borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.04)',
|
|
808
808
|
}}
|
|
809
|
-
onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.08)'}
|
|
809
|
+
onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.08)'}
|
|
810
810
|
onMouseLeave={(e) => e.currentTarget.style.background = 'transparent'}
|
|
811
811
|
>
|
|
812
812
|
{localPhoto(c.profile_image_url) ? (
|
|
@@ -817,13 +817,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
817
817
|
) : (
|
|
818
818
|
<div style={{
|
|
819
819
|
width: 24, height: 24, borderRadius: '50%', flexShrink: 0, fontSize: 10, fontWeight: 700,
|
|
820
|
-
background: tierColors[c.tier] || '#555', color: c.tier === 'S' ? '#000' : '#fff',
|
|
820
|
+
background: tierColors[c.tier] || '#555', color: c.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
821
821
|
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
822
822
|
}}>{c.name?.charAt(0)}</div>
|
|
823
823
|
)}
|
|
824
824
|
<div style={{ flex: 1, minWidth: 0 }}>
|
|
825
825
|
<div style={{ fontSize: 12, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{c.name}</div>
|
|
826
|
-
<div style={{ fontSize: 9, color: '#666' }}>{c.headline?.substring(0, 35)}</div>
|
|
826
|
+
<div style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)' }}>{c.headline?.substring(0, 35)}</div>
|
|
827
827
|
</div>
|
|
828
828
|
<span style={{ fontSize: 10, color: tierColors[c.tier], fontWeight: 700 }}>{c.tier}</span>
|
|
829
829
|
</div>
|
|
@@ -832,7 +832,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
832
832
|
)}
|
|
833
833
|
</div>
|
|
834
834
|
|
|
835
|
-
<h4 style={{ fontSize: 13, fontWeight: 600, color: '#FFD700', marginBottom: 8 }}>
|
|
835
|
+
<h4 style={{ fontSize: 13, fontWeight: 600, color: 'var(--sd-gold, #FFD700)', marginBottom: 8 }}>
|
|
836
836
|
Power Rankings ({allRanked.length})
|
|
837
837
|
</h4>
|
|
838
838
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
|
|
@@ -850,7 +850,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
850
850
|
if (showHeader) tierRankCounter[c.tier] = 0;
|
|
851
851
|
tierRankCounter[c.tier] = (tierRankCounter[c.tier] || 0) + 1;
|
|
852
852
|
const tierRank = tierRankCounter[c.tier];
|
|
853
|
-
const tierNames = { S: 'S-Tier
|
|
853
|
+
const tierNames = { S: 'S-Tier Β· Elite', A: 'A-Tier Β· High Value', B: 'B-Tier Β· Notable', C: 'C-Tier Β· Standard', D: 'D-Tier Β· Entry' };
|
|
854
854
|
return (
|
|
855
855
|
<div key={c.id}>
|
|
856
856
|
{showHeader && (
|
|
@@ -869,16 +869,16 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
869
869
|
<div
|
|
870
870
|
onClick={() => { onSelect && onSelect(c); onFocusNode && onFocusNode(c.id); }}
|
|
871
871
|
style={{
|
|
872
|
-
padding: '6px 8px', background: 'rgba(255,255,255,0.03)', borderRadius: 6,
|
|
872
|
+
padding: '6px 8px', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)', borderRadius: 6,
|
|
873
873
|
borderLeft: `3px solid ${tierColors[c.tier] || '#555'}`,
|
|
874
874
|
cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 8,
|
|
875
875
|
transition: 'background 0.15s',
|
|
876
876
|
}}
|
|
877
|
-
onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.1)'}
|
|
878
|
-
onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.03)'}
|
|
877
|
+
onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.1)'}
|
|
878
|
+
onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.03)'}
|
|
879
879
|
>
|
|
880
880
|
{/* Rank number β per tier */}
|
|
881
|
-
<span style={{ color: '#555', fontSize: 10, fontWeight: 600, minWidth: 22, textAlign: 'right' }}>
|
|
881
|
+
<span style={{ color: 'var(--sd-fg-5, #555)', fontSize: 10, fontWeight: 600, minWidth: 22, textAlign: 'right' }}>
|
|
882
882
|
#{tierRank}
|
|
883
883
|
</span>
|
|
884
884
|
{/* Profile photo or initial */}
|
|
@@ -896,7 +896,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
896
896
|
background: tierColors[c.tier] || '#555',
|
|
897
897
|
display: localPhoto(c.profile_image_url) ? 'none' : 'flex',
|
|
898
898
|
alignItems: 'center', justifyContent: 'center',
|
|
899
|
-
fontSize: 12, fontWeight: 700, color: c.tier === 'S' ? '#000' : '#fff',
|
|
899
|
+
fontSize: 12, fontWeight: 700, color: c.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
900
900
|
}}>
|
|
901
901
|
{c.name?.charAt(0)}
|
|
902
902
|
</div>
|
|
@@ -905,7 +905,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
905
905
|
<div style={{ fontWeight: 600, fontSize: 11, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
906
906
|
{c.name}
|
|
907
907
|
</div>
|
|
908
|
-
<div style={{ fontSize: 9, color: '#666', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
908
|
+
<div style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
909
909
|
{c.headline?.substring(0, 45)}
|
|
910
910
|
</div>
|
|
911
911
|
</div>
|
|
@@ -914,7 +914,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
|
|
|
914
914
|
<div style={{ fontSize: 10, fontWeight: 700, color: tierColors[c.tier] || '#555' }}>
|
|
915
915
|
{parseFloat(c.power_score).toFixed(1)}
|
|
916
916
|
</div>
|
|
917
|
-
<div style={{ fontSize: 8, color: '#555' }}>{c.tier}</div>
|
|
917
|
+
<div style={{ fontSize: 8, color: 'var(--sd-fg-5, #555)' }}>{c.tier}</div>
|
|
918
918
|
</div>
|
|
919
919
|
</div>
|
|
920
920
|
</div>
|
|
@@ -939,7 +939,7 @@ function SidebarWrapper({ children, collapsed, onToggle }) {
|
|
|
939
939
|
display: 'flex', alignItems: 'center', flexDirection: 'row-reverse', gap: 0,
|
|
940
940
|
height: 36, borderRadius: 18,
|
|
941
941
|
background: 'rgba(255,215,0,0.15)', border: '2px solid rgba(255,215,0,0.5)',
|
|
942
|
-
color: '#FFD700', fontWeight: 700,
|
|
942
|
+
color: 'var(--sd-gold, #FFD700)', fontWeight: 700,
|
|
943
943
|
boxShadow: '0 0 12px rgba(255,215,0,0.3)',
|
|
944
944
|
backdropFilter: 'blur(8px)', WebkitBackdropFilter: 'blur(8px)',
|
|
945
945
|
overflow: 'hidden', transition: 'width 0.25s ease',
|
|
@@ -960,13 +960,13 @@ function SidebarWrapper({ children, collapsed, onToggle }) {
|
|
|
960
960
|
position: 'fixed', top: 0, right: 0, bottom: 0, zIndex: 100,
|
|
961
961
|
width: '100vw', pointerEvents: 'auto',
|
|
962
962
|
} : { flexShrink: 0, height: '100%' }}>
|
|
963
|
-
{isMobile && <div onClick={onToggle} style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.5)' }} />}
|
|
964
|
-
<div style={{
|
|
963
|
+
{isMobile && <div onClick={onToggle} style={{ position: 'absolute', inset: 0, background: 'rgba(var(--sd-shade, 0, 0, 0), 0.5)' }} />}
|
|
964
|
+
<div data-glass-panel={isMobile ? undefined : 'side'} style={{
|
|
965
965
|
width: isMobile ? '80vw' : 320, minWidth: isMobile ? 0 : 320, maxWidth: isMobile ? 300 : 320, height: '100%',
|
|
966
966
|
borderLeft: '1px solid rgba(255,215,0,0.12)',
|
|
967
967
|
padding: isMobile ? '12px 10px' : '16px 16px',
|
|
968
968
|
overflowY: 'auto', overflowX: 'hidden',
|
|
969
|
-
background: isMobile ? 'rgba(15,12,5,0.98)' : 'var(--sd-panel)', fontSize: 13,
|
|
969
|
+
background: isMobile ? 'var(--sd-surface, rgba(15,12,5,0.98))' : 'var(--sd-panel)', fontSize: 13,
|
|
970
970
|
backdropFilter: 'var(--sd-panel-blur)', WebkitBackdropFilter: 'var(--sd-panel-blur)',
|
|
971
971
|
boxShadow: 'inset 0 0 60px rgba(255,215,0,0.03), -4px 0 24px rgba(0,0,0,0.3)',
|
|
972
972
|
marginLeft: isMobile ? 'auto' : 0,
|
|
@@ -979,15 +979,15 @@ function SidebarWrapper({ children, collapsed, onToggle }) {
|
|
|
979
979
|
|
|
980
980
|
function StatBox({ label, value }) {
|
|
981
981
|
return (
|
|
982
|
-
<div style={{ background: 'rgba(255,255,255,0.05)', padding: '10px 12px', borderRadius: 8 }}>
|
|
983
|
-
<div style={{ fontSize: 10, color: '#888', marginBottom: 2 }}>{label}</div>
|
|
982
|
+
<div style={{ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', padding: '10px 12px', borderRadius: 8 }}>
|
|
983
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>{label}</div>
|
|
984
984
|
<div style={{ fontSize: 18, fontWeight: 700 }}>{value}</div>
|
|
985
985
|
</div>
|
|
986
986
|
);
|
|
987
987
|
}
|
|
988
988
|
|
|
989
989
|
function Arrow() {
|
|
990
|
-
return <span style={{ color: '#555', fontSize: 16 }}>→</span>;
|
|
990
|
+
return <span style={{ color: 'var(--sd-fg-5, #555)', fontSize: 16 }}>→</span>;
|
|
991
991
|
}
|
|
992
992
|
|
|
993
993
|
const CANT_NAME_TITLE = 'This route came from a scanned list whose connection record doesnβt match anyone in '
|
|
@@ -1009,15 +1009,15 @@ function PathBox({ routes, selected, tierColors, onSelect }) {
|
|
|
1009
1009
|
background: 'rgba(255,107,53,0.1)', border: '1px solid rgba(255,107,53,0.3)',
|
|
1010
1010
|
borderRadius: 8, padding: 12, marginBottom: 16,
|
|
1011
1011
|
}}>
|
|
1012
|
-
<div style={{ fontSize: 10, color: '#FF6B35', fontWeight: 600, marginBottom: 8 }}>
|
|
1012
|
+
<div style={{ fontSize: 10, color: 'var(--sd-orange, #FF6B35)', fontWeight: 600, marginBottom: 8 }}>
|
|
1013
1013
|
PATH TO THIS PERSON{n > 1 ? ` Β· ${n} WAYS IN` : ''}
|
|
1014
1014
|
</div>
|
|
1015
1015
|
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
|
|
1016
1016
|
{shown.map((r, i) => {
|
|
1017
1017
|
if (!r.bridge) {
|
|
1018
1018
|
return (
|
|
1019
|
-
<div key={`unnamed-${r.id}`} title={CANT_NAME_TITLE} style={{ ...line, color: '#888', fontStyle: 'italic' }}>
|
|
1020
|
-
<span style={{ fontWeight: 700, fontStyle: 'normal', color: '#fff' }}>You</span>
|
|
1019
|
+
<div key={`unnamed-${r.id}`} title={CANT_NAME_TITLE} style={{ ...line, color: 'var(--sd-fg-3, #888)', fontStyle: 'italic' }}>
|
|
1020
|
+
<span style={{ fontWeight: 700, fontStyle: 'normal', color: 'var(--sd-fg-1, #fff)' }}>You</span>
|
|
1021
1021
|
<Arrow />
|
|
1022
1022
|
<span>a connection we can’t name</span>
|
|
1023
1023
|
<Arrow />
|
|
@@ -1045,17 +1045,17 @@ function PathBox({ routes, selected, tierColors, onSelect }) {
|
|
|
1045
1045
|
{b.name}
|
|
1046
1046
|
</button>
|
|
1047
1047
|
<Arrow />
|
|
1048
|
-
<span style={{ color: '#FF6B35', fontWeight: 600 }}>{selected.name}</span>
|
|
1048
|
+
<span style={{ color: 'var(--sd-orange, #FF6B35)', fontWeight: 600 }}>{selected.name}</span>
|
|
1049
1049
|
{/* Not "strongest": the app knows nothing about how well they
|
|
1050
1050
|
know each other, only how this connection scores. */}
|
|
1051
1051
|
{i === 0 && n > 1 && (
|
|
1052
1052
|
<span style={{
|
|
1053
|
-
fontSize: 9, fontWeight: 700, color: '#FF6B35', padding: '1px 6px', borderRadius: 8,
|
|
1053
|
+
fontSize: 9, fontWeight: 700, color: 'var(--sd-orange, #FF6B35)', padding: '1px 6px', borderRadius: 8,
|
|
1054
1054
|
background: 'rgba(255,107,53,0.15)', whiteSpace: 'nowrap',
|
|
1055
1055
|
}}>top-scored bridge</span>
|
|
1056
1056
|
)}
|
|
1057
1057
|
</div>
|
|
1058
|
-
{about && <div style={{ fontSize: 11, color: '#888', marginTop: 3 }}>{about}</div>}
|
|
1058
|
+
{about && <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #888)', marginTop: 3 }}>{about}</div>}
|
|
1059
1059
|
</div>
|
|
1060
1060
|
);
|
|
1061
1061
|
})}
|
|
@@ -1065,7 +1065,7 @@ function PathBox({ routes, selected, tierColors, onSelect }) {
|
|
|
1065
1065
|
onClick={() => setShowAll((v) => !v)}
|
|
1066
1066
|
style={{
|
|
1067
1067
|
marginTop: 10, padding: '4px 10px', borderRadius: 6, cursor: 'pointer', fontSize: 11, fontWeight: 600,
|
|
1068
|
-
border: '1px solid rgba(255,107,53,0.35)', background: 'transparent', color: '#FF6B35',
|
|
1068
|
+
border: '1px solid rgba(255,107,53,0.35)', background: 'transparent', color: 'var(--sd-orange, #FF6B35)',
|
|
1069
1069
|
}}
|
|
1070
1070
|
>
|
|
1071
1071
|
{showAll ? 'Show fewer' : `Show all ${n}`}
|
|
@@ -1141,7 +1141,7 @@ function CreateClusterCard({ selected, degree2 }) {
|
|
|
1141
1141
|
<div style={{ fontSize: 10, color: accent, fontWeight: 700, letterSpacing: 1, marginBottom: 4, textAlign: 'center' }}>
|
|
1142
1142
|
{hasCluster ? 'CLUSTER ACTIVE' : 'CREATE CLUSTER'}
|
|
1143
1143
|
</div>
|
|
1144
|
-
<div style={{ fontSize: 12, color: '#aaa', marginBottom: 12, textAlign: 'center' }}>
|
|
1144
|
+
<div style={{ fontSize: 12, color: 'var(--sd-fg-3, #aaa)', marginBottom: 12, textAlign: 'center' }}>
|
|
1145
1145
|
{hasCluster
|
|
1146
1146
|
? `${clusterCount} connections mapped in Six Degrees`
|
|
1147
1147
|
: <>Scan {selected.name}'s connections to map their network</>}
|
|
@@ -1151,15 +1151,15 @@ function CreateClusterCard({ selected, degree2 }) {
|
|
|
1151
1151
|
<ScanLog title={scan.pending ? 'Startingβ¦' : `Scanning ${selected.name}βs circleβ¦`} log={scan.log} />
|
|
1152
1152
|
) : problem?.offline ? (
|
|
1153
1153
|
<>
|
|
1154
|
-
<div style={{ padding: '10px', borderRadius: 8, background: 'rgba(255,80,80,0.1)', border: '1px solid rgba(255,80,80,0.3)', color: '#ff5050', fontSize: 12, marginBottom: 8, textAlign: 'center' }}>
|
|
1154
|
+
<div style={{ padding: '10px', borderRadius: 8, background: 'rgba(255,80,80,0.1)', border: '1px solid rgba(255,80,80,0.3)', color: 'var(--sd-red, #ff5050)', fontSize: 12, marginBottom: 8, textAlign: 'center' }}>
|
|
1155
1155
|
Scanner offline
|
|
1156
1156
|
</div>
|
|
1157
|
-
<div style={{ fontSize: 10, color: '#888', textAlign: 'center', marginBottom: 8 }}>
|
|
1157
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', textAlign: 'center', marginBottom: 8 }}>
|
|
1158
1158
|
{problem.text} Open the <strong>Scan</strong> page to finish setting the scanner up.
|
|
1159
1159
|
</div>
|
|
1160
1160
|
<button onClick={() => setProblem(null)} style={{
|
|
1161
1161
|
width: '100%', padding: '10px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
1162
|
-
background: 'rgba(255,255,255,0.1)', color: '#aaa', fontWeight: 600, fontSize: 12,
|
|
1162
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.1)', color: 'var(--sd-fg-3, #aaa)', fontWeight: 600, fontSize: 12,
|
|
1163
1163
|
}}>
|
|
1164
1164
|
Retry
|
|
1165
1165
|
</button>
|
|
@@ -1178,19 +1178,19 @@ function CreateClusterCard({ selected, degree2 }) {
|
|
|
1178
1178
|
</button>
|
|
1179
1179
|
</div>
|
|
1180
1180
|
{resume && (
|
|
1181
|
-
<div style={{ fontSize: 10, color: '#888', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
|
|
1181
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
|
|
1182
1182
|
Read to page {resume.pagesRead} so far. Resume carries on from page {resume.nextPage}. LinkedIn
|
|
1183
1183
|
lists their connections in its own order, not by date, so Rescan reads them all again from page 1.
|
|
1184
1184
|
</div>
|
|
1185
1185
|
)}
|
|
1186
1186
|
{hasCluster && resume === null && (
|
|
1187
|
-
<div style={{ fontSize: 10, color: '#888', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
|
|
1187
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
|
|
1188
1188
|
Their whole list has been read. LinkedIn doesn't date other people's connections, so a
|
|
1189
1189
|
rescan reads it all again to find anyone new.
|
|
1190
1190
|
</div>
|
|
1191
1191
|
)}
|
|
1192
1192
|
{busy && (
|
|
1193
|
-
<div style={{ fontSize: 10, color: '#bbb', marginTop: 8, textAlign: 'center' }}>
|
|
1193
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-2, #bbb)', marginTop: 8, textAlign: 'center' }}>
|
|
1194
1194
|
{busy}. One scan at a time: this one can start when it finishes.
|
|
1195
1195
|
</div>
|
|
1196
1196
|
)}
|
|
@@ -1203,18 +1203,18 @@ function CreateClusterCard({ selected, degree2 }) {
|
|
|
1203
1203
|
);
|
|
1204
1204
|
}
|
|
1205
1205
|
|
|
1206
|
-
// In place of the Scan buttons while the sample or a CSV import is open.
|
|
1207
|
-
//
|
|
1208
|
-
// person up
|
|
1206
|
+
// In place of the Scan buttons while the sample or a CSV import is open.
|
|
1207
|
+
// Neither is in the database, so a scan could only fail: the scanner looks the
|
|
1208
|
+
// person up there, and says "Bridge 'β¦' not found in database".
|
|
1209
1209
|
function ScansNeedYourNetwork({ csvSource, style }) {
|
|
1210
1210
|
return (
|
|
1211
1211
|
<div style={{
|
|
1212
|
-
padding: '10px 12px', borderRadius: 8, fontSize: 11, color: '#999', lineHeight: 1.5, textAlign: 'center',
|
|
1213
|
-
background: 'rgba(255,255,255,0.03)', border: '1px solid rgba(255,255,255,0.08)', ...style,
|
|
1212
|
+
padding: '10px 12px', borderRadius: 8, fontSize: 11, color: 'var(--sd-fg-3, #999)', lineHeight: 1.5, textAlign: 'center',
|
|
1213
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.08)', ...style,
|
|
1214
1214
|
}}>
|
|
1215
1215
|
{csvSource === 'sample'
|
|
1216
1216
|
? 'Scanning needs your own network: everyone in the sample is invented.'
|
|
1217
|
-
: 'Scanning needs your own network
|
|
1217
|
+
: 'Scanning needs your own network, not a CSV import. Remove the import (Γ at the top) and open Scan.'}
|
|
1218
1218
|
</div>
|
|
1219
1219
|
);
|
|
1220
1220
|
}
|
|
@@ -1229,9 +1229,9 @@ function ScanLog({ title, log, small = false }) {
|
|
|
1229
1229
|
{/* Its own keyframes: the 'pulse' this named was never defined anywhere, so the dot sat still. */}
|
|
1230
1230
|
<style>{'@keyframes scanlogPulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .35; transform: scale(.7); } } @media (prefers-reduced-motion: reduce) { .scanlog-dot { animation: none !important; } }'}</style>
|
|
1231
1231
|
<div className="scanlog-dot" style={{ width: small ? 6 : 8, height: small ? 6 : 8, borderRadius: '50%', background: '#9B59B6', animation: 'scanlogPulse 1s ease-in-out infinite' }} />
|
|
1232
|
-
<span style={{ fontSize: 11, fontWeight: 600, color: '#9B59B6' }}>{title}</span>
|
|
1232
|
+
<span style={{ fontSize: 11, fontWeight: 600, color: 'var(--sd-purple, #9B59B6)' }}>{title}</span>
|
|
1233
1233
|
</div>
|
|
1234
|
-
<div style={{ fontFamily: 'monospace', fontSize: small ? 9 : 10, color: '#888', maxHeight: small ? 80 : 100, overflow: 'auto' }}>
|
|
1234
|
+
<div style={{ fontFamily: 'monospace', fontSize: small ? 9 : 10, color: 'var(--sd-fg-3, #888)', maxHeight: small ? 80 : 100, overflow: 'auto' }}>
|
|
1235
1235
|
{log.slice(-40).map((l, i) => <div key={i}>{l}</div>)}
|
|
1236
1236
|
</div>
|
|
1237
1237
|
</div>
|
|
@@ -1247,7 +1247,7 @@ function LastRead({ job, who = null }) {
|
|
|
1247
1247
|
padding: '8px 10px', borderRadius: 8, marginBottom: 10, fontSize: 11, textAlign: 'center', lineHeight: 1.4,
|
|
1248
1248
|
background: ok ? 'rgba(0,255,136,0.08)' : 'rgba(255,80,80,0.08)',
|
|
1249
1249
|
border: `1px solid ${ok ? 'rgba(0,255,136,0.25)' : 'rgba(255,80,80,0.25)'}`,
|
|
1250
|
-
color: ok ? '#00ff88' : '#ff8080',
|
|
1250
|
+
color: ok ? 'var(--sd-green, #00ff88)' : '#ff8080',
|
|
1251
1251
|
}}>
|
|
1252
1252
|
{ok
|
|
1253
1253
|
? `${who ? `${who}βs circle` : 'The scan'} finished. What it found is on the map.`
|
|
@@ -1261,7 +1261,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1261
1261
|
|
|
1262
1262
|
return (
|
|
1263
1263
|
<div style={{
|
|
1264
|
-
background: 'rgba(255,255,255,0.05)', borderRadius: 6,
|
|
1264
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', borderRadius: 6,
|
|
1265
1265
|
borderLeft: `3px solid ${tierColors[cs.bridge.tier] || '#FF6B35'}`,
|
|
1266
1266
|
overflow: 'hidden',
|
|
1267
1267
|
}}>
|
|
@@ -1280,34 +1280,34 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1280
1280
|
) : (
|
|
1281
1281
|
<div style={{
|
|
1282
1282
|
width: 28, height: 28, borderRadius: '50%', flexShrink: 0, fontSize: 11, fontWeight: 700,
|
|
1283
|
-
background: tierColors[cs.bridge.tier] || '#555', color: cs.bridge.tier === 'S' ? '#000' : '#fff',
|
|
1283
|
+
background: tierColors[cs.bridge.tier] || '#555', color: cs.bridge.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
1284
1284
|
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
1285
1285
|
}}>{cs.bridge.name?.charAt(0)}</div>
|
|
1286
1286
|
)}
|
|
1287
1287
|
<div>
|
|
1288
1288
|
<div style={{ fontWeight: 600, fontSize: 12 }}>
|
|
1289
|
-
<span style={{ color: '#555', marginRight: 4 }}>#{rank}</span>{cs.bridge.name}
|
|
1289
|
+
<span style={{ color: 'var(--sd-fg-5, #555)', marginRight: 4 }}>#{rank}</span>{cs.bridge.name}
|
|
1290
1290
|
</div>
|
|
1291
|
-
<div style={{ fontSize: 9, color: '#666' }}>{cs.bridge.headline?.substring(0, 40)}</div>
|
|
1291
|
+
<div style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)' }}>{cs.bridge.headline?.substring(0, 40)}</div>
|
|
1292
1292
|
</div>
|
|
1293
1293
|
</div>
|
|
1294
1294
|
<span style={{
|
|
1295
1295
|
fontSize: 10, fontWeight: 700, padding: '2px 6px', borderRadius: 4,
|
|
1296
|
-
background: tierColors[cs.bridge.tier], color: cs.bridge.tier === 'S' ? '#000' : '#fff',
|
|
1296
|
+
background: tierColors[cs.bridge.tier], color: cs.bridge.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
1297
1297
|
}}>{cs.bridge.tier}</span>
|
|
1298
1298
|
</div>
|
|
1299
1299
|
<div style={{ display: 'flex', gap: 6, marginTop: 6, fontSize: 10 }}>
|
|
1300
|
-
{cs.sCount > 0 && <span style={{ color: '#FFD700', fontWeight: 600 }}>{cs.sCount}S{cs.sAvgPower > 0 ? ` (${cs.sAvgPower.toFixed(1)})` : ''}</span>}
|
|
1301
|
-
{cs.aCount > 0 && <span style={{ color: '#9B59B6', fontWeight: 600 }}>{cs.aCount}A</span>}
|
|
1302
|
-
{cs.bCount > 0 && <span style={{ color: '#3498DB' }}>{cs.bCount}B</span>}
|
|
1300
|
+
{cs.sCount > 0 && <span style={{ color: 'var(--sd-gold, #FFD700)', fontWeight: 600 }}>{cs.sCount}S{cs.sAvgPower > 0 ? ` (${cs.sAvgPower.toFixed(1)})` : ''}</span>}
|
|
1301
|
+
{cs.aCount > 0 && <span style={{ color: 'var(--sd-purple, #9B59B6)', fontWeight: 600 }}>{cs.aCount}A</span>}
|
|
1302
|
+
{cs.bCount > 0 && <span style={{ color: 'var(--sd-blue, #3498DB)' }}>{cs.bCount}B</span>}
|
|
1303
1303
|
{cs.risingCount > 0 && <span style={{ color: '#2ECC71' }}>{cs.risingCount} rising</span>}
|
|
1304
|
-
<span style={{ color: '#555' }}>{cs.members} total</span>
|
|
1304
|
+
<span style={{ color: 'var(--sd-fg-5, #555)' }}>{cs.members} total</span>
|
|
1305
1305
|
</div>
|
|
1306
1306
|
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginTop: 4, fontSize: 10 }}>
|
|
1307
|
-
<span style={{ color: '#666' }}>
|
|
1307
|
+
<span style={{ color: 'var(--sd-fg-4, #666)' }}>
|
|
1308
1308
|
Elite: {(cs.elitePct * 100).toFixed(0)}% Β· Avg: {cs.avgPower.toFixed(1)}
|
|
1309
1309
|
</span>
|
|
1310
|
-
<span style={{ color: '#FF6B35', fontWeight: 700 }}>
|
|
1310
|
+
<span style={{ color: 'var(--sd-orange, #FF6B35)', fontWeight: 700 }}>
|
|
1311
1311
|
{cs.clusterValue.toFixed(1)}
|
|
1312
1312
|
</span>
|
|
1313
1313
|
</div>
|
|
@@ -1326,13 +1326,13 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1326
1326
|
) : (
|
|
1327
1327
|
<div key={m.id} style={{
|
|
1328
1328
|
width: 22, height: 22, borderRadius: '50%', fontSize: 9, fontWeight: 700,
|
|
1329
|
-
background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : '#fff',
|
|
1329
|
+
background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
1330
1330
|
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
1331
1331
|
}} title={m.name}>{m.name?.charAt(0)}</div>
|
|
1332
1332
|
)
|
|
1333
1333
|
))}
|
|
1334
1334
|
{(cs.sCount + cs.aCount) > 4 && (
|
|
1335
|
-
<span style={{ fontSize: 9, color: '#666' }}>+{cs.sCount + cs.aCount - 4} more</span>
|
|
1335
|
+
<span style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)' }}>+{cs.sCount + cs.aCount - 4} more</span>
|
|
1336
1336
|
)}
|
|
1337
1337
|
</div>
|
|
1338
1338
|
)}
|
|
@@ -1341,7 +1341,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1341
1341
|
<button
|
|
1342
1342
|
onClick={() => setExpanded(!expanded)}
|
|
1343
1343
|
style={{
|
|
1344
|
-
marginTop: 6, background: 'none', border: 'none', color: '#888',
|
|
1344
|
+
marginTop: 6, background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)',
|
|
1345
1345
|
fontSize: 10, cursor: 'pointer', padding: 0, display: 'flex', alignItems: 'center', gap: 4,
|
|
1346
1346
|
}}
|
|
1347
1347
|
>
|
|
@@ -1353,7 +1353,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1353
1353
|
{/* Expanded member list */}
|
|
1354
1354
|
{expanded && (
|
|
1355
1355
|
<div style={{
|
|
1356
|
-
borderTop: '1px solid rgba(255,255,255,0.06)',
|
|
1356
|
+
borderTop: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.06)',
|
|
1357
1357
|
padding: '6px 10px 10px', maxHeight: 250, overflowY: 'auto',
|
|
1358
1358
|
}}>
|
|
1359
1359
|
{cs.topMembers.map(m => (
|
|
@@ -1364,7 +1364,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1364
1364
|
display: 'flex', alignItems: 'center', gap: 6, padding: '4px 2px',
|
|
1365
1365
|
cursor: 'pointer', borderRadius: 4,
|
|
1366
1366
|
}}
|
|
1367
|
-
onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.06)'}
|
|
1367
|
+
onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.06)'}
|
|
1368
1368
|
onMouseLeave={(e) => e.currentTarget.style.background = 'transparent'}
|
|
1369
1369
|
>
|
|
1370
1370
|
{localPhoto(m.profile_image_url) ? (
|
|
@@ -1375,7 +1375,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
|
|
|
1375
1375
|
) : null}
|
|
1376
1376
|
<div style={{
|
|
1377
1377
|
width: 20, height: 20, borderRadius: '50%', flexShrink: 0, fontSize: 8, fontWeight: 700,
|
|
1378
|
-
background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : '#fff',
|
|
1378
|
+
background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
|
|
1379
1379
|
display: localPhoto(m.profile_image_url) ? 'none' : 'flex',
|
|
1380
1380
|
alignItems: 'center', justifyContent: 'center',
|
|
1381
1381
|
}}>{m.name?.charAt(0)}</div>
|
|
@@ -1405,13 +1405,13 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
|
|
|
1405
1405
|
|
|
1406
1406
|
// 1. Title leverage
|
|
1407
1407
|
if (role.match(/ceo|chief|founder|president|chairman/i)) {
|
|
1408
|
-
insights.push({ icon: 'π', text: `${person.role}
|
|
1408
|
+
insights.push({ icon: 'π', text: `${person.role}: C-suite executive, highest leverage contact`, color: 'var(--sd-gold, #FFD700)' });
|
|
1409
1409
|
} else if (role.match(/vp|vice president|svp|evp|managing director/i)) {
|
|
1410
|
-
insights.push({ icon: 'β‘', text: `${person.role}
|
|
1410
|
+
insights.push({ icon: 'β‘', text: `${person.role}: VP-level, strong decision-making authority`, color: 'var(--sd-gold, #FFD700)' });
|
|
1411
1411
|
} else if (role.match(/director|head of|senior director/i)) {
|
|
1412
|
-
insights.push({ icon: 'π―', text: `${person.role}
|
|
1412
|
+
insights.push({ icon: 'π―', text: `${person.role}: Senior leadership, controls team/budget`, color: 'var(--sd-orange, #FF6B35)' });
|
|
1413
1413
|
} else if (role.match(/manager|lead|principal/i)) {
|
|
1414
|
-
insights.push({ icon: 'π', text: `${person.role}
|
|
1414
|
+
insights.push({ icon: 'π', text: `${person.role}: Mid-senior, operational influence`, color: 'var(--sd-blue, #3498DB)' });
|
|
1415
1415
|
}
|
|
1416
1416
|
|
|
1417
1417
|
// 2β3. A top company now, and one before, by the model's own company scores
|
|
@@ -1421,28 +1421,28 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
|
|
|
1421
1421
|
// headline, so "Metadata Analyst" read as Meta and an ex-Googler as at Google.
|
|
1422
1422
|
const { now, before } = topCompanies(person);
|
|
1423
1423
|
if (now) {
|
|
1424
|
-
insights.push({ icon: 'π’', text: `At ${now.name} (${now.score}/10)
|
|
1424
|
+
insights.push({ icon: 'π’', text: `At ${now.name} (${now.score}/10): top-tier company network access`, color: 'var(--sd-purple, #9B59B6)' });
|
|
1425
1425
|
}
|
|
1426
1426
|
if (before) {
|
|
1427
|
-
insights.push({ icon: 'π', text: `Former ${before.name} (${before.score}/10)
|
|
1427
|
+
insights.push({ icon: 'π', text: `Former ${before.name} (${before.score}/10): carries network from previous role`, color: 'var(--sd-fg-3, #95A5A6)' });
|
|
1428
1428
|
}
|
|
1429
1429
|
|
|
1430
1430
|
// 4. Sector overlap with user
|
|
1431
1431
|
const matchingSectors = userSectors.filter(s => headline.includes(s) || company.includes(s));
|
|
1432
1432
|
if (matchingSectors.length > 0) {
|
|
1433
|
-
insights.push({ icon: 'π', text: `Shared sector: ${matchingSectors.join(', ')}
|
|
1433
|
+
insights.push({ icon: 'π', text: `Shared sector: ${matchingSectors.join(', ')}: direct industry relevance to you`, color: '#2ECC71' });
|
|
1434
1434
|
}
|
|
1435
1435
|
|
|
1436
1436
|
// 5. Bridge / gateway value
|
|
1437
1437
|
const bridgeCount = degree2.filter(d => d.source_connection_id === person.id).length;
|
|
1438
1438
|
if (bridgeCount > 0) {
|
|
1439
1439
|
const bridgeSCount = degree2.filter(d => d.source_connection_id === person.id && d.tier === 'S').length;
|
|
1440
|
-
insights.push({ icon: 'π', text: `Gateway to ${bridgeCount} degree-2 connections${bridgeSCount > 0 ? ` (${bridgeSCount} S-tier)` : ''}`, color: '#FF6B35' });
|
|
1440
|
+
insights.push({ icon: 'π', text: `Gateway to ${bridgeCount} degree-2 connections${bridgeSCount > 0 ? ` (${bridgeSCount} S-tier)` : ''}`, color: 'var(--sd-orange, #FF6B35)' });
|
|
1441
1441
|
}
|
|
1442
1442
|
|
|
1443
1443
|
// 6. Catalyst
|
|
1444
1444
|
if (person.is_catalyst) {
|
|
1445
|
-
insights.push({ icon: 'β‘', text: `Catalyst
|
|
1445
|
+
insights.push({ icon: 'β‘', text: `Catalyst: network power exceeds personal tier, high stepping-stone value`, color: 'var(--sd-green, #00ff88)' });
|
|
1446
1446
|
}
|
|
1447
1447
|
|
|
1448
1448
|
// 7. Every way in (degree 2). Built from the merged routes, so it can never
|
|
@@ -1452,8 +1452,8 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
|
|
|
1452
1452
|
const named = routes.filter(r => r.bridge);
|
|
1453
1453
|
if (routes.length === 1) {
|
|
1454
1454
|
insights.push(named.length
|
|
1455
|
-
? { icon: 'π€', text: `Reachable via ${named[0].bridge.name} (${named[0].bridge.tier}-tier)`, color: '#3498DB' }
|
|
1456
|
-
: { icon: 'π€', text: 'Reachable through a connection we canβt name', color: '#888' });
|
|
1455
|
+
? { icon: 'π€', text: `Reachable via ${named[0].bridge.name} (${named[0].bridge.tier}-tier)`, color: 'var(--sd-blue, #3498DB)' }
|
|
1456
|
+
: { icon: 'π€', text: 'Reachable through a connection we canβt name', color: 'var(--sd-fg-3, #888)' });
|
|
1457
1457
|
} else {
|
|
1458
1458
|
const firstName = (n) => String(n || '').trim().split(/\s+/)[0];
|
|
1459
1459
|
const names = named.slice(0, 2).map(r => `${firstName(r.bridge.name)} (${r.bridge.tier})`);
|
|
@@ -1461,13 +1461,13 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
|
|
|
1461
1461
|
const via = names.length === 0 ? 'connections we canβt name'
|
|
1462
1462
|
: more > 0 ? `${names.join(', ')} and ${more} more`
|
|
1463
1463
|
: names.join(' and ');
|
|
1464
|
-
insights.push({ icon: 'π€', text: `Reachable ${routes.length} ways
|
|
1464
|
+
insights.push({ icon: 'π€', text: `Reachable ${routes.length} ways, via ${via}`, color: 'var(--sd-blue, #3498DB)' });
|
|
1465
1465
|
}
|
|
1466
1466
|
}
|
|
1467
1467
|
|
|
1468
1468
|
// Fallback if no insights generated
|
|
1469
1469
|
if (insights.length === 0) {
|
|
1470
|
-
insights.push({ icon: 'π', text: `${person.tier}-tier connection with ${parseFloat(person.power_score).toFixed(1)} power score`, color: '#888' });
|
|
1470
|
+
insights.push({ icon: 'π', text: `${person.tier}-tier connection with ${parseFloat(person.power_score).toFixed(1)} power score`, color: 'var(--sd-fg-3, #888)' });
|
|
1471
1471
|
}
|
|
1472
1472
|
|
|
1473
1473
|
return insights.slice(0, 5); // Max 5 insights
|
|
@@ -1510,10 +1510,10 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1510
1510
|
background: 'rgba(0,255,136,0.05)', border: '1px solid rgba(0,255,136,0.2)',
|
|
1511
1511
|
borderRadius: 10, padding: 14, marginBottom: 16,
|
|
1512
1512
|
}}>
|
|
1513
|
-
<div style={{ fontSize: 12, fontWeight: 800, color: '#00ff88', marginBottom: 4 }}>
|
|
1513
|
+
<div style={{ fontSize: 12, fontWeight: 800, color: 'var(--sd-green, #00ff88)', marginBottom: 4 }}>
|
|
1514
1514
|
Ready to scan ({ready.length})
|
|
1515
1515
|
</div>
|
|
1516
|
-
<div style={{ fontSize: 10.5, color: '#999', lineHeight: 1.5, marginBottom: 10 }}>
|
|
1516
|
+
<div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #999)', lineHeight: 1.5, marginBottom: 10 }}>
|
|
1517
1517
|
People you added through a circle whose own circle isn't scanned yet. Scanning one
|
|
1518
1518
|
brings in who they know: 3rd degree, through the circle you found them in.
|
|
1519
1519
|
</div>
|
|
@@ -1525,7 +1525,7 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1525
1525
|
) : last && <LastRead job={last} who={last.target?.name} />}
|
|
1526
1526
|
|
|
1527
1527
|
{ready.length === 0 ? (
|
|
1528
|
-
<div style={{ fontSize: 11, color: '#aaa', lineHeight: 1.5 }}>
|
|
1528
|
+
<div style={{ fontSize: 11, color: 'var(--sd-fg-3, #aaa)', lineHeight: 1.5 }}>
|
|
1529
1529
|
Nobody yet. When someone you asked from a circle accepts, β» <b>Check for new</b> brings
|
|
1530
1530
|
them into your connections, and they show here.
|
|
1531
1531
|
</div>
|
|
@@ -1539,20 +1539,20 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1539
1539
|
aria-label={`Scan ${p.name}βs circle: opens the Scan page to confirm`}
|
|
1540
1540
|
style={{
|
|
1541
1541
|
display: 'flex', alignItems: 'center', gap: 8, padding: '8px 10px', borderRadius: 8,
|
|
1542
|
-
textDecoration: 'none', color: '#fff',
|
|
1543
|
-
background: 'rgba(255,255,255,0.04)', border: '1px solid rgba(0,255,136,0.18)',
|
|
1542
|
+
textDecoration: 'none', color: 'var(--sd-fg-1, #fff)',
|
|
1543
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.04)', border: '1px solid rgba(0,255,136,0.18)',
|
|
1544
1544
|
}}>
|
|
1545
1545
|
<span style={{ width: 8, height: 8, borderRadius: '50%', flexShrink: 0, background: tierColors[p.tier] || '#888', boxShadow: '0 0 0 2px rgba(0,255,136,0.45)' }} />
|
|
1546
1546
|
<span style={{ flex: 1, minWidth: 0 }}>
|
|
1547
1547
|
<span style={{ fontSize: 12, fontWeight: 700 }}>{p.name}</span>
|
|
1548
1548
|
<span style={{ fontSize: 10, color: tierColors[p.tier] || '#888', fontWeight: 700, marginLeft: 6 }}>{p.tier}</span>
|
|
1549
1549
|
{from && (
|
|
1550
|
-
<span style={{ display: 'block', fontSize: 10, color: '#888', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
1550
|
+
<span style={{ display: 'block', fontSize: 10, color: 'var(--sd-fg-3, #888)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
|
|
1551
1551
|
was in {first(from)}'s circle
|
|
1552
1552
|
</span>
|
|
1553
1553
|
)}
|
|
1554
1554
|
</span>
|
|
1555
|
-
<span style={{ fontSize: 10.5, fontWeight: 700, color: '#00ff88', whiteSpace: 'nowrap' }}>
|
|
1555
|
+
<span style={{ fontSize: 10.5, fontWeight: 700, color: 'var(--sd-green, #00ff88)', whiteSpace: 'nowrap' }}>
|
|
1556
1556
|
{now ? 'Scanningβ¦' : 'Scanβ¦ β'}
|
|
1557
1557
|
</span>
|
|
1558
1558
|
</Link>
|
|
@@ -1560,7 +1560,7 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1560
1560
|
})}
|
|
1561
1561
|
{ready.length > 5 && (
|
|
1562
1562
|
<button type="button" onClick={() => setAll((v) => !v)} style={{
|
|
1563
|
-
background: 'none', border: 'none', color: '#888', fontSize: 10.5, fontWeight: 600, cursor: 'pointer', padding: '2px 0', textAlign: 'left',
|
|
1563
|
+
background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)', fontSize: 10.5, fontWeight: 600, cursor: 'pointer', padding: '2px 0', textAlign: 'left',
|
|
1564
1564
|
}}>
|
|
1565
1565
|
{all ? 'Show fewer' : `Show all ${ready.length}`}
|
|
1566
1566
|
</button>
|
|
@@ -1569,7 +1569,7 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1569
1569
|
)}
|
|
1570
1570
|
|
|
1571
1571
|
{ready.length > 0 && (
|
|
1572
|
-
<div style={{ fontSize: 10, color: '#888', lineHeight: 1.5, marginTop: 8 }}>
|
|
1572
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', lineHeight: 1.5, marginTop: 8 }}>
|
|
1573
1573
|
Each scan: {cost.profileViews} profile view, then one LinkedIn search for every page of their
|
|
1574
1574
|
list, up to {cost.searches} pages (about {cost.minutes} min for a whole list). Nothing starts
|
|
1575
1575
|
until you confirm it on the Scan page.
|
|
@@ -1577,10 +1577,10 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1577
1577
|
)}
|
|
1578
1578
|
|
|
1579
1579
|
{hidden.length > 0 && (
|
|
1580
|
-
<div style={{ marginTop: 10, fontSize: 10.5, color: '#777', lineHeight: 1.6 }}>
|
|
1580
|
+
<div style={{ marginTop: 10, fontSize: 10.5, color: 'var(--sd-fg-4, #777)', lineHeight: 1.6 }}>
|
|
1581
1581
|
{hidden.slice(0, 3).map((p) => (
|
|
1582
1582
|
<div key={p.id} style={{ opacity: 0.7 }}>
|
|
1583
|
-
<span aria-hidden="true">π</span> {p.name} <span style={{ color: '#666' }}>Β· their list is hidden</span>
|
|
1583
|
+
<span aria-hidden="true">π</span> {p.name} <span style={{ color: 'var(--sd-fg-4, #666)' }}>Β· their list is hidden</span>
|
|
1584
1584
|
</div>
|
|
1585
1585
|
))}
|
|
1586
1586
|
{hidden.length > 3 && <div style={{ opacity: 0.7 }}>π and {hidden.length - 3} more with hidden lists</div>}
|
|
@@ -1588,13 +1588,13 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
|
|
|
1588
1588
|
)}
|
|
1589
1589
|
|
|
1590
1590
|
{others > 0 && (
|
|
1591
|
-
<div style={{ fontSize: 10.5, color: '#888', lineHeight: 1.5, marginTop: 10 }}>
|
|
1591
|
+
<div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #888)', lineHeight: 1.5, marginTop: 10 }}>
|
|
1592
1592
|
{others.toLocaleString('en-US')} of your other connections aren't scanned yet.{' '}
|
|
1593
|
-
<Link href="/setup" style={{ color: '#3498DB', textDecoration: 'none' }}>Map them in batches on the Scan page β</Link>
|
|
1593
|
+
<Link href="/setup" style={{ color: 'var(--sd-blue, #3498DB)', textDecoration: 'none' }}>Map them in batches on the Scan page β</Link>
|
|
1594
1594
|
</div>
|
|
1595
1595
|
)}
|
|
1596
1596
|
{busy && (
|
|
1597
|
-
<div style={{ fontSize: 10, color: '#bbb', marginTop: 8 }}>
|
|
1597
|
+
<div style={{ fontSize: 10, color: 'var(--sd-fg-2, #bbb)', marginTop: 8 }}>
|
|
1598
1598
|
{busy}. One scan at a time.
|
|
1599
1599
|
</div>
|
|
1600
1600
|
)}
|