six-degrees 0.6.0 → 0.8.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 +4 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +42 -14
- package/.next/standalone/.next/routes-manifest.json +24 -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 +3 -3
- 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 +5 -3
- 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/insights/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/insights/page/build-manifest.json +20 -0
- package/.next/standalone/.next/server/app/insights/page/next-font-manifest.json +11 -0
- package/.next/standalone/.next/server/app/insights/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/insights/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/insights/page.js +13 -0
- package/.next/standalone/.next/server/app/insights/page.js.map +5 -0
- package/.next/standalone/.next/server/app/insights/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/insights/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/insights.html +1 -0
- package/.next/standalone/.next/server/app/insights.meta +26 -0
- package/.next/standalone/.next/server/app/insights.rsc +35 -0
- package/.next/standalone/.next/server/app/insights.segments/_full.segment.rsc +35 -0
- package/.next/standalone/.next/server/app/insights.segments/_tree.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/insights.segments/insights/__PAGE__.segment.rsc +33 -0
- 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 +21 -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 +4 -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]__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]__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]__15wc9e-._.js → [root-of-the-server]__0r-0t-9._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ra6xyg._.js +15 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__20rwfdw._.js → [root-of-the-server]__0rcpjad._.js} +6 -3
- 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/_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_00nndai.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_03ibb-x.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_03ri3ji.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_078ce48.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0a69mgr.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +7 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0cej3t8.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0cmh4g6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0nx2_pc.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0r79-w1.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0t552z6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_0yx8ynd.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_12p-o9-.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1466dnb.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1sryxv6.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1trn-x5.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_rpc_1ygu_mv.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0egamyq._.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/_04am_h8._.js +3 -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/_0gds903._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0hb-dhy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0klqt9z._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_14jak5s._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_14nxd3q._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1cj2yog._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1fm1ih_._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1hdqw0-._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_1k2nmbw._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1r62six._.js +7 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_insights_page_actions_0-0tf75.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_141w189._.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_components_settings_SectorPicker_1c-29qw.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_ui_0pdmz2z.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_insights_page_1d_chja.js +3 -0
- 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 +26 -14
- 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/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/02wnf8dkxegxg.js +34 -0
- 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/0838_s6w-i_ik.js +1 -0
- package/.next/standalone/.next/static/chunks/0_1r-3csplxnj.js +1 -0
- package/.next/standalone/.next/static/chunks/0ka4prpk3w9wn.js +34 -0
- package/.next/standalone/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
- package/.next/standalone/.next/static/chunks/0s_xxwp7z88vv.js +1 -0
- package/.next/standalone/.next/static/chunks/1-nnl8amfm4yh.js +57 -0
- package/.next/standalone/.next/static/chunks/112mv-com-mqa.js +21 -0
- package/.next/standalone/.next/static/chunks/1bkt_hhjzvbh8.js +1 -0
- package/.next/standalone/.next/static/chunks/1cmphb3kh2ers.css +3 -0
- package/.next/standalone/.next/static/chunks/1d8yv3k_atka7.js +1 -0
- package/.next/standalone/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
- package/.next/standalone/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
- package/.next/standalone/.next/static/chunks/23hc51oa4vkhc.js +5 -0
- package/.next/standalone/.next/static/chunks/27n8k9wxlz5-7.js +1 -0
- package/.next/standalone/.next/static/chunks/2q9i7pcxcnph1.js +7 -0
- package/.next/standalone/.next/static/chunks/2w-y83mjlpnse.js +1 -0
- package/.next/standalone/.next/static/chunks/2ws1xf293j-tm.js +5 -0
- package/.next/standalone/.next/static/chunks/2z1-q0_vunbql.js +2 -0
- package/.next/standalone/.next/static/chunks/34g73qhayuevu.js +1 -0
- package/.next/standalone/.next/static/chunks/3cqn-r-y5rrw1.js +5 -0
- package/.next/standalone/.next/static/chunks/3opgg1efrx8q6.js +1 -0
- package/.next/standalone/.next/static/chunks/3p51fpxxi4d5y.js +34 -0
- package/.next/standalone/.next/static/chunks/3y40z6of3r9py.js +1 -0
- package/.next/standalone/.next/static/chunks/403dpflln8ah5.js +1 -0
- package/.next/standalone/.next/static/chunks/43pg2sursiypz.js +1 -0
- package/.next/standalone/CHANGELOG.md +203 -0
- package/.next/standalone/README.md +96 -50
- package/.next/standalone/SECURITY.md +25 -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/outreach/route.js +13 -73
- package/.next/standalone/app/api/queue/route.js +1 -1
- package/.next/standalone/app/api/scraper/route.js +217 -36
- package/.next/standalone/app/api/social/crm/route.js +2 -1
- package/.next/standalone/app/components/AppHeader.js +41 -21
- package/.next/standalone/app/components/AppTabs.js +12 -8
- package/.next/standalone/app/components/AutoConnect.js +286 -0
- 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 +258 -113
- 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 +25 -18
- 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 +57 -27
- 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 +56 -35
- 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 +40 -21
- package/.next/standalone/app/components/ScanTrail.js +21 -8
- package/.next/standalone/app/components/SeparationView.js +172 -124
- package/.next/standalone/app/components/Sidebar.js +308 -199
- 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/insights/Boards.js +275 -0
- package/.next/standalone/app/components/insights/PeopleView.js +266 -0
- package/.next/standalone/app/components/insights/Rail.js +156 -0
- package/.next/standalone/app/components/insights/Report.js +382 -0
- package/.next/standalone/app/components/insights/parts.js +239 -0
- 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 +360 -0
- package/.next/standalone/app/components/ui.js +8 -8
- package/.next/standalone/app/globals.css +161 -5
- package/.next/standalone/app/import/page.js +94 -38
- package/.next/standalone/app/insights/page.js +220 -0
- package/.next/standalone/app/launch/page.js +5 -5
- package/.next/standalone/app/layout.js +6 -2
- package/.next/standalone/app/page.js +53 -53
- 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 +84 -72
- 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 +236 -133
- 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/auto-connect.js +145 -0
- package/.next/standalone/lib/backups.js +458 -0
- package/.next/standalone/lib/chain-layout.js +32 -0
- package/.next/standalone/lib/companies.js +1 -1
- 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/in-progress.js +46 -0
- package/.next/standalone/lib/ingest.js +1 -1
- package/.next/standalone/lib/insights-board.js +613 -0
- package/.next/standalone/lib/linkedin-limits.js +240 -14
- package/.next/standalone/lib/liquid-glass.js +59 -0
- package/.next/standalone/lib/notifications.js +13 -0
- package/.next/standalone/lib/requests-client.js +10 -0
- package/.next/standalone/lib/requests.js +124 -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/scan-state.js +1 -0
- package/.next/standalone/lib/scanner-setup.js +97 -15
- package/.next/standalone/lib/scraper-client.js +35 -8
- package/.next/standalone/lib/search-risk.js +7 -3
- package/.next/standalone/lib/settings-client.js +5 -3
- package/.next/standalone/lib/settings.js +13 -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 +200 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/scrape.py +595 -11
- package/.next/static/chunks/02wnf8dkxegxg.js +34 -0
- package/.next/static/chunks/03-_esd2x_yk6.js +1 -0
- package/.next/static/chunks/03-demj2iy-0p.js +44 -0
- package/.next/static/chunks/0838_s6w-i_ik.js +1 -0
- package/.next/static/chunks/0_1r-3csplxnj.js +1 -0
- package/.next/static/chunks/0ka4prpk3w9wn.js +34 -0
- package/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
- package/.next/static/chunks/0s_xxwp7z88vv.js +1 -0
- package/.next/static/chunks/1-nnl8amfm4yh.js +57 -0
- package/.next/static/chunks/112mv-com-mqa.js +21 -0
- package/.next/static/chunks/1bkt_hhjzvbh8.js +1 -0
- package/.next/static/chunks/1cmphb3kh2ers.css +3 -0
- package/.next/static/chunks/1d8yv3k_atka7.js +1 -0
- package/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
- package/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
- package/.next/static/chunks/23hc51oa4vkhc.js +5 -0
- package/.next/static/chunks/27n8k9wxlz5-7.js +1 -0
- package/.next/static/chunks/2q9i7pcxcnph1.js +7 -0
- package/.next/static/chunks/2w-y83mjlpnse.js +1 -0
- package/.next/static/chunks/2ws1xf293j-tm.js +5 -0
- package/.next/static/chunks/2z1-q0_vunbql.js +2 -0
- package/.next/static/chunks/34g73qhayuevu.js +1 -0
- package/.next/static/chunks/3cqn-r-y5rrw1.js +5 -0
- package/.next/static/chunks/3opgg1efrx8q6.js +1 -0
- package/.next/static/chunks/3p51fpxxi4d5y.js +34 -0
- package/.next/static/chunks/3y40z6of3r9py.js +1 -0
- package/.next/static/chunks/403dpflln8ah5.js +1 -0
- package/.next/static/chunks/43pg2sursiypz.js +1 -0
- package/CHANGELOG.md +203 -0
- package/README.md +96 -50
- package/SECURITY.md +25 -11
- package/lib/auto-connect.js +145 -0
- package/lib/backups.js +458 -0
- package/lib/chain-layout.js +32 -0
- package/lib/companies.js +1 -1
- 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/in-progress.js +46 -0
- package/lib/ingest.js +1 -1
- package/lib/insights-board.js +613 -0
- package/lib/linkedin-limits.js +240 -14
- package/lib/liquid-glass.js +59 -0
- package/lib/notifications.js +13 -0
- package/lib/requests-client.js +10 -0
- package/lib/requests.js +124 -0
- package/lib/scan-pace.js +11 -0
- package/lib/scan-progress.js +20 -0
- package/lib/scan-risk.js +44 -0
- package/lib/scan-state.js +1 -0
- package/lib/scanner-setup.js +97 -15
- package/lib/scraper-client.js +35 -8
- package/lib/search-risk.js +7 -3
- package/lib/settings-client.js +5 -3
- package/lib/settings.js +13 -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 +200 -0
- package/package.json +1 -1
- package/scripts/scrape.py +595 -11
- 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]__13dx4sd._.js +0 -8
- 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/_02twlca._.js +0 -10
- 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/_1f_n00p._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_2105jz8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_components_0t908t-._.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 → 3NCyJyAPDCEYsYTwF1Ieu}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_ssgManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_buildManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → 3NCyJyAPDCEYsYTwF1Ieu}/_ssgManifest.js +0 -0
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
// The row is a grid of 1fr | auto | 1fr: the two sides share what's left
|
|
11
11
|
// equally, so the tabs sit in the middle whatever is beside them. A window too
|
|
12
12
|
// narrow for that lets the sides shrink to fit before anything overlaps.
|
|
13
|
+
//
|
|
14
|
+
// On a computer the tabs sit on the header's bottom line, so the notch that
|
|
15
|
+
// hangs under the line (ScanStatusBar) hangs from the tabs themselves (Blake,
|
|
16
|
+
// 2026-10-03: "lower the section of buttons right to the line so the notch is
|
|
17
|
+
// touching"). They're moved down, not laid out lower, so the header keeps its
|
|
18
|
+
// height and every page under it stays where it was.
|
|
13
19
|
|
|
14
20
|
import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
|
|
15
21
|
import Link from 'next/link';
|
|
@@ -17,6 +23,7 @@ import { useRouter } from 'next/navigation';
|
|
|
17
23
|
import AppTabs from './AppTabs';
|
|
18
24
|
import AutoScanButton from './AutoScanButton';
|
|
19
25
|
import ScanTrail from './ScanTrail';
|
|
26
|
+
import ClusterSpinner from './ClusterSpinner';
|
|
20
27
|
import useScanner from './useScanner';
|
|
21
28
|
import { useUser } from './UserProvider';
|
|
22
29
|
import { scraperStatus, beginScrape, notReadyMessage, busyReason } from '../../lib/scraper-client';
|
|
@@ -35,6 +42,11 @@ function useIsMobile() {
|
|
|
35
42
|
return m;
|
|
36
43
|
}
|
|
37
44
|
|
|
45
|
+
// The header's padding top and bottom, and the gap under the row: the tabs
|
|
46
|
+
// move down by the last two to reach the line.
|
|
47
|
+
const PAD_Y = 20;
|
|
48
|
+
const ROW_GAP = 8;
|
|
49
|
+
|
|
38
50
|
const TITLE = { fontWeight: 700, margin: 0, whiteSpace: 'nowrap', background: 'linear-gradient(135deg, #FFD700, #9B59B6, #3498DB)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent' };
|
|
39
51
|
|
|
40
52
|
/**
|
|
@@ -52,27 +64,32 @@ export default function AppHeader({ active, isMobile: mobileProp, csvMode = fals
|
|
|
52
64
|
const mobileSeen = useIsMobile();
|
|
53
65
|
const isMobile = mobileProp ?? mobileSeen;
|
|
54
66
|
const own = !IS_DEMO && !csvMode; // scanning and notifications are for your own network
|
|
67
|
+
const tabs = (
|
|
68
|
+
<AppTabs active={active} isMobile={isMobile} csvMode={csvMode} onMode={onMode}
|
|
69
|
+
after={own ? <AutoScanButton isMobile={isMobile} /> : null}>
|
|
70
|
+
{chips}
|
|
71
|
+
</AppTabs>
|
|
72
|
+
);
|
|
55
73
|
return (
|
|
56
74
|
<header style={{
|
|
57
|
-
position: 'relative', padding: isMobile ? '10px 12px' :
|
|
75
|
+
position: 'relative', padding: isMobile ? '10px 12px' : `${PAD_Y}px 30px`, borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)', flexShrink: 0,
|
|
58
76
|
// Clear, or frosted glass on a glass theme (lib/themes.js).
|
|
59
77
|
background: 'var(--sd-header)', backdropFilter: 'var(--sd-header-blur)', WebkitBackdropFilter: 'var(--sd-header-blur)',
|
|
60
78
|
}}>
|
|
61
79
|
<div style={isMobile
|
|
62
80
|
? { display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 6, marginBottom: 4 }
|
|
63
|
-
: { display: 'grid', gridTemplateColumns: '1fr auto 1fr', alignItems: 'center', gap: 16, marginBottom:
|
|
81
|
+
: { display: 'grid', gridTemplateColumns: '1fr auto 1fr', alignItems: 'center', gap: 16, marginBottom: ROW_GAP }}>
|
|
64
82
|
<Link href="/" style={{ textDecoration: 'none', justifySelf: 'start' }}>
|
|
65
83
|
<Brand style={{ ...TITLE, fontSize: isMobile ? 16 : 28 }}>Six Degrees</Brand>
|
|
66
84
|
</Link>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
</AppTabs>
|
|
85
|
+
{isMobile ? tabs : (
|
|
86
|
+
<div style={{ alignSelf: 'end', position: 'relative', top: ROW_GAP + PAD_Y, zIndex: 2 }}>{tabs}</div>
|
|
87
|
+
)}
|
|
71
88
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', justifySelf: 'end', gap: isMobile ? 4 : 8 }}>
|
|
72
89
|
{/* Settings: also in CSV or sample mode and on phones, so updates stay reachable */}
|
|
73
90
|
{!IS_DEMO && <Link href="/settings" title="Settings" aria-label="Settings" style={{
|
|
74
91
|
width: isMobile ? 28 : 32, height: isMobile ? 28 : 32, borderRadius: '50%', flexShrink: 0,
|
|
75
|
-
background: 'rgba(255,255,255,0.06)', color: '#888', fontSize: isMobile ? 14 : 16, textDecoration: 'none',
|
|
92
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', color: 'var(--sd-fg-3, #888)', fontSize: isMobile ? 14 : 16, textDecoration: 'none',
|
|
76
93
|
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
77
94
|
}}>{'⚙︎'}</Link>}
|
|
78
95
|
{own && <NotificationBell isMobile={isMobile} onOpen={onOpenNote} openId={openNoteId} />}
|
|
@@ -121,7 +138,7 @@ function NotificationBell({ isMobile, onOpen, openId }) {
|
|
|
121
138
|
<div style={{ position: 'relative' }}>
|
|
122
139
|
<button onClick={() => setOpen(!open)} title="Notifications" aria-label={unseen ? `Notifications, ${unseen} new` : 'Notifications'} style={{
|
|
123
140
|
width: isMobile ? 28 : 32, height: isMobile ? 28 : 32, borderRadius: '50%', border: 'none', cursor: 'pointer',
|
|
124
|
-
background: 'rgba(255,255,255,0.06)', color: '#888', fontSize: isMobile ? 12 : 14,
|
|
141
|
+
background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', color: 'var(--sd-fg-3, #888)', fontSize: isMobile ? 12 : 14,
|
|
125
142
|
display: 'flex', alignItems: 'center', justifyContent: 'center', position: 'relative',
|
|
126
143
|
}}>
|
|
127
144
|
🔔
|
|
@@ -136,41 +153,41 @@ function NotificationBell({ isMobile, onOpen, openId }) {
|
|
|
136
153
|
{open && (
|
|
137
154
|
<div style={{
|
|
138
155
|
position: 'absolute', top: 40, right: 0, width: 320, maxHeight: 400,
|
|
139
|
-
background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(255,255,255,0.1)',
|
|
156
|
+
background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
|
|
140
157
|
borderRadius: 12, overflow: 'hidden', zIndex: 100,
|
|
141
158
|
backdropFilter: 'blur(12px)', WebkitBackdropFilter: 'blur(12px)',
|
|
142
159
|
boxShadow: '0 8px 32px rgba(0,0,0,0.5)',
|
|
143
160
|
}}>
|
|
144
|
-
<div style={{ padding: '12px 16px', borderBottom: '1px solid rgba(255,255,255,0.08)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
|
161
|
+
<div style={{ padding: '12px 16px', borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.08)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
|
|
145
162
|
<span style={{ fontWeight: 700, fontSize: 14 }}>Notifications</span>
|
|
146
163
|
{unseen > 0 && (
|
|
147
164
|
<button onClick={() => {
|
|
148
165
|
fetch('/api/notifications', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'mark-all-seen' }) });
|
|
149
166
|
setNotes((prev) => prev.map((n) => ({ ...n, seen: true })));
|
|
150
|
-
}} style={{ background: 'none', border: 'none', color: '#3498DB', fontSize: 11, cursor: 'pointer', fontWeight: 600 }}>
|
|
167
|
+
}} style={{ background: 'none', border: 'none', color: 'var(--sd-blue, #3498DB)', fontSize: 11, cursor: 'pointer', fontWeight: 600 }}>
|
|
151
168
|
Mark all read
|
|
152
169
|
</button>
|
|
153
170
|
)}
|
|
154
171
|
</div>
|
|
155
172
|
<div style={{ overflowY: 'auto', maxHeight: 340 }}>
|
|
156
173
|
{notes.length === 0 ? (
|
|
157
|
-
<div style={{ padding: 20, textAlign: 'center', color: '#555', fontSize: 12 }}>No notifications yet</div>
|
|
174
|
+
<div style={{ padding: 20, textAlign: 'center', color: 'var(--sd-fg-5, #555)', fontSize: 12 }}>No notifications yet</div>
|
|
158
175
|
) : notes.slice(0, 20).map((n) => (
|
|
159
176
|
<div key={n.id} role="button" tabIndex={0}
|
|
160
177
|
onClick={() => show(n)}
|
|
161
178
|
onKeyDown={(e) => { if (e.key === 'Enter') show(n); }}
|
|
162
|
-
onMouseEnter={(e) => { e.currentTarget.style.background = 'rgba(255,255,255,0.06)'; }}
|
|
179
|
+
onMouseEnter={(e) => { e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.06)'; }}
|
|
163
180
|
onMouseLeave={(e) => { e.currentTarget.style.background = n.seen ? 'transparent' : 'rgba(255,215,0,0.04)'; }}
|
|
164
181
|
style={{
|
|
165
|
-
padding: '10px 16px', borderBottom: '1px solid rgba(255,255,255,0.04)', cursor: 'pointer',
|
|
182
|
+
padding: '10px 16px', borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.04)', cursor: 'pointer',
|
|
166
183
|
background: n.seen ? 'transparent' : 'rgba(255,215,0,0.04)',
|
|
167
184
|
}}>
|
|
168
185
|
<div style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>
|
|
169
186
|
<span style={{ fontSize: 16 }}>{n.icon || '📌'}</span>
|
|
170
187
|
<div style={{ flex: 1 }}>
|
|
171
|
-
<div style={{ fontSize: 12, fontWeight: 600, color: n.seen ? '#888' : '#fff' }}>{n.title}<span style={{ color: '#556', marginLeft: 6 }}>›</span></div>
|
|
172
|
-
{n.message && <div style={{ fontSize: 10, color: '#666', marginTop: 2 }}>{n.message}</div>}
|
|
173
|
-
<div style={{ fontSize: 9, color: '#444', marginTop: 3 }}>{new Date(n.created_at).toLocaleDateString()}</div>
|
|
188
|
+
<div style={{ fontSize: 12, fontWeight: 600, color: n.seen ? 'var(--sd-fg-3, #888)' : 'var(--sd-fg-1, #fff)' }}>{n.title}<span style={{ color: 'var(--sd-fg-5, #556)', marginLeft: 6 }}>›</span></div>
|
|
189
|
+
{n.message && <div style={{ fontSize: 10, color: 'var(--sd-fg-4, #666)', marginTop: 2 }}>{n.message}</div>}
|
|
190
|
+
<div style={{ fontSize: 9, color: 'var(--sd-fg-5, #444)', marginTop: 3 }}>{new Date(n.created_at).toLocaleDateString()}</div>
|
|
174
191
|
</div>
|
|
175
192
|
</div>
|
|
176
193
|
</div>
|
|
@@ -194,6 +211,7 @@ function RefreshButton({ isMobile }) {
|
|
|
194
211
|
const busy = busyReason(scan);
|
|
195
212
|
return (
|
|
196
213
|
<button
|
|
214
|
+
className="cluster-host"
|
|
197
215
|
onClick={async () => {
|
|
198
216
|
try {
|
|
199
217
|
const blocked = notReadyMessage(await scraperStatus());
|
|
@@ -206,7 +224,7 @@ function RefreshButton({ isMobile }) {
|
|
|
206
224
|
);
|
|
207
225
|
if (!ok) return;
|
|
208
226
|
await beginScrape('refresh');
|
|
209
|
-
alert('Checking for new connections
|
|
227
|
+
alert('Checking for new connections. Watch it on the Scan page.');
|
|
210
228
|
} catch (e) {
|
|
211
229
|
alert(e.message);
|
|
212
230
|
}
|
|
@@ -218,12 +236,14 @@ function RefreshButton({ isMobile }) {
|
|
|
218
236
|
// Words, not a bare ↻ (Blake, 2026-10-02: "make it easier to check for new
|
|
219
237
|
// connections"), and the same words as the Scan page's button.
|
|
220
238
|
height: isMobile ? 28 : 32, padding: isMobile ? '0 10px' : '0 14px', borderRadius: 16,
|
|
221
|
-
|
|
222
|
-
|
|
239
|
+
// Its own check running stays bright, its cluster building; something else running greys it.
|
|
240
|
+
border: '1px solid rgba(0,255,136,0.3)', cursor: checking ? 'progress' : busy ? 'not-allowed' : 'pointer', opacity: busy && !checking ? 0.45 : 1,
|
|
241
|
+
background: 'rgba(0,255,136,0.08)', color: 'var(--sd-fg-1, #bff5d9)', fontSize: isMobile ? 11 : 12.5, fontWeight: 700,
|
|
223
242
|
display: 'flex', alignItems: 'center', gap: 6, whiteSpace: 'nowrap', flexShrink: 0,
|
|
224
243
|
}}
|
|
225
244
|
>
|
|
226
|
-
|
|
245
|
+
{/* A cluster forming: built once on hover, round and round while it checks */}
|
|
246
|
+
<ClusterSpinner size={isMobile ? 12 : 14} live={checking} />
|
|
227
247
|
{checking ? 'Checking…' : isMobile ? 'New' : 'Check for new'}
|
|
228
248
|
</button>
|
|
229
249
|
);
|
|
@@ -11,15 +11,19 @@ import Link from 'next/link';
|
|
|
11
11
|
import { IS_DEMO } from '../../lib/demo';
|
|
12
12
|
|
|
13
13
|
const MODES = [
|
|
14
|
-
{ key: 'network', label: 'Network Circle', short: 'Circle', on: { background: '#fff', color: '#000' }, off: { background: 'transparent', color: '#888' } },
|
|
15
|
-
{ key: 'degrees', label: 'Degrees', on: { background: 'linear-gradient(135deg, #FFD700, #FF6B35)', color: '#000' }, off: { background: 'rgba(255,255,255,0.12)', color: '#fff' } },
|
|
16
|
-
{ key: 'separation', label: 'Separation', on: { background: 'linear-gradient(135deg, #00E5FF, #FFD700 55%, #FF7043)', color: '#000' }, off: { background: 'rgba(255,255,255,0.12)', color: '#fff' } },
|
|
14
|
+
{ key: 'network', label: 'Network Circle', short: 'Circle', on: { background: '#fff', color: '#000' }, off: { background: 'transparent', color: 'var(--sd-fg-3, #888)' } },
|
|
15
|
+
{ key: 'degrees', label: 'Degrees', on: { background: 'linear-gradient(135deg, #FFD700, #FF6B35)', color: '#000' }, off: { background: 'rgba(var(--sd-ink, 255, 255, 255), 0.12)', color: 'var(--sd-fg-1, #fff)' } },
|
|
16
|
+
{ key: 'separation', label: 'Separation', on: { background: 'linear-gradient(135deg, #00E5FF, #FFD700 55%, #FF7043)', color: '#000' }, off: { background: 'rgba(var(--sd-ink, 255, 255, 255), 0.12)', color: 'var(--sd-fg-1, #fff)' } },
|
|
17
17
|
];
|
|
18
18
|
const PAGES = [
|
|
19
|
-
{ key: 'paths', href: '/paths', label: 'Paths', color: '#00ff88', on: 'linear-gradient(135deg, #00ff88, #3498DB)', demo: true },
|
|
19
|
+
{ key: 'paths', href: '/paths', label: 'Paths', color: 'var(--sd-green, #00ff88)', on: 'linear-gradient(135deg, #00ff88, #3498DB)', demo: true },
|
|
20
|
+
// Your network ranked by power, and the boards that read it (Blake, 2026-10-03:
|
|
21
|
+
// "stats and insights … based off their circles"). Purple to gold, its own colour.
|
|
22
|
+
// The sample and a CSV import have something to rank too, so it isn't `own`.
|
|
23
|
+
{ key: 'insights', href: '/insights', label: 'Insights', color: 'var(--sd-purple, #c39bd3)', on: 'linear-gradient(135deg, #9B59B6, #FFD700)' },
|
|
20
24
|
// Social is part of Outlink now (Messages & follow-ups); /social forwards there.
|
|
21
|
-
{ key: 'outlink', href: '/queue', label: 'Outlink', color: '#FF6B35', on: 'linear-gradient(135deg, #FF6B35, #FFD700)', own: true },
|
|
22
|
-
{ key: 'scan', href: '/setup', label: 'Scan', color: '#666', on: 'linear-gradient(135deg, #00ff88, #1abc9c)', own: true },
|
|
25
|
+
{ key: 'outlink', href: '/queue', label: 'Outlink', color: 'var(--sd-orange, #FF6B35)', on: 'linear-gradient(135deg, #FF6B35, #FFD700)', own: true },
|
|
26
|
+
{ key: 'scan', href: '/setup', label: 'Scan', color: 'var(--sd-fg-4, #666)', on: 'linear-gradient(135deg, #00ff88, #1abc9c)', own: true },
|
|
23
27
|
];
|
|
24
28
|
|
|
25
29
|
/**
|
|
@@ -33,7 +37,7 @@ export default function AppTabs({ active, isMobile = false, csvMode = false, onM
|
|
|
33
37
|
const pad = isMobile ? '6px 10px' : '8px 16px';
|
|
34
38
|
const base = { padding: pad, borderRadius: 6, border: 'none', fontSize: isMobile ? 11 : 13, fontWeight: 600, textDecoration: 'none' };
|
|
35
39
|
return (
|
|
36
|
-
<div id="main-tabs" style={{ display: 'flex', gap: isMobile ? 2 : 4, background: 'rgba(255,255,255,0.08)', borderRadius: 8, padding: isMobile ? 2 : 3, flexWrap: isMobile ? 'wrap' : 'nowrap' }}>
|
|
40
|
+
<div id="main-tabs" data-glass-panel="bar" style={{ display: 'flex', gap: isMobile ? 2 : 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 8, padding: isMobile ? 2 : 3, flexWrap: isMobile ? 'wrap' : 'nowrap' }}>
|
|
37
41
|
{MODES.map((m) => {
|
|
38
42
|
const style = { ...base, cursor: 'pointer', ...(active === m.key ? m.on : m.off) };
|
|
39
43
|
const label = isMobile && m.short ? m.short : m.label;
|
|
@@ -47,7 +51,7 @@ export default function AppTabs({ active, isMobile = false, csvMode = false, onM
|
|
|
47
51
|
return (
|
|
48
52
|
<Link key={p.key} href={p.href} title={p.title} aria-current={on ? 'page' : undefined} style={{
|
|
49
53
|
...base, display: 'flex', alignItems: 'center', gap: 4,
|
|
50
|
-
background: on ? p.on : 'rgba(255,255,255,0.06)', color: on ? '#000' : p.color,
|
|
54
|
+
background: on ? p.on : 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', color: on ? '#000' : p.color,
|
|
51
55
|
}}>
|
|
52
56
|
{p.label}{p.badge && <span style={{ fontSize: 9, opacity: 0.7, marginLeft: 2 }}>{p.badge}</span>}
|
|
53
57
|
</Link>
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
// Auto, next to every Connect: one connection request, sent for you from the
|
|
4
|
+
// scanner's Chrome, without a note.
|
|
5
|
+
//
|
|
6
|
+
// Blake, 2026-10-03: "auto add and basically adds the person for them in the
|
|
7
|
+
// card or wherever its available", then "i just want it next to connect button
|
|
8
|
+
// but say auto and makes it the better pick visually". So Auto comes first and
|
|
9
|
+
// wears the look Connect had (the gold-to-orange gradient), and the page's own
|
|
10
|
+
// Connect, which opens their profile for you to connect yourself, steps back to
|
|
11
|
+
// an outline beside it.
|
|
12
|
+
//
|
|
13
|
+
// One press, one person: it starts the scanner's `connect` job
|
|
14
|
+
// (app/api/scraper/route.js, scripts/scrape.py connect_person) and says how it
|
|
15
|
+
// went. It waits its turn like every Scan button (greyed out, with the reason,
|
|
16
|
+
// while anything else runs). Before the first one ever it asks once, and the
|
|
17
|
+
// answer is a setting (lib/auto-connect.js); the server refuses until it's
|
|
18
|
+
// given. A request LinkedIn showed as pending is marked as sent by the server,
|
|
19
|
+
// through the same store as Connect (lib/requests.js), and shown everywhere
|
|
20
|
+
// here a moment after "Request sent" (lib/requests-client.js sawRequested).
|
|
21
|
+
|
|
22
|
+
import { useEffect, useRef, useState } from 'react';
|
|
23
|
+
import { createPortal } from 'react-dom';
|
|
24
|
+
import useScanner from './useScanner';
|
|
25
|
+
import { beginScrape, busyReason } from '../../lib/scraper-client';
|
|
26
|
+
import { sawRequested } from '../../lib/requests-client';
|
|
27
|
+
import { AUTO_EXPLAIN, AUTO_CONFIRM, INVITE_CAPS, connectOutcome } from '../../lib/auto-connect';
|
|
28
|
+
|
|
29
|
+
export const AUTO_GRADIENT = 'linear-gradient(135deg, #FFD700, #FF6B35)';
|
|
30
|
+
|
|
31
|
+
// How long "Request sent" shows before the card turns to its pending state.
|
|
32
|
+
const SENT_SHOWN_MS = 2500;
|
|
33
|
+
|
|
34
|
+
// Whether the one-time question has been answered yes, asked of the app once per page.
|
|
35
|
+
let acceptedHere = false;
|
|
36
|
+
|
|
37
|
+
async function autoAccepted() {
|
|
38
|
+
if (acceptedHere) return true;
|
|
39
|
+
try {
|
|
40
|
+
const r = await fetch('/api/settings', { cache: 'no-store' });
|
|
41
|
+
const d = await r.json();
|
|
42
|
+
acceptedHere = Boolean(d?.settings?.autoConnectAccepted);
|
|
43
|
+
} catch {
|
|
44
|
+
acceptedHere = false; // can't tell: ask, which is harmless
|
|
45
|
+
}
|
|
46
|
+
return acceptedHere;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function saveAccepted() {
|
|
50
|
+
const r = await fetch('/api/settings', {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: { 'Content-Type': 'application/json' },
|
|
53
|
+
body: JSON.stringify({ settings: { autoConnectAccepted: new Date().toISOString() } }),
|
|
54
|
+
});
|
|
55
|
+
if (!r.ok) throw new Error((await r.json().catch(() => ({}))).error || 'Your answer couldn’t be saved.');
|
|
56
|
+
acceptedHere = true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Auto's state for one person: press it, the one-time question, how it went. */
|
|
60
|
+
function useAutoConnect(person, onSent) {
|
|
61
|
+
const scan = useScanner();
|
|
62
|
+
const [asking, setAsking] = useState(false);
|
|
63
|
+
const [sending, setSending] = useState(false);
|
|
64
|
+
const [result, setResult] = useState(null); // { ok, text } once a press has an answer
|
|
65
|
+
const ours = useRef(new Set()); // jobs this button started (by startedAt)
|
|
66
|
+
const shownJob = useRef(null);
|
|
67
|
+
|
|
68
|
+
const mine = scan.running && scan.action === 'connect' && Boolean(person?.id) && scan.target?.id === person.id;
|
|
69
|
+
const busy = scan.running && !mine && !sending ? busyReason(scan) : null;
|
|
70
|
+
|
|
71
|
+
const done = (r) => {
|
|
72
|
+
setResult(r);
|
|
73
|
+
if (r.marks) setTimeout(() => { sawRequested(person); onSent?.(person); }, SENT_SHOWN_MS);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// A request to this person started elsewhere (another window, or before a
|
|
77
|
+
// reload) that this page watched end: say how it went here too.
|
|
78
|
+
const last = (scan.finished || []).find((j) => j.action === 'connect' && j.target?.id === person?.id);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!last || ours.current.has(last.startedAt) || shownJob.current === last.startedAt) return;
|
|
81
|
+
shownJob.current = last.startedAt;
|
|
82
|
+
done(connectOutcome(last));
|
|
83
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
84
|
+
}, [last?.startedAt]);
|
|
85
|
+
|
|
86
|
+
async function send() {
|
|
87
|
+
setAsking(false);
|
|
88
|
+
setSending(true);
|
|
89
|
+
setResult(null);
|
|
90
|
+
try {
|
|
91
|
+
const { startedAt, ended } = await beginScrape('connect', { id: person.id, name: person.name });
|
|
92
|
+
ours.current.add(startedAt);
|
|
93
|
+
shownJob.current = startedAt;
|
|
94
|
+
done(connectOutcome(await ended));
|
|
95
|
+
} catch (err) {
|
|
96
|
+
if (err.details?.needsAutoAcceptance) {
|
|
97
|
+
acceptedHere = false;
|
|
98
|
+
setAsking(true);
|
|
99
|
+
} else {
|
|
100
|
+
setResult({ ok: false, text: err.message });
|
|
101
|
+
}
|
|
102
|
+
} finally {
|
|
103
|
+
setSending(false);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function press() {
|
|
108
|
+
if (sending || mine || busy) return;
|
|
109
|
+
setResult(null);
|
|
110
|
+
if (await autoAccepted()) send();
|
|
111
|
+
else setAsking(true);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function confirm() {
|
|
115
|
+
try {
|
|
116
|
+
await saveAccepted();
|
|
117
|
+
send();
|
|
118
|
+
} catch (err) {
|
|
119
|
+
setAsking(false);
|
|
120
|
+
setResult({ ok: false, text: err.message });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
press, confirm, cancel: () => setAsking(false), dismiss: () => setResult(null),
|
|
126
|
+
asking, sending: sending || mine, busy, result,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** The question before Auto's first request ever. Into <body>: a blurred panel would trap a fixed overlay (TheirCircle.js). */
|
|
131
|
+
function AutoAsk({ onSend, onCancel }) {
|
|
132
|
+
const sendRef = useRef(null);
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
sendRef.current?.focus();
|
|
135
|
+
const onKey = (e) => { if (e.key === 'Escape') onCancel(); };
|
|
136
|
+
window.addEventListener('keydown', onKey);
|
|
137
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
138
|
+
}, [onCancel]);
|
|
139
|
+
return createPortal(
|
|
140
|
+
<div role="dialog" aria-modal="true" aria-label="Auto sends connection requests" onClick={onCancel} style={{
|
|
141
|
+
position: 'fixed', inset: 0, zIndex: 400, background: 'rgba(var(--sd-shade, 0, 0, 0), 0.72)',
|
|
142
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 16,
|
|
143
|
+
}}>
|
|
144
|
+
<div data-auto-ask onClick={(e) => e.stopPropagation()} style={{
|
|
145
|
+
width: 'min(420px, 100%)', boxSizing: 'border-box', borderRadius: 14, padding: '20px 20px 16px',
|
|
146
|
+
background: 'var(--sd-surface, #12111c)', border: '1px solid rgba(255,215,0,0.28)',
|
|
147
|
+
boxShadow: '0 18px 60px rgba(0,0,0,0.5)', textAlign: 'left',
|
|
148
|
+
}}>
|
|
149
|
+
<div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 10 }}>
|
|
150
|
+
<span style={{
|
|
151
|
+
padding: '3px 9px', borderRadius: 6, background: AUTO_GRADIENT, color: '#000', fontWeight: 800, fontSize: 12,
|
|
152
|
+
}}>Auto</span>
|
|
153
|
+
<span style={{ fontSize: 15, fontWeight: 750, color: 'var(--sd-fg-1, #fff)' }}>Before the first one</span>
|
|
154
|
+
</div>
|
|
155
|
+
<p style={{ margin: 0, fontSize: 13.5, lineHeight: 1.6, color: 'var(--sd-fg-2, #d6dbe4)' }}>{AUTO_CONFIRM}</p>
|
|
156
|
+
<p style={{ margin: '10px 0 0', fontSize: 12, lineHeight: 1.55, color: 'var(--sd-fg-3, #8b9a9a)' }}>
|
|
157
|
+
It never adds a note, and stops at {INVITE_CAPS.day} in any 24 hours and {INVITE_CAPS.week} in any 7 days.
|
|
158
|
+
This is asked once.
|
|
159
|
+
</p>
|
|
160
|
+
<div style={{ display: 'flex', gap: 8, justifyContent: 'flex-end', marginTop: 16 }}>
|
|
161
|
+
<button type="button" onClick={onCancel} style={{
|
|
162
|
+
padding: '9px 16px', borderRadius: 8, fontSize: 13, fontWeight: 650, cursor: 'pointer',
|
|
163
|
+
background: 'transparent', color: 'var(--sd-fg-2, #ccc)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.18)',
|
|
164
|
+
}}>Cancel</button>
|
|
165
|
+
<button ref={sendRef} type="button" onClick={onSend} style={{
|
|
166
|
+
padding: '9px 18px', borderRadius: 8, fontSize: 13, fontWeight: 800, cursor: 'pointer',
|
|
167
|
+
background: AUTO_GRADIENT, color: '#000', border: 'none',
|
|
168
|
+
}}>Send it</button>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</div>,
|
|
172
|
+
document.body,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// minWidth: room for "Sending…", so the row doesn't jump when it changes.
|
|
177
|
+
const SIZES = {
|
|
178
|
+
card: { padding: '10px 18px', fontSize: 13, radius: 8, minWidth: 104 },
|
|
179
|
+
quest: { padding: '7px 14px', fontSize: 12.5, radius: 8, minWidth: 92 },
|
|
180
|
+
row: { padding: '4px 9px', fontSize: 9.5, radius: 4, minWidth: 0 },
|
|
181
|
+
// Insights' Power Index rows: the size of the table's other buttons (Open circle, Scan circle).
|
|
182
|
+
table: { padding: '6px 11px', fontSize: 12, radius: 7, minWidth: 0 },
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
/** The Auto button itself: the gradient, the better pick. */
|
|
186
|
+
function AutoButton({ auto, size, label = 'Auto' }) {
|
|
187
|
+
const s = SIZES[size] || SIZES.card;
|
|
188
|
+
// Also while "Request sent" shows, before the card turns to its pending state.
|
|
189
|
+
const off = auto.sending || Boolean(auto.busy) || Boolean(auto.result?.marks);
|
|
190
|
+
const title = auto.busy ? `${auto.busy}. Auto waits for it to finish.` : AUTO_EXPLAIN;
|
|
191
|
+
return (
|
|
192
|
+
<button type="button" data-auto-connect onClick={(e) => { e.stopPropagation(); auto.press(); }} disabled={off} title={title}
|
|
193
|
+
aria-label={auto.sending ? 'Sending the request' : `${label}: ${AUTO_EXPLAIN}`}
|
|
194
|
+
style={{
|
|
195
|
+
padding: s.padding, borderRadius: s.radius, fontSize: s.fontSize, fontWeight: 800, border: 'none', minWidth: s.minWidth,
|
|
196
|
+
background: AUTO_GRADIENT, color: '#000', cursor: off ? 'not-allowed' : 'pointer', opacity: auto.busy ? 0.45 : 1,
|
|
197
|
+
whiteSpace: 'nowrap', flexShrink: 0, boxShadow: off ? 'none' : '0 2px 12px rgba(255,140,50,0.28)',
|
|
198
|
+
}}>
|
|
199
|
+
{auto.sending ? 'Sending…' : label}
|
|
200
|
+
</button>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const resultColor = (r) => (r.ok ? 'var(--sd-green, #00ff88)' : 'var(--sd-coral, #ff8a7a)');
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Auto and the page's Connect, side by side: Auto first, as the better pick.
|
|
208
|
+
* `connect(secondary)` draws the page's own Connect, told whether it now stands
|
|
209
|
+
* second (an outline) or alone (as it always looked). Without Auto (`canAuto`
|
|
210
|
+
* false: the sample, a CSV, someone with no profile on file) Connect stands
|
|
211
|
+
* alone. `size`: 'card' (the person card: a line under it says what Auto does),
|
|
212
|
+
* 'quest' (Outlink's move cards), 'table' (Insights' rows) or 'row' (a list row: the line is the
|
|
213
|
+
* button's tooltip, and how it went shows in a small note under the buttons).
|
|
214
|
+
*/
|
|
215
|
+
export default function ConnectChoice({ person, canAuto = true, size = 'card', connect, onSent, style }) {
|
|
216
|
+
const available = canAuto && Boolean(person?.id) && Boolean(person?.profile_url);
|
|
217
|
+
if (!available) return connect(false);
|
|
218
|
+
// Keyed by person: a card reused for the next person starts fresh, never
|
|
219
|
+
// showing the last one's result as theirs.
|
|
220
|
+
return <WithAuto key={person.id} person={person} size={size} connect={connect} onSent={onSent} style={style} />;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function WithAuto({ person, size, connect, onSent, style }) {
|
|
224
|
+
const auto = useAutoConnect(person, onSent);
|
|
225
|
+
const ask = auto.asking && <AutoAsk onSend={auto.confirm} onCancel={auto.cancel} />;
|
|
226
|
+
|
|
227
|
+
if (size === 'row' || size === 'table') {
|
|
228
|
+
return (
|
|
229
|
+
<span style={{ position: 'relative', display: 'inline-flex', gap: 4, alignItems: 'center', flexShrink: 0, ...style }}
|
|
230
|
+
onClick={(e) => e.stopPropagation()}>
|
|
231
|
+
<AutoButton auto={auto} size={size} />
|
|
232
|
+
{connect(true)}
|
|
233
|
+
{auto.result && (
|
|
234
|
+
<span role="status" style={{
|
|
235
|
+
position: 'absolute', top: 'calc(100% + 4px)', right: 0, zIndex: 20, width: 230, boxSizing: 'border-box',
|
|
236
|
+
padding: '7px 24px 7px 9px', borderRadius: 7, fontSize: 11, lineHeight: 1.45, fontWeight: 600, textAlign: 'left',
|
|
237
|
+
color: resultColor(auto.result), background: 'var(--sd-surface, #14131d)',
|
|
238
|
+
border: `1px solid ${auto.result.ok ? 'rgba(0,255,136,0.35)' : 'rgba(255,138,122,0.4)'}`, boxShadow: '0 8px 24px rgba(0,0,0,0.4)',
|
|
239
|
+
}}>
|
|
240
|
+
{auto.result.text}
|
|
241
|
+
<button type="button" aria-label="Close" onClick={auto.dismiss} style={{
|
|
242
|
+
position: 'absolute', top: 3, right: 4, background: 'none', border: 'none', cursor: 'pointer',
|
|
243
|
+
color: 'var(--sd-fg-3, #888)', fontSize: 12, lineHeight: 1,
|
|
244
|
+
}}>×</button>
|
|
245
|
+
</span>
|
|
246
|
+
)}
|
|
247
|
+
{ask}
|
|
248
|
+
</span>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const card = size === 'card';
|
|
253
|
+
return (
|
|
254
|
+
<div style={style}>
|
|
255
|
+
<div style={{ display: 'flex', gap: 8, alignItems: 'stretch', flexWrap: 'wrap' }}>
|
|
256
|
+
<AutoButton auto={auto} size={size} />
|
|
257
|
+
{connect(true)}
|
|
258
|
+
</div>
|
|
259
|
+
{card && (
|
|
260
|
+
<div style={{ fontSize: 11, lineHeight: 1.5, color: 'var(--sd-fg-3, #8b9a9a)', marginTop: 8 }}>
|
|
261
|
+
{auto.busy ? `${auto.busy}. Auto waits for it to finish.` : AUTO_EXPLAIN}
|
|
262
|
+
</div>
|
|
263
|
+
)}
|
|
264
|
+
{auto.result && (
|
|
265
|
+
<div role="status" style={{ fontSize: 12, lineHeight: 1.5, fontWeight: 650, marginTop: 8, color: resultColor(auto.result) }}>
|
|
266
|
+
{auto.result.text}
|
|
267
|
+
</div>
|
|
268
|
+
)}
|
|
269
|
+
{ask}
|
|
270
|
+
</div>
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* The page's Connect when it stands second to Auto: the same link, as an
|
|
276
|
+
* outline. `color` and `line` keep a page's own colour (Outlink's blue Add).
|
|
277
|
+
*/
|
|
278
|
+
export function secondaryLook(size = 'card', { color = 'var(--sd-gold, #FFD700)', line = 'rgba(255,215,0,0.5)' } = {}) {
|
|
279
|
+
const s = SIZES[size] || SIZES.card;
|
|
280
|
+
return {
|
|
281
|
+
padding: s.padding, borderRadius: s.radius, fontSize: s.fontSize, fontWeight: 700,
|
|
282
|
+
background: 'transparent', color, border: `1px solid ${line}`,
|
|
283
|
+
textDecoration: 'none', cursor: 'pointer', whiteSpace: 'nowrap', boxSizing: 'border-box',
|
|
284
|
+
display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
|
|
285
|
+
};
|
|
286
|
+
}
|
|
@@ -22,7 +22,7 @@ export default function AutoScanButton({ isMobile = false }) {
|
|
|
22
22
|
};
|
|
23
23
|
if (mine) {
|
|
24
24
|
return (
|
|
25
|
-
<Link href="/setup" title="Auto scan is running: see it on the Scan page" style={{ ...style, background: 'rgba(0,255,136,0.15)', color: '#00ff88', border: '1px solid rgba(0,255,136,0.45)' }}>
|
|
25
|
+
<Link href="/setup" title="Auto scan is running: see it on the Scan page" style={{ ...style, background: 'rgba(0,255,136,0.15)', color: 'var(--sd-green, #00ff88)', border: '1px solid rgba(0,255,136,0.45)' }}>
|
|
26
26
|
<span style={{ width: 7, height: 7, borderRadius: '50%', background: '#00ff88' }} />Auto scan
|
|
27
27
|
</Link>
|
|
28
28
|
);
|
|
@@ -33,7 +33,7 @@ export default function AutoScanButton({ isMobile = false }) {
|
|
|
33
33
|
onClick={() => { setStarting(true); startAutoScan().catch(() => setStarting(false)); }}
|
|
34
34
|
disabled={busy}
|
|
35
35
|
title={busy ? 'The scanner is busy: one scan at a time' : 'Start the all-day Auto-Bridge (experimental)'}
|
|
36
|
-
style={{ ...style, cursor: busy ? 'default' : 'pointer', background: 'rgba(255,255,255,0.04)', color: busy ? '#555' : '#8b9a9a', border: '1px solid rgba(255,215,0,0.25)' }}
|
|
36
|
+
style={{ ...style, cursor: busy ? 'default' : 'pointer', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.04)', color: busy ? 'var(--sd-fg-5, #555)' : 'var(--sd-fg-3, #8b9a9a)', border: '1px solid rgba(255,215,0,0.25)' }}
|
|
37
37
|
>
|
|
38
38
|
<span style={{ width: 7, height: 7, borderRadius: '50%', background: '#556' }} />Auto scan
|
|
39
39
|
</button>
|
|
@@ -16,7 +16,7 @@ export default function Avatar({ person, size = 32, tierColors = FALLBACK }) {
|
|
|
16
16
|
const c = tierColors[person?.tier] || '#666';
|
|
17
17
|
const photo = localPhoto(person?.profile_image_url);
|
|
18
18
|
return (
|
|
19
|
-
<span style={{
|
|
19
|
+
<span className="sd-dot-html" style={{
|
|
20
20
|
position: 'relative', display: 'inline-block', width: size, height: size, flexShrink: 0,
|
|
21
21
|
borderRadius: '50%', boxShadow: `0 0 0 ${size >= 24 ? 2 : 1}px ${c}`,
|
|
22
22
|
}}>
|