six-degrees 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +3 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +14 -14
  5. package/.next/standalone/.next/routes-manifest.json +18 -0
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  12. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.rsc +26 -18
  16. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +26 -18
  17. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +25 -16
  18. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  19. package/.next/standalone/.next/server/app/api/admin-delete/route.js +2 -2
  20. package/.next/standalone/.next/server/app/api/admin-delete/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/admin-update/route.js +2 -2
  22. package/.next/standalone/.next/server/app/api/admin-update/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/bridges/route.js +2 -2
  24. package/.next/standalone/.next/server/app/api/bridges/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/bulk-import/route.js +2 -2
  26. package/.next/standalone/.next/server/app/api/bulk-import/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js +3 -3
  28. package/.next/standalone/.next/server/app/api/company-scores/legacy/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/company-scores/route.js +3 -3
  30. package/.next/standalone/.next/server/app/api/company-scores/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/connections/route.js +2 -2
  32. package/.next/standalone/.next/server/app/api/connections/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/data/backup/route/app-paths-manifest.json +3 -0
  34. package/.next/standalone/.next/server/app/api/data/backup/route/build-manifest.json +12 -0
  35. package/.next/standalone/.next/server/app/api/data/backup/route/server-reference-manifest.json +4 -0
  36. package/.next/standalone/.next/server/app/api/data/backup/route.js +7 -0
  37. package/.next/standalone/.next/server/app/api/data/backup/route.js.map +5 -0
  38. package/.next/standalone/.next/server/app/api/data/backup/route.js.nft.json +1 -0
  39. package/.next/standalone/.next/server/app/api/data/backup/route_client-reference-manifest.js +3 -0
  40. package/.next/standalone/.next/server/app/api/data/csv/route/app-paths-manifest.json +3 -0
  41. package/.next/standalone/.next/server/app/api/data/csv/route/build-manifest.json +12 -0
  42. package/.next/standalone/.next/server/app/api/data/csv/route/server-reference-manifest.json +4 -0
  43. package/.next/standalone/.next/server/app/api/data/csv/route.js +8 -0
  44. package/.next/standalone/.next/server/app/api/data/csv/route.js.map +5 -0
  45. package/.next/standalone/.next/server/app/api/data/csv/route.js.nft.json +1 -0
  46. package/.next/standalone/.next/server/app/api/data/csv/route_client-reference-manifest.js +3 -0
  47. package/.next/standalone/.next/server/app/api/data/export/route.js +1 -1
  48. package/.next/standalone/.next/server/app/api/data/export/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/data/import/route.js +1 -1
  50. package/.next/standalone/.next/server/app/api/data/import/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/data/restart/route.js +1 -1
  52. package/.next/standalone/.next/server/app/api/data/restart/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/data/restore/route/app-paths-manifest.json +3 -0
  54. package/.next/standalone/.next/server/app/api/data/restore/route/build-manifest.json +12 -0
  55. package/.next/standalone/.next/server/app/api/data/restore/route/server-reference-manifest.json +4 -0
  56. package/.next/standalone/.next/server/app/api/data/restore/route.js +7 -0
  57. package/.next/standalone/.next/server/app/api/data/restore/route.js.map +5 -0
  58. package/.next/standalone/.next/server/app/api/data/restore/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/data/restore/route_client-reference-manifest.js +3 -0
  60. package/.next/standalone/.next/server/app/api/data/reveal/route.js +1 -1
  61. package/.next/standalone/.next/server/app/api/data/reveal/route.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/api/data/route.js +1 -1
  63. package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/delete-cluster/route.js +2 -2
  65. package/.next/standalone/.next/server/app/api/delete-cluster/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/ingest/route.js +2 -2
  67. package/.next/standalone/.next/server/app/api/ingest/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/network/route.js +2 -2
  69. package/.next/standalone/.next/server/app/api/network/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/notifications/route.js +2 -2
  71. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/outreach/route.js +2 -2
  73. package/.next/standalone/.next/server/app/api/outreach/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/queue/route.js +2 -2
  75. package/.next/standalone/.next/server/app/api/queue/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/scraper/route.js +4 -2
  77. package/.next/standalone/.next/server/app/api/scraper/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/settings/route.js +3 -3
  79. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js +3 -3
  81. package/.next/standalone/.next/server/app/api/settings/sector-preview/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js +3 -3
  83. package/.next/standalone/.next/server/app/api/settings/sector-suggestions/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/setup-profile/route.js +2 -2
  85. package/.next/standalone/.next/server/app/api/setup-profile/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/social/crm/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/social/crm/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/social/messages/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/social/messages/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/social/route.js +2 -2
  91. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/unlock/route.js +2 -2
  93. package/.next/standalone/.next/server/app/api/unlock/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/update/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/update-images/route.js +2 -2
  96. package/.next/standalone/.next/server/app/api/update-images/route.js.nft.json +1 -1
  97. package/.next/standalone/.next/server/app/api/users/route.js +2 -2
  98. package/.next/standalone/.next/server/app/api/users/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/avatars/[file]/route.js +1 -1
  100. package/.next/standalone/.next/server/app/avatars/[file]/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/import/page.js +1 -1
  102. package/.next/standalone/.next/server/app/import/page.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/import/page_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/import.html +1 -1
  105. package/.next/standalone/.next/server/app/import.rsc +32 -24
  106. package/.next/standalone/.next/server/app/import.segments/_full.segment.rsc +32 -24
  107. package/.next/standalone/.next/server/app/import.segments/_tree.segment.rsc +2 -2
  108. package/.next/standalone/.next/server/app/import.segments/import/__PAGE__.segment.rsc +23 -18
  109. package/.next/standalone/.next/server/app/index.html +1 -1
  110. package/.next/standalone/.next/server/app/index.rsc +29 -22
  111. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +20 -15
  112. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +29 -22
  113. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  114. package/.next/standalone/.next/server/app/launch/page.js +1 -1
  115. package/.next/standalone/.next/server/app/launch/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/launch/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/launch.html +2 -2
  118. package/.next/standalone/.next/server/app/launch.rsc +32 -24
  119. package/.next/standalone/.next/server/app/launch.segments/_full.segment.rsc +32 -24
  120. package/.next/standalone/.next/server/app/launch.segments/_tree.segment.rsc +2 -2
  121. package/.next/standalone/.next/server/app/launch.segments/launch/__PAGE__.segment.rsc +23 -18
  122. package/.next/standalone/.next/server/app/page.js +1 -1
  123. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/paths/page.js +1 -1
  126. package/.next/standalone/.next/server/app/paths/page.js.nft.json +1 -1
  127. package/.next/standalone/.next/server/app/paths/page_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/paths.html +1 -1
  129. package/.next/standalone/.next/server/app/paths.rsc +32 -24
  130. package/.next/standalone/.next/server/app/paths.segments/_full.segment.rsc +32 -24
  131. package/.next/standalone/.next/server/app/paths.segments/_tree.segment.rsc +2 -2
  132. package/.next/standalone/.next/server/app/paths.segments/paths/__PAGE__.segment.rsc +21 -18
  133. package/.next/standalone/.next/server/app/profile/page.js +1 -1
  134. package/.next/standalone/.next/server/app/profile/page.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/profile/page_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/profile.html +1 -1
  137. package/.next/standalone/.next/server/app/profile.rsc +32 -24
  138. package/.next/standalone/.next/server/app/profile.segments/_full.segment.rsc +32 -24
  139. package/.next/standalone/.next/server/app/profile.segments/_tree.segment.rsc +2 -2
  140. package/.next/standalone/.next/server/app/profile.segments/profile/__PAGE__.segment.rsc +23 -18
  141. package/.next/standalone/.next/server/app/queue/page.js +1 -1
  142. package/.next/standalone/.next/server/app/queue/page.js.nft.json +1 -1
  143. package/.next/standalone/.next/server/app/queue/page_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/queue.html +1 -1
  145. package/.next/standalone/.next/server/app/queue.rsc +32 -24
  146. package/.next/standalone/.next/server/app/queue.segments/_full.segment.rsc +32 -24
  147. package/.next/standalone/.next/server/app/queue.segments/_tree.segment.rsc +2 -2
  148. package/.next/standalone/.next/server/app/queue.segments/queue/__PAGE__.segment.rsc +20 -18
  149. package/.next/standalone/.next/server/app/scores/page.js +1 -1
  150. package/.next/standalone/.next/server/app/scores/page.js.nft.json +1 -1
  151. package/.next/standalone/.next/server/app/scores/page_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/scores.html +1 -1
  153. package/.next/standalone/.next/server/app/scores.rsc +32 -24
  154. package/.next/standalone/.next/server/app/scores.segments/_full.segment.rsc +32 -24
  155. package/.next/standalone/.next/server/app/scores.segments/_tree.segment.rsc +2 -2
  156. package/.next/standalone/.next/server/app/scores.segments/scores/__PAGE__.segment.rsc +23 -18
  157. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  158. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  159. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/settings.html +1 -1
  161. package/.next/standalone/.next/server/app/settings.rsc +32 -24
  162. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +32 -24
  163. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  164. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +20 -18
  165. package/.next/standalone/.next/server/app/setup/page.js +1 -1
  166. package/.next/standalone/.next/server/app/setup/page.js.nft.json +1 -1
  167. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/setup.html +1 -1
  169. package/.next/standalone/.next/server/app/setup.rsc +32 -24
  170. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +32 -24
  171. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  172. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +21 -18
  173. package/.next/standalone/.next/server/app/social/page.js +1 -1
  174. package/.next/standalone/.next/server/app/social/page.js.nft.json +1 -1
  175. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/social.html +1 -1
  177. package/.next/standalone/.next/server/app/social.rsc +32 -24
  178. package/.next/standalone/.next/server/app/social.segments/_full.segment.rsc +32 -24
  179. package/.next/standalone/.next/server/app/social.segments/_tree.segment.rsc +2 -2
  180. package/.next/standalone/.next/server/app/social.segments/social/__PAGE__.segment.rsc +23 -18
  181. package/.next/standalone/.next/server/app-paths-manifest.json +3 -0
  182. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00la_y0._.js +1 -1
  183. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05_3-22._.js +1 -1
  184. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__15wc9e-._.js → [root-of-the-server]__063s0x7._.js} +2 -2
  185. package/.next/standalone/.next/server/chunks/[root-of-the-server]__066rab1._.js +7 -0
  186. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07t47cm._.js +1 -1
  187. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__13dx4sd._.js → [root-of-the-server]__0_4y8z7._.js} +3 -3
  188. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cj5jqc._.js +1 -1
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e0fei3._.js +1 -1
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fooke1._.js +7 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljnyho._.js +1 -1
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o5-tcg._.js +1 -1
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qrnous._.js +1 -1
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t3v1a1._.js +1 -1
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t6y79e._.js +7 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wmexuc._.js +1 -1
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x29muh._.js +7 -0
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xu34sz._.js +1 -1
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__133knx1._.js +1 -1
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__15-17hl._.js +1 -1
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19b7mig._.js +1 -1
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1a_6x37._.js +8 -0
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1an_8pa._.js +7 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1bbcwub._.js +1 -1
  205. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ducpz2._.js +3 -0
  206. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1eris29._.js +1 -1
  207. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1gjo_cq._.js +1 -1
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qcm08_._.js +1 -1
  209. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tir0vc._.js +1 -1
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1w25q0m._.js +1 -1
  211. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xhyinn._.js +3 -0
  212. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20rwfdw._.js +1 -1
  213. package/.next/standalone/.next/server/chunks/_02twlca._.js +1 -1
  214. package/.next/standalone/.next/server/chunks/_072jl0y._.js +1 -1
  215. package/.next/standalone/.next/server/chunks/_0lw8_i0._.js +1 -1
  216. package/.next/standalone/.next/server/chunks/_0sqqpzb._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/_1_fynia._.js +7 -7
  218. package/.next/standalone/.next/server/chunks/_1fn30_l._.js +1 -1
  219. package/.next/standalone/.next/server/chunks/_1itd1o_._.js +1 -1
  220. package/.next/standalone/.next/server/chunks/_1iwkh8t._.js +1 -1
  221. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_backup_route_actions_0zoj04p.js +3 -0
  222. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_csv_route_actions_0l6m7lg.js +3 -0
  223. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_data_restore_route_actions_0-b05bv.js +3 -0
  224. package/.next/standalone/.next/server/chunks/lib_02iz_9q._.js +4 -0
  225. package/.next/standalone/.next/server/chunks/lib_05agvk3._.js +4 -0
  226. package/.next/standalone/.next/server/chunks/lib_0v84u66._.js +4 -0
  227. package/.next/standalone/.next/server/chunks/lib_db-client_0_dch35.js +174 -0
  228. package/.next/standalone/.next/server/chunks/lib_linkedin-export_12imqxg.js +1 -1
  229. package/.next/standalone/.next/server/chunks/lib_rpc_005abye.js +3 -0
  230. package/.next/standalone/.next/server/chunks/lib_rpc_0b17r6v.js +3 -0
  231. package/.next/standalone/.next/server/chunks/lib_rpc_0c9d9ti.js +7 -0
  232. package/.next/standalone/.next/server/chunks/lib_rpc_0doq0t-.js +3 -0
  233. package/.next/standalone/.next/server/chunks/lib_rpc_0fd2rlw.js +3 -0
  234. package/.next/standalone/.next/server/chunks/lib_rpc_0is4qoc.js +3 -0
  235. package/.next/standalone/.next/server/chunks/lib_rpc_0jnfp2e.js +3 -0
  236. package/.next/standalone/.next/server/chunks/lib_rpc_0nef_n7.js +3 -0
  237. package/.next/standalone/.next/server/chunks/lib_rpc_0plrzra.js +3 -0
  238. package/.next/standalone/.next/server/chunks/lib_rpc_13a4m0c.js +3 -0
  239. package/.next/standalone/.next/server/chunks/lib_rpc_1if17c-.js +3 -0
  240. package/.next/standalone/.next/server/chunks/lib_rpc_1j-zw7v.js +3 -0
  241. package/.next/standalone/.next/server/chunks/lib_rpc_1sngt-q.js +3 -0
  242. package/.next/standalone/.next/server/chunks/lib_rpc_1v2sgme.js +3 -0
  243. package/.next/standalone/.next/server/chunks/lib_rpc_1vh-tgx.js +3 -0
  244. package/.next/standalone/.next/server/chunks/lib_rpc_1zaubz7.js +3 -0
  245. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qd8pzm._.js +3 -0
  246. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qdeuyo._.js → [root-of-the-server]__1-012q1._.js} +2 -2
  247. package/.next/standalone/.next/server/chunks/ssr/_01o3i5y._.js +7 -0
  248. package/.next/standalone/.next/server/chunks/ssr/_02sband._.js +7 -0
  249. package/.next/standalone/.next/server/chunks/ssr/_06rgzfh._.js +3 -0
  250. package/.next/standalone/.next/server/chunks/ssr/_07zb7lu._.js +3 -0
  251. package/.next/standalone/.next/server/chunks/ssr/_0_79idq._.js +3 -0
  252. package/.next/standalone/.next/server/chunks/ssr/_0gy11ar._.js +3 -0
  253. package/.next/standalone/.next/server/chunks/ssr/_0hb-dhy._.js +3 -0
  254. package/.next/standalone/.next/server/chunks/ssr/_14nxd3q._.js +3 -0
  255. package/.next/standalone/.next/server/chunks/ssr/_189g8lg._.js +3 -0
  256. package/.next/standalone/.next/server/chunks/ssr/_1f_n00p._.js +1 -1
  257. package/.next/standalone/.next/server/chunks/ssr/_1fm1ih_._.js +2 -2
  258. package/.next/standalone/.next/server/chunks/ssr/_1k2nmbw._.js +2 -2
  259. package/.next/standalone/.next/server/chunks/ssr/_1k9qfsk._.js +3 -0
  260. package/.next/standalone/.next/server/chunks/ssr/app_141w189._.js +1 -1
  261. package/.next/standalone/.next/server/chunks/ssr/app_components_0t908t-._.js +1 -1
  262. package/.next/standalone/.next/server/chunks/ssr/app_components_0uuff77._.js +25 -2
  263. package/.next/standalone/.next/server/chunks/ssr/app_components_1j3q-h5._.js +25 -2
  264. package/.next/standalone/.next/server/chunks/ssr/app_components_CompanyScores_1g0mytz.js +1 -1
  265. package/.next/standalone/.next/server/chunks/ssr/app_import_page_1fmu6_l.js +1 -1
  266. package/.next/standalone/.next/server/chunks/ssr/app_launch_page_19t0dyd.js +1 -1
  267. package/.next/standalone/.next/server/chunks/ssr/app_page_1fazqbf.js +25 -13
  268. package/.next/standalone/.next/server/chunks/ssr/app_paths_page_1ol90m7.js +2 -2
  269. package/.next/standalone/.next/server/chunks/ssr/app_profile_page_0u3-l5y.js +1 -1
  270. package/.next/standalone/.next/server/chunks/ssr/app_queue_page_0c6znd6.js +11 -11
  271. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_1f8mjj_.js +1 -1
  272. package/.next/standalone/.next/server/chunks/ssr/app_setup_page_1-282zx.js +12 -13
  273. package/.next/standalone/.next/server/chunks/ssr/app_social_page_0h7zxda.js +1 -1
  274. package/.next/standalone/.next/server/chunks/ssr/{lib_1c4ieuw._.js → lib_csv_1ttiu_h.js} +2 -2
  275. package/.next/standalone/.next/server/chunks/ssr/lib_galaxy-lab_108_lu-.js +1 -1
  276. package/.next/standalone/.next/server/chunks/ssr/lib_separation_1305zsx.js +3 -0
  277. package/.next/standalone/.next/server/edge/chunks/[root-of-the-server]__0pco7a6._.js +1 -1
  278. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  279. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  280. package/.next/standalone/.next/server/pages/404.html +1 -1
  281. package/.next/standalone/.next/server/pages/500.html +1 -1
  282. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/standalone/.next/static/chunks/03-_esd2x_yk6.js +1 -0
  285. package/.next/standalone/.next/static/chunks/03-demj2iy-0p.js +44 -0
  286. package/.next/standalone/.next/static/chunks/0_1r-3csplxnj.js +1 -0
  287. package/.next/standalone/.next/static/chunks/0an_b6zi1r_qq.js +5 -0
  288. package/.next/standalone/.next/static/chunks/0e3g0sil79cus.js +21 -0
  289. package/.next/standalone/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
  290. package/.next/standalone/.next/static/chunks/0p3g5tfostsep.js +7 -0
  291. package/.next/standalone/.next/static/chunks/0zd0t7e60bn4z.js +1 -0
  292. package/.next/standalone/.next/static/chunks/163b-20vwa06i.js +34 -0
  293. package/.next/standalone/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
  294. package/.next/standalone/.next/static/chunks/1pa-2v1ajvrko.js +1 -0
  295. package/.next/standalone/.next/static/chunks/1qbjermbf68xj.js +1 -0
  296. package/.next/standalone/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
  297. package/.next/standalone/.next/static/chunks/23_1z47al92nz.js +57 -0
  298. package/.next/standalone/.next/static/chunks/260bomtr214m8.js +34 -0
  299. package/.next/standalone/.next/static/chunks/2eo9pqq9gay3r.js +34 -0
  300. package/.next/standalone/.next/static/chunks/2xk2ra4piiuod.js +34 -0
  301. package/.next/standalone/.next/static/chunks/2z1-q0_vunbql.js +2 -0
  302. package/.next/standalone/.next/static/chunks/2zf4jmz9l3li2.js +1 -0
  303. package/.next/standalone/.next/static/chunks/34g73qhayuevu.js +1 -0
  304. package/.next/standalone/.next/static/chunks/3b0-14cxqsprt.js +1 -0
  305. package/.next/standalone/.next/static/chunks/3jarus1_38s2z.js +1 -0
  306. package/.next/standalone/.next/static/chunks/3ssu341hav_sq.css +3 -0
  307. package/.next/standalone/.next/static/chunks/3v1qd3sqhqn0d.js +1 -0
  308. package/.next/standalone/.next/static/chunks/43pg2sursiypz.js +1 -0
  309. package/.next/standalone/.next/static/chunks/44yn0tcd9dfk3.js +1 -0
  310. package/.next/standalone/CHANGELOG.md +143 -0
  311. package/.next/standalone/README.md +71 -49
  312. package/.next/standalone/SECURITY.md +17 -11
  313. package/.next/standalone/app/api/data/backup/route.js +25 -0
  314. package/.next/standalone/app/api/data/csv/route.js +74 -0
  315. package/.next/standalone/app/api/data/export/route.js +1 -1
  316. package/.next/standalone/app/api/data/restore/route.js +48 -0
  317. package/.next/standalone/app/api/data/reveal/route.js +19 -6
  318. package/.next/standalone/app/api/data/route.js +15 -4
  319. package/.next/standalone/app/api/ingest/route.js +1 -1
  320. package/.next/standalone/app/api/queue/route.js +1 -1
  321. package/.next/standalone/app/api/scraper/route.js +120 -32
  322. package/.next/standalone/app/api/social/crm/route.js +2 -1
  323. package/.next/standalone/app/components/AppHeader.js +20 -16
  324. package/.next/standalone/app/components/AppTabs.js +8 -8
  325. package/.next/standalone/app/components/AutoScanButton.js +2 -2
  326. package/.next/standalone/app/components/Avatar.js +1 -1
  327. package/.next/standalone/app/components/ChainView.js +184 -112
  328. package/.next/standalone/app/components/CirclePanel.js +16 -16
  329. package/.next/standalone/app/components/ClusterSpinner.js +64 -0
  330. package/.next/standalone/app/components/CompanyScores.js +20 -20
  331. package/.next/standalone/app/components/EmptyState.js +39 -18
  332. package/.next/standalone/app/components/FieldStep.js +15 -13
  333. package/.next/standalone/app/components/FilterPanel.js +17 -17
  334. package/.next/standalone/app/components/ForceGraph.js +49 -14
  335. package/.next/standalone/app/components/GalaxyLab.js +33 -33
  336. package/.next/standalone/app/components/GridView.js +18 -18
  337. package/.next/standalone/app/components/LegacyScoresCard.js +10 -11
  338. package/.next/standalone/app/components/LinkedInLimits.js +24 -19
  339. package/.next/standalone/app/components/LiquidGlass.js +99 -0
  340. package/.next/standalone/app/components/ListView.js +20 -20
  341. package/.next/standalone/app/components/MapControls.js +5 -5
  342. package/.next/standalone/app/components/MappingProgress.js +16 -16
  343. package/.next/standalone/app/components/NoteDetail.js +13 -13
  344. package/.next/standalone/app/components/OnboardingGate.js +4 -4
  345. package/.next/standalone/app/components/OutlinkQuest.js +25 -25
  346. package/.next/standalone/app/components/PathsAnalyzer.js +37 -36
  347. package/.next/standalone/app/components/PeopleMap.js +21 -21
  348. package/.next/standalone/app/components/RingsView.js +11 -11
  349. package/.next/standalone/app/components/ScanRadar.js +84 -39
  350. package/.next/standalone/app/components/ScanStatusBar.js +22 -18
  351. package/.next/standalone/app/components/ScanTrail.js +8 -5
  352. package/.next/standalone/app/components/SeparationView.js +168 -104
  353. package/.next/standalone/app/components/Sidebar.js +161 -161
  354. package/.next/standalone/app/components/StaleServerBanner.js +4 -4
  355. package/.next/standalone/app/components/TheirCircle.js +26 -26
  356. package/.next/standalone/app/components/ThemeDefs.js +42 -0
  357. package/.next/standalone/app/components/ThemeLoader.js +20 -1
  358. package/.next/standalone/app/components/UpdatePanel.js +22 -22
  359. package/.next/standalone/app/components/UserProvider.js +22 -15
  360. package/.next/standalone/app/components/settings/AppearanceSection.js +47 -24
  361. package/.next/standalone/app/components/settings/DataSection.js +276 -109
  362. package/.next/standalone/app/components/settings/NetworkHealthSection.js +13 -13
  363. package/.next/standalone/app/components/settings/SectorPicker.js +12 -12
  364. package/.next/standalone/app/components/settings/SectorSection.js +13 -14
  365. package/.next/standalone/app/components/settings/TierSection.js +9 -9
  366. package/.next/standalone/app/components/settings/TitleSection.js +11 -11
  367. package/.next/standalone/app/components/settings/UsageSection.js +313 -0
  368. package/.next/standalone/app/components/ui.js +8 -8
  369. package/.next/standalone/app/globals.css +159 -2
  370. package/.next/standalone/app/import/page.js +94 -38
  371. package/.next/standalone/app/launch/page.js +5 -5
  372. package/.next/standalone/app/layout.js +6 -2
  373. package/.next/standalone/app/page.js +53 -37
  374. package/.next/standalone/app/paths/page.js +63 -63
  375. package/.next/standalone/app/profile/page.js +58 -58
  376. package/.next/standalone/app/queue/page.js +54 -54
  377. package/.next/standalone/app/scores/page.js +2 -2
  378. package/.next/standalone/app/settings/page.js +16 -13
  379. package/.next/standalone/app/setup/page.js +221 -125
  380. package/.next/standalone/app/social/Crm.js +63 -62
  381. package/.next/standalone/app/social/SocialHub.js +22 -22
  382. package/.next/standalone/app/social/Thread.js +7 -7
  383. package/.next/standalone/app/social/page.js +2 -2
  384. package/.next/standalone/lib/backups.js +458 -0
  385. package/.next/standalone/lib/chain-layout.js +32 -0
  386. package/.next/standalone/lib/csv-store.js +131 -0
  387. package/.next/standalone/lib/csv.js +137 -39
  388. package/.next/standalone/lib/data-folder.js +19 -3
  389. package/.next/standalone/lib/data-import.js +5 -2
  390. package/.next/standalone/lib/db-client.js +78 -20
  391. package/.next/standalone/lib/demo.js +5 -4
  392. package/.next/standalone/lib/galaxy-export.js +9 -2
  393. package/.next/standalone/lib/galaxy-lab.js +19 -5
  394. package/.next/standalone/lib/galaxy-layouts.js +43 -0
  395. package/.next/standalone/lib/gate.js +10 -4
  396. package/.next/standalone/lib/ingest.js +1 -1
  397. package/.next/standalone/lib/linkedin-limits.js +212 -11
  398. package/.next/standalone/lib/liquid-glass.js +59 -0
  399. package/.next/standalone/lib/notifications.js +13 -0
  400. package/.next/standalone/lib/scan-pace.js +11 -0
  401. package/.next/standalone/lib/scan-progress.js +20 -0
  402. package/.next/standalone/lib/scan-risk.js +44 -0
  403. package/.next/standalone/lib/scanner-setup.js +97 -15
  404. package/.next/standalone/lib/scraper-client.js +17 -3
  405. package/.next/standalone/lib/search-risk.js +7 -3
  406. package/.next/standalone/lib/settings-client.js +5 -3
  407. package/.next/standalone/lib/settings.js +10 -0
  408. package/.next/standalone/lib/social-store.js +3 -2
  409. package/.next/standalone/lib/synced-setting.js +46 -0
  410. package/.next/standalone/lib/theme-store.js +42 -10
  411. package/.next/standalone/lib/themes.js +111 -21
  412. package/.next/standalone/lib/usage.js +195 -0
  413. package/.next/standalone/package-lock.json +2 -2
  414. package/.next/standalone/package.json +1 -1
  415. package/.next/standalone/scripts/scrape.py +26 -2
  416. package/.next/static/chunks/03-_esd2x_yk6.js +1 -0
  417. package/.next/static/chunks/03-demj2iy-0p.js +44 -0
  418. package/.next/static/chunks/0_1r-3csplxnj.js +1 -0
  419. package/.next/static/chunks/0an_b6zi1r_qq.js +5 -0
  420. package/.next/static/chunks/0e3g0sil79cus.js +21 -0
  421. package/.next/static/chunks/0kscsqnvfq3-r.js +1 -0
  422. package/.next/static/chunks/0p3g5tfostsep.js +7 -0
  423. package/.next/static/chunks/0zd0t7e60bn4z.js +1 -0
  424. package/.next/static/chunks/163b-20vwa06i.js +34 -0
  425. package/.next/static/chunks/{0ws7zy0w57ufi.js → 1eyajb9ntzlrl.js} +1 -1
  426. package/.next/static/chunks/1pa-2v1ajvrko.js +1 -0
  427. package/.next/static/chunks/1qbjermbf68xj.js +1 -0
  428. package/.next/static/chunks/1z9lb-dbcg4aa.js +1 -0
  429. package/.next/static/chunks/23_1z47al92nz.js +57 -0
  430. package/.next/static/chunks/260bomtr214m8.js +34 -0
  431. package/.next/static/chunks/2eo9pqq9gay3r.js +34 -0
  432. package/.next/static/chunks/2xk2ra4piiuod.js +34 -0
  433. package/.next/static/chunks/2z1-q0_vunbql.js +2 -0
  434. package/.next/static/chunks/2zf4jmz9l3li2.js +1 -0
  435. package/.next/static/chunks/34g73qhayuevu.js +1 -0
  436. package/.next/static/chunks/3b0-14cxqsprt.js +1 -0
  437. package/.next/static/chunks/3jarus1_38s2z.js +1 -0
  438. package/.next/static/chunks/3ssu341hav_sq.css +3 -0
  439. package/.next/static/chunks/3v1qd3sqhqn0d.js +1 -0
  440. package/.next/static/chunks/43pg2sursiypz.js +1 -0
  441. package/.next/static/chunks/44yn0tcd9dfk3.js +1 -0
  442. package/CHANGELOG.md +143 -0
  443. package/README.md +71 -49
  444. package/SECURITY.md +17 -11
  445. package/lib/backups.js +458 -0
  446. package/lib/chain-layout.js +32 -0
  447. package/lib/csv-store.js +131 -0
  448. package/lib/csv.js +137 -39
  449. package/lib/data-folder.js +19 -3
  450. package/lib/data-import.js +5 -2
  451. package/lib/db-client.js +78 -20
  452. package/lib/demo.js +5 -4
  453. package/lib/galaxy-export.js +9 -2
  454. package/lib/galaxy-lab.js +19 -5
  455. package/lib/galaxy-layouts.js +43 -0
  456. package/lib/gate.js +10 -4
  457. package/lib/ingest.js +1 -1
  458. package/lib/linkedin-limits.js +212 -11
  459. package/lib/liquid-glass.js +59 -0
  460. package/lib/notifications.js +13 -0
  461. package/lib/scan-pace.js +11 -0
  462. package/lib/scan-progress.js +20 -0
  463. package/lib/scan-risk.js +44 -0
  464. package/lib/scanner-setup.js +97 -15
  465. package/lib/scraper-client.js +17 -3
  466. package/lib/search-risk.js +7 -3
  467. package/lib/settings-client.js +5 -3
  468. package/lib/settings.js +10 -0
  469. package/lib/social-store.js +3 -2
  470. package/lib/synced-setting.js +46 -0
  471. package/lib/theme-store.js +42 -10
  472. package/lib/themes.js +111 -21
  473. package/lib/usage.js +195 -0
  474. package/package.json +1 -1
  475. package/scripts/scrape.py +26 -2
  476. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-rnla2._.js +0 -3
  477. package/.next/standalone/.next/server/chunks/[root-of-the-server]__14ou7j5._.js +0 -3
  478. package/.next/standalone/.next/server/chunks/[root-of-the-server]__16iu0hv._.js +0 -3
  479. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1kbl21f._.js +0 -3
  480. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rphsdk._.js +0 -3
  481. package/.next/standalone/.next/server/chunks/lib_0851sk0._.js +0 -8
  482. package/.next/standalone/.next/server/chunks/lib_1q7p2ro._.js +0 -8
  483. package/.next/standalone/.next/server/chunks/lib_1r6l86l._.js +0 -8
  484. package/.next/standalone/.next/server/chunks/lib_db-client_15le7cw.js +0 -174
  485. package/.next/standalone/.next/server/chunks/lib_rpc_04s8mzr.js +0 -3
  486. package/.next/standalone/.next/server/chunks/lib_rpc_053z7as.js +0 -3
  487. package/.next/standalone/.next/server/chunks/lib_rpc_0b_-2te.js +0 -3
  488. package/.next/standalone/.next/server/chunks/lib_rpc_0dhbxdm.js +0 -3
  489. package/.next/standalone/.next/server/chunks/lib_rpc_0dxlk31.js +0 -3
  490. package/.next/standalone/.next/server/chunks/lib_rpc_0f8b-qc.js +0 -3
  491. package/.next/standalone/.next/server/chunks/lib_rpc_0pzie7_.js +0 -3
  492. package/.next/standalone/.next/server/chunks/lib_rpc_0r76fq_.js +0 -3
  493. package/.next/standalone/.next/server/chunks/lib_rpc_0ut7pjp.js +0 -3
  494. package/.next/standalone/.next/server/chunks/lib_rpc_15zyqaz.js +0 -3
  495. package/.next/standalone/.next/server/chunks/lib_rpc_18zpjtq.js +0 -3
  496. package/.next/standalone/.next/server/chunks/lib_rpc_1a8xkiz.js +0 -3
  497. package/.next/standalone/.next/server/chunks/lib_rpc_1e_55xo.js +0 -3
  498. package/.next/standalone/.next/server/chunks/lib_rpc_1oxfd1_.js +0 -3
  499. package/.next/standalone/.next/server/chunks/lib_rpc_1s0lod0.js +0 -3
  500. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08oxiqh._.js +0 -3
  501. package/.next/standalone/.next/server/chunks/ssr/_03l7vge._.js +0 -3
  502. package/.next/standalone/.next/server/chunks/ssr/_08g31gm._.js +0 -3
  503. package/.next/standalone/.next/server/chunks/ssr/_0gk_ofx._.js +0 -3
  504. package/.next/standalone/.next/server/chunks/ssr/_0nwsf93._.js +0 -3
  505. package/.next/standalone/.next/server/chunks/ssr/_0vho1lb._.js +0 -3
  506. package/.next/standalone/.next/server/chunks/ssr/_1-658fq._.js +0 -3
  507. package/.next/standalone/.next/server/chunks/ssr/_1bc46kz._.js +0 -3
  508. package/.next/standalone/.next/server/chunks/ssr/_2105jz8._.js +0 -3
  509. package/.next/standalone/.next/server/chunks/ssr/app_components_settings_SectorPicker_1c-29qw.js +0 -3
  510. package/.next/standalone/.next/static/chunks/02pq76u7y4v9-.js +0 -22
  511. package/.next/standalone/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
  512. package/.next/standalone/.next/static/chunks/0i02yxppzds1o.js +0 -1
  513. package/.next/standalone/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
  514. package/.next/standalone/.next/static/chunks/0oyslj62jkubd.js +0 -1
  515. package/.next/standalone/.next/static/chunks/0vo-l8hxneba6.css +0 -3
  516. package/.next/standalone/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
  517. package/.next/standalone/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
  518. package/.next/standalone/.next/static/chunks/172e10mi-tpo_.js +0 -34
  519. package/.next/standalone/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
  520. package/.next/standalone/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
  521. package/.next/standalone/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
  522. package/.next/standalone/.next/static/chunks/1m3017gp790pw.js +0 -45
  523. package/.next/standalone/.next/static/chunks/1t20e8u0st7ep.js +0 -1
  524. package/.next/standalone/.next/static/chunks/2-ch9rm27eril.js +0 -11
  525. package/.next/standalone/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
  526. package/.next/standalone/.next/static/chunks/3bp284gjf7dyq.js +0 -1
  527. package/.next/standalone/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
  528. package/.next/standalone/.next/static/chunks/3l4t8je6iguzc.js +0 -1
  529. package/.next/standalone/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
  530. package/.next/standalone/.next/static/chunks/42m0bqr8pbovz.js +0 -11
  531. package/.next/static/chunks/02pq76u7y4v9-.js +0 -22
  532. package/.next/static/chunks/0cmq0exd4d0h9.js +0 -1
  533. package/.next/static/chunks/0i02yxppzds1o.js +0 -1
  534. package/.next/static/chunks/0m_p4k-q2qh--.js +0 -1
  535. package/.next/static/chunks/0oyslj62jkubd.js +0 -1
  536. package/.next/static/chunks/0vo-l8hxneba6.css +0 -3
  537. package/.next/static/chunks/0yh8z2tbrc5i_.js +0 -1
  538. package/.next/static/chunks/17-rhp8sg4m1b.js +0 -44
  539. package/.next/static/chunks/172e10mi-tpo_.js +0 -34
  540. package/.next/static/chunks/1ei5vbe2uw6fl.js +0 -1
  541. package/.next/static/chunks/1f7_pl_wq7lh3.js +0 -11
  542. package/.next/static/chunks/1jzbe7zdx9vbj.js +0 -2
  543. package/.next/static/chunks/1m3017gp790pw.js +0 -45
  544. package/.next/static/chunks/1t20e8u0st7ep.js +0 -1
  545. package/.next/static/chunks/2-ch9rm27eril.js +0 -11
  546. package/.next/static/chunks/2ldv-v3s9yaif.js +0 -1
  547. package/.next/static/chunks/3bp284gjf7dyq.js +0 -1
  548. package/.next/static/chunks/3k1f6clbn3gj3.js +0 -7
  549. package/.next/static/chunks/3l4t8je6iguzc.js +0 -1
  550. package/.next/static/chunks/3tplzuc9jk-tl.js +0 -1
  551. package/.next/static/chunks/42m0bqr8pbovz.js +0 -11
  552. /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → ZVpLBK-2vpllv2HxOFs2d}/_buildManifest.js +0 -0
  553. /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → ZVpLBK-2vpllv2HxOFs2d}/_clientMiddlewareManifest.js +0 -0
  554. /package/.next/standalone/.next/static/{dQUvvVSXqbkEFC3-CNcwT → ZVpLBK-2vpllv2HxOFs2d}/_ssgManifest.js +0 -0
  555. /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → ZVpLBK-2vpllv2HxOFs2d}/_buildManifest.js +0 -0
  556. /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → ZVpLBK-2vpllv2HxOFs2d}/_clientMiddlewareManifest.js +0 -0
  557. /package/.next/static/{dQUvvVSXqbkEFC3-CNcwT → ZVpLBK-2vpllv2HxOFs2d}/_ssgManifest.js +0 -0
