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
@@ -82,12 +82,12 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
82
82
  onClick={() => onSelect && onSelect(null)}
83
83
  style={{
84
84
  display: 'flex', alignItems: 'center', gap: 6, background: 'none', border: 'none',
85
- color: '#888', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
85
+ color: 'var(--sd-fg-3, #888)', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
86
86
  }}
87
87
  >
88
88
  <span style={{ fontSize: 16 }}>&larr;</span> Back to list
89
89
  </button>
90
- <div style={{ fontSize: 10, color: '#888', marginBottom: 8, letterSpacing: 1, textTransform: 'uppercase' }}>
90
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 8, letterSpacing: 1, textTransform: 'uppercase' }}>
91
91
  {selected.degree === 2 ? 'Degree 2 Connection' : 'Degree 1 Connection'}
92
92
  </div>
93
93
  <div style={{ display: 'flex', gap: 6, marginBottom: 8, flexWrap: 'wrap' }}>
@@ -108,7 +108,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
108
108
  fontSize: 11.5, color: '#8fb8d6', lineHeight: 1.5,
109
109
  }}>
110
110
  {selected.degree === 1 ? 'You met them through ' : 'Reachable through '}
111
- <b style={{ color: '#cfe6f7' }}>{selected.unlocked_from_name}</b>
111
+ <b style={{ color: 'var(--sd-fg-1, #cfe6f7)' }}>{selected.unlocked_from_name}</b>
112
112
  </div>
113
113
  )}
114
114
 
@@ -136,13 +136,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
136
136
  background: tierColors[selected.tier] || '#555',
137
137
  display: localPhoto(selected.profile_image_url) ? 'none' : 'flex',
138
138
  alignItems: 'center', justifyContent: 'center',
139
- fontSize: 20, fontWeight: 700, color: selected.tier === 'S' ? '#000' : '#fff',
139
+ fontSize: 20, fontWeight: 700, color: selected.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
140
140
  }}>
141
141
  {selected.name?.charAt(0)}
142
142
  </div>
143
143
  <div style={{ minWidth: 0 }}>
144
144
  <h2 style={{ fontSize: 18, fontWeight: 700, margin: 0 }}>{selected.name}</h2>
