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
@@ -15,14 +15,14 @@ import { localPhoto } from '../../lib/photos';
15
15
  import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
16
16
 
17
17
  const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
18
- const LINE = '1px solid rgba(255,255,255,0.1)';
18
+ const LINE = '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)';
19
19
 
20
20
  function Face({ person, size = 36, ring }) {
21
21
  const color = TIER[person?.tier] || '#667';
22
22
  return (
23
23
  <div style={{ position: 'relative', width: size, height: size, flexShrink: 0 }}>
24
24
  <div style={{
25
- width: size, height: size, borderRadius: '50%', background: color, color: person?.tier === 'S' ? '#000' : '#fff',
25
+ width: size, height: size, borderRadius: '50%', background: color, color: person?.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
26
26
  display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: size * 0.34, fontWeight: 800,
27
27
  border: `2px solid ${ring || color}`,
28
28
  }}>{initialsFor(person?.name || '?')}</div>
@@ -40,7 +40,7 @@ function Ring({ progress, size = 86, color = '#FF6B35', children }) {
40
40
  return (
41
41
  <div style={{ position: 'relative', width: size, height: size }}>
42
42
  <svg width={size} height={size} style={{ position: 'absolute', inset: 0, transform: 'rotate(-90deg)' }}>
43
- <circle cx={size / 2} cy={size / 2} r={r} fill="none" stroke="rgba(255,255,255,0.08)" strokeWidth={5} />
43
+ <circle cx={size / 2} cy={size / 2} r={r} fill="none" stroke="rgba(var(--sd-ink, 255, 255, 255), 0.08)" strokeWidth={5} />
44
44
  <circle cx={size / 2} cy={size / 2} r={r} fill="none" stroke={color} strokeWidth={5} strokeLinecap="round"
45
45
  strokeDasharray={`${c * Math.min(1, progress)} ${c}`} style={{ transition: 'stroke-dasharray 0.5s ease' }} />
46
46
  </svg>
@@ -60,7 +60,7 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
60
60
  const done = cluster.done + 1;
61
61
  const first = String(cluster.bridge.name || '').split(/[\s,]+/)[0];
62
62
  setToast(done >= cluster.targets.length
63
- ? `+${XP_SEND[person.tier] || 2} · Stage ${cluster.stage} of ${first}'s circle cleared — the next ${STAGE_SIZE} are up`
63
+ ? `+${XP_SEND[person.tier] || 2} · Stage ${cluster.stage} of ${first}'s circle cleared. The next ${STAGE_SIZE} are up`
64
64
  : `+${XP_SEND[person.tier] || 2} · ${first}'s circle ${done}/${cluster.targets.length}`);
65
65
  setTimeout(() => setToast(null), 3500);
66
66
  }
@@ -76,20 +76,20 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
76
76
  <div style={{ fontSize: 26, fontWeight: 900, lineHeight: 1 }}>{level.level}</div>
77
77
  </div>
78
78
  <div style={{ flex: 1, minWidth: 220 }}>
79
- <div style={{ fontSize: 13, color: '#dfe6e9' }}>
79
+ <div style={{ fontSize: 13, color: 'var(--sd-fg-1, #dfe6e9)' }}>
80
80
  <b>{quest.points}</b> points · <b>{level.next - quest.points}</b> to level {level.level + 1}
81
81
  </div>
82
- <div style={{ height: 8, borderRadius: 4, background: 'rgba(255,255,255,0.08)', marginTop: 6, overflow: 'hidden' }}>
82
+ <div style={{ height: 8, borderRadius: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', marginTop: 6, overflow: 'hidden' }}>
83
83
  <div style={{ height: '100%', width: `${Math.round(level.progress * 100)}%`, background: 'linear-gradient(90deg, #FFD700, #FF6B35)', transition: 'width 0.5s' }} />
84
84
  </div>
85
- <div style={{ fontSize: 11.5, color: '#8b9a9a', marginTop: 6 }}>
86
- Points come from invites you send and people who accept — not from browsing.
85
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #8b9a9a)', marginTop: 6 }}>
86
+ Points come from invites you send and people who accept, not from browsing.
87
87
  </div>
88
88
  </div>
89
89
  {[[quest.sentTotal, 'invites sent'], [quest.addedTotal, 'people added'], [quest.clearedStages, 'stages cleared']].map(([n, l]) => (
90
90
  <div key={l} style={{ textAlign: 'center', minWidth: 80 }}>
91
91
  <div style={{ fontSize: 24, fontWeight: 900 }}>{n}</div>
92
- <div style={{ fontSize: 11, color: '#8b9a9a' }}>{l}</div>
92
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)' }}>{l}</div>
93
93
  </div>
94
94
  ))}
95
95
  </div>
@@ -97,7 +97,7 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
97
97
  {quest.newDoors.length > 0 && (
98
98
  <div style={{ marginTop: 12, padding: '10px 14px', borderRadius: 10, border: '1px solid rgba(0,255,136,0.3)', background: 'rgba(0,255,136,0.06)', fontSize: 13 }}>
99
99
  🚪 <b>{quest.newDoors.length} new {quest.newDoors.length === 1 ? 'door' : 'doors'}:</b> people you added through a circle, whose own circle isn&rsquo;t mapped yet.
100
- That&rsquo;s the next degree. <Link href="/setup" style={{ color: '#00ff88' }}>Map them on the Scan page →</Link>
100
+ That&rsquo;s the next degree. <Link href="/setup" style={{ color: 'var(--sd-green, #00ff88)' }}>Map them on the Scan page →</Link>
101
101
  </div>
102
102
  )}
103
103
 
@@ -107,16 +107,16 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
107
107
  <h3 style={{ margin: '22px 0 10px', fontSize: 15 }}>Next best moves</h3>
108
108
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: 12 }}>
109
109
  {quest.nextMoves.map(({ person, cluster }, i) => (
110
- <div key={person.id} style={{ padding: 14, borderRadius: 12, border: `1px solid ${TIER[person.tier]}55`, background: 'rgba(255,255,255,0.03)', position: 'relative' }}>
111
- <div style={{ position: 'absolute', top: 10, right: 12, fontSize: 11, fontWeight: 800, color: '#FF6B35' }}>#{i + 1}</div>
110
+ <div key={person.id} style={{ padding: 14, borderRadius: 12, border: `1px solid ${TIER[person.tier]}55`, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)', position: 'relative' }}>
111
+ <div style={{ position: 'absolute', top: 10, right: 12, fontSize: 11, fontWeight: 800, color: 'var(--sd-orange, #FF6B35)' }}>#{i + 1}</div>
112
112
  <div style={{ display: 'flex', gap: 10, alignItems: 'center' }}>
113
113
  <Face person={person} size={44} />
114
114
  <div style={{ minWidth: 0 }}>
115
115
  <div style={{ fontWeight: 700, fontSize: 14 }}>{person.name}</div>
116
- <div style={{ fontSize: 11.5, color: '#8b9a9a', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: 220 }}>{person.headline}</div>
116
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #8b9a9a)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: 220 }}>{person.headline}</div>
117
117
  </div>
118
118
  </div>
119
- <div style={{ fontSize: 11.5, color: '#aab7b7', margin: '10px 0' }}>
119
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-2, #aab7b7)', margin: '10px 0' }}>
120
120
  via <b style={{ color: TIER[cluster.bridge.tier] }}>{cluster.bridge.name}</b> · their circle {cluster.done}/{cluster.targets.length} this stage
121
121
  </div>
122
122
  <div style={{ display: 'flex', gap: 8 }}>
@@ -133,7 +133,7 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
133
133
 
134
134
  {/* 3. clusters */}
135
135
  <h3 style={{ margin: '26px 0 4px', fontSize: 15 }}>Circles to work through</h3>
136
- <div style={{ fontSize: 12, color: '#8b9a9a', marginBottom: 12 }}>
136
+ <div style={{ fontSize: 12, color: 'var(--sd-fg-3, #8b9a9a)', marginBottom: 12 }}>
137
137
  Each is one of your connections and the best people they know, {STAGE_SIZE} at a time. Fill the ring to clear a stage.
138
138
  </div>
139
139
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(190px, 1fr))', gap: 12 }}>
@@ -141,15 +141,15 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
141
141
  const isOpen = open === c.bridge.id;
142
142
  return (
143
143
  <button key={c.bridge.id} onClick={() => setOpen(isOpen ? null : c.bridge.id)} style={{
144
- padding: 12, borderRadius: 12, cursor: 'pointer', textAlign: 'center', color: '#fff',
145
- border: isOpen ? '1px solid #FF6B35' : LINE, background: c.complete ? 'rgba(0,255,136,0.06)' : 'rgba(255,255,255,0.03)',
144
+ padding: 12, borderRadius: 12, cursor: 'pointer', textAlign: 'center', color: 'var(--sd-fg-1, #fff)',
145
+ border: isOpen ? '1px solid #FF6B35' : LINE, background: c.complete ? 'rgba(0,255,136,0.06)' : 'rgba(var(--sd-ink, 255, 255, 255), 0.03)',
146
146
  display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 6,
147
147
  }}>
148
148
  <Ring progress={c.progress} color={c.complete ? '#00ff88' : '#FF6B35'}>
149
149
  <Face person={c.bridge} size={60} />
150
150
  </Ring>
151
151
  <div style={{ fontWeight: 700, fontSize: 13, maxWidth: 170, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{c.bridge.name}</div>
152
- <div style={{ fontSize: 11, color: c.complete ? '#00ff88' : '#aab7b7' }}>
152
+ <div style={{ fontSize: 11, color: c.complete ? 'var(--sd-green, #00ff88)' : 'var(--sd-fg-2, #aab7b7)' }}>
153
153
  {c.complete ? 'Circle cleared' : `Stage ${c.stage} of ${c.stages} · ${c.done}/${c.targets.length}`}
154
154
  </div>
155
155
  <div style={{ display: 'flex', gap: 4 }}>
@@ -160,7 +160,7 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
160
160
  }} />
161
161
  ))}
162
162
  </div>
163
- <div style={{ fontSize: 10.5, color: '#778' }}>
163
+ <div style={{ fontSize: 10.5, color: 'var(--sd-fg-4, #778)' }}>
164
164
  {c.open.S ? `${c.open.S} S · ` : ''}{c.open.A ? `${c.open.A} A · ` : ''}{c.people.length} worth adding{c.added.length ? ` · ★ ${c.added.length} added` : ''}
165
165
  </div>
166
166
  </button>
@@ -174,27 +174,27 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
174
174
  <Face person={expanded.bridge} size={40} />
175
175
  <div>
176
176
  <div style={{ fontWeight: 800 }}>{expanded.bridge.name}&rsquo;s circle · stage {expanded.stage} of {expanded.stages}</div>
177
- <div style={{ fontSize: 12, color: '#aab7b7' }}>Ask {expanded.bridge.name?.split(' ')[0]} for an intro, or invite them directly. Mark each one when it&rsquo;s sent.</div>
177
+ <div style={{ fontSize: 12, color: 'var(--sd-fg-2, #aab7b7)' }}>Ask {expanded.bridge.name?.split(' ')[0]} for an intro, or invite them directly. Mark each one when it&rsquo;s sent.</div>
178
178
  </div>
179
179
  </div>
180
180
  {expanded.targets.map((p) => {
181
181
  const sent = sentIds.has(p.id);
182
182
  return (
183
- <div key={p.id} style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '8px 0', borderTop: '1px solid rgba(255,255,255,0.05)' }}>
183
+ <div key={p.id} style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '8px 0', borderTop: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.05)' }}>
184
184
  <Face person={p} size={34} ring={sent ? '#00ff88' : undefined} />
185
185
  <div style={{ flex: 1, minWidth: 0 }}>
186
186
  <div style={{ fontWeight: 600, fontSize: 13 }}>{p.name} <span style={{ color: TIER[p.tier], fontSize: 11 }}>{p.tier}</span></div>
187
- <div style={{ fontSize: 11.5, color: '#8b9a9a', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.headline}</div>
187
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #8b9a9a)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.headline}</div>
188
188
  </div>
189
189
  {p.profile_url && <a href={p.profile_url} target="_blank" rel="noopener noreferrer" style={btnGhost}>LinkedIn</a>}
190
190
  {sent
191
- ? <button onClick={() => onUndo(p)} style={{ ...btnGhost, color: '#00ff88' }}>Sent ✓ (undo)</button>
191
+ ? <button onClick={() => onUndo(p)} style={{ ...btnGhost, color: 'var(--sd-green, #00ff88)' }}>Sent ✓ (undo)</button>
192
192
  : <button onClick={() => send(p, expanded)} style={btnHot}>Sent · +{XP_SEND[p.tier] || 2}</button>}
193
193
  </div>
194
194
  );
195
195
  })}
196
196
  {expanded.added.length > 0 && (
197
- <div style={{ marginTop: 10, fontSize: 12, color: '#00ff88' }}>
197
+ <div style={{ marginTop: 10, fontSize: 12, color: 'var(--sd-green, #00ff88)' }}>
198
198
  ★ Added from this circle: {expanded.added.map((a) => a.name).join(', ')}
199
199
  </div>
200
200
  )}
@@ -211,4 +211,4 @@ export default function OutlinkQuest({ recs, sentIds, added, mappedIds, reach, o
211
211
  }
212
212
 
213
213
  const btnHot = { padding: '7px 12px', borderRadius: 8, border: 'none', cursor: 'pointer', fontWeight: 800, fontSize: 12, background: 'linear-gradient(135deg, #FF6B35, #FFD700)', color: '#000' };
214
- const btnGhost = { padding: '7px 12px', borderRadius: 8, border: LINE, cursor: 'pointer', fontWeight: 600, fontSize: 12, background: 'rgba(255,255,255,0.05)', color: '#dfe6e9', textDecoration: 'none' };
214
+ const btnGhost = { padding: '7px 12px', borderRadius: 8, border: LINE, cursor: 'pointer', fontWeight: 600, fontSize: 12, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', color: 'var(--sd-fg-1, #dfe6e9)', textDecoration: 'none' };
@@ -28,7 +28,7 @@ import {
28
28
  import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
29
29
 
30
30
  const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
31
- const LINE = '1px solid rgba(255,255,255,0.1)';
31
+ const LINE = '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)';
32
32
  const MAX_BUBBLES = 140;
33
33
  const ALL_INDUSTRIES = [...INDUSTRIES, UNKNOWN_INDUSTRY];
34
34
 
@@ -44,7 +44,7 @@ export function Seg({ value, onChange, options }) {
44
44
  {options.map(([v, label]) => (
45
45
  <button key={v} onClick={() => onChange(v)} style={{
46
46
  padding: '5px 10px', fontSize: 11.5, fontWeight: 600, border: 'none', cursor: 'pointer',
47
- background: value === v ? 'rgba(52,152,219,0.25)' : 'transparent', color: value === v ? '#cfe6f7' : '#8b9a9a',
47
+ background: value === v ? 'rgba(52,152,219,0.25)' : 'transparent', color: value === v ? 'var(--sd-fg-1, #cfe6f7)' : 'var(--sd-fg-3, #8b9a9a)',
48
48
  }}>{label}</button>
49
49
  ))}
50
50
  </div>
@@ -80,27 +80,28 @@ export function SidePanel({ open, onToggle, children }) {
80
80
  <button type="button" onClick={onToggle} style={{
81
81
  position: 'fixed', left: 16, top: 140, zIndex: 30, cursor: 'pointer', height: 36, borderRadius: 18, padding: '0 14px 0 10px',
82
82
  display: 'flex', alignItems: 'center', gap: 6, background: 'rgba(52,152,219,0.15)', border: '2px solid rgba(52,152,219,0.5)',
83
- color: '#3498DB', fontWeight: 700, boxShadow: '0 0 12px rgba(52,152,219,0.3)', backdropFilter: 'blur(8px)',
83
+ color: 'var(--sd-blue, #3498DB)', fontWeight: 700, boxShadow: '0 0 12px rgba(52,152,219,0.3)', backdropFilter: 'blur(8px)',
84
84
  }}>
85
85
  <span style={{ fontSize: 18 }}>›</span><span style={{ fontSize: 11, fontWeight: 600 }}>Filters</span>
86
86
  </button>
87
87
  );
88
88
  }
89
89
  return (
90
- <aside style={{
90
+ <aside data-glass-panel="side" style={{
91
91
  width: 300, flexShrink: 0, height: '100%', overflowY: 'auto', boxSizing: 'border-box', padding: '16px 14px',
92
92
  borderRight: '1px solid rgba(52,152,219,0.15)', background: 'var(--sd-panel)', fontSize: 13,
93
+ backdropFilter: 'var(--sd-panel-blur)', WebkitBackdropFilter: 'var(--sd-panel-blur)',
93
94
  }}>
94
95
  <button type="button" onClick={onToggle} style={{
95
96
  display: 'flex', alignItems: 'center', gap: 6, width: '100%', marginBottom: 14, padding: '6px 12px', borderRadius: 6, cursor: 'pointer',
96
- background: 'rgba(255,255,255,0.06)', border: '1px solid rgba(255,255,255,0.1)', color: '#aaa', fontSize: 12, fontWeight: 600,
97
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)', color: 'var(--sd-fg-3, #aaa)', fontSize: 12, fontWeight: 600,
97
98
  }}><span style={{ fontSize: 16 }}>›</span> Close</button>
98
99
  {children}
99
100
  </aside>
100
101
  );
101
102
  }
102
103
 
103
- export const panelHeading = { fontSize: 9, fontWeight: 700, color: '#555', letterSpacing: 1, margin: '14px 0 6px', textTransform: 'uppercase' };
104
+ export const panelHeading = { fontSize: 9, fontWeight: 700, color: 'var(--sd-fg-5, #555)', letterSpacing: 1, margin: '14px 0 6px', textTransform: 'uppercase' };
104
105
 
105
106
  /** Does this person pass the filters? Tier and degree from the grid, as in Network Circle. */
106
107
  function passes(p, f) {
@@ -195,9 +196,9 @@ export default function PathsAnalyzer({ d1 = [], d2 = [], d3 = [], initialShow =
195
196
  industries={industries} hidden={hidden} setHidden={setHidden}
196
197
  onIndustry={(key) => setFocus({ kind: 'industry', key })} />
197
198
  <div style={panelHeading}>Read the map</div>
198
- <div style={{ fontSize: 11, color: '#8b9a9a', marginBottom: 4 }}>Bubble size</div>
199
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)', marginBottom: 4 }}>Bubble size</div>
199
200
  <Seg value={sizeBy} onChange={setSizeBy} options={[['people', 'Your people'], ['sa', 'S & A there'], ['known', 'You know']]} />
200
- <div style={{ fontSize: 11, color: '#8b9a9a', margin: '10px 0 4px' }}>Names</div>
201
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)', margin: '10px 0 4px' }}>Names</div>
201
202
  <Seg value={labels} onChange={setLabels} options={[['top', 'Biggest'], ['all', 'All'], ['none', 'None']]} />
202
203
  {look('How strong your people at each company are: the average power score of the five strongest. The hotter, the stronger; size is still how many.')}
203
204
  </SidePanel>
@@ -226,10 +227,10 @@ function Filters({ filters, setFilters, counts, query, setQuery, industries, hid
226
227
  <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
227
228
  <div style={panelHeading}>Filter</div>
228
229
  <input value={query} onChange={(e) => setQuery(e.target.value)} placeholder="Find a company"
229
- style={{ padding: '6px 10px', borderRadius: 7, border: LINE, background: 'rgba(255,255,255,0.05)', color: '#fff', fontSize: 13, width: '100%', boxSizing: 'border-box' }} />
230
+ style={{ padding: '6px 10px', borderRadius: 7, border: LINE, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', color: 'var(--sd-fg-1, #fff)', fontSize: 13, width: '100%', boxSizing: 'border-box' }} />
230
231
  {/* The same tiers × degrees as Network Circle (Blake, 2026-10-02) */}
231
232
  <TierGrid grid={filters.grid} counts={counts} onChange={(g) => set('grid', g)} mode="paths" />
232
- <div style={{ fontSize: 11, color: '#8b9a9a', marginTop: -10 }}>Level</div>
233
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)', marginTop: -10 }}>Level</div>
233
234
  <Seg value={filters.seniority} onChange={(v) => set('seniority', v)} options={[['all', 'Any level'], ['senior', 'Director+'], ['csuite', 'C-suite']]} />
234
235
  <div style={panelHeading}>Industries</div>
235
236
  <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
@@ -241,13 +242,13 @@ function Filters({ filters, setFilters, counts, query, setQuery, industries, hid
241
242
  onClick={() => setHidden((h) => { const n = new Set(h); if (n.has(i.key)) n.delete(i.key); else n.add(i.key); return n; })}
242
243
  style={{ padding: '3px 7px', border: 'none', background: `${i.color}22`, cursor: 'pointer', color: i.color, fontSize: 11 }}>●</button>
243
244
  <button onClick={() => onIndustry(i.key)} title="Analyse this industry"
244
- style={{ padding: '3px 9px 3px 5px', border: 'none', background: 'transparent', cursor: 'pointer', color: '#cfd8d8', fontSize: 11.5 }}>
245
- {i.label} <span style={{ color: '#778' }}>{i.people.length}</span>
245
+ style={{ padding: '3px 9px 3px 5px', border: 'none', background: 'transparent', cursor: 'pointer', color: 'var(--sd-fg-2, #cfd8d8)', fontSize: 11.5 }}>
246
+ {i.label} <span style={{ color: 'var(--sd-fg-4, #778)' }}>{i.people.length}</span>
246
247
  </button>
247
248
  </span>
248
249
  );
249
250
  })}
250
- <span style={{ fontSize: 11, color: '#667', alignSelf: 'center' }}>Inferred from companies and headlines. ● hides one; its name opens it.</span>
251
+ <span style={{ fontSize: 11, color: 'var(--sd-fg-4, #667)', alignSelf: 'center' }}>Inferred from companies and headlines. ● hides one; its name opens it.</span>
251
252
  </div>
252
253
  </div>
253
254
  );
@@ -349,7 +350,7 @@ function CompanyMap({ companies, links, focus, onCompany, onIndustry, onClear, s
349
350
  const on = active && (e.source.id === active || e.target.id === active);
350
351
  return (
351
352
  <line key={i} x1={e.source.x} y1={e.source.y} x2={e.target.x} y2={e.target.y}
352
- stroke={on ? '#FF6B35' : '#8fa6c0'} strokeOpacity={on ? 0.8 : active ? 0.04 : 0.14}
353
+ stroke={on ? '#FF6B35' : 'var(--sd-fg-3, #8fa6c0)'} strokeOpacity={on ? 0.8 : active ? 0.04 : 0.14}
353
354
  strokeWidth={on ? 1 + Math.log2(1 + e.weight) : 0.4 + Math.log2(1 + e.weight) * 0.5} />
354
355
  );
355
356
  })}
@@ -371,19 +372,19 @@ function CompanyMap({ companies, links, focus, onCompany, onIndustry, onClear, s
371
372
  onPointerDown={drag ? (ev) => drag(ev, n) : undefined}
372
373
  onClick={(ev) => { ev.stopPropagation(); if (clicked()) onCompany(n.id); }}>
373
374
  <title>{`${n.co.name} · ${n.co.industry.label} (inferred)\n${n.co.d1} you know · ${n.co.d2} reachable${n.co.d3 ? ` · ${n.co.d3} further` : ''}`}</title>
374
- <circle r={n.r} fill={hot ? heatColour(heat(n)) : n.co.industry.color} fillOpacity={hot ? 0.9 : 0.75}
375
- stroke={sel ? '#fff' : n.co.S ? TIER.S : 'rgba(0,0,0,0.35)'} strokeWidth={sel ? 2.5 : n.co.S ? 1.5 : 0.6} />
375
+ <circle className="sd-dot" r={n.r} fill={hot ? heatColour(heat(n)) : n.co.industry.color} fillOpacity={hot ? 0.9 : 0.75}
376
+ stroke={sel ? 'var(--sd-fg-1, #fff)' : n.co.S ? TIER.S : 'rgba(0,0,0,0.35)'} strokeWidth={sel ? 2.5 : n.co.S ? 1.5 : 0.6} />
376
377
  {/* the share you already know, as an inner disc */}
377
- {n.co.d1 > 0 && <circle r={n.r * Math.sqrt(n.co.d1 / Math.max(1, n.co.people.length))} fill="#fff" fillOpacity={0.35} />}
378
+ {n.co.d1 > 0 && <circle r={n.r * Math.sqrt(n.co.d1 / Math.max(1, n.co.people.length))} fill="var(--sd-fg-1, #fff)" fillOpacity={0.35} />}
378
379
  {(labelled.has(n.id) || n.id === active || sel) && (
379
- <text y={n.r + 11} textAnchor="middle" fontSize={10} fill="#e6edf0" style={{ pointerEvents: 'none' }}>{n.co.name}</text>
380
+ <text y={n.r + 11} textAnchor="middle" fontSize={10} fill="var(--sd-fg-1, #e6edf0)" style={{ pointerEvents: 'none' }}>{n.co.name}</text>
380
381
  )}
381
382
  </g>
382
383
  );
383
384
  })}
384
385
  </svg>
385
386
  )}
386
- <div style={{ position: 'absolute', left: 12, bottom: 10, fontSize: 11, color: '#778', lineHeight: 1.6, pointerEvents: 'none' }}>
387
+ <div style={{ position: 'absolute', left: 12, bottom: 10, fontSize: 11, color: 'var(--sd-fg-4, #778)', lineHeight: 1.6, pointerEvents: 'none' }}>
387
388
  Bubble = a company, sized by your people there; {hot ? 'colour = how strong they are, cold to white hot' : 'colour = its industry'}; white centre = the share you already know; gold ring = an S-tier person inside.<br />
388
389
  A line = one of your connections at one company knows people at the other.
389
390
  {layout.cut ? ` Showing the ${MAX_BUBBLES} largest; ${layout.cut} smaller companies are in Companies.` : ''}
@@ -394,7 +395,7 @@ function CompanyMap({ companies, links, focus, onCompany, onIndustry, onClear, s
394
395
 
395
396
  function Bar({ parts, total }) {
396
397
  return (
397
- <div style={{ display: 'flex', height: 6, borderRadius: 3, overflow: 'hidden', background: 'rgba(255,255,255,0.06)' }}>
398
+ <div style={{ display: 'flex', height: 6, borderRadius: 3, overflow: 'hidden', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)' }}>
398
399
  {parts.map(([n, color], i) => <div key={i} style={{ width: `${(n / Math.max(1, total)) * 100}%`, background: color }} />)}
399
400
  </div>
400
401
  );
@@ -406,7 +407,7 @@ function PersonLine({ p, note }) {
406
407
  <span style={{ width: 7, height: 7, borderRadius: '50%', background: TIER[p.tier] || '#667', flexShrink: 0 }} />
407
408
  <div style={{ minWidth: 0, flex: 1 }}>
408
409
  <div style={{ fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{p.name}</div>
409
- <div style={{ fontSize: 11, color: '#8b9a9a', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{note || p.headline}</div>
410
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{note || p.headline}</div>
410
411
  </div>
411
412
  </div>
412
413
  );
@@ -437,9 +438,9 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
437
438
  const topCos = !isCompany ? [...data.companies.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10) : [];
438
439
 
439
440
  return (
440
- <aside style={{ width: 360, flexShrink: 0, borderLeft: LINE, overflow: 'auto', padding: 16, background: 'rgba(255,255,255,0.02)' }}>
441
- <button onClick={onClose} style={{ background: 'none', border: 'none', color: '#888', cursor: 'pointer', fontSize: 12, padding: 0 }}>✕ Close</button>
442
- <div style={{ fontSize: 10, letterSpacing: 1, color: '#8b9a9a', marginTop: 8 }}>{isCompany ? 'COMPANY' : 'INDUSTRY'} ANALYZER</div>
441
+ <aside style={{ width: 360, flexShrink: 0, borderLeft: LINE, overflow: 'auto', padding: 16, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.02)' }}>
442
+ <button onClick={onClose} style={{ background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)', cursor: 'pointer', fontSize: 12, padding: 0 }}>✕ Close</button>
443
+ <div style={{ fontSize: 10, letterSpacing: 1, color: 'var(--sd-fg-3, #8b9a9a)', marginTop: 8 }}>{isCompany ? 'COMPANY' : 'INDUSTRY'} ANALYZER</div>
443
444
  <h2 style={{ margin: '4px 0 6px', fontSize: 20 }}>{isCompany ? data.name : data.label}</h2>
444
445
  {/* A company's industry opens that industry here (Blake, 2026-10-02: industries live in the side card, not a tab). */}
445
446
  {isCompany && onIndustry ? (
@@ -455,9 +456,9 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
455
456
 
456
457
  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 8, margin: '14px 0' }}>
457
458
  {[[d1n, 'you know', '#00ff88'], [d2n, 'reachable', '#FF6B35'], [people.filter((p) => isSenior(p.headline)).length, 'director+', '#FFD700']].map(([n, l, c]) => (
458
- <div key={l} style={{ padding: 8, borderRadius: 8, background: 'rgba(255,255,255,0.04)', textAlign: 'center' }}>
459
+ <div key={l} style={{ padding: 8, borderRadius: 8, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.04)', textAlign: 'center' }}>
459
460
  <div style={{ fontSize: 20, fontWeight: 800, color: c }}>{n}</div>
460
- <div style={{ fontSize: 10.5, color: '#8b9a9a' }}>{l}</div>
461
+ <div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #8b9a9a)' }}>{l}</div>
461
462
  </div>
462
463
  ))}
463
464
  </div>
@@ -465,16 +466,16 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
465
466
  <Section title="By level">
466
467
  {levels.map(([label, { n }]) => (
467
468
  <div key={label} style={{ display: 'grid', gridTemplateColumns: '110px 1fr 28px', gap: 8, alignItems: 'center', fontSize: 11.5, marginBottom: 4 }}>
468
- <span style={{ color: '#aab7b7' }}>{label}</span>
469
+ <span style={{ color: 'var(--sd-fg-2, #aab7b7)' }}>{label}</span>
469
470
  <Bar total={people.length} parts={[[n, '#3498DB']]} />
470
- <span style={{ color: '#778', textAlign: 'right' }}>{n}</span>
471
+ <span style={{ color: 'var(--sd-fg-4, #778)', textAlign: 'right' }}>{n}</span>
471
472
  </div>
472
473
  ))}
473
474
  </Section>
474
475
 
475
476
  {isCompany && ways && (
476
477
  <Section title="Ways in">
477
- {ways.direct.length > 0 && <div style={{ fontSize: 11, color: '#00ff88', margin: '2px 0' }}>You already know {ways.direct.length} here</div>}
478
+ {ways.direct.length > 0 && <div style={{ fontSize: 11, color: 'var(--sd-green, #00ff88)', margin: '2px 0' }}>You already know {ways.direct.length} here</div>}
478
479
  {(() => {
479
480
  // One line per person: someone who works here and also knows others
480
481
  // here is the best way in of all, so they lead, with both facts.
@@ -492,7 +493,7 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
492
493
  </>
493
494
  );
494
495
  })()}
495
- {!ways.direct.length && !ways.bridges.length && <div style={{ fontSize: 12, color: '#778' }}>No one you know links here yet.</div>}
496
+ {!ways.direct.length && !ways.bridges.length && <div style={{ fontSize: 12, color: 'var(--sd-fg-4, #778)' }}>No one you know links here yet.</div>}
496
497
  </Section>
497
498
  )}
498
499
 
@@ -504,8 +505,8 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
504
505
  <Section title="Connected companies">
505
506
  <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
506
507
  {related.map((r) => (
507
- <button key={r.name} onClick={() => onCompany(r.name)} style={{ padding: '3px 9px', borderRadius: 10, border: LINE, background: `${(index.get(r.name)?.industry.color || '#666')}22`, color: '#dfe6e9', fontSize: 11.5, cursor: 'pointer' }}>
508
- {r.name} <span style={{ color: '#778' }}>{r.weight}</span>
508
+ <button key={r.name} onClick={() => onCompany(r.name)} style={{ padding: '3px 9px', borderRadius: 10, border: LINE, background: `${(index.get(r.name)?.industry.color || '#666')}22`, color: 'var(--sd-fg-1, #dfe6e9)', fontSize: 11.5, cursor: 'pointer' }}>
509
+ {r.name} <span style={{ color: 'var(--sd-fg-4, #778)' }}>{r.weight}</span>
509
510
  </button>
510
511
  ))}
511
512
  </div>
@@ -518,7 +519,7 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
518
519
  <div key={name} onClick={() => onCompany(name)} style={{ display: 'grid', gridTemplateColumns: '1fr 60px 24px', gap: 8, alignItems: 'center', fontSize: 12, padding: '3px 0', cursor: 'pointer' }}>
519
520
  <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{name}</span>
520
521
  <Bar total={topCos[0][1]} parts={[[n, industry.color]]} />
521
- <span style={{ color: '#778', textAlign: 'right' }}>{n}</span>
522
+ <span style={{ color: 'var(--sd-fg-4, #778)', textAlign: 'right' }}>{n}</span>
522
523
  </div>
523
524
  ))}
524
525
  </Section>
@@ -536,7 +537,7 @@ function AnalyzerPanel({ focus, data, index, links, d1, d2, filters, onClose, on
536
537
  function Section({ title, children }) {
537
538
  return (
538
539
  <div style={{ marginTop: 14 }}>
539
- <div style={{ fontSize: 10.5, letterSpacing: 0.8, color: '#8b9a9a', fontWeight: 700, marginBottom: 6 }}>{title.toUpperCase()}</div>
540
+ <div style={{ fontSize: 10.5, letterSpacing: 0.8, color: 'var(--sd-fg-3, #8b9a9a)', fontWeight: 700, marginBottom: 6 }}>{title.toUpperCase()}</div>
540
541
  {children}
541
542
  </div>
542
543
  );
@@ -550,8 +551,8 @@ function CompanyScoreLine({ name }) {
550
551
  if (!c) return null;
551
552
  const from = { yours: 'your score', known: 'known list', network: 'estimated', default: 'unknown company' }[c.source];
552
553
  return (
553
- <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 10, fontSize: 12, color: '#aab7b7' }}>
554
- Company score <b style={{ color: '#fff', fontSize: 15 }}>{c.score}</b>/10 · {from}
554
+ <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 10, fontSize: 12, color: 'var(--sd-fg-2, #aab7b7)' }}>
555
+ Company score <b style={{ color: 'var(--sd-fg-1, #fff)', fontSize: 15 }}>{c.score}</b>/10 · {from}
555
556
  <span style={{ marginLeft: 'auto' }}><ScorePicker company={c} onSet={setScore} compact /></span>
556
557
  </div>
557
558
  );
@@ -25,7 +25,7 @@ import { clusterStrength } from '../../lib/map-heat';
25
25
  import { TIER_COLORS as THEME_TIERS } from '../../lib/themes';
26
26
 
27
27
  const TIER = THEME_TIERS; // the theme's dot colours (lib/themes.js)
28
- const LINE = '1px solid rgba(255,255,255,0.1)';
28
+ const LINE = '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)';
29
29
  const UNSCANNED = '#3a3f55';
30
30
  const MAX_BUBBLES = 400;
31
31
  const ALL_INDUSTRIES = [...INDUSTRIES, UNKNOWN_INDUSTRY];
@@ -88,7 +88,7 @@ export default function PeopleMap({ d1 = [], d2 = [], top = null, look = null, c
88
88
  {top}
89
89
  <div style={panelHeading}>Filter</div>
90
90
  <input value={query} onChange={(e) => setQuery(e.target.value)} placeholder="Find a person"
91
- style={{ width: '100%', boxSizing: 'border-box', padding: '6px 10px', borderRadius: 7, border: LINE, background: 'rgba(255,255,255,0.05)', color: '#fff', fontSize: 13, marginBottom: 8 }} />
91
+ style={{ width: '100%', boxSizing: 'border-box', padding: '6px 10px', borderRadius: 7, border: LINE, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', color: 'var(--sd-fg-1, #fff)', fontSize: 13, marginBottom: 8 }} />
92
92
  <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
93
93
  <Seg value={who} onChange={setWho} options={[['scanned', `Scanned (${fmt(scannedCount)})`], ['all', `All (${fmt(model.people.length)})`]]} />
94
94
  </div>
@@ -103,18 +103,18 @@ export default function PeopleMap({ d1 = [], d2 = [], top = null, look = null, c
103
103
  <button key={i.key} title={off ? 'Show on the map' : 'Hide from the map'}
104
104
  onClick={() => setHidden((h) => { const n = new Set(h); if (n.has(i.key)) n.delete(i.key); else n.add(i.key); return n; })}
105
105
  style={{ display: 'inline-flex', alignItems: 'center', gap: 6, padding: '3px 10px', borderRadius: 14, cursor: 'pointer',
106
- border: `1px solid ${i.color}55`, background: off ? 'transparent' : `${i.color}14`, color: '#cfd8d8', fontSize: 11.5, opacity: off ? 0.4 : 1 }}>
106
+ border: `1px solid ${i.color}55`, background: off ? 'transparent' : `${i.color}14`, color: 'var(--sd-fg-2, #cfd8d8)', fontSize: 11.5, opacity: off ? 0.4 : 1 }}>
107
107
  <span style={{ width: 7, height: 7, borderRadius: '50%', background: i.color }} />
108
- {i.label} <span style={{ color: '#778' }}>{fmt(i.count)}</span>
108
+ {i.label} <span style={{ color: 'var(--sd-fg-4, #778)' }}>{fmt(i.count)}</span>
109
109
  </button>
110
110
  );
111
111
  })}
112
112
  </div>
113
- <div style={{ fontSize: 10.5, color: '#667', marginTop: 6 }}>Inferred from where each connection works.</div>
113
+ <div style={{ fontSize: 10.5, color: 'var(--sd-fg-4, #667)', marginTop: 6 }}>Inferred from where each connection works.</div>
114
114
  <div style={panelHeading}>Read the map</div>
115
- <div style={{ fontSize: 11, color: '#8b9a9a', marginBottom: 4 }}>Bubble size</div>
115
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)', marginBottom: 4 }}>Bubble size</div>
116
116
  <Seg value={sizeBy} onChange={setSizeBy} options={Object.entries(SIZE_BY).map(([k, v]) => [k, v.label])} />
117
- <div style={{ fontSize: 11, color: '#8b9a9a', margin: '10px 0 4px' }}>Names</div>
117
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)', margin: '10px 0 4px' }}>Names</div>
118
118
  <Seg value={labels} onChange={setLabels} options={[['top', 'Biggest'], ['all', 'All'], ['none', 'None']]} />
119
119
  {look}
120
120
  </SidePanel>
@@ -221,7 +221,7 @@ function Bubbles({ people, links, sizeBy, sectorOf, rank, onOpen, names = 'top',
221
221
  const on = hover && (e.source.id === hover || e.target.id === hover);
222
222
  return (
223
223
  <line key={i} x1={e.source.x} y1={e.source.y} x2={e.target.x} y2={e.target.y}
224
- stroke={on ? '#FF6B35' : '#8fa6c0'} strokeOpacity={on ? 0.8 : hover ? 0.03 : 0.09}
224
+ stroke={on ? '#FF6B35' : 'var(--sd-fg-3, #8fa6c0)'} strokeOpacity={on ? 0.8 : hover ? 0.03 : 0.09}
225
225
  strokeWidth={on ? 1 + Math.log2(1 + e.weight) : 0.4 + Math.log2(1 + e.weight) * 0.4} />
226
226
  );
227
227
  })}
@@ -239,14 +239,14 @@ function Bubbles({ people, links, sizeBy, sectorOf, rank, onOpen, names = 'top',
239
239
  onMouseEnter={() => setHover(n.id)} onMouseLeave={() => setHover(null)}
240
240
  onPointerDown={drag ? (ev) => drag(ev, n) : undefined}
241
241
  onClick={() => { if (clicked() && p.size) onOpen(n.id); }}>
242
- <circle r={n.r} fill={!p.size ? UNSCANNED : hot ? heatColour(heat(n)) : n.sector.color} fillOpacity={p.size ? 0.92 : 0.6}
243
- stroke={hover === n.id ? '#fff' : p.S ? TIER.S : 'rgba(0,0,0,0.35)'}
242
+ <circle className="sd-dot" r={n.r} fill={!p.size ? UNSCANNED : hot ? heatColour(heat(n)) : n.sector.color} fillOpacity={p.size ? 0.92 : 0.6}
243
+ stroke={hover === n.id ? 'var(--sd-fg-1, #fff)' : p.S ? TIER.S : 'rgba(0,0,0,0.35)'}
244
244
  strokeWidth={hover === n.id ? 2.5 : p.S ? Math.min(4, 1 + p.S / 40) : 0.6} />
245
245
  {/* The share of their cluster only they can open, as an inner disc */}
246
- {p.size > 0 && p.only > 0 && <circle r={n.r * Math.sqrt(p.share) * 0.85} fill="#fff" fillOpacity={0.3} />}
246
+ {p.size > 0 && p.only > 0 && <circle r={n.r * Math.sqrt(p.share) * 0.85} fill="var(--sd-fg-1, #fff)" fillOpacity={0.3} />}
247
247
  {(labelled.has(n.id) || hover === n.id) && (
248
- <text y={n.r + 11} textAnchor="middle" fontSize={10} fill="#e6edf0" style={{ pointerEvents: 'none' }}
249
- paintOrder="stroke" stroke="rgba(0,0,0,0.6)" strokeWidth={3}>{p.person.name}</text>
248
+ <text y={n.r + 11} textAnchor="middle" fontSize={10} fill="var(--sd-fg-1, #e6edf0)" style={{ pointerEvents: 'none' }}
249
+ paintOrder="stroke" stroke="rgba(var(--sd-shade, 0, 0, 0), 0.6)" strokeWidth={3}>{p.person.name}</text>
250
250
  )}
251
251
  </g>
252
252
  );
@@ -254,7 +254,7 @@ function Bubbles({ people, links, sizeBy, sectorOf, rank, onOpen, names = 'top',
254
254
  </svg>
255
255
  )}
256
256
  {hovered && <Card n={hovered} at={onScreen(hovered)} w={w} rank={rank(hovered.id)} />}
257
- <div style={{ position: 'absolute', left: 12, bottom: 10, fontSize: 11, color: '#778', lineHeight: 1.6, pointerEvents: 'none' }}>
257
+ <div style={{ position: 'absolute', left: 12, bottom: 10, fontSize: 11, color: 'var(--sd-fg-4, #778)', lineHeight: 1.6, pointerEvents: 'none' }}>
258
258
  Bubble = one of your connections, sized by {sizeBy.label.toLowerCase()} (value: S tier counts 3, A tier 2, everyone else 1){hot ? '; colour = how strong their cluster is, person for person, cold to white hot' : ''};
259
259
  white centre = the share of their cluster only they can open; gold ring = S tier inside.<br />
260
260
  A line = two of your connections whose clusters share people. Grey = not scanned yet.
@@ -273,11 +273,11 @@ function Card({ n, at, w, rank }) {
273
273
  return (
274
274
  <div style={{
275
275
  position: 'absolute', left, top: Math.max(8, at.y - 70), width, pointerEvents: 'none', zIndex: 5,
276
- padding: '12px 14px', borderRadius: 12, background: 'rgba(8,10,22,0.96)', border: `1px solid ${n.sector.color}99`,
277
- boxShadow: '0 12px 40px rgba(0,0,0,0.6)', fontSize: 12, lineHeight: 1.45, color: '#ddd',
276
+ padding: '12px 14px', borderRadius: 12, background: 'var(--sd-surface, rgba(8,10,22,0.96))', border: `1px solid ${n.sector.color}99`,
277
+ boxShadow: '0 12px 40px rgba(0,0,0,0.6)', fontSize: 12, lineHeight: 1.45, color: 'var(--sd-fg-1, #ddd)',
278
278
  }}>
279
- <div style={{ fontSize: 15, fontWeight: 800, color: '#fff' }}>{p.person.name}</div>
280
- <div style={{ fontSize: 11.5, color: '#8a8fa8' }}>
279
+ <div style={{ fontSize: 15, fontWeight: 800, color: 'var(--sd-fg-1, #fff)' }}>{p.person.name}</div>
280
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #8a8fa8)' }}>
281
281
  {role}{p.person.tier ? ` · ${p.person.tier}-tier` : ''} · {n.sector.label}
282
282
  </div>
283
283
  {p.size ? (
@@ -288,12 +288,12 @@ function Card({ n, at, w, rank }) {
288
288
  <Stat value={`${fmt(p.S)} S · ${fmt(p.A)} A`} label="the strongest among them" color="#FFD700" />
289
289
  <Stat value={`${fmt(p.only)} (${Math.round(p.share * 100)}%)`} label="only through them" color="#00E5FF" />
290
290
  </div>
291
- <div style={{ fontSize: 11.5, color: '#aab' }}>
291
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #aab)' }}>
292
292
  {rank === 1 ? 'The most valuable cluster you’ve scanned. ' : rank != null ? `Worth more than ${Math.round(rank * 100)}% of the clusters you’ve scanned. ` : ''}Click to open it in Bridge Chains.
293
293
  </div>
294
294
  </>
295
295
  ) : (
296
- <div style={{ fontSize: 11.5, color: '#aab', marginTop: 8 }}>Their circle isn’t scanned yet, so there’s no cluster to size.</div>
296
+ <div style={{ fontSize: 11.5, color: 'var(--sd-fg-3, #aab)', marginTop: 8 }}>Their circle isn’t scanned yet, so there’s no cluster to size.</div>
297
297
  )}
298
298
  </div>
299
299
  );
@@ -303,7 +303,7 @@ function Stat({ value, label, color = '#fff' }) {
303
303
  return (
304
304
  <div>
305
305
  <div style={{ fontSize: 15, fontWeight: 800, color }}>{value}</div>
306
- <div style={{ fontSize: 10.5, color: '#8a8fa8' }}>{label}</div>
306
+ <div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #8a8fa8)' }}>{label}</div>
307
307
  </div>
308
308
  );
309
309
  }
@@ -55,7 +55,7 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
55
55
  <div style={{
56
56
  width: 56, height: 56, borderRadius: '50%', margin: '0 auto',
57
57
  border: `3px solid ${TIER_COLORS[cl.bridge.tier]}`,
58
- overflow: 'hidden', background: '#1a1a2e',
58
+ overflow: 'hidden', background: 'var(--sd-card, #1a1a2e)',
59
59
  boxShadow: hoveredId === cl.bridge.id ? `0 0 20px ${TIER_COLORS[cl.bridge.tier]}60` : `0 0 10px ${TIER_COLORS[cl.bridge.tier]}20`,
60
60
  transition: 'box-shadow 0.2s',
61
61
  }}>
@@ -63,12 +63,12 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
63
63
  <img src={localPhoto(cl.bridge.profile_image_url)} alt="" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />
64
64
  ) : (
65
65
  <div style={{ width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center',
66
- background: TIER_COLORS[cl.bridge.tier], color: cl.bridge.tier === 'S' ? '#000' : '#fff', fontSize: 20, fontWeight: 800 }}>
66
+ background: TIER_COLORS[cl.bridge.tier], color: cl.bridge.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)', fontSize: 20, fontWeight: 800 }}>
67
67
  {cl.bridge.name?.charAt(0)}
68
68
  </div>
69
69
  )}
70
70
  </div>
71
- <div style={{ fontSize: 12, fontWeight: 700, color: '#fff', marginTop: 4 }}>{cl.bridge.name}</div>
71
+ <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--sd-fg-1, #fff)', marginTop: 4 }}>{cl.bridge.name}</div>
72
72
  <div style={{ fontSize: 9, color: TIER_COLORS[cl.bridge.tier], fontWeight: 600 }}>
73
73
  {cl.bridge.tier}-Tier · {cl.total} connections · {cl.sCount > 0 ? cl.sCount + 'S ' : ''}{cl.aCount > 0 ? cl.aCount + 'A' : ''}
74
74
  </div>
@@ -106,7 +106,7 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
106
106
  onError={e => { e.target.style.display = 'none'; e.target.parentElement.style.background = TIER_COLORS[tier]; }} />
107
107
  ) : (
108
108
  <span style={{ display: 'flex', width: '100%', height: '100%', alignItems: 'center', justifyContent: 'center',
109
- fontSize: size * 0.4, fontWeight: 700, color: tier === 'S' ? '#000' : '#fff' }}>
109
+ fontSize: size * 0.4, fontWeight: 700, color: tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)' }}>
110
110
  {p.name?.charAt(0)}
111
111
  </span>
112
112
  )}
@@ -118,8 +118,8 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
118
118
  }}>
119
119
  <div style={{
120
120
  fontSize: isHov ? 10 : 8, fontWeight: 600,
121
- color: isHov ? '#fff' : '#aaa',
122
- background: isHov ? 'rgba(0,0,0,0.85)' : 'transparent',
121
+ color: isHov ? 'var(--sd-fg-1, #fff)' : 'var(--sd-fg-3, #aaa)',
122
+ background: isHov ? 'var(--sd-surface, rgba(0,0,0,0.85))' : 'transparent',
123
123
  padding: isHov ? '3px 8px' : 0, borderRadius: 4,
124
124
  }}>
125
125
  {p.name?.split(' ')[0]}
@@ -221,7 +221,7 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
221
221
  ) : (
222
222
  <span style={{
223
223
  fontSize: size * 0.4, fontWeight: 700,
224
- color: tier === 'S' ? '#000' : '#fff',
224
+ color: tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
225
225
  }}>{c.name?.charAt(0)}</span>
226
226
  )}
227
227
  </div>
@@ -235,8 +235,8 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
235
235
  }}>
