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
|
@@ -38,7 +38,7 @@ import { SETUP_WORK_PREFIX } from './data-folder.js';
|
|
|
38
38
|
* download instead of 104 (on a Mac, stripping saves 0.2 MB).
|
|
39
39
|
*
|
|
40
40
|
* To move to a newer one: take the new release's SHA256SUMS lines for these
|
|
41
|
-
*
|
|
41
|
+
* five names, and each file's size, and change all of them together.
|
|
42
42
|
*/
|
|
43
43
|
export const STANDALONE_PYTHON = Object.freeze({
|
|
44
44
|
release: '20260814',
|
|
@@ -64,6 +64,13 @@ export const STANDALONE_PYTHON = Object.freeze({
|
|
|
64
64
|
sha256: '2d8e17dfd732102cfeb18e0e1fa6769b24caa034e159981129590fe409c7157a',
|
|
65
65
|
size: 29217771,
|
|
66
66
|
}),
|
|
67
|
+
// Windows (DESKTOP.md D3): the desktop app bundles it; its layout differs
|
|
68
|
+
// (python.exe at the top, no bin/), see standalonePython().
|
|
69
|
+
'win32-x64': Object.freeze({
|
|
70
|
+
file: 'cpython-3.12.14+20260814-x86_64-pc-windows-msvc-install_only_stripped.tar.gz',
|
|
71
|
+
sha256: '89f18f6932917163b74339ebcec2645c8e47ae7f1c5f2ac37f2b4f4cf3beb647',
|
|
72
|
+
size: 21976599,
|
|
73
|
+
}),
|
|
67
74
|
}),
|
|
68
75
|
});
|
|
69
76
|
|
|
@@ -77,7 +84,7 @@ export function standaloneUrl(build, pin = STANDALONE_PYTHON) {
|
|
|
77
84
|
|
|
78
85
|
/**
|
|
79
86
|
* This computer, as a key of STANDALONE_PYTHON.builds, or null when there is
|
|
80
|
-
* no
|
|
87
|
+
* no download for it here (Windows, 32-bit, other chips).
|
|
81
88
|
*
|
|
82
89
|
* On a Mac the chip is the hardware's (`hw.optional.arm64`, as install.sh and
|
|
83
90
|
* the updater ask), not this process's: Node running under Rosetta calls itself
|
|
@@ -86,6 +93,8 @@ export function standaloneUrl(build, pin = STANDALONE_PYTHON) {
|
|
|
86
93
|
export function hostKey({ platform = process.platform, arch = process.arch, sysctlArm64 = '' } = {}) {
|
|
87
94
|
if (platform === 'darwin') return `darwin-${chipOf({ sysctlArm64, processArch: arch })}`;
|
|
88
95
|
if (platform === 'linux' && (arch === 'x64' || arch === 'arm64')) return `linux-${arch}`;
|
|
96
|
+
// Windows has a pinned build (the desktop app bundles it, scripts/build-desktop.mjs)
|
|
97
|
+
// but no Set up the scanner yet: that path hasn't been tried there (DESKTOP.md D3).
|
|
89
98
|
return null;
|
|
90
99
|
}
|
|
91
100
|
|
|
@@ -126,6 +135,16 @@ export const SYSTEM_CANDIDATES = Object.freeze([
|
|
|
126
135
|
'python3.14', 'python3.13', 'python3.12', 'python3.11', 'python3.10',
|
|
127
136
|
]);
|
|
128
137
|
|
|
138
|
+
/**
|
|
139
|
+
* On Windows: the `py` launcher first, which finds a real install; `python` and
|
|
140
|
+
* `python3` there are often the Microsoft Store's stand-ins, which open the Store
|
|
141
|
+
* instead of running anything.
|
|
142
|
+
*/
|
|
143
|
+
export const WINDOWS_CANDIDATES = Object.freeze(['py', 'python', 'python3']);
|
|
144
|
+
|
|
145
|
+
/** The names to try on this operating system. */
|
|
146
|
+
export const systemCandidatesFor = (platform = process.platform) => (platform === 'win32' ? WINDOWS_CANDIDATES : SYSTEM_CANDIDATES);
|
|
147
|
+
|
|
129
148
|
/** Is "3.12.4" a Python the pinned packages install into? */
|
|
130
149
|
export function systemPythonFits(version, range = SYSTEM_PYTHON) {
|
|
131
150
|
const m = String(version || '').match(/^(\d+)\.(\d+)/);
|
|
@@ -187,10 +206,14 @@ export function parseProbe(stdout) {
|
|
|
187
206
|
* bundle, which breaks its signature
|
|
188
207
|
* -u unbuffered, which PYTHONUNBUFFERED said before -E: the Scan page shows
|
|
189
208
|
* the scanner's lines as they come
|
|
209
|
+
* -X utf8 UTF-8 for its output whatever the system's code page: on Windows a
|
|
210
|
+
* piped stdout is cp1252, and scrape.py's "→" would end the scan with a
|
|
211
|
+
* UnicodeEncodeError. PYTHONUTF8 can't say it: -E ignores it. Harmless
|
|
212
|
+
* on a Mac or Linux, already UTF-8 there.
|
|
190
213
|
* Not -I: that also takes scrape.py's own folder off the import path, and with
|
|
191
214
|
* it `import image_store`.
|
|
192
215
|
*/
|
|
193
|
-
export const OWN_PYTHON_FLAGS = Object.freeze(['-E', '-s', '-B', '-u']);
|
|
216
|
+
export const OWN_PYTHON_FLAGS = Object.freeze(['-E', '-s', '-B', '-u', '-X', 'utf8']);
|
|
194
217
|
|
|
195
218
|
/**
|
|
196
219
|
* The environment the app's own Python runs with, beside OWN_PYTHON_FLAGS. The
|
|
@@ -205,6 +228,7 @@ export function ownPythonEnv(env = process.env) {
|
|
|
205
228
|
}
|
|
206
229
|
out.PYTHONNOUSERSITE = '1';
|
|
207
230
|
out.PYTHONDONTWRITEBYTECODE = '1';
|
|
231
|
+
out.PYTHONUTF8 = '1'; // for what it starts (-X utf8 is the interpreter's own)
|
|
208
232
|
return out;
|
|
209
233
|
}
|
|
210
234
|
|
|
@@ -216,7 +240,8 @@ export function ownPythonEnv(env = process.env) {
|
|
|
216
240
|
* app that folder is inside the signed app, whichever Python runs the scan.
|
|
217
241
|
*/
|
|
218
242
|
export function noBytecodeEnv(env = process.env) {
|
|
219
|
-
|
|
243
|
+
// And UTF-8 output: on Windows a piped stdout is cp1252 otherwise (OWN_PYTHON_FLAGS).
|
|
244
|
+
return { ...env, PYTHONDONTWRITEBYTECODE: '1', PYTHONUTF8: '1' };
|
|
220
245
|
}
|
|
221
246
|
|
|
222
247
|
/** Is this Python the app's own (choosePython's 'bundled' or 'custom'), run isolated? */
|
|
@@ -321,8 +346,13 @@ export function venvPython(dataDir, platform = process.platform) {
|
|
|
321
346
|
|
|
322
347
|
/** Where "Set up the scanner" puts the standalone Python, and its interpreter. */
|
|
323
348
|
export const DOWNLOADED_DIR = 'python';
|
|
324
|
-
export function downloadedPython(dataDir) {
|
|
325
|
-
return path.join(dataDir, DOWNLOADED_DIR,
|
|
349
|
+
export function downloadedPython(dataDir, platform = process.platform) {
|
|
350
|
+
return standalonePython(path.join(dataDir, DOWNLOADED_DIR), platform);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/** The interpreter inside an unpacked python-build-standalone folder: python.exe at its top on Windows, bin/python3 elsewhere. */
|
|
354
|
+
export function standalonePython(dir, platform = process.platform) {
|
|
355
|
+
return platform === 'win32' ? path.join(dir, 'python.exe') : path.join(dir, 'bin', 'python3');
|
|
326
356
|
}
|
|
327
357
|
|
|
328
358
|
// Private working folders for a setup, inside the data folder (lib/data-folder.js
|
|
@@ -342,7 +372,7 @@ export function runProbe(cmd, args, { timeoutMs = 8000, env } = {}) {
|
|
|
342
372
|
const finish = (value) => { if (!done) { done = true; resolve(value); } };
|
|
343
373
|
let child;
|
|
344
374
|
try {
|
|
345
|
-
child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'], ...(env ? { env } : {}) });
|
|
375
|
+
child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true, ...(env ? { env } : {}) });
|
|
346
376
|
} catch (err) {
|
|
347
377
|
finish({ ok: false, stdout, stderr, problem: err.message });
|
|
348
378
|
return;
|
|
@@ -406,7 +436,7 @@ export async function choosePython({
|
|
|
406
436
|
probe = runProbe,
|
|
407
437
|
exists = fs.existsSync,
|
|
408
438
|
host = null,
|
|
409
|
-
systemCandidates =
|
|
439
|
+
systemCandidates = systemCandidatesFor(),
|
|
410
440
|
timeouts = { own: 20000, other: 8000 },
|
|
411
441
|
env = process.env,
|
|
412
442
|
} = {}) {
|
|
@@ -121,7 +121,7 @@ const QUIET_MS = 5000;
|
|
|
121
121
|
/** Before the first answer, and on the server, where nothing is asked. */
|
|
122
122
|
export const SCANNER_UNKNOWN = Object.freeze({
|
|
123
123
|
known: false, running: false, pending: false, action: null, target: null,
|
|
124
|
-
startedAt: null, progress: null, log: [], finished: [],
|
|
124
|
+
startedAt: null, progress: null, pages: 0, log: [], finished: [],
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
const listeners = new Set();
|
|
@@ -164,6 +164,7 @@ function take(s) {
|
|
|
164
164
|
target: running ? s.target ?? null : starting ? now.target : null,
|
|
165
165
|
startedAt: running ? s.startedAt ?? null : null,
|
|
166
166
|
progress: running ? s.progress ?? null : null,
|
|
167
|
+
pages: running ? Number(s.pages) || 0 : 0, // pages read so far (app/api/scraper/route.js)
|
|
167
168
|
budget: running ? s.budget ?? null : null,
|
|
168
169
|
log: running && Array.isArray(s.log) ? s.log : [],
|
|
169
170
|
finished,
|
|
@@ -253,8 +253,10 @@ const PILL_W_LAYOUT = 236; // SeparationView's PILL_W: the connection pills' w
|
|
|
253
253
|
* @returns {{ width, height, you, people, bridges, links, spokes }}
|
|
254
254
|
*/
|
|
255
255
|
export function summitLayout(top = [], width = 800, isMobile = false, { cards = false } = {}) {
|
|
256
|
-
|
|
257
|
-
|
|
256
|
+
// Cards are 40 px tall and pills 28: rows a few px apart, so ten fit a laptop's
|
|
257
|
+
// window with the slider above them (Blake, 2026-10-03: "too zoomed in" on his MacBook).
|
|
258
|
+
const gap = cards ? 45 : isMobile ? 36 : 26;
|
|
259
|
+
const bridgeGap = cards ? 32 : MIN_BRIDGE_GAP;
|
|
258
260
|
const youX = 20;
|
|
259
261
|
const bx = Math.round(width * 0.42);
|
|
260
262
|
const px = Math.round(width * 0.58);
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// The theme in use, in this browser (lib/themes.js has what a theme is). Read
|
|
2
|
+
// once when the page loads, before anything draws, so the dots, your dot and
|
|
3
|
+
// the map's lines come out in its colours; changed from Settings → Appearance.
|
|
4
|
+
//
|
|
5
|
+
// Kept in localStorage, like the Galaxy's sliders: a look belongs to the
|
|
6
|
+
// screen it's on. The CSS variables are kept beside it, ready made, for the
|
|
7
|
+
// script in app/layout.js that puts them on the page before it paints, so a
|
|
8
|
+
// theme never flashes the standard colours first.
|
|
9
|
+
|
|
10
|
+
import { cleanTheme, resolveTheme, themeVars, themeAttrs, TIER_COLORS, MAP_LOOK } from './themes.js';
|
|
11
|
+
|
|
12
|
+
const KEY = 'six-degrees-theme';
|
|
13
|
+
export const VARS_KEY = 'six-degrees-theme-vars';
|
|
14
|
+
const DEFAULT = Object.freeze({ base: 'standard', custom: {} });
|
|
15
|
+
|
|
16
|
+
const listeners = new Set();
|
|
17
|
+
let choice = DEFAULT;
|
|
18
|
+
|
|
19
|
+
function read() {
|
|
20
|
+
try { return cleanTheme(JSON.parse(localStorage.getItem(KEY) || 'null') || DEFAULT); } catch { return DEFAULT; }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** The dots and the map's look, and the page's variables, for a choice. */
|
|
24
|
+
function apply(next) {
|
|
25
|
+
const theme = resolveTheme(next);
|
|
26
|
+
Object.assign(TIER_COLORS, theme.tiers);
|
|
27
|
+
Object.assign(MAP_LOOK, { you: theme.you, lines: theme.lines, line: theme.line, bg: theme.bg });
|
|
28
|
+
if (typeof document === 'undefined') return;
|
|
29
|
+
const vars = themeVars(next);
|
|
30
|
+
const root = document.documentElement;
|
|
31
|
+
for (const [k, v] of Object.entries(vars)) root.style.setProperty(k, v);
|
|
32
|
+
Object.assign(root.dataset, themeAttrs(next));
|
|
33
|
+
try { localStorage.setItem(VARS_KEY, JSON.stringify({ vars, attrs: themeAttrs(next) })); } catch { /* it's applied anyway */ }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (typeof window !== 'undefined') {
|
|
37
|
+
choice = read();
|
|
38
|
+
apply(choice);
|
|
39
|
+
// Another window changed it.
|
|
40
|
+
window.addEventListener('storage', (e) => {
|
|
41
|
+
if (e.key !== KEY) return;
|
|
42
|
+
choice = read();
|
|
43
|
+
apply(choice);
|
|
44
|
+
listeners.forEach((f) => f());
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const themeNow = () => choice;
|
|
49
|
+
export const serverTheme = () => DEFAULT;
|
|
50
|
+
|
|
51
|
+
export function setTheme(next) {
|
|
52
|
+
choice = cleanTheme(next);
|
|
53
|
+
try { localStorage.setItem(KEY, JSON.stringify(choice)); } catch { /* this visit only */ }
|
|
54
|
+
apply(choice);
|
|
55
|
+
listeners.forEach((f) => f());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function watchTheme(f) {
|
|
59
|
+
listeners.add(f);
|
|
60
|
+
return () => listeners.delete(f);
|
|
61
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Themes: how the app looks, chosen in Settings → Appearance (Blake, 2026-10-03:
|
|
2
|
+
// "2 ways they can edit the back round color, dots about everything you need to
|
|
3
|
+
// have it custom to that person like battle field 4 does but then also have our
|
|
4
|
+
// own custom uis ... obsidian ... google glass ... a super analytical one ...
|
|
5
|
+
// space etc this is for larpers after all").
|
|
6
|
+
//
|
|
7
|
+
// Two ways: a preset (THEMES), or a preset with your own changes on top
|
|
8
|
+
// (`custom`, every field optional). Either comes down to a handful of CSS
|
|
9
|
+
// variables on the page (themeVars), a backdrop the stylesheet draws
|
|
10
|
+
// (app/globals.css, html[data-backdrop]), and the dot colours the map draws with
|
|
11
|
+
// (TIER_COLORS, a live object every view reads).
|
|
12
|
+
//
|
|
13
|
+
// Every theme is dark underneath, so the text, which is light everywhere, reads
|
|
14
|
+
// on all of them: a theme changes what's behind it, not the words.
|
|
15
|
+
//
|
|
16
|
+
// What arrives from storage or a pasted theme code is untrusted: cleanTheme
|
|
17
|
+
// keeps only #rrggbb colours, the listed choices and numbers in range, so
|
|
18
|
+
// nothing else can reach the stylesheet.
|
|
19
|
+
|
|
20
|
+
export const BACKDROPS = ['none', 'stars', 'grid', 'glow', 'horizon'];
|
|
21
|
+
export const FONTS = {
|
|
22
|
+
system: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
23
|
+
rounded: 'ui-rounded, "SF Pro Rounded", "Nunito", -apple-system, BlinkMacSystemFont, sans-serif',
|
|
24
|
+
mono: 'ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace',
|
|
25
|
+
serif: 'ui-serif, "New York", Georgia, "Times New Roman", serif',
|
|
26
|
+
};
|
|
27
|
+
export const LINE_MODES = ['tier', 'one'];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* A theme. `bg` is the colour behind everything, `bg2` the second colour of its
|
|
31
|
+
* backdrop, `panel` the side panels' tint and `glass` how see-through and
|
|
32
|
+
* blurred they are (0 solid, 1 frosted glass). `tiers` are the dots, `you` your
|
|
33
|
+
* own dot, `lines` how the map's lines are coloured ('tier', as the person they
|
|
34
|
+
* lead to, or 'one', all `line`).
|
|
35
|
+
*/
|
|
36
|
+
export const STANDARD = Object.freeze({
|
|
37
|
+
id: 'standard', name: 'Standard', blurb: 'The original: deep navy, gold, purple and blue.',
|
|
38
|
+
bg: '#0a0a1a', bg2: '#1a1440', backdrop: 'none', panel: '#0a0f1e', glass: 0.35, accent: '#3498db',
|
|
39
|
+
tiers: Object.freeze({ S: '#ffd700', A: '#9b59b6', B: '#3498db', C: '#95a5a6', D: '#bdc3c7' }),
|
|
40
|
+
you: '#ffffff', lines: 'tier', line: '#5a6274', font: 'system',
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export const THEMES = Object.freeze([
|
|
44
|
+
STANDARD,
|
|
45
|
+
Object.freeze({
|
|
46
|
+
id: 'contrast', name: 'High contrast', blurb: 'Pure black, the brightest dots, solid panels. Easiest to read.',
|
|
47
|
+
bg: '#000000', bg2: '#000000', backdrop: 'none', panel: '#000000', glass: 0, accent: '#4cc9f0',
|
|
48
|
+
tiers: Object.freeze({ S: '#ffe500', A: '#d08bff', B: '#4cc9f0', C: '#e6e6e6', D: '#ffffff' }),
|
|
49
|
+
you: '#ffffff', lines: 'tier', line: '#8a8a8a', font: 'system',
|
|
50
|
+
}),
|
|
51
|
+
Object.freeze({
|
|
52
|
+
id: 'obsidian', name: 'Obsidian', blurb: 'Graphite and violet, grey links: the note-taking app’s graph.',
|
|
53
|
+
bg: '#1e1e1e', bg2: '#262626', backdrop: 'none', panel: '#262626', glass: 0.1, accent: '#8a7cf7',
|
|
54
|
+
tiers: Object.freeze({ S: '#e0c25a', A: '#a88bfa', B: '#7aa2f7', C: '#9aa0a6', D: '#c7c7c7' }),
|
|
55
|
+
you: '#a88bfa', lines: 'one', line: '#5c5c5c', font: 'system',
|
|
56
|
+
}),
|
|
57
|
+
Object.freeze({
|
|
58
|
+
id: 'glass', name: 'Glass', blurb: 'Frosted panels over slow colour: a heads-up display, see-through.',
|
|
59
|
+
bg: '#0b1020', bg2: '#5b21b6', backdrop: 'glow', panel: '#ffffff', glass: 0.9, accent: '#7dd3fc',
|
|
60
|
+
tiers: Object.freeze({ S: '#fde68a', A: '#f0abfc', B: '#7dd3fc', C: '#cbd5e1', D: '#e2e8f0' }),
|
|
61
|
+
you: '#ffffff', lines: 'tier', line: '#94a3b8', font: 'rounded',
|
|
62
|
+
}),
|
|
63
|
+
Object.freeze({
|
|
64
|
+
id: 'analyst', name: 'Analyst', blurb: 'A data terminal: a grid, monospace, colour-blind-safe dots.',
|
|
65
|
+
bg: '#0d1117', bg2: '#161b22', backdrop: 'grid', panel: '#161b22', glass: 0, accent: '#58a6ff',
|
|
66
|
+
tiers: Object.freeze({ S: '#e69f00', A: '#cc79a7', B: '#56b4e9', C: '#009e73', D: '#8b949e' }),
|
|
67
|
+
you: '#f0f6fc', lines: 'one', line: '#30363d', font: 'mono',
|
|
68
|
+
}),
|
|
69
|
+
Object.freeze({
|
|
70
|
+
id: 'space', name: 'Space', blurb: 'Your network as a star chart: deep black, a nebula, stars behind it all.',
|
|
71
|
+
bg: '#04050d', bg2: '#2b1055', backdrop: 'stars', panel: '#0b0d1f', glass: 0.5, accent: '#a78bfa',
|
|
72
|
+
tiers: Object.freeze({ S: '#ffd166', A: '#c77dff', B: '#4cc9f0', C: '#adb5bd', D: '#6c757d' }),
|
|
73
|
+
you: '#ffffff', lines: 'tier', line: '#3a3f5c', font: 'system',
|
|
74
|
+
}),
|
|
75
|
+
Object.freeze({
|
|
76
|
+
id: 'synthwave', name: 'Synthwave', blurb: 'Neon on a purple horizon. For the larpers.',
|
|
77
|
+
bg: '#1a0b2e', bg2: '#ff2a6d', backdrop: 'horizon', panel: '#24103f', glass: 0.4, accent: '#ff2a6d',
|
|
78
|
+
tiers: Object.freeze({ S: '#ffe66d', A: '#ff2a6d', B: '#05d9e8', C: '#d1f7ff', D: '#8c7aa9' }),
|
|
79
|
+
you: '#ffffff', lines: 'tier', line: '#7a3b9e', font: 'rounded',
|
|
80
|
+
}),
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
const HEX = /^#[0-9a-f]{6}$/;
|
|
84
|
+
const colour = (v) => {
|
|
85
|
+
const s = String(v ?? '').trim().toLowerCase();
|
|
86
|
+
const short = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(s);
|
|
87
|
+
const full = short ? `#${short[1]}${short[1]}${short[2]}${short[2]}${short[3]}${short[3]}` : s;
|
|
88
|
+
return HEX.test(full) ? full : null;
|
|
89
|
+
};
|
|
90
|
+
const COLOUR_KEYS = ['bg', 'bg2', 'panel', 'accent', 'you', 'line'];
|
|
91
|
+
export const TIER_KEYS = ['S', 'A', 'B', 'C', 'D'];
|
|
92
|
+
|
|
93
|
+
export const presetOf = (id) => THEMES.find((t) => t.id === id) || STANDARD;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* A saved or pasted choice made safe: { base, custom }, where custom holds only
|
|
97
|
+
* the fields that are valid and differ from nothing in particular (they are
|
|
98
|
+
* your changes, kept as you made them).
|
|
99
|
+
*/
|
|
100
|
+
export function cleanTheme(raw) {
|
|
101
|
+
const base = presetOf(raw?.base).id;
|
|
102
|
+
const c = raw?.custom && typeof raw.custom === 'object' ? raw.custom : {};
|
|
103
|
+
const custom = {};
|
|
104
|
+
for (const k of COLOUR_KEYS) { const v = colour(c[k]); if (v) custom[k] = v; }
|
|
105
|
+
if (c.tiers && typeof c.tiers === 'object') {
|
|
106
|
+
const tiers = {};
|
|
107
|
+
for (const t of TIER_KEYS) { const v = colour(c.tiers[t]); if (v) tiers[t] = v; }
|
|
108
|
+
if (Object.keys(tiers).length) custom.tiers = tiers;
|
|
109
|
+
}
|
|
110
|
+
if (BACKDROPS.includes(c.backdrop)) custom.backdrop = c.backdrop;
|
|
111
|
+
if (Object.hasOwn(FONTS, c.font ?? '')) custom.font = c.font;
|
|
112
|
+
if (LINE_MODES.includes(c.lines)) custom.lines = c.lines;
|
|
113
|
+
const glass = Number(c.glass);
|
|
114
|
+
if (c.glass != null && Number.isFinite(glass)) custom.glass = Math.round(Math.min(1, Math.max(0, glass)) * 100) / 100;
|
|
115
|
+
return { base, custom };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The theme a choice comes to: its preset with your changes on top. */
|
|
119
|
+
export function resolveTheme(choice) {
|
|
120
|
+
const { base, custom } = cleanTheme(choice);
|
|
121
|
+
const preset = presetOf(base);
|
|
122
|
+
return {
|
|
123
|
+
...preset,
|
|
124
|
+
...custom,
|
|
125
|
+
tiers: { ...preset.tiers, ...(custom.tiers || {}) },
|
|
126
|
+
id: base,
|
|
127
|
+
customised: Object.keys(custom).length > 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const rgb = (hex) => [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16));
|
|
132
|
+
const rgba = (hex, a) => `rgba(${rgb(hex).join(', ')}, ${a})`;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* The CSS variables a choice sets on the page. Every value is built here from
|
|
136
|
+
* cleaned colours and numbers, never copied from what was saved.
|
|
137
|
+
*/
|
|
138
|
+
export function themeVars(choice) {
|
|
139
|
+
const t = resolveTheme(choice);
|
|
140
|
+
const glass = Math.min(1, Math.max(0, Number(t.glass) || 0));
|
|
141
|
+
return {
|
|
142
|
+
'--sd-bg': t.bg,
|
|
143
|
+
'--sd-bg2': t.bg2,
|
|
144
|
+
'--sd-accent': t.accent,
|
|
145
|
+
// The side panels: the theme's tint, more see-through and more blurred the more glass.
|
|
146
|
+
'--sd-panel': rgba(t.panel, Math.round((0.92 - 0.82 * glass) * 100) / 100),
|
|
147
|
+
'--sd-panel-blur': `blur(${Math.round(8 + 28 * glass)}px) saturate(${(1 + 0.6 * glass).toFixed(2)})`,
|
|
148
|
+
// The header: clear, or frosted on a glass theme.
|
|
149
|
+
'--sd-header': glass >= 0.6 ? rgba(t.panel, 0.06) : 'transparent',
|
|
150
|
+
'--sd-header-blur': glass >= 0.6 ? 'blur(18px) saturate(1.4)' : 'none',
|
|
151
|
+
'--sd-font': FONTS[t.font] || FONTS.system,
|
|
152
|
+
'--sd-tier-s': t.tiers.S, '--sd-tier-a': t.tiers.A, '--sd-tier-b': t.tiers.B, '--sd-tier-c': t.tiers.C, '--sd-tier-d': t.tiers.D,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** What the html element carries for the stylesheet: the theme and its backdrop. */
|
|
157
|
+
export function themeAttrs(choice) {
|
|
158
|
+
const t = resolveTheme(choice);
|
|
159
|
+
return { theme: t.id, backdrop: t.backdrop };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// A theme code to share: the choice as base64 JSON, behind a short prefix.
|
|
163
|
+
const PREFIX = 'sd-theme:';
|
|
164
|
+
export function encodeTheme(choice) {
|
|
165
|
+
const json = JSON.stringify(cleanTheme(choice));
|
|
166
|
+
const b64 = typeof btoa === 'function' ? btoa(json) : Buffer.from(json, 'utf8').toString('base64');
|
|
167
|
+
return PREFIX + b64;
|
|
168
|
+
}
|
|
169
|
+
/** A pasted code, cleaned; null if it isn't one. */
|
|
170
|
+
export function decodeTheme(code) {
|
|
171
|
+
const s = String(code || '').trim();
|
|
172
|
+
if (!s.startsWith(PREFIX) || s.length > 2000) return null;
|
|
173
|
+
try {
|
|
174
|
+
const b64 = s.slice(PREFIX.length);
|
|
175
|
+
const json = typeof atob === 'function' ? atob(b64) : Buffer.from(b64, 'base64').toString('utf8');
|
|
176
|
+
const raw = JSON.parse(json);
|
|
177
|
+
return raw && typeof raw === 'object' ? cleanTheme(raw) : null;
|
|
178
|
+
} catch { return null; }
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// The dot colours every view draws with: one object, filled from the theme in
|
|
182
|
+
// use before anything draws (lib/theme-store.js), so the many views that read
|
|
183
|
+
// it stay as they are. On the server it holds Standard's.
|
|
184
|
+
export const TIER_COLORS = { ...STANDARD.tiers };
|
|
185
|
+
// The rest of what the map draws from a theme: your dot, and its lines.
|
|
186
|
+
export const MAP_LOOK = { you: STANDARD.you, lines: STANDARD.lines, line: STANDARD.line, bg: STANDARD.bg };
|
|
@@ -15,14 +15,8 @@ export const TIER_COLORS = {
|
|
|
15
15
|
D: '#6b7280',
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
/** The palette
|
|
19
|
-
export
|
|
20
|
-
S: '#FFD700',
|
|
21
|
-
A: '#9B59B6',
|
|
22
|
-
B: '#3498DB',
|
|
23
|
-
C: '#95A5A6',
|
|
24
|
-
D: '#BDC3C7',
|
|
25
|
-
};
|
|
18
|
+
/** The palette most views use: the theme's dot colours (lib/themes.js), Standard's to begin with. */
|
|
19
|
+
export { TIER_COLORS as TIER_COLORS_CLASSIC } from './themes.js';
|
|
26
20
|
|
|
27
21
|
export const TIER_LABELS = {
|
|
28
22
|
S: 'S · Highest leverage',
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "six-degrees",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "six-degrees",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.6.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"os": [
|
|
12
12
|
"darwin",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "six-degrees",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Map your professional network as a galaxy — leverage tiers, bridges into new circles, and the shortest path to anyone. Runs locally on your own data.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Blake Burford",
|
|
@@ -53,12 +53,12 @@
|
|
|
53
53
|
"scripts/update.mjs"
|
|
54
54
|
],
|
|
55
55
|
"scripts": {
|
|
56
|
-
"dev": "
|
|
56
|
+
"dev": "node scripts/next.mjs dev -H 127.0.0.1",
|
|
57
57
|
"predev": "node scripts/check-node.mjs && node scripts/check-stale-server.mjs",
|
|
58
58
|
"fresh": "node scripts/check-node.mjs && node scripts/sandbox.mjs",
|
|
59
|
-
"build": "
|
|
59
|
+
"build": "node scripts/next.mjs build && node scripts/prepare-standalone.mjs",
|
|
60
60
|
"prebuild": "node scripts/check-node.mjs",
|
|
61
|
-
"start": "
|
|
61
|
+
"start": "node scripts/next.mjs start -H 127.0.0.1",
|
|
62
62
|
"lint": "eslint",
|
|
63
63
|
"test": "node --test tests/*.test.mjs",
|
|
64
64
|
"gen:demo": "node scripts/gen-synthetic.mjs",
|