failproofai 0.0.11-beta.8 → 0.0.11

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 (239) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/standalone/.next/build-manifest.json +6 -6
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/routes-manifest.json +6 -0
  7. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +3 -3
  8. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  9. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  14. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  15. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  16. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  17. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +3 -3
  19. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  20. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  21. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  24. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  25. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  26. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  27. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  28. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  29. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  30. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/api/audit/invite/route/app-paths-manifest.json +3 -0
  32. package/.next/standalone/.next/server/app/api/audit/invite/route/build-manifest.json +9 -0
  33. package/.next/standalone/.next/server/app/api/audit/invite/route/server-reference-manifest.json +4 -0
  34. package/.next/standalone/.next/server/app/api/audit/invite/route.js +7 -0
  35. package/.next/standalone/.next/server/app/api/audit/invite/route.js.map +5 -0
  36. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -0
  37. package/.next/standalone/.next/server/app/api/audit/invite/route_client-reference-manifest.js +3 -0
  38. package/.next/standalone/.next/server/app/api/audit/run/route.js +1 -1
  39. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +1 -1
  41. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +2 -2
  43. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/auth/logout/route.js +2 -2
  45. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/auth/reminder/route.js +2 -2
  47. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/auth/status/route.js +2 -2
  49. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +3 -3
  52. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  53. package/.next/standalone/.next/server/app/audit/page.js +2 -2
  54. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  55. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/index.html +1 -1
  57. package/.next/standalone/.next/server/app/index.rsc +15 -15
  58. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  59. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  60. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  61. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  62. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  63. package/.next/standalone/.next/server/app/page/build-manifest.json +3 -3
  64. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  65. package/.next/standalone/.next/server/app/page.js +2 -2
  66. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +3 -3
  69. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  70. package/.next/standalone/.next/server/app/policies/page.js +2 -2
  71. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +3 -3
  74. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  75. package/.next/standalone/.next/server/app/project/[name]/page.js +3 -3
  76. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +3 -3
  79. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  80. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  81. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +3 -3
  82. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +3 -3
  85. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  86. package/.next/standalone/.next/server/app/projects/page.js +3 -3
  87. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  90. package/.next/standalone/.next/server/chunks/[externals]__1_g_b3t._.js +3 -0
  91. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dwpg-h._.js +3 -0
  92. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lnenda._.js +3 -0
  93. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13i_sva._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1_mqemn._.js +1 -1
  95. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_invite_route_actions_0-2n5sy.js +3 -0
  96. package/.next/standalone/.next/server/chunks/node_modules_0-tu4ot._.js +3 -0
  97. package/.next/standalone/.next/server/chunks/node_modules_0ttxbz7._.js +3 -0
  98. package/.next/standalone/.next/server/chunks/node_modules_1bnh1y0._.js +3 -0
  99. package/.next/standalone/.next/server/chunks/node_modules_1epycqa._.js +3 -0
  100. package/.next/standalone/.next/server/chunks/node_modules_1wpdcgo._.js +3 -0
  101. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +3 -3
  102. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +1 -1
  103. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +1 -1
  104. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  105. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1d4gx_t._.js → [root-of-the-server]__00uwqi6._.js} +2 -2
  106. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0808sha._.js +4 -0
  107. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1cd25c7._.js → [root-of-the-server]__0e4-6d8._.js} +3 -3
  108. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehe24g._.js +4 -0
  109. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1-scthx._.js → [root-of-the-server]__0f62vu9._.js} +2 -2
  110. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g253ve._.js +4 -0
  111. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l13qf2._.js → [root-of-the-server]__0k65l27._.js} +1 -1
  112. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__15i0juc._.js → [root-of-the-server]__0kjb_s4._.js} +2 -2
  113. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxf0_g._.js +4 -0
  114. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12mcauo._.js +4 -0
  115. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0989_dx._.js → [root-of-the-server]__1e-x7j4._.js} +2 -2
  116. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +1 -1
  117. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pcxxwg._.js +2 -2
  118. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1uvfwgr._.js +4 -0
  119. package/.next/standalone/.next/server/chunks/ssr/_05whahf._.js +1 -1
  120. package/.next/standalone/.next/server/chunks/ssr/_0il3fl1._.js +3 -0
  121. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +49 -21
  122. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  123. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
  124. package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_0ihmbv4.js +3 -0
  125. package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_1ao30b1.js +3 -0
  126. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +1 -1
  127. package/.next/standalone/.next/server/middleware-build-manifest.js +6 -6
  128. package/.next/standalone/.next/server/pages/404.html +1 -1
  129. package/.next/standalone/.next/server/pages/500.html +1 -1
  130. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/server-reference-manifest.json +10 -10
  132. package/.next/standalone/.next/static/chunks/{0d49wc5zca0u1.js → 02fywjt0by40a.js} +1 -1
  133. package/.next/standalone/.next/static/chunks/0f7d7hnbh4djs.js +1 -0
  134. package/.next/standalone/.next/static/chunks/0h7auy7hzjyhw.js +1 -0
  135. package/.next/standalone/.next/static/chunks/0xdx2ehtbdoeg.js +1 -0
  136. package/.next/standalone/.next/static/chunks/{1nd1e30h8s_mc.js → 1-a5rvq67k7ed.js} +1 -1
  137. package/.next/standalone/.next/static/chunks/{1m2yj97j7f_km.js → 15csyj1_rf0-w.js} +1 -1
  138. package/.next/standalone/.next/static/chunks/1o0xa47736gi9.css +2 -0
  139. package/.next/standalone/.next/static/chunks/24cv31x607n7k.js +1 -0
  140. package/.next/standalone/.next/static/chunks/{3w8d8k_dca5rp.js → 2h0dkzyy0vocp.js} +1 -1
  141. package/.next/standalone/.next/static/chunks/2n_s8v1ae38_a.js +69 -0
  142. package/.next/standalone/.next/static/chunks/2y-jmvrjxz60x.js +6 -0
  143. package/.next/standalone/.next/static/chunks/{24z-bgbisv379.js → 3eik_d9qrvoft.js} +1 -1
  144. package/.next/standalone/.next/static/chunks/3i27c3hcriawq.css +1 -0
  145. package/.next/standalone/.next/static/chunks/{0j969hb6nujdf.js → 3v61675vr6jav.js} +1 -1
  146. package/.next/standalone/.next/static/chunks/3zkg2s2vzxc3d.js +1 -0
  147. package/.next/standalone/.next/static/chunks/{turbopack-00qy7zfa7m--m.js → turbopack-3lrm4f20fz89b.js} +1 -1
  148. package/.next/standalone/app/api/audit/invite/route.ts +192 -0
  149. package/.next/standalone/app/api/audit/run/route.ts +35 -0
  150. package/.next/standalone/app/api/auth/login-request/route.ts +2 -2
  151. package/.next/standalone/app/api/auth/login-verify/route.ts +10 -2
  152. package/.next/standalone/app/audit/_components/audit-dashboard.tsx +39 -63
  153. package/.next/standalone/app/audit/_components/audit-poster.tsx +326 -0
  154. package/.next/standalone/app/audit/_components/auth-dialog.tsx +23 -49
  155. package/.next/standalone/app/audit/_components/come-back-better-section.tsx +336 -0
  156. package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +187 -0
  157. package/.next/standalone/app/audit/_components/invite-dialog.tsx +230 -0
  158. package/.next/standalone/app/audit/_components/quirks-section.tsx +75 -0
  159. package/.next/standalone/app/audit/_components/share-templates.ts +63 -32
  160. package/.next/standalone/app/audit/_components/sigil.tsx +9 -66
  161. package/.next/standalone/app/audit/_components/strengths-section.tsx +20 -32
  162. package/.next/standalone/app/audit/audit-styles.css +778 -1786
  163. package/.next/standalone/app/components/sessions-list.tsx +77 -80
  164. package/.next/standalone/app/globals.css +241 -34
  165. package/.next/standalone/app/layout.tsx +1 -10
  166. package/.next/standalone/app/policies/hooks-client.tsx +45 -28
  167. package/.next/standalone/app/project/[name]/page.tsx +23 -79
  168. package/.next/standalone/app/projects/page.tsx +14 -23
  169. package/.next/standalone/assets/audit/poster-styles.css +1 -1
  170. package/.next/standalone/assets/audit/styles.css +11 -11
  171. package/.next/standalone/components/navbar.tsx +2 -37
  172. package/.next/standalone/components/reach-developers.tsx +10 -25
  173. package/.next/standalone/lib/auth/api-server-client.ts +28 -0
  174. package/.next/standalone/lib/client-telemetry.ts +4 -0
  175. package/.next/standalone/node_modules/@next/env/package.json +2 -2
  176. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  177. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  178. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  179. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  180. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  181. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  182. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  183. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  184. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  185. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  186. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  187. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  188. package/.next/standalone/node_modules/next/package.json +15 -15
  189. package/.next/standalone/package.json +19 -14
  190. package/.next/standalone/server.js +1 -1
  191. package/README.md +2 -2
  192. package/bin/failproofai.mjs +24 -5
  193. package/dist/cli.mjs +2328 -381
  194. package/lib/auth/api-server-client.ts +28 -0
  195. package/lib/client-telemetry.ts +4 -0
  196. package/package.json +19 -14
  197. package/scripts/launch.ts +30 -4
  198. package/scripts/postinstall.mjs +10 -1
  199. package/scripts/skew-log-filter.ts +46 -0
  200. package/scripts/validate-mdx.ts +139 -0
  201. package/src/audit/cli.ts +330 -0
  202. package/src/audit/open-browser.ts +69 -0
  203. package/src/audit/social-proof.ts +34 -0
  204. package/src/auth/cli.ts +16 -13
  205. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07tgnzi._.js +0 -3
  206. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oeun7z._.js +0 -3
  207. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12pit4m._.js +0 -3
  208. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13ra2jq._.js +0 -3
  209. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b9z5-i._.js +0 -3
  210. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ixjiy8._.js +0 -3
  211. package/.next/standalone/.next/server/chunks/_1-1804f._.js +0 -3
  212. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00jkjmt._.js +0 -4
  213. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013du6r._.js +0 -4
  214. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e85wxv._.js +0 -4
  215. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gfxvb1._.js +0 -3
  216. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hlrq6y._.js +0 -4
  217. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ihxdo5._.js +0 -4
  218. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vvfde2._.js +0 -4
  219. package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_1k58rb_.js +0 -3
  220. package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_1n-0xws.js +0 -3
  221. package/.next/standalone/.next/static/chunks/09ueq8s1as8xs.css +0 -2
  222. package/.next/standalone/.next/static/chunks/0qassxjx1ef04.js +0 -1
  223. package/.next/standalone/.next/static/chunks/0qxb5czqxe-vu.js +0 -1
  224. package/.next/standalone/.next/static/chunks/1dh06515j265n.js +0 -41
  225. package/.next/standalone/.next/static/chunks/29gs4efgi3hme.js +0 -6
  226. package/.next/standalone/.next/static/chunks/2mni177pnjx6u.js +0 -1
  227. package/.next/standalone/.next/static/chunks/2so39wg7mjbi7.js +0 -1
  228. package/.next/standalone/.next/static/chunks/3gti1qdk5epqn.js +0 -1
  229. package/.next/standalone/.next/static/chunks/3wycox197ouus.css +0 -1
  230. package/.next/standalone/app/audit/_components/findings-section.tsx +0 -135
  231. package/.next/standalone/app/audit/_components/identity-section.tsx +0 -126
  232. package/.next/standalone/app/audit/_components/policies-section.tsx +0 -194
  233. package/.next/standalone/app/audit/_components/return-section.tsx +0 -416
  234. package/.next/standalone/app/audit/_components/score-section.tsx +0 -179
  235. package/.next/standalone/app/audit/_components/share-dock.tsx +0 -265
  236. package/.next/standalone/app/audit/_components/show-off-cta.tsx +0 -135
  237. /package/.next/standalone/.next/static/{CVv2A0hMd24t0c0x3V-W_ → P_MIRSeoE296wkbE-Icin}/_buildManifest.js +0 -0
  238. /package/.next/standalone/.next/static/{CVv2A0hMd24t0c0x3V-W_ → P_MIRSeoE296wkbE-Icin}/_clientMiddlewareManifest.js +0 -0
  239. /package/.next/standalone/.next/static/{CVv2A0hMd24t0c0x3V-W_ → P_MIRSeoE296wkbE-Icin}/_ssgManifest.js +0 -0
@@ -7,14 +7,6 @@
7
7
  away from /audit back to /policies or /projects).
8
8
  ============================================================ */
9
9
 
10
- /* legacy scanline overlay used by audit-dashboard */
11
- .scanline-overlay {
12
- position: fixed; inset: 0; pointer-events: none; z-index: 9999;
13
- background: repeating-linear-gradient(to bottom,
14
- rgba(255,255,255,0) 0, rgba(255,255,255,0) 2px,
15
- rgba(255,255,255,0.018) 2px, rgba(255,255,255,0.018) 3px);
16
- mix-blend-mode: overlay;
17
- }
18
10
 
19
11
  /* ───────────────────────── 00 EMPTY + RUNNING (full-page states) ───────────────────────── */
20
12
 
@@ -23,10 +15,8 @@
23
15
  .empty-panel, .running-panel {
24
16
  padding: 48px 56px;
25
17
  display: flex; flex-direction: column;
26
- background:
27
- repeating-linear-gradient(0deg, rgba(228,88,125,0.025) 0 1px, transparent 1px 16px),
28
- repeating-linear-gradient(90deg, rgba(102,209,181,0.025) 0 1px, transparent 1px 16px),
29
- var(--bg-2);
18
+ background: var(--bg-2);
19
+ border: 1px solid var(--line-2);
30
20
  }
31
21
 
32
22
  .empty-glyph { align-self: center; text-align: center; margin-bottom: 28px; }
@@ -39,7 +29,6 @@
39
29
  border: 1px solid var(--line-2);
40
30
  background: var(--bg);
41
31
  margin: 0 auto 14px;
42
- box-shadow: 6px 6px 0 0 var(--accent-pink-shadow);
43
32
  }
44
33
  .empty-glyph-grid .px { background: transparent; }
45
34
  .empty-glyph-grid .px.on { background: var(--accent-pink); }
@@ -55,7 +44,6 @@
55
44
  letter-spacing: 0.1em; line-height: 1.05;
56
45
  text-transform: lowercase;
57
46
  color: var(--ink);
58
- text-shadow: 3px 3px 0 var(--accent-pink-shadow);
59
47
  margin: 0 0 16px;
60
48
  text-wrap: balance;
61
49
  text-align: center;
@@ -241,1946 +229,950 @@
241
229
  text-wrap: balance;
242
230
  }
243
231
 
244
- /* ───────────────────────── 01 IDENTITY (the hero moment) ───────────────────────── */
245
-
246
- .identity {
247
- padding: 80px 0 96px;
248
- position: relative;
249
- }
250
-
251
- .archetype-frame {
252
- position: relative;
253
- /* hero composition was tuned for ~1180px max — let it grow a little but
254
- don't let the giant Bitcount name turn into a billboard on 4K */
255
- max-width: 1320px;
256
- margin-left: auto;
257
- margin-right: auto;
258
- border: 1px solid var(--line-2);
259
- background:
260
- repeating-linear-gradient(0deg, rgba(228,88,125,0.025) 0 1px, transparent 1px 16px),
261
- repeating-linear-gradient(90deg, rgba(102,209,181,0.025) 0 1px, transparent 1px 16px),
262
- var(--bg-2);
263
- padding: 56px 56px 48px;
264
- box-shadow: 8px 8px 0 0 var(--accent-pink-shadow);
265
- }
266
- .archetype-frame .corner {
267
- position: absolute; font-family: var(--font-mono); font-size: 11px;
268
- color: var(--accent-pink); opacity: 0.6; letter-spacing: 0.1em;
269
- }
270
- .archetype-frame .corner.tl { top: 8px; left: 12px; }
271
- .archetype-frame .corner.tr { top: 8px; right: 12px; }
272
- .archetype-frame .corner.bl { bottom: 8px; left: 12px; }
273
- .archetype-frame .corner.br { bottom: 8px; right: 12px; }
232
+ /* ───────────────────────── footer ───────────────────────── */
274
233
 
