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
|
@@ -36,7 +36,9 @@ import { circleIndex, MAX_DEGREE } from '../../lib/circle';
|
|
|
36
36
|
import { localPhoto } from '../../lib/photos';
|
|
37
37
|
import { reachIndex, reachState, circleState, readyByCircle, circleScanCost, scanBars } from '../../lib/reach';
|
|
38
38
|
import { reachSegments, RING } from '../../lib/dot-rings';
|
|
39
|
-
import { ringLayout, chainTree, dotRadius, previewBand, tierBandLayout } from '../../lib/chain-layout';
|
|
39
|
+
import { ringLayout, chainTree, dotRadius, previewBand, tierBandLayout, circleActivity } from '../../lib/chain-layout';
|
|
40
|
+
import { noteCircle } from '../../lib/notifications';
|
|
41
|
+
import { useUser } from './UserProvider';
|
|
40
42
|
import { redundancy } from '../../lib/brokerage';
|
|
41
43
|
import { keyFor, score } from '../../lib/separation';
|
|
42
44
|
import { hasRequest } from '../../lib/requests-client';
|
|
@@ -175,6 +177,17 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
175
177
|
const index = useMemo(() => circleIndex(all1, all2), [all1, all2]);
|
|
176
178
|
const reach = useMemo(() => reachIndex(all1, all2, scanNotes), [all1, all2, scanNotes]);
|
|
177
179
|
const readyCount = useMemo(() => readyByCircle(reach), [reach]);
|
|
180
|
+
// The notifications, by the circle each is about: the busiest circles go on the inner ring.
|
|
181
|
+
const { userId } = useUser();
|
|
182
|
+
const [notes, setNotes] = useState([]);
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
if (!userId) return undefined;
|
|
185
|
+
let live = true;
|
|
186
|
+
fetch(`/api/notifications?userId=${encodeURIComponent(userId)}`).then((r) => r.json())
|
|
187
|
+
.then((d) => { if (live) setNotes((d.notifications || []).map((n) => ({ circle: noteCircle(n), seen: !!n.seen }))); })
|
|
188
|
+
.catch(() => {});
|
|
189
|
+
return () => { live = false; };
|
|
190
|
+
}, [userId]);
|
|
178
191
|
const twoWays = useMemo(() => redundancy(fullDegree2 || degree2, fullDegree1 || connections), [fullDegree2, degree2, fullDegree1, connections]);
|
|
179
192
|
const rowById = useMemo(() => {
|
|
180
193
|
const m = new Map();
|
|
@@ -240,7 +253,12 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
240
253
|
}
|
|
241
254
|
return withCircle.has(b.unlocked_from_bridge_id);
|
|
242
255
|
};
|
|
243
|
-
|
|
256
|
+
// The inner ring holds the circles with the most going on (lib/chain-layout.js
|
|
257
|
+
// circleActivity): notifications about them, people in them ready to scan,
|
|
258
|
+
// clusters formed from them since. The biggest first among the rest.
|
|
259
|
+
const activity = circleActivity(bridges, { notes, ready: readyCount, chained });
|
|
260
|
+
const roots = bridges.filter((b) => !linked(b))
|
|
261
|
+
.sort((a, b) => activity.get(b.id).score - activity.get(a.id).score);
|
|
244
262
|
// Bridges round you: one ring while they fit, more once there are many, each
|
|
245
263
|
// ring far enough from the last for the names under it.
|
|
246
264
|
const bridgeLayout = ringLayout(roots.length, {
|
|
@@ -248,7 +266,7 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
248
266
|
});
|
|
249
267
|
const bridgePos = roots.map((b, i) => {
|
|
250
268
|
const p = bridgeLayout.points[i];
|
|
251
|
-
return { ...b, x: cx + p.x, y: cy + p.y, angle: p.angle, clusterSize: (bridgeMap[b.id] || []).length, chains: chained.get(b.id) || 0 };
|
|
269
|
+
return { ...b, x: cx + p.x, y: cy + p.y, angle: p.angle, clusterSize: (bridgeMap[b.id] || []).length, chains: chained.get(b.id) || 0, activity: activity.get(b.id) };
|
|
252
270
|
});
|
|
253
271
|
// More than one ring: the counts under each name wait for a hover.
|
|
254
272
|
const crowded = bridgeLayout.rings.length > 1;
|
|
@@ -339,8 +357,8 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
339
357
|
|
|
340
358
|
{/* Their circle, previewed on hover, in a wedge that grows rows as it fills */}
|
|
341
359
|
{hovBridge && (
|
|
342
|
-
<CirclePreview bridge={hovBridge} members={membersOf(hovBridge, index)} reach={reach}
|
|
343
|
-
cx={cx} cy={cy} maxR={maxR} still={still} band={band} />
|
|
360
|
+
<CirclePreview key={hovBridge.id} bridge={hovBridge} members={membersOf(hovBridge, index)} reach={reach}
|
|
361
|
+
cx={cx} cy={cy} maxR={maxR} still={still} band={band} circleOf={(id) => bridgeMap[id] || []} />
|
|
344
362
|
)}
|
|
345
363
|
|
|
346
364
|
{/* Bridge nodes — hover to preview their circle, click to open it */}
|
|
@@ -357,7 +375,7 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
357
375
|
style={{ cursor: 'pointer' }}>
|
|
358
376
|
<title>{bridgeTitle(b, ready, scanBars(b, reach))}</title>
|
|
359
377
|
{/* Glow */}
|
|
360
|
-
<circle cx={b.x} cy={b.y} r={isHov ? 21 : 18} fill={`${TIER_COLORS[b.tier]}${isHov ? '14' : '08'}`} />
|
|
378
|
+
<circle className="sd-dot" cx={b.x} cy={b.y} r={isHov ? 21 : 18} fill={`${TIER_COLORS[b.tier]}${isHov ? '14' : '08'}`} />
|
|
361
379
|
{/* The ring, tight on the dot: one bar for each person you added through
|
|
362
380
|
this circle. Orange: scanned since, with a cluster of their own.
|
|
363
381
|
Green: ready for a scan. Nobody yet: one faint line. */}
|
|
@@ -371,9 +389,9 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
371
389
|
))}
|
|
372
390
|
</g>
|
|
373
391
|
{/* Node */}
|
|
374
|
-
<circle cx={b.x} cy={b.y} r={isHov ? 13 : 11}
|
|
392
|
+
<circle className="sd-dot" cx={b.x} cy={b.y} r={isHov ? 13 : 11}
|
|
375
393
|
fill={localPhoto(b.profile_image_url) ? '#1a1a2e' : TIER_COLORS[b.tier]}
|
|
376
|
-
stroke={isHov ? '#fff' : TIER_COLORS[b.tier]}
|
|
394
|
+
stroke={isHov ? 'var(--sd-fg-1, #fff)' : TIER_COLORS[b.tier]}
|
|
377
395
|
strokeWidth={isHov ? 2.5 : 2} />
|
|
378
396
|
{/* Photo */}
|
|
379
397
|
{localPhoto(b.profile_image_url) && (
|
|
@@ -384,22 +402,30 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
384
402
|
</>
|
|
385
403
|
)}
|
|
386
404
|
{!localPhoto(b.profile_image_url) && (
|
|
387
|
-
<text x={b.x} y={b.y + 4} textAnchor="middle" fill={b.tier === 'S' ? '#000' : '#fff'}
|
|
405
|
+
<text x={b.x} y={b.y + 4} textAnchor="middle" fill={b.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)'}
|
|
388
406
|
fontSize={11} fontWeight={700}>{b.name?.charAt(0)}</text>
|
|
389
407
|
)}
|
|
390
|
-
{/*
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
408
|
+
{/* The circle's notifications, top right (Blake, 2026-10-02: "the circle degree
|
|
409
|
+
outline on the top right with the number of notifications for that cluster"):
|
|
410
|
+
new notifications about it and the people in it ready to scan. Gold when
|
|
411
|
+
there's news, green when it's only people ready. */}
|
|
412
|
+
{(() => {
|
|
413
|
+
const news = (b.activity?.unread || 0) + ready;
|
|
414
|
+
if (!news) return null;
|
|
415
|
+
const tone = b.activity?.unread ? 'var(--sd-gold, #FFD700)' : 'var(--sd-green, #00ff88)'; // deeper on a light look
|
|
416
|
+
return (
|
|
417
|
+
<g pointerEvents="none">
|
|
418
|
+
<circle cx={b.x + 14} cy={b.y - 14} r={6} fill="var(--sd-bg)" stroke={tone} strokeWidth={1.2} />
|
|
419
|
+
<text x={b.x + 14} y={b.y - 11.4} textAnchor="middle" fill={tone} fontSize={news > 9 ? 6 : 7} fontWeight={800}>{news > 99 ? '99+' : news}</text>
|
|
420
|
+
</g>
|
|
421
|
+
);
|
|
422
|
+
})()}
|
|
397
423
|
{/* Name + count */}
|
|
398
|
-
<text x={b.x} y={b.y + (isHov ? 24 : 22)} textAnchor="middle" fill="#fff" fontSize={9} fontWeight={600}>
|
|
424
|
+
<text x={b.x} y={b.y + (isHov ? 24 : 22)} textAnchor="middle" fill="var(--sd-fg-1, #fff)" fontSize={9} fontWeight={600}>
|
|
399
425
|
{b.name?.split(' ')[0]}
|
|
400
426
|
</text>
|
|
401
427
|
{(!crowded || isHov) && (
|
|
402
|
-
<text x={b.x} y={b.y + (isHov ? 34 : 32)} textAnchor="middle" fill={isHov ? '#bbb' : '#888'} fontSize={7}>
|
|
428
|
+
<text x={b.x} y={b.y + (isHov ? 34 : 32)} textAnchor="middle" fill={isHov ? 'var(--sd-fg-2, #bbb)' : 'var(--sd-fg-3, #888)'} fontSize={7}>
|
|
403
429
|
{b.clusterSize} · {sCount > 0 ? sCount + 'S ' : ''}{aCount > 0 ? aCount + 'A' : ''}
|
|
404
430
|
</text>
|
|
405
431
|
)}
|
|
@@ -409,7 +435,7 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
409
435
|
|
|
410
436
|
{/* Center: YOU */}
|
|
411
437
|
<circle cx={cx} cy={cy} r={22} fill="var(--sd-bg)" stroke="#FFD700" strokeWidth={3} />
|
|
412
|
-
<text x={cx} y={cy + 4} textAnchor="middle" fill="#FFD700" fontSize={11} fontWeight={800}>
|
|
438
|
+
<text x={cx} y={cy + 4} textAnchor="middle" fill="var(--sd-gold, #FFD700)" fontSize={11} fontWeight={800}>
|
|
413
439
|
{userName?.split(' ')[0] || 'YOU'}
|
|
414
440
|
</text>
|
|
415
441
|
</g>
|
|
@@ -422,41 +448,35 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
422
448
|
onOut={() => setZoom(z => Math.max(0.4, (z ?? homeZoom) - 0.3))}
|
|
423
449
|
/>
|
|
424
450
|
|
|
425
|
-
{/* Depth tracker
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
451
|
+
{/* Depth tracker: just the dots, no box (Blake, 2026-10-03: the box grew with
|
|
452
|
+
a theme's font and stopped fitting; "just have the dots there instead so
|
|
453
|
+
its more clean looking"). What they add up to is the tooltip. */}
|
|
454
|
+
<div
|
|
455
|
+
title={[
|
|
456
|
+
`${roots.length} bridges${bridges.length > roots.length ? ` + ${bridges.length - roots.length} along their chains` : ''} · ${d2S} S + ${d2A} A at 2nd degree`,
|
|
457
|
+
twoWays > 0 ? `${Math.round(twoWays * 100)}% of your 2nd degree you reach two or more ways` : null,
|
|
458
|
+
'The inner ring: the circles with the most going on (notifications, people ready to scan, clusters formed since)',
|
|
459
|
+
'Click a bridge to open their circle, then anyone in it to open theirs',
|
|
460
|
+
].filter(Boolean).join('\n')}
|
|
461
|
+
style={{ position: 'absolute', bottom: 16, left: 16, display: 'flex', alignItems: 'flex-end', gap: 12 }}>
|
|
462
|
+
{[1, 2, 3, 4, 5, 6].map((d) => {
|
|
463
|
+
const lit = d <= 2;
|
|
464
|
+
const n = d === 1 ? connections.length : d === 2 ? totalD2 : null;
|
|
465
|
+
return (
|
|
466
|
+
<div key={d} title={lit ? `${d === 1 ? '1st degree: your bridges' : '2nd degree: the people in their circles'} (${n.toLocaleString('en-US')})` : `${d}th degree: further along a chain, as your scans reach it`}
|
|
467
|
+
style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 4 }}>
|
|
468
|
+
<span className={lit ? 'sd-dot-html' : undefined} style={{
|
|
469
|
+
width: 11, height: 11, borderRadius: '50%',
|
|
470
|
+
background: lit ? DEGREE_COLORS[d] : 'transparent',
|
|
471
|
+
border: lit ? 'none' : '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.22)',
|
|
472
|
+
boxShadow: lit ? `0 0 8px ${DEGREE_COLORS[d]}80` : 'none',
|
|
473
|
+
}} />
|
|
474
|
+
<span style={{ fontSize: 9.5, fontWeight: 700, color: lit ? 'var(--sd-fg-2, #c8cdd8)' : 'var(--sd-fg-5, #556)', fontVariantNumeric: 'tabular-nums', textShadow: HALO_TEXT }}>
|
|
475
|
+
{lit ? n.toLocaleString('en-US') : `D${d}`}
|
|
476
|
+
</span>
|
|
447
477
|
</div>
|
|
448
|
-
)
|
|
449
|
-
|
|
450
|
-
<div style={{ fontSize: 9, color: '#555', marginTop: 8 }}>
|
|
451
|
-
{roots.length} bridges{bridges.length > roots.length ? ` + ${bridges.length - roots.length} along their chains` : ''} · {d2S} S + {d2A} A at 2nd degree
|
|
452
|
-
</div>
|
|
453
|
-
{twoWays > 0 && (
|
|
454
|
-
<div style={{ fontSize: 9, color: '#555', marginTop: 4 }}
|
|
455
|
-
title="The share of everyone you reach through a circle that more than one of your connections reaches">
|
|
456
|
-
{Math.round(twoWays * 100)}% of your 2nd degree you reach two or more ways
|
|
457
|
-
</div>
|
|
458
|
-
)}
|
|
459
|
-
<div style={{ fontSize: 8, color: '#444', marginTop: 4 }}>Click a bridge to open their circle, then anyone in it to open theirs</div>
|
|
478
|
+
);
|
|
479
|
+
})}
|
|
460
480
|
</div>
|
|
461
481
|
</div>
|
|
462
482
|
);
|
|
@@ -465,6 +485,8 @@ export default function ChainView({ connections, degree2 = [], onSelect, userNam
|
|
|
465
485
|
/** What a bridge's ring and number mean, in words, for its tooltip. */
|
|
466
486
|
function bridgeTitle(b, ready, bars) {
|
|
467
487
|
const parts = [];
|
|
488
|
+
const notes = b.activity?.notes || 0;
|
|
489
|
+
if (notes) parts.push(`${notes} notification${notes === 1 ? '' : 's'} about their circle${b.activity.unread ? `, ${b.activity.unread} new` : ''}`);
|
|
468
490
|
if (ready) parts.push(`${ready} in ${firstName(b)}’s circle ${ready === 1 ? 'is' : 'are'} ready for a scan`);
|
|
469
491
|
if (b.chains) parts.push(`${b.chains} scanned since, with ${b.chains === 1 ? 'a cluster' : 'clusters'} of their own`);
|
|
470
492
|
if (bars != null) parts.push(bars === 5 ? 'their whole list is scanned' : `about ${bars * 20}% of their list is scanned`);
|
|
@@ -472,7 +494,34 @@ function bridgeTitle(b, ready, bars) {
|
|
|
472
494
|
}
|
|
473
495
|
|
|
474
496
|
/** A bridge's circle on hover: the people you reached through it first, then their S, A and B. */
|
|
475
|
-
|
|
497
|
+
// The preview grows out of the bridge when you hover it (Blake, 2026-10-03: "the
|
|
498
|
+
// d2,3,4 clusters emerging out of the circle in the preview to show the grow but
|
|
499
|
+
// make it quick and snappy"): their circle's people shoot out to their places,
|
|
500
|
+
// then anyone among them whose own circle is scanned sprouts it (3rd degree),
|
|
501
|
+
// then theirs (4th). Under half a second in all; still with Reduce Motion.
|
|
502
|
+
const PREVIEW_CSS = `
|
|
503
|
+
@keyframes pvEmerge { from { transform: translate(var(--fx), var(--fy)) scale(0.2); opacity: 0; } 55% { opacity: 1; } to { transform: none; opacity: 1; } }
|
|
504
|
+
@keyframes pvFade { from { opacity: 0; } }
|
|
505
|
+
.pv-dot { transform-box: fill-box; transform-origin: center; animation: pvEmerge .24s cubic-bezier(.2,.9,.3,1.25) both; animation-delay: var(--d, 0ms); }
|
|
506
|
+
.pv-d3 { animation-duration: .22s; animation-delay: calc(150ms + var(--d, 0ms)); }
|
|
507
|
+
.pv-d4 { animation-duration: .2s; animation-delay: calc(270ms + var(--d, 0ms)); }
|
|
508
|
+
.pv-line { animation: pvFade .3s ease-out both; animation-delay: var(--d, 0ms); }
|
|
509
|
+
@media (prefers-reduced-motion: reduce) { .pv-dot, .pv-line { animation: none; } }
|
|
510
|
+
`;
|
|
511
|
+
const SPROUT = 14; // the most of a circle's own circle drawn round them
|
|
512
|
+
const SPROUT_4 = 8;
|
|
513
|
+
|
|
514
|
+
/** Where someone's own circle sprouts round their dot: an arc facing away from the middle. */
|
|
515
|
+
function sprout(n, x, y, cx, cy, r) {
|
|
516
|
+
const out = Math.atan2(y - cy, x - cx);
|
|
517
|
+
const spread = Math.min(Math.PI * 1.1, 0.5 + n * 0.16);
|
|
518
|
+
return Array.from({ length: n }, (_, i) => {
|
|
519
|
+
const a = out - spread / 2 + (n === 1 ? spread / 2 : (i * spread) / (n - 1));
|
|
520
|
+
return { x: x + Math.cos(a) * r, y: y + Math.sin(a) * r };
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function CirclePreview({ bridge, members, reach, cx, cy, maxR, still, band, circleOf = () => [] }) {
|
|
476
525
|
const shown = members.filter((m) => m.degree === 1 || m.tier === 'S' || m.tier === 'A' || m.tier === 'B');
|
|
477
526
|
// Beyond every ring of bridges (lib/chain-layout.js previewBand).
|
|
478
527
|
const { inner, outer } = band;
|
|
@@ -480,8 +529,12 @@ function CirclePreview({ bridge, members, reach, cx, cy, maxR, still, band }) {
|
|
|
480
529
|
const layout = ringLayout(shown.length, {
|
|
481
530
|
inner, outer, spacing: 11, minSpacing: 3.5, start: bridge.angle - sweep / 2, sweep,
|
|
482
531
|
});
|
|
532
|
+
// Spread the start of each dot over a tenth of a second, wherever it sits.
|
|
533
|
+
const stagger = (j) => `${Math.round((j / Math.max(1, shown.length)) * 110)}ms`;
|
|
534
|
+
const from = (x, y, ox, oy) => ({ '--fx': `${(ox - x).toFixed(1)}px`, '--fy': `${(oy - y).toFixed(1)}px` });
|
|
483
535
|
return (
|
|
484
536
|
<g>
|
|
537
|
+
<style>{PREVIEW_CSS}</style>
|
|
485
538
|
<circle cx={cx} cy={cy} r={inner} fill="none" stroke={`${DEGREE_COLORS[2]}06`} strokeWidth={1} />
|
|
486
539
|
{shown.map((d2, j) => {
|
|
487
540
|
const p = layout.points[j];
|
|
@@ -490,21 +543,44 @@ function CirclePreview({ bridge, members, reach, cx, cy, maxR, still, band }) {
|
|
|
490
543
|
const state = reachState(d2, reach);
|
|
491
544
|
const nr = Math.min(dotRadius(layout.spacing, d2.tier), 5) * (state ? 1.3 : 1);
|
|
492
545
|
const color = state === 'hidden' ? HIDDEN : TIER_COLORS[d2.tier] || '#555';
|
|
546
|
+
// Their own circle, if it's scanned: the 3rd degree, and inside it the 4th.
|
|
547
|
+
const own = d2.degree === 1 ? circleOf(d2.id) : [];
|
|
548
|
+
const third = own.slice(0, SPROUT);
|
|
549
|
+
const thirdAt = sprout(third.length, x2, y2, cx, cy, nr + 9);
|
|
493
550
|
return (
|
|
494
551
|
<g key={'pv-' + d2.id}>
|
|
495
552
|
{(state || shown.length <= 40) && (
|
|
496
|
-
<line x1={bridge.x} y1={bridge.y} x2={x2} y2={y2}
|
|
553
|
+
<line className="pv-line" style={{ '--d': stagger(j) }} x1={bridge.x} y1={bridge.y} x2={x2} y2={y2}
|
|
497
554
|
stroke={state ? GREEN : color} strokeWidth={0.5} strokeOpacity={state ? 0.35 : 0.15} />
|
|
498
555
|
)}
|
|
499
|
-
{
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
{
|
|
506
|
-
|
|
507
|
-
|
|
556
|
+
<g className="pv-dot" style={{ '--d': stagger(j), ...from(x2, y2, bridge.x, bridge.y) }}>
|
|
557
|
+
{state === 'ready' && <Halo x={x2} y={y2} r={nr * 2.3} still={still} />}
|
|
558
|
+
<circle className="sd-dot" cx={x2} cy={y2} r={nr}
|
|
559
|
+
fill={color} fillOpacity={state ? 0.95 : 0.45}
|
|
560
|
+
stroke={state && state !== 'hidden' ? GREEN : color} strokeWidth={state ? 1 : 0.5} strokeOpacity={state ? 1 : 0.25} />
|
|
561
|
+
{(d2.tier === 'S' || state) && shown.length <= 60 && (
|
|
562
|
+
<text x={x2} y={y2 + nr + 9} textAnchor="middle" fill={state && state !== 'hidden' ? GREEN : 'var(--sd-fg-3, #aaa)'} fontSize={7}>
|
|
563
|
+
{firstName(d2)}
|
|
564
|
+
</text>
|
|
565
|
+
)}
|
|
566
|
+
</g>
|
|
567
|
+
{third.map((k, i) => {
|
|
568
|
+
const t = thirdAt[i];
|
|
569
|
+
const fourth = k.degree === 1 ? circleOf(k.id).slice(0, SPROUT_4) : [];
|
|
570
|
+
const fourthAt = sprout(fourth.length, t.x, t.y, x2, y2, 6);
|
|
571
|
+
return (
|
|
572
|
+
<g key={'p3-' + k.id}>
|
|
573
|
+
<line className="pv-line" style={{ '--d': `calc(150ms + ${stagger(j)})` }} x1={x2} y1={y2} x2={t.x} y2={t.y}
|
|
574
|
+
stroke={TIER_COLORS[k.tier] || '#555'} strokeWidth={0.4} strokeOpacity={0.3} />
|
|
575
|
+
<circle className="pv-dot pv-d3" style={{ '--d': `${i * 8}ms`, ...from(t.x, t.y, x2, y2) }}
|
|
576
|
+
cx={t.x} cy={t.y} r={1.8} fill={TIER_COLORS[k.tier] || '#555'} fillOpacity={0.85} />
|
|
577
|
+
{fourth.map((f, q) => (
|
|
578
|
+
<circle key={'p4-' + f.id} className="pv-dot pv-d4" style={{ '--d': `${q * 6}ms`, ...from(fourthAt[q].x, fourthAt[q].y, t.x, t.y) }}
|
|
579
|
+
cx={fourthAt[q].x} cy={fourthAt[q].y} r={1.1} fill={TIER_COLORS[f.tier] || '#555'} fillOpacity={0.75} />
|
|
580
|
+
))}
|
|
581
|
+
</g>
|
|
582
|
+
);
|
|
583
|
+
})}
|
|
508
584
|
</g>
|
|
509
585
|
);
|
|
510
586
|
})}
|
|
@@ -527,7 +603,7 @@ function Lock({ x, y, s }) {
|
|
|
527
603
|
return (
|
|
528
604
|
<g transform={`translate(${x} ${y}) scale(${s})`} pointerEvents="none">
|
|
529
605
|
<path d="M-1.9 -0.6 V-1.8 A1.9 1.9 0 0 1 1.9 -1.8 V-0.6" fill="none" stroke="#d6d6de" strokeWidth={0.9} />
|
|
530
|
-
<rect x={-2.6} y={-0.7} width={5.2} height={3.9} rx={0.8} fill="#d6d6de" />
|
|
606
|
+
<rect x={-2.6} y={-0.7} width={5.2} height={3.9} rx={0.8} fill="var(--sd-fg-2, #d6d6de)" />
|
|
531
607
|
</g>
|
|
532
608
|
);
|
|
533
609
|
}
|
|
@@ -535,7 +611,7 @@ function Lock({ x, y, s }) {
|
|
|
535
611
|
function ZoomButtons({ onIn, onReset, onOut }) {
|
|
536
612
|
const round = (dim) => ({
|
|
537
613
|
width: 32, height: 32, borderRadius: '50%', border: 'none', cursor: 'pointer',
|
|
538
|
-
background: dim ? 'rgba(255,255,255,0.06)' : 'rgba(255,255,255,0.1)', color: dim ? '#666' : '#fff',
|
|
614
|
+
background: dim ? 'rgba(var(--sd-ink, 255, 255, 255), 0.06)' : 'rgba(var(--sd-ink, 255, 255, 255), 0.1)', color: dim ? 'var(--sd-fg-4, #666)' : 'var(--sd-fg-1, #fff)',
|
|
539
615
|
fontSize: dim ? 10 : 18, fontWeight: 700,
|
|
540
616
|
display: 'flex', alignItems: 'center', justifyContent: 'center', backdropFilter: 'blur(8px)',
|
|
541
617
|
});
|
|
@@ -683,7 +759,7 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
683
759
|
<circle cx={p.x} cy={p.y} r={r * 1.2} fill="none" stroke={color} strokeWidth={Math.max(0.6, r * 0.45)}
|
|
684
760
|
strokeDasharray={`${Math.max(0.8, r * 0.55)} ${Math.max(0.6, r * 0.45)}`} />
|
|
685
761
|
) : (
|
|
686
|
-
<circle cx={p.x} cy={p.y} r={r} fill={color} fillOpacity={f.reached ? 1 : 0.85}
|
|
762
|
+
<circle className="sd-dot" cx={p.x} cy={p.y} r={r} fill={color} fillOpacity={f.reached ? 1 : 0.85}
|
|
687
763
|
stroke={f.reached && f.reached !== 'hidden' ? GREEN : 'none'} strokeWidth={f.reached ? Math.max(0.8, r * 0.3) : 0} />
|
|
688
764
|
)}
|
|
689
765
|
{f.reached === 'hidden' && <Lock x={p.x} y={p.y - r * 0.1} s={r / 4.2} />}
|
|
@@ -692,7 +768,7 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
692
768
|
)}
|
|
693
769
|
{(f.reached || (roomy && row.tier === 'S')) && (
|
|
694
770
|
<text x={p.x} y={above ? p.y - r - 4 / k : p.y + r + 10 / k} textAnchor="middle" fontSize={8.5 / k} fontWeight={f.reached ? 700 : 400}
|
|
695
|
-
fill={f.reached === 'hidden' ? '#999' : f.reached ? GREEN : '#aaa'} pointerEvents="none"
|
|
771
|
+
fill={f.reached === 'hidden' ? 'var(--sd-fg-3, #999)' : f.reached ? GREEN : 'var(--sd-fg-3, #aaa)'} pointerEvents="none"
|
|
696
772
|
stroke="var(--sd-bg)" strokeWidth={2.4 / k} paintOrder="stroke">
|
|
697
773
|
{firstName(row)}
|
|
698
774
|
</text>
|
|
@@ -794,7 +870,7 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
794
870
|
{/* A faint band behind each tier's dots, in its colour */}
|
|
795
871
|
{layout.bands.map((band) => (
|
|
796
872
|
<circle key={band.tier} r={(band.inner + band.outer) / 2} fill="none"
|
|
797
|
-
stroke={TIER_COLORS[band.tier] || '#555'} strokeOpacity={0.07}
|
|
873
|
+
stroke={TIER_COLORS[band.tier] || 'var(--sd-fg-5, #555)'} strokeOpacity={0.07}
|
|
798
874
|
strokeWidth={Math.max(1 / k, band.outer - band.inner + layout.spacing)} pointerEvents="none" />
|
|
799
875
|
))}
|
|
800
876
|
{dots}
|
|
@@ -813,17 +889,17 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
813
889
|
<circle r={c.radius} fill="var(--sd-bg)" fillOpacity={0.9} stroke={color} strokeOpacity={lit ? 0.7 : 0.25} strokeWidth={1 / k} />
|
|
814
890
|
{/* Their people, each joined to the middle of the cluster */}
|
|
815
891
|
{clusterPaths(c).map(([tier, { spokes }]) => (
|
|
816
|
-
<path key={'s' + tier} d={spokes} fill="none" stroke={TIER_COLORS[tier] || '#555'}
|
|
892
|
+
<path key={'s' + tier} d={spokes} fill="none" stroke={TIER_COLORS[tier] || 'var(--sd-fg-5, #555)'}
|
|
817
893
|
strokeWidth={0.7} strokeOpacity={lit ? 0.6 : 0.38} />
|
|
818
894
|
))}
|
|
819
895
|
{clusterPaths(c).map(([tier, { dots: d }]) => (
|
|
820
|
-
<path key={tier} d={d} fill={TIER_COLORS[tier] || '#555'} fillOpacity={lit ? 1 : 0.9} />
|
|
896
|
+
<path className="sd-dot" key={tier} d={d} fill={TIER_COLORS[tier] || 'var(--sd-fg-5, #555)'} fillOpacity={lit ? 1 : 0.9} />
|
|
821
897
|
))}
|
|
822
|
-
<circle r={LINK_HUB} fill={color} stroke={hovLink === j ? '#fff' : 'var(--sd-bg)'} strokeWidth={1.5} />
|
|
898
|
+
<circle className="sd-dot" r={LINK_HUB} fill={color} stroke={hovLink === j ? 'var(--sd-fg-1, #fff)' : 'var(--sd-bg)'} strokeWidth={1.5} />
|
|
823
899
|
{row.id === scanningId && (
|
|
824
900
|
<circle r={c.radius + 4} fill="none" stroke={DEGREE_COLORS[3]} strokeWidth={1 / k} strokeDasharray={`${3 / k} ${2 / k}`} />
|
|
825
901
|
)}
|
|
826
|
-
<text y={c.radius + 12 / k} textAnchor="middle" fill="#fff" fontSize={10 / k} fontWeight={700}
|
|
902
|
+
<text y={c.radius + 12 / k} textAnchor="middle" fill="var(--sd-fg-1, #fff)" fontSize={10 / k} fontWeight={700}
|
|
827
903
|
stroke="var(--sd-bg)" strokeWidth={2.4 / k} paintOrder="stroke">{firstName(row)}’s circle</text>
|
|
828
904
|
<text y={c.radius + 23 / k} textAnchor="middle" fill={color} fontSize={8 / k}
|
|
829
905
|
stroke="var(--sd-bg)" strokeWidth={2.4 / k} paintOrder="stroke">
|
|
@@ -856,7 +932,7 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
856
932
|
{seg(o, o.r + 1, p, LINK_HUB + 1, 'b')}
|
|
857
933
|
{/* Their own dot inside the cluster they were met through */}
|
|
858
934
|
{o.inCluster && (
|
|
859
|
-
<circle cx={o.x} cy={o.y} r={o.r} fill={TIER_COLORS[link.row.tier] || '#555'} stroke={GREEN} strokeWidth={1.4} />
|
|
935
|
+
<circle className="sd-dot" cx={o.x} cy={o.y} r={o.r} fill={TIER_COLORS[link.row.tier] || 'var(--sd-fg-5, #555)'} stroke={GREEN} strokeWidth={1.4} />
|
|
860
936
|
)}
|
|
861
937
|
</g>
|
|
862
938
|
);
|
|
@@ -864,25 +940,25 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
864
940
|
{/* The one under the pointer, on top */}
|
|
865
941
|
{hp && (
|
|
866
942
|
<>
|
|
867
|
-
<line x1={0} y1={0} x2={hp.x} y2={hp.y} stroke={TIER_COLORS[hovered.tier] || '#888'} strokeWidth={1.6 / k} strokeOpacity={0.8} />
|
|
943
|
+
<line x1={0} y1={0} x2={hp.x} y2={hp.y} stroke={TIER_COLORS[hovered.tier] || 'var(--sd-fg-3, #888)'} strokeWidth={1.6 / k} strokeOpacity={0.8} />
|
|
868
944
|
<circle cx={hp.x} cy={hp.y} r={dotRadius(layout.spacing, hovered.tier) * (facts[hover].reached ? 1.4 : 1) + 2 / k}
|
|
869
945
|
fill="none" stroke="#fff" strokeWidth={1.6 / k} />
|
|
870
946
|
</>
|
|
871
947
|
)}
|
|
872
948
|
{/* The person in the middle, with the halo if their own circle is ready to scan */}
|
|
873
949
|
{reachState(person, reach) === 'ready' && <Halo x={0} y={0} r={40} still={still} />}
|
|
874
|
-
<circle r={28} fill="var(--sd-bg)" stroke={TIER_COLORS[person.tier] || '#888'} strokeWidth={hover === 'center' ? 4 : 3} filter="url(#focusGlow)" />
|
|
950
|
+
<circle r={28} fill="var(--sd-bg)" stroke={TIER_COLORS[person.tier] || 'var(--sd-fg-3, #888)'} strokeWidth={hover === 'center' ? 4 : 3} filter="url(#focusGlow)" />
|
|
875
951
|
{localPhoto(person.profile_image_url) ? (
|
|
876
952
|
<>
|
|
877
953
|
<clipPath id="focus-clip"><circle r={24} /></clipPath>
|
|
878
954
|
<image href={localPhoto(person.profile_image_url)} x={-24} y={-24} width={48} height={48} clipPath="url(#focus-clip)" />
|
|
879
955
|
</>
|
|
880
956
|
) : (
|
|
881
|
-
<text y={5} textAnchor="middle" fill={TIER_COLORS[person.tier] || '#888'} fontSize={16} fontWeight={800}>
|
|
957
|
+
<text y={5} textAnchor="middle" fill={TIER_COLORS[person.tier] || 'var(--sd-fg-3, #888)'} fontSize={16} fontWeight={800}>
|
|
882
958
|
{person.name?.charAt(0)}
|
|
883
959
|
</text>
|
|
884
960
|
)}
|
|
885
|
-
<text y={40} textAnchor="middle" fill="#fff" fontSize={11} fontWeight={700} pointerEvents="none">{person.name}</text>
|
|
961
|
+
<text y={40} textAnchor="middle" fill="var(--sd-fg-1, #fff)" fontSize={11} fontWeight={700} pointerEvents="none">{person.name}</text>
|
|
886
962
|
</g>
|
|
887
963
|
{hovered && (
|
|
888
964
|
<Tip x={cx + view.x + hp.x * k} y={cy + view.y + hp.y * k} w={dims.w}
|
|
@@ -908,28 +984,28 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
908
984
|
<div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap', pointerEvents: 'auto' }}>
|
|
909
985
|
<button type="button" onClick={() => onBack(depth - 1)} style={{
|
|
910
986
|
padding: '8px 16px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
911
|
-
background: 'rgba(255,255,255,0.1)', color: '#ddd', fontSize: 12, fontWeight: 700,
|
|
987
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.1)', color: 'var(--sd-fg-1, #ddd)', fontSize: 12, fontWeight: 700,
|
|
912
988
|
}}>
|
|
913
989
|
← {depth === 1 ? 'All bridges' : `${firstName(trail[depth - 2])}’s circle`}
|
|
914
990
|
</button>
|
|
915
|
-
<nav aria-label="Trail" style={{ fontSize: 11, color: '#777', display: 'flex', gap: 6, flexWrap: 'wrap', alignItems: 'center' }}>
|
|
991
|
+
<nav aria-label="Trail" style={{ fontSize: 11, color: 'var(--sd-fg-4, #777)', display: 'flex', gap: 6, flexWrap: 'wrap', alignItems: 'center' }}>
|
|
916
992
|
<button type="button" onClick={() => onBack(0)} style={crumb}>All bridges</button>
|
|
917
993
|
{trail.map((row, i) => (
|
|
918
994
|
<span key={row.id} style={{ display: 'inline-flex', gap: 6, alignItems: 'center' }}>
|
|
919
995
|
<span aria-hidden="true">›</span>
|
|
920
996
|
{i === depth - 1
|
|
921
|
-
? <span style={{ color: '#fff', fontWeight: 700 }}>{row.name}</span>
|
|
997
|
+
? <span style={{ color: 'var(--sd-fg-1, #fff)', fontWeight: 700 }}>{row.name}</span>
|
|
922
998
|
: <button type="button" onClick={() => onBack(i + 1)} style={crumb}>{row.name}</button>}
|
|
923
999
|
</span>
|
|
924
1000
|
))}
|
|
925
1001
|
</nav>
|
|
926
1002
|
</div>
|
|
927
|
-
<div style={{ fontSize: 11, color: '#999' }}>
|
|
1003
|
+
<div style={{ fontSize: 11, color: 'var(--sd-fg-3, #999)' }}>
|
|
928
1004
|
{firstName(person)}’s circle · {members.length.toLocaleString('en-US')} {members.length === 1 ? 'person' : 'people'}
|
|
929
1005
|
{' · '}{ordinal(depth + 1)} degree{depth > 1 ? ', counted along this chain' : ''}
|
|
930
1006
|
</div>
|
|
931
1007
|
{scanningThem && members.length > 0 && (
|
|
932
|
-
<div role="status" style={{ ...note, borderColor: 'rgba(52,152,219,0.4)', color: '#cfe6f7' }}>
|
|
1008
|
+
<div role="status" style={{ ...note, borderColor: 'rgba(52,152,219,0.4)', color: 'var(--sd-fg-1, #cfe6f7)' }}>
|
|
933
1009
|
Scanning {firstName(person)}’s circle now. More people appear here as it saves, every 10 pages.
|
|
934
1010
|
</div>
|
|
935
1011
|
)}
|
|
@@ -940,30 +1016,23 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
940
1016
|
scanning={scanningThem} canScan={canScan} onSelect={onSelect} top={cy + 64} />
|
|
941
1017
|
)}
|
|
942
1018
|
|
|
943
|
-
{/* What's in this circle */}
|
|
1019
|
+
{/* What's in this circle: dots and counts, no box, as the depth tracker */}
|
|
944
1020
|
{members.length > 0 && (
|
|
945
|
-
<div
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
1021
|
+
<div title={`Click anyone for their circle${ready > 0 && canScan ? ', or someone ready to scan theirs' : ''} · drag to move · scroll to zoom`}
|
|
1022
|
+
style={{
|
|
1023
|
+
position: 'absolute', bottom: 18, left: 18, maxWidth: 'calc(100% - 110px)',
|
|
1024
|
+
display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: '6px 14px',
|
|
1025
|
+
fontSize: 10.5, color: 'var(--sd-fg-3, #aab)', textShadow: HALO_TEXT,
|
|
1026
|
+
}}>
|
|
951
1027
|
{byTier.map(([t, n]) => (
|
|
952
|
-
<
|
|
953
|
-
<
|
|
954
|
-
<span style={{ color: TIER_COLORS[t], fontWeight:
|
|
955
|
-
<span>{n.toLocaleString('en-US')}</span>
|
|
956
|
-
</
|
|
1028
|
+
<span key={t} style={{ display: 'inline-flex', alignItems: 'center', gap: 5 }}>
|
|
1029
|
+
<span className="sd-dot-html" style={{ width: 8, height: 8, borderRadius: '50%', background: TIER_COLORS[t], boxShadow: `0 0 6px ${TIER_COLORS[t]}66` }} />
|
|
1030
|
+
<span style={{ color: TIER_COLORS[t], fontWeight: 700 }}>{t}</span>
|
|
1031
|
+
<span style={{ fontVariantNumeric: 'tabular-nums' }}>{n.toLocaleString('en-US')}</span>
|
|
1032
|
+
</span>
|
|
957
1033
|
))}
|
|
958
|
-
{
|
|
959
|
-
|
|
960
|
-
{added > 0 && <div><span style={{ color: GREEN }}>● </span>you added {added}{ready ? `, ${ready} ready to scan` : ''}{hidden ? `, ${hidden} hidden` : ''}</div>}
|
|
961
|
-
{asked > 0 && <div><span style={{ color: '#FFD700' }}>◌ </span>{asked} {asked === 1 ? 'request' : 'requests'} out</div>}
|
|
962
|
-
</div>
|
|
963
|
-
)}
|
|
964
|
-
<div style={{ marginTop: 6, color: '#555' }}>
|
|
965
|
-
Click anyone for their circle{ready > 0 && canScan ? ', or someone ready to scan theirs' : ''} · drag to move · scroll to zoom
|
|
966
|
-
</div>
|
|
1034
|
+
{added > 0 && <span><span style={{ color: GREEN }}>●</span> you added {added}{ready ? `, ${ready} ready to scan` : ''}{hidden ? `, ${hidden} hidden` : ''}</span>}
|
|
1035
|
+
{asked > 0 && <span><span style={{ color: 'var(--sd-gold, #FFD700)' }}>◌</span> {asked} {asked === 1 ? 'request' : 'requests'} out</span>}
|
|
967
1036
|
</div>
|
|
968
1037
|
)}
|
|
969
1038
|
|
|
@@ -972,6 +1041,9 @@ function CircleFocus({ trail, index, reach, dims, requests, scanningId, still, c
|
|
|
972
1041
|
);
|
|
973
1042
|
}
|
|
974
1043
|
|
|
1044
|
+
// Words over the map without a box: a soft halo in the theme's background (lib/themes.js).
|
|
1045
|
+
const HALO_TEXT = '0 0 3px var(--sd-bg), 0 0 6px var(--sd-bg), 0 0 1px var(--sd-bg)';
|
|
1046
|
+
|
|
975
1047
|
// A link's cluster draws at most this many of their people; the count beside it is the whole circle.
|
|
976
1048
|
const LINK_DOTS = 290;
|
|
977
1049
|
// The middle of a cluster, where its first ring starts, and a link's own dot inside one.
|
|
@@ -1019,10 +1091,10 @@ function Tip({ x, y, w, lines, accent }) {
|
|
|
1019
1091
|
const top = Math.max(6, y - height - 12);
|
|
1020
1092
|
return (
|
|
1021
1093
|
<g pointerEvents="none">
|
|
1022
|
-
<rect x={left} y={top} width={width} height={height} rx={6} fill="rgba(0,0,0,0.92)" stroke={accent || '#555'} strokeWidth={0.6} />
|
|
1094
|
+
<rect x={left} y={top} width={width} height={height} rx={6} fill="var(--sd-surface, rgba(0,0,0,0.92))" stroke={accent || 'var(--sd-fg-5, #555)'} strokeWidth={0.6} />
|
|
1023
1095
|
{lines.map((line, i) => (
|
|
1024
1096
|
<text key={i} x={left + width / 2} y={top + 16 + i * 12} textAnchor="middle"
|
|
1025
|
-
fill={i === 0 ? '#fff' : i === 2 ? accent || '#aaa' : '#999'} fontSize={i === 0 ? 10.5 : 9} fontWeight={i === 0 ? 700 : 400}>
|
|
1097
|
+
fill={i === 0 ? 'var(--sd-fg-1, #fff)' : i === 2 ? accent || 'var(--sd-fg-3, #aaa)' : 'var(--sd-fg-3, #999)'} fontSize={i === 0 ? 10.5 : 9} fontWeight={i === 0 ? 700 : 400}>
|
|
1026
1098
|
{line}
|
|
1027
1099
|
</text>
|
|
1028
1100
|
))}
|
|
@@ -1059,7 +1131,7 @@ function EmptyCircle({ person, depth, reach, requests, scanning, canScan, onSele
|
|
|
1059
1131
|
action = (
|
|
1060
1132
|
<>
|
|
1061
1133
|
<Link href={scanPageFor(person)} style={primary}>Scan {first}’s circle →</Link>
|
|
1062
|
-
<div style={{ fontSize: 10.5, color: '#888', marginTop: 8 }}>
|
|
1134
|
+
<div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #888)', marginTop: 8 }}>
|
|
1063
1135
|
{cost.profileViews} profile view, then one LinkedIn search per page of their list (up to {cost.searches}, about {cost.minutes} min).
|
|
1064
1136
|
It starts only once you confirm it on the Scan page.
|
|
1065
1137
|
</div>
|
|
@@ -1077,13 +1149,13 @@ function EmptyCircle({ person, depth, reach, requests, scanning, canScan, onSele
|
|
|
1077
1149
|
return (
|
|
1078
1150
|
<div role="status" style={{
|
|
1079
1151
|
position: 'absolute', left: '50%', top, transform: 'translateX(-50%)', width: 'min(360px, calc(100% - 32px))',
|
|
1080
|
-
background: 'color-mix(in srgb, var(--sd-bg) 94%, transparent)', border: `1px solid ${state === 'hidden' ? 'rgba(255,255,255,0.12)' : 'rgba(0,255,136,0.25)'}`,
|
|
1152
|
+
background: 'color-mix(in srgb, var(--sd-bg) 94%, transparent)', border: `1px solid ${state === 'hidden' ? 'rgba(var(--sd-ink, 255, 255, 255), 0.12)' : 'rgba(0,255,136,0.25)'}`,
|
|
1081
1153
|
borderRadius: 12, padding: '14px 16px', textAlign: 'center',
|
|
1082
1154
|
}}>
|
|
1083
|
-
<div style={{ fontSize: 13, fontWeight: 800, color: state === 'hidden' ? '#aaa' : '#fff', marginBottom: 6 }}>
|
|
1155
|
+
<div style={{ fontSize: 13, fontWeight: 800, color: state === 'hidden' ? 'var(--sd-fg-3, #aaa)' : 'var(--sd-fg-1, #fff)', marginBottom: 6 }}>
|
|
1084
1156
|
{state === 'hidden' && <span aria-hidden="true">🔒 </span>}{title}
|
|
1085
1157
|
</div>
|
|
1086
|
-
<div style={{ fontSize: 11.5, color: '#9aa', lineHeight: 1.55, marginBottom: action ? 12 : 0 }}>{body}</div>
|
|
1158
|
+
<div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #9aa)', lineHeight: 1.55, marginBottom: action ? 12 : 0 }}>{body}</div>
|
|
1087
1159
|
{action}
|
|
1088
1160
|
</div>
|
|
1089
1161
|
);
|
|
@@ -1091,7 +1163,7 @@ function EmptyCircle({ person, depth, reach, requests, scanning, canScan, onSele
|
|
|
1091
1163
|
|
|
1092
1164
|
const crumb = { background: 'none', border: 'none', color: '#8fb8d6', fontSize: 11, fontWeight: 600, cursor: 'pointer', padding: 0 };
|
|
1093
1165
|
const note = {
|
|
1094
|
-
fontSize: 11, padding: '6px 10px', borderRadius: 8, border: '1px solid', background: 'rgba(0,0,0,0.6)', pointerEvents: 'auto',
|
|
1166
|
+
fontSize: 11, padding: '6px 10px', borderRadius: 8, border: '1px solid', background: 'rgba(var(--sd-shade, 0, 0, 0), 0.6)', pointerEvents: 'auto',
|
|
1095
1167
|
};
|
|
1096
1168
|
const primary = {
|
|
1097
1169
|
display: 'inline-block', padding: '9px 16px', borderRadius: 8, textDecoration: 'none', fontSize: 12.5, fontWeight: 800,
|
|
@@ -1099,5 +1171,5 @@ const primary = {
|
|
|
1099
1171
|
};
|
|
1100
1172
|
const secondary = {
|
|
1101
1173
|
padding: '8px 14px', borderRadius: 8, cursor: 'pointer', fontSize: 12, fontWeight: 700,
|
|
1102
|
-
border: '1px solid rgba(255,255,255,0.18)', background: 'rgba(255,255,255,0.06)', color: '#ddd',
|
|
1174
|
+
border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.18)', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', color: 'var(--sd-fg-1, #ddd)',
|
|
1103
1175
|
};
|