@@ -8,6 +8,7 @@
8
8
  // Now they all call this, which talks to /api/scraper on the app itself.
9
9
 
10
10
  import { runningNow } from './scan-state.js';
11
+ import { CHROME_REFUSAL } from './scanner-setup.js';
11
12
 
12
13
  export async function scraperStatus() {
13
14
  const r = await fetch('/api/scraper');
@@ -88,9 +89,10 @@ export function notReadyMessage(status) {
88
89
  if (!c.dependencies) {
89
90
  // With no Python and nothing to download for this computer, Scan can't help yet.
90
91
  if (!c.python && !c.download) return 'No Python 3.10 to 3.14 is installed on this machine.';
91
- return 'The scanner is not set up yet — open Scan to set it up.';
92
+ return 'The scanner is not set up yet. Open Scan to set it up.';
92
93
  }
93
- if (!c.chrome) return 'Google Chrome is not installed.';
94
+ // The words the Scan page and the server use (lib/scanner-setup.js).
95
+ if (!c.chrome) return CHROME_REFUSAL;
94
96
  return null;
95
97
  }
96
98
 
@@ -121,7 +123,7 @@ const QUIET_MS = 5000;
121
123
  /** Before the first answer, and on the server, where nothing is asked. */
122
124
  export const SCANNER_UNKNOWN = Object.freeze({
123
125
  known: false, running: false, pending: false, action: null, target: null,
124
- startedAt: null, progress: null, pages: 0, log: [], finished: [],
126
+ startedAt: null, progress: null, pages: 0, found: [], log: [], finished: [],
125
127
  });
126
128
 
127
129
  const listeners = new Set();
@@ -165,6 +167,7 @@ function take(s) {
165
167
  startedAt: running ? s.startedAt ?? null : null,
166
168
  progress: running ? s.progress ?? null : null,
167
169
  pages: running ? Number(s.pages) || 0 : 0, // pages read so far (app/api/scraper/route.js)
170
+ found: running && Array.isArray(s.found) ? s.found.map(Number).filter(Number.isFinite) : [], // people each page found
168
171
  budget: running ? s.budget ?? null : null,
169
172
  log: running && Array.isArray(s.log) ? s.log : [],
170
173
  finished,
@@ -271,6 +274,17 @@ export function isCircleScan(job) {
271
274
  return Boolean(job?.target) && ['bridge', 'rescrape', 'resume'].includes(job.action);
272
275
  }
273
276
 
277
+ /**
278
+ * Does this job add people to circles on the map while it runs: one person's
279
+ * circle, or a batch of them (Map 2nd degree, every paused list)? The map
280
+ * looks again every so often while one does, with Bridge Chains open
281
+ * (app/page.js NetworkRefresh), so the Scan page's "Watch it fill in" shows
282
+ * the circle filling in, not as it was when the page opened.
283
+ */
284
+ export function fillsCircles(job) {
285
+ return isCircleScan(job) || ['auto-bridge', 'auto-bridge-retry', 'resume-all'].includes(job?.action);
286
+ }
287
+
274
288
  /**
275
289
  * Is this job, running or finished, a read of this person's circle? By id when
276
290
  * both have one: two connections can share a name. Else by name.
@@ -28,10 +28,14 @@ export function limitQuestion(from = {}, to = {}) {
28
28
  return null;
29
29
  }
30
30
 
31
- /** The note under the picker while the budget is risky; null when it isn't. */
32
- export function limitNote({ daily, monthly } = {}) {
31
+ /**
32
+ * The note under the picker while the budget is risky; null when it isn't.
33
+ * `restriction: false` leaves out the 373 sentence, for Settings → LinkedIn
34
+ * usage when its own warning has just said it (lib/usage.js warningParts).
35
+ */
36
+ export function limitNote({ daily, monthly } = {}, { restriction = true } = {}) {
33
37
  if (!riskyLimits({ daily, monthly })) return null;
34
- const parts = [`A real account was restricted after ${RESTRICTED_AT} searches in 24 hours.`];
38
+ const parts = restriction ? [`A real account was restricted after ${RESTRICTED_AT} searches in 24 hours.`] : [];
35
39
  if (riskyDaily(daily)) parts.push(`${daily} a day can use up a free account's month in a day or two.`);
36
40
  if (monthly === 0) parts.push('With no monthly cap, nothing but the daily budget stops a long run.');
37
41
  return parts.join(' ');
@@ -1,17 +1,19 @@
1
1
  // Saving settings from the browser: POST /api/settings with only the settings
2
2
  // that change (lib/settings.js keeps the rest as stored). Scores → Your sector
3
3
  // and Tiers save through it, and so does the Scan page's question about your
4
- // field before the first scan (app/components/FieldStep.js).
4
+ // field before the first scan (app/components/FieldStep.js), and the look and
5
+ // the Galaxy's saved layouts (lib/synced-setting.js).
5
6
 
6
7
  /**
8
+ * `keepalive` lets a save sent as the page goes away still arrive.
7
9
  * @returns { settings, effects, error }: `settings` as saved, also when the
8
10
  * save landed but the work it set in motion failed (lib/settings-effects.js);
9
11
  * `effects` what that work reported; `error` a message fit to show, or null.
10
12
  */
11
- export async function saveSettings(patch) {
13
+ export async function saveSettings(patch, { keepalive = false } = {}) {
12
14
  try {
13
15
  const r = await fetch('/api/settings', {
14
- method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ settings: patch }),
16
+ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ settings: patch }), keepalive,
15
17
  });
16
18
  const d = await r.json();
17
19
  return { settings: d.settings || null, effects: d.effects || null, error: r.ok ? null : d.error || 'Could not save.' };
package/lib/settings.js CHANGED
@@ -13,6 +13,9 @@
13
13
  import { SECTOR_FOCUS_SETTING, FIELD_ASKED_SETTING } from './sector-focus.js';
14
14
  import { TIER_SCALE_SETTING } from './scoring.js';
15
15
  import { TITLE_RANKING_SETTING } from './title-ranking.js';
16
+ import { SCAN_RISK_SETTING } from './scan-risk.js';
17
+ import { THEME_SETTING } from './themes.js';
18
+ import { GALAXY_LAYOUTS_SETTING } from './galaxy-layouts.js';
16
19
 
17
20
  export const SETTINGS = {
18
21
  // Scores → Your sector: industries whose companies count for more (lib/sector-focus.js).
@@ -23,6 +26,13 @@ export const SETTINGS = {
23
26
  tierScale: TIER_SCALE_SETTING,
24
27
  // Scores → Titles: how much each kind of title counts, and roles you're looking for (lib/title-ranking.js).
25
28
  titleRanking: TITLE_RANKING_SETTING,
29
+ // The Scan page's "I understand" before the first scan: when it was given (lib/scan-risk.js).
30
+ scanRiskAccepted: SCAN_RISK_SETTING,
31
+ // Settings → Appearance: the look (lib/themes.js). Here so it travels with a
32
+ // backup or a restore; the browser keeps a copy to paint with first (lib/theme-store.js).
33
+ theme: THEME_SETTING,
34
+ // The Galaxy's saved layouts (lib/galaxy-layouts.js), here for the same reason.
35
+ galaxyLayouts: GALAXY_LAYOUTS_SETTING,
26
36
  };
27
37
 
28
38
  const KEY = 'settings';
@@ -14,8 +14,9 @@
14
14
  //
15
15
  // Two files so that turning Keep my messages off, or Forget it, deletes the
16
16
  // words by deleting one file, and so the everyday file the Galaxy and the
17
- // Social tab read stays small however many messages there are. "Save a copy of my network" carries
18
- // them when its Social box is ticked (lib/data-folder.js SOCIAL_FILE).
17
+ // Social tab read stays small however many messages there are. "Export backup file…" carries
18
+ // them when its Social box is ticked (lib/data-folder.js SOCIAL_FILE); the backups Six Degrees
19
+ // makes by itself never do, so deleting them here deletes them everywhere (lib/backups.js).
19
20
 
20
21
  import { readFileSync, writeFileSync, renameSync, rmSync, statSync } from 'node:fs';
21
22
  import path from 'node:path';
@@ -0,0 +1,46 @@
1
+ // A choice kept with the network (lib/settings.js), so it travels with a
2
+ // backup, an export and a restore, while the browser keeps a copy of it to
3
+ // read before the page paints (the look) or before the server answers. The
4
+ // look and the Galaxy's saved layouts work this way (lib/theme-store.js,
5
+ // lib/galaxy-lab.js). No imports: pure, so the tests can pin it.
6
+
7
+ /**
8
+ * What to use once the server has answered, and whether to save the browser's
9
+ * copy to it.
10
+ *
11
+ * - The server has one (`saved`): it wins. A restore or an import brings its
12
+ * own look, and another window of the app (the Mac app and a browser tab
13
+ * keep separate copies) may have changed it.
14
+ * - The server has none (null: never saved on this network, as for everyone
15
+ * before this was kept there): the browser's copy stands, and is saved once,
16
+ * unless it is only the default.
17
+ *
18
+ * @returns {{ use, save: boolean, changed: boolean }}
19
+ */
20
+ export function reconcileSaved({ saved, cached, isDefault, same }) {
21
+ if (saved === null || saved === undefined) return { use: cached, save: !isDefault(cached), changed: false };
22
+ return { use: saved, save: false, changed: !same(saved, cached) };
23
+ }
24
+
25
+ /**
26
+ * Save at most once per `wait` ms, the last value winning: a colour picker
27
+ * changes the look many times a second while it's dragged. `flush()` sends a
28
+ * waiting save now (the page is going away: otherwise the network's older
29
+ * value would win when it opens again). `save(value, { now })` is told which.
30
+ */
31
+ export function laterSaver(save, wait = 400) {
32
+ let timer = null;
33
+ let next;
34
+ const send = (now) => {
35
+ clearTimeout(timer);
36
+ timer = null;
37
+ Promise.resolve(save(next, { now })).catch(() => { /* kept in this browser; saved with the next change */ });
38
+ };
39
+ const later = (value) => {
40
+ next = value;
41
+ if (timer) clearTimeout(timer);
42
+ timer = setTimeout(() => send(false), wait);
43
+ };
44
+ later.flush = () => { if (timer) send(true); };
45
+ return later;
46
+ }
@@ -1,13 +1,17 @@
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.
1
+ // The theme in use (lib/themes.js has what a theme is). Read once when the
2
+ // page loads, before anything draws, so the dots, your dot and the map's lines
3
+ // come out in its colours; changed from Settings → Appearance.
4
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.
5
+ // Saved with the network's settings (lib/settings.js 'theme'), so a backup, an
6
+ // export or a restore carries the look with it. localStorage keeps a copy, the
7
+ // one read before the page paints: the CSS variables are kept beside it, ready
8
+ // made, for the script in app/layout.js that puts them on the page first, so a
9
+ // theme never flashes the standard colours. Once the server answers
10
+ // (app/components/ThemeLoader.js), its look wins (lib/synced-setting.js).
9
11
 
10
- import { cleanTheme, resolveTheme, themeVars, themeAttrs, TIER_COLORS, MAP_LOOK } from './themes.js';
12
+ import { cleanTheme, resolveTheme, themeVars, themeAttrs, isLight, TIER_COLORS, MAP_LOOK } from './themes.js';
13
+ import { saveSettings } from './settings-client.js';
14
+ import { reconcileSaved, laterSaver } from './synced-setting.js';
11
15
 
12
16
  const KEY = 'six-degrees-theme';
13
17
  export const VARS_KEY = 'six-degrees-theme-vars';
@@ -24,12 +28,16 @@ function read() {
24
28
  function apply(next) {
25
29
  const theme = resolveTheme(next);
26
30
  Object.assign(TIER_COLORS, theme.tiers);
27
- Object.assign(MAP_LOOK, { you: theme.you, lines: theme.lines, line: theme.line, bg: theme.bg });
31
+ const light = isLight(theme);
32
+ Object.assign(MAP_LOOK, { you: theme.you, lines: theme.lines, line: theme.line, bg: theme.bg, dots: theme.dots, light, text: light ? '#11141c' : '#ffffff' });
28
33
  if (typeof document === 'undefined') return;
29
34
  const vars = themeVars(next);
30
35
  const root = document.documentElement;
36
+ // A light look's words and borders go when a dark one comes: they fall back to the dark values.
37
+ for (const k of [...root.style]) if (k.startsWith('--sd-') && !(k in vars)) root.style.removeProperty(k);
31
38
  for (const [k, v] of Object.entries(vars)) root.style.setProperty(k, v);
32
39
  Object.assign(root.dataset, themeAttrs(next));
40
+ root.style.colorScheme = light ? 'light' : 'dark';
33
41
  try { localStorage.setItem(VARS_KEY, JSON.stringify({ vars, attrs: themeAttrs(next) })); } catch { /* it's applied anyway */ }
34
42
  }
35
43
 
@@ -48,13 +56,37 @@ if (typeof window !== 'undefined') {
48
56
  export const themeNow = () => choice;
49
57
  export const serverTheme = () => DEFAULT;
50
58
 
51
- export function setTheme(next) {
59
+ const same = (a, b) => JSON.stringify(cleanTheme(a)) === JSON.stringify(cleanTheme(b));
60
+ const saveLater = laterSaver((theme, { now }) => saveSettings({ theme }, { keepalive: now }));
61
+ // A look picked just before a reload is saved on the way out, or the
62
+ // network's older one would replace it as the page opens again.
63
+ if (typeof window !== 'undefined') window.addEventListener('pagehide', () => saveLater.flush());
64
+
65
+ function choose(next) {
52
66
  choice = cleanTheme(next);
53
67
  try { localStorage.setItem(KEY, JSON.stringify(choice)); } catch { /* this visit only */ }
54
68
  apply(choice);
55
69
  listeners.forEach((f) => f());
56
70
  }
57
71
 
72
+ export function setTheme(next) {
73
+ choose(next);
74
+ saveLater(choice);
75
+ }
76
+
77
+ /**
78
+ * The look saved with the network (GET /api/settings 'theme'), once the page
79
+ * has it: it replaces this browser's copy, or, when the network has none yet,
80
+ * this browser's look is saved to it once.
81
+ */
82
+ export function adoptSavedTheme(saved) {
83
+ const { use: next, save, changed } = reconcileSaved({
84
+ saved: saved == null ? null : cleanTheme(saved), cached: choice, isDefault: (t) => same(t, DEFAULT), same,
85
+ });
86
+ if (save) saveSettings({ theme: choice });
87
+ if (changed) choose(next);
88
+ }
89
+
58
90
  export function watchTheme(f) {
59
91
  listeners.add(f);
60
92
  return () => listeners.delete(f);
package/lib/themes.js CHANGED
@@ -10,8 +10,18 @@
10
10
  // (app/globals.css, html[data-backdrop]), and the dot colours the map draws with
11
11
  // (TIER_COLORS, a live object every view reads).
12
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.
13
+ // Dark or light is the background's own: a look whose background is light
14
+ // (Daylight, Paper, or any colour you pick) turns the words, borders and
15
+ // raised surfaces dark (lightTokens). The app's colours are CSS variables
16
+ // whose fallbacks are the dark values they always had, so a dark look sets
17
+ // none of them and draws exactly as before (Blake, 2026-10-03: "id like a
18
+ // light mode").
19
+ //
20
+ // A look also has a way of drawing buttons (`buttons`, app/globals.css
21
+ // html[data-buttons]) and the map's dots (`dots`, app/components/ForceGraph.js):
22
+ // soft, flat, square, frosted, neon or bold; solid, droplet, flat, glow or plain
23
+ // (Blake: "buttons look the same … like apple glass it will look like blurred
24
+ // droplets and then for the obsidian it looks like obsidian with the nodes").
15
25
  //
16
26
  // What arrives from storage or a pasted theme code is untrusted: cleanTheme
17
27
  // keeps only #rrggbb colours, the listed choices and numbers in range, so
@@ -25,6 +35,8 @@ export const FONTS = {
25
35
  serif: 'ui-serif, "New York", Georgia, "Times New Roman", serif',
26
36
  };
27
37
  export const LINE_MODES = ['tier', 'one'];
38
+ export const BUTTONS = ['soft', 'flat', 'square', 'frosted', 'neon', 'bold'];
39
+ export const DOTS = ['solid', 'droplet', 'flat', 'glow', 'plain'];
28
40
 
29
41
  /**
30
42
  * A theme. `bg` is the colour behind everything, `bg2` the second colour of its
@@ -37,46 +49,68 @@ export const STANDARD = Object.freeze({
37
49
  id: 'standard', name: 'Standard', blurb: 'The original: deep navy, gold, purple and blue.',
38
50
  bg: '#0a0a1a', bg2: '#1a1440', backdrop: 'none', panel: '#0a0f1e', glass: 0.35, accent: '#3498db',
39
51
  tiers: Object.freeze({ S: '#ffd700', A: '#9b59b6', B: '#3498db', C: '#95a5a6', D: '#bdc3c7' }),
40
- you: '#ffffff', lines: 'tier', line: '#5a6274', font: 'system',
52
+ you: '#ffffff', lines: 'tier', line: '#5a6274', font: 'system', buttons: 'soft', dots: 'solid',
41
53
  });
42
54
 
43
55
  export const THEMES = Object.freeze([
44
56
  STANDARD,
57
+ Object.freeze({
58
+ id: 'daylight', name: 'Daylight', blurb: 'Light, designed for it: white panels, ink text, deeper dots that read on white.',
59
+ bg: '#f4f6fb', bg2: '#dfe5f2', backdrop: 'none', panel: '#ffffff', glass: 0.25, accent: '#2563eb',
60
+ tiers: Object.freeze({ S: '#d99a00', A: '#8e44ad', B: '#2f80ed', C: '#6b7a86', D: '#a4afba' }),
61
+ you: '#111827', lines: 'tier', line: '#c5cbd8', font: 'system', buttons: 'soft', dots: 'solid',
62
+ }),
63
+ Object.freeze({
64
+ id: 'paper', name: 'Paper', blurb: 'Warm off-white and ink, like a printed chart. Flat, quiet, easy on the eyes.',
65
+ bg: '#f6f1e7', bg2: '#e6dcc8', backdrop: 'grid', panel: '#fbf8f1', glass: 0, accent: '#b4532a',
66
+ tiers: Object.freeze({ S: '#b7791f', A: '#7b4fa0', B: '#2c6e9b', C: '#7d8a80', D: '#b0a99a' }),
67
+ you: '#2b2118', lines: 'one', line: '#cbbfa8', font: 'serif', buttons: 'flat', dots: 'flat',
68
+ }),
45
69
  Object.freeze({
46
70
  id: 'contrast', name: 'High contrast', blurb: 'Pure black, the brightest dots, solid panels. Easiest to read.',
47
71
  bg: '#000000', bg2: '#000000', backdrop: 'none', panel: '#000000', glass: 0, accent: '#4cc9f0',
48
72
  tiers: Object.freeze({ S: '#ffe500', A: '#d08bff', B: '#4cc9f0', C: '#e6e6e6', D: '#ffffff' }),
49
- you: '#ffffff', lines: 'tier', line: '#8a8a8a', font: 'system',
73
+ you: '#ffffff', lines: 'tier', line: '#8a8a8a', font: 'system', buttons: 'bold', dots: 'solid',
74
+ fg: Object.freeze(['#ffffff', '#f2f2f2', '#d9d9d9', '#bdbdbd', '#a0a0a0']), ink: '255, 255, 255',
50
75
  }),
51
76
  Object.freeze({
52
77
  id: 'obsidian', name: 'Obsidian', blurb: 'Graphite and violet, grey links: the note-taking app’s graph.',
53
78
  bg: '#1e1e1e', bg2: '#262626', backdrop: 'none', panel: '#262626', glass: 0.1, accent: '#8a7cf7',
54
79
  tiers: Object.freeze({ S: '#e0c25a', A: '#a88bfa', B: '#7aa2f7', C: '#9aa0a6', D: '#c7c7c7' }),
55
- you: '#a88bfa', lines: 'one', line: '#5c5c5c', font: 'system',
80
+ you: '#a88bfa', lines: 'one', line: '#5c5c5c', font: 'system', buttons: 'flat', dots: 'flat',
81
+ fg: Object.freeze(['#dcddde', '#bababa', '#999999', '#777777', '#5c5c5c']), ink: '220, 221, 222',
56
82
  }),
57
83
  Object.freeze({
58
84
  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',
85
+ bg: '#0b1020', bg2: '#5b21b6', backdrop: 'glow', panel: '#12121e', glass: 0.9, accent: '#7dd3fc',
60
86
  tiers: Object.freeze({ S: '#fde68a', A: '#f0abfc', B: '#7dd3fc', C: '#cbd5e1', D: '#e2e8f0' }),
61
- you: '#ffffff', lines: 'tier', line: '#94a3b8', font: 'rounded',
87
+ you: '#ffffff', lines: 'tier', line: '#94a3b8', font: 'rounded', buttons: 'frosted', dots: 'droplet',
88
+ fg: Object.freeze(['#ffffff', '#f1f4ff', '#cdd3e6', '#adb4cb', '#929ab2']), ink: '255, 255, 255',
62
89
  }),
63
90
  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',
91
+ // An analysis tool's look (Blake, 2026-10-03: "the bare white background
92
+ // with the flat purely data based look that makes it feel less cluttered
93
+ // and more about the numbers"): a white canvas, flat grey panels, plain
94
+ // outlined dots in a colour-blind-safe palette (Okabe–Ito), black labels,
95
+ // thin grey lines, and nothing decorative (app/globals.css html[data-theme="analyst"]).
96
+ id: 'analyst', name: 'Analyst', blurb: 'A bare white canvas and flat panels: plain dots, black labels, just the network and its numbers.',
97
+ bg: '#ffffff', bg2: '#e8e8e8', backdrop: 'none', panel: '#f4f4f4', glass: 0, accent: '#2b6cb0',
98
+ tiers: Object.freeze({ S: '#d55e00', A: '#0072b2', B: '#009e73', C: '#cc79a7', D: '#8c8c8c' }),
99
+ you: '#111111', lines: 'one', line: '#9a9a9a', font: 'system', buttons: 'square', dots: 'plain',
68
100
  }),
69
101
  Object.freeze({
70
102
  id: 'space', name: 'Space', blurb: 'Your network as a star chart: deep black, a nebula, stars behind it all.',
71
103
  bg: '#04050d', bg2: '#2b1055', backdrop: 'stars', panel: '#0b0d1f', glass: 0.5, accent: '#a78bfa',
72
104
  tiers: Object.freeze({ S: '#ffd166', A: '#c77dff', B: '#4cc9f0', C: '#adb5bd', D: '#6c757d' }),
73
- you: '#ffffff', lines: 'tier', line: '#3a3f5c', font: 'system',
105
+ you: '#ffffff', lines: 'tier', line: '#3a3f5c', font: 'system', buttons: 'soft', dots: 'glow',
106
+ fg: Object.freeze(['#eef2ff', '#cdd5f0', '#9aa5c4', '#76809e', '#565f7c']), ink: '205, 218, 255',
74
107
  }),
75
108
  Object.freeze({
76
109
  id: 'synthwave', name: 'Synthwave', blurb: 'Neon on a purple horizon. For the larpers.',
77
110
  bg: '#1a0b2e', bg2: '#ff2a6d', backdrop: 'horizon', panel: '#24103f', glass: 0.4, accent: '#ff2a6d',
78
111
  tiers: Object.freeze({ S: '#ffe66d', A: '#ff2a6d', B: '#05d9e8', C: '#d1f7ff', D: '#8c7aa9' }),
79
- you: '#ffffff', lines: 'tier', line: '#7a3b9e', font: 'rounded',
112
+ you: '#ffffff', lines: 'tier', line: '#7a3b9e', font: 'rounded', buttons: 'neon', dots: 'glow',
113
+ fg: Object.freeze(['#fff5ff', '#ecdcff', '#c6aae4', '#9e83c2', '#7b649f']), ink: '255, 220, 255',
80
114
  }),
81
115
  ]);
82
116
 
@@ -110,11 +144,27 @@ export function cleanTheme(raw) {
110
144
  if (BACKDROPS.includes(c.backdrop)) custom.backdrop = c.backdrop;
111
145
  if (Object.hasOwn(FONTS, c.font ?? '')) custom.font = c.font;
112
146
  if (LINE_MODES.includes(c.lines)) custom.lines = c.lines;
147
+ if (BUTTONS.includes(c.buttons)) custom.buttons = c.buttons;
148
+ if (DOTS.includes(c.dots)) custom.dots = c.dots;
113
149
  const glass = Number(c.glass);
114
150
  if (c.glass != null && Number.isFinite(glass)) custom.glass = Math.round(Math.min(1, Math.max(0, glass)) * 100) / 100;
115
151
  return { base, custom };
116
152
  }
117
153
 
154
+ /**
155
+ * In lib/settings.js, so the look travels with a backup, an export and a
156
+ * restore. null until a look is saved on this network: the browser's own
157
+ * choice then stands and is saved once (lib/theme-store.js).
158
+ */
159
+ export const THEME_SETTING = {
160
+ default: null,
161
+ parse(value) {
162
+ if (value === null) return null;
163
+ if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('A look is a preset with your own changes on top.');
164
+ return cleanTheme(value);
165
+ },
166
+ };
167
+
118
168
  /** The theme a choice comes to: its preset with your changes on top. */
119
169
  export function resolveTheme(choice) {
120
170
  const { base, custom } = cleanTheme(choice);
@@ -131,6 +181,34 @@ export function resolveTheme(choice) {
131
181
  const rgb = (hex) => [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16));
132
182
  const rgba = (hex, a) => `rgba(${rgb(hex).join(', ')}, ${a})`;
133
183
 
184
+ /** a, moved t of the way to b. */
185
+ const mix = (a, b, t) => `#${rgb(a).map((v, i) => Math.round(v + (rgb(b)[i] - v) * t).toString(16).padStart(2, '0')).join('')}`;
186
+
187
+ /** How light a colour is, 0 to 1 (relative luminance). */
188
+ export function luminance(hex) {
189
+ const lin = (c) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);
190
+ const [r, g, b] = rgb(hex).map((v) => lin(v / 255));
191
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
192
+ }
193
+ /** A light look: its background is light, whatever it's called. */
194
+ export const isLight = (theme) => luminance(theme.bg) > 0.45;
195
+
196
+ /**
197
+ * What a light look puts on top of the dark defaults: the overlays that raise a
198
+ * surface or draw a border turn to ink, the panels' dark wash to white, the
199
+ * words to five steps of ink, and the app's own colours to deeper shades that
200
+ * read as words on a light page (gold text on white disappears).
201
+ */
202
+ function lightTokens() {
203
+ return {
204
+ '--sd-ink': '18, 22, 40',
205
+ '--sd-shade': '255, 255, 255',
206
+ '--sd-fg-1': '#11141c', '--sd-fg-2': '#2e3442', '--sd-fg-3': '#545b6b', '--sd-fg-4': '#747b8b', '--sd-fg-5': '#9aa0ad',
207
+ '--sd-gold': '#9a6b00', '--sd-blue': '#1f63b3', '--sd-orange': '#c2410c', '--sd-green': '#0b7a47',
208
+ '--sd-purple': '#6d3fa8', '--sd-cyan': '#0e7490', '--sd-coral': '#c2410c', '--sd-red': '#c0392b',
209
+ };
210
+ }
211
+
134
212
  /**
135
213
  * The CSS variables a choice sets on the page. Every value is built here from
136
214
  * cleaned colours and numbers, never copied from what was saved.
@@ -138,25 +216,37 @@ const rgba = (hex, a) => `rgba(${rgb(hex).join(', ')}, ${a})`;
138
216
  export function themeVars(choice) {
139
217
  const t = resolveTheme(choice);
140
218
  const glass = Math.min(1, Math.max(0, Number(t.glass) || 0));
219
+ const preset = presetOf(t.id);
141
220
  return {
142
221
  '--sd-bg': t.bg,
143
222
  '--sd-bg2': t.bg2,
144
223
  '--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',
224
+ // The side panels: the theme's tint, more see-through and more blurred the
225
+ // more glass. Never clearer than about 40%: a panel full of words is
226
+ // Apple's "regular" glass, which keeps them readable, not the clear kind.
227
+ '--sd-panel': rgba(t.panel, Math.round((0.92 - 0.55 * glass) * 100) / 100),
228
+ '--sd-panel-blur': `blur(${Math.round(8 + 18 * glass)}px) saturate(${(1 + 0.9 * glass).toFixed(2)})`,
229
+ // The header: clear, or glass on a glass theme.
230
+ '--sd-header': glass >= 0.6 ? rgba(t.panel, 0.22) : 'transparent',
231
+ '--sd-header-blur': glass >= 0.6 ? 'blur(20px) saturate(1.8)' : 'none',
232
+ // A dark look's own words and overlays: Obsidian's greys, GitHub's for
233
+ // Analyst, brighter "vibrant" ones on Glass (lib/themes.js presets).
234
+ ...(!isLight(t) && preset.fg ? Object.fromEntries(preset.fg.map((c, i) => [`--sd-fg-${i + 1}`, c])) : {}),
235
+ ...(!isLight(t) && preset.ink ? { '--sd-ink': preset.ink } : {}),
151
236
  '--sd-font': FONTS[t.font] || FONTS.system,
152
237
  '--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,
238
+ ...(isLight(t) ? lightTokens() : {}),
239
+ // Cards, pickers, tooltips and the notch, in the look's own colour (Standard keeps the navy they always had).
240
+ ...(t.id === 'standard' && !t.customised ? {} : isLight(t)
241
+ ? { '--sd-surface': 'rgba(255, 255, 255, 0.97)', '--sd-card': '#ffffff' }
242
+ : { '--sd-surface': rgba(mix(t.bg, '#ffffff', 0.06), glass >= 0.6 ? 0.82 : 0.96), '--sd-card': mix(t.bg, '#ffffff', 0.08) }),
153
243
  };
154
244
  }
155
245
 
156
246
  /** What the html element carries for the stylesheet: the theme and its backdrop. */
157
247
  export function themeAttrs(choice) {
158
248
  const t = resolveTheme(choice);
159
- return { theme: t.id, backdrop: t.backdrop };
249
+ return { theme: t.id, backdrop: t.backdrop, mode: isLight(t) ? 'light' : 'dark', buttons: t.buttons, dots: t.dots };
160
250
  }
161
251
 
162
252
  // A theme code to share: the choice as base64 JSON, behind a short prefix.
@@ -183,4 +273,4 @@ export function decodeTheme(code) {
183
273
  // it stay as they are. On the server it holds Standard's.
184
274
  export const TIER_COLORS = { ...STANDARD.tiers };
185
275
  // 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 };
276
+ export const MAP_LOOK = { you: STANDARD.you, lines: STANDARD.lines, line: STANDARD.line, bg: STANDARD.bg, dots: STANDARD.dots, light: false, text: '#ffffff' };