six-degrees 0.2.0 → 0.3.0-beta.1
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 +10 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +39 -11
- package/.next/standalone/.next/required-server-files.json +4 -1
- package/.next/standalone/.next/routes-manifest.json +60 -0
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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.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 +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +9 -9
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin-delete/route.js +3 -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 +3 -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 +3 -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 +3 -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/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +9 -0
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/company-scores/legacy/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -2
- 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 +3 -2
- package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/export/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/export/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/export/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/export/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/export/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/export/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/import/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/import/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/import/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/import/route.js +8 -0
- package/.next/standalone/.next/server/app/api/data/import/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/import/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/restart/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/restart/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/restart/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/restart/route.js +8 -0
- package/.next/standalone/.next/server/app/api/data/restart/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/restart/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/reveal/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/data/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/data/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/data/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/data/route.js +7 -0
- package/.next/standalone/.next/server/app/api/data/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/data/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/delete-cluster/route.js +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -2
- package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/settings/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/settings/route.js +9 -0
- package/.next/standalone/.next/server/app/api/settings/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +8 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/settings/sector-preview/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/build-manifest.json +12 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +8 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/setup-profile/route.js +3 -2
- package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/unlock/route.js +3 -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 +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 +3 -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 +3 -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 +2 -1
- package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/favicon.ico/route.js +2 -1
- package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +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 +13 -13
- package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +13 -13
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +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 +13 -13
- package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +11 -11
- 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.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 +13 -13
- package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +11 -11
- 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 +13 -13
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +11 -11
- 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 +13 -13
- package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/settings/page/build-manifest.json +20 -0
- package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/settings/page.js +13 -0
- package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/settings.html +1 -0
- package/.next/standalone/.next/server/app/settings.meta +26 -0
- package/.next/standalone/.next/server/app/settings.rsc +24 -0
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +24 -0
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +28 -0
- 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 +13 -13
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +11 -11
- package/.next/standalone/.next/server/app-paths-manifest.json +10 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i5hdu4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljcioj._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uag-k5._.js +8 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0um1uey._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +8 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1t3rugi._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +3 -0
- package/.next/standalone/.next/server/chunks/_072jl0y._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1_fynia._.js +21 -3
- package/.next/standalone/.next/server/chunks/_1fn30_l._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1itd1o_._.js +2 -1
- package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1mxn_lb._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_company-scores_legacy_route_actions_1ncspu_.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_export_route_actions_1lkimty.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_import_route_actions_1eji0kd.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restart_route_actions_00_-u6o.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_reveal_route_actions_0-moqtn.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_route_actions_0j0w5ep.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-preview_route_actions_0w79454.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_settings_sector-suggestions_route_actions_1eoqugp.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +155 -0
- package/.next/standalone/.next/server/chunks/{lib_rpc_0mc73lk.js → lib_rpc_00tx2sm.js} +1 -1
- package/.next/standalone/.next/server/chunks/lib_rpc_02-qa4d.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_02ndsg2.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_08q5vp6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0_8i3ft.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +5 -2
- package/.next/standalone/.next/server/chunks/lib_rpc_0huvw-3.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0ip2vdh.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0jzisgh.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0yi9xvd.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1jyhd0o.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1kn59-i.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1q2jkza.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1vpm1sk.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1x6p_31.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_1zc5q0a._.js +158 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mocm6d._.js → [root-of-the-server]__0an6blh._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h1_f_2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1m0255u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bipr5s._.js → [root-of-the-server]__1z1j3ek._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_07u8byv._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_08r_mlf._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0ggabjc._.js → _0942v8n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_1djpk8t._.js → _0hl_t7r._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0tb83dw._.js +132 -0
- package/.next/standalone/.next/server/chunks/ssr/_1-87bs1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_17gui6a._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_settings_page_actions_11x4dq5.js +3 -0
- 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 +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +4 -4
- 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 +5 -5
- package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/lib_0i8v-s3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1f8t_rp._.js +23 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1nkgb45._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_01xbj_9._.js → node_modules_1wax83z._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_00nap8h._.js → node_modules_next_dist_1bunoni._.js} +2 -2
- package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +2 -2
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +15 -7
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +4 -0
- 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/prefetch-hints.json +14 -0
- 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/06x3jiiz96m5t.js +1 -0
- package/.next/{static/chunks/34at5d2ifl62i.js → standalone/.next/static/chunks/0ngx9s6-zgshe.js} +5 -5
- package/.next/standalone/.next/static/chunks/0q-_khndfxubv.js +2 -0
- package/.next/standalone/.next/static/chunks/1c79veqedvubt.js +1 -0
- package/.next/standalone/.next/static/chunks/1chp3nx45meg5.js +44 -0
- package/.next/standalone/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
- package/.next/standalone/.next/static/chunks/1uadqylrod5_v.js +1 -0
- package/.next/standalone/.next/static/chunks/23u0zclgwpc4d.js +1 -0
- package/.next/standalone/.next/static/chunks/289ktj97di6zg.js +1 -0
- package/.next/standalone/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
- package/.next/standalone/.next/static/chunks/2jz311xl1pp_8.js +1 -0
- package/.next/standalone/.next/static/chunks/2ot61qsv6_0eq.js +1 -0
- package/.next/standalone/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
- package/.next/standalone/.next/static/frfHFnRYTA0Wjrw8oZJtY/_clientMiddlewareManifest.js +14 -0
- package/.next/standalone/AGENTS.md +10 -0
- package/.next/standalone/CHANGELOG.md +325 -0
- package/.next/standalone/CONTRIBUTING.md +14 -2
- package/.next/standalone/README.md +181 -53
- package/.next/standalone/SECURITY.md +120 -10
- package/.next/standalone/app/api/company-scores/legacy/route.js +32 -0
- package/.next/standalone/app/api/company-scores/route.js +20 -11
- package/.next/standalone/app/api/data/export/route.js +49 -0
- package/.next/standalone/app/api/data/import/route.js +83 -0
- package/.next/standalone/app/api/data/restart/route.js +37 -0
- package/.next/standalone/app/api/data/reveal/route.js +14 -0
- package/.next/standalone/app/api/data/route.js +39 -0
- package/.next/standalone/app/api/ingest/route.js +15 -47
- package/.next/standalone/app/api/scraper/route.js +268 -128
- package/.next/standalone/app/api/settings/route.js +58 -0
- package/.next/standalone/app/api/settings/sector-preview/route.js +38 -0
- package/.next/standalone/app/api/settings/sector-suggestions/route.js +20 -0
- package/.next/standalone/app/api/update/route.js +197 -24
- package/.next/standalone/app/avatars/[file]/route.js +4 -2
- package/.next/standalone/app/components/CompanyScores.js +28 -7
- package/.next/standalone/app/components/EmptyState.js +8 -0
- package/.next/standalone/app/components/ForceGraph.js +40 -36
- package/.next/standalone/app/components/LegacyScoresCard.js +129 -0
- package/.next/standalone/app/components/Sidebar.js +19 -18
- package/.next/standalone/app/components/UpdatePanel.js +317 -99
- package/.next/standalone/app/components/UserProvider.js +4 -3
- package/.next/standalone/app/components/settings/DataSection.js +437 -0
- package/.next/standalone/app/components/settings/SectorSection.js +445 -0
- package/.next/standalone/app/components/ui.js +62 -0
- package/.next/standalone/app/import/page.js +3 -3
- package/.next/standalone/app/launch/page.js +30 -20
- package/.next/standalone/app/layout.js +2 -2
- package/.next/standalone/app/page.js +15 -2
- package/.next/standalone/app/paths/page.js +13 -5
- package/.next/standalone/app/profile/page.js +41 -186
- package/.next/standalone/app/queue/page.js +8 -2
- package/.next/standalone/app/settings/page.js +96 -0
- package/.next/standalone/app/setup/page.js +35 -19
- package/.next/standalone/bin/args.mjs +44 -0
- package/.next/standalone/bin/six-degrees.mjs +16 -17
- package/.next/standalone/install.sh +1 -1
- package/.next/standalone/lib/companies.js +44 -119
- package/.next/standalone/lib/csv.js +61 -27
- package/.next/standalone/lib/data-export.js +170 -0
- package/.next/standalone/lib/data-folder.js +238 -0
- package/.next/standalone/lib/data-import.js +878 -0
- package/.next/standalone/lib/db-client.js +48 -3
- package/.next/standalone/lib/durable.js +73 -0
- package/.next/standalone/lib/gate.js +90 -1
- package/.next/standalone/lib/ingest.js +40 -0
- package/.next/standalone/lib/legacy-offer.js +185 -0
- package/.next/standalone/lib/legacy-scores.js +77 -0
- package/.next/standalone/lib/linkedin-limits.js +124 -1
- package/.next/standalone/lib/release.js +5 -2
- package/.next/standalone/lib/rpc.js +121 -13
- package/.next/standalone/lib/sample-stats.js +16 -0
- package/.next/standalone/lib/scan-progress.js +13 -0
- package/.next/standalone/lib/scan-state.js +53 -0
- package/.next/standalone/lib/scanner-python.js +685 -0
- package/.next/standalone/lib/scanner-setup.js +104 -0
- package/.next/standalone/lib/scoring.js +747 -138
- package/.next/standalone/lib/scraper-client.js +10 -6
- package/.next/standalone/lib/sector-directory.js +1532 -0
- package/.next/standalone/lib/sector-focus.js +163 -0
- package/.next/standalone/lib/sector-labels.js +81 -0
- package/.next/standalone/lib/settings-effects.js +59 -0
- package/.next/standalone/lib/settings.js +83 -0
- package/.next/standalone/lib/updater-job.js +838 -0
- package/.next/standalone/lib/updater.js +494 -0
- package/.next/standalone/middleware.js +25 -28
- package/.next/standalone/next.config.mjs +19 -3
- package/.next/standalone/package-lock.json +103 -9
- package/.next/standalone/package.json +12 -11
- package/.next/standalone/public/demo-data.json +1 -1
- package/.next/standalone/scripts/apply-update.sh +482 -0
- package/.next/standalone/scripts/build-app.mjs +251 -9
- package/.next/standalone/scripts/gen-synthetic.mjs +16 -1
- package/.next/standalone/scripts/readme_buttons.py +89 -0
- package/.next/standalone/scripts/requirements.txt +106 -4
- package/.next/standalone/scripts/screenshots.py +2 -0
- package/.next/standalone/scripts/test-release-server.mjs +143 -0
- package/.next/standalone/server.js +1 -1
- package/.next/static/chunks/06x3jiiz96m5t.js +1 -0
- package/.next/{standalone/.next/static/chunks/34at5d2ifl62i.js → static/chunks/0ngx9s6-zgshe.js} +5 -5
- package/.next/static/chunks/0q-_khndfxubv.js +2 -0
- package/.next/static/chunks/1c79veqedvubt.js +1 -0
- package/.next/static/chunks/1chp3nx45meg5.js +44 -0
- package/.next/static/chunks/1irqj0lf-fu3d.js +1 -0
- package/.next/static/chunks/1uadqylrod5_v.js +1 -0
- package/.next/static/chunks/23u0zclgwpc4d.js +1 -0
- package/.next/static/chunks/289ktj97di6zg.js +1 -0
- package/.next/static/chunks/2b3lmf8e6uj8m.js +16 -0
- package/.next/static/chunks/2jz311xl1pp_8.js +1 -0
- package/.next/static/chunks/2ot61qsv6_0eq.js +1 -0
- package/.next/static/chunks/3npq5yd7c4dmn.js +2 -0
- package/.next/static/frfHFnRYTA0Wjrw8oZJtY/_clientMiddlewareManifest.js +14 -0
- package/CHANGELOG.md +325 -0
- package/README.md +181 -53
- package/SECURITY.md +120 -10
- package/bin/args.mjs +44 -0
- package/bin/six-degrees.mjs +16 -17
- package/lib/companies.js +44 -119
- package/lib/csv.js +61 -27
- package/lib/data-export.js +170 -0
- package/lib/data-folder.js +238 -0
- package/lib/data-import.js +878 -0
- package/lib/db-client.js +48 -3
- package/lib/durable.js +73 -0
- package/lib/gate.js +90 -1
- package/lib/ingest.js +40 -0
- package/lib/legacy-offer.js +185 -0
- package/lib/legacy-scores.js +77 -0
- package/lib/linkedin-limits.js +124 -1
- package/lib/release.js +5 -2
- package/lib/rpc.js +121 -13
- package/lib/sample-stats.js +16 -0
- package/lib/scan-progress.js +13 -0
- package/lib/scan-state.js +53 -0
- package/lib/scanner-python.js +685 -0
- package/lib/scanner-setup.js +104 -0
- package/lib/scoring.js +747 -138
- package/lib/scraper-client.js +10 -6
- package/lib/sector-directory.js +1532 -0
- package/lib/sector-focus.js +163 -0
- package/lib/sector-labels.js +81 -0
- package/lib/settings-effects.js +59 -0
- package/lib/settings.js +83 -0
- package/lib/updater-job.js +838 -0
- package/lib/updater.js +494 -0
- package/package.json +12 -11
- package/public/demo-data.json +1 -1
- package/scripts/requirements.txt +106 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jrmmj-._.js +0 -150
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qx548g._.js +0 -151
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an3leo._.js +0 -150
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1m8zedk._.js +0 -155
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1zor0ys._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0_rp-01._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0hzdk79._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0ow7u5r._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0t0zc2d._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0wa631d._.js +0 -3
- package/.next/standalone/.next/server/chunks/_13ccnao._.js +0 -3
- package/.next/standalone/.next/server/chunks/_13es063._.js +0 -3
- package/.next/standalone/.next/server/chunks/_142872j._.js +0 -3
- package/.next/standalone/.next/server/chunks/_18wsb_a._.js +0 -8
- package/.next/standalone/.next/server/chunks/_1e-4h5h._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1gvvd7n._.js +0 -158
- package/.next/standalone/.next/server/chunks/_1moda66._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1p6ghzv._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1xmmi_v._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1z-yrlf._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0bf3x4q._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +0 -4
- package/.next/standalone/.next/static/N9wokeIiC9rUIGmzBhj6T/_clientMiddlewareManifest.js +0 -6
- package/.next/standalone/.next/static/chunks/1odow92u6wxz0.js +0 -1
- package/.next/standalone/.next/static/chunks/1wb_is4wsdm-u.js +0 -1
- package/.next/standalone/.next/static/chunks/1zmpcmngg5c7-.js +0 -2
- package/.next/standalone/.next/static/chunks/220-ne82aus0c.js +0 -44
- package/.next/standalone/.next/static/chunks/2rrf5kzx2fhin.js +0 -2
- package/.next/standalone/.next/static/chunks/2s_k9x4d0gi9h.js +0 -16
- package/.next/standalone/.next/static/chunks/3hsi90cejq2dg.js +0 -1
- package/.next/standalone/.next/static/chunks/3pfyuezyqd9ob.js +0 -1
- package/.next/standalone/.next/static/chunks/3ts-_4i6bfkh2.js +0 -1
- package/.next/standalone/scripts/score-connections.sql +0 -80
- package/.next/standalone/scripts/score_new_connections.sql +0 -77
- package/.next/static/N9wokeIiC9rUIGmzBhj6T/_clientMiddlewareManifest.js +0 -6
- package/.next/static/chunks/1odow92u6wxz0.js +0 -1
- package/.next/static/chunks/1wb_is4wsdm-u.js +0 -1
- package/.next/static/chunks/1zmpcmngg5c7-.js +0 -2
- package/.next/static/chunks/220-ne82aus0c.js +0 -44
- package/.next/static/chunks/2rrf5kzx2fhin.js +0 -2
- package/.next/static/chunks/2s_k9x4d0gi9h.js +0 -16
- package/.next/static/chunks/3hsi90cejq2dg.js +0 -1
- package/.next/static/chunks/3pfyuezyqd9ob.js +0 -1
- package/.next/static/chunks/3ts-_4i6bfkh2.js +0 -1
- package/scripts/score_new_connections.sql +0 -77
- /package/.next/standalone/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_ssgManifest.js +0 -0
- /package/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_buildManifest.js +0 -0
- /package/.next/static/{N9wokeIiC9rUIGmzBhj6T → frfHFnRYTA0Wjrw8oZJtY}/_ssgManifest.js +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState, useRef, useCallback } from 'react';
|
|
4
4
|
import Link from 'next/link';
|
|
5
|
+
import { SAMPLE_STATS } from '../../lib/sample-stats';
|
|
5
6
|
|
|
6
7
|
// ── Intersection Observer hook for scroll-triggered animations ──
|
|
7
8
|
function useInView(options = {}) {
|
|
@@ -177,13 +178,15 @@ function HeroSection() {
|
|
|
177
178
|
// ═══════════════════════════════════════════════════════════════
|
|
178
179
|
// STATS BAR — Animated counters
|
|
179
180
|
// ═══════════════════════════════════════════════════════════════
|
|
181
|
+
// The numbers on this page are the invented sample network's
|
|
182
|
+
// (lib/sample-stats.js), never one person's real network.
|
|
180
183
|
function StatsBar() {
|
|
181
184
|
const [ref, inView] = useInView();
|
|
182
185
|
const stats = [
|
|
183
|
-
{ label: 'Connections Mapped', value:
|
|
184
|
-
{ label: 'Bridges Discovered', value:
|
|
185
|
-
{ label: '
|
|
186
|
-
{ label: '
|
|
186
|
+
{ label: 'Connections Mapped', value: SAMPLE_STATS.connections, color: '#3498DB' },
|
|
187
|
+
{ label: 'Bridges Discovered', value: SAMPLE_STATS.bridges, color: '#FFD700' },
|
|
188
|
+
{ label: 'People Scored', value: SAMPLE_STATS.people, color: '#9B59B6' },
|
|
189
|
+
{ label: 'Companies', value: SAMPLE_STATS.companies, color: '#00ff88' },
|
|
187
190
|
];
|
|
188
191
|
return (
|
|
189
192
|
<section ref={ref} style={{ padding: '80px 24px', borderTop: '1px solid rgba(255,255,255,0.05)', borderBottom: '1px solid rgba(255,255,255,0.05)' }}>
|
|
@@ -196,12 +199,14 @@ function StatsBar() {
|
|
|
196
199
|
}}>
|
|
197
200
|
<div style={{ fontSize: 48, fontWeight: 800, color: s.color, lineHeight: 1 }}>
|
|
198
201
|
<Counter end={s.value} active={inView} />
|
|
199
|
-
{s.value > 100 ? '+' : ''}
|
|
200
202
|
</div>
|
|
201
203
|
<div style={{ fontSize: 13, color: '#666', marginTop: 8, fontWeight: 500, letterSpacing: 0.5 }}>{s.label}</div>
|
|
202
204
|
</div>
|
|
203
205
|
))}
|
|
204
206
|
</div>
|
|
207
|
+
<p style={{ textAlign: 'center', fontSize: 12, color: '#555', margin: '32px auto 0', maxWidth: 520 }}>
|
|
208
|
+
Counted from the sample network that comes with the app. Every person in it is invented.
|
|
209
|
+
</p>
|
|
205
210
|
</section>
|
|
206
211
|
);
|
|
207
212
|
}
|
|
@@ -315,9 +320,10 @@ function GalaxySection() {
|
|
|
315
320
|
function ChainSection() {
|
|
316
321
|
const [ref, inView] = useInView();
|
|
317
322
|
const degrees = [
|
|
318
|
-
|
|
319
|
-
{ d:
|
|
320
|
-
{ d:
|
|
323
|
+
// The sample's counts; it maps two degrees.
|
|
324
|
+
{ d: 1, label: 'Your Connections', desc: 'Direct network — scored & tiered', color: '#3498DB', count: SAMPLE_STATS.degree1 },
|
|
325
|
+
{ d: 2, label: 'Bridge Connections', desc: 'Friends of your bridges', color: '#9B59B6', count: SAMPLE_STATS.degree2 },
|
|
326
|
+
{ d: 3, label: 'Extended Reach', desc: 'Bridged from promoted D2s', color: '#FFD700', count: null },
|
|
321
327
|
{ d: 4, label: 'Industry Layer', desc: 'Company & sector intelligence', color: '#FF6B35', count: null },
|
|
322
328
|
{ d: 5, label: 'Market Layer', desc: 'Cross-industry connections', color: '#00ff88', count: null },
|
|
323
329
|
{ d: 6, label: 'Global Reach', desc: 'Anyone in the world', color: '#ff5050', count: null },
|
|
@@ -396,6 +402,9 @@ function ChainSection() {
|
|
|
396
402
|
</div>
|
|
397
403
|
))}
|
|
398
404
|
</div>
|
|
405
|
+
<p style={{ textAlign: 'center', fontSize: 12, color: '#555', marginTop: 40 }}>
|
|
406
|
+
The counts are the sample network’s, whose people are all invented.
|
|
407
|
+
</p>
|
|
399
408
|
</div>
|
|
400
409
|
</section>
|
|
401
410
|
);
|
|
@@ -407,7 +416,7 @@ function ChainSection() {
|
|
|
407
416
|
function ScoringSection() {
|
|
408
417
|
const [ref, inView] = useInView();
|
|
409
418
|
const tiers = [
|
|
410
|
-
{ tier: 'S', label: 'Supreme', score: '7.
|
|
419
|
+
{ tier: 'S', label: 'Supreme', score: '7.5+', color: TIER.S, glow: 'rgba(255,215,0,0.3)', people: 'C-Suite, VPs, Founders', icon: '👑' },
|
|
411
420
|
{ tier: 'A', label: 'Ace', score: '5.5+', color: TIER.A, glow: 'rgba(155,89,182,0.3)', people: 'Directors, Senior Leaders', icon: '💎' },
|
|
412
421
|
{ tier: 'B', label: 'Builder', score: '4.0+', color: TIER.B, glow: 'rgba(52,152,219,0.3)', people: 'Managers, Senior ICs', icon: '🔷' },
|
|
413
422
|
{ tier: 'C', label: 'Connector', score: '2.5+', color: TIER.C, glow: 'rgba(149,165,166,0.2)', people: 'Associates, Specialists', icon: '🔸' },
|
|
@@ -479,10 +488,10 @@ function FeaturesGrid() {
|
|
|
479
488
|
{
|
|
480
489
|
title: 'Paths',
|
|
481
490
|
subtitle: 'Company Intelligence',
|
|
482
|
-
desc: 'Scan any company on LinkedIn and see every person mapped, scored, and organized by seniority.
|
|
491
|
+
desc: 'Scan any company on LinkedIn and see every person mapped, scored, and organized by seniority.',
|
|
483
492
|
color: '#00ff88',
|
|
484
493
|
icon: '🏢',
|
|
485
|
-
stat:
|
|
494
|
+
stat: `${SAMPLE_STATS.companies} companies in the sample`,
|
|
486
495
|
},
|
|
487
496
|
{
|
|
488
497
|
title: 'Outlink',
|
|
@@ -490,7 +499,7 @@ function FeaturesGrid() {
|
|
|
490
499
|
desc: 'Your curated list of high-value D2 connections to request. Grouped by bridge, filtered by tier, with batch-open for efficient networking.',
|
|
491
500
|
color: '#FF6B35',
|
|
492
501
|
icon: '🚀',
|
|
493
|
-
stat:
|
|
502
|
+
stat: `${SAMPLE_STATS.recommendations} recommendations in the sample`,
|
|
494
503
|
},
|
|
495
504
|
{
|
|
496
505
|
title: 'XP System',
|
|
@@ -506,7 +515,7 @@ function FeaturesGrid() {
|
|
|
506
515
|
desc: 'Select any D1 connection as a bridge. Automatically discover and score all their connections — your D2 layer.',
|
|
507
516
|
color: '#9B59B6',
|
|
508
517
|
icon: '🔗',
|
|
509
|
-
stat:
|
|
518
|
+
stat: `${SAMPLE_STATS.bridges} bridges in the sample`,
|
|
510
519
|
},
|
|
511
520
|
];
|
|
512
521
|
|
|
@@ -599,13 +608,14 @@ function TechSection() {
|
|
|
599
608
|
background: GRADIENT, WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent',
|
|
600
609
|
marginBottom: 32,
|
|
601
610
|
}}>
|
|
602
|
-
P =
|
|
611
|
+
P = T × (0.45 + 0.055 × C) + R + B
|
|
603
612
|
</div>
|
|
604
613
|
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: 24 }}>
|
|
605
614
|
{[
|
|
606
|
-
|
|
607
|
-
{ sym: '
|
|
608
|
-
{ sym: '
|
|
615
|
+
// The model in lib/scoring.js: a product, so a title counts for more at a bigger company.
|
|
616
|
+
{ sym: 'T', label: 'Title', desc: 'C-suite 10, VP 9, Director 7.5, Manager 6.5', note: 'Multiplied by the company', color: TIER.S },
|
|
617
|
+
{ sym: 'C', label: 'Company', desc: 'Well-known 7–10, else estimated from your network', note: 'Weight 0.5 to 1.0', color: TIER.A },
|
|
618
|
+
{ sym: 'R + B', label: 'Reach & bridge', desc: 'Investor, YC, an audience in the millions; a strong circle', note: 'Up to +1.5 and +1', color: TIER.B },
|
|
609
619
|
].map((item, i) => (
|
|
610
620
|
<div key={i} style={{
|
|
611
621
|
padding: 16, borderRadius: 12, background: `${item.color}08`,
|
|
@@ -615,7 +625,7 @@ function TechSection() {
|
|
|
615
625
|
<div style={{ fontSize: 28, fontWeight: 900, color: item.color }}>{item.sym}</div>
|
|
616
626
|
<div style={{ fontSize: 13, fontWeight: 700, color: '#fff', marginTop: 4 }}>{item.label}</div>
|
|
617
627
|
<div style={{ fontSize: 10, color: '#555', marginTop: 4 }}>{item.desc}</div>
|
|
618
|
-
<div style={{ fontSize: 10, color: item.color, fontWeight: 700, marginTop: 8 }}>
|
|
628
|
+
<div style={{ fontSize: 10, color: item.color, fontWeight: 700, marginTop: 8 }}>{item.note}</div>
|
|
619
629
|
</div>
|
|
620
630
|
))}
|
|
621
631
|
</div>
|
|
@@ -627,7 +637,7 @@ function TechSection() {
|
|
|
627
637
|
opacity: inView ? 1 : 0, transition: 'opacity 1s ease 0.6s',
|
|
628
638
|
}}>
|
|
629
639
|
{[
|
|
630
|
-
{ t: 'S', min: 7, color: TIER.S },
|
|
640
|
+
{ t: 'S', min: 7.5, color: TIER.S },
|
|
631
641
|
{ t: 'A', min: 5.5, color: TIER.A },
|
|
632
642
|
{ t: 'B', min: 4, color: TIER.B },
|
|
633
643
|
{ t: 'C', min: 2.5, color: TIER.C },
|
|
@@ -751,7 +761,7 @@ function CTASection() {
|
|
|
751
761
|
opacity: inView ? 0.4 : 0, transition: 'opacity 1.5s ease 0.5s',
|
|
752
762
|
}}>
|
|
753
763
|
<span style={{ fontSize: 12, color: '#444' }}>Built by Blake Burford</span>
|
|
754
|
-
<span style={{ fontSize: 12, color: '#444' }}>
|
|
764
|
+
<span style={{ fontSize: 12, color: '#444' }}>Open source · MIT</span>
|
|
755
765
|
<span style={{ fontSize: 12, color: '#444' }}>2026</span>
|
|
756
766
|
</div>
|
|
757
767
|
</div>
|
|
@@ -12,8 +12,8 @@ const geistMono = Geist_Mono({
|
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
export const metadata = {
|
|
15
|
-
title: "
|
|
16
|
-
description: "
|
|
15
|
+
title: "Six Degrees",
|
|
16
|
+
description: "Maps your LinkedIn network: who you know, who they know, and the shortest path to someone you haven't met. Runs on your own computer; nothing is uploaded.",
|
|
17
17
|
viewport: 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no',
|
|
18
18
|
};
|
|
19
19
|
|
|
@@ -240,6 +240,19 @@ function HomeInner() {
|
|
|
240
240
|
Scan
|
|
241
241
|
</Link>}
|
|
242
242
|
</div>
|
|
243
|
+
{/* Settings — also in CSV/sample mode and on phones, so updates stay reachable */}
|
|
244
|
+
{!IS_DEMO && <Link
|
|
245
|
+
href="/settings"
|
|
246
|
+
title="Settings"
|
|
247
|
+
aria-label="Settings"
|
|
248
|
+
style={{
|
|
249
|
+
width: isMobile ? 28 : 32, height: isMobile ? 28 : 32, borderRadius: '50%', flexShrink: 0,
|
|
250
|
+
background: 'rgba(255,255,255,0.06)', color: '#888', fontSize: isMobile ? 14 : 16, textDecoration: 'none',
|
|
251
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center', marginLeft: isMobile ? 4 : 8,
|
|
252
|
+
}}
|
|
253
|
+
>
|
|
254
|
+
{'\u2699\uFE0E'}
|
|
255
|
+
</Link>}
|
|
243
256
|
{/* Notification bell */}
|
|
244
257
|
{!IS_DEMO && !csvMode && <div style={{ position: 'relative', marginLeft: isMobile ? 4 : 8 }}>
|
|
245
258
|
<button
|
|
@@ -309,7 +322,7 @@ function HomeInner() {
|
|
|
309
322
|
const status = await scraperStatus();
|
|
310
323
|
const blocked = notReadyMessage(status);
|
|
311
324
|
if (blocked) { alert(blocked); return; }
|
|
312
|
-
if (status.running) { alert('The
|
|
325
|
+
if (status.running) { alert('The scanner is already busy.'); return; }
|
|
313
326
|
await startScrape('refresh');
|
|
314
327
|
alert('Checking for new connections — watch it on the Scan page.');
|
|
315
328
|
} catch (e) {
|
|
@@ -393,7 +406,7 @@ function HomeInner() {
|
|
|
393
406
|
LinkedIn’s CSV export only covers your own 1st-degree list, so there are no circles to open here.
|
|
394
407
|
</p>
|
|
395
408
|
<p style={{ color: '#666', fontSize: 13, lineHeight: 1.7, margin: 0 }}>
|
|
396
|
-
The local
|
|
409
|
+
The local scanner maps those circles (and captures real photos).{' '}
|
|
397
410
|
<Link href="/setup" style={{ color: '#3498DB', textDecoration: 'none' }}>Set up scanning →</Link>
|
|
398
411
|
</p>
|
|
399
412
|
</div>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Suspense, useEffect, useState } from 'react';
|
|
4
|
+
import { useSearchParams } from 'next/navigation';
|
|
4
5
|
import { runScrape, scraperStatus, notReadyMessage } from '../../lib/scraper-client';
|
|
5
6
|
import { loadNetwork } from '../../lib/network';
|
|
6
7
|
import { IS_DEMO } from '../../lib/demo';
|
|
@@ -13,9 +14,12 @@ import Link from 'next/link';
|
|
|
13
14
|
import { companyOf, getSeniority } from '../../lib/companies';
|
|
14
15
|
|
|
15
16
|
const TIER_COLORS = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
|
|
17
|
+
const TABS = [['map', 'Map'], ['industries', 'Industries'], ['companies', 'Companies'], ['scores', 'Scores']];
|
|
16
18
|
|
|
17
19
|
export default function PathsPage() {
|
|
18
|
-
|
|
20
|
+
// Suspense because PathsInner reads the address's ?tab= (useSearchParams),
|
|
21
|
+
// which Next requires to sit inside one for the page to build.
|
|
22
|
+
return <OnboardingGate><Suspense><PathsInner /></Suspense></OnboardingGate>;
|
|
19
23
|
}
|
|
20
24
|
|
|
21
25
|
function PathsInner() {
|
|
@@ -28,7 +32,11 @@ function PathsInner() {
|
|
|
28
32
|
const [d2Data, setD2Data] = useState([]);
|
|
29
33
|
const [d3Data, setD3Data] = useState([]);
|
|
30
34
|
// Map and Industries are the analyzer; Companies is the list it grew from.
|
|
31
|
-
|
|
35
|
+
// A link can open a tab (/paths?tab=scores, from Settings → Your sector).
|
|
36
|
+
// The router's search params rather than window.location: on a click from
|
|
37
|
+
// another page the address bar only changes after this page has rendered.
|
|
38
|
+
const asked = useSearchParams().get('tab');
|
|
39
|
+
const [tab, setTab] = useState(() => (TABS.some(([k]) => k === asked) ? asked : 'map'));
|
|
32
40
|
// Bumped when company scores change, so the network reloads with new tiers.
|
|
33
41
|
const [reloadKey, setReloadKey] = useState(0);
|
|
34
42
|
|
|
@@ -120,7 +128,7 @@ function PathsInner() {
|
|
|
120
128
|
try { localStorage.setItem('six-degrees-company-scan-ok', '1'); } catch {}
|
|
121
129
|
}
|
|
122
130
|
setScanning(true);
|
|
123
|
-
setScanLog(['Checking the
|
|
131
|
+
setScanLog(['Checking the scanner...']);
|
|
124
132
|
|
|
125
133
|
const blocked = notReadyMessage(await scraperStatus().catch(() => null));
|
|
126
134
|
if (blocked) {
|
|
@@ -229,7 +237,7 @@ function PathsInner() {
|
|
|
229
237
|
}}>Paths</h1>
|
|
230
238
|
{!selectedCompany && (
|
|
231
239
|
<div style={{ display: 'flex', gap: 4, marginLeft: 8, padding: 3, borderRadius: 8, background: 'rgba(255,255,255,0.05)' }}>
|
|
232
|
-
{
|
|
240
|
+
{TABS.map(([k, label]) => (
|
|
233
241
|
<button key={k} onClick={() => setTab(k)} style={{
|
|
234
242
|
padding: '5px 12px', borderRadius: 6, border: 'none', cursor: 'pointer', fontSize: 12.5, fontWeight: 700,
|
|
235
243
|
background: tab === k ? 'linear-gradient(135deg, #00ff88, #3498DB)' : 'transparent', color: tab === k ? '#000' : '#aab',
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
|
-
import { runScrape, scraperStatus, notReadyMessage } from '../../lib/scraper-client';
|
|
5
4
|
import { loadNetwork } from '../../lib/network';
|
|
6
5
|
import MappingProgress from '../components/MappingProgress';
|
|
7
6
|
import { IS_DEMO } from '../../lib/demo';
|
|
8
7
|
import OnboardingGate from '../components/OnboardingGate';
|
|
9
8
|
import { useUser } from '../components/UserProvider';
|
|
9
|
+
import { sectorByKey } from '../../lib/sector-labels';
|
|
10
10
|
import Link from 'next/link';
|
|
11
11
|
|
|
12
12
|
const LEVEL_NAMES = {
|
|
@@ -33,15 +33,20 @@ function ProfileInner() {
|
|
|
33
33
|
const [notifications, setNotifications] = useState([]);
|
|
34
34
|
const [queueStats, setQueueStats] = useState({ total: 0, sent: 0, accepted: 0 });
|
|
35
35
|
const [mapping, setMapping] = useState({ degree1: [], degree2: [], skips: [] });
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
// "Your Sectors" is what you picked in Settings → Your sector. (users.sectors,
|
|
37
|
+
// which this card used to show, is never written by anything; the Sidebar
|
|
38
|
+
// and Outlink still read it as free text.) null while it loads; a load that
|
|
39
|
+
// fails says so rather than showing "none picked" (TRAPS §7).
|
|
40
|
+
const [sectorFocus, setSectorFocus] = useState(null);
|
|
40
41
|
|
|
41
42
|
useEffect(() => {
|
|
42
43
|
if (IS_DEMO) return;
|
|
43
44
|
if (!userId) return;
|
|
44
45
|
async function load() {
|
|
46
|
+
fetch('/api/settings')
|
|
47
|
+
.then((r) => r.json().then((d) => (r.ok && d.settings ? d : Promise.reject(new Error(d.error)))))
|
|
48
|
+
.then((d) => setSectorFocus(d.settings.sectorFocus || { sectors: [], strength: 'lean' }))
|
|
49
|
+
.catch(() => setSectorFocus({ failed: true }));
|
|
45
50
|
const net = await loadNetwork(userId);
|
|
46
51
|
const d1 = net.degree1;
|
|
47
52
|
const d2 = net.degree2;
|
|
@@ -207,104 +212,6 @@ function ProfileInner() {
|
|
|
207
212
|
</div>
|
|
208
213
|
</div>
|
|
209
214
|
|
|
210
|
-
{/* === SET UP ACCOUNT === */}
|
|
211
|
-
<SetupScrapeCard status={setupStatus} log={setupLog} onStart={async () => {
|
|
212
|
-
setSetupStatus('running');
|
|
213
|
-
setSetupLog(['Checking the scraper...']);
|
|
214
|
-
const blocked = notReadyMessage(await scraperStatus().catch(() => null));
|
|
215
|
-
if (blocked) {
|
|
216
|
-
setSetupStatus('offline');
|
|
217
|
-
setSetupLog([blocked]);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
const final = await runScrape('full', { onLog: setSetupLog });
|
|
222
|
-
setSetupStatus(final.exitCode === 0 ? 'done' : 'error');
|
|
223
|
-
} catch { setSetupStatus('error'); }
|
|
224
|
-
}} onRetry={() => { setSetupStatus('idle'); setSetupLog([]); }} />
|
|
225
|
-
|
|
226
|
-
{/* === AUTO-BRIDGE ALL === */}
|
|
227
|
-
<div style={{
|
|
228
|
-
background: 'rgba(155,89,182,0.06)', borderRadius: 12, padding: 20, marginBottom: 24,
|
|
229
|
-
border: '1px solid rgba(155,89,182,0.2)',
|
|
230
|
-
}}>
|
|
231
|
-
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
|
|
232
|
-
<h3 style={{ fontSize: 14, fontWeight: 700, margin: 0, color: '#9B59B6' }}>Auto-Bridge All</h3>
|
|
233
|
-
{bridgeStatus === 'done' && <span style={{ fontSize: 10, color: '#00ff88', fontWeight: 600 }}>Complete</span>}
|
|
234
|
-
</div>
|
|
235
|
-
<p style={{ fontSize: 11, color: '#888', margin: '0 0 12px' }}>
|
|
236
|
-
Scan every connection's network. S-tier first → D-tier last. 2 min cooldown between each.
|
|
237
|
-
</p>
|
|
238
|
-
|
|
239
|
-
{bridgeStatus === 'idle' && (
|
|
240
|
-
<button onClick={async () => {
|
|
241
|
-
setBridgeStatus('running');
|
|
242
|
-
setBridgeLog(['Checking the scraper...']);
|
|
243
|
-
const blocked = notReadyMessage(await scraperStatus().catch(() => null));
|
|
244
|
-
if (blocked) {
|
|
245
|
-
setBridgeStatus('offline');
|
|
246
|
-
setBridgeLog([blocked]);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
try {
|
|
250
|
-
const final = await runScrape('auto-bridge', { onLog: setBridgeLog });
|
|
251
|
-
setBridgeStatus(final.exitCode === 0 ? 'done' : 'error');
|
|
252
|
-
} catch { setBridgeStatus('error'); }
|
|
253
|
-
}} style={{
|
|
254
|
-
width: '100%', padding: '12px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
255
|
-
background: 'linear-gradient(135deg, #9B59B6, #FF6B35)',
|
|
256
|
-
color: '#fff', fontWeight: 700, fontSize: 14,
|
|
257
|
-
}}>
|
|
258
|
-
Auto-Bridge All Connections
|
|
259
|
-
</button>
|
|
260
|
-
)}
|
|
261
|
-
|
|
262
|
-
{bridgeStatus === 'offline' && (
|
|
263
|
-
<div>
|
|
264
|
-
<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' }}>
|
|
265
|
-
Scraper offline — start it first
|
|
266
|
-
</div>
|
|
267
|
-
<button onClick={() => setBridgeStatus('idle')} style={{
|
|
268
|
-
width: '100%', padding: '10px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
269
|
-
background: 'rgba(255,255,255,0.1)', color: '#aaa', fontWeight: 600, fontSize: 12,
|
|
270
|
-
}}>Retry</button>
|
|
271
|
-
</div>
|
|
272
|
-
)}
|
|
273
|
-
|
|
274
|
-
{bridgeStatus === 'running' && (
|
|
275
|
-
<div style={{
|
|
276
|
-
padding: '10px', borderRadius: 8, background: 'rgba(155,89,182,0.1)',
|
|
277
|
-
border: '1px solid rgba(155,89,182,0.3)',
|
|
278
|
-
}}>
|
|
279
|
-
<div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 4 }}>
|
|
280
|
-
<div style={{ width: 8, height: 8, borderRadius: '50%', background: '#9B59B6', animation: 'pulse 1s infinite' }} />
|
|
281
|
-
<span style={{ fontSize: 11, fontWeight: 600, color: '#9B59B6' }}>Bridging...</span>
|
|
282
|
-
</div>
|
|
283
|
-
<div style={{ fontFamily: 'monospace', fontSize: 9, color: '#777', maxHeight: 150, overflow: 'auto' }}>
|
|
284
|
-
{bridgeLog.map((l, i) => <div key={i}>{l}</div>)}
|
|
285
|
-
</div>
|
|
286
|
-
</div>
|
|
287
|
-
)}
|
|
288
|
-
|
|
289
|
-
{bridgeStatus === 'done' && (
|
|
290
|
-
<div style={{ padding: '10px', borderRadius: 8, background: 'rgba(0,255,136,0.1)', border: '1px solid rgba(0,255,136,0.3)', color: '#00ff88', fontSize: 12, fontWeight: 600, textAlign: 'center' }}>
|
|
291
|
-
All bridges mapped! Refresh the app.
|
|
292
|
-
</div>
|
|
293
|
-
)}
|
|
294
|
-
|
|
295
|
-
{bridgeStatus === 'error' && (
|
|
296
|
-
<div>
|
|
297
|
-
<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, textAlign: 'center', marginBottom: 8 }}>
|
|
298
|
-
Something went wrong
|
|
299
|
-
</div>
|
|
300
|
-
<button onClick={() => { setBridgeStatus('idle'); setBridgeLog([]); }} style={{
|
|
301
|
-
width: '100%', padding: '10px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
302
|
-
background: 'rgba(255,255,255,0.1)', color: '#aaa', fontWeight: 600, fontSize: 12,
|
|
303
|
-
}}>Try Again</button>
|
|
304
|
-
</div>
|
|
305
|
-
)}
|
|
306
|
-
</div>
|
|
307
|
-
|
|
308
215
|
{/* === 2ND-DEGREE MAPPING PROGRESS === */}
|
|
309
216
|
<MappingProgress
|
|
310
217
|
degree1={mapping.degree1}
|
|
@@ -467,15 +374,38 @@ function ProfileInner() {
|
|
|
467
374
|
background: 'rgba(255,255,255,0.04)', borderRadius: 12, padding: 20,
|
|
468
375
|
border: '1px solid rgba(255,255,255,0.08)',
|
|
469
376
|
}}>
|
|
470
|
-
<
|
|
471
|
-
|
|
472
|
-
{
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
background: 'rgba(52,152,219,0.15)', border: '1px solid rgba(52,152,219,0.3)', color: '#3498DB',
|
|
476
|
-
}}>{s}</span>
|
|
477
|
-
))}
|
|
377
|
+
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12 }}>
|
|
378
|
+
<h3 style={{ fontSize: 14, fontWeight: 700, margin: 0 }}>Your Sectors</h3>
|
|
379
|
+
<Link href="/settings#sector" style={{ fontSize: 11, color: '#3498DB', textDecoration: 'none', fontWeight: 600 }}>
|
|
380
|
+
{sectorFocus?.sectors?.length ? 'Change' : sectorFocus && !sectorFocus.failed ? 'Pick in Settings' : 'Settings'} →
|
|
381
|
+
</Link>
|
|
478
382
|
</div>
|
|
383
|
+
{!sectorFocus ? (
|
|
384
|
+
<div style={{ fontSize: 12, color: '#888' }}>Loading…</div>
|
|
385
|
+
) : sectorFocus.failed ? (
|
|
386
|
+
<div style={{ fontSize: 12, color: '#ff7676' }}>
|
|
387
|
+
Couldn’t load your sectors. Reload this page, or open Settings to see them.
|
|
388
|
+
</div>
|
|
389
|
+
) : sectorFocus.sectors?.length ? (
|
|
390
|
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' }}>
|
|
391
|
+
{sectorFocus.sectors.map((key) => {
|
|
392
|
+
const ind = sectorByKey(key);
|
|
393
|
+
return (
|
|
394
|
+
<span key={key} style={{
|
|
395
|
+
padding: '4px 12px', borderRadius: 20, fontSize: 11, fontWeight: 600,
|
|
396
|
+
background: `${ind.color}26`, border: `1px solid ${ind.color}66`, color: ind.color,
|
|
397
|
+
}}>{ind.label}</span>
|
|
398
|
+
);
|
|
399
|
+
})}
|
|
400
|
+
<span style={{ fontSize: 11, color: '#888' }}>
|
|
401
|
+
{sectorFocus.strength === 'strong' ? 'Strong' : 'Lean'}: companies here count for more in your scores.
|
|
402
|
+
</span>
|
|
403
|
+
</div>
|
|
404
|
+
) : (
|
|
405
|
+
<div style={{ fontSize: 12, color: '#888' }}>
|
|
406
|
+
None picked. Pick up to three in Settings and companies in them count for more in your scores.
|
|
407
|
+
</div>
|
|
408
|
+
)}
|
|
479
409
|
</div>
|
|
480
410
|
|
|
481
411
|
</div>
|
|
@@ -495,78 +425,3 @@ function StatCard({ label, value, color }) {
|
|
|
495
425
|
</div>
|
|
496
426
|
);
|
|
497
427
|
}
|
|
498
|
-
|
|
499
|
-
function SetupScrapeCard({ status, log, onStart, onRetry }) {
|
|
500
|
-
return (
|
|
501
|
-
<div style={{
|
|
502
|
-
background: 'rgba(52,152,219,0.06)', borderRadius: 12, padding: 20, marginBottom: 24,
|
|
503
|
-
border: '1px solid rgba(52,152,219,0.2)',
|
|
504
|
-
}}>
|
|
505
|
-
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
|
|
506
|
-
<h3 style={{ fontSize: 14, fontWeight: 700, margin: 0, color: '#3498DB' }}>Account Setup</h3>
|
|
507
|
-
{status === 'done' && <span style={{ fontSize: 10, color: '#00ff88', fontWeight: 600 }}>Complete</span>}
|
|
508
|
-
</div>
|
|
509
|
-
<p style={{ fontSize: 11, color: '#888', margin: '0 0 12px' }}>
|
|
510
|
-
Full scrape of all your LinkedIn connections with profile photos. Takes 3-5 minutes.
|
|
511
|
-
</p>
|
|
512
|
-
|
|
513
|
-
{status === 'idle' && (
|
|
514
|
-
<button onClick={onStart} style={{
|
|
515
|
-
width: '100%', padding: '12px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
516
|
-
background: 'linear-gradient(135deg, #3498DB, #9B59B6)',
|
|
517
|
-
color: '#fff', fontWeight: 700, fontSize: 14,
|
|
518
|
-
}}>
|
|
519
|
-
Set Up Account — Full Scrape
|
|
520
|
-
</button>
|
|
521
|
-
)}
|
|
522
|
-
|
|
523
|
-
{status === 'offline' && (
|
|
524
|
-
<div>
|
|
525
|
-
<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' }}>
|
|
526
|
-
Scraper server offline
|
|
527
|
-
</div>
|
|
528
|
-
<p style={{ fontSize: 10, color: '#888', textAlign: 'center', marginBottom: 8 }}>
|
|
529
|
-
Open the <strong>Scan</strong> page to finish setting the scraper up
|
|
530
|
-
</p>
|
|
531
|
-
<button onClick={onRetry} style={{
|
|
532
|
-
width: '100%', padding: '10px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
533
|
-
background: 'rgba(255,255,255,0.1)', color: '#aaa', fontWeight: 600, fontSize: 12,
|
|
534
|
-
}}>Retry</button>
|
|
535
|
-
</div>
|
|
536
|
-
)}
|
|
537
|
-
|
|
538
|
-
{status === 'running' && (
|
|
539
|
-
<div style={{
|
|
540
|
-
padding: '10px', borderRadius: 8, background: 'rgba(52,152,219,0.1)',
|
|
541
|
-
border: '1px solid rgba(52,152,219,0.3)',
|
|
542
|
-
}}>
|
|
543
|
-
<div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 4 }}>
|
|
544
|
-
<div style={{ width: 8, height: 8, borderRadius: '50%', background: '#3498DB', animation: 'pulse 1s infinite' }} />
|
|
545
|
-
<span style={{ fontSize: 11, fontWeight: 600, color: '#3498DB' }}>Scanning all connections...</span>
|
|
546
|
-
</div>
|
|
547
|
-
<div style={{ fontFamily: 'monospace', fontSize: 10, color: '#888', maxHeight: 120, overflow: 'auto' }}>
|
|
548
|
-
{log.map((l, i) => <div key={i}>{l}</div>)}
|
|
549
|
-
</div>
|
|
550
|
-
</div>
|
|
551
|
-
)}
|
|
552
|
-
|
|
553
|
-
{status === 'done' && (
|
|
554
|
-
<div style={{ padding: '10px', borderRadius: 8, background: 'rgba(0,255,136,0.1)', border: '1px solid rgba(0,255,136,0.3)', color: '#00ff88', fontSize: 12, fontWeight: 600, textAlign: 'center' }}>
|
|
555
|
-
All connections scraped with images! Refresh the app to see your network.
|
|
556
|
-
</div>
|
|
557
|
-
)}
|
|
558
|
-
|
|
559
|
-
{status === 'error' && (
|
|
560
|
-
<div>
|
|
561
|
-
<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, textAlign: 'center', marginBottom: 8 }}>
|
|
562
|
-
Something went wrong
|
|
563
|
-
</div>
|
|
564
|
-
<button onClick={onRetry} style={{
|
|
565
|
-
width: '100%', padding: '10px', borderRadius: 8, border: 'none', cursor: 'pointer',
|
|
566
|
-
background: 'rgba(255,255,255,0.1)', color: '#aaa', fontWeight: 600, fontSize: 12,
|
|
567
|
-
}}>Try Again</button>
|
|
568
|
-
</div>
|
|
569
|
-
)}
|
|
570
|
-
</div>
|
|
571
|
-
);
|
|
572
|
-
}
|
|
@@ -6,15 +6,21 @@ import { IS_DEMO } from '../../lib/demo';
|
|
|
6
6
|
import OutlinkQuest from '../components/OutlinkQuest';
|
|
7
7
|
import OnboardingGate from '../components/OnboardingGate';
|
|
8
8
|
import { useUser } from '../components/UserProvider';
|
|
9
|
+
import { rowCompanyScore, TOP_COMPANY } from '../../lib/scoring';
|
|
9
10
|
import Link from 'next/link';
|
|
10
11
|
|
|
11
12
|
const TIER_COLORS = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
|
|
12
|
-
const PRESTIGE = ['snap', 'google', 'meta', 'apple', 'amazon', 'microsoft', 'netflix', 'tesla', 'spotify', 'tiktok', 'coca-cola', 'nike', 'disney', 'palantir', 'stripe', 'coinbase', 'polymarket', 'pinterest', 'whatnot', 'blackrock', 'anduril'];
|
|
13
13
|
|
|
14
|
+
// Who to reach first: power, +1 when the company their score is built on is a
|
|
15
|
+
// top one by the model's own scores (TOP_COMPANY: the curated list's major
|
|
16
|
+
// companies and up, or one you or your sector score that high), a nudge for
|
|
17
|
+
// the free-text sectors on your profile, then a lift for S and A. The +1 used
|
|
18
|
+
// to come from a list of one person's favourite names, matched anywhere in the
|
|
19
|
+
// headline, once per name: "Metadata" counted as Meta, "Ex-Google" as Google.
|
|
14
20
|
function calculatePriority(person, sectors) {
|
|
15
21
|
let score = parseFloat(person.power_score) || 0;
|
|
16
22
|
const hl = (person.headline || '').toLowerCase();
|
|
17
|
-
|
|
23
|
+
if (rowCompanyScore(person) >= TOP_COMPANY) score += 1;
|
|
18
24
|
(sectors || []).forEach(s => { if (hl.includes(s.toLowerCase())) score += 0.5; });
|
|
19
25
|
if (person.tier === 'S') score *= 1.5;
|
|
20
26
|
else if (person.tier === 'A') score *= 1.2;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import OnboardingGate from '../components/OnboardingGate';
|
|
6
|
+
import UpdatePanel from '../components/UpdatePanel';
|
|
7
|
+
import SectorSection from '../components/settings/SectorSection';
|
|
8
|
+
import DataSection from '../components/settings/DataSection';
|
|
9
|
+
import { Section, Body, Mono, LINE, FONT } from '../components/ui';
|
|
10
|
+
import { IS_DEMO } from '../../lib/demo';
|
|
11
|
+
|
|
12
|
+
// Settings: one page for the choices that shape how the app treats your data,
|
|
13
|
+
// and the facts about this copy. Each feature adds its own <Section>; what the
|
|
14
|
+
// user chooses is saved in the database (lib/settings.js), so it travels with
|
|
15
|
+
// their data.
|
|
16
|
+
|
|
17
|
+
export default function SettingsPage() {
|
|
18
|
+
return <OnboardingGate><SettingsInner /></OnboardingGate>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const KIND_LABEL = {
|
|
22
|
+
'mac-app': 'the Mac app',
|
|
23
|
+
npm: 'the npm package (npx six-degrees)',
|
|
24
|
+
source: 'a copy built from the source code',
|
|
25
|
+
git: 'a git checkout of the source code',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
function SettingsInner() {
|
|
29
|
+
const [info, setInfo] = useState(null);
|
|
30
|
+
const [error, setError] = useState(null);
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
fetch('/api/settings')
|
|
34
|
+
.then((r) => r.json().then((d) => (r.ok ? d : Promise.reject(new Error(d.error || 'Could not load settings.')))))
|
|
35
|
+
.then(setInfo)
|
|
36
|
+
.catch((e) => setError(e.message));
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
if (IS_DEMO) {
|
|
40
|
+
return (
|
|
41
|
+
<div style={{
|
|
42
|
+
minHeight: '100vh', background: '#0a0a1a', color: 'rgba(255,255,255,0.7)',
|
|
43
|
+
display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
|
|
44
|
+
gap: 12, textAlign: 'center', padding: 24, fontFamily: FONT,
|
|
45
|
+
}}>
|
|
46
|
+
<h2 style={{ margin: 0, fontSize: 20, fontWeight: 700, color: '#fff' }}>Not part of the demo</h2>
|
|
47
|
+
<p style={{ margin: 0, fontSize: 13 }}>The public demo includes the Network Circle and Degrees views only.</p>
|
|
48
|
+
<Link href="/" style={{ fontSize: 12, color: 'rgba(255,255,255,0.5)', textDecoration: 'none' }}>← Back to the network</Link>
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const about = info?.about;
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div style={{ minHeight: '100vh', background: '#0a0a1a', color: '#fff', fontFamily: FONT }}>
|
|
57
|
+
<header style={{ padding: '16px 24px', borderBottom: LINE, display: 'flex', alignItems: 'center', gap: 16 }}>
|
|
58
|
+
<Link href="/" style={{
|
|
59
|
+
display: 'flex', alignItems: 'center', gap: 6, color: '#888', textDecoration: 'none',
|
|
60
|
+
fontSize: 13, fontWeight: 600, padding: '6px 14px', borderRadius: 6,
|
|
61
|
+
background: 'rgba(255,255,255,0.06)', border: LINE,
|
|
62
|
+
}}>← Back to Map</Link>
|
|
63
|
+
<h1 style={{
|
|
64
|
+
fontSize: 22, fontWeight: 700, margin: 0,
|
|
65
|
+
background: 'linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)',
|
|
66
|
+
WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent',
|
|
67
|
+
}}>Settings</h1>
|
|
68
|
+
</header>
|
|
69
|
+
|
|
70
|
+
<main style={{ maxWidth: 720, margin: '0 auto', padding: '8px 24px 64px' }}>
|
|
71
|
+
{error && <Body style={{ color: '#ff7676', marginTop: 16 }}>{error}</Body>}
|
|
72
|
+
|
|
73
|
+
<UpdatePanel />
|
|
74
|
+
<SectorSection />
|
|
75
|
+
|
|
76
|
+
<DataSection />
|
|
77
|
+
|
|
78
|
+
<Section id="about" title="About this copy">
|
|
79
|
+
{about ? (
|
|
80
|
+
<>
|
|
81
|
+
<Body>Version <Mono>{about.version}</Mono>, running as {KIND_LABEL[about.kind] || about.kind}.</Body>
|
|
82
|
+
<Body>
|
|
83
|
+
Your network is kept in <Mono>{about.dataDir}</Mono>
|
|
84
|
+
{about.customDataDir ? ' (a folder you chose).' : '.'}
|
|
85
|
+
{about.kind === 'mac-app' && ' Help → Show the Data Folder opens it.'}
|
|
86
|
+
</Body>
|
|
87
|
+
<Body style={{ fontSize: 12, color: '#667', marginTop: 10 }}>
|
|
88
|
+
Settings are saved with your network, on this computer. Nothing here is sent anywhere.
|
|
89
|
+
</Body>
|
|
90
|
+
</>
|
|
91
|
+
) : !error && <Body>Loading…</Body>}
|
|
92
|
+
</Section>
|
|
93
|
+
</main>
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|