145
- <p style={{ color: '#aaa', fontSize: 11, margin: '3px 0 0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{selected.headline?.substring(0, 60)}</p>
145
+ <p style={{ color: 'var(--sd-fg-3, #aaa)', fontSize: 11, margin: '3px 0 0', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{selected.headline?.substring(0, 60)}</p>
146
146
  {selected.profile_url && (
147
147
  <a href={selected.profile_url} target="_blank" rel="noopener noreferrer" style={{ fontSize: 10, color: '#0077B5', textDecoration: 'none', fontWeight: 600 }}>
148
148
  View on LinkedIn
@@ -166,22 +166,22 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
166
166
  if (!i) return null;
167
167
  const first = selected.name?.split(' ')[0] || 'them';
168
168
  const twin = i.twin && connections.find((c) => c.id === i.twin.id);
169
- const row = { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 10, padding: '7px 0', borderTop: '1px solid rgba(255,255,255,0.05)' };
170
- const label = { fontSize: 10.5, color: '#8b9a9a', minWidth: 92 };
171
- const act = { background: 'none', border: 'none', padding: 0, color: '#3498DB', cursor: 'pointer', fontSize: 11.5, whiteSpace: 'nowrap' };
169
+ const row = { display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 10, padding: '7px 0', borderTop: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.05)' };
170
+ const label = { fontSize: 10.5, color: 'var(--sd-fg-3, #8b9a9a)', minWidth: 92 };
171
+ const act = { background: 'none', border: 'none', padding: 0, color: 'var(--sd-blue, #3498DB)', cursor: 'pointer', fontSize: 11.5, whiteSpace: 'nowrap' };
172
172
  const scanned = i.bars == null ? 'Not scanned yet' : i.bars === 5 ? 'Their whole list' : `About ${i.bars * 20}% of their list`;
173
173
  return (
174
174
  <div style={{ border: '1px solid rgba(52,152,219,0.25)', borderRadius: 8, marginBottom: 16, background: 'rgba(52,152,219,0.04)' }}>
175
175
  <button onClick={() => setShowInsights((v) => !v)} aria-expanded={showInsights}
176
- style={{ width: '100%', display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '9px 12px', background: 'none', border: 'none', cursor: 'pointer', color: '#cfe6f7' }}>
176
+ style={{ width: '100%', display: 'flex', justifyContent: 'space-between', alignItems: 'center', padding: '9px 12px', background: 'none', border: 'none', cursor: 'pointer', color: 'var(--sd-fg-1, #cfe6f7)' }}>
177
177
  <span style={{ fontSize: 11, fontWeight: 700, letterSpacing: 1 }}>INSIGHTS</span>
178
- <span style={{ fontSize: 11, color: '#8b9a9a' }}>
178
+ <span style={{ fontSize: 11, color: 'var(--sd-fg-3, #8b9a9a)' }}>
179
179
  {!showInsights && i.circle > 0 && `${i.circle.toLocaleString()} in their circle${i.only ? ` Β· ${i.only.toLocaleString()} only through ${first}` : ''} `}
180
180
  {showInsights ? 'β–²' : 'β–Ό'}
181
181
  </span>
182
182
  </button>
183
183
  {showInsights && (
184
- <div style={{ padding: '0 12px 8px', fontSize: 12, color: '#ccc' }}>
184
+ <div style={{ padding: '0 12px 8px', fontSize: 12, color: 'var(--sd-fg-2, #ccc)' }}>
185
185
  <div style={row}>
186
186
  <span style={label}>Their circle</span>
187
187
  <span style={{ flex: 1 }}>{i.circle ? `${i.circle.toLocaleString()} people` : 'None scanned yet'}</span>
@@ -190,7 +190,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
190
190
  <div style={row}>
191
191
  <span style={label}>Only through {first}</span>
192
192
  <span style={{ flex: 1 }}>
193
- {i.circle ? <><b style={{ color: '#00ff88' }}>{i.only.toLocaleString()}</b> ({Math.round(i.onlyShare * 100)}%): none of your other connections reach them</> : 'β€”'}
193
+ {i.circle ? <><b style={{ color: 'var(--sd-green, #00ff88)' }}>{i.only.toLocaleString()}</b> ({Math.round(i.onlyShare * 100)}%): none of your other connections reach them</> : '-'}
194
194
  </span>
195
195
  {i.only > 0 && onShowInSeparation && (
196
196
  <button style={act} onClick={() => onShowInSeparation({ query: selected.name, rarity: 'only' })}>Show them β†’</button>
@@ -199,18 +199,18 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
199
199
  <div style={row}>
200
200
  <span style={label}>Closest overlap</span>
201
201
  <span style={{ flex: 1 }}>
202
- {twin ? <>Opens the same doors as <b style={{ color: '#fff' }}>{twin.name}</b> ({Math.round(i.twin.share * 100)}%, {i.twin.shared.toLocaleString()} people)</> : 'No one opens the same doors'}
202
+ {twin ? <>Opens the same doors as <b style={{ color: 'var(--sd-fg-1, #fff)' }}>{twin.name}</b> ({Math.round(i.twin.share * 100)}%, {i.twin.shared.toLocaleString()} people)</> : 'No one opens the same doors'}
203
203
  </span>
204
204
  {twin && <button style={act} onClick={() => onSelect?.(twin)}>Open β†’</button>}
205
205
  </div>
206
206
  <div style={row}>
207
207
  <span style={label}>Tier mix</span>
208
- <span style={{ flex: 1, display: 'flex', height: 8, borderRadius: 4, overflow: 'hidden', background: 'rgba(255,255,255,0.05)', alignSelf: 'center' }}>
208
+ <span style={{ flex: 1, display: 'flex', height: 8, borderRadius: 4, overflow: 'hidden', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', alignSelf: 'center' }}>
209
209
  {i.circle > 0 && ['S', 'A', 'B', 'C', 'D'].map((t) => i.mix[t] > 0 && (
210
210
  <span key={t} title={`${t}: ${i.mix[t]}`} style={{ width: `${(100 * i.mix[t]) / i.circle}%`, background: tierColors[t] }} />
211
211
  ))}
212
212
  </span>
213
- <span style={{ fontSize: 10.5, color: '#8b9a9a' }}>{i.circle ? `${i.mix.S} S Β· ${i.mix.A} A` : ''}</span>
213
+ <span style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #8b9a9a)' }}>{i.circle ? `${i.mix.S} S Β· ${i.mix.A} A` : ''}</span>
214
214
  {i.mix.S > 0 && onShowInSeparation && (
215
215
  <button style={act} onClick={() => onShowInSeparation({ query: selected.name, tier: 'S' })}>S only β†’</button>
216
216
  )}
@@ -257,11 +257,11 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
257
257
  background: 'rgba(0,255,136,0.08)', border: '1px solid rgba(0,255,136,0.3)',
258
258
  borderRadius: 8, padding: 12, marginBottom: 16,
259
259
  }}>
260
- <div style={{ fontSize: 10, color: '#00ff88', fontWeight: 700, marginBottom: 4, letterSpacing: 1 }}>CATALYST NODE</div>
261
- <div style={{ fontSize: 12, color: '#ccc' }}>
260
+ <div style={{ fontSize: 10, color: 'var(--sd-green, #00ff88)', fontWeight: 700, marginBottom: 4, letterSpacing: 1 }}>CATALYST NODE</div>
261
+ <div style={{ fontSize: 12, color: 'var(--sd-fg-2, #ccc)' }}>
262
262
  This person&apos;s network power exceeds their own tier. They connect to{' '}
263
- <strong style={{ color: '#00ff88' }}>{selected.catalyst_score} S+A tier</strong>{' '}
264
- people β€” making them a high-value stepping stone to reach elite connections.
263
+ <strong style={{ color: 'var(--sd-green, #00ff88)' }}>{selected.catalyst_score} S+A tier</strong>{' '}
264
+ people, making them a high-value stepping stone to reach elite connections.
265
265
  </div>
266
266
  </div>
267
267
  )}
@@ -271,43 +271,43 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
271
271
  )}
272
272
 
273
273
  {/* === SCORE CARD === */}
274
- <div style={{ background: 'rgba(255,255,255,0.04)', borderRadius: 8, padding: 12, marginBottom: 16 }}>
274
+ <div style={{ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.04)', borderRadius: 8, padding: 12, marginBottom: 16 }}>
275
275
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', marginBottom: 8 }}>
276
- <span style={{ fontSize: 11, color: '#888', fontWeight: 600, letterSpacing: 1, textTransform: 'uppercase' }}>Score</span>
276
+ <span style={{ fontSize: 11, color: 'var(--sd-fg-3, #888)', fontWeight: 600, letterSpacing: 1, textTransform: 'uppercase' }}>Score</span>
277
277
  <span style={{ fontSize: 28, fontWeight: 800, color: tierColors[selected.tier] || '#fff' }}>
278
278
  {parseFloat(selected.power_score).toFixed(1)}
279
279
  </span>
280
280
  </div>
281
281
  {/* Why: title Γ— company weight + bonuses (lib/scoring.js) */}
282
282
  {selected.score_why && (
283
- <div style={{ fontSize: 11, color: '#aab7b7', lineHeight: 1.5, marginBottom: 10 }}>{selected.score_why}</div>
283
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-2, #aab7b7)', lineHeight: 1.5, marginBottom: 10 }}>{selected.score_why}</div>
284
284
  )}
285
285
  {/* Job Power bar */}
286
286
  <div style={{ marginBottom: 6 }}>
287
- <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#888', marginBottom: 2 }}>
287
+ <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>
288
288
  <span>Title</span><span>{selected.seniority_score || 0}/10</span>
289
289
  </div>
290
- <div style={{ height: 4, background: 'rgba(255,255,255,0.08)', borderRadius: 2 }}>
290
+ <div style={{ height: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 2 }}>
291
291
  <div style={{ height: '100%', width: `${(selected.seniority_score || 0) * 10}%`, background: tierColors[selected.tier] || '#FFD700', borderRadius: 2 }} />
292
292
  </div>
293
293
  </div>
294
294
  {/* Status Power bar */}
295
295
  <div style={{ marginBottom: selected.circle_power > 0 ? 6 : 0 }}>
296
- <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#888', marginBottom: 2 }}>
296
+ <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>
297
297
  <span>Company</span><span>{selected.company_prestige_score || 0}/10</span>
298
298
  </div>
299
- <div style={{ height: 4, background: 'rgba(255,255,255,0.08)', borderRadius: 2 }}>
299
+ <div style={{ height: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 2 }}>
300
300
  <div style={{ height: '100%', width: `${(selected.company_prestige_score || 0) * 10}%`, background: '#3498DB', borderRadius: 2 }} />
301
301
  </div>
302
302
  </div>
303
303
  {/* Circle Power bar β€” only shows for bridges with clusters */}
304
304
  {selected.circle_power > 0 && (
305
305
  <div>
306
- <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: '#888', marginBottom: 2 }}>
306
+ <div style={{ display: 'flex', justifyContent: 'space-between', fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>
307
307
  <span>Circle Power</span>
308
- <span style={{ color: '#FF6B35' }}>{selected.circle_s_count || 0}S Β· {selected.circle_a_count || 0}A</span>
308
+ <span style={{ color: 'var(--sd-orange, #FF6B35)' }}>{selected.circle_s_count || 0}S Β· {selected.circle_a_count || 0}A</span>
309
309
  </div>
310
- <div style={{ height: 4, background: 'rgba(255,255,255,0.08)', borderRadius: 2 }}>
310
+ <div style={{ height: 4, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.08)', borderRadius: 2 }}>
311
311
  <div style={{ height: '100%', width: `${Math.min(parseFloat(selected.circle_power) / 70 * 100, 100)}%`, background: '#FF6B35', borderRadius: 2 }} />
312
312
  </div>
313
313
  </div>
@@ -316,10 +316,10 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
316
316
 
317
317
  {/* === WHY THIS MATTERS === */}
318
318
  <div style={{ marginBottom: 16 }}>
319
- <div style={{ fontSize: 10, fontWeight: 700, color: '#FFD700', letterSpacing: 1, marginBottom: 6, textTransform: 'uppercase' }}>
319
+ <div style={{ fontSize: 10, fontWeight: 700, color: 'var(--sd-gold, #FFD700)', letterSpacing: 1, marginBottom: 6, textTransform: 'uppercase' }}>
320
320
  Why This Matters
321
321
  </div>
322
- <div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 11, color: '#ccc' }}>
322
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 11, color: 'var(--sd-fg-2, #ccc)' }}>
323
323
  {generateInsights(selected, userProfile, connections, degree2, routes).map((insight, idx) => (
324
324
  <div key={idx} style={{ display: 'flex', gap: 6, alignItems: 'flex-start' }}>
325
325
  <span style={{ color: insight.color || '#888', fontSize: 13, lineHeight: 1 }}>{insight.icon}</span>
@@ -331,13 +331,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
331
331
 
332
332
  {selected.company && (
333
333
  <div style={{ marginBottom: 8 }}>
334
- <div style={{ color: '#666', fontSize: 10 }}>Company</div>
334
+ <div style={{ color: 'var(--sd-fg-4, #666)', fontSize: 10 }}>Company</div>
335
335
  <div style={{ fontWeight: 600, fontSize: 12 }}>{selected.company}</div>
336
336
  </div>
337
337
  )}
338
338
  {selected.role && (
339
339
  <div style={{ marginBottom: 12 }}>
340
- <div style={{ color: '#666', fontSize: 10 }}>Role</div>
340
+ <div style={{ color: 'var(--sd-fg-4, #666)', fontSize: 10 }}>Role</div>
341
341
  <div style={{ fontSize: 12 }}>{selected.role}</div>
342
342
  </div>
343
343
  )}
@@ -349,12 +349,12 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
349
349
  const topPeople = [...bridgeConnections].sort((a, b) => (parseFloat(b.power_score) || 0) - (parseFloat(a.power_score) || 0)).slice(0, 8);
350
350
  return (
351
351
  <div style={{ marginBottom: 16 }}>
352
- <div style={{ fontSize: 10, fontWeight: 700, color: '#FF6B35', letterSpacing: 1, marginBottom: 8, textTransform: 'uppercase' }}>
353
- Cluster Overview β€” {bridgeConnections.length} connections
352
+ <div style={{ fontSize: 10, fontWeight: 700, color: 'var(--sd-orange, #FF6B35)', letterSpacing: 1, marginBottom: 8, textTransform: 'uppercase' }}>
353
+ Cluster Overview Β· {bridgeConnections.length} connections
354
354
  </div>
355
355
  <div style={{ display: 'flex', gap: 6, marginBottom: 8, fontSize: 10 }}>
356
- {sTier.length > 0 && <span style={{ color: '#FFD700', fontWeight: 600 }}>{sTier.length} S-tier</span>}
357
- {aTier.length > 0 && <span style={{ color: '#9B59B6', fontWeight: 600 }}>{aTier.length} A-tier</span>}
356
+ {sTier.length > 0 && <span style={{ color: 'var(--sd-gold, #FFD700)', fontWeight: 600 }}>{sTier.length} S-tier</span>}
357
+ {aTier.length > 0 && <span style={{ color: 'var(--sd-purple, #9B59B6)', fontWeight: 600 }}>{aTier.length} A-tier</span>}
358
358
  </div>
359
359
  {/* Outlink Bridge button */}
360
360
  <a href={`/queue?bridge=${selected.id}&groupBy=bridge`} style={{
@@ -364,7 +364,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
364
364
  }}>
365
365
  Outlink Bridge β†’ Add {bridgeConnections.filter(m => m.tier === 'S' || m.tier === 'A' || m.tier === 'B').length} People
366
366
  </a>
367
- <div style={{ fontSize: 10, color: '#888', marginBottom: 8 }}>Most valuable in this cluster:</div>
367
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 8 }}>Most valuable in this cluster:</div>
368
368
  <div style={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
369
369
  {topPeople.map(m => (
370
370
  <div key={m.id}
@@ -372,10 +372,10 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
372
372
  style={{
373
373
  display: 'flex', alignItems: 'center', gap: 6, padding: '4px 6px',
374
374
  borderRadius: 4, cursor: 'pointer', borderLeft: `2px solid ${tierColors[m.tier] || '#555'}`,
375
- background: 'rgba(255,255,255,0.03)',
375
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)',
376
376
  }}
377
- onMouseEnter={e => e.currentTarget.style.background = 'rgba(255,255,255,0.08)'}
378
- onMouseLeave={e => e.currentTarget.style.background = 'rgba(255,255,255,0.03)'}
377
+ onMouseEnter={e => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.08)'}
378
+ onMouseLeave={e => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.03)'}
379
379
  >
380
380
  {localPhoto(m.profile_image_url) ? (
381
381
  <img src={localPhoto(m.profile_image_url)} alt="" style={{
@@ -385,12 +385,12 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
385
385
  ) : null}
386
386
  <div style={{
387
387
  width: 22, height: 22, borderRadius: '50%', flexShrink: 0, fontSize: 9, fontWeight: 700,
388
- background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : '#fff',
388
+ background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
389
389
  display: localPhoto(m.profile_image_url) ? 'none' : 'flex', alignItems: 'center', justifyContent: 'center',
390
390
  }}>{m.name?.charAt(0)}</div>
391
391
  <div style={{ flex: 1, minWidth: 0 }}>
392
392
  <div style={{ fontSize: 10, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.name}</div>
393
- <div style={{ fontSize: 8, color: '#666', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.headline?.substring(0, 40)}</div>
393
+ <div style={{ fontSize: 8, color: 'var(--sd-fg-4, #666)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.headline?.substring(0, 40)}</div>
394
394
  </div>
395
395
  <span style={{ fontSize: 9, color: tierColors[m.tier], fontWeight: 600, flexShrink: 0 }}>{parseFloat(m.power_score).toFixed(1)}</span>
396
396
  </div>
@@ -402,7 +402,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
402
402
 
403
403
  {isBridge && bridgeConnections.length > 0 && (
404
404
  <div style={{ marginTop: 16 }}>
405
- <div style={{ fontSize: 12, fontWeight: 600, color: '#FF6B35', marginBottom: 8 }}>
405
+ <div style={{ fontSize: 12, fontWeight: 600, color: 'var(--sd-orange, #FF6B35)', marginBottom: 8 }}>
406
406
  Gateway to {bridgeConnections.length} degree-2 connections:
407
407
  </div>
408
408
  {bridgeConnections.sort((a, b) => (parseFloat(b.power_score) || 0) - (parseFloat(a.power_score) || 0)).slice(0, 10).map(c => (
@@ -411,8 +411,8 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
411
411
  borderLeft: '3px solid #FF6B35', marginBottom: 4, fontSize: 12,
412
412
  }}>
413
413
  <div style={{ fontWeight: 600 }}>{c.name}</div>
414
- <div style={{ color: '#888', fontSize: 11 }}>{c.role}{c.company ? ` @ ${c.company}` : ''}</div>
415
- <div style={{ color: '#FF6B35', fontSize: 10 }}>Score: {parseFloat(c.power_score).toFixed(1)}</div>
414
+ <div style={{ color: 'var(--sd-fg-3, #888)', fontSize: 11 }}>{c.role}{c.company ? ` @ ${c.company}` : ''}</div>
415
+ <div style={{ color: 'var(--sd-orange, #FF6B35)', fontSize: 10 }}>Score: {parseFloat(c.power_score).toFixed(1)}</div>
416
416
  </div>
417
417
  ))}
418
418
  </div>
@@ -441,20 +441,20 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
441
441
  background: 'rgba(255,215,0,0.06)', border: `1px ${asked ? 'dashed' : 'solid'} rgba(255,215,0,${asked ? 0.45 : 0.25})`,
442
442
  borderRadius: 10, padding: 16, marginTop: 16, textAlign: 'center',
443
443
  }}>
444
- <div style={{ fontSize: 10, color: '#FFD700', fontWeight: 700, letterSpacing: 1, marginBottom: 6 }}>
444
+ <div style={{ fontSize: 10, color: 'var(--sd-gold, #FFD700)', fontWeight: 700, letterSpacing: 1, marginBottom: 6 }}>
445
445
  {asked ? 'REQUEST SENT' : 'LOCKED PATH'}
446
446
  </div>
447
- <div style={{ fontSize: 13, color: '#ccc', marginBottom: 12 }}>
447
+ <div style={{ fontSize: 13, color: 'var(--sd-fg-2, #ccc)', marginBottom: 12 }}>
448
448
  {asked
449
449
  ? `Waiting for ${selected.name} to accept. The next scan of your own connections notices when they do.`
450
450
  : `Connect with ${selected.name} to unlock their network and extend your six degrees.`
451
451
  }
452
452
  </div>
453
453
  <div style={{
454
- width: '100%', height: 60, background: 'rgba(255,255,255,0.03)',
455
- borderRadius: 8, border: '1px dashed rgba(255,255,255,0.1)',
454
+ width: '100%', height: 60, background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)',
455
+ borderRadius: 8, border: '1px dashed rgba(var(--sd-ink, 255, 255, 255), 0.1)',
456
456
  display: 'flex', alignItems: 'center', justifyContent: 'center',
457
- fontSize: 11, color: '#444', marginBottom: 12,
457
+ fontSize: 11, color: 'var(--sd-fg-5, #444)', marginBottom: 12,
458
458
  }}>
459
459
  {asked ? '[ Cluster Pending... ]' : '[ Hidden Network ]'}
460
460
  </div>
@@ -462,7 +462,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
462
462
  <button
463
463
  onClick={() => { undoRequest(selected).catch(() => {}); }}
464
464
  style={{
465
- background: 'none', border: 'none', color: '#888', fontSize: 11, fontWeight: 600, cursor: 'pointer',
465
+ background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)', fontSize: 11, fontWeight: 600, cursor: 'pointer',
466
466
  }}
467
467
  >
468
468
  Didn&apos;t send it? Undo
@@ -525,13 +525,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
525
525
  onClick={onToggle}
526
526
  style={{
527
527
  display: 'flex', alignItems: 'center', gap: 6, background: 'none', border: 'none',
528
- color: '#888', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
528
+ color: 'var(--sd-fg-3, #888)', fontSize: 12, cursor: 'pointer', padding: '0 0 10px', fontWeight: 600,
529
529
  }}
530
530
  >
531
531
  <span style={{ fontSize: 16 }}>&larr;</span> Close
532
532
  </button>
533
- <h3 style={{ fontSize: 16, fontWeight: 700, marginTop: 0, color: '#FF6B35' }}>Degrees</h3>
534
- <p style={{ fontSize: 12, color: '#888', marginBottom: 12 }}>
533
+ <h3 style={{ fontSize: 16, fontWeight: 700, marginTop: 0, color: 'var(--sd-orange, #FF6B35)' }}>Degrees</h3>
534
+ <p style={{ fontSize: 12, color: 'var(--sd-fg-3, #888)', marginBottom: 12 }}>
535
535
  Your bridge connections and who they unlock.
536
536
  </p>
537
537
 
@@ -556,8 +556,8 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
556
556
  onChange={e => setSearchQuery(e.target.value)}
557
557
  style={{
558
558
  width: '100%', padding: '8px 12px', borderRadius: 8, fontSize: 12,
559
- border: '1px solid rgba(255,255,255,0.1)', background: 'rgba(255,255,255,0.05)',
560
- color: '#fff', outline: 'none', boxSizing: 'border-box',
559
+ border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)',
560
+ color: 'var(--sd-fg-1, #fff)', outline: 'none', boxSizing: 'border-box',
561
561
  }}
562
562
  />
563
563
  {searchQuery.length >= 2 && (() => {
@@ -575,7 +575,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
575
575
  return (
576
576
  <div style={{
577
577
  position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 50,
578
- background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(255,255,255,0.1)',
578
+ background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
579
579
  borderRadius: 8, overflow: 'hidden', maxHeight: 200, overflowY: 'auto',
580
580
  boxShadow: '0 8px 24px rgba(0,0,0,0.5)',
581
581
  }}>
@@ -586,9 +586,9 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
586
586
  if (onFocusNode && m._matchType === 'bridge') onFocusNode(m.id);
587
587
  }} style={{
588
588
  padding: '8px 12px', cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 8,
589
- borderBottom: '1px solid rgba(255,255,255,0.05)',
589
+ borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.05)',
590
590
  }}
591
- onMouseEnter={e => e.currentTarget.style.background = 'rgba(255,255,255,0.06)'}
591
+ onMouseEnter={e => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.06)'}
592
592
  onMouseLeave={e => e.currentTarget.style.background = 'transparent'}
593
593
  >
594
594
  {localPhoto(m.profile_image_url) ? (
@@ -598,7 +598,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
598
598
  )}
599
599
  <div style={{ flex: 1, minWidth: 0 }}>
600
600
  <div style={{ fontSize: 11, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{m.name}</div>
601
- <div style={{ fontSize: 8, color: '#666' }}>{m._matchType === 'bridge' ? 'Bridge' : 'Degree-2'}</div>
601
+ <div style={{ fontSize: 8, color: 'var(--sd-fg-4, #666)' }}>{m._matchType === 'bridge' ? 'Bridge' : 'Degree-2'}</div>
602
602
  </div>
603
603
  <span style={{ fontSize: 9, fontWeight: 700, color: tierColors[m.tier] }}>{m.tier}</span>
604
604
  </div>
@@ -611,10 +611,10 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
611
611
  {/* Pending Requests View */}
612
612
  {filter === 'pending' && pending.length > 0 && (
613
613
  <>
614
- <h4 style={{ fontSize: 13, fontWeight: 600, color: '#FF6B35', marginBottom: 8 }}>
614
+ <h4 style={{ fontSize: 13, fontWeight: 600, color: 'var(--sd-orange, #FF6B35)', marginBottom: 8 }}>
615
615
  ⏳ Pending Requests ({pending.length})
616
616
  </h4>
617
- <p style={{ fontSize: 10, color: '#666', marginBottom: 10, lineHeight: 1.4 }}>
617
+ <p style={{ fontSize: 10, color: 'var(--sd-fg-4, #666)', marginBottom: 10, lineHeight: 1.4 }}>
618
618
  Friend requests you&apos;ve sent. When accepted, their cluster unlocks for bridging.
619
619
  </p>
620
620
  <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
@@ -635,7 +635,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
635
635
  ) : (
636
636
  <div style={{
637
637
  width: 32, height: 32, borderRadius: '50%', flexShrink: 0, fontSize: 12, fontWeight: 700,
638
- background: tierColors[p.tier] || '#555', color: p.tier === 'S' ? '#000' : '#fff',
638
+ background: tierColors[p.tier] || '#555', color: p.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
639
639
  display: 'flex', alignItems: 'center', justifyContent: 'center',
640
640
  }}>{p.name?.charAt(0)}</div>
641
641
  )}
@@ -645,11 +645,11 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
645
645
  <div style={{ fontSize: 11, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
646
646
  {p.name}
647
647
  </div>
648
- <div style={{ fontSize: 8, color: '#888', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
648
+ <div style={{ fontSize: 8, color: 'var(--sd-fg-3, #888)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
649
649
  {p.headline?.substring(0, 40)}
650
650
  </div>
651
651
  {bridge && (
652
- <div style={{ fontSize: 8, color: '#FF6B35', marginTop: 1 }}>
652
+ <div style={{ fontSize: 8, color: 'var(--sd-orange, #FF6B35)', marginTop: 1 }}>
653
653
  via {bridge.name?.split(' ')[0]}
654
654
  </div>
655
655
  )}
@@ -660,7 +660,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
660
660
  <div style={{ fontSize: 9, fontWeight: 800, color: tierColors[p.tier] || '#888' }}>
661
661
  {p.tier}
662
662
  </div>
663
- <div style={{ fontSize: 8, color: '#666' }}>
663
+ <div style={{ fontSize: 8, color: 'var(--sd-fg-4, #666)' }}>
664
664
  {parseFloat(p.power_score || 0).toFixed(1)}
665
665
  </div>
666
666
  </div>
@@ -670,7 +670,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
670
670
  onClick={() => onUndoPending && onUndoPending(p)}
671
671
  title="Remove from pending"
672
672
  style={{
673
- background: 'none', border: 'none', color: '#555', cursor: 'pointer',
673
+ background: 'none', border: 'none', color: 'var(--sd-fg-5, #555)', cursor: 'pointer',
674
674
  fontSize: 12, padding: 2, flexShrink: 0,
675
675
  }}
676
676
  >βœ•</button>
@@ -683,7 +683,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
683
683
 
684
684
  {/* Clusters View (hidden when viewing pending) */}
685
685
  {filter !== 'pending' && (<>
686
- <h4 style={{ fontSize: 13, fontWeight: 600, color: '#FF6B35', marginBottom: 8 }}>Most Valuable Clusters</h4>
686
+ <h4 style={{ fontSize: 13, fontWeight: 600, color: 'var(--sd-orange, #FF6B35)', marginBottom: 8 }}>Most Valuable Clusters</h4>
687
687
  <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
688
688
  {(() => {
689
689
  const clusterStats = Object.entries(bridgeMap).map(([bridgeId, members]) => {
@@ -757,8 +757,8 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
757
757
  onClick={onToggle}
758
758
  style={{
759
759
  display: 'flex', alignItems: 'center', gap: 6,
760
- background: 'rgba(255,255,255,0.06)', border: '1px solid rgba(255,255,255,0.1)',
761
- borderRadius: 6, color: '#aaa', fontSize: 12, cursor: 'pointer',
760
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.06)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
761
+ borderRadius: 6, color: 'var(--sd-fg-3, #aaa)', fontSize: 12, cursor: 'pointer',
762
762
  padding: '6px 12px', marginBottom: 12, fontWeight: 600,
763
763
  }}
764
764
  >
@@ -783,14 +783,14 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
783
783
  onChange={(e) => setSearchQuery(e.target.value)}
784
784
  style={{
785
785
  width: '100%', padding: '8px 12px', borderRadius: 8, boxSizing: 'border-box',
786
- border: '1px solid rgba(255,255,255,0.1)', background: 'rgba(0,0,0,0.3)',
787
- color: '#fff', fontSize: 12, outline: 'none',
786
+ border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)', background: 'rgba(var(--sd-shade, 0, 0, 0), 0.3)',
787
+ color: 'var(--sd-fg-1, #fff)', fontSize: 12, outline: 'none',
788
788
  }}
789
789
  />
790
790
  {searchResults.length > 0 && (
791
791
  <div style={{
792
792
  position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 10,
793
- background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(255,255,255,0.1)',
793
+ background: 'color-mix(in srgb, var(--sd-bg) 97%, transparent)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.1)',
794
794
  borderRadius: 8, marginTop: 4, overflow: 'hidden',
795
795
  boxShadow: '0 8px 24px rgba(0,0,0,0.5)',
796
796
  }}>
@@ -804,9 +804,9 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
804
804
  }}
805
805
  style={{
806
806
  display: 'flex', alignItems: 'center', gap: 8, padding: '8px 10px',
807
- cursor: 'pointer', borderBottom: '1px solid rgba(255,255,255,0.04)',
807
+ cursor: 'pointer', borderBottom: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.04)',
808
808
  }}
809
- onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.08)'}
809
+ onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.08)'}
810
810
  onMouseLeave={(e) => e.currentTarget.style.background = 'transparent'}
811
811
  >
812
812
  {localPhoto(c.profile_image_url) ? (
@@ -817,13 +817,13 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
817
817
  ) : (
818
818
  <div style={{
819
819
  width: 24, height: 24, borderRadius: '50%', flexShrink: 0, fontSize: 10, fontWeight: 700,
820
- background: tierColors[c.tier] || '#555', color: c.tier === 'S' ? '#000' : '#fff',
820
+ background: tierColors[c.tier] || '#555', color: c.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
821
821
  display: 'flex', alignItems: 'center', justifyContent: 'center',
822
822
  }}>{c.name?.charAt(0)}</div>
823
823
  )}
824
824
  <div style={{ flex: 1, minWidth: 0 }}>
825
825
  <div style={{ fontSize: 12, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{c.name}</div>
826
- <div style={{ fontSize: 9, color: '#666' }}>{c.headline?.substring(0, 35)}</div>
826
+ <div style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)' }}>{c.headline?.substring(0, 35)}</div>
827
827
  </div>
828
828
  <span style={{ fontSize: 10, color: tierColors[c.tier], fontWeight: 700 }}>{c.tier}</span>
829
829
  </div>
@@ -832,7 +832,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
832
832
  )}
833
833
  </div>
834
834
 
835
- <h4 style={{ fontSize: 13, fontWeight: 600, color: '#FFD700', marginBottom: 8 }}>
835
+ <h4 style={{ fontSize: 13, fontWeight: 600, color: 'var(--sd-gold, #FFD700)', marginBottom: 8 }}>
836
836
  Power Rankings ({allRanked.length})
837
837
  </h4>
838
838
  <div style={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
@@ -850,7 +850,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
850
850
  if (showHeader) tierRankCounter[c.tier] = 0;
851
851
  tierRankCounter[c.tier] = (tierRankCounter[c.tier] || 0) + 1;
852
852
  const tierRank = tierRankCounter[c.tier];
853
- const tierNames = { S: 'S-Tier β€” Elite', A: 'A-Tier β€” High Value', B: 'B-Tier β€” Notable', C: 'C-Tier β€” Standard', D: 'D-Tier β€” Entry' };
853
+ const tierNames = { S: 'S-Tier Β· Elite', A: 'A-Tier Β· High Value', B: 'B-Tier Β· Notable', C: 'C-Tier Β· Standard', D: 'D-Tier Β· Entry' };
854
854
  return (
855
855
  <div key={c.id}>
856
856
  {showHeader && (
@@ -869,16 +869,16 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
869
869
  <div
870
870
  onClick={() => { onSelect && onSelect(c); onFocusNode && onFocusNode(c.id); }}
871
871
  style={{
872
- padding: '6px 8px', background: 'rgba(255,255,255,0.03)', borderRadius: 6,
872
+ padding: '6px 8px', background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)', borderRadius: 6,
873
873
  borderLeft: `3px solid ${tierColors[c.tier] || '#555'}`,
874
874
  cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 8,
875
875
  transition: 'background 0.15s',
876
876
  }}
877
- onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.1)'}
878
- onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.03)'}
877
+ onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.1)'}
878
+ onMouseLeave={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.03)'}
879
879
  >
880
880
  {/* Rank number β€” per tier */}
881
- <span style={{ color: '#555', fontSize: 10, fontWeight: 600, minWidth: 22, textAlign: 'right' }}>
881
+ <span style={{ color: 'var(--sd-fg-5, #555)', fontSize: 10, fontWeight: 600, minWidth: 22, textAlign: 'right' }}>
882
882
  #{tierRank}
883
883
  </span>
884
884
  {/* Profile photo or initial */}
@@ -896,7 +896,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
896
896
  background: tierColors[c.tier] || '#555',
897
897
  display: localPhoto(c.profile_image_url) ? 'none' : 'flex',
898
898
  alignItems: 'center', justifyContent: 'center',
899
- fontSize: 12, fontWeight: 700, color: c.tier === 'S' ? '#000' : '#fff',
899
+ fontSize: 12, fontWeight: 700, color: c.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
900
900
  }}>
901
901
  {c.name?.charAt(0)}
902
902
  </div>
@@ -905,7 +905,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
905
905
  <div style={{ fontWeight: 600, fontSize: 11, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
906
906
  {c.name}
907
907
  </div>
908
- <div style={{ fontSize: 9, color: '#666', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
908
+ <div style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
909
909
  {c.headline?.substring(0, 45)}
910
910
  </div>
911
911
  </div>
@@ -914,7 +914,7 @@ export default function Sidebar({ selected, stats, tierColors, connections, degr
914
914
  <div style={{ fontSize: 10, fontWeight: 700, color: tierColors[c.tier] || '#555' }}>
915
915
  {parseFloat(c.power_score).toFixed(1)}
916
916
  </div>
917
- <div style={{ fontSize: 8, color: '#555' }}>{c.tier}</div>
917
+ <div style={{ fontSize: 8, color: 'var(--sd-fg-5, #555)' }}>{c.tier}</div>
918
918
  </div>
919
919
  </div>
920
920
  </div>
@@ -939,7 +939,7 @@ function SidebarWrapper({ children, collapsed, onToggle }) {
939
939
  display: 'flex', alignItems: 'center', flexDirection: 'row-reverse', gap: 0,
940
940
  height: 36, borderRadius: 18,
941
941
  background: 'rgba(255,215,0,0.15)', border: '2px solid rgba(255,215,0,0.5)',
942
- color: '#FFD700', fontWeight: 700,
942
+ color: 'var(--sd-gold, #FFD700)', fontWeight: 700,
943
943
  boxShadow: '0 0 12px rgba(255,215,0,0.3)',
944
944
  backdropFilter: 'blur(8px)', WebkitBackdropFilter: 'blur(8px)',
945
945
  overflow: 'hidden', transition: 'width 0.25s ease',
@@ -960,13 +960,13 @@ function SidebarWrapper({ children, collapsed, onToggle }) {
960
960
  position: 'fixed', top: 0, right: 0, bottom: 0, zIndex: 100,
961
961
  width: '100vw', pointerEvents: 'auto',
962
962
  } : { flexShrink: 0, height: '100%' }}>
963
- {isMobile && <div onClick={onToggle} style={{ position: 'absolute', inset: 0, background: 'rgba(0,0,0,0.5)' }} />}
964
- <div style={{
963
+ {isMobile && <div onClick={onToggle} style={{ position: 'absolute', inset: 0, background: 'rgba(var(--sd-shade, 0, 0, 0), 0.5)' }} />}
964
+ <div data-glass-panel={isMobile ? undefined : 'side'} style={{
965
965
  width: isMobile ? '80vw' : 320, minWidth: isMobile ? 0 : 320, maxWidth: isMobile ? 300 : 320, height: '100%',
966
966
  borderLeft: '1px solid rgba(255,215,0,0.12)',
967
967
  padding: isMobile ? '12px 10px' : '16px 16px',
968
968
  overflowY: 'auto', overflowX: 'hidden',
969
- background: isMobile ? 'rgba(15,12,5,0.98)' : 'var(--sd-panel)', fontSize: 13,
969
+ background: isMobile ? 'var(--sd-surface, rgba(15,12,5,0.98))' : 'var(--sd-panel)', fontSize: 13,
970
970
  backdropFilter: 'var(--sd-panel-blur)', WebkitBackdropFilter: 'var(--sd-panel-blur)',
971
971
  boxShadow: 'inset 0 0 60px rgba(255,215,0,0.03), -4px 0 24px rgba(0,0,0,0.3)',
972
972
  marginLeft: isMobile ? 'auto' : 0,
@@ -979,15 +979,15 @@ function SidebarWrapper({ children, collapsed, onToggle }) {
979
979
 
980
980
  function StatBox({ label, value }) {
981
981
  return (
982
- <div style={{ background: 'rgba(255,255,255,0.05)', padding: '10px 12px', borderRadius: 8 }}>
983
- <div style={{ fontSize: 10, color: '#888', marginBottom: 2 }}>{label}</div>
982
+ <div style={{ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', padding: '10px 12px', borderRadius: 8 }}>
983
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginBottom: 2 }}>{label}</div>
984
984
  <div style={{ fontSize: 18, fontWeight: 700 }}>{value}</div>
985
985
  </div>
986
986
  );
987
987
  }
988
988
 
989
989
  function Arrow() {
990
- return <span style={{ color: '#555', fontSize: 16 }}>&rarr;</span>;
990
+ return <span style={{ color: 'var(--sd-fg-5, #555)', fontSize: 16 }}>&rarr;</span>;
991
991
  }
992
992
 
993
993
  const CANT_NAME_TITLE = 'This route came from a scanned list whose connection record doesn’t match anyone in '
@@ -1009,15 +1009,15 @@ function PathBox({ routes, selected, tierColors, onSelect }) {
1009
1009
  background: 'rgba(255,107,53,0.1)', border: '1px solid rgba(255,107,53,0.3)',
1010
1010
  borderRadius: 8, padding: 12, marginBottom: 16,
1011
1011
  }}>
1012
- <div style={{ fontSize: 10, color: '#FF6B35', fontWeight: 600, marginBottom: 8 }}>
1012
+ <div style={{ fontSize: 10, color: 'var(--sd-orange, #FF6B35)', fontWeight: 600, marginBottom: 8 }}>
1013
1013
  PATH TO THIS PERSON{n > 1 ? ` Β· ${n} WAYS IN` : ''}
1014
1014
  </div>
1015
1015
  <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
1016
1016
  {shown.map((r, i) => {
1017
1017
  if (!r.bridge) {
1018
1018
  return (
1019
- <div key={`unnamed-${r.id}`} title={CANT_NAME_TITLE} style={{ ...line, color: '#888', fontStyle: 'italic' }}>
1020
- <span style={{ fontWeight: 700, fontStyle: 'normal', color: '#fff' }}>You</span>
1019
+ <div key={`unnamed-${r.id}`} title={CANT_NAME_TITLE} style={{ ...line, color: 'var(--sd-fg-3, #888)', fontStyle: 'italic' }}>
1020
+ <span style={{ fontWeight: 700, fontStyle: 'normal', color: 'var(--sd-fg-1, #fff)' }}>You</span>
1021
1021
  <Arrow />
1022
1022
  <span>a connection we can&rsquo;t name</span>
1023
1023
  <Arrow />
@@ -1045,17 +1045,17 @@ function PathBox({ routes, selected, tierColors, onSelect }) {
1045
1045
  {b.name}
1046
1046
  </button>
1047
1047
  <Arrow />
1048
- <span style={{ color: '#FF6B35', fontWeight: 600 }}>{selected.name}</span>
1048
+ <span style={{ color: 'var(--sd-orange, #FF6B35)', fontWeight: 600 }}>{selected.name}</span>
1049
1049
  {/* Not "strongest": the app knows nothing about how well they
1050
1050
  know each other, only how this connection scores. */}
1051
1051
  {i === 0 && n > 1 && (
1052
1052
  <span style={{
1053
- fontSize: 9, fontWeight: 700, color: '#FF6B35', padding: '1px 6px', borderRadius: 8,
1053
+ fontSize: 9, fontWeight: 700, color: 'var(--sd-orange, #FF6B35)', padding: '1px 6px', borderRadius: 8,
1054
1054
  background: 'rgba(255,107,53,0.15)', whiteSpace: 'nowrap',
1055
1055
  }}>top-scored bridge</span>
1056
1056
  )}
1057
1057
  </div>
1058
- {about && <div style={{ fontSize: 11, color: '#888', marginTop: 3 }}>{about}</div>}
1058
+ {about && <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #888)', marginTop: 3 }}>{about}</div>}
1059
1059
  </div>
1060
1060
  );
1061
1061
  })}
@@ -1065,7 +1065,7 @@ function PathBox({ routes, selected, tierColors, onSelect }) {
1065
1065
  onClick={() => setShowAll((v) => !v)}
1066
1066
  style={{
1067
1067
  marginTop: 10, padding: '4px 10px', borderRadius: 6, cursor: 'pointer', fontSize: 11, fontWeight: 600,
1068
- border: '1px solid rgba(255,107,53,0.35)', background: 'transparent', color: '#FF6B35',
1068
+ border: '1px solid rgba(255,107,53,0.35)', background: 'transparent', color: 'var(--sd-orange, #FF6B35)',
1069
1069
  }}
1070
1070
  >
1071
1071
  {showAll ? 'Show fewer' : `Show all ${n}`}
@@ -1141,7 +1141,7 @@ function CreateClusterCard({ selected, degree2 }) {
1141
1141
  <div style={{ fontSize: 10, color: accent, fontWeight: 700, letterSpacing: 1, marginBottom: 4, textAlign: 'center' }}>
1142
1142
  {hasCluster ? 'CLUSTER ACTIVE' : 'CREATE CLUSTER'}
1143
1143
  </div>
1144
- <div style={{ fontSize: 12, color: '#aaa', marginBottom: 12, textAlign: 'center' }}>
1144
+ <div style={{ fontSize: 12, color: 'var(--sd-fg-3, #aaa)', marginBottom: 12, textAlign: 'center' }}>
1145
1145
  {hasCluster
1146
1146
  ? `${clusterCount} connections mapped in Six Degrees`
1147
1147
  : <>Scan {selected.name}&apos;s connections to map their network</>}
@@ -1151,15 +1151,15 @@ function CreateClusterCard({ selected, degree2 }) {
1151
1151
  <ScanLog title={scan.pending ? 'Starting…' : `Scanning ${selected.name}’s circle…`} log={scan.log} />
1152
1152
  ) : problem?.offline ? (
1153
1153
  <>
1154
- <div style={{ padding: '10px', borderRadius: 8, background: 'rgba(255,80,80,0.1)', border: '1px solid rgba(255,80,80,0.3)', color: '#ff5050', fontSize: 12, marginBottom: 8, textAlign: 'center' }}>
1154
+ <div style={{ padding: '10px', borderRadius: 8, background: 'rgba(255,80,80,0.1)', border: '1px solid rgba(255,80,80,0.3)', color: 'var(--sd-red, #ff5050)', fontSize: 12, marginBottom: 8, textAlign: 'center' }}>
1155
1155
  Scanner offline
1156
1156
  </div>
1157
- <div style={{ fontSize: 10, color: '#888', textAlign: 'center', marginBottom: 8 }}>
1157
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', textAlign: 'center', marginBottom: 8 }}>
1158
1158
  {problem.text} Open the <strong>Scan</strong> page to finish setting the scanner up.
1159
1159
  </div>
1160
1160
  <button onClick={() => setProblem(null)} style={{
1161
1161
  width: '100%', padding: '10px', borderRadius: 8, border: 'none', cursor: 'pointer',
1162
- background: 'rgba(255,255,255,0.1)', color: '#aaa', fontWeight: 600, fontSize: 12,
1162
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.1)', color: 'var(--sd-fg-3, #aaa)', fontWeight: 600, fontSize: 12,
1163
1163
  }}>
1164
1164
  Retry
1165
1165
  </button>
@@ -1178,19 +1178,19 @@ function CreateClusterCard({ selected, degree2 }) {
1178
1178
  </button>
1179
1179
  </div>
1180
1180
  {resume && (
1181
- <div style={{ fontSize: 10, color: '#888', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
1181
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
1182
1182
  Read to page {resume.pagesRead} so far. Resume carries on from page {resume.nextPage}. LinkedIn
1183
1183
  lists their connections in its own order, not by date, so Rescan reads them all again from page 1.
1184
1184
  </div>
1185
1185
  )}
1186
1186
  {hasCluster && resume === null && (
1187
- <div style={{ fontSize: 10, color: '#888', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
1187
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', marginTop: 8, lineHeight: 1.45, textAlign: 'center' }}>
1188
1188
  Their whole list has been read. LinkedIn doesn&apos;t date other people&apos;s connections, so a
1189
1189
  rescan reads it all again to find anyone new.
1190
1190
  </div>
1191
1191
  )}
1192
1192
  {busy && (
1193
- <div style={{ fontSize: 10, color: '#bbb', marginTop: 8, textAlign: 'center' }}>
1193
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-2, #bbb)', marginTop: 8, textAlign: 'center' }}>
1194
1194
  {busy}. One scan at a time: this one can start when it finishes.
1195
1195
  </div>
1196
1196
  )}
@@ -1203,18 +1203,18 @@ function CreateClusterCard({ selected, degree2 }) {
1203
1203
  );
1204
1204
  }
1205
1205
 
1206
- // In place of the Scan buttons while the sample or a CSV import is open. Both
1207
- // live in this window only, so a scan could only fail: the scanner looks the
1208
- // person up in the database, and says "Bridge '…' not found in database".
1206
+ // In place of the Scan buttons while the sample or a CSV import is open.
1207
+ // Neither is in the database, so a scan could only fail: the scanner looks the
1208
+ // person up there, and says "Bridge '…' not found in database".
1209
1209
  function ScansNeedYourNetwork({ csvSource, style }) {
1210
1210
  return (
1211
1211
  <div style={{
1212
- padding: '10px 12px', borderRadius: 8, fontSize: 11, color: '#999', lineHeight: 1.5, textAlign: 'center',
1213
- background: 'rgba(255,255,255,0.03)', border: '1px solid rgba(255,255,255,0.08)', ...style,
1212
+ padding: '10px 12px', borderRadius: 8, fontSize: 11, color: 'var(--sd-fg-3, #999)', lineHeight: 1.5, textAlign: 'center',
1213
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.03)', border: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.08)', ...style,
1214
1214
  }}>
1215
1215
  {csvSource === 'sample'
1216
1216
  ? 'Scanning needs your own network: everyone in the sample is invented.'
1217
- : 'Scanning needs your own network: a CSV import lives only in this window. Close it (Γ— at the top) and open Scan.'}
1217
+ : 'Scanning needs your own network, not a CSV import. Remove the import (Γ— at the top) and open Scan.'}
1218
1218
  </div>
1219
1219
  );
1220
1220
  }
@@ -1229,9 +1229,9 @@ function ScanLog({ title, log, small = false }) {
1229
1229
  {/* Its own keyframes: the 'pulse' this named was never defined anywhere, so the dot sat still. */}
1230
1230
  <style>{'@keyframes scanlogPulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .35; transform: scale(.7); } } @media (prefers-reduced-motion: reduce) { .scanlog-dot { animation: none !important; } }'}</style>
1231
1231
  <div className="scanlog-dot" style={{ width: small ? 6 : 8, height: small ? 6 : 8, borderRadius: '50%', background: '#9B59B6', animation: 'scanlogPulse 1s ease-in-out infinite' }} />
1232
- <span style={{ fontSize: 11, fontWeight: 600, color: '#9B59B6' }}>{title}</span>
1232
+ <span style={{ fontSize: 11, fontWeight: 600, color: 'var(--sd-purple, #9B59B6)' }}>{title}</span>
1233
1233
  </div>
1234
- <div style={{ fontFamily: 'monospace', fontSize: small ? 9 : 10, color: '#888', maxHeight: small ? 80 : 100, overflow: 'auto' }}>
1234
+ <div style={{ fontFamily: 'monospace', fontSize: small ? 9 : 10, color: 'var(--sd-fg-3, #888)', maxHeight: small ? 80 : 100, overflow: 'auto' }}>
1235
1235
  {log.slice(-40).map((l, i) => <div key={i}>{l}</div>)}
1236
1236
  </div>
1237
1237
  </div>
@@ -1247,7 +1247,7 @@ function LastRead({ job, who = null }) {
1247
1247
  padding: '8px 10px', borderRadius: 8, marginBottom: 10, fontSize: 11, textAlign: 'center', lineHeight: 1.4,
1248
1248
  background: ok ? 'rgba(0,255,136,0.08)' : 'rgba(255,80,80,0.08)',
1249
1249
  border: `1px solid ${ok ? 'rgba(0,255,136,0.25)' : 'rgba(255,80,80,0.25)'}`,
1250
- color: ok ? '#00ff88' : '#ff8080',
1250
+ color: ok ? 'var(--sd-green, #00ff88)' : '#ff8080',
1251
1251
  }}>
1252
1252
  {ok
1253
1253
  ? `${who ? `${who}’s circle` : 'The scan'} finished. What it found is on the map.`
@@ -1261,7 +1261,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1261
1261
 
1262
1262
  return (
1263
1263
  <div style={{
1264
- background: 'rgba(255,255,255,0.05)', borderRadius: 6,
1264
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.05)', borderRadius: 6,
1265
1265
  borderLeft: `3px solid ${tierColors[cs.bridge.tier] || '#FF6B35'}`,
1266
1266
  overflow: 'hidden',
1267
1267
  }}>
@@ -1280,34 +1280,34 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1280
1280
  ) : (
1281
1281
  <div style={{
1282
1282
  width: 28, height: 28, borderRadius: '50%', flexShrink: 0, fontSize: 11, fontWeight: 700,
1283
- background: tierColors[cs.bridge.tier] || '#555', color: cs.bridge.tier === 'S' ? '#000' : '#fff',
1283
+ background: tierColors[cs.bridge.tier] || '#555', color: cs.bridge.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
1284
1284
  display: 'flex', alignItems: 'center', justifyContent: 'center',
1285
1285
  }}>{cs.bridge.name?.charAt(0)}</div>
1286
1286
  )}
1287
1287
  <div>
1288
1288
  <div style={{ fontWeight: 600, fontSize: 12 }}>
1289
- <span style={{ color: '#555', marginRight: 4 }}>#{rank}</span>{cs.bridge.name}
1289
+ <span style={{ color: 'var(--sd-fg-5, #555)', marginRight: 4 }}>#{rank}</span>{cs.bridge.name}
1290
1290
  </div>
1291
- <div style={{ fontSize: 9, color: '#666' }}>{cs.bridge.headline?.substring(0, 40)}</div>
1291
+ <div style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)' }}>{cs.bridge.headline?.substring(0, 40)}</div>
1292
1292
  </div>
1293
1293
  </div>
1294
1294
  <span style={{
1295
1295
  fontSize: 10, fontWeight: 700, padding: '2px 6px', borderRadius: 4,
1296
- background: tierColors[cs.bridge.tier], color: cs.bridge.tier === 'S' ? '#000' : '#fff',
1296
+ background: tierColors[cs.bridge.tier], color: cs.bridge.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
1297
1297
  }}>{cs.bridge.tier}</span>
1298
1298
  </div>
1299
1299
  <div style={{ display: 'flex', gap: 6, marginTop: 6, fontSize: 10 }}>
1300
- {cs.sCount > 0 && <span style={{ color: '#FFD700', fontWeight: 600 }}>{cs.sCount}S{cs.sAvgPower > 0 ? ` (${cs.sAvgPower.toFixed(1)})` : ''}</span>}
1301
- {cs.aCount > 0 && <span style={{ color: '#9B59B6', fontWeight: 600 }}>{cs.aCount}A</span>}
1302
- {cs.bCount > 0 && <span style={{ color: '#3498DB' }}>{cs.bCount}B</span>}
1300
+ {cs.sCount > 0 && <span style={{ color: 'var(--sd-gold, #FFD700)', fontWeight: 600 }}>{cs.sCount}S{cs.sAvgPower > 0 ? ` (${cs.sAvgPower.toFixed(1)})` : ''}</span>}
1301
+ {cs.aCount > 0 && <span style={{ color: 'var(--sd-purple, #9B59B6)', fontWeight: 600 }}>{cs.aCount}A</span>}
1302
+ {cs.bCount > 0 && <span style={{ color: 'var(--sd-blue, #3498DB)' }}>{cs.bCount}B</span>}
1303
1303
  {cs.risingCount > 0 && <span style={{ color: '#2ECC71' }}>{cs.risingCount} rising</span>}
1304
- <span style={{ color: '#555' }}>{cs.members} total</span>
1304
+ <span style={{ color: 'var(--sd-fg-5, #555)' }}>{cs.members} total</span>
1305
1305
  </div>
1306
1306
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginTop: 4, fontSize: 10 }}>
1307
- <span style={{ color: '#666' }}>
1307
+ <span style={{ color: 'var(--sd-fg-4, #666)' }}>
1308
1308
  Elite: {(cs.elitePct * 100).toFixed(0)}% Β· Avg: {cs.avgPower.toFixed(1)}
1309
1309
  </span>
1310
- <span style={{ color: '#FF6B35', fontWeight: 700 }}>
1310
+ <span style={{ color: 'var(--sd-orange, #FF6B35)', fontWeight: 700 }}>
1311
1311
  {cs.clusterValue.toFixed(1)}
1312
1312
  </span>
1313
1313
  </div>
@@ -1326,13 +1326,13 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1326
1326
  ) : (
1327
1327
  <div key={m.id} style={{
1328
1328
  width: 22, height: 22, borderRadius: '50%', fontSize: 9, fontWeight: 700,
1329
- background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : '#fff',
1329
+ background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
1330
1330
  display: 'flex', alignItems: 'center', justifyContent: 'center',
1331
1331
  }} title={m.name}>{m.name?.charAt(0)}</div>
1332
1332
  )
1333
1333
  ))}
1334
1334
  {(cs.sCount + cs.aCount) > 4 && (
1335
- <span style={{ fontSize: 9, color: '#666' }}>+{cs.sCount + cs.aCount - 4} more</span>
1335
+ <span style={{ fontSize: 9, color: 'var(--sd-fg-4, #666)' }}>+{cs.sCount + cs.aCount - 4} more</span>
1336
1336
  )}
1337
1337
  </div>
1338
1338
  )}
@@ -1341,7 +1341,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1341
1341
  <button
1342
1342
  onClick={() => setExpanded(!expanded)}
1343
1343
  style={{
1344
- marginTop: 6, background: 'none', border: 'none', color: '#888',
1344
+ marginTop: 6, background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)',
1345
1345
  fontSize: 10, cursor: 'pointer', padding: 0, display: 'flex', alignItems: 'center', gap: 4,
1346
1346
  }}
1347
1347
  >
@@ -1353,7 +1353,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1353
1353
  {/* Expanded member list */}
1354
1354
  {expanded && (
1355
1355
  <div style={{
1356
- borderTop: '1px solid rgba(255,255,255,0.06)',
1356
+ borderTop: '1px solid rgba(var(--sd-ink, 255, 255, 255), 0.06)',
1357
1357
  padding: '6px 10px 10px', maxHeight: 250, overflowY: 'auto',
1358
1358
  }}>
1359
1359
  {cs.topMembers.map(m => (
@@ -1364,7 +1364,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1364
1364
  display: 'flex', alignItems: 'center', gap: 6, padding: '4px 2px',
1365
1365
  cursor: 'pointer', borderRadius: 4,
1366
1366
  }}
1367
- onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(255,255,255,0.06)'}
1367
+ onMouseEnter={(e) => e.currentTarget.style.background = 'rgba(var(--sd-ink, 255, 255, 255), 0.06)'}
1368
1368
  onMouseLeave={(e) => e.currentTarget.style.background = 'transparent'}
1369
1369
  >
1370
1370
  {localPhoto(m.profile_image_url) ? (
@@ -1375,7 +1375,7 @@ function ClusterCard({ cs, rank, tierColors, onSelect }) {
1375
1375
  ) : null}
1376
1376
  <div style={{
1377
1377
  width: 20, height: 20, borderRadius: '50%', flexShrink: 0, fontSize: 8, fontWeight: 700,
1378
- background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : '#fff',
1378
+ background: tierColors[m.tier] || '#555', color: m.tier === 'S' ? '#000' : 'var(--sd-fg-1, #fff)',
1379
1379
  display: localPhoto(m.profile_image_url) ? 'none' : 'flex',
1380
1380
  alignItems: 'center', justifyContent: 'center',
1381
1381
  }}>{m.name?.charAt(0)}</div>
@@ -1405,13 +1405,13 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
1405
1405
 
1406
1406
  // 1. Title leverage
1407
1407
  if (role.match(/ceo|chief|founder|president|chairman/i)) {
1408
- insights.push({ icon: 'πŸ‘‘', text: `${person.role} β€” C-suite executive, highest leverage contact`, color: '#FFD700' });
1408
+ insights.push({ icon: 'πŸ‘‘', text: `${person.role}: C-suite executive, highest leverage contact`, color: 'var(--sd-gold, #FFD700)' });
1409
1409
  } else if (role.match(/vp|vice president|svp|evp|managing director/i)) {
1410
- insights.push({ icon: '⚑', text: `${person.role} β€” VP-level, strong decision-making authority`, color: '#FFD700' });
1410
+ insights.push({ icon: '⚑', text: `${person.role}: VP-level, strong decision-making authority`, color: 'var(--sd-gold, #FFD700)' });
1411
1411
  } else if (role.match(/director|head of|senior director/i)) {
1412
- insights.push({ icon: '🎯', text: `${person.role} β€” Senior leadership, controls team/budget`, color: '#FF6B35' });
1412
+ insights.push({ icon: '🎯', text: `${person.role}: Senior leadership, controls team/budget`, color: 'var(--sd-orange, #FF6B35)' });
1413
1413
  } else if (role.match(/manager|lead|principal/i)) {
1414
- insights.push({ icon: 'πŸ“Š', text: `${person.role} β€” Mid-senior, operational influence`, color: '#3498DB' });
1414
+ insights.push({ icon: 'πŸ“Š', text: `${person.role}: Mid-senior, operational influence`, color: 'var(--sd-blue, #3498DB)' });
1415
1415
  }
1416
1416
 
1417
1417
  // 2–3. A top company now, and one before, by the model's own company scores
@@ -1421,28 +1421,28 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
1421
1421
  // headline, so "Metadata Analyst" read as Meta and an ex-Googler as at Google.
1422
1422
  const { now, before } = topCompanies(person);
1423
1423
  if (now) {
1424
- insights.push({ icon: '🏒', text: `At ${now.name} (${now.score}/10) β€” top-tier company network access`, color: '#9B59B6' });
1424
+ insights.push({ icon: '🏒', text: `At ${now.name} (${now.score}/10): top-tier company network access`, color: 'var(--sd-purple, #9B59B6)' });
1425
1425
  }
1426
1426
  if (before) {
1427
- insights.push({ icon: 'πŸ“œ', text: `Former ${before.name} (${before.score}/10) β€” carries network from previous role`, color: '#95A5A6' });
1427
+ insights.push({ icon: 'πŸ“œ', text: `Former ${before.name} (${before.score}/10): carries network from previous role`, color: 'var(--sd-fg-3, #95A5A6)' });
1428
1428
  }
1429
1429
 
1430
1430
  // 4. Sector overlap with user
1431
1431
  const matchingSectors = userSectors.filter(s => headline.includes(s) || company.includes(s));
1432
1432
  if (matchingSectors.length > 0) {
1433
- insights.push({ icon: 'πŸ”—', text: `Shared sector: ${matchingSectors.join(', ')} β€” direct industry relevance to you`, color: '#2ECC71' });
1433
+ insights.push({ icon: 'πŸ”—', text: `Shared sector: ${matchingSectors.join(', ')}: direct industry relevance to you`, color: '#2ECC71' });
1434
1434
  }
1435
1435
 
1436
1436
  // 5. Bridge / gateway value
1437
1437
  const bridgeCount = degree2.filter(d => d.source_connection_id === person.id).length;
1438
1438
  if (bridgeCount > 0) {
1439
1439
  const bridgeSCount = degree2.filter(d => d.source_connection_id === person.id && d.tier === 'S').length;
1440
- insights.push({ icon: '🌐', text: `Gateway to ${bridgeCount} degree-2 connections${bridgeSCount > 0 ? ` (${bridgeSCount} S-tier)` : ''}`, color: '#FF6B35' });
1440
+ insights.push({ icon: '🌐', text: `Gateway to ${bridgeCount} degree-2 connections${bridgeSCount > 0 ? ` (${bridgeSCount} S-tier)` : ''}`, color: 'var(--sd-orange, #FF6B35)' });
1441
1441
  }
1442
1442
 
1443
1443
  // 6. Catalyst
1444
1444
  if (person.is_catalyst) {
1445
- insights.push({ icon: '⚑', text: `Catalyst β€” network power exceeds personal tier, high stepping-stone value`, color: '#00ff88' });
1445
+ insights.push({ icon: '⚑', text: `Catalyst: network power exceeds personal tier, high stepping-stone value`, color: 'var(--sd-green, #00ff88)' });
1446
1446
  }
1447
1447
 
1448
1448
  // 7. Every way in (degree 2). Built from the merged routes, so it can never
@@ -1452,8 +1452,8 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
1452
1452
  const named = routes.filter(r => r.bridge);
1453
1453
  if (routes.length === 1) {
1454
1454
  insights.push(named.length
1455
- ? { icon: '🀝', text: `Reachable via ${named[0].bridge.name} (${named[0].bridge.tier}-tier)`, color: '#3498DB' }
1456
- : { icon: '🀝', text: 'Reachable through a connection we can’t name', color: '#888' });
1455
+ ? { icon: '🀝', text: `Reachable via ${named[0].bridge.name} (${named[0].bridge.tier}-tier)`, color: 'var(--sd-blue, #3498DB)' }
1456
+ : { icon: '🀝', text: 'Reachable through a connection we can’t name', color: 'var(--sd-fg-3, #888)' });
1457
1457
  } else {
1458
1458
  const firstName = (n) => String(n || '').trim().split(/\s+/)[0];
1459
1459
  const names = named.slice(0, 2).map(r => `${firstName(r.bridge.name)} (${r.bridge.tier})`);
@@ -1461,13 +1461,13 @@ function generateInsights(person, user, allConnections, degree2, routes = []) {
1461
1461
  const via = names.length === 0 ? 'connections we can’t name'
1462
1462
  : more > 0 ? `${names.join(', ')} and ${more} more`
1463
1463
  : names.join(' and ');
1464
- insights.push({ icon: '🀝', text: `Reachable ${routes.length} ways β€” via ${via}`, color: '#3498DB' });
1464
+ insights.push({ icon: '🀝', text: `Reachable ${routes.length} ways, via ${via}`, color: 'var(--sd-blue, #3498DB)' });
1465
1465
  }
1466
1466
  }
1467
1467
 
1468
1468
  // Fallback if no insights generated
1469
1469
  if (insights.length === 0) {
1470
- insights.push({ icon: 'πŸ“Œ', text: `${person.tier}-tier connection with ${parseFloat(person.power_score).toFixed(1)} power score`, color: '#888' });
1470
+ insights.push({ icon: 'πŸ“Œ', text: `${person.tier}-tier connection with ${parseFloat(person.power_score).toFixed(1)} power score`, color: 'var(--sd-fg-3, #888)' });
1471
1471
  }
1472
1472
 
1473
1473
  return insights.slice(0, 5); // Max 5 insights
@@ -1510,10 +1510,10 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1510
1510
  background: 'rgba(0,255,136,0.05)', border: '1px solid rgba(0,255,136,0.2)',
1511
1511
  borderRadius: 10, padding: 14, marginBottom: 16,
1512
1512
  }}>
1513
- <div style={{ fontSize: 12, fontWeight: 800, color: '#00ff88', marginBottom: 4 }}>
1513
+ <div style={{ fontSize: 12, fontWeight: 800, color: 'var(--sd-green, #00ff88)', marginBottom: 4 }}>
1514
1514
  Ready to scan ({ready.length})
1515
1515
  </div>
1516
- <div style={{ fontSize: 10.5, color: '#999', lineHeight: 1.5, marginBottom: 10 }}>
1516
+ <div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #999)', lineHeight: 1.5, marginBottom: 10 }}>
1517
1517
  People you added through a circle whose own circle isn&apos;t scanned yet. Scanning one
1518
1518
  brings in who they know: 3rd degree, through the circle you found them in.
1519
1519
  </div>
@@ -1525,7 +1525,7 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1525
1525
  ) : last && <LastRead job={last} who={last.target?.name} />}
1526
1526
 
1527
1527
  {ready.length === 0 ? (
1528
- <div style={{ fontSize: 11, color: '#aaa', lineHeight: 1.5 }}>
1528
+ <div style={{ fontSize: 11, color: 'var(--sd-fg-3, #aaa)', lineHeight: 1.5 }}>
1529
1529
  Nobody yet. When someone you asked from a circle accepts, ↻ <b>Check for new</b> brings
1530
1530
  them into your connections, and they show here.
1531
1531
  </div>
@@ -1539,20 +1539,20 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1539
1539
  aria-label={`Scan ${p.name}’s circle: opens the Scan page to confirm`}
1540
1540
  style={{
1541
1541
  display: 'flex', alignItems: 'center', gap: 8, padding: '8px 10px', borderRadius: 8,
1542
- textDecoration: 'none', color: '#fff',
1543
- background: 'rgba(255,255,255,0.04)', border: '1px solid rgba(0,255,136,0.18)',
1542
+ textDecoration: 'none', color: 'var(--sd-fg-1, #fff)',
1543
+ background: 'rgba(var(--sd-ink, 255, 255, 255), 0.04)', border: '1px solid rgba(0,255,136,0.18)',
1544
1544
  }}>
1545
1545
  <span style={{ width: 8, height: 8, borderRadius: '50%', flexShrink: 0, background: tierColors[p.tier] || '#888', boxShadow: '0 0 0 2px rgba(0,255,136,0.45)' }} />
1546
1546
  <span style={{ flex: 1, minWidth: 0 }}>
1547
1547
  <span style={{ fontSize: 12, fontWeight: 700 }}>{p.name}</span>
1548
1548
  <span style={{ fontSize: 10, color: tierColors[p.tier] || '#888', fontWeight: 700, marginLeft: 6 }}>{p.tier}</span>
1549
1549
  {from && (
1550
- <span style={{ display: 'block', fontSize: 10, color: '#888', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
1550
+ <span style={{ display: 'block', fontSize: 10, color: 'var(--sd-fg-3, #888)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
1551
1551
  was in {first(from)}&apos;s circle
1552
1552
  </span>
1553
1553
  )}
1554
1554
  </span>
1555
- <span style={{ fontSize: 10.5, fontWeight: 700, color: '#00ff88', whiteSpace: 'nowrap' }}>
1555
+ <span style={{ fontSize: 10.5, fontWeight: 700, color: 'var(--sd-green, #00ff88)', whiteSpace: 'nowrap' }}>
1556
1556
  {now ? 'Scanning…' : 'Scan… β†’'}
1557
1557
  </span>
1558
1558
  </Link>
@@ -1560,7 +1560,7 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1560
1560
  })}
1561
1561
  {ready.length > 5 && (
1562
1562
  <button type="button" onClick={() => setAll((v) => !v)} style={{
1563
- background: 'none', border: 'none', color: '#888', fontSize: 10.5, fontWeight: 600, cursor: 'pointer', padding: '2px 0', textAlign: 'left',
1563
+ background: 'none', border: 'none', color: 'var(--sd-fg-3, #888)', fontSize: 10.5, fontWeight: 600, cursor: 'pointer', padding: '2px 0', textAlign: 'left',
1564
1564
  }}>
1565
1565
  {all ? 'Show fewer' : `Show all ${ready.length}`}
1566
1566
  </button>
@@ -1569,7 +1569,7 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1569
1569
  )}
1570
1570
 
1571
1571
  {ready.length > 0 && (
1572
- <div style={{ fontSize: 10, color: '#888', lineHeight: 1.5, marginTop: 8 }}>
1572
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-3, #888)', lineHeight: 1.5, marginTop: 8 }}>
1573
1573
  Each scan: {cost.profileViews} profile view, then one LinkedIn search for every page of their
1574
1574
  list, up to {cost.searches} pages (about {cost.minutes} min for a whole list). Nothing starts
1575
1575
  until you confirm it on the Scan page.
@@ -1577,10 +1577,10 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1577
1577
  )}
1578
1578
 
1579
1579
  {hidden.length > 0 && (
1580
- <div style={{ marginTop: 10, fontSize: 10.5, color: '#777', lineHeight: 1.6 }}>
1580
+ <div style={{ marginTop: 10, fontSize: 10.5, color: 'var(--sd-fg-4, #777)', lineHeight: 1.6 }}>
1581
1581
  {hidden.slice(0, 3).map((p) => (
1582
1582
  <div key={p.id} style={{ opacity: 0.7 }}>
1583
- <span aria-hidden="true">πŸ”’</span> {p.name} <span style={{ color: '#666' }}>Β· their list is hidden</span>
1583
+ <span aria-hidden="true">πŸ”’</span> {p.name} <span style={{ color: 'var(--sd-fg-4, #666)' }}>Β· their list is hidden</span>
1584
1584
  </div>
1585
1585
  ))}
1586
1586
  {hidden.length > 3 && <div style={{ opacity: 0.7 }}>πŸ”’ and {hidden.length - 3} more with hidden lists</div>}
@@ -1588,13 +1588,13 @@ function ReadyToScan({ connections, degree2, scanNotes, tierColors }) {
1588
1588
  )}
1589
1589
 
1590
1590
  {others > 0 && (
1591
- <div style={{ fontSize: 10.5, color: '#888', lineHeight: 1.5, marginTop: 10 }}>
1591
+ <div style={{ fontSize: 10.5, color: 'var(--sd-fg-3, #888)', lineHeight: 1.5, marginTop: 10 }}>
1592
1592
  {others.toLocaleString('en-US')} of your other connections aren&apos;t scanned yet.{' '}
1593
- <Link href="/setup" style={{ color: '#3498DB', textDecoration: 'none' }}>Map them in batches on the Scan page β†’</Link>
1593
+ <Link href="/setup" style={{ color: 'var(--sd-blue, #3498DB)', textDecoration: 'none' }}>Map them in batches on the Scan page β†’</Link>
1594
1594
  </div>
1595
1595
  )}
1596
1596
  {busy && (
1597
- <div style={{ fontSize: 10, color: '#bbb', marginTop: 8 }}>
1597
+ <div style={{ fontSize: 10, color: 'var(--sd-fg-2, #bbb)', marginTop: 8 }}>
1598
1598
  {busy}. One scan at a time.
1599
1599
  </div>
1600
1600
  )}