236
236
  <div style={{
237
237
  fontSize: tier === 'S' ? 9 : 10, fontWeight: 600,
238
- color: isHovered ? '#fff' : '#aaa',
239
- background: isHovered ? 'rgba(0,0,0,0.85)' : 'transparent',
238
+ color: isHovered ? 'var(--sd-fg-1, #fff)' : 'var(--sd-fg-3, #aaa)',
239
+ background: isHovered ? 'var(--sd-surface, rgba(0,0,0,0.85))' : 'transparent',
240
240
  padding: isHovered ? '3px 8px' : 0,
241
241
  borderRadius: 4,
242
242
  }}>
@@ -249,8 +249,8 @@ export default function RingsView({ connections, degree2 = [], onSelect, mode })
249
249
  </div>
250
250
  {isHovered && c.headline && (
251
251
  <div style={{
252
- fontSize: 8, color: '#888', marginTop: 2,
253
- background: 'rgba(0,0,0,0.85)', padding: '2px 6px', borderRadius: 3,
252
+ fontSize: 8, color: 'var(--sd-fg-3, #888)', marginTop: 2,
253
+ background: 'rgba(var(--sd-shade, 0, 0, 0), 0.85)', padding: '2px 6px', borderRadius: 3,
254
254
  maxWidth: 160, overflow: 'hidden', textOverflow: 'ellipsis',
255
255
  }}>{c.headline.substring(0, 40)}</div>
256
256
  )}