six-degrees 0.5.0 → 0.6.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/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +14 -14
- 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 +20 -19
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +20 -19
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +16 -15
- 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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +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.nft.json +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/reveal/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
- 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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/users/route.js.nft.json +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 +24 -23
- package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +22 -21
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +18 -17
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +22 -21
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/launch/page.js +1 -1
- package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/launch.html +2 -2
- package/.next/standalone/.next/server/app/launch.rsc +24 -23
- package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- 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 +24 -23
- package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +24 -23
- 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 +18 -17
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +1 -1
- 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]__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]__0ljnyho._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0um1uey._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +1 -1
- 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]__13dx4sd._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.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]__15wc9e-._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__18bcnu4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +2 -2
- 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]__1kbl21f._.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]__1rphsdk._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__20rwfdw._.js +2 -2
- package/.next/standalone/.next/server/chunks/_1_fynia._.js +7 -7
- package/.next/standalone/.next/server/chunks/_1itd1o_._.js +2 -2
- package/.next/standalone/.next/server/chunks/lib_0851sk0._.js +5 -5
- package/.next/standalone/.next/server/chunks/lib_1q7p2ro._.js +5 -5
- package/.next/standalone/.next/server/chunks/lib_1r6l86l._.js +5 -5
- package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +9 -9
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08oxiqh._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_03l7vge._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08g31gm._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0gk_ofx._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0nwsf93._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0vho1lb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0jdkqgi._.js → _1-658fq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_1bc46kz._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1f_n00p._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1fm1ih_._.js +9 -0
- package/.next/standalone/.next/server/chunks/ssr/_1k2nmbw._.js +9 -0
- package/.next/standalone/.next/server/chunks/ssr/_2105jz8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_141w189._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_components_0t908t-._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_components_0uuff77._.js +13 -0
- package/.next/standalone/.next/server/chunks/ssr/app_components_1j3q-h5._.js +13 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0gtv9jb._.js → app_components_CompanyScores_1g0mytz.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_components_settings_SectorPicker_1c-29qw.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +14 -12
- 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 +6 -6
- 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 +4 -4
- package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_0i8v-s3._.js → lib_1c4ieuw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/02pq76u7y4v9-.js +22 -0
- package/.next/standalone/.next/static/chunks/0cmq0exd4d0h9.js +1 -0
- package/.next/{static/chunks/2wgz9ietkqqe6.js → standalone/.next/static/chunks/0i02yxppzds1o.js} +1 -1
- package/.next/standalone/.next/static/chunks/0m_p4k-q2qh--.js +1 -0
- package/.next/standalone/.next/static/chunks/0oyslj62jkubd.js +1 -0
- package/.next/standalone/.next/static/chunks/{1x_ysly42-teq.css → 0vo-l8hxneba6.css} +1 -1
- package/.next/{static/chunks/3sowbvbaj1s6n.js → standalone/.next/static/chunks/0ws7zy0w57ufi.js} +1 -1
- package/.next/standalone/.next/static/chunks/0yh8z2tbrc5i_.js +1 -0
- package/.next/standalone/.next/static/chunks/172e10mi-tpo_.js +34 -0
- package/.next/standalone/.next/static/chunks/1ei5vbe2uw6fl.js +1 -0
- package/.next/standalone/.next/static/chunks/1f7_pl_wq7lh3.js +11 -0
- package/.next/standalone/.next/static/chunks/1jzbe7zdx9vbj.js +2 -0
- package/.next/standalone/.next/static/chunks/1m3017gp790pw.js +45 -0
- package/.next/standalone/.next/static/chunks/1t20e8u0st7ep.js +1 -0
- package/.next/standalone/.next/static/chunks/2-ch9rm27eril.js +11 -0
- package/.next/standalone/.next/static/chunks/2ldv-v3s9yaif.js +1 -0
- package/.next/standalone/.next/static/chunks/3bp284gjf7dyq.js +1 -0
- package/.next/standalone/.next/static/chunks/3k1f6clbn3gj3.js +7 -0
- package/.next/standalone/.next/static/chunks/3l4t8je6iguzc.js +1 -0
- package/.next/standalone/.next/static/chunks/{0muwt9bykzr-1.js → 3tplzuc9jk-tl.js} +1 -1
- package/.next/standalone/.next/static/chunks/42m0bqr8pbovz.js +11 -0
- package/.next/standalone/CHANGELOG.md +61 -0
- package/.next/standalone/README.md +22 -8
- package/.next/standalone/app/api/scraper/route.js +40 -3
- package/.next/standalone/app/api/update/route.js +12 -6
- package/.next/standalone/app/components/AppHeader.js +257 -0
- package/.next/standalone/app/components/Avatar.js +2 -1
- package/.next/standalone/app/components/ChainView.js +12 -12
- package/.next/standalone/app/components/FilterPanel.js +20 -12
- package/.next/standalone/app/components/ForceGraph.js +163 -25
- package/.next/standalone/app/components/GalaxyLab.js +43 -12
- package/.next/standalone/app/components/GridView.js +4 -4
- package/.next/standalone/app/components/LinkedInLimits.js +2 -1
- package/.next/standalone/app/components/ListView.js +3 -3
- package/.next/standalone/app/components/NoteDetail.js +2 -1
- package/.next/standalone/app/components/OnboardingGate.js +2 -2
- package/.next/standalone/app/components/OutlinkQuest.js +2 -1
- package/.next/standalone/app/components/PathsAnalyzer.js +3 -2
- package/.next/standalone/app/components/PeopleMap.js +2 -1
- package/.next/standalone/app/components/RingsView.js +3 -3
- package/.next/standalone/app/components/ScanTrail.js +85 -0
- package/.next/standalone/app/components/SeparationView.js +100 -77
- package/.next/standalone/app/components/Sidebar.js +4 -4
- package/.next/standalone/app/components/TheirCircle.js +2 -1
- package/.next/standalone/app/components/ThemeLoader.js +9 -0
- package/.next/standalone/app/components/UpdatePanel.js +20 -2
- package/.next/standalone/app/components/settings/AppearanceSection.js +226 -0
- package/.next/standalone/app/components/settings/NetworkHealthSection.js +2 -1
- package/.next/standalone/app/components/ui.js +2 -1
- package/.next/standalone/app/globals.css +70 -2
- package/.next/standalone/app/import/page.js +3 -3
- package/.next/standalone/app/layout.js +11 -2
- package/.next/standalone/app/page.js +69 -215
- package/.next/standalone/app/paths/page.js +8 -21
- package/.next/standalone/app/profile/page.js +11 -10
- package/.next/standalone/app/queue/page.js +8 -21
- package/.next/standalone/app/scores/page.js +1 -1
- package/.next/standalone/app/settings/page.js +7 -3
- package/.next/standalone/app/setup/page.js +83 -88
- package/.next/standalone/app/social/Crm.js +2 -1
- package/.next/standalone/app/social/SocialHub.js +2 -2
- package/.next/standalone/app/social/page.js +1 -1
- package/.next/standalone/lib/data-import.js +1 -0
- package/.next/standalone/lib/galaxy-export.js +2 -1
- package/.next/standalone/lib/galaxy-lab.js +24 -8
- package/.next/standalone/lib/level.js +51 -0
- package/.next/standalone/lib/release.js +13 -7
- package/.next/standalone/lib/scanner-python.js +38 -8
- package/.next/standalone/lib/scraper-client.js +2 -1
- package/.next/standalone/lib/separation.js +4 -2
- package/.next/standalone/lib/theme-store.js +61 -0
- package/.next/standalone/lib/themes.js +186 -0
- package/.next/standalone/lib/tiers.js +2 -8
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +4 -4
- package/.next/standalone/scripts/build-desktop.mjs +325 -0
- package/.next/standalone/scripts/build-site.mjs +85 -15
- package/.next/standalone/scripts/gen-test-network.mjs +93 -0
- package/.next/standalone/scripts/next.mjs +20 -0
- package/.next/standalone/scripts/readme_buttons.py +3 -0
- package/.next/standalone/scripts/requirements.txt +18 -1
- package/.next/standalone/scripts/site-news.mjs +54 -9
- package/.next/standalone/scripts/smoke-desktop.mjs +177 -0
- package/.next/standalone/scripts/windows/six-degrees.iss +100 -0
- package/.next/static/chunks/02pq76u7y4v9-.js +22 -0
- package/.next/static/chunks/0cmq0exd4d0h9.js +1 -0
- package/.next/{standalone/.next/static/chunks/2wgz9ietkqqe6.js → static/chunks/0i02yxppzds1o.js} +1 -1
- package/.next/static/chunks/0m_p4k-q2qh--.js +1 -0
- package/.next/static/chunks/0oyslj62jkubd.js +1 -0
- package/.next/static/chunks/{1x_ysly42-teq.css → 0vo-l8hxneba6.css} +1 -1
- package/.next/{standalone/.next/static/chunks/3sowbvbaj1s6n.js → static/chunks/0ws7zy0w57ufi.js} +1 -1
- package/.next/static/chunks/0yh8z2tbrc5i_.js +1 -0
- package/.next/static/chunks/172e10mi-tpo_.js +34 -0
- package/.next/static/chunks/1ei5vbe2uw6fl.js +1 -0
- package/.next/static/chunks/1f7_pl_wq7lh3.js +11 -0
- package/.next/static/chunks/1jzbe7zdx9vbj.js +2 -0
- package/.next/static/chunks/1m3017gp790pw.js +45 -0
- package/.next/static/chunks/1t20e8u0st7ep.js +1 -0
- package/.next/static/chunks/2-ch9rm27eril.js +11 -0
- package/.next/static/chunks/2ldv-v3s9yaif.js +1 -0
- package/.next/static/chunks/3bp284gjf7dyq.js +1 -0
- package/.next/static/chunks/3k1f6clbn3gj3.js +7 -0
- package/.next/static/chunks/3l4t8je6iguzc.js +1 -0
- package/.next/static/chunks/{0muwt9bykzr-1.js → 3tplzuc9jk-tl.js} +1 -1
- package/.next/static/chunks/42m0bqr8pbovz.js +11 -0
- package/CHANGELOG.md +61 -0
- package/README.md +22 -8
- package/lib/data-import.js +1 -0
- package/lib/galaxy-export.js +2 -1
- package/lib/galaxy-lab.js +24 -8
- package/lib/level.js +51 -0
- package/lib/release.js +13 -7
- package/lib/scanner-python.js +38 -8
- package/lib/scraper-client.js +2 -1
- package/lib/separation.js +4 -2
- package/lib/theme-store.js +61 -0
- package/lib/themes.js +186 -0
- package/lib/tiers.js +2 -8
- package/package.json +4 -4
- package/scripts/requirements.txt +18 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljcioj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16hs8kw._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_01kacen._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0xi-fbs._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0xmwmfv._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1-b9hj7._.js +0 -9
- package/.next/standalone/.next/server/chunks/ssr/_112ewem._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_16ab63q._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1fxm0-s._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1ra1d3r._.js +0 -9
- package/.next/standalone/.next/server/chunks/ssr/app_components_ui_0pdmz2z.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_13rapwj._.js +0 -3
- package/.next/standalone/.next/static/chunks/03bziijw5srol.js +0 -1
- package/.next/standalone/.next/static/chunks/0bgq8wmopl_ig.js +0 -7
- package/.next/standalone/.next/static/chunks/0ezus6p2eb-vg.js +0 -1
- package/.next/standalone/.next/static/chunks/0g_fy2034bp0x.js +0 -34
- package/.next/standalone/.next/static/chunks/0q5dru4q6gxl5.js +0 -22
- package/.next/standalone/.next/static/chunks/0w-byiwb2zax8.js +0 -2
- package/.next/standalone/.next/static/chunks/1g7jcovdejc9-.js +0 -1
- package/.next/standalone/.next/static/chunks/1i51yylxdzht1.js +0 -1
- package/.next/standalone/.next/static/chunks/1zf8swaasjf1e.js +0 -43
- package/.next/standalone/.next/static/chunks/2dwtoszeq91us.js +0 -1
- package/.next/standalone/.next/static/chunks/2rqtpccruavf2.js +0 -1
- package/.next/standalone/.next/static/chunks/30x3oq_st7a5r.js +0 -1
- package/.next/standalone/.next/static/chunks/355ryio1b7sm1.js +0 -1
- package/.next/standalone/.next/static/chunks/3ap5hgma7n0o7.js +0 -1
- package/.next/standalone/.next/static/chunks/3fci6qi39-1n5.js +0 -1
- package/.next/static/chunks/03bziijw5srol.js +0 -1
- package/.next/static/chunks/0bgq8wmopl_ig.js +0 -7
- package/.next/static/chunks/0ezus6p2eb-vg.js +0 -1
- package/.next/static/chunks/0g_fy2034bp0x.js +0 -34
- package/.next/static/chunks/0q5dru4q6gxl5.js +0 -22
- package/.next/static/chunks/0w-byiwb2zax8.js +0 -2
- package/.next/static/chunks/1g7jcovdejc9-.js +0 -1
- package/.next/static/chunks/1i51yylxdzht1.js +0 -1
- package/.next/static/chunks/1zf8swaasjf1e.js +0 -43
- package/.next/static/chunks/2dwtoszeq91us.js +0 -1
- package/.next/static/chunks/2rqtpccruavf2.js +0 -1
- package/.next/static/chunks/30x3oq_st7a5r.js +0 -1
- package/.next/static/chunks/355ryio1b7sm1.js +0 -1
- package/.next/static/chunks/3ap5hgma7n0o7.js +0 -1
- package/.next/static/chunks/3fci6qi39-1n5.js +0 -1
- /package/.next/standalone/.next/static/{I-cj79yE2IZ8taX2dZGp3 → dQUvvVSXqbkEFC3-CNcwT}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{I-cj79yE2IZ8taX2dZGp3 → dQUvvVSXqbkEFC3-CNcwT}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{I-cj79yE2IZ8taX2dZGp3 → dQUvvVSXqbkEFC3-CNcwT}/_ssgManifest.js +0 -0
- /package/.next/static/{I-cj79yE2IZ8taX2dZGp3 → dQUvvVSXqbkEFC3-CNcwT}/_buildManifest.js +0 -0
- /package/.next/static/{I-cj79yE2IZ8taX2dZGp3 → dQUvvVSXqbkEFC3-CNcwT}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{I-cj79yE2IZ8taX2dZGp3 → dQUvvVSXqbkEFC3-CNcwT}/_ssgManifest.js +0 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import { useState, useSyncExternalStore } from 'react';
|
|
12
12
|
import {
|
|
13
|
-
LAB_DEFAULTS, CLUSTERS, ORBIT, layoutOf, labNow, setLab, watchLab,
|
|
13
|
+
LAB_DEFAULTS, CLUSTERS, ORBIT, LAYOUT_LOOKS, layoutOf, labNow, setLab, watchLab,
|
|
14
14
|
clockNow, setClock, watchClock, play, pause, stopReplay,
|
|
15
15
|
layoutsNow, watchLayouts, saveLayout, applyLayout, forgetLayout, milestones,
|
|
16
16
|
} from '../../lib/galaxy-lab';
|
|
@@ -21,16 +21,20 @@ const noLayouts = [];
|
|
|
21
21
|
|
|
22
22
|
const DAY = 86400000;
|
|
23
23
|
|
|
24
|
+
// Obsidian's four forces, by its names, saying what each does to a network
|
|
25
|
+
// (Blake, 2026-10-03: "give the obsidian adjustments making sense to our data
|
|
26
|
+
// sets"), then our own two: the tier rings, and Orbit.
|
|
24
27
|
const FORCES = [
|
|
25
|
-
{ key: 'gravity', label: '
|
|
26
|
-
{ key: '
|
|
27
|
-
{ key: '
|
|
28
|
-
{ key: '
|
|
29
|
-
{ key: '
|
|
28
|
+
{ key: 'gravity', label: 'Center force', min: 0, max: 3, step: 0.01, fmt: (v) => v.toFixed(2), hint: 'Pulls everyone in towards you. Higher keeps the whole network a tighter, rounder disc.' },
|
|
29
|
+
{ key: 'push', label: 'Repel force', min: 0, max: 300, step: 1, fmt: (v) => String(v), hint: 'How hard people push each other apart: the space between clusters.' },
|
|
30
|
+
{ key: 'pull', label: 'Link force', min: 0, max: 15, step: 0.05, fmt: (v) => `${v.toFixed(2)}×`, hint: 'How tightly a line holds: your connections to you, a circle to its connection, and someone in several circles to each of them.' },
|
|
31
|
+
{ key: 'distance', label: 'Link distance', min: 0.05, max: 6, step: 0.05, fmt: (v) => `${v.toFixed(2)}×`, hint: 'How long the lines are: how far a circle sits from its connection, and your connections from you.' },
|
|
32
|
+
{ key: 'rings', label: 'Rings', min: 0, max: 5, step: 0.05, fmt: (v) => `${v.toFixed(2)}×`, hint: 'How hard each tier holds its ring round you. At 0 the network finds its own shape.' },
|
|
30
33
|
];
|
|
34
|
+
const ORBIT_SLIDER = { key: 'orbit', label: 'Orbit', min: 0, max: 5, step: 0.05, fmt: (v) => (v ? `${v.toFixed(2)}×` : 'still'), hint: 'Sets the whole map turning round you, every circle with it, so nothing loses its shape. 0 holds still.' };
|
|
31
35
|
const DISPLAY = [
|
|
32
|
-
{ key: 'dotSize', label: '
|
|
33
|
-
{ key: 'lines', label: '
|
|
36
|
+
{ key: 'dotSize', label: 'Node size', min: 0.2, max: 8, step: 0.05, fmt: (v) => `${v.toFixed(2)}×` },
|
|
37
|
+
{ key: 'lines', label: 'Link thickness', min: 0, max: 20, step: 0.1, fmt: (v) => `${v.toFixed(1)}×` },
|
|
34
38
|
];
|
|
35
39
|
|
|
36
40
|
const heading = { fontSize: 9, fontWeight: 700, color: '#555', letterSpacing: 1, margin: '12px 0 6px', textTransform: 'uppercase' };
|
|
@@ -78,6 +82,15 @@ export function NamesSwitch() {
|
|
|
78
82
|
);
|
|
79
83
|
}
|
|
80
84
|
|
|
85
|
+
// Reduce Motion, the computer's accessibility setting: Orbit holds still under it.
|
|
86
|
+
const MOTION = '(prefers-reduced-motion: reduce)';
|
|
87
|
+
const reducedMotion = () => window.matchMedia?.(MOTION).matches ?? false;
|
|
88
|
+
const subscribeMotion = (f) => {
|
|
89
|
+
const m = window.matchMedia?.(MOTION);
|
|
90
|
+
m?.addEventListener('change', f);
|
|
91
|
+
return () => m?.removeEventListener('change', f);
|
|
92
|
+
};
|
|
93
|
+
|
|
81
94
|
const month = (t) => new Date(t).toLocaleDateString(undefined, { month: 'short', year: 'numeric' });
|
|
82
95
|
|
|
83
96
|
export default function GalaxyLab() {
|
|
@@ -99,6 +112,14 @@ export default function GalaxyLab() {
|
|
|
99
112
|
};
|
|
100
113
|
const canReplay = clock.min != null && clock.max != null && clock.max > clock.min;
|
|
101
114
|
const preset = layoutOf(lab);
|
|
115
|
+
const fit = () => setClock({ fit: clockNow().fit + 1 });
|
|
116
|
+
// A layout: its forces and its look, then everyone on screen once it settles.
|
|
117
|
+
const pickLayout = (v) => {
|
|
118
|
+
const forces = v === 'rings' ? { ...Object.fromEntries(FORCES.map((f) => [f.key, LAB_DEFAULTS[f.key]])), sizeBy: 'power' } : v === 'orbit' ? ORBIT : CLUSTERS;
|
|
119
|
+
setLab({ ...forces, ...LAYOUT_LOOKS[v] });
|
|
120
|
+
fit();
|
|
121
|
+
};
|
|
122
|
+
const still = useSyncExternalStore(subscribeMotion, reducedMotion, () => false);
|
|
102
123
|
|
|
103
124
|
return (
|
|
104
125
|
<div style={{ marginBottom: 18, borderTop: '1px solid rgba(255,255,255,0.06)', paddingTop: 12 }}>
|
|
@@ -128,23 +149,32 @@ export default function GalaxyLab() {
|
|
|
128
149
|
<Choice
|
|
129
150
|
value={preset}
|
|
130
151
|
options={[['rings', 'Rings'], ['orbit', 'Orbit'], ['clusters', 'Clusters']]}
|
|
131
|
-
onPick={
|
|
152
|
+
onPick={pickLayout}
|
|
132
153
|
/>
|
|
133
154
|
<div style={{ ...small, marginBottom: 6 }}>
|
|
134
155
|
{preset === 'clusters'
|
|
135
|
-
? '
|
|
156
|
+
? 'As Obsidian draws notes: each connection with a scanned circle is a hub, its circle round it, and everyone sized by their lines. Someone in several circles sits between those hubs, linked to each.'
|
|
136
157
|
: preset === 'orbit'
|
|
137
158
|
? 'Each tier on its own orbit, S nearest you, with each connection’s circle tucked in behind them. Drag a bridge and its circle follows.'
|
|
138
159
|
: 'Drag a dot to see what it pulls with it. Try Rings at 0 and Pull up.'}
|
|
139
160
|
</div>
|
|
140
161
|
|
|
162
|
+
<button onClick={fit} title="Zoom so everyone on the map is on screen" style={{
|
|
163
|
+
width: '100%', padding: '5px 10px', marginBottom: 4, borderRadius: 6, fontSize: 11, fontWeight: 600, cursor: 'pointer',
|
|
164
|
+
border: '1px solid rgba(255,255,255,0.1)', background: 'rgba(255,255,255,0.04)', color: '#aab',
|
|
165
|
+
}}>⤢ Fit everyone on screen</button>
|
|
166
|
+
|
|
141
167
|
<div style={heading}>Forces</div>
|
|
142
168
|
{FORCES.map((f) => <Slider key={f.key} spec={f} value={lab[f.key]} />)}
|
|
169
|
+
<Slider spec={ORBIT_SLIDER} value={lab.orbit} />
|
|
170
|
+
{still && lab.orbit > 0 && (
|
|
171
|
+
<div style={{ ...small, marginTop: -4, marginBottom: 8 }}>Reduce Motion is on in your computer’s settings, so the map holds still.</div>
|
|
172
|
+
)}
|
|
143
173
|
|
|
144
174
|
<div style={heading}>Display</div>
|
|
145
175
|
{DISPLAY.map((f) => <Slider key={f.key} spec={f} value={lab[f.key]} />)}
|
|
146
176
|
<div style={{ fontSize: 11, color: '#aab', marginBottom: 4 }}>Size dots by</div>
|
|
147
|
-
<Choice value={lab.sizeBy} options={[['power', 'Power score'], ['reach', 'Who hangs off them']]} onPick={(v) => setLab({ sizeBy: v })} />
|
|
177
|
+
<Choice value={lab.sizeBy} options={[['power', 'Power score'], ['links', 'Links'], ['reach', 'Who hangs off them']]} onPick={(v) => setLab({ sizeBy: v })} />
|
|
148
178
|
<div style={{ fontSize: 11, color: '#aab', marginBottom: 4 }}>Colour by</div>
|
|
149
179
|
<Choice
|
|
150
180
|
value={lab.colourBy}
|
|
@@ -162,7 +192,8 @@ export default function GalaxyLab() {
|
|
|
162
192
|
</div>
|
|
163
193
|
)}
|
|
164
194
|
<div style={{ fontSize: 11, color: '#aab', marginBottom: 4 }}>Which names{lab.labels ? '' : ' (Names is off)'}</div>
|
|
165
|
-
<Choice value={lab.names === 'all' ? 'all' : 'key'} options={[['key', 'S
|
|
195
|
+
<Choice value={lab.names === 'all' ? 'all' : 'key'} options={[['key', 'Hubs, S, catalysts'], ['all', 'All 1st']]} onPick={(v) => setLab({ names: v })} />
|
|
196
|
+
<div style={{ ...small, marginTop: -4, marginBottom: 8 }}>Zoomed out, only the hubs keep their names.</div>
|
|
166
197
|
<label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 11, color: '#aab', cursor: 'pointer' }}>
|
|
167
198
|
<input type="checkbox" checked={lab.branch} onChange={(e) => setLab({ branch: e.target.checked })} style={{ accentColor: '#3498DB' }} />
|
|
168
199
|
Light up a branch on hover
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { localPhoto } from '../../lib/photos';
|
|
4
|
+
import { TIER_COLORS } from '../../lib/themes';
|
|
4
5
|
|
|
5
|
-
const TIER_COLORS = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
|
|
6
6
|
const TIERS = ['S', 'A', 'B', 'C', 'D'];
|
|
7
7
|
|
|
8
8
|
export default function GridView({ connections, degree2 = [], onSelect, mode }) {
|
|
@@ -25,7 +25,7 @@ export default function GridView({ connections, degree2 = [], onSelect, mode })
|
|
|
25
25
|
}).filter(Boolean).sort((a, b) => (b.sCount * 3 + b.aCount * 2 + b.total) - (a.sCount * 3 + a.aCount * 2 + a.total));
|
|
26
26
|
|
|
27
27
|
return (
|
|
28
|
-
<div style={{ flex: 1, overflow: 'auto', padding: 20, background: '
|
|
28
|
+
<div style={{ flex: 1, overflow: 'auto', padding: 20, background: 'var(--sd-page)' }}>
|
|
29
29
|
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(240px, 1fr))', gap: 12, maxWidth: 1200, margin: '0 auto' }}>
|
|
30
30
|
{clusters.map(cl => (
|
|
31
31
|
<div key={cl.bridge.id} onClick={() => onSelect && onSelect(cl.bridge)}
|
|
@@ -71,7 +71,7 @@ export default function GridView({ connections, degree2 = [], onSelect, mode })
|
|
|
71
71
|
width: 22, height: 22, borderRadius: '50%', fontSize: 8, fontWeight: 700,
|
|
72
72
|
background: localPhoto(m.profile_image_url) ? 'transparent' : (TIER_COLORS[m.tier] || '#333'),
|
|
73
73
|
color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
74
|
-
border: '2px solid
|
|
74
|
+
border: '2px solid var(--sd-bg)', marginLeft: i > 0 ? -6 : 0, position: 'relative', zIndex: 8 - i,
|
|
75
75
|
overflow: 'hidden',
|
|
76
76
|
}}>
|
|
77
77
|
{localPhoto(m.profile_image_url) ? (
|
|
@@ -101,7 +101,7 @@ export default function GridView({ connections, degree2 = [], onSelect, mode })
|
|
|
101
101
|
});
|
|
102
102
|
|
|
103
103
|
return (
|
|
104
|
-
<div style={{ flex: 1, overflow: 'auto', padding: 20, background: '
|
|
104
|
+
<div style={{ flex: 1, overflow: 'auto', padding: 20, background: 'var(--sd-page)' }}>
|
|
105
105
|
<div style={{ maxWidth: 1200, margin: '0 auto' }}>
|
|
106
106
|
{TIERS.map(tier => {
|
|
107
107
|
const people = tierGroups[tier];
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
|
|
9
9
|
import { useState } from 'react';
|
|
10
10
|
import { limitQuestion, limitNote, SAFE_LIMITS } from '../../lib/search-risk';
|
|
11
|
+
import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
|
|
11
12
|
|
|
12
13
|
const LINE = '1px solid rgba(255,255,255,0.1)';
|
|
13
|
-
const TIER =
|
|
14
|
+
const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
|
|
14
15
|
const DAILY = [25, 50, 100, 200, 500];
|
|
15
16
|
const MONTHLY = [100, 250, 500, 1000, 0];
|
|
16
17
|
const PROFILES = [10, 25, 50, 100];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { localPhoto } from '../../lib/photos';
|
|
4
|
+
import { TIER_COLORS } from '../../lib/themes';
|
|
4
5
|
|
|
5
|
-
const TIER_COLORS = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
|
|
6
6
|
|
|
7
7
|
export default function ListView({ connections, degree2 = [], onSelect, mode }) {
|
|
8
8
|
const isDegreesMode = mode === 'degrees';
|
|
@@ -26,7 +26,7 @@ export default function ListView({ connections, degree2 = [], onSelect, mode })
|
|
|
26
26
|
}).filter(Boolean).sort((a, b) => b.value - a.value);
|
|
27
27
|
|
|
28
28
|
return (
|
|
29
|
-
<div style={{ flex: 1, overflow: 'auto', padding: '16px 24px', background: '
|
|
29
|
+
<div style={{ flex: 1, overflow: 'auto', padding: '16px 24px', background: 'var(--sd-page)' }}>
|
|
30
30
|
<div style={{ maxWidth: 800, margin: '0 auto' }}>
|
|
31
31
|
{/* Table header */}
|
|
32
32
|
<div style={{
|
|
@@ -92,7 +92,7 @@ export default function ListView({ connections, degree2 = [], onSelect, mode })
|
|
|
92
92
|
const maxScore = parseFloat(sorted[0]?.power_score) || 10;
|
|
93
93
|
|
|
94
94
|
return (
|
|
95
|
-
<div style={{ flex: 1, overflow: 'auto', padding: '16px 24px', background: '
|
|
95
|
+
<div style={{ flex: 1, overflow: 'auto', padding: '16px 24px', background: 'var(--sd-page)' }}>
|
|
96
96
|
<div style={{ maxWidth: 800, margin: '0 auto' }}>
|
|
97
97
|
{/* Table header */}
|
|
98
98
|
<div style={{
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
import Avatar from './Avatar';
|
|
10
10
|
import { noteSubject } from '../../lib/notifications';
|
|
11
|
+
import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
|
|
11
12
|
|
|
12
|
-
const TIER =
|
|
13
|
+
const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
|
|
13
14
|
const VALUE = {
|
|
14
15
|
S: 'S-tier: one of the most valuable people in your network to know.',
|
|
15
16
|
A: 'A-tier: a strong person to know.',
|
|
@@ -16,8 +16,8 @@ export default function OnboardingGate({ children }) {
|
|
|
16
16
|
return (
|
|
17
17
|
<div style={{
|
|
18
18
|
minHeight: '100vh', display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
19
|
-
background: '
|
|
20
|
-
fontFamily: '-
|
|
19
|
+
background: 'var(--sd-page)', color: '#fff', padding: 24, textAlign: 'center',
|
|
20
|
+
fontFamily: 'var(--sd-font)',
|
|
21
21
|
}}>
|
|
22
22
|
{!ready ? (
|
|
23
23
|
<div style={{ fontSize: 18, fontWeight: 600 }}>Loading…</div>
|
|
@@ -12,8 +12,9 @@ import Link from 'next/link';
|
|
|
12
12
|
import { buildQuest, XP_SEND, STAGE_SIZE } from '../../lib/quest';
|
|
13
13
|
import { initialsFor } from '../../lib/tiers';
|
|
14
14
|
import { localPhoto } from '../../lib/photos';
|
|
15
|
+
import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
|
|
15
16
|
|
|
16
|
-
const TIER =
|
|
17
|
+
const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
|
|
17
18
|
const LINE = '1px solid rgba(255,255,255,0.1)';
|
|
18
19
|
|
|
19
20
|
function Face({ person, size = 36, ring }) {
|
|
@@ -25,8 +25,9 @@ import {
|
|
|
25
25
|
buildCompanyIndex, companyLinks, companyOf, getSeniority, industryOf, industryByKey,
|
|
26
26
|
INDUSTRIES, UNKNOWN_INDUSTRY, waysInto, isSenior,
|
|
27
27
|
} from '../../lib/companies';
|
|
28
|
+
import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
|
|
28
29
|
|
|
29
|
-
const TIER =
|
|
30
|
+
const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
|
|
30
31
|
const LINE = '1px solid rgba(255,255,255,0.1)';
|
|
31
32
|
const MAX_BUBBLES = 140;
|
|
32
33
|
const ALL_INDUSTRIES = [...INDUSTRIES, UNKNOWN_INDUSTRY];
|
|
@@ -88,7 +89,7 @@ export function SidePanel({ open, onToggle, children }) {
|
|
|
88
89
|
return (
|
|
89
90
|
<aside style={{
|
|
90
91
|
width: 300, flexShrink: 0, height: '100%', overflowY: 'auto', boxSizing: 'border-box', padding: '16px 14px',
|
|
91
|
-
borderRight: '1px solid rgba(52,152,219,0.15)', background: '
|
|
92
|
+
borderRight: '1px solid rgba(52,152,219,0.15)', background: 'var(--sd-panel)', fontSize: 13,
|
|
92
93
|
}}>
|
|
93
94
|
<button type="button" onClick={onToggle} style={{
|
|
94
95
|
display: 'flex', alignItems: 'center', gap: 6, width: '100%', marginBottom: 14, padding: '6px 12px', borderRadius: 6, cursor: 'pointer',
|
|
@@ -22,8 +22,9 @@ import { useLivePhysics, HeatDefs, HeatGlow, PHYSICS_OFF } from './MapControls';
|
|
|
22
22
|
import { makeGrid, shows, gridCounts } from '../../lib/tier-grid';
|
|
23
23
|
import { heatBy, heatColour } from '../../lib/galaxy-lab';
|
|
24
24
|
import { clusterStrength } from '../../lib/map-heat';
|
|
25
|
+
import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
|
|
25
26
|
|
|
26
|
-
const TIER =
|
|
27
|
+
const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
|
|
27
28
|
const LINE = '1px solid rgba(255,255,255,0.1)';
|
|
28
29
|
const UNSCANNED = '#3a3f55';
|
|
29
30
|
const MAX_BUBBLES = 400;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { localPhoto } from '../../lib/photos';
|
|
5
|
+
import { TIER_COLORS } from '../../lib/themes';
|
|
5
6
|
|
|
6
|
-
const TIER_COLORS = { S: '#FFD700', A: '#9B59B6', B: '#3498DB', C: '#95A5A6', D: '#BDC3C7' };
|
|
7
7
|
const TIERS = ['S', 'A', 'B', 'C', 'D'];
|
|
8
8
|
|
|
9
9
|
// Pyramid View — S-tier crown at top, tiers cascade down
|
|
@@ -33,7 +33,7 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
|
|
|
33
33
|
const nodeSize = { S: 36, A: 28, B: 22, C: 16, D: 12 };
|
|
34
34
|
|
|
35
35
|
return (
|
|
36
|
-
<div style={{ flex: 1, overflow: 'auto', background: '
|
|
36
|
+
<div style={{ flex: 1, overflow: 'auto', background: 'var(--sd-page)', padding: '20px 10px' }}>
|
|
37
37
|
<div style={{ maxWidth: 1200, margin: '0 auto' }}>
|
|
38
38
|
{clusters.map((cl, ci) => {
|
|
39
39
|
// Group D2 by tier
|
|
@@ -163,7 +163,7 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
|
|
|
163
163
|
const nodeSize = { S: 44, A: 34, B: 26, C: 20, D: 16 };
|
|
164
164
|
|
|
165
165
|
return (
|
|
166
|
-
<div style={{ flex: 1, overflow: 'auto', background: '
|
|
166
|
+
<div style={{ flex: 1, overflow: 'auto', background: 'var(--sd-page)', padding: '20px 10px' }}>
|
|
167
167
|
<div style={{ maxWidth: 1200, margin: '0 auto' }}>
|
|
168
168
|
{TIERS.map((tier, tierIdx) => {
|
|
169
169
|
const people = tierGroups[tier];
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
// Dots along the header's bottom line while a scan runs: one for each page the
|
|
4
|
+
// scanner reads, collecting from the left (Blake, 2026-10-03: "for every page
|
|
5
|
+
// it collects then small dots start collecting on the left side of the line on
|
|
6
|
+
// the lower header line giving that active feel"). The map's own colours, in
|
|
7
|
+
// the order of the name's gradient: gold, purple, blue. The newest one glows;
|
|
8
|
+
// a pulsing seed sits at the start until the first page is in. It's on every
|
|
9
|
+
// tab, since the header is, and a click opens the Scan page.
|
|
10
|
+
//
|
|
11
|
+
// The count comes from the server (app/api/scraper/route.js counts "Page N..."
|
|
12
|
+
// lines, and each fifty of your own connections list), so every tab and window
|
|
13
|
+
// shows the same trail. A few seconds after the scan ends, it fades away.
|
|
14
|
+
|
|
15
|
+
import { useEffect, useRef, useState } from 'react';
|
|
16
|
+
import Link from 'next/link';
|
|
17
|
+
import useScanner from './useScanner';
|
|
18
|
+
|
|
19
|
+
const COLOURS = ['#FFD700', '#9B59B6', '#3498DB'];
|
|
20
|
+
const STEP = 9; // a dot and its gap
|
|
21
|
+
const LINGER_MS = 4000;
|
|
22
|
+
|
|
23
|
+
const CSS = `
|
|
24
|
+
@keyframes trail-in { from { transform: scale(0); opacity: 0; } }
|
|
25
|
+
@keyframes trail-pulse { 0%, 100% { opacity: 0.45; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1.25); } }
|
|
26
|
+
.scan-trail { transition: opacity 1.2s ease; }
|
|
27
|
+
.scan-trail .dot { animation: trail-in 0.35s cubic-bezier(0.2, 0.9, 0.3, 1.3); }
|
|
28
|
+
.scan-trail .dot.newest { box-shadow: 0 0 6px 1px currentColor; }
|
|
29
|
+
.scan-trail .seed { animation: trail-pulse 1.4s ease-in-out infinite; }
|
|
30
|
+
@media (prefers-reduced-motion: reduce) {
|
|
31
|
+
.scan-trail .dot, .scan-trail .seed { animation: none; }
|
|
32
|
+
.scan-trail { transition: none; }
|
|
33
|
+
}`;
|
|
34
|
+
|
|
35
|
+
/** @param {{ inset: number }} props how far in from each side the header's padding puts the line's content */
|
|
36
|
+
export default function ScanTrail({ inset }) {
|
|
37
|
+
const scan = useScanner();
|
|
38
|
+
const boxRef = useRef(null);
|
|
39
|
+
const [room, setRoom] = useState(60);
|
|
40
|
+
// What it last showed, kept on screen a moment after the scan ends: set as
|
|
41
|
+
// the scan's answer changes (during render, as React has it for state that
|
|
42
|
+
// follows a prop), and cleared by a timer once it stops.
|
|
43
|
+
const [shown, setShown] = useState({ on: false, pages: 0, label: '' });
|
|
44
|
+
const live = scan.running && !scan.pending;
|
|
45
|
+
const label = scan.target?.name ? `Scanning ${scan.target.name}` : 'Scanning';
|
|
46
|
+
if (live && (!shown.on || shown.pages !== (scan.pages || 0) || shown.label !== label)) {
|
|
47
|
+
setShown({ on: true, pages: scan.pages || 0, label });
|
|
48
|
+
}
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (live || !shown.on) return undefined;
|
|
51
|
+
const timer = setTimeout(() => setShown((s) => ({ ...s, on: false })), LINGER_MS);
|
|
52
|
+
return () => clearTimeout(timer);
|
|
53
|
+
}, [live, shown.on]);
|
|
54
|
+
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
const el = boxRef.current;
|
|
57
|
+
if (!el) return undefined;
|
|
58
|
+
const ro = new ResizeObserver(() => setRoom(Math.max(8, Math.floor(el.clientWidth / STEP) - 4)));
|
|
59
|
+
ro.observe(el);
|
|
60
|
+
return () => ro.disconnect();
|
|
61
|
+
}, []);
|
|
62
|
+
|
|
63
|
+
const { pages } = shown;
|
|
64
|
+
// As many as fit; past that, the oldest give way and a count says how many more.
|
|
65
|
+
const first = Math.max(0, pages - room);
|
|
66
|
+
const dots = [];
|
|
67
|
+
for (let i = first; i < pages; i++) dots.push(i);
|
|
68
|
+
const title = `${shown.label}: ${pages === 0 ? 'starting' : `${pages.toLocaleString('en-US')} page${pages === 1 ? '' : 's'} read`}. Open the Scan page`;
|
|
69
|
+
return (
|
|
70
|
+
<div ref={boxRef} aria-hidden={!shown.on} style={{ position: 'absolute', left: inset, right: inset, bottom: -4, height: 7, pointerEvents: 'none' }}>
|
|
71
|
+
<style>{CSS}</style>
|
|
72
|
+
<Link href="/setup" title={title} tabIndex={shown.on ? 0 : -1} className="scan-trail" style={{
|
|
73
|
+
position: 'absolute', left: 0, top: 0, height: 7, display: 'flex', alignItems: 'center', gap: STEP - 5,
|
|
74
|
+
pointerEvents: shown.on ? 'auto' : 'none', opacity: shown.on ? 1 : 0, textDecoration: 'none',
|
|
75
|
+
}}>
|
|
76
|
+
{first > 0 && <span style={{ fontSize: 9, fontWeight: 700, color: '#889', marginRight: 2, fontVariantNumeric: 'tabular-nums' }}>+{first.toLocaleString('en-US')}</span>}
|
|
77
|
+
{dots.map((i) => {
|
|
78
|
+
const c = COLOURS[i % COLOURS.length];
|
|
79
|
+
return <span key={i} className={`dot${i === pages - 1 ? ' newest' : ''}`} style={{ width: 5, height: 5, borderRadius: '50%', background: c, color: c, flexShrink: 0 }} />;
|
|
80
|
+
})}
|
|
81
|
+
{shown.on && <span className="seed" style={{ width: 5, height: 5, borderRadius: '50%', background: '#00ff88', flexShrink: 0 }} />}
|
|
82
|
+
</Link>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|