275
- .arch-mast {
276
- display: flex; align-items: center; justify-content: space-between;
277
- gap: 24px; margin-bottom: 32px;
278
- border-bottom: 1px dashed var(--line);
279
- padding-bottom: 22px;
280
- flex-wrap: wrap;
281
- }
282
- .arch-mast-left {
283
- display: flex; flex-direction: column; gap: 8px;
284
- }
285
- .arch-eyebrow {
234
+ .report-footer {
235
+ padding: 48px 32px 24px;
236
+ border-top: 1px solid var(--line);
237
+ background: var(--bg);
238
+ text-align: center;
286
239
  font-family: var(--font-mono); font-size: 11px;
287
- letter-spacing: 0.22em; text-transform: uppercase;
288
- color: var(--accent-green);
289
- }
290
- .arch-eyebrow .ix { color: var(--accent-pink); }
291
- .arch-target {
292
- font-family: var(--font-mono); font-size: 12px;
293
- color: var(--ink-2); letter-spacing: 0.05em;
294
- }
295
- .arch-target .slash { color: var(--dim); margin: 0 6px; }
296
- .arch-target .live {
297
- margin-left: 10px; color: var(--accent-green);
298
- font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase;
299
- display: inline-flex; align-items: center; gap: 6px;
300
- }
301
- .arch-target .dot-live {
302
- width: 7px; height: 7px; background: var(--accent-green);
303
- display: inline-block;
304
- animation: pulseDot 1.6s ease-in-out infinite;
305
- box-shadow: 0 0 8px rgba(102,209,181,0.6);
306
- }
307
- @keyframes pulseDot {
308
- 0%, 100% { opacity: 1; transform: scale(1); }
309
- 50% { opacity: 0.4; transform: scale(0.85); }
240
+ letter-spacing: 0.15em; text-transform: uppercase;
241
+ color: var(--dim);
310
242
  }
311
- @media (prefers-reduced-motion: reduce) {
312
- .arch-target .dot-live { animation: none; }
243
+ /* Fixed variant — used on the empty/loading states where the page is
244
+ short and a normal in-flow footer ends up floating mid-viewport. Pins
245
+ it to the bottom of the viewport so it doesn't scroll with the page. */
246
+ .report-footer--fixed {
247
+ position: fixed;
248
+ left: 0; right: 0; bottom: 0;
249
+ padding: 16px 32px;
250
+ z-index: 10;
313
251
  }
314
- .arch-counter {
315
- font-family: var(--font-mono); font-size: 11px;
316
- letter-spacing: 0.18em; text-transform: uppercase; color: var(--dim);
317
- text-align: right;
252
+ .report-footer .brand-mark {
253
+ color: var(--accent-pink); font-family: var(--font-mono);
254
+ font-size: 14px; letter-spacing: -2px; font-weight: 700;
255
+ margin-right: 6px;
318
256
  }
319
- .arch-counter .of { color: var(--ink-2); }
320
257
 
321
- .arch-body {
322
- display: grid;
323
- grid-template-columns: 1.7fr 1fr;
324
- gap: 56px;
325
- align-items: center;
258
+ /* ───────────────────────── auth dialog (set-a-reminder gate) ───────────────────────── */
259
+
260
+ .auth-dialog-backdrop {
261
+ position: fixed; inset: 0; z-index: 10000;
262
+ display: grid; place-items: center;
263
+ padding: 32px 16px;
264
+ background: rgba(8,8,10,0.7);
265
+ backdrop-filter: blur(6px);
266
+ -webkit-backdrop-filter: blur(6px);
326
267
  }
327
268
 
328
- .arch-name {
329
- font-family: var(--font-display);
330
- font-size: clamp(56px, 10vw, 124px);
331
- line-height: 0.95;
332
- letter-spacing: 0.08em;
333
- margin: 0 0 16px;
334
- text-transform: lowercase;
269
+ .auth-dialog {
270
+ position: relative;
271
+ width: 100%;
272
+ max-width: 420px;
273
+ padding: 28px 28px 24px;
274
+ border: 1px solid var(--line-2);
275
+ background: var(--bg-2);
276
+ font-family: var(--font-mono);
335
277
  color: var(--ink);
336
- text-wrap: balance;
337
- /* hard-offset stamp */
338
- text-shadow: 4px 4px 0 var(--accent-pink-shadow);
339
- }
340
- .arch-tagline {
341
- font-family: var(--font-mono); font-size: 16px;
342
- line-height: 1.5; color: var(--ink-2);
343
- max-width: 580px; margin: 0 0 28px;
344
- text-wrap: pretty;
345
- }
346
- .arch-desc {
347
- font-family: var(--font-mono); font-size: 13px;
348
- line-height: 1.65; color: var(--ink);
349
- max-width: 580px;
350
- margin: 0 0 28px;
351
- text-wrap: pretty;
352
278
  }
353
279
 
354
- .arch-secondary {
355
- display: inline-flex; align-items: center; gap: 10px;
356
- padding: 6px 12px;
357
- border: 1px dashed var(--line-2);
358
- font-family: var(--font-mono); font-size: 11px;
359
- letter-spacing: 0.15em; text-transform: uppercase;
360
- color: var(--ink-2);
361
- margin-bottom: 24px;
280
+ .auth-close {
281
+ position: absolute; top: 12px; right: 14px;
282
+ font-family: var(--font-mono); font-size: 20px;
283
+ line-height: 1;
284
+ color: var(--dim);
285
+ background: transparent; border: none; padding: 4px 8px;
286
+ cursor: pointer;
287
+ transition: color 120ms;
362
288
  }
363
- .arch-secondary .with { color: var(--dim); }
364
- .arch-secondary .name { color: var(--accent-pink); }
289
+ .auth-close:hover { color: var(--accent-pink); }
290
+ .auth-close:disabled { color: var(--line-2); cursor: not-allowed; }
365
291
 
366
- /* keyword strip — replaces the wordy description */
367
- .arch-keywords {
368
- display: flex;
369
- align-items: baseline;
370
- flex-wrap: wrap;
371
- gap: 16px;
372
- padding: 18px 0 4px;
373
- font-family: var(--font-display);
374
- font-size: clamp(20px, 2.4vw, 28px);
375
- letter-spacing: 0.11em;
376
- text-transform: lowercase;
377
- line-height: 1.1;
378
- }
379
- .arch-keywords .kw {
380
- color: var(--ink);
381
- }
382
- .arch-keywords .kw:nth-child(1) { color: var(--accent-green); }
383
- .arch-keywords .kw:nth-child(3) { color: var(--ink); }
384
- .arch-keywords .kw:nth-child(5) { color: var(--accent-pink); }
385
- .arch-keywords .kw-sep {
386
- color: var(--dim);
292
+ .auth-headline {
387
293
  font-family: var(--font-mono);
388
294
  font-size: 18px;
295
+ font-weight: 600;
389
296
  letter-spacing: 0;
297
+ line-height: 1.3;
298
+ text-transform: none;
299
+ color: var(--ink);
300
+ margin: 0 0 8px;
390
301
  }
391
302
 
392
- .signature-block {
393
- background: var(--bg);
394
- border: 1px solid var(--line);
395
- padding: 18px 20px;
396
- font-family: var(--font-mono); font-size: 13px;
397
- line-height: 1.75;
398
- white-space: pre;
399
- overflow-x: auto;
400
- max-width: 580px;
401
- position: relative;
402
- }
403
- .signature-block::before {
404
- content: ""; position: absolute; top: -1px; left: -1px;
405
- width: 8px; height: 8px;
406
- border-top: 1px solid var(--accent-pink);
407
- border-left: 1px solid var(--accent-pink);
408
- }
409
- .signature-block::after {
410
- content: ""; position: absolute; bottom: -1px; right: -1px;
411
- width: 8px; height: 8px;
412
- border-bottom: 1px solid var(--accent-pink);
413
- border-right: 1px solid var(--accent-pink);
414
- }
415
- .sig-line { color: var(--ink); display: block; }
416
- .sig-line .arrow { color: var(--accent-green); margin-right: 6px; }
417
- .sig-line .comment { color: var(--dim); }
418
- .sig-line .err { color: var(--accent-pink); }
419
-
420
- .arch-meta-grid {
421
- display: grid;
422
- grid-template-columns: 1fr 1fr;
423
- gap: 24px;
424
- margin-top: 28px;
425
- border-top: 1px dashed var(--line);
426
- padding-top: 22px;
427
- }
428
- .arch-meta-item .label {
429
- display: block;
430
- font-family: var(--font-mono); font-size: 10px;
431
- letter-spacing: 0.22em; text-transform: uppercase;
432
- color: var(--accent-green);
433
- margin-bottom: 8px;
434
- }
435
- .arch-meta-item .label.p { color: var(--accent-pink); }
436
- .arch-meta-item .body {
303
+ .auth-sub {
437
304
  font-family: var(--font-mono); font-size: 12px;
438
- color: var(--ink-2); line-height: 1.55;
305
+ line-height: 1.55; color: var(--ink-2);
306
+ margin: 0 0 18px;
439
307
  }
440
-
441
- .arch-closing {
442
- margin-top: 28px;
443
- font-family: var(--font-display);
444
- font-size: 22px; letter-spacing: 0.11em;
308
+ .auth-sub .auth-email {
445
309
  color: var(--accent-pink);
446
- text-transform: lowercase;
447
- border-top: 1px dashed var(--line);
448
- padding-top: 22px;
449
- }
450
-
451
- /* ───────────────────────── sigil — brutalist instrument plate ─────────────
452
- The audit hero's central image. Was a bare 16px-cell pixel grid that
453
- felt visually underweight next to the 124px Bitcount archetype name
454
- and underdesigned compared to the dashed-frame panels everywhere else.
455
-
456
- Treatment: an "instrument card" — register crosshairs at corners, header
457
- strip with index + 8×8 coordinate, the grid on a dashed inner frame
458
- with 20px cells, footer strip with the archetype slug, and a stacked
459
- pink + black hard-offset shadow for depth.
460
-
461
- The `data-bare` variant (used by the ShowOff CTA via `hideLabel`)
462
- skips the plate and renders a bare grid so the showoff card can scale
463
- the sigil down independently and the html2canvas poster export doesn't
464
- need to capture the new plate chrome. */
465
-
466
- .sigil-wrap {
467
- display: flex; flex-direction: column; align-items: center;
468
- justify-self: center;
469
310
  }
470
-
471
- .sigil-plate {
472
- position: relative;
473
- padding: 18px 22px;
474
- background:
475
- /* faint pink+green gridlines — same recipe as `.archetype-frame` so the
476
- sigil reads as a smaller specimen of the same instrument family */
477
- repeating-linear-gradient(0deg, rgba(228,88,125,0.04) 0 1px, transparent 1px 12px),
478
- repeating-linear-gradient(90deg, rgba(102,209,181,0.04) 0 1px, transparent 1px 12px),
479
- var(--bg);
480
- border: 1px solid var(--line-2);
481
- /* stacked hard-offsets: pink at the front, black behind for depth */
482
- box-shadow:
483
- 8px 8px 0 0 var(--accent-pink-shadow),
484
- 16px 16px 0 0 rgba(0, 0, 0, 0.55);
311
+ .auth-sub .auth-ok {
312
+ color: var(--accent-green);
313
+ margin-right: 6px;
485
314
  }
486
315
 
487
- /* register crosshair marks at the four corners — CSS-only "+" rendered
488
- from two 1px bars so they stay pixel-crisp at any zoom */
489
- .sigil-mark {
490
- position: absolute;
491
- width: 10px; height: 10px;
492
- color: var(--accent-pink);
493
- opacity: 0.75;
494
- pointer-events: none;
495
- }
496
- .sigil-mark::before,
497
- .sigil-mark::after {
498
- content: "";
499
- position: absolute;
500
- background: currentColor;
501
- }
502
- .sigil-mark::before { top: 50%; left: 0; right: 0; height: 1px; }
503
- .sigil-mark::after { left: 50%; top: 0; bottom: 0; width: 1px; }
504
- .sigil-mark.tl { top: 6px; left: 6px; }
505
- .sigil-mark.tr { top: 6px; right: 6px; }
506
- .sigil-mark.bl { bottom: 6px; left: 6px; }
507
- .sigil-mark.br { bottom: 6px; right: 6px; }
316
+ .auth-form { display: flex; flex-direction: column; gap: 10px; }
508
317
 
509
- /* the header (top) and footer (bottom) strips of the plate */
510
- .sigil-strip {
511
- display: flex; justify-content: space-between; align-items: baseline;
318
+ .auth-field-label {
512
319
  font-family: var(--font-mono); font-size: 10px;
513
320
  letter-spacing: 0.22em; text-transform: uppercase;
514
- color: var(--dim);
515
- }
516
- .sigil-strip--top {
517
- padding-bottom: 10px;
518
- margin-bottom: 14px;
519
- border-bottom: 1px dashed var(--line);
520
- }
521
- .sigil-strip--bot {
522
- padding-top: 10px;
523
- margin-top: 14px;
524
- border-top: 1px dashed var(--line);
321
+ color: var(--accent-green);
525
322
  }
526
- .sigil-ix { color: var(--accent-pink); }
527
- .sigil-coord { color: var(--dim); }
528
- .sigil-strip-key { color: var(--dim); }
529
- .sigil-strip-val { color: var(--accent-green); }
530
323
 
531
- /* the actual 8×8 grid — bumped from 16px → 20px cells so the sigil
532
- carries enough visual weight to sit next to the archetype name */
533
- .sigil {
534
- display: grid;
535
- grid-template-columns: repeat(8, 20px);
536
- grid-template-rows: repeat(8, 20px);
537
- gap: 2px;
538
- padding: 12px;
539
- background: var(--bg-2);
540
- border: 1px dashed var(--line);
541
- margin: 0 auto;
542
- }
543
- /* When the sigil is rendered bare (ShowOff path), restore the original
544
- single-shadow look so the showoff card stays compositionally what it
545
- was before the plate landed. */
546
- .sigil-wrap[data-bare="true"] .sigil {
324
+ .auth-input {
325
+ width: 100%;
326
+ padding: 11px 14px;
547
327
  background: var(--bg);
548
328
  border: 1px solid var(--line-2);
549
- box-shadow: 6px 6px 0 0 var(--accent-pink-shadow);
550
- }
551
-
552
- .sigil .px {
553
- background: transparent;
554
- /* diagonal fade-in: cells light up along an (x+y) wave starting from
555
- the top-left when the hero first paints. Total animation ≈ 600ms. */
556
- opacity: 0;
557
- animation: sigil-cell-in 280ms cubic-bezier(0.22, 1, 0.36, 1) forwards;
558
- animation-delay: calc((var(--cx, 0) + var(--cy, 0)) * 22ms);
559
- }
560
- .sigil .px.on { background: var(--ink); }
561
- .sigil .px.p {
562
- background: var(--accent-pink);
563
- /* subtle inner glow on accent cells so they pop without breaking pixel-craft */
564
- box-shadow: 0 0 4px rgba(228, 88, 125, 0.45);
329
+ color: var(--ink);
330
+ font-family: var(--font-mono); font-size: 14px;
331
+ letter-spacing: 0.03em;
332
+ outline: none;
333
+ transition: border-color 120ms, box-shadow 120ms;
565
334
  }
566
- .sigil .px.g {
567
- background: var(--accent-green);
568
- box-shadow: 0 0 4px rgba(102, 209, 181, 0.35);
335
+ .auth-input:focus {
336
+ border-color: var(--accent-pink);
337
+ box-shadow: 0 0 0 1px var(--accent-pink-soft);
569
338
  }
570
- .sigil .px.d { background: var(--dim); }
571
-
572
- @keyframes sigil-cell-in {
573
- from { opacity: 0; transform: scale(0.4); }
574
- to { opacity: 1; transform: scale(1); }
339
+ .auth-input:disabled {
340
+ opacity: 0.55; cursor: not-allowed;
575
341
  }
576
-
577
- @media (prefers-reduced-motion: reduce) {
578
- .sigil .px {
579
- animation: none;
580
- opacity: 1;
581
- transform: none;
582
- }
342
+ .auth-input-code {
343
+ letter-spacing: 0.5em;
344
+ text-align: center;
345
+ font-size: 18px;
346
+ font-variant-numeric: tabular-nums;
583
347
  }
348
+ .auth-input::placeholder { color: var(--dim); }
584
349
 
585
- /* ───────────── poster capture mode (applied during html2canvas) ─────────────
586
- The live layout uses clamp()/vw font sizes, soft grid columns, and a
587
- stamp text-shadow. html2canvas does NOT support clamp() or text-shadow
588
- reliably it picks a fallback that misaligns metrics and the giant
589
- archetype name ends up overlapping the tagline + sigil column.
590
-
591
- `.capturing` is added by show-off-cta.tsx right before capture and
592
- removed in the finally block. It locks every viewport-relative size to
593
- an absolute value tuned for the ~1100px capture width, fixes the grid
594
- columns, and clears the stamp shadow + box shadow that html2canvas
595
- would otherwise crop. */
596
- .archetype-frame.capturing {
597
- min-width: 1080px;
598
- max-width: 1180px;
599
- padding: 52px 52px 44px;
600
- box-shadow: none;
601
- }
602
- .archetype-frame.capturing .arch-name {
603
- font-size: 88px;
604
- line-height: 1;
605
- margin: 0 0 24px;
606
- text-shadow: none;
607
- letter-spacing: 0.06em;
608
- }
609
- .archetype-frame.capturing .arch-tagline {
610
- font-size: 16px;
611
- max-width: 560px;
612
- margin: 0 0 32px;
613
- }
614
- .archetype-frame.capturing .arch-secondary {
615
- margin-bottom: 32px;
616
- }
617
- .archetype-frame.capturing .arch-keywords {
618
- font-size: 24px;
619
- letter-spacing: 0.09em;
620
- padding: 16px 0 12px;
621
- gap: 14px;
622
- max-width: 560px;
623
- }
624
- .archetype-frame.capturing .arch-body {
625
- grid-template-columns: minmax(0, 1.6fr) minmax(220px, 1fr);
626
- gap: 56px;
627
- align-items: start;
628
- }
629
- .archetype-frame.capturing .arch-meta-grid {
630
- margin-top: 32px;
631
- padding-top: 26px;
632
- gap: 28px;
633
- }
634
- .archetype-frame.capturing .arch-closing {
635
- font-size: 22px;
636
- margin-top: 32px;
637
- padding-top: 26px;
638
- }
639
- .archetype-frame.capturing .sigil-wrap {
640
- position: static;
641
- align-self: center;
642
- justify-self: center;
643
- padding-top: 0;
644
- }
645
- /* html2canvas renders stacked box-shadows unreliably and won't run our
646
- sigil-cell-in animation. Collapse to a single hard offset on the plate
647
- and force every cell to its final state for the capture. */
648
- .archetype-frame.capturing .sigil-plate {
649
- box-shadow: 8px 8px 0 0 var(--accent-pink-shadow);
650
- }
651
- .archetype-frame.capturing .sigil { box-shadow: none; }
652
- .archetype-frame.capturing .sigil .px {
653
- animation: none;
654
- opacity: 1;
655
- transform: none;
350
+ .auth-error {
351
+ font-family: var(--font-mono); font-size: 12px;
352
+ color: var(--accent-pink);
353
+ padding: 8px 12px;
354
+ background: var(--accent-pink-bg);
355
+ border: 1px solid var(--accent-pink);
356
+ border-left-width: 3px;
357
+ letter-spacing: 0.02em;
358
+ margin-top: 4px;
656
359
  }
657
360
 
658
- /* ──────────────── identity share buttons (chunky CTAs) ────────────────
659
- Three branded buttons that sit below the archetype card. Each leads
660
- with a platform mark tile (𝕏 / in / ↓), then a small "share on" / "save"
661
- eyebrow above the platform label, then a trailing arrow. The buttons
662
- read as armed at rest via a 2px pink right-edge stroke; on hover the
663
- stroke fills the full border and a hard-offset pink shadow appears.
664
- On press they translate (2px, 2px) and the shadow collapses — matches
665
- the .btn-press motion language used elsewhere.
666
-
667
- The shared `.share-btn` class is also used by the floating ShareDock so
668
- the visual rhythm carries between surfaces. */
669
-
670
- .identity-share-grid {
671
- display: grid;
672
- grid-template-columns: repeat(3, 1fr);
673
- gap: 12px;
674
- margin-top: 22px;
675
- padding-top: 18px;
676
- border-top: 1px dashed var(--line);
677
- }
678
- @media (max-width: 720px) {
679
- .identity-share-grid { grid-template-columns: 1fr; }
361
+ .auth-actions {
362
+ display: flex; gap: 10px; flex-wrap: wrap;
363
+ margin-top: 14px;
680
364
  }
681
365
 
682
- .share-btn {
683
- position: relative;
684
- display: grid;
685
- grid-template-columns: 44px 1fr auto;
686
- align-items: center;
687
- gap: 14px;
688
- padding: 12px 18px;
689
- background: var(--bg);
366
+ .auth-btn {
367
+ display: inline-flex; align-items: center; gap: 8px;
368
+ padding: 10px 16px;
369
+ font-family: var(--font-mono); font-size: 12px;
370
+ letter-spacing: 0.06em;
371
+ background: transparent;
690
372
  border: 1px solid var(--line-2);
691
- /* pink right-edge stroke at rest — reads as armed */
692
- border-right: 2px solid var(--accent-pink-soft);
693
373
  color: var(--ink);
694
- font-family: var(--font-mono);
695
- text-align: left;
696
374
  cursor: pointer;
697
- transition:
698
- border-color 160ms cubic-bezier(0.22, 1, 0.36, 1),
699
- background-color 160ms cubic-bezier(0.22, 1, 0.36, 1),
700
- box-shadow 160ms cubic-bezier(0.22, 1, 0.36, 1),
701
- transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
375
+ transition: all 120ms ease;
376
+ }
377
+ .auth-btn:hover:not(:disabled) {
378
+ border-color: var(--ink); background: rgba(255,255,255,0.04);
702
379
  }
703
- .share-btn:hover {
380
+ .auth-btn:disabled { opacity: 0.45; cursor: not-allowed; }
381
+ .auth-btn.primary {
704
382
  border-color: var(--accent-pink);
383
+ color: var(--accent-pink);
705
384
  background: var(--accent-pink-bg);
706
- box-shadow: 4px 4px 0 0 var(--accent-pink-shadow);
707
- transform: translate(-1px, -1px);
708
- }
709
- .share-btn:active {
710
- box-shadow: 0 0 0 0 var(--accent-pink-shadow);
711
- transform: translate(2px, 2px);
712
385
  }
713
- .share-btn:disabled {
714
- opacity: 0.55;
715
- cursor: not-allowed;
716
- border-right-color: var(--line);
386
+ .auth-btn.primary:hover:not(:disabled) {
387
+ background: var(--accent-pink); color: var(--bg);
717
388
  }
718
- .share-btn:disabled:hover {
719
- background: var(--bg);
720
- border-color: var(--line-2);
721
- border-right-color: var(--line);
722
- box-shadow: none;
723
- transform: none;
389
+
390
+ .auth-back {
391
+ align-self: flex-start;
392
+ margin-top: 4px;
393
+ background: transparent; border: none; padding: 6px 0;
394
+ font-family: var(--font-mono); font-size: 11px;
395
+ letter-spacing: 0.1em; color: var(--dim);
396
+ cursor: pointer;
397
+ transition: color 120ms;
724
398
  }
399
+ .auth-back:hover:not(:disabled) { color: var(--ink-2); }
400
+ .auth-back:disabled { opacity: 0.45; cursor: not-allowed; }
725
401
 
726
- .share-btn-mark {
727
- display: grid; place-items: center;
728
- width: 44px; height: 44px;
729
- font-family: var(--font-mono);
730
- font-size: 22px;
731
- font-weight: 700;
732
- line-height: 1;
733
- border: 1px solid var(--line-2);
734
- /* corner-crosshair adornment — matches the sigil-plate's register marks */
735
- background:
736
- linear-gradient(to right, var(--accent-pink) 0 6px, transparent 6px) top left/100% 1px no-repeat,
737
- linear-gradient(to bottom, var(--accent-pink) 0 6px, transparent 6px) top left/1px 100% no-repeat,
738
- linear-gradient(to left, var(--accent-pink) 0 6px, transparent 6px) bottom right/100% 1px no-repeat,
739
- linear-gradient(to top, var(--accent-pink) 0 6px, transparent 6px) bottom right/1px 100% no-repeat,
740
- var(--bg-2);
741
- color: var(--ink);
742
- }
743
- .share-btn-mark--x { color: #ffffff; background-color: #000000; }
744
- .share-btn-mark--li {
745
- color: #ffffff;
746
- background-color: #0a66c2;
747
- /* override the pink-crosshair gradients so the LinkedIn blue tile reads cleanly */
748
- background-image: none;
749
- }
750
- .share-btn-mark--dl { color: var(--accent-pink); }
751
-
752
- .share-btn-body {
753
- display: flex; flex-direction: column;
754
- gap: 2px; min-width: 0;
755
- }
756
- .share-btn-eyebrow {
757
- font-size: 10px;
758
- letter-spacing: 0.22em;
759
- text-transform: uppercase;
760
- color: var(--accent-green);
761
- }
762
- .share-btn-label {
763
- font-size: 13px;
764
- letter-spacing: 0.05em;
765
- color: var(--ink);
766
- font-weight: 500;
767
- /* avoid spilling on long localized labels */
768
- overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
769
- }
770
- .share-btn-arrow {
771
- font-family: var(--font-mono);
772
- font-size: 18px;
773
- color: var(--accent-pink);
774
- opacity: 0.7;
775
- transition: opacity 160ms cubic-bezier(0.22, 1, 0.36, 1), transform 160ms cubic-bezier(0.22, 1, 0.36, 1);
776
- }
777
- .share-btn:hover .share-btn-arrow { opacity: 1; transform: translateX(2px); }
778
-
779
- @media (prefers-reduced-motion: reduce) {
780
- .share-btn, .share-btn-arrow { transition: none; }
781
- .share-btn:hover { transform: none; }
782
- }
783
-
784
- /* hide during html2canvas capture so the buttons don't render into the poster */
785
- .archetype-frame.capturing .identity-share-grid { display: none; }
786
-
787
- /* ───────────────────────── 02 STRENGTHS ───────────────────────── */
788
-
789
- .strengths-grid {
790
- display: grid; gap: 0;
791
- border: 1px solid var(--line-2);
792
- background: var(--bg-2);
793
- }
794
- .strength-row {
795
- display: grid;
796
- grid-template-columns: 56px 1fr auto;
797
- align-items: start;
798
- gap: 16px;
799
- padding: 22px 24px;
800
- border-bottom: 1px solid var(--line);
801
- transition: background 120ms;
802
- }
803
- .strength-row:last-child { border-bottom: none; }
804
- .strength-row:hover { background: rgba(102, 209, 181, 0.03); }
805
- .strength-check {
806
- width: 32px; height: 32px;
807
- border: 1px solid var(--accent-green);
808
- background: var(--accent-green-bg);
809
- color: var(--accent-green);
810
- display: grid; place-items: center;
811
- font-family: var(--font-mono); font-weight: 600;
812
- font-size: 14px;
813
- }
814
- .strength-body {
815
- display: flex; flex-direction: column; gap: 6px;
816
- }
817
- .strength-headline {
818
- font-family: var(--font-mono); font-size: 14px;
819
- color: var(--ink); letter-spacing: 0.01em;
820
- font-weight: 500;
821
- }
822
- .strength-detail {
823
- font-family: var(--font-mono); font-size: 12px;
824
- color: var(--ink-2); letter-spacing: 0.01em;
825
- line-height: 1.55;
826
- }
827
- .strength-metric {
828
- font-family: var(--font-display);
829
- font-size: 26px; letter-spacing: 0.06em;
830
- text-transform: lowercase;
831
- color: var(--accent-green);
832
- text-align: right;
833
- line-height: 1;
834
- white-space: nowrap;
835
- }
836
- .strength-metric .unit {
837
- font-family: var(--font-mono); font-size: 10px;
838
- letter-spacing: 0.18em;
839
- text-transform: uppercase; color: var(--dim);
840
- display: block; margin-top: 4px;
841
- }
842
- .strengths-footer {
843
- font-family: var(--font-mono); font-size: 12px;
844
- color: var(--ink-2); letter-spacing: 0.02em;
845
- margin-top: 18px;
846
- padding-left: 4px;
847
- }
848
-
849
- /* ───────────────────────── 03 SCORE CARD ───────────────────────── */
850
-
851
- .score-share-card {
852
- padding: 22px 24px 20px;
853
- background:
854
- repeating-linear-gradient(0deg, rgba(228,88,125,0.03) 0 1px, transparent 1px 16px),
855
- repeating-linear-gradient(90deg, rgba(228,88,125,0.03) 0 1px, transparent 1px 16px),
856
- var(--bg-2);
857
- }
858
-
859
- .score-card-header {
860
- font-family: var(--font-mono); font-size: 10px;
861
- letter-spacing: 0.18em; text-transform: uppercase;
862
- color: var(--ink-2);
863
- margin-bottom: 16px;
864
- }
865
-
866
- .ss-label {
867
- font-family: var(--font-mono); font-size: 10px;
868
- letter-spacing: 0.22em; text-transform: uppercase;
869
- color: var(--accent-green);
870
- margin-bottom: 14px;
871
- }
872
-
873
- /* — left column ------------------------------------------------------ */
874
- .ss-score-row {
875
- display: flex; align-items: baseline; gap: 10px;
876
- margin: 0 0 10px;
877
- }
878
- .ss-score {
879
- font-family: var(--font-display);
880
- font-size: clamp(52px, 7vw, 76px);
881
- line-height: 0.9;
882
- letter-spacing: 0.04em;
883
- color: var(--accent-pink);
884
- text-shadow: 4px 4px 0 var(--accent-pink-shadow);
885
- }
886
- .ss-score.g-S, .ss-score.g-A { color: var(--accent-green); text-shadow: 4px 4px 0 var(--accent-green-shadow); }
887
- .ss-score.g-B { color: #d3e1a8; text-shadow: 4px 4px 0 #6f7e45; }
888
- .ss-score-of {
889
- font-family: var(--font-mono); font-size: 18px;
890
- color: var(--dim); letter-spacing: 0.08em;
891
- }
892
-
893
- .ss-tier-row {
894
- display: flex; align-items: center; gap: 12px;
895
- margin-bottom: 16px;
896
- }
897
- .ss-tier-badge {
898
- font-family: var(--font-mono); font-size: 11px;
899
- letter-spacing: 0.18em; text-transform: uppercase;
900
- padding: 5px 10px;
901
- border: 1px solid var(--accent-pink);
902
- background: var(--accent-pink-bg);
903
- color: var(--accent-pink);
904
- }
905
- .ss-tier-badge.g-S, .ss-tier-badge.g-A {
906
- border-color: var(--accent-green);
907
- background: var(--accent-green-bg);
908
- color: var(--accent-green);
909
- }
910
- .ss-tier-badge.g-B {
911
- border-color: #d3e1a8;
912
- background: rgba(211, 225, 168, 0.10);
913
- color: #d3e1a8;
914
- }
915
- .ss-arch {
916
- font-family: var(--font-mono); font-size: 12px;
917
- color: var(--ink-2); letter-spacing: 0.06em;
918
- }
919
-
920
- .ss-progress-label {
921
- display: flex; justify-content: space-between;
922
- font-family: var(--font-mono); font-size: 11px;
923
- letter-spacing: 0.06em;
924
- margin-bottom: 6px;
925
- }
926
- .ss-progress-track {
927
- position: relative;
928
- height: 10px; background: var(--bg);
929
- border: 1px solid var(--line);
930
- margin-bottom: 6px;
931
- overflow: visible;
932
- }
933
- .ss-progress-fill {
934
- height: 100%;
935
- background: linear-gradient(90deg, var(--accent-pink) 0%, #f472b6 60%, #a78bfa 100%);
936
- }
937
- .ss-progress-tick {
938
- position: absolute;
939
- top: -4px; bottom: -4px;
940
- width: 1px;
941
- background: var(--line-2);
942
- pointer-events: none;
943
- }
944
- .ss-grade-stops {
945
- position: relative;
946
- height: 16px;
947
- margin-bottom: 16px;
948
- }
949
- .ss-grade-stop {
950
- position: absolute;
951
- transform: translateX(-50%);
952
- font-family: var(--font-mono); font-size: 9px;
953
- letter-spacing: 0.12em; text-transform: uppercase;
954
- color: var(--dim);
955
- top: 0;
956
- }
957
- .ss-grade-stop.active {
958
- color: var(--accent-pink);
959
- font-weight: 700;
960
- }
961
-
962
- .ss-stats {
963
- display: grid;
964
- grid-template-columns: repeat(3, 1fr);
965
- gap: 8px;
966
- margin-bottom: 16px;
967
- }
968
- .ss-stat {
969
- border: 1px solid var(--line-2);
970
- background: var(--bg);
971
- padding: 10px 12px;
972
- text-align: left;
973
- }
974
- .ss-stat-n {
975
- font-family: var(--font-display);
976
- font-size: 24px; line-height: 1;
977
- letter-spacing: 0.04em;
978
- margin-bottom: 6px;
979
- }
980
- .ss-stat-l {
981
- font-family: var(--font-mono); font-size: 9px;
982
- letter-spacing: 0.2em; text-transform: uppercase;
983
- color: var(--dim);
984
- line-height: 1.4;
985
- }
986
-
987
- .ss-policy-label {
988
- font-family: var(--font-mono); font-size: 10px;
989
- letter-spacing: 0.22em; text-transform: uppercase;
990
- color: var(--ink-2);
991
- margin-top: 14px;
992
- padding-top: 14px;
993
- border-top: 1px dashed var(--line);
994
- margin-bottom: 10px;
995
- }
996
- .ss-policy-chips {
997
- display: flex; flex-wrap: wrap; gap: 6px;
998
- }
999
- .ss-chip {
1000
- display: inline-flex; align-items: center; gap: 6px;
1001
- padding: 4px 10px;
1002
- border-radius: 0;
1003
- border: 1px solid var(--line-2);
1004
- background: var(--bg);
1005
- font-family: var(--font-mono); font-size: 11px;
1006
- color: var(--ink-2);
1007
- }
1008
- .ss-chip .dot {
1009
- width: 5px; height: 5px;
1010
- border-radius: 0;
1011
- background: var(--dim);
1012
- }
1013
- .ss-chip.missing {
1014
- border-color: rgba(228, 88, 125, 0.6);
1015
- color: var(--accent-pink);
1016
- background: rgba(228, 88, 125, 0.06);
1017
- }
1018
- .ss-chip.missing .dot { background: var(--accent-pink); }
1019
- .ss-chip.enabled {
1020
- border-color: rgba(102, 209, 181, 0.5);
1021
- color: var(--accent-green);
1022
- background: rgba(102, 209, 181, 0.05);
1023
- }
1024
- .ss-chip.enabled .dot { background: var(--accent-green); }
1025
-
1026
- /* — right column ----------------------------------------------------- */
1027
- .ss-templates {
1028
- display: flex; flex-direction: column; gap: 10px;
1029
- margin-bottom: 16px;
1030
- }
1031
- .ss-template {
1032
- border: 1px solid var(--line-2);
1033
- background: var(--bg);
1034
- padding: 14px 16px;
1035
- }
1036
- .ss-template-head {
1037
- display: inline-flex; align-items: center; gap: 8px;
1038
- font-family: var(--font-mono); font-size: 10px;
1039
- letter-spacing: 0.2em; text-transform: uppercase;
1040
- color: var(--ink-2);
1041
- margin-bottom: 8px;
1042
- }
1043
- .ss-template-head .dot {
1044
- width: 6px; height: 6px; border-radius: 50%;
1045
- background: var(--accent-pink);
1046
- }
1047
- .ss-template-body {
1048
- font-family: var(--font-mono); font-size: 12.5px;
1049
- line-height: 1.55; color: var(--ink-2);
1050
- margin: 0;
1051
- }
1052
-
1053
- .ss-actions {
1054
- display: flex; flex-direction: column; gap: 8px;
1055
- }
1056
- .ss-action-btn {
1057
- display: grid;
1058
- grid-template-columns: 28px 1fr;
1059
- align-items: center;
1060
- gap: 12px;
1061
- padding: 10px 14px;
1062
- border: 1px solid var(--line-2);
1063
- background: transparent;
1064
- color: var(--ink);
1065
- text-align: left;
1066
- font-family: var(--font-mono); font-size: 12px;
1067
- cursor: pointer;
1068
- transition: all 120ms ease;
1069
- text-decoration: none;
1070
- }
1071
- .ss-action-btn:hover {
1072
- border-color: var(--accent-pink);
1073
- background: var(--accent-pink-bg);
1074
- color: var(--accent-pink);
1075
- }
1076
- .ss-action-btn:disabled {
1077
- opacity: 0.55; cursor: wait;
1078
- }
1079
- .ss-action-glyph {
1080
- display: grid; place-items: center;
1081
- width: 24px; height: 24px;
1082
- border: 1px solid var(--ink-2);
1083
- font-family: var(--font-mono); font-size: 11px;
1084
- text-transform: uppercase;
1085
- color: var(--ink-2);
1086
- }
1087
- .ss-action-btn:hover .ss-action-glyph {
1088
- border-color: var(--accent-pink);
1089
- color: var(--accent-pink);
1090
- }
1091
- .ss-action-text {
1092
- display: flex; flex-direction: column;
1093
- }
1094
- .ss-action-title {
1095
- font-family: var(--font-mono); font-size: 13px;
1096
- letter-spacing: 0.04em;
1097
- color: var(--ink);
1098
- }
1099
- .ss-action-btn:hover .ss-action-title { color: var(--accent-pink); }
1100
- .ss-action-sub {
1101
- font-family: var(--font-mono); font-size: 10px;
1102
- letter-spacing: 0.05em;
1103
- color: var(--dim);
1104
- margin-top: 2px;
1105
- }
1106
-
1107
- .ss-foot {
1108
- display: flex; justify-content: space-between; gap: 16px;
1109
- flex-wrap: wrap;
1110
- padding-top: 18px; margin-top: 26px;
1111
- border-top: 1px dashed var(--line);
1112
- font-family: var(--font-mono); font-size: 11px;
1113
- color: var(--ink-2);
1114
- }
1115
- .ss-foot-link {
1116
- color: var(--accent-green);
1117
- text-decoration: none;
1118
- }
1119
- .ss-foot-link:hover { text-decoration: underline; text-underline-offset: 3px; }
1120
-
1121
- @media (max-width: 880px) {
1122
- .score-share-card { padding: 16px 16px 16px; }
1123
- }
1124
-
1125
-
1126
- /* ───────────────────────── 04 FINDINGS ───────────────────────── */
1127
-
1128
- .findings-list { display: flex; flex-direction: column; gap: 20px; }
1129
- .finding {
1130
- border: 1px solid var(--line-2);
1131
- background: var(--bg-2);
1132
- position: relative;
1133
- }
1134
- .finding::before {
1135
- content: ""; position: absolute; top: -1px; left: -1px;
1136
- width: 8px; height: 8px;
1137
- border-top: 1px solid var(--accent-pink);
1138
- border-left: 1px solid var(--accent-pink);
1139
- }
1140
- .finding-head {
1141
- display: grid;
1142
- grid-template-columns: auto 1fr auto;
1143
- gap: 18px; align-items: center;
1144
- padding: 20px 24px;
1145
- border-bottom: 1px solid var(--line);
1146
- }
1147
- .finding-num {
1148
- font-family: var(--font-mono); font-size: 13px;
1149
- color: var(--accent-pink); letter-spacing: 0.12em;
1150
- font-weight: 600;
1151
- }
1152
- .finding-title {
1153
- font-family: var(--font-display); font-size: 22px;
1154
- letter-spacing: 0.11em; color: var(--ink);
1155
- text-transform: lowercase;
1156
- }
1157
- .finding-count {
1158
- font-family: var(--font-display); font-size: 36px;
1159
- letter-spacing: 0.04em; color: var(--accent-pink);
1160
- text-transform: lowercase; line-height: 1;
1161
- display: flex; align-items: baseline; gap: 6px;
1162
- }
1163
- .finding-count .label {
1164
- font-family: var(--font-mono); font-size: 10px;
1165
- letter-spacing: 0.22em; text-transform: uppercase;
1166
- color: var(--dim);
1167
- }
1168
- .finding-meta {
1169
- display: flex; gap: 16px; flex-wrap: wrap;
1170
- padding: 12px 24px;
1171
- font-family: var(--font-mono); font-size: 11px;
1172
- letter-spacing: 0.05em;
1173
- color: var(--ink-2);
1174
- border-bottom: 1px solid var(--line);
1175
- background: rgba(0,0,0,0.15);
1176
- }
1177
- .finding-meta .policy { color: var(--accent-green); }
1178
- .finding-meta .sep { color: var(--dim); }
1179
- .finding-body {
1180
- display: grid;
1181
- grid-template-columns: 1fr 1fr;
1182
- gap: 0;
1183
- }
1184
- .finding-block {
1185
- padding: 22px 24px;
1186
- border-right: 1px solid var(--line);
1187
- border-bottom: 1px solid var(--line);
1188
- display: flex; flex-direction: column; gap: 10px;
1189
- }
1190
- .finding-block:nth-child(2n) { border-right: none; }
1191
- .finding-block:nth-last-child(-n+2) { border-bottom: none; }
1192
- .fb-label {
1193
- font-family: var(--font-mono); font-size: 10px;
1194
- letter-spacing: 0.22em; text-transform: uppercase;
1195
- color: var(--accent-green);
1196
- }
1197
- .fb-label.cost { color: var(--amber); }
1198
- .fb-label.fix { color: var(--accent-pink); }
1199
- .fb-body {
1200
- font-family: var(--font-mono); font-size: 13px;
1201
- line-height: 1.65; color: var(--ink-2);
1202
- }
1203
- .fb-body .pk { color: var(--accent-pink); }
1204
- .fb-body .g { color: var(--accent-green); }
1205
- .fb-body .a { color: var(--amber); }
1206
- .fb-body code {
1207
- background: var(--bg); border: 1px solid var(--line);
1208
- padding: 1px 6px; color: var(--accent-green); font-size: 12px;
1209
- }
1210
-
1211
- .fb-evidence {
1212
- font-family: var(--font-mono); font-size: 12px;
1213
- background: var(--bg); border: 1px solid var(--line);
1214
- padding: 12px 14px;
1215
- white-space: pre; overflow-x: auto;
1216
- color: var(--ink); line-height: 1.65;
1217
- }
1218
- .fb-evidence .arrow { color: var(--accent-green); }
1219
- .fb-evidence .err { color: var(--accent-pink); }
1220
- .fb-evidence .comment { color: var(--dim); }
1221
-
1222
- .fb-fix {
1223
- background: var(--bg); border: 1px solid var(--line);
1224
- padding: 14px;
1225
- font-family: var(--font-mono); font-size: 12px;
1226
- }
1227
- .fb-fix .slug {
1228
- display: inline-block; padding: 2px 8px;
1229
- background: var(--accent-pink-bg); color: var(--accent-pink);
1230
- border: 1px solid var(--accent-pink);
1231
- font-size: 10px; letter-spacing: 0.15em; text-transform: uppercase;
1232
- margin-bottom: 10px;
1233
- }
1234
- .fb-fix .cmd {
1235
- display: block; margin-top: 12px;
1236
- color: var(--accent-green); font-size: 12px;
1237
- border-top: 1px dashed var(--line); padding-top: 10px;
1238
- }
1239
- .fb-fix .cmd .prompt { color: var(--dim); margin-right: 6px; }
1240
-
1241
- /* ───────────────────────── show-off CTA (after IDENTITY) ───────────────────────── */
1242
-
1243
- .showoff {
1244
- padding: 0 0 32px;
1245
- border-bottom: 1px solid var(--line);
1246
- margin-bottom: 0;
1247
- /* Clear the sticky .app-header (≈52px tall) when scroll-anchored. */
1248
- scroll-margin-top: 80px;
1249
- }
1250
- .showoff-cta {
1251
- display: grid;
1252
- grid-template-columns: auto 1fr auto;
1253
- align-items: center;
1254
- gap: 32px;
1255
- padding: 28px 32px;
1256
- border: 1px solid var(--line-2);
1257
- background:
1258
- repeating-linear-gradient(0deg, rgba(228,88,125,0.025) 0 1px, transparent 1px 16px),
1259
- repeating-linear-gradient(90deg, rgba(228,88,125,0.025) 0 1px, transparent 1px 16px),
1260
- var(--bg-2);
1261
- color: var(--ink);
1262
- text-decoration: none;
1263
- position: relative;
1264
- transition: border-color 120ms ease, background 120ms ease;
1265
- }
1266
- .showoff-cta:hover {
1267
- border-color: var(--ink-2);
1268
- background:
1269
- repeating-linear-gradient(0deg, rgba(228,88,125,0.04) 0 1px, transparent 1px 16px),
1270
- repeating-linear-gradient(90deg, rgba(228,88,125,0.04) 0 1px, transparent 1px 16px),
1271
- var(--bg-3);
1272
- }
1273
- .showoff-cta::before {
1274
- content: ""; position: absolute; top: -1px; left: -1px;
1275
- width: 10px; height: 10px;
1276
- border-top: 1px solid var(--accent-pink);
1277
- border-left: 1px solid var(--accent-pink);
1278
- }
1279
- .showoff-cta::after {
1280
- content: ""; position: absolute; bottom: -1px; right: -1px;
1281
- width: 10px; height: 10px;
1282
- border-bottom: 1px solid var(--accent-pink);
1283
- border-right: 1px solid var(--accent-pink);
1284
- }
1285
- .showoff-glyph {
1286
- display: block;
1287
- transform: scale(0.55);
1288
- transform-origin: center;
1289
- margin: -40px -28px;
1290
- /* shrink the embedded sigil without rebuilding it */
1291
- }
1292
- .showoff-glyph .sigil-wrap[data-bare="true"] .sigil {
1293
- box-shadow: 4px 4px 0 0 var(--accent-pink-shadow);
1294
- }
1295
- /* legacy: pre-plate sigil rendered a .sigil-label sibling. The new plate
1296
- renders strip rows inside the plate instead, but keep this null-rule so
1297
- any cached HTML between deploys doesn't surface a stray label. */
1298
- .showoff-glyph .sigil-label { display: none; }
1299
- .showoff-copy {
1300
- display: flex;
1301
- flex-direction: column;
1302
- gap: 6px;
1303
- min-width: 0;
1304
- }
1305
- .showoff-label {
1306
- font-family: var(--font-mono);
1307
- font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
1308
- color: var(--accent-green);
1309
- }
1310
- .showoff-headline {
1311
- font-family: var(--font-display);
1312
- font-size: clamp(28px, 3.4vw, 40px);
1313
- letter-spacing: 0.11em;
1314
- text-transform: lowercase;
1315
- color: var(--ink);
1316
- line-height: 1.05;
1317
- text-shadow: 3px 3px 0 var(--accent-pink-shadow);
1318
- }
1319
- .showoff-sub {
1320
- font-family: var(--font-mono);
1321
- font-size: 13px; line-height: 1.55;
1322
- color: var(--ink-2);
1323
- max-width: 520px;
1324
- }
1325
- .showoff-action {
1326
- display: inline-flex;
1327
- flex-direction: column;
1328
- align-items: center;
1329
- gap: 8px;
1330
- padding: 16px 24px;
1331
- border: 1px solid var(--accent-pink);
1332
- background: var(--accent-pink-bg);
1333
- color: var(--accent-pink);
1334
- font-family: var(--font-mono);
1335
- font-size: 11px;
1336
- letter-spacing: 0.22em;
1337
- text-transform: uppercase;
1338
- white-space: nowrap;
1339
- }
1340
- .showoff-arrow {
1341
- font-family: var(--font-display);
1342
- font-size: 36px;
1343
- letter-spacing: 0;
1344
- line-height: 1;
1345
- color: var(--accent-pink);
1346
- }
1347
-
1348
- @media (max-width: 800px) {
1349
- .showoff-cta { grid-template-columns: 1fr; padding: 24px 20px; gap: 18px; }
1350
- .showoff-glyph { margin: 0; transform: scale(0.6); transform-origin: left top; }
1351
- .showoff-action { width: 100%; flex-direction: row; justify-content: center; }
1352
- }
1353
-
1354
- /* ───────────────────────── 05 POLICIES ───────────────────────── */
1355
-
1356
- .policy-callout {
1357
- display: inline-flex; align-items: baseline; gap: 12px;
1358
- padding: 12px 18px;
1359
- border: 1px solid var(--accent-green);
1360
- background: var(--accent-green-bg);
1361
- margin-bottom: 28px;
1362
- font-family: var(--font-mono); font-size: 13px;
1363
- letter-spacing: 0.02em;
1364
- color: var(--ink);
1365
- box-shadow: 4px 4px 0 0 var(--accent-green-shadow);
1366
- }
1367
- .policy-callout .arrow { color: var(--accent-green); margin: 0 4px; }
1368
- .policy-callout .new-score {
1369
- font-family: var(--font-display); font-size: 22px;
1370
- letter-spacing: 0.08em; color: var(--accent-green);
1371
- }
1372
- .policy-callout .new-tier { color: var(--accent-green); font-weight: 600; }
1373
-
1374
- .policies-grid {
1375
- display: grid;
1376
- grid-template-columns: repeat(2, 1fr);
1377
- gap: 16px;
1378
- }
1379
- .policy-card {
1380
- border: 1px solid var(--line-2);
1381
- background: var(--bg-2);
1382
- padding: 20px 22px;
1383
- display: flex; flex-direction: column; gap: 10px;
1384
- transition: all 120ms;
1385
- position: relative;
1386
- }
1387
- .policy-card::before {
1388
- content: ""; position: absolute; left: 0; top: 0;
1389
- width: 3px; height: 100%;
1390
- background: var(--accent-pink); opacity: 0.7;
1391
- }
1392
- .policy-card:hover { background: var(--bg-3); }
1393
- .policy-card .head {
1394
- display: flex; justify-content: space-between; align-items: baseline;
1395
- gap: 12px;
1396
- padding-bottom: 10px;
1397
- border-bottom: 1px dashed var(--line);
1398
- margin-bottom: 4px;
1399
- }
1400
- .policy-name {
1401
- font-family: var(--font-display); font-size: 18px;
1402
- letter-spacing: 0.11em; color: var(--ink);
1403
- text-transform: lowercase;
1404
- }
1405
- .policy-slug {
1406
- font-family: var(--font-mono); font-size: 10px;
1407
- letter-spacing: 0.12em; color: var(--dim);
1408
- text-transform: uppercase;
1409
- }
1410
- .policy-desc {
1411
- font-family: var(--font-mono); font-size: 12px;
1412
- color: var(--ink-2); line-height: 1.6;
1413
- }
1414
- .policy-impact {
1415
- font-family: var(--font-mono); font-size: 12px;
1416
- color: var(--accent-green);
1417
- letter-spacing: 0.01em;
1418
- border-top: 1px dashed var(--line);
1419
- padding-top: 10px;
1420
- margin-top: auto;
1421
- }
1422
- .policy-impact .check { margin-right: 6px; }
1423
- .policy-install {
1424
- display: flex; align-items: center; gap: 8px;
1425
- font-family: var(--font-mono); font-size: 11px;
1426
- background: var(--bg); border: 1px solid var(--line);
1427
- padding: 8px 10px;
1428
- color: var(--accent-green);
1429
- margin-top: 4px;
1430
- }
1431
- .policy-install .prompt { color: var(--dim); }
1432
- .policy-install .copy {
1433
- margin-left: auto; color: var(--dim); cursor: pointer;
1434
- font-size: 10px; letter-spacing: 0.15em; text-transform: uppercase;
1435
- transition: color 120ms;
1436
- }
1437
- .policy-install .copy:hover { color: var(--accent-pink); }
1438
-
1439
- /* ───────────────────────── 06 SHARE + RETURN ───────────────────────── */
1440
-
1441
- .share-grid {
1442
- display: grid;
1443
- grid-template-columns: 1fr 1fr;
1444
- gap: 32px;
1445
- align-items: start;
1446
- }
1447
-
1448
- .share-card {
1449
- border: 1px solid var(--accent-pink);
1450
- background:
1451
- repeating-linear-gradient(0deg, rgba(228,88,125,0.02) 0 1px, transparent 1px 16px),
1452
- repeating-linear-gradient(90deg, rgba(228,88,125,0.02) 0 1px, transparent 1px 16px),
1453
- var(--bg-2);
1454
- padding: 32px;
1455
- position: relative;
1456
- box-shadow: 8px 8px 0 0 var(--accent-pink-shadow);
1457
- }
1458
- .share-card .stamp-tl, .share-card .stamp-br {
1459
- position: absolute;
1460
- font-family: var(--font-mono); font-size: 9px;
1461
- letter-spacing: 0.2em; text-transform: uppercase;
1462
- color: var(--accent-pink); opacity: 0.55;
1463
- }
1464
- .share-card .stamp-tl { top: 8px; left: 12px; }
1465
- .share-card .stamp-br { bottom: 8px; right: 12px; }
1466
-
1467
- .share-brand {
1468
- display: flex; align-items: center; gap: 10px;
1469
- margin-bottom: 28px;
1470
- }
1471
- .share-brand .glyph {
1472
- color: var(--accent-pink); font-family: var(--font-mono);
1473
- font-size: 14px; letter-spacing: -2px; font-weight: 700;
1474
- }
1475
- .share-brand .name {
1476
- font-family: var(--font-display); font-size: 14px;
1477
- letter-spacing: 0.11em; text-transform: lowercase; color: var(--ink);
1478
- }
1479
- .share-brand .sep { color: var(--dim); font-size: 11px; }
1480
- .share-brand .meta {
1481
- font-family: var(--font-mono); font-size: 10px;
1482
- letter-spacing: 0.18em; text-transform: uppercase; color: var(--dim);
1483
- }
1484
- .share-project {
1485
- font-family: var(--font-mono); font-size: 12px;
1486
- letter-spacing: 0.05em; color: var(--ink-2);
1487
- margin-bottom: 20px;
1488
- }
1489
- .share-archetype {
1490
- font-family: var(--font-display);
1491
- font-size: clamp(36px, 5vw, 56px);
1492
- line-height: 1; letter-spacing: 0.08em;
1493
- text-transform: lowercase;
1494
- color: var(--ink);
1495
- text-shadow: 3px 3px 0 var(--accent-pink-shadow);
1496
- margin: 0 0 12px;
1497
- text-wrap: balance;
1498
- }
1499
- .share-rule {
1500
- width: 56px; height: 2px;
1501
- background: var(--accent-pink);
1502
- margin: 16px 0 20px;
1503
- }
1504
- .share-tagline {
1505
- font-family: var(--font-mono); font-size: 14px;
1506
- line-height: 1.45; color: var(--ink-2);
1507
- margin-bottom: 32px;
1508
- text-wrap: pretty;
1509
- }
1510
- .share-score-row {
1511
- display: flex; gap: 14px; align-items: center;
1512
- font-family: var(--font-mono); font-size: 14px;
1513
- letter-spacing: 0.05em;
1514
- padding-top: 22px;
1515
- border-top: 1px dashed var(--line);
1516
- }
1517
- .share-score-row .tier {
1518
- font-family: var(--font-display); font-size: 22px;
1519
- letter-spacing: 0.08em; color: var(--accent-pink);
1520
- text-transform: uppercase;
1521
- }
1522
- .share-score-row .sep { color: var(--dim); }
1523
- .share-score-row .num { color: var(--ink); }
1524
- .share-score-row .rank { color: var(--ink-2); }
1525
- .share-url {
1526
- margin-top: 22px;
1527
- font-family: var(--font-mono); font-size: 11px;
1528
- letter-spacing: 0.18em; text-transform: uppercase;
1529
- color: var(--accent-green);
402
+ @media (max-width: 520px) {
403
+ .auth-dialog { padding: 26px 22px 22px; }
404
+ .auth-actions { flex-direction: column; align-items: stretch; }
405
+ .auth-btn { justify-content: center; }
1530
406
  }
1531
407
 
1532
- .share-actions {
1533
- display: flex; flex-direction: column; gap: 16px;
1534
- }
1535
- .tweet-tabs {
1536
- display: flex; gap: 0;
1537
- border: 1px solid var(--line-2);
1538
- }
1539
- .tweet-tab {
1540
- flex: 1;
1541
- padding: 10px 14px;
408
+ /* status pill in the return CTA: shows current logged-in email */
409
+ .auth-status-pill {
410
+ display: inline-flex; align-items: center; gap: 8px;
411
+ margin-top: 16px;
412
+ padding: 6px 10px;
413
+ border: 1px dashed var(--line-2);
1542
414
  font-family: var(--font-mono); font-size: 11px;
1543
- letter-spacing: 0.15em; text-transform: uppercase;
415
+ letter-spacing: 0.1em;
1544
416
  color: var(--ink-2);
1545
- border-right: 1px solid var(--line);
1546
- background: var(--bg-2);
1547
- transition: all 120ms;
1548
417
  }
1549
- .tweet-tab:last-child { border-right: none; }
1550
- .tweet-tab:hover { color: var(--ink); }
1551
- .tweet-tab.is-active {
1552
- color: var(--accent-pink);
1553
- background: var(--accent-pink-bg);
418
+ .auth-status-pill .dot {
419
+ width: 7px; height: 7px;
420
+ background: var(--accent-green); display: inline-block;
421
+ box-shadow: 0 0 6px rgba(102,209,181,0.55);
1554
422
  }
423
+ .auth-status-pill .email { color: var(--accent-green); }
1555
424
 
1556
- .tweet-preview {
1557
- background: var(--bg-2);
1558
- border: 1px solid var(--line-2);
1559
- padding: 20px 22px;
1560
- font-family: var(--font-mono); font-size: 13px;
1561
- line-height: 1.65;
1562
- color: var(--ink);
1563
- white-space: pre-wrap;
1564
- min-height: 200px;
1565
- position: relative;
1566
- }
1567
- .tweet-preview .url { color: var(--accent-pink); }
1568
- .tweet-preview .arch { color: var(--accent-pink); }
1569
- .tweet-meta {
1570
- display: flex; justify-content: space-between;
1571
- font-family: var(--font-mono); font-size: 10px;
1572
- letter-spacing: 0.18em; text-transform: uppercase;
1573
- color: var(--dim);
425
+ /* responsive */
426
+ @media (max-width: 960px) {
427
+ .report { padding: 0 20px; }
428
+ .archetype-frame { padding: 32px 24px; }
429
+ .arch-body { grid-template-columns: 1fr; gap: 32px; }
430
+ .arch-meta-grid { grid-template-columns: 1fr; gap: 16px; }
431
+ .score-grid { grid-template-columns: 1fr; gap: 16px; }
432
+ .finding-body { grid-template-columns: 1fr; }
433
+ .finding-block { border-right: none !important; }
434
+ .policies-grid { grid-template-columns: 1fr; }
435
+ .share-grid { grid-template-columns: 1fr; }
436
+ .strength-row { grid-template-columns: 40px 1fr; }
437
+ .strength-metric { grid-column: 2; text-align: left; margin-top: 6px; }
438
+ .return-hook { padding: 28px 24px; }
1574
439
  }
1575
- .tweet-meta .count.over { color: var(--accent-pink); }
1576
440
 
1577
- .share-buttons {
1578
- display: flex; gap: 12px; flex-wrap: wrap;
1579
- }
1580
- .share-btn {
1581
- display: inline-flex; align-items: center; gap: 10px;
1582
- padding: 14px 20px;
1583
- font-family: var(--font-mono); font-size: 13px;
1584
- letter-spacing: 0.04em;
1585
- border: 1px solid var(--accent-pink);
1586
- color: var(--accent-pink);
1587
- background: transparent;
1588
- transition: all 120ms;
1589
- box-shadow: 4px 4px 0 0 var(--accent-pink-shadow);
1590
- }
1591
- .share-btn:hover {
1592
- background: var(--accent-pink);
1593
- color: var(--bg);
1594
- box-shadow: 2px 2px 0 0 var(--accent-pink-shadow);
1595
- transform: translate(2px, 2px);
1596
- }
1597
- .share-btn.alt {
1598
- border-color: var(--line-2); color: var(--ink);
1599
- box-shadow: 4px 4px 0 0 #1a1a20;
1600
- }
1601
- .share-btn.alt:hover {
1602
- border-color: var(--ink); background: rgba(255,255,255,0.04);
1603
- color: var(--ink); box-shadow: 2px 2px 0 0 #1a1a20;
441
+ /* reduced-motion: silence the ambient terminal motion (blinking cursor,
442
+ spinner, marquee shine, status pulse) so vestibular-sensitive users get a
443
+ still UI. Functional progress (.running-bar-fill width) still updates;
444
+ only the decorative loops are stopped. */
445
+ @media (prefers-reduced-motion: reduce) {
446
+ .running-cursor,
447
+ .running-stage-spin,
448
+ .running-bar-fill::after,
449
+ .auth-status-pill .dot {
450
+ animation: none;
451
+ }
452
+ .running-bar-fill { transition: none; }
1604
453
  }
1605
- .share-btn .arrow { color: var(--accent-green); }
1606
- .share-btn:hover .arrow { color: var(--bg); }
1607
454
 
1608
- /* return hook */
1609
- .return-hook {
1610
- margin-top: 64px;
1611
- padding: 40px 48px;
1612
- border: 1px solid var(--line-2);
455
+ /* ─────────────────────────────────────────────────────────────────────
456
+ audit-progress-strip — sticky banner pinned to the top of the viewport
457
+ while a re-audit is in flight. Pink hard-offset shadow matches the
458
+ page's `.share-btn:hover` vocabulary. Right-edge pulse is a CSS-only
459
+ keyframe (transform-only no layout thrash) and is not a fake
460
+ progress bar.
461
+ ───────────────────────────────────────────────────────────────────── */
462
+ .audit-progress-strip {
463
+ position: sticky;
464
+ top: 0;
465
+ left: 0;
466
+ right: 0;
467
+ z-index: 60;
1613
468
  background: var(--bg-2);
1614
- position: relative;
1615
- }
1616
- .return-hook::before, .return-hook::after {
1617
- content: ""; position: absolute; width: 8px; height: 8px;
469
+ border-bottom: 1px solid var(--accent-pink);
470
+ font-family: var(--font-mono);
471
+ /* Slide in from above on mount */
472
+ animation: audit-progress-slide-in 220ms cubic-bezier(0.22, 1, 0.36, 1);
1618
473
  }
1619
- .return-hook::before {
1620
- top: -1px; left: -1px;
1621
- border-top: 1px solid var(--accent-green);
1622
- border-left: 1px solid var(--accent-green);
474
+ .audit-progress-strip--failed {
475
+ border-bottom-color: var(--accent-pink);
476
+ background: linear-gradient(to right, var(--accent-pink-bg), var(--bg-2));
1623
477
  }
1624
- .return-hook::after {
1625
- bottom: -1px; right: -1px;
1626
- border-bottom: 1px solid var(--accent-green);
1627
- border-right: 1px solid var(--accent-green);
478
+ .audit-progress-strip__inner {
479
+ position: relative;
480
+ max-width: 1480px;
481
+ margin: 0 auto;
482
+ padding: 12px clamp(20px, 3vw, 48px);
483
+ display: flex;
484
+ align-items: center;
485
+ justify-content: space-between;
486
+ gap: 16px;
1628
487
  }
1629
- .return-hook .label {
1630
- font-family: var(--font-mono); font-size: 11px;
1631
- letter-spacing: 0.22em; text-transform: uppercase;
1632
- color: var(--accent-green); margin-bottom: 12px;
488
+ .audit-progress-strip__label {
489
+ display: inline-flex;
490
+ align-items: center;
491
+ gap: 10px;
492
+ color: var(--ink);
493
+ font-size: 12px;
494
+ letter-spacing: 0.06em;
495
+ text-transform: lowercase;
1633
496
  }
1634
- .return-hook h3 {
1635
- font-family: var(--font-display); font-size: clamp(28px, 3.6vw, 40px);
1636
- letter-spacing: 0.11em; line-height: 1.1;
1637
- text-transform: lowercase; color: var(--ink);
1638
- margin: 0 0 16px; font-weight: 400;
497
+ .audit-progress-strip--failed .audit-progress-strip__label { color: var(--accent-pink); }
498
+ .audit-progress-strip__elapsed {
499
+ font-variant-numeric: tabular-nums;
500
+ font-size: 12px;
501
+ color: var(--accent-pink);
502
+ letter-spacing: 0.08em;
1639
503
  }
1640
- .return-hook p {
1641
- font-family: var(--font-mono); font-size: 13px;
1642
- color: var(--ink-2); line-height: 1.7;
1643
- margin: 0 0 8px; max-width: 600px;
504
+ .audit-progress-strip__spinner {
505
+ width: 9px;
506
+ height: 9px;
507
+ border-radius: 50%;
508
+ background: transparent;
509
+ border: 1.5px solid var(--accent-pink);
510
+ border-top-color: transparent;
511
+ animation: audit-progress-spin 800ms linear infinite;
1644
512
  }
1645
- .return-actions { display: flex; gap: 12px; margin-top: 28px; flex-wrap: wrap; align-items: center; }
1646
-
1647
- /* persistent reminder status (authed + reminder saved) */
1648
- .return-status {
1649
- margin-top: 24px;
1650
- padding: 18px 20px;
513
+ .audit-progress-strip__x {
514
+ display: inline-flex;
515
+ align-items: center;
516
+ justify-content: center;
517
+ width: 14px;
518
+ height: 14px;
1651
519
  border: 1px solid var(--accent-pink);
1652
- background:
1653
- repeating-linear-gradient(0deg, rgba(228,88,125,0.03) 0 1px, transparent 1px 16px),
1654
- repeating-linear-gradient(90deg, rgba(228,88,125,0.03) 0 1px, transparent 1px 16px),
1655
- var(--bg-2);
520
+ color: var(--accent-pink);
521
+ font-size: 11px;
522
+ line-height: 1;
1656
523
  }
1657
- .return-status .rs-row {
1658
- display: flex; align-items: center; gap: 12px;
1659
- font-family: var(--font-mono); font-size: 13px;
524
+ .audit-progress-strip__dismiss {
525
+ background: transparent;
526
+ border: 1px solid var(--line-2);
1660
527
  color: var(--ink-2);
1661
- margin: 6px 0;
1662
- }
1663
- .return-status .rs-row-primary {
1664
- font-size: 15px;
1665
- color: var(--ink);
1666
- letter-spacing: 0.02em;
1667
- }
1668
- .return-status .rs-strong { color: var(--accent-pink); }
1669
- .return-status .rs-email { color: var(--accent-green); }
1670
- .rs-dot {
1671
- width: 8px; height: 8px;
1672
- display: inline-block;
1673
- flex-shrink: 0;
528
+ padding: 5px 10px;
529
+ font-family: var(--font-mono);
530
+ font-size: 11px;
531
+ text-transform: lowercase;
532
+ letter-spacing: 0.06em;
533
+ cursor: pointer;
534
+ transition: border-color 140ms ease, color 140ms ease;
1674
535
  }
1675
- .rs-dot-pink {
1676
- background: var(--accent-pink);
1677
- box-shadow: 0 0 8px rgba(228,88,125,0.55);
1678
- animation: pulseDot 1.6s ease-in-out infinite;
536
+ .audit-progress-strip__dismiss:hover {
537
+ border-color: var(--accent-pink);
538
+ color: var(--accent-pink);
1679
539
  }
1680
- .rs-dot-green {
1681
- background: var(--accent-green);
1682
- box-shadow: 0 0 6px rgba(102,209,181,0.55);
540
+ .audit-progress-strip__pulse {
541
+ position: absolute;
542
+ bottom: -1px;
543
+ left: 0;
544
+ right: 0;
545
+ height: 1px;
546
+ background: linear-gradient(
547
+ 90deg,
548
+ transparent 0%,
549
+ var(--accent-pink) 20%,
550
+ var(--accent-pink) 80%,
551
+ transparent 100%
552
+ );
553
+ transform-origin: left center;
554
+ animation: audit-progress-pulse 2400ms cubic-bezier(0.55, 0.1, 0.45, 0.9) infinite;
1683
555
  }
1684
- .rs-clear {
1685
- background: transparent;
1686
- border: none;
1687
- padding: 4px 0;
1688
- font-family: var(--font-mono); font-size: 11px;
1689
- letter-spacing: 0.1em;
1690
- color: var(--dim);
1691
- cursor: pointer;
1692
- text-decoration: underline;
1693
- text-underline-offset: 3px;
1694
- transition: color 120ms;
556
+ @keyframes audit-progress-spin {
557
+ to { transform: rotate(360deg); }
1695
558
  }
1696
- .rs-clear:hover:not(:disabled) { color: var(--accent-pink); }
1697
- .rs-clear:disabled { opacity: 0.5; cursor: not-allowed; }
1698
-
1699
- /* ───────────────────────── footer ───────────────────────── */
1700
-
1701
- .report-footer {
1702
- padding: 48px 32px 24px;
1703
- border-top: 1px solid var(--line);
1704
- background: var(--bg);
1705
- text-align: center;
1706
- font-family: var(--font-mono); font-size: 11px;
1707
- letter-spacing: 0.15em; text-transform: uppercase;
1708
- color: var(--dim);
559
+ @keyframes audit-progress-pulse {
560
+ 0% { transform: scaleX(0) translateX(0%); opacity: 0.4; }
561
+ 50% { transform: scaleX(0.6) translateX(20%); opacity: 1; }
562
+ 100% { transform: scaleX(0) translateX(100%); opacity: 0.2; }
1709
563
  }
1710
- /* Fixed variant — used on the empty/loading states where the page is
1711
- short and a normal in-flow footer ends up floating mid-viewport. Pins
1712
- it to the bottom of the viewport so it doesn't scroll with the page. */
1713
- .report-footer--fixed {
1714
- position: fixed;
1715
- left: 0; right: 0; bottom: 0;
1716
- padding: 16px 32px;
1717
- z-index: 10;
564
+ @keyframes audit-progress-slide-in {
565
+ from { transform: translateY(-100%); opacity: 0; }
566
+ to { transform: translateY(0); opacity: 1; }
1718
567
  }
1719
- .report-footer .brand-mark {
1720
- color: var(--accent-pink); font-family: var(--font-mono);
1721
- font-size: 14px; letter-spacing: -2px; font-weight: 700;
1722
- margin-right: 6px;
568
+ @media (prefers-reduced-motion: reduce) {
569
+ .audit-progress-strip { animation: none; }
570
+ .audit-progress-strip__spinner { animation: none; border-top-color: var(--accent-pink); }
571
+ .audit-progress-strip__pulse { animation: none; opacity: 0.4; transform: scaleX(0.4) translateX(30%); }
1723
572
  }
1724
573
 
1725
- /* ───────────────────────── auth dialog (set-a-reminder gate) ───────────────────────── */
574
+ /* ============================================================
575
+ AUDIT POSTER — section 01.
576
+ Single-screen capture region + 3 share buttons + scroll hint.
577
+ Calm: 1px borders, no hard shadows, no scanlines.
578
+ ============================================================ */
1726
579
 
1727
- .auth-dialog-backdrop {
1728
- position: fixed; inset: 0; z-index: 10000;
1729
- display: grid; place-items: center;
1730
- padding: 32px 16px;
1731
- background:
1732
- radial-gradient(ellipse 1000px 700px at 30% 20%, rgba(228,88,125,0.08) 0%, transparent 60%),
1733
- rgba(8,8,10,0.78);
1734
- backdrop-filter: blur(6px);
1735
- -webkit-backdrop-filter: blur(6px);
1736
- animation: authFadeIn 140ms ease-out;
1737
- }
1738
- @keyframes authFadeIn {
1739
- from { opacity: 0; }
1740
- to { opacity: 1; }
580
+ .poster-section {
581
+ /* Fit the viewport exactly: poster + share row + scroll hint all
582
+ * visible on the first screen. The header is ~52px tall (14px
583
+ * padding × 2 + ~18px content + 1px border). Using `height` (not
584
+ * min-height) means the section never overflows; the poster's
585
+ * flex column shrinks its body to fit. */
586
+ height: calc(100vh - 52px);
587
+ padding: 20px 0 16px;
588
+ border-bottom: 1px solid var(--line);
589
+ display: flex; flex-direction: column;
590
+ gap: 14px;
1741
591
  }
1742
592
 
1743
- .auth-dialog {
593
+ .poster {
1744
594
  position: relative;
595
+ padding: 22px 40px;
596
+ border: 1px dashed var(--accent-pink-soft);
597
+ background: var(--bg-2);
598
+ display: flex; flex-direction: column;
599
+ max-width: 980px;
1745
600
  width: 100%;
1746
- max-width: 460px;
1747
- padding: 32px 32px 28px;
1748
- border: 1px solid var(--accent-pink);
1749
- background:
1750
- repeating-linear-gradient(0deg, rgba(228,88,125,0.03) 0 1px, transparent 1px 16px),
1751
- repeating-linear-gradient(90deg, rgba(228,88,125,0.03) 0 1px, transparent 1px 16px),
1752
- var(--bg-2);
1753
- box-shadow: 8px 8px 0 0 var(--accent-pink-shadow);
1754
- font-family: var(--font-mono);
1755
- color: var(--ink);
1756
- animation: authPop 160ms ease-out;
1757
- }
1758
- @keyframes authPop {
1759
- from { transform: translateY(8px) scale(0.985); opacity: 0; }
1760
- to { transform: translateY(0) scale(1); opacity: 1; }
601
+ margin: 0 auto;
602
+ flex: 1 1 auto;
603
+ min-height: 0;
604
+ overflow: hidden;
1761
605
  }
1762
606
 
1763
- .auth-dialog .corner {
1764
- position: absolute;
607
+ /* poster lays out as head / centered body / footer so the body anchors
608
+ * vertically in the middle even when the poster fills the viewport. */
609
+ .poster-head { flex: 0 0 auto; }
610
+ .poster-body { flex: 1 1 auto; }
611
+ .poster-foot { flex: 0 0 auto; }
612
+
613
+ /* head ────────────────────────────────────────────────────── */
614
+ .poster-head {
615
+ display: flex; justify-content: space-between; align-items: baseline;
616
+ gap: 18px; flex-wrap: wrap;
617
+ padding-bottom: 12px;
618
+ border-bottom: 1px dashed var(--line);
1765
619
  font-family: var(--font-mono);
1766
- font-size: 14px; line-height: 1;
1767
- color: var(--accent-pink); opacity: 0.85;
620
+ font-size: 14px;
621
+ letter-spacing: 0.04em;
1768
622
  }
1769
- .auth-dialog .corner.tl { top: 6px; left: 8px; }
1770
- .auth-dialog .corner.tr { top: 6px; right: 8px; }
1771
- .auth-dialog .corner.bl { bottom: 6px; left: 8px; }
1772
- .auth-dialog .corner.br { bottom: 6px; right: 8px; }
1773
-
1774
- .auth-close {
1775
- position: absolute; top: 12px; right: 14px;
1776
- font-family: var(--font-mono); font-size: 11px;
1777
- letter-spacing: 0.15em; text-transform: uppercase;
1778
- color: var(--dim);
1779
- background: transparent; border: none; padding: 4px 6px;
1780
- cursor: pointer;
1781
- transition: color 120ms;
623
+ .poster-wordmark {
624
+ color: var(--ink);
625
+ display: inline-flex; align-items: center; gap: 8px;
626
+ }
627
+ .poster-wordmark .poster-logo {
628
+ height: 18px;
629
+ width: auto;
630
+ display: block;
631
+ }
632
+ .poster-wordmark .poster-sep { color: var(--dim); margin: 0 2px; }
633
+ .poster-meta { color: var(--dim); }
634
+ .poster-meta .poster-ix { color: var(--accent-pink); }
635
+ .poster-meta .of { color: var(--dim); }
636
+ .poster-meta .poster-sep { color: var(--dim); }
637
+
638
+ /* body — vertical centered stack: sigil → persona → score ─── */
639
+ .poster-body {
640
+ display: flex;
641
+ flex-direction: column;
642
+ align-items: center;
643
+ justify-content: center;
644
+ gap: clamp(14px, 2.6vh, 30px);
645
+ text-align: center;
646
+ padding: clamp(6px, 1.4vh, 16px) 0;
647
+ min-height: 0;
1782
648
  }
1783
- .auth-close:hover { color: var(--accent-pink); }
1784
- .auth-close:disabled { color: var(--line-2); cursor: not-allowed; }
1785
649
 
1786
- .auth-label {
1787
- font-family: var(--font-mono); font-size: 11px;
1788
- letter-spacing: 0.22em; text-transform: uppercase;
1789
- color: var(--accent-green);
1790
- margin-bottom: 14px;
650
+ /* sigil — flat 8x8, anchored at the top of the centered stack ── */
651
+ .poster-sigil .sigil {
652
+ display: grid;
653
+ grid-template-columns: repeat(8, clamp(10px, 1.7vh, 16px));
654
+ grid-template-rows: repeat(8, clamp(10px, 1.7vh, 16px));
655
+ gap: 2px;
656
+ padding: clamp(6px, 1vh, 10px);
657
+ background: var(--bg);
658
+ border: 1px solid var(--line-2);
1791
659
  }
1792
660
 
1793
- .auth-headline {
661
+ /* persona — name + keywords + rarity stacked centered ──────── */
662
+ .poster-persona {
663
+ min-width: 0;
664
+ display: flex; flex-direction: column; align-items: center;
665
+ gap: clamp(6px, 1.2vh, 14px);
666
+ }
667
+ .poster-persona .persona-name {
1794
668
  font-family: var(--font-display);
1795
- font-size: clamp(26px, 3.6vw, 34px);
1796
- letter-spacing: 0.09em; line-height: 1.1;
1797
- text-transform: lowercase;
669
+ font-size: clamp(32px, 6.5vh, 64px);
670
+ letter-spacing: 0.03em;
671
+ line-height: 0.95;
672
+ margin: 0;
1798
673
  color: var(--ink);
1799
- margin: 0 0 12px;
1800
- text-shadow: 3px 3px 0 var(--accent-pink-shadow);
674
+ text-transform: lowercase;
1801
675
  text-wrap: balance;
1802
676
  }
677
+ .poster-persona .persona-keywords {
678
+ font-family: var(--font-display);
679
+ font-size: clamp(16px, 2.2vh, 22px);
680
+ letter-spacing: 0.06em;
681
+ text-transform: lowercase;
682
+ }
683
+ .poster-persona .persona-keywords .kw-0 { color: var(--accent-green); }
684
+ .poster-persona .persona-keywords .kw-1 { color: var(--ink); }
685
+ .poster-persona .persona-keywords .kw-2 { color: var(--accent-pink); }
686
+ .poster-persona .persona-keywords .kw-sep { color: var(--dim); margin: 0 10px; }
687
+ .poster-persona .persona-rarity {
688
+ font-family: var(--font-mono);
689
+ font-size: clamp(11px, 1.3vh, 13px);
690
+ color: var(--accent-green);
691
+ letter-spacing: 0.02em;
692
+ }
693
+ .poster-persona .persona-rarity .lbl { color: var(--dim); }
694
+ .poster-persona .persona-rarity .pct { color: var(--accent-pink); font-weight: 600; }
1803
695
 
1804
- .auth-sub {
1805
- font-family: var(--font-mono); font-size: 13px;
1806
- line-height: 1.65; color: var(--ink-2);
1807
- margin: 0 0 22px;
696
+ /* score — score-n + /100, baseline-aligned and centered in the card. */
697
+ .poster-score {
698
+ display: flex;
699
+ align-items: baseline;
700
+ justify-content: center;
701
+ gap: clamp(10px, 1.4vh, 16px);
1808
702
  }
1809
- .auth-sub .auth-email {
703
+ .poster-score .score-n {
704
+ /* Mono font — Bitcount Prop Single renders unreliably in html2canvas
705
+ * at this size (phantom pixels). JetBrains Mono exports cleanly. */
706
+ font-family: var(--font-mono);
707
+ font-size: clamp(56px, 11vh, 112px);
708
+ font-weight: 700;
709
+ line-height: 1;
710
+ letter-spacing: -0.02em;
1810
711
  color: var(--accent-pink);
712
+ font-variant-numeric: tabular-nums;
1811
713
  }
1812
- .auth-sub .auth-ok {
1813
- color: var(--accent-green);
1814
- margin-right: 6px;
714
+ .poster-score .score-of {
715
+ font-family: var(--font-mono);
716
+ font-size: clamp(16px, 2vh, 22px);
717
+ color: var(--dim);
718
+ letter-spacing: 0.04em;
719
+ line-height: 1;
1815
720
  }
721
+ .poster-sigil .sigil .px { background: transparent; }
722
+ .poster-sigil .sigil .px.on { background: var(--ink); }
723
+ .poster-sigil .sigil .px.p { background: var(--accent-pink); }
724
+ .poster-sigil .sigil .px.g { background: var(--accent-green); }
725
+ .poster-sigil .sigil .px.d { background: var(--dim); }
1816
726
 
1817
- .auth-form { display: flex; flex-direction: column; gap: 10px; }
1818
-
1819
- .auth-field-label {
1820
- font-family: var(--font-mono); font-size: 10px;
1821
- letter-spacing: 0.22em; text-transform: uppercase;
1822
- color: var(--accent-green);
727
+ /* foot brand stamp (left) + CTA (right) ─────────────────────── */
728
+ .poster-foot {
729
+ display: flex; justify-content: space-between; align-items: baseline;
730
+ padding-top: 10px;
731
+ border-top: 1px dashed var(--line);
732
+ font-family: var(--font-mono);
733
+ font-size: 14px;
734
+ }
735
+ .poster-brand {
736
+ color: var(--ink);
737
+ letter-spacing: 0.04em;
738
+ text-shadow: 0 0 6px rgba(255, 255, 255, 0.5), 0 0 14px rgba(255, 255, 255, 0.22);
739
+ }
740
+ .poster-cta { color: var(--accent-green); letter-spacing: 0.04em; }
741
+ .poster-cta .arrow { color: var(--accent-pink); margin: 0 4px; }
742
+ /* glow just the copy-paste command so it reads as the actionable bit */
743
+ .poster-cta .cta-cmd {
744
+ text-shadow: 0 0 6px rgba(102, 209, 181, 0.6), 0 0 14px rgba(102, 209, 181, 0.3);
1823
745
  }
1824
746
 
1825
- .auth-input {
1826
- width: 100%;
1827
- padding: 11px 14px;
1828
- background: var(--bg);
747
+ /* share-row — UI only, outside the PNG capture ─────────────── */
748
+ .poster-share-row {
749
+ max-width: 980px;
750
+ margin: 0 auto;
751
+ display: grid;
752
+ grid-template-columns: repeat(3, 1fr);
753
+ gap: 10px;
754
+ flex: 0 0 auto;
755
+ }
756
+ .poster-share-btn {
757
+ display: inline-flex; align-items: center; justify-content: center;
758
+ gap: 10px;
759
+ padding: 12px 16px;
1829
760
  border: 1px solid var(--line-2);
761
+ background: var(--bg-2);
1830
762
  color: var(--ink);
1831
- font-family: var(--font-mono); font-size: 14px;
1832
- letter-spacing: 0.03em;
1833
- outline: none;
1834
- transition: border-color 120ms, box-shadow 120ms;
763
+ font-family: var(--font-mono);
764
+ font-size: 12px;
765
+ letter-spacing: 0.04em;
766
+ cursor: pointer;
767
+ transition: border-color 140ms ease, color 140ms ease, background 140ms ease;
1835
768
  }
1836
- .auth-input:focus {
769
+ .poster-share-btn:hover {
1837
770
  border-color: var(--accent-pink);
1838
- box-shadow: 0 0 0 1px var(--accent-pink-soft);
771
+ color: var(--accent-pink);
772
+ background: var(--accent-pink-bg);
1839
773
  }
1840
- .auth-input:disabled {
1841
- opacity: 0.55; cursor: not-allowed;
774
+ .poster-share-btn:disabled {
775
+ opacity: 0.55; cursor: wait;
1842
776
  }
1843
- .auth-input-code {
1844
- letter-spacing: 0.5em;
777
+ .poster-share-btn:focus-visible,
778
+ .cadence-btn:focus-visible,
779
+ .invite-btn:focus-visible,
780
+ .install-all-btn:focus-visible,
781
+ .copy-icon-btn:focus-visible,
782
+ .fix-install-btn:focus-visible {
783
+ outline: 2px solid var(--accent-pink);
784
+ outline-offset: 2px;
785
+ }
786
+ .poster-share-btn .mark { color: var(--accent-pink); font-weight: 700; }
787
+
788
+ /* scroll-hint — small footer below share row ───────────────── */
789
+ .poster-scroll-hint {
1845
790
  text-align: center;
1846
- font-size: 18px;
1847
- font-variant-numeric: tabular-nums;
791
+ margin: 0;
792
+ font-family: var(--font-mono);
793
+ font-size: 10px;
794
+ letter-spacing: 0.22em;
795
+ text-transform: uppercase;
796
+ flex: 0 0 auto;
797
+ color: var(--dim);
1848
798
  }
1849
- .auth-input::placeholder { color: var(--dim); }
799
+ .poster-scroll-hint .arrow { color: var(--accent-pink); margin-left: 6px; }
1850
800
 
1851
- .auth-error {
1852
- font-family: var(--font-mono); font-size: 12px;
1853
- color: var(--accent-pink);
1854
- padding: 8px 12px;
1855
- background: var(--accent-pink-bg);
1856
- border: 1px solid var(--accent-pink);
1857
- border-left-width: 3px;
1858
- letter-spacing: 0.02em;
1859
- margin-top: 4px;
801
+ @media (max-width: 720px) {
802
+ .poster { padding: 24px 22px; }
803
+ .poster-body { gap: 28px; padding: 12px 0; }
804
+ .poster-share-row { grid-template-columns: 1fr; }
805
+ .poster-head { font-size: 12px; }
806
+ .poster-score .score-n { font-size: clamp(72px, 18vw, 120px); }
807
+ .poster-persona .persona-name { font-size: clamp(36px, 9vw, 56px); }
1860
808
  }
1861
809
 
1862
- .auth-actions {
1863
- display: flex; gap: 10px; flex-wrap: wrap;
1864
- margin-top: 14px;
810
+ /* ============================================================
811
+ SHARED SECTION SHELL used by sections 02-05 on /audit.
812
+ ============================================================ */
813
+ .audit-sec {
814
+ padding: 48px 0;
815
+ border-bottom: 1px solid var(--line);
1865
816
  }
817
+ .audit-sec:last-child { border-bottom: none; }
1866
818
 
1867
- .auth-btn {
1868
- display: inline-flex; align-items: center; gap: 8px;
1869
- padding: 10px 16px;
1870
- font-family: var(--font-mono); font-size: 12px;
1871
- letter-spacing: 0.06em;
1872
- background: transparent;
1873
- border: 1px solid var(--line-2);
1874
- color: var(--ink);
1875
- cursor: pointer;
1876
- transition: all 120ms ease;
819
+ .audit-sec-head {
820
+ display: flex; justify-content: space-between; align-items: baseline;
821
+ gap: 16px;
822
+ margin-bottom: 6px;
1877
823
  }
1878
- .auth-btn:hover:not(:disabled) {
1879
- border-color: var(--ink); background: rgba(255,255,255,0.04);
824
+ .audit-sec-eyebrow {
825
+ font-family: var(--font-mono);
826
+ font-size: 11px;
827
+ letter-spacing: 0.2em;
828
+ text-transform: uppercase;
829
+ color: var(--accent-green);
1880
830
  }
1881
- .auth-btn:disabled { opacity: 0.45; cursor: not-allowed; }
1882
- .auth-btn.primary {
1883
- border-color: var(--accent-pink);
1884
- color: var(--accent-pink);
1885
- box-shadow: 4px 4px 0 0 var(--accent-pink-shadow);
831
+ .audit-sec-eyebrow .ix { color: var(--dim); margin-right: 8px; }
832
+ .audit-sec-meta {
833
+ font-family: var(--font-mono);
834
+ font-size: 11px;
835
+ color: var(--dim);
836
+ letter-spacing: 0.04em;
1886
837
  }
1887
- .auth-btn.primary:hover:not(:disabled) {
1888
- background: var(--accent-pink); color: var(--bg);
1889
- box-shadow: 2px 2px 0 0 var(--accent-pink-shadow);
1890
- transform: translate(2px, 2px);
838
+ .audit-sec-meta strong { color: var(--ink); font-weight: 600; }
839
+ .audit-sec-title {
840
+ font-family: var(--font-mono);
841
+ font-size: 18px;
842
+ font-weight: 600;
843
+ letter-spacing: -0.01em;
844
+ color: var(--ink);
845
+ margin: 4px 0 18px;
1891
846
  }
1892
847
 
1893
- .auth-back {
1894
- align-self: flex-start;
1895
- margin-top: 4px;
1896
- background: transparent; border: none; padding: 6px 0;
1897
- font-family: var(--font-mono); font-size: 11px;
1898
- letter-spacing: 0.1em; color: var(--dim);
1899
- cursor: pointer;
1900
- transition: color 120ms;
848
+ /* ============================================================
849
+ STRENGTHS — section 02. ✓ rows.
850
+ ============================================================ */
851
+ .strength-list {
852
+ display: flex; flex-direction: column;
1901
853
  }
1902
- .auth-back:hover:not(:disabled) { color: var(--ink-2); }
1903
- .auth-back:disabled { opacity: 0.45; cursor: not-allowed; }
1904
-
1905
- @media (max-width: 520px) {
1906
- .auth-dialog { padding: 26px 22px 22px; }
1907
- .auth-actions { flex-direction: column; align-items: stretch; }
1908
- .auth-btn { justify-content: center; }
854
+ .strength-row {
855
+ display: grid;
856
+ grid-template-columns: 24px 1fr auto;
857
+ align-items: baseline;
858
+ gap: 14px;
859
+ padding: 12px 0;
860
+ border-bottom: 1px dashed var(--line);
861
+ font-family: var(--font-mono);
1909
862
  }
1910
-
1911
- /* status pill in the return CTA: shows current logged-in email */
1912
- .auth-status-pill {
1913
- display: inline-flex; align-items: center; gap: 8px;
1914
- margin-top: 16px;
1915
- padding: 6px 10px;
1916
- border: 1px dashed var(--line-2);
1917
- font-family: var(--font-mono); font-size: 11px;
1918
- letter-spacing: 0.1em;
1919
- color: var(--ink-2);
863
+ .strength-row:last-child { border-bottom: none; }
864
+ .strength-check {
865
+ color: var(--accent-green);
866
+ font-size: 14px;
867
+ line-height: 1;
1920
868
  }
1921
- .auth-status-pill .dot {
1922
- width: 7px; height: 7px;
1923
- background: var(--accent-green); display: inline-block;
1924
- box-shadow: 0 0 6px rgba(102,209,181,0.55);
869
+ .strength-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
870
+ .strength-headline {
871
+ font-size: 13px;
872
+ color: var(--ink);
873
+ letter-spacing: 0.02em;
1925
874
  }
1926
- .auth-status-pill .email { color: var(--accent-green); }
1927
-
1928
- /* responsive */
1929
- @media (max-width: 960px) {
1930
- .report { padding: 0 20px; }
1931
- .archetype-frame { padding: 32px 24px; }
1932
- .arch-body { grid-template-columns: 1fr; gap: 32px; }
1933
- .arch-meta-grid { grid-template-columns: 1fr; gap: 16px; }
1934
- .score-grid { grid-template-columns: 1fr; gap: 16px; }
1935
- .finding-body { grid-template-columns: 1fr; }
1936
- .finding-block { border-right: none !important; }
1937
- .policies-grid { grid-template-columns: 1fr; }
1938
- .share-grid { grid-template-columns: 1fr; }
1939
- .strength-row { grid-template-columns: 40px 1fr; }
1940
- .strength-metric { grid-column: 2; text-align: left; margin-top: 6px; }
1941
- .return-hook { padding: 28px 24px; }
875
+ .strength-detail {
876
+ font-size: 11px;
877
+ color: var(--ink-2);
878
+ letter-spacing: 0.02em;
1942
879
  }
1943
-
1944
- /* reduced-motion: silence the ambient terminal motion (blinking cursor,
1945
- spinner, marquee shine, status pulse) so vestibular-sensitive users get a
1946
- still UI. Functional progress (.running-bar-fill width) still updates;
1947
- only the decorative loops are stopped. */
1948
- @media (prefers-reduced-motion: reduce) {
1949
- .running-cursor,
1950
- .running-stage-spin,
1951
- .running-bar-fill::after,
1952
- .auth-status-pill .dot {
1953
- animation: none;
1954
- }
1955
- .running-bar-fill { transition: none; }
880
+ .strength-metric {
881
+ font-family: var(--font-display);
882
+ font-size: 22px;
883
+ letter-spacing: 0.04em;
884
+ color: var(--accent-green);
885
+ text-align: right;
886
+ line-height: 1;
887
+ white-space: nowrap;
1956
888
  }
1957
-
1958
- /* ──────────────── floating share dock ────────────────
1959
- Persistent share affordance pinned to the bottom-right of the audit
1960
- page. Uses the same .share-btn styling as the inline strip in
1961
- identity-section so the visual rhythm carries. The dock can be
1962
- collapsed to a single pink FAB; preference persists in sessionStorage. */
1963
-
1964
- .share-dock {
1965
- position: fixed;
1966
- right: clamp(16px, 2.5vw, 32px);
1967
- bottom: clamp(16px, 2.5vw, 32px);
1968
- z-index: 40;
1969
- width: 300px;
1970
- background: var(--bg-2);
1971
- border: 1px solid var(--line-2);
1972
- box-shadow:
1973
- 8px 8px 0 0 var(--accent-pink-shadow),
1974
- 16px 16px 0 0 rgba(0, 0, 0, 0.5);
1975
- animation: share-dock-in 320ms cubic-bezier(0.22, 1, 0.36, 1);
1976
- }
1977
- .share-dock::before,
1978
- .share-dock::after { content: ""; position: absolute; width: 10px; height: 10px; }
1979
- .share-dock::before {
1980
- top: -1px; left: -1px;
1981
- border-top: 1px solid var(--accent-pink);
1982
- border-left: 1px solid var(--accent-pink);
1983
- }
1984
- .share-dock::after {
1985
- bottom: -1px; right: -1px;
1986
- border-bottom: 1px solid var(--accent-pink);
1987
- border-right: 1px solid var(--accent-pink);
889
+ .strength-metric .unit {
890
+ display: block;
891
+ font-family: var(--font-mono);
892
+ font-size: 9px;
893
+ letter-spacing: 0.18em;
894
+ text-transform: uppercase;
895
+ color: var(--dim);
896
+ margin-top: 4px;
1988
897
  }
1989
898
 
1990
- @keyframes share-dock-in {
1991
- from { opacity: 0; transform: translate(8px, 8px); }
1992
- to { opacity: 1; transform: translate(0, 0); }
899
+ /* ============================================================
900
+ QUIRKS section 03. 4-column table.
901
+ ============================================================ */
902
+ .quirks-table { font-family: var(--font-mono); }
903
+ .quirks-thead, .quirks-row {
904
+ display: grid;
905
+ grid-template-columns: 80px 1fr 90px 100px;
906
+ gap: 14px;
907
+ align-items: center;
1993
908
  }
1994
-
1995
- .share-dock-head {
1996
- display: flex; align-items: center; justify-content: space-between;
1997
- padding: 12px 16px;
909
+ .quirks-thead {
910
+ padding: 0 0 8px;
911
+ border-bottom: 1px solid var(--line);
912
+ font-size: 10px;
913
+ color: var(--dim);
914
+ letter-spacing: 0.18em;
915
+ text-transform: uppercase;
916
+ }
917
+ .quirks-thead span:last-child { text-align: right; }
918
+ .quirks-row {
919
+ padding: 12px 0;
1998
920
  border-bottom: 1px dashed var(--line);
921
+ font-size: 12px;
1999
922
  }
2000
- .share-dock-eyebrow {
2001
- font-family: var(--font-mono); font-size: 10px;
2002
- letter-spacing: 0.22em; text-transform: uppercase;
2003
- color: var(--accent-green);
923
+ .quirks-row:last-child { border-bottom: none; }
924
+ .q-when { color: var(--dim); font-size: 11px; }
925
+ .q-what { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
926
+ .q-title { color: var(--ink); font-size: 12px; }
927
+ .q-policy {
928
+ color: var(--dim);
929
+ font-size: 10px;
2004
930
  }
2005
- .share-dock-eyebrow > span { color: var(--accent-pink); margin-right: 8px; letter-spacing: -2px; }
2006
- .share-dock-caret {
2007
- display: grid; place-items: center;
2008
- width: 24px; height: 24px;
2009
- background: transparent;
931
+ .q-policy code { color: var(--accent-green); background: transparent; }
932
+ .q-pill {
2010
933
  border: 1px solid var(--line-2);
934
+ padding: 2px 8px;
935
+ font-size: 10px;
936
+ text-align: center;
937
+ letter-spacing: 0.12em;
938
+ text-transform: uppercase;
939
+ justify-self: start;
940
+ }
941
+ .q-pill-high {
942
+ color: var(--accent-pink);
943
+ border-color: rgba(228, 88, 124, 0.4);
944
+ background: rgba(228, 88, 124, 0.06);
945
+ }
946
+ .q-pill-medium {
947
+ color: var(--amber);
948
+ border-color: rgba(232, 196, 106, 0.4);
949
+ background: var(--amber-bg);
950
+ }
951
+ .q-pill-low {
2011
952
  color: var(--ink-2);
2012
- font-family: var(--font-mono); font-size: 11px;
2013
- cursor: pointer;
2014
- transition: color 140ms cubic-bezier(0.22, 1, 0.36, 1), border-color 140ms cubic-bezier(0.22, 1, 0.36, 1);
2015
953
  }
2016
- .share-dock-caret:hover { color: var(--accent-pink); border-color: var(--accent-pink); }
2017
-
2018
- .share-dock-stack {
2019
- display: flex; flex-direction: column;
2020
- gap: 8px;
2021
- padding: 14px 14px 10px;
954
+ .q-recur {
955
+ text-align: right;
956
+ color: var(--dim);
957
+ font-size: 10px;
958
+ letter-spacing: 0.04em;
2022
959
  }
2023
- /* Dock buttons fill the dock width — same `.share-btn` skin, just full-width. */
2024
- .share-dock-stack .share-btn { width: 100%; }
2025
960
 
2026
- .share-dock-foot {
2027
- padding: 10px 16px 12px;
2028
- border-top: 1px dashed var(--line);
2029
- font-family: var(--font-mono); font-size: 10px;
2030
- letter-spacing: 0.18em; text-transform: uppercase;
2031
- color: var(--dim);
2032
- text-align: center;
961
+ /* ============================================================
962
+ HOW TO IMPROVE — section 04. Fix cards.
963
+ ============================================================ */
964
+ .audit-sec-sub {
965
+ font-family: var(--font-mono);
966
+ font-size: 12px;
967
+ color: var(--ink-2);
968
+ margin: -10px 0 18px;
969
+ line-height: 1.55;
2033
970
  }
2034
- .share-dock-foot > span { color: var(--accent-pink); margin-right: 6px; }
971
+ .audit-sec-sub strong { color: var(--ink); font-weight: 600; }
2035
972
 
2036
- /* Collapsed-state FAB — single pink-tile button that re-expands the dock. */
2037
- .share-dock-fab {
2038
- position: fixed;
2039
- right: clamp(16px, 2.5vw, 32px);
2040
- bottom: clamp(16px, 2.5vw, 32px);
2041
- z-index: 40;
2042
- width: 56px; height: 56px;
2043
- display: grid; place-items: center;
2044
- background: var(--accent-pink);
2045
- color: var(--bg);
973
+ .install-all-btn {
2046
974
  border: 1px solid var(--accent-pink);
2047
- box-shadow: 6px 6px 0 0 var(--accent-pink-shadow);
975
+ background: var(--accent-pink-bg);
976
+ color: var(--accent-pink);
977
+ padding: 8px 14px;
2048
978
  font-family: var(--font-mono);
2049
- font-size: 22px; font-weight: 700;
979
+ font-size: 11px;
980
+ letter-spacing: 0.18em;
981
+ text-transform: uppercase;
2050
982
  cursor: pointer;
2051
- transition: transform 160ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 160ms cubic-bezier(0.22, 1, 0.36, 1);
2052
- animation: share-dock-in 320ms cubic-bezier(0.22, 1, 0.36, 1);
983
+ transition: background-color 140ms ease;
2053
984
  }
2054
- .share-dock-fab:hover { transform: translate(-2px, -2px); box-shadow: 9px 9px 0 0 var(--accent-pink-shadow); }
2055
- .share-dock-fab:active { transform: translate(2px, 2px); box-shadow: 0 0 0 0 var(--accent-pink-shadow); }
985
+ .install-all-btn:hover { background: rgba(228, 88, 124, 0.18); }
2056
986
 
2057
- /* hide on mobile inline buttons cover the same affordance there */
2058
- @media (max-width: 760px) {
2059
- .share-dock, .share-dock-fab { display: none; }
987
+ .fix-list { display: flex; flex-direction: column; }
988
+ .fix-row {
989
+ display: grid;
990
+ grid-template-columns: 1fr minmax(280px, auto);
991
+ gap: 24px;
992
+ align-items: center;
993
+ padding: 14px 0;
994
+ border-bottom: 1px dashed var(--line);
2060
995
  }
2061
-
2062
- @media (prefers-reduced-motion: reduce) {
2063
- .share-dock, .share-dock-fab { animation: none; }
2064
- .share-dock-fab { transition: none; }
2065
- .share-dock-caret { transition: none; }
996
+ .fix-row:last-child { border-bottom: none; }
997
+ .fix-row-info { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
998
+ .fix-name {
999
+ font-family: var(--font-mono);
1000
+ font-size: 13px;
1001
+ color: var(--ink);
1002
+ letter-spacing: 0.01em;
1003
+ font-weight: 500;
2066
1004
  }
2067
-
2068
- /* ─────────────────────────────────────────────────────────────────────
2069
- audit-progress-strip — sticky banner pinned to the top of the viewport
2070
- while a re-audit is in flight. Pink hard-offset shadow matches the
2071
- page's `.share-btn:hover` vocabulary. Right-edge pulse is a CSS-only
2072
- keyframe (transform-only — no layout thrash) and is not a fake
2073
- progress bar.
2074
- ───────────────────────────────────────────────────────────────────── */
2075
- .audit-progress-strip {
2076
- position: sticky;
2077
- top: 0;
2078
- left: 0;
2079
- right: 0;
2080
- z-index: 60;
2081
- background: var(--bg-2);
2082
- border-bottom: 1px solid var(--accent-pink);
2083
- box-shadow: 0 4px 0 0 var(--accent-pink-shadow);
1005
+ .fix-desc {
2084
1006
  font-family: var(--font-mono);
2085
- /* Slide in from above on mount */
2086
- animation: audit-progress-slide-in 220ms cubic-bezier(0.22, 1, 0.36, 1);
1007
+ font-size: 11px;
1008
+ color: var(--ink-2);
1009
+ line-height: 1.55;
2087
1010
  }
2088
- .audit-progress-strip--failed {
2089
- border-bottom-color: var(--accent-pink);
2090
- background: linear-gradient(to right, var(--accent-pink-bg), var(--bg-2));
1011
+ .fix-row-cmd {
1012
+ display: flex; align-items: stretch; gap: 6px;
1013
+ min-width: 0;
2091
1014
  }
2092
- .audit-progress-strip__inner {
2093
- position: relative;
2094
- max-width: 1480px;
2095
- margin: 0 auto;
2096
- padding: 12px clamp(20px, 3vw, 48px);
2097
- display: flex;
2098
- align-items: center;
2099
- justify-content: space-between;
2100
- gap: 16px;
1015
+ .fix-cmd-code {
1016
+ flex: 1; min-width: 0;
1017
+ font-family: var(--font-mono);
1018
+ font-size: 11px;
1019
+ color: var(--accent-green);
1020
+ background: var(--bg);
1021
+ border: 1px solid var(--line);
1022
+ padding: 8px 12px;
1023
+ letter-spacing: 0.02em;
1024
+ white-space: nowrap;
1025
+ overflow-x: auto;
1026
+ display: flex; align-items: center;
2101
1027
  }
2102
- .audit-progress-strip__label {
2103
- display: inline-flex;
2104
- align-items: center;
2105
- gap: 10px;
2106
- color: var(--ink);
1028
+ .copy-icon-btn {
1029
+ border: 1px solid var(--line);
1030
+ background: var(--bg);
1031
+ color: var(--ink-2);
1032
+ padding: 0 10px;
1033
+ font-family: var(--font-mono);
2107
1034
  font-size: 12px;
2108
- letter-spacing: 0.06em;
2109
- text-transform: lowercase;
1035
+ cursor: pointer;
1036
+ transition: color 140ms ease, border-color 140ms ease;
1037
+ display: inline-flex; align-items: center; justify-content: center;
1038
+ min-width: 36px;
2110
1039
  }
2111
- .audit-progress-strip--failed .audit-progress-strip__label { color: var(--accent-pink); }
2112
- .audit-progress-strip__elapsed {
2113
- font-variant-numeric: tabular-nums;
2114
- font-size: 12px;
1040
+ .copy-icon-btn:hover {
2115
1041
  color: var(--accent-pink);
2116
- letter-spacing: 0.08em;
2117
- }
2118
- .audit-progress-strip__spinner {
2119
- width: 9px;
2120
- height: 9px;
2121
- border-radius: 50%;
2122
- background: transparent;
2123
- border: 1.5px solid var(--accent-pink);
2124
- border-top-color: transparent;
2125
- animation: audit-progress-spin 800ms linear infinite;
1042
+ border-color: var(--accent-pink);
2126
1043
  }
2127
- .audit-progress-strip__x {
2128
- display: inline-flex;
2129
- align-items: center;
2130
- justify-content: center;
2131
- width: 14px;
2132
- height: 14px;
2133
- border: 1px solid var(--accent-pink);
2134
- color: var(--accent-pink);
2135
- font-size: 11px;
2136
- line-height: 1;
1044
+
1045
+ /* ============================================================
1046
+ COME BACK BETTER — section 05. Two cards.
1047
+ ============================================================ */
1048
+ .cbb-grid {
1049
+ display: grid;
1050
+ grid-template-columns: 1fr 1fr;
1051
+ gap: 14px;
2137
1052
  }
2138
- .audit-progress-strip__dismiss {
2139
- background: transparent;
1053
+ .cbb-card {
2140
1054
  border: 1px solid var(--line-2);
1055
+ background: var(--bg-2);
1056
+ padding: 18px 20px;
1057
+ display: flex; flex-direction: column;
1058
+ gap: 12px;
1059
+ }
1060
+ .cbb-card-title {
1061
+ font-family: var(--font-mono);
1062
+ font-size: 14px;
1063
+ color: var(--ink);
1064
+ letter-spacing: 0.02em;
1065
+ }
1066
+ .cbb-card-sub {
1067
+ font-family: var(--font-mono);
1068
+ font-size: 11px;
2141
1069
  color: var(--ink-2);
2142
- padding: 5px 10px;
1070
+ line-height: 1.55;
1071
+ }
1072
+
1073
+ .cadence-row { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 2px; }
1074
+ .cadence-btn {
2143
1075
  font-family: var(--font-mono);
2144
1076
  font-size: 11px;
2145
- text-transform: lowercase;
2146
- letter-spacing: 0.06em;
1077
+ letter-spacing: 0.04em;
1078
+ border: 1px solid var(--line-2);
1079
+ background: transparent;
1080
+ color: var(--ink);
1081
+ padding: 6px 12px;
2147
1082
  cursor: pointer;
2148
- transition: border-color 140ms ease, color 140ms ease;
1083
+ transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease;
2149
1084
  }
2150
- .audit-progress-strip__dismiss:hover {
1085
+ .cadence-btn:hover {
2151
1086
  border-color: var(--accent-pink);
2152
1087
  color: var(--accent-pink);
2153
1088
  }
2154
- .audit-progress-strip__pulse {
2155
- position: absolute;
2156
- bottom: -1px;
2157
- left: 0;
2158
- right: 0;
2159
- height: 1px;
2160
- background: linear-gradient(
2161
- 90deg,
2162
- transparent 0%,
2163
- var(--accent-pink) 20%,
2164
- var(--accent-pink) 80%,
2165
- transparent 100%
2166
- );
2167
- transform-origin: left center;
2168
- animation: audit-progress-pulse 2400ms cubic-bezier(0.55, 0.1, 0.45, 0.9) infinite;
1089
+ .cadence-btn.on {
1090
+ border-color: var(--accent-pink);
1091
+ background: var(--accent-pink-bg);
1092
+ color: var(--accent-pink);
2169
1093
  }
2170
- @keyframes audit-progress-spin {
2171
- to { transform: rotate(360deg); }
1094
+ .cadence-btn:disabled { opacity: 0.5; cursor: not-allowed; }
1095
+
1096
+ .cbb-link {
1097
+ align-self: flex-start;
1098
+ background: transparent;
1099
+ border: none;
1100
+ color: var(--accent-green);
1101
+ font-family: var(--font-mono);
1102
+ font-size: 11px;
1103
+ letter-spacing: 0.04em;
1104
+ cursor: pointer;
1105
+ padding: 0;
2172
1106
  }
2173
- @keyframes audit-progress-pulse {
2174
- 0% { transform: scaleX(0) translateX(0%); opacity: 0.4; }
2175
- 50% { transform: scaleX(0.6) translateX(20%); opacity: 1; }
2176
- 100% { transform: scaleX(0) translateX(100%); opacity: 0.2; }
1107
+ .cbb-link:hover { color: var(--accent-pink); }
1108
+ .cbb-link:disabled { opacity: 0.55; cursor: wait; }
1109
+
1110
+ .perks-progress {
1111
+ height: 6px;
1112
+ background: var(--bg);
1113
+ border: 1px solid var(--line-2);
1114
+ position: relative;
1115
+ margin: 4px 0;
2177
1116
  }
2178
- @keyframes audit-progress-slide-in {
2179
- from { transform: translateY(-100%); opacity: 0; }
2180
- to { transform: translateY(0); opacity: 1; }
1117
+ .perks-progress span {
1118
+ display: block;
1119
+ height: 100%;
1120
+ background: var(--accent-pink);
1121
+ transition: width 240ms ease;
2181
1122
  }
2182
- @media (prefers-reduced-motion: reduce) {
2183
- .audit-progress-strip { animation: none; }
2184
- .audit-progress-strip__spinner { animation: none; border-top-color: var(--accent-pink); }
2185
- .audit-progress-strip__pulse { animation: none; opacity: 0.4; transform: scaleX(0.4) translateX(30%); }
1123
+ .perks-meta {
1124
+ font-family: var(--font-mono);
1125
+ font-size: 11px;
1126
+ color: var(--ink-2);
1127
+ }
1128
+ .perks-meta strong { color: var(--accent-pink); font-weight: 600; }
1129
+ .invite-btn {
1130
+ align-self: flex-start;
1131
+ border: 1px solid var(--accent-pink);
1132
+ background: var(--accent-pink-bg);
1133
+ color: var(--accent-pink);
1134
+ padding: 8px 14px;
1135
+ font-family: var(--font-mono);
1136
+ font-size: 11px;
1137
+ letter-spacing: 0.18em;
1138
+ text-transform: uppercase;
1139
+ cursor: pointer;
1140
+ transition: background-color 140ms ease;
1141
+ }
1142
+ .invite-btn:hover { background: rgba(228, 88, 124, 0.18); }
1143
+
1144
+ .invite-textarea {
1145
+ width: 100%;
1146
+ resize: vertical;
1147
+ min-height: 90px;
1148
+ font-size: 13px;
1149
+ line-height: 1.45;
1150
+ letter-spacing: 0.02em;
1151
+ }
1152
+ .invite-summary {
1153
+ display: flex; flex-wrap: wrap; gap: 12px;
1154
+ margin-top: 6px;
1155
+ font-family: var(--font-mono);
1156
+ font-size: 11px;
1157
+ color: var(--dim);
2186
1158
  }
1159
+ .invite-summary .invite-valid { color: var(--accent-green); }
1160
+ .invite-summary .invite-invalid { color: var(--accent-pink); }
1161
+ .cbb-foot {
1162
+ font-family: var(--font-mono);
1163
+ font-size: 10px;
1164
+ color: var(--dim);
1165
+ margin-top: 4px;
1166
+ }
1167
+
1168
+ @media (max-width: 720px) {
1169
+ .cbb-grid { grid-template-columns: 1fr; }
1170
+ .fix-row { grid-template-columns: 1fr; gap: 8px; }
1171
+ .fix-row-cmd { min-width: 0; }
1172
+ .quirks-thead, .quirks-row {
1173
+ grid-template-columns: 1fr;
1174
+ gap: 6px;
1175
+ padding: 16px 0;
1176
+ }
1177
+ .quirks-thead { display: none; }
1178
+ }