prism0x2a 0.6.1 → 0.7.2

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 (439) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +24 -0
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/routes-manifest.json +24 -0
  7. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  18. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/amber/capabilities/[id]/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/amber/capabilities/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/amber/capabilities.html +1 -1
  26. package/.next/standalone/.next/server/app/amber/capabilities.rsc +3 -3
  27. package/.next/standalone/.next/server/app/amber/capabilities.segments/_full.segment.rsc +3 -3
  28. package/.next/standalone/.next/server/app/amber/capabilities.segments/_head.segment.rsc +1 -1
  29. package/.next/standalone/.next/server/app/amber/capabilities.segments/_index.segment.rsc +2 -2
  30. package/.next/standalone/.next/server/app/amber/capabilities.segments/_tree.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/amber/capabilities.segments/amber/capabilities/__PAGE__.segment.rsc +2 -2
  32. package/.next/standalone/.next/server/app/amber/capabilities.segments/amber/capabilities.segment.rsc +1 -1
  33. package/.next/standalone/.next/server/app/amber/capabilities.segments/amber.segment.rsc +1 -1
  34. package/.next/standalone/.next/server/app/amber/coverage/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/amber/coverage.html +1 -1
  36. package/.next/standalone/.next/server/app/amber/coverage.rsc +3 -3
  37. package/.next/standalone/.next/server/app/amber/coverage.segments/_full.segment.rsc +3 -3
  38. package/.next/standalone/.next/server/app/amber/coverage.segments/_head.segment.rsc +1 -1
  39. package/.next/standalone/.next/server/app/amber/coverage.segments/_index.segment.rsc +2 -2
  40. package/.next/standalone/.next/server/app/amber/coverage.segments/_tree.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/amber/coverage.segments/amber/coverage/__PAGE__.segment.rsc +2 -2
  42. package/.next/standalone/.next/server/app/amber/coverage.segments/amber/coverage.segment.rsc +1 -1
  43. package/.next/standalone/.next/server/app/amber/coverage.segments/amber.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/app/amber/files/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/amber/files.html +1 -1
  46. package/.next/standalone/.next/server/app/amber/files.rsc +3 -3
  47. package/.next/standalone/.next/server/app/amber/files.segments/_full.segment.rsc +3 -3
  48. package/.next/standalone/.next/server/app/amber/files.segments/_head.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app/amber/files.segments/_index.segment.rsc +2 -2
  50. package/.next/standalone/.next/server/app/amber/files.segments/_tree.segment.rsc +2 -2
  51. package/.next/standalone/.next/server/app/amber/files.segments/amber/files/__PAGE__.segment.rsc +2 -2
  52. package/.next/standalone/.next/server/app/amber/files.segments/amber/files.segment.rsc +1 -1
  53. package/.next/standalone/.next/server/app/amber/files.segments/amber.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/amber/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/amber.html +1 -1
  56. package/.next/standalone/.next/server/app/amber.rsc +3 -3
  57. package/.next/standalone/.next/server/app/amber.segments/_full.segment.rsc +3 -3
  58. package/.next/standalone/.next/server/app/amber.segments/_head.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/amber.segments/_index.segment.rsc +2 -2
  60. package/.next/standalone/.next/server/app/amber.segments/_tree.segment.rsc +2 -2
  61. package/.next/standalone/.next/server/app/amber.segments/amber/__PAGE__.segment.rsc +2 -2
  62. package/.next/standalone/.next/server/app/amber.segments/amber.segment.rsc +1 -1
  63. package/.next/standalone/.next/server/app/api/amber/capabilities/[id]/route.js +1 -1
  64. package/.next/standalone/.next/server/app/api/amber/capabilities/[id]/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/amber/capabilities/route.js +1 -1
  66. package/.next/standalone/.next/server/app/api/amber/capabilities/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/amber/files/route.js +1 -1
  68. package/.next/standalone/.next/server/app/api/amber/files/route.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/api/amber/registry/route.js +1 -1
  70. package/.next/standalone/.next/server/app/api/amber/registry/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/amber/scan/route.js +1 -1
  72. package/.next/standalone/.next/server/app/api/amber/scan/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/blue/recommendations/route.js +1 -1
  74. package/.next/standalone/.next/server/app/api/blue/recommendations/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/blue/scan/route.js +4 -4
  76. package/.next/standalone/.next/server/app/api/blue/scan/route.js.nft.json +1 -1
  77. package/.next/standalone/.next/server/app/api/blue/sessions/[id]/route.js +1 -1
  78. package/.next/standalone/.next/server/app/api/blue/sessions/[id]/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/config/test/route.js +1 -1
  80. package/.next/standalone/.next/server/app/api/config/test/route.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/api/green/cross-layer/route.js +1 -1
  82. package/.next/standalone/.next/server/app/api/green/cross-layer/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/green/insights/[id]/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/green/insights/[id]/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/green/insights/route.js +1 -1
  86. package/.next/standalone/.next/server/app/api/green/insights/route.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/api/green/queries/[id]/route.js +1 -1
  88. package/.next/standalone/.next/server/app/api/green/queries/[id]/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/green/queries/[id]/run/route.js +1 -1
  90. package/.next/standalone/.next/server/app/api/green/queries/[id]/run/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/green/queries/route.js +1 -1
  92. package/.next/standalone/.next/server/app/api/green/queries/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/license/activate/route/app-paths-manifest.json +3 -0
  94. package/.next/standalone/.next/server/app/api/license/activate/route/build-manifest.json +9 -0
  95. package/.next/standalone/.next/server/app/api/license/activate/route/server-reference-manifest.json +4 -0
  96. package/.next/standalone/.next/server/app/api/license/activate/route.js +6 -0
  97. package/.next/standalone/.next/server/app/api/license/activate/route.js.map +5 -0
  98. package/.next/standalone/.next/server/app/api/license/activate/route.js.nft.json +1 -0
  99. package/.next/standalone/.next/server/app/api/license/activate/route_client-reference-manifest.js +3 -0
  100. package/.next/standalone/.next/server/app/api/license/deactivate/route/app-paths-manifest.json +3 -0
  101. package/.next/standalone/.next/server/app/api/license/deactivate/route/build-manifest.json +9 -0
  102. package/.next/standalone/.next/server/app/api/license/deactivate/route/server-reference-manifest.json +4 -0
  103. package/.next/standalone/.next/server/app/api/license/deactivate/route.js +6 -0
  104. package/.next/standalone/.next/server/app/api/license/deactivate/route.js.map +5 -0
  105. package/.next/standalone/.next/server/app/api/license/deactivate/route.js.nft.json +1 -0
  106. package/.next/standalone/.next/server/app/api/license/deactivate/route_client-reference-manifest.js +3 -0
  107. package/.next/standalone/.next/server/app/api/license/route.js +1 -1
  108. package/.next/standalone/.next/server/app/api/license/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/license/validate/route/app-paths-manifest.json +3 -0
  110. package/.next/standalone/.next/server/app/api/license/validate/route/build-manifest.json +9 -0
  111. package/.next/standalone/.next/server/app/api/license/validate/route/server-reference-manifest.json +4 -0
  112. package/.next/standalone/.next/server/app/api/license/validate/route.js +6 -0
  113. package/.next/standalone/.next/server/app/api/license/validate/route.js.map +5 -0
  114. package/.next/standalone/.next/server/app/api/license/validate/route.js.nft.json +1 -0
  115. package/.next/standalone/.next/server/app/api/license/validate/route_client-reference-manifest.js +3 -0
  116. package/.next/standalone/.next/server/app/api/monorepo/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/scan/route.js +1 -1
  118. package/.next/standalone/.next/server/app/api/scan/route.js.nft.json +1 -1
  119. package/.next/standalone/.next/server/app/blue/page_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/blue/recommendations/[id]/page_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/blue/recommendations/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/blue/recommendations.html +1 -1
  123. package/.next/standalone/.next/server/app/blue/recommendations.rsc +3 -3
  124. package/.next/standalone/.next/server/app/blue/recommendations.segments/_full.segment.rsc +3 -3
  125. package/.next/standalone/.next/server/app/blue/recommendations.segments/_head.segment.rsc +1 -1
  126. package/.next/standalone/.next/server/app/blue/recommendations.segments/_index.segment.rsc +2 -2
  127. package/.next/standalone/.next/server/app/blue/recommendations.segments/_tree.segment.rsc +2 -2
  128. package/.next/standalone/.next/server/app/blue/recommendations.segments/blue/recommendations/__PAGE__.segment.rsc +2 -2
  129. package/.next/standalone/.next/server/app/blue/recommendations.segments/blue/recommendations.segment.rsc +1 -1
  130. package/.next/standalone/.next/server/app/blue/recommendations.segments/blue.segment.rsc +1 -1
  131. package/.next/standalone/.next/server/app/blue/sessions/[id]/page_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/blue/sessions/page_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/blue/sessions.html +1 -1
  134. package/.next/standalone/.next/server/app/blue/sessions.rsc +3 -3
  135. package/.next/standalone/.next/server/app/blue/sessions.segments/_full.segment.rsc +3 -3
  136. package/.next/standalone/.next/server/app/blue/sessions.segments/_head.segment.rsc +1 -1
  137. package/.next/standalone/.next/server/app/blue/sessions.segments/_index.segment.rsc +2 -2
  138. package/.next/standalone/.next/server/app/blue/sessions.segments/_tree.segment.rsc +2 -2
  139. package/.next/standalone/.next/server/app/blue/sessions.segments/blue/sessions/__PAGE__.segment.rsc +2 -2
  140. package/.next/standalone/.next/server/app/blue/sessions.segments/blue/sessions.segment.rsc +1 -1
  141. package/.next/standalone/.next/server/app/blue/sessions.segments/blue.segment.rsc +1 -1
  142. package/.next/standalone/.next/server/app/blue.html +1 -1
  143. package/.next/standalone/.next/server/app/blue.rsc +3 -3
  144. package/.next/standalone/.next/server/app/blue.segments/_full.segment.rsc +3 -3
  145. package/.next/standalone/.next/server/app/blue.segments/_head.segment.rsc +1 -1
  146. package/.next/standalone/.next/server/app/blue.segments/_index.segment.rsc +2 -2
  147. package/.next/standalone/.next/server/app/blue.segments/_tree.segment.rsc +2 -2
  148. package/.next/standalone/.next/server/app/blue.segments/blue/__PAGE__.segment.rsc +2 -2
  149. package/.next/standalone/.next/server/app/blue.segments/blue.segment.rsc +1 -1
  150. package/.next/standalone/.next/server/app/green/cross-layer/page_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/green/cross-layer.html +1 -1
  152. package/.next/standalone/.next/server/app/green/cross-layer.rsc +3 -3
  153. package/.next/standalone/.next/server/app/green/cross-layer.segments/_full.segment.rsc +3 -3
  154. package/.next/standalone/.next/server/app/green/cross-layer.segments/_head.segment.rsc +1 -1
  155. package/.next/standalone/.next/server/app/green/cross-layer.segments/_index.segment.rsc +2 -2
  156. package/.next/standalone/.next/server/app/green/cross-layer.segments/_tree.segment.rsc +2 -2
  157. package/.next/standalone/.next/server/app/green/cross-layer.segments/green/cross-layer/__PAGE__.segment.rsc +2 -2
  158. package/.next/standalone/.next/server/app/green/cross-layer.segments/green/cross-layer.segment.rsc +1 -1
  159. package/.next/standalone/.next/server/app/green/cross-layer.segments/green.segment.rsc +1 -1
  160. package/.next/standalone/.next/server/app/green/insights/[id]/page_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/green/insights/page_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/green/insights.html +1 -1
  163. package/.next/standalone/.next/server/app/green/insights.rsc +3 -3
  164. package/.next/standalone/.next/server/app/green/insights.segments/_full.segment.rsc +3 -3
  165. package/.next/standalone/.next/server/app/green/insights.segments/_head.segment.rsc +1 -1
  166. package/.next/standalone/.next/server/app/green/insights.segments/_index.segment.rsc +2 -2
  167. package/.next/standalone/.next/server/app/green/insights.segments/_tree.segment.rsc +2 -2
  168. package/.next/standalone/.next/server/app/green/insights.segments/green/insights/__PAGE__.segment.rsc +2 -2
  169. package/.next/standalone/.next/server/app/green/insights.segments/green/insights.segment.rsc +1 -1
  170. package/.next/standalone/.next/server/app/green/insights.segments/green.segment.rsc +1 -1
  171. package/.next/standalone/.next/server/app/green/page_client-reference-manifest.js +1 -1
  172. package/.next/standalone/.next/server/app/green/queries/[id]/page_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/green/queries/page_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/green/queries.html +1 -1
  175. package/.next/standalone/.next/server/app/green/queries.rsc +3 -3
  176. package/.next/standalone/.next/server/app/green/queries.segments/_full.segment.rsc +3 -3
  177. package/.next/standalone/.next/server/app/green/queries.segments/_head.segment.rsc +1 -1
  178. package/.next/standalone/.next/server/app/green/queries.segments/_index.segment.rsc +2 -2
  179. package/.next/standalone/.next/server/app/green/queries.segments/_tree.segment.rsc +2 -2
  180. package/.next/standalone/.next/server/app/green/queries.segments/green/queries/__PAGE__.segment.rsc +2 -2
  181. package/.next/standalone/.next/server/app/green/queries.segments/green/queries.segment.rsc +1 -1
  182. package/.next/standalone/.next/server/app/green/queries.segments/green.segment.rsc +1 -1
  183. package/.next/standalone/.next/server/app/green.html +1 -1
  184. package/.next/standalone/.next/server/app/green.rsc +3 -3
  185. package/.next/standalone/.next/server/app/green.segments/_full.segment.rsc +3 -3
  186. package/.next/standalone/.next/server/app/green.segments/_head.segment.rsc +1 -1
  187. package/.next/standalone/.next/server/app/green.segments/_index.segment.rsc +2 -2
  188. package/.next/standalone/.next/server/app/green.segments/_tree.segment.rsc +2 -2
  189. package/.next/standalone/.next/server/app/green.segments/green/__PAGE__.segment.rsc +2 -2
  190. package/.next/standalone/.next/server/app/green.segments/green.segment.rsc +1 -1
  191. package/.next/standalone/.next/server/app/index.html +1 -1
  192. package/.next/standalone/.next/server/app/index.rsc +3 -3
  193. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  194. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  195. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  196. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  197. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  198. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/pricing/page/app-paths-manifest.json +3 -0
  200. package/.next/standalone/.next/server/app/pricing/page/build-manifest.json +16 -0
  201. package/.next/standalone/.next/server/app/pricing/page/next-font-manifest.json +10 -0
  202. package/.next/standalone/.next/server/app/pricing/page/react-loadable-manifest.json +1 -0
  203. package/.next/standalone/.next/server/app/pricing/page/server-reference-manifest.json +4 -0
  204. package/.next/standalone/.next/server/app/pricing/page.js +14 -0
  205. package/.next/standalone/.next/server/app/pricing/page.js.map +5 -0
  206. package/.next/standalone/.next/server/app/pricing/page.js.nft.json +1 -0
  207. package/.next/standalone/.next/server/app/pricing/page_client-reference-manifest.js +3 -0
  208. package/.next/standalone/.next/server/app/pricing.html +1 -0
  209. package/.next/standalone/.next/server/app/pricing.meta +15 -0
  210. package/.next/standalone/.next/server/app/pricing.rsc +21 -0
  211. package/.next/standalone/.next/server/app/pricing.segments/_full.segment.rsc +21 -0
  212. package/.next/standalone/.next/server/app/pricing.segments/_head.segment.rsc +6 -0
  213. package/.next/standalone/.next/server/app/pricing.segments/_index.segment.rsc +5 -0
  214. package/.next/standalone/.next/server/app/pricing.segments/_tree.segment.rsc +3 -0
  215. package/.next/standalone/.next/server/app/pricing.segments/pricing/__PAGE__.segment.rsc +9 -0
  216. package/.next/standalone/.next/server/app/pricing.segments/pricing.segment.rsc +5 -0
  217. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  218. package/.next/standalone/.next/server/app/settings.html +2 -2
  219. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  220. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  221. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  222. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  223. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  224. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  225. package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  226. package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
  227. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xv4rrt._.js → [root-of-the-server]__04187lj._.js} +2 -2
  228. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0o~b3pl._.js → [root-of-the-server]__057dm7o._.js} +2 -2
  229. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08rxe0c._.js +1 -1
  230. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09l4tge._.js +3 -0
  231. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-m3qqb._.js → [root-of-the-server]__09snvkf._.js} +2 -2
  232. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0m54e40._.js → [root-of-the-server]__0ae2a50._.js} +2 -2
  233. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d_1-q9._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sqgu0x._.js → [root-of-the-server]__0e-cuw5._.js} +2 -2
  235. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z3su._._.js → [root-of-the-server]__0ei452y._.js} +2 -2
  236. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j4r.sn._.js → [root-of-the-server]__0fxxbt1._.js} +2 -2
  237. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~pq-2q._.js → [root-of-the-server]__0jwdt56._.js} +2 -2
  238. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0idrx7n._.js → [root-of-the-server]__0kgqm5d._.js} +2 -2
  239. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lut4-l._.js → [root-of-the-server]__0m_11-d._.js} +2 -2
  240. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__13u~wki._.js → [root-of-the-server]__0mh73gz._.js} +2 -2
  241. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0p0b_67._.js +3 -0
  242. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0i7owf4._.js → [root-of-the-server]__0s130_c._.js} +2 -2
  243. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0skt4tx._.js +3 -0
  244. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xbagnl._.js → [root-of-the-server]__0v3_gr6._.js} +2 -2
  245. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~f~0tr._.js → [root-of-the-server]__119q6r9._.js} +2 -2
  246. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-61.35._.js → [root-of-the-server]__12glosw._.js} +2 -2
  247. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13.5op0._.js +3 -0
  248. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_license_activate_route_actions_0jh6t~s.js +3 -0
  249. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_license_deactivate_route_actions_0tmpd4n.js +3 -0
  250. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_license_validate_route_actions_0lhsct4.js +3 -0
  251. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0es1n-0._.js +3 -0
  252. package/.next/standalone/.next/server/chunks/ssr/_0a2egyj._.js +1 -1
  253. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_pricing_page_actions_0gvv0qw.js +3 -0
  254. package/.next/standalone/.next/server/chunks/ssr/app_amber_capabilities_[id]_page_tsx_12~.miw._.js +1 -1
  255. package/.next/standalone/.next/server/chunks/ssr/app_amber_capabilities_page_tsx_0.t9mpr._.js +1 -1
  256. package/.next/standalone/.next/server/chunks/ssr/app_amber_coverage_page_tsx_01yia_n._.js +1 -1
  257. package/.next/standalone/.next/server/chunks/ssr/app_amber_files_page_tsx_00pdkc~._.js +1 -1
  258. package/.next/standalone/.next/server/chunks/ssr/app_amber_page_tsx_0ihx6zl._.js +1 -1
  259. package/.next/standalone/.next/server/chunks/ssr/app_blue_page_tsx_0zg5eg-._.js +1 -1
  260. package/.next/standalone/.next/server/chunks/ssr/app_blue_recommendations_[id]_page_tsx_10zzlnx._.js +1 -1
  261. package/.next/standalone/.next/server/chunks/ssr/app_blue_recommendations_page_tsx_08w-50l._.js +1 -1
  262. package/.next/standalone/.next/server/chunks/ssr/app_blue_sessions_[id]_page_tsx_0_~w1xj._.js +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/app_blue_sessions_page_tsx_0kbuf.c._.js +1 -1
  264. package/.next/standalone/.next/server/chunks/ssr/app_green_cross-layer_page_tsx_0a80o-~._.js +1 -1
  265. package/.next/standalone/.next/server/chunks/ssr/app_green_insights_[id]_page_tsx_0se6uk1._.js +1 -1
  266. package/.next/standalone/.next/server/chunks/ssr/app_green_insights_page_tsx_04g8_lf._.js +1 -1
  267. package/.next/standalone/.next/server/chunks/ssr/app_green_page_tsx_10g2g6w._.js +1 -1
  268. package/.next/standalone/.next/server/chunks/ssr/app_green_queries_[id]_page_tsx_0hg.qma._.js +1 -1
  269. package/.next/standalone/.next/server/chunks/ssr/app_green_queries_page_tsx_0.p0r7z._.js +1 -1
  270. package/.next/standalone/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +1 -1
  271. package/.next/standalone/.next/server/chunks/ssr/app_pricing_page_tsx_0uxncj9._.js +3 -0
  272. package/.next/standalone/.next/server/chunks/ssr/app_settings_page_tsx_0~q~t-v._.js +1 -1
  273. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09d0h78.js +4 -0
  274. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  275. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  276. package/.next/standalone/.next/server/next-font-manifest.json +3 -0
  277. package/.next/standalone/.next/server/pages/404.html +1 -1
  278. package/.next/standalone/.next/server/pages/500.html +1 -1
  279. package/.next/standalone/.next/static/chunks/0-nogwaahf00r.js +1 -0
  280. package/.next/standalone/.next/static/chunks/0-ozct-0~_~y0.js +1 -0
  281. package/.next/standalone/.next/static/chunks/0043va.q9c120.js +1 -0
  282. package/.next/standalone/.next/static/chunks/0062k_6y6ie8k.js +1 -0
  283. package/.next/standalone/.next/static/chunks/01x6uo5zvt23j.js +1 -0
  284. package/.next/standalone/.next/static/chunks/03f4g06bhu.q-.js +1 -0
  285. package/.next/standalone/.next/static/chunks/06ciexs8mfsoh.js +1 -0
  286. package/.next/standalone/.next/static/chunks/06lbhw~p794rn.js +1 -0
  287. package/.next/standalone/.next/static/chunks/0921_~z_rxr9h.js +1 -0
  288. package/.next/standalone/.next/static/chunks/0_uy4bqezjrpu.js +1 -0
  289. package/.next/standalone/.next/static/chunks/0aqr1e8db8tr2.js +1 -0
  290. package/.next/standalone/.next/static/chunks/0gtjarbzj_b0s.js +1 -0
  291. package/.next/standalone/.next/static/chunks/0i826dpus7xfj.js +1 -0
  292. package/.next/standalone/.next/static/chunks/0l.f7bl92nc~2.css +2 -0
  293. package/.next/standalone/.next/static/chunks/0mtsra7dpsxy_.js +1 -0
  294. package/.next/standalone/.next/static/chunks/0nc15zt~yfrj3.js +1 -0
  295. package/.next/standalone/.next/static/chunks/0ptkiyk6p_hgq.js +1 -0
  296. package/.next/standalone/.next/static/chunks/0vsoyv8nkj.rx.js +1 -0
  297. package/.next/standalone/.next/static/chunks/0zpu7b02c6huw.js +1 -0
  298. package/.next/standalone/.next/static/chunks/10ibvf69namr1.js +1 -0
  299. package/.next/standalone/.next/static/chunks/1655x4_8fq5li.js +1 -0
  300. package/.next/standalone/.next/static/static/chunks/0-nogwaahf00r.js +1 -0
  301. package/.next/standalone/.next/static/static/chunks/0-ozct-0~_~y0.js +1 -0
  302. package/.next/standalone/.next/static/static/chunks/0043va.q9c120.js +1 -0
  303. package/.next/standalone/.next/static/static/chunks/0062k_6y6ie8k.js +1 -0
  304. package/.next/standalone/.next/static/static/chunks/01x6uo5zvt23j.js +1 -0
  305. package/.next/standalone/.next/static/static/chunks/03f4g06bhu.q-.js +1 -0
  306. package/.next/standalone/.next/static/static/chunks/06ciexs8mfsoh.js +1 -0
  307. package/.next/standalone/.next/static/static/chunks/06lbhw~p794rn.js +1 -0
  308. package/.next/standalone/.next/static/static/chunks/0921_~z_rxr9h.js +1 -0
  309. package/.next/standalone/.next/static/static/chunks/0_uy4bqezjrpu.js +1 -0
  310. package/.next/standalone/.next/static/static/chunks/0aqr1e8db8tr2.js +1 -0
  311. package/.next/standalone/.next/static/static/chunks/0gtjarbzj_b0s.js +1 -0
  312. package/.next/standalone/.next/static/static/chunks/0i826dpus7xfj.js +1 -0
  313. package/.next/standalone/.next/static/static/chunks/0l.f7bl92nc~2.css +2 -0
  314. package/.next/standalone/.next/static/static/chunks/0mtsra7dpsxy_.js +1 -0
  315. package/.next/standalone/.next/static/static/chunks/0nc15zt~yfrj3.js +1 -0
  316. package/.next/standalone/.next/static/static/chunks/0ptkiyk6p_hgq.js +1 -0
  317. package/.next/standalone/.next/static/static/chunks/0vsoyv8nkj.rx.js +1 -0
  318. package/.next/standalone/.next/static/static/chunks/0zpu7b02c6huw.js +1 -0
  319. package/.next/standalone/.next/static/static/chunks/10ibvf69namr1.js +1 -0
  320. package/.next/standalone/.next/static/static/chunks/1655x4_8fq5li.js +1 -0
  321. package/.next/standalone/CHANGELOG.md +78 -0
  322. package/.next/standalone/app/api/blue/scan/route.ts +12 -0
  323. package/.next/standalone/app/api/license/activate/route.ts +41 -0
  324. package/.next/standalone/app/api/license/deactivate/route.ts +22 -0
  325. package/.next/standalone/app/api/license/route.ts +23 -3
  326. package/.next/standalone/app/api/license/validate/route.ts +23 -0
  327. package/.next/standalone/app/pricing/page.tsx +289 -0
  328. package/.next/standalone/app/settings/page.tsx +180 -59
  329. package/.next/standalone/components/PrismDock.tsx +1 -0
  330. package/.next/standalone/components/pricing/BillingToggle.tsx +53 -0
  331. package/.next/standalone/components/pricing/FeatureList.tsx +19 -0
  332. package/.next/standalone/components/pricing/PricingCard.tsx +120 -0
  333. package/.next/standalone/docs/strategy/monetization-thinking.md +164 -0
  334. package/.next/standalone/lib/prism/features.shared.ts +15 -5
  335. package/.next/standalone/lib/prism/features.ts +9 -5
  336. package/.next/standalone/lib/prism/hooks/useLicense.ts +26 -2
  337. package/.next/standalone/lib/prism/lemonsqueezy/client.ts +162 -0
  338. package/.next/standalone/lib/prism/lemonsqueezy/tierMapping.ts +26 -0
  339. package/.next/standalone/lib/prism/license/lemonsqueezy.ts +142 -0
  340. package/.next/standalone/lib/prism/license/store.ts +17 -8
  341. package/.next/standalone/lib/prism/license/types.ts +35 -11
  342. package/.next/standalone/lib/prism/license/validate.ts +40 -11
  343. package/.next/standalone/package.json +2 -2
  344. package/.next/standalone/server.js +1 -1
  345. package/.next/standalone/tsconfig.tsbuildinfo +1 -1
  346. package/.next/static/chunks/0-nogwaahf00r.js +1 -0
  347. package/.next/static/chunks/0-ozct-0~_~y0.js +1 -0
  348. package/.next/static/chunks/0043va.q9c120.js +1 -0
  349. package/.next/static/chunks/0062k_6y6ie8k.js +1 -0
  350. package/.next/static/chunks/01x6uo5zvt23j.js +1 -0
  351. package/.next/static/chunks/03f4g06bhu.q-.js +1 -0
  352. package/.next/static/chunks/06ciexs8mfsoh.js +1 -0
  353. package/.next/static/chunks/06lbhw~p794rn.js +1 -0
  354. package/.next/static/chunks/0921_~z_rxr9h.js +1 -0
  355. package/.next/static/chunks/0_uy4bqezjrpu.js +1 -0
  356. package/.next/static/chunks/0aqr1e8db8tr2.js +1 -0
  357. package/.next/static/chunks/0gtjarbzj_b0s.js +1 -0
  358. package/.next/static/chunks/0i826dpus7xfj.js +1 -0
  359. package/.next/static/chunks/0l.f7bl92nc~2.css +2 -0
  360. package/.next/static/chunks/0mtsra7dpsxy_.js +1 -0
  361. package/.next/static/chunks/0nc15zt~yfrj3.js +1 -0
  362. package/.next/static/chunks/0ptkiyk6p_hgq.js +1 -0
  363. package/.next/static/chunks/0vsoyv8nkj.rx.js +1 -0
  364. package/.next/static/chunks/0zpu7b02c6huw.js +1 -0
  365. package/.next/static/chunks/10ibvf69namr1.js +1 -0
  366. package/.next/static/chunks/1655x4_8fq5li.js +1 -0
  367. package/CHANGELOG.md +78 -0
  368. package/package.json +2 -2
  369. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c4z._.._.js +0 -3
  370. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tsv3gt._.js +0 -3
  371. package/.next/standalone/.next/static/chunks/06w_r5ib1et20.css +0 -2
  372. package/.next/standalone/.next/static/chunks/07c3wweseos.8.js +0 -1
  373. package/.next/standalone/.next/static/chunks/0_mxo3sdn-obc.js +0 -1
  374. package/.next/standalone/.next/static/chunks/0_r6ls5m8p~ft.js +0 -1
  375. package/.next/standalone/.next/static/chunks/0amsn1mknilcs.js +0 -1
  376. package/.next/standalone/.next/static/chunks/0ca9m7vrn2t7n.js +0 -1
  377. package/.next/standalone/.next/static/chunks/0c~l5bjb.rw_-.js +0 -1
  378. package/.next/standalone/.next/static/chunks/0dpf4si7n7imd.js +0 -1
  379. package/.next/standalone/.next/static/chunks/0du4cx1~k7d83.js +0 -1
  380. package/.next/standalone/.next/static/chunks/0g6lo0qyyyd8q.js +0 -1
  381. package/.next/standalone/.next/static/chunks/0lmcd5yqytd7q.js +0 -1
  382. package/.next/standalone/.next/static/chunks/0mlj0bhfz2s6h.js +0 -1
  383. package/.next/standalone/.next/static/chunks/0nu3srr5njzka.js +0 -1
  384. package/.next/standalone/.next/static/chunks/0qsy_4~44nzw1.js +0 -1
  385. package/.next/standalone/.next/static/chunks/1006uokkrcoe4.js +0 -1
  386. package/.next/standalone/.next/static/chunks/105mo4ttns4ro.js +0 -1
  387. package/.next/standalone/.next/static/chunks/10q-0rneqwysg.js +0 -1
  388. package/.next/standalone/.next/static/chunks/12kh0-iq.4m3c.js +0 -1
  389. package/.next/standalone/.next/static/chunks/13_6yxs82pu_4.js +0 -1
  390. package/.next/standalone/.next/static/chunks/16btub.0e2sr1.js +0 -1
  391. package/.next/standalone/.next/static/static/chunks/06w_r5ib1et20.css +0 -2
  392. package/.next/standalone/.next/static/static/chunks/07c3wweseos.8.js +0 -1
  393. package/.next/standalone/.next/static/static/chunks/0_mxo3sdn-obc.js +0 -1
  394. package/.next/standalone/.next/static/static/chunks/0_r6ls5m8p~ft.js +0 -1
  395. package/.next/standalone/.next/static/static/chunks/0amsn1mknilcs.js +0 -1
  396. package/.next/standalone/.next/static/static/chunks/0ca9m7vrn2t7n.js +0 -1
  397. package/.next/standalone/.next/static/static/chunks/0c~l5bjb.rw_-.js +0 -1
  398. package/.next/standalone/.next/static/static/chunks/0dpf4si7n7imd.js +0 -1
  399. package/.next/standalone/.next/static/static/chunks/0du4cx1~k7d83.js +0 -1
  400. package/.next/standalone/.next/static/static/chunks/0g6lo0qyyyd8q.js +0 -1
  401. package/.next/standalone/.next/static/static/chunks/0lmcd5yqytd7q.js +0 -1
  402. package/.next/standalone/.next/static/static/chunks/0mlj0bhfz2s6h.js +0 -1
  403. package/.next/standalone/.next/static/static/chunks/0nu3srr5njzka.js +0 -1
  404. package/.next/standalone/.next/static/static/chunks/0qsy_4~44nzw1.js +0 -1
  405. package/.next/standalone/.next/static/static/chunks/1006uokkrcoe4.js +0 -1
  406. package/.next/standalone/.next/static/static/chunks/105mo4ttns4ro.js +0 -1
  407. package/.next/standalone/.next/static/static/chunks/10q-0rneqwysg.js +0 -1
  408. package/.next/standalone/.next/static/static/chunks/12kh0-iq.4m3c.js +0 -1
  409. package/.next/standalone/.next/static/static/chunks/13_6yxs82pu_4.js +0 -1
  410. package/.next/standalone/.next/static/static/chunks/16btub.0e2sr1.js +0 -1
  411. package/.next/static/chunks/06w_r5ib1et20.css +0 -2
  412. package/.next/static/chunks/07c3wweseos.8.js +0 -1
  413. package/.next/static/chunks/0_mxo3sdn-obc.js +0 -1
  414. package/.next/static/chunks/0_r6ls5m8p~ft.js +0 -1
  415. package/.next/static/chunks/0amsn1mknilcs.js +0 -1
  416. package/.next/static/chunks/0ca9m7vrn2t7n.js +0 -1
  417. package/.next/static/chunks/0c~l5bjb.rw_-.js +0 -1
  418. package/.next/static/chunks/0dpf4si7n7imd.js +0 -1
  419. package/.next/static/chunks/0du4cx1~k7d83.js +0 -1
  420. package/.next/static/chunks/0g6lo0qyyyd8q.js +0 -1
  421. package/.next/static/chunks/0lmcd5yqytd7q.js +0 -1
  422. package/.next/static/chunks/0mlj0bhfz2s6h.js +0 -1
  423. package/.next/static/chunks/0nu3srr5njzka.js +0 -1
  424. package/.next/static/chunks/0qsy_4~44nzw1.js +0 -1
  425. package/.next/static/chunks/1006uokkrcoe4.js +0 -1
  426. package/.next/static/chunks/105mo4ttns4ro.js +0 -1
  427. package/.next/static/chunks/10q-0rneqwysg.js +0 -1
  428. package/.next/static/chunks/12kh0-iq.4m3c.js +0 -1
  429. package/.next/static/chunks/13_6yxs82pu_4.js +0 -1
  430. package/.next/static/chunks/16btub.0e2sr1.js +0 -1
  431. /package/.next/standalone/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_buildManifest.js +0 -0
  432. /package/.next/standalone/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_clientMiddlewareManifest.js +0 -0
  433. /package/.next/standalone/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_ssgManifest.js +0 -0
  434. /package/.next/standalone/.next/static/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_buildManifest.js +0 -0
  435. /package/.next/standalone/.next/static/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_clientMiddlewareManifest.js +0 -0
  436. /package/.next/standalone/.next/static/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_ssgManifest.js +0 -0
  437. /package/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_buildManifest.js +0 -0
  438. /package/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_clientMiddlewareManifest.js +0 -0
  439. /package/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_ssgManifest.js +0 -0
@@ -0,0 +1,289 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { PrismDock } from "@/components/PrismDock";
5
+ import { BillingToggle } from "@/components/pricing/BillingToggle";
6
+ import { PricingCard, type PricingCardProps } from "@/components/pricing/PricingCard";
7
+ import { useLicense } from "@/lib/prism/hooks/useLicense";
8
+ import { useTargetPath } from "@/lib/prism/hooks/useTargetPath";
9
+ import type { LicenseTier } from "@/lib/prism/license/types";
10
+
11
+ // ─── Plan definitions ──────────────────────────────────────────────────────────
12
+
13
+ type PlanDef = Omit<PricingCardProps, "yearly" | "isCurrent"> & { tier: LicenseTier };
14
+
15
+ const PRISM_PLANS: PlanDef[] = [
16
+ {
17
+ tier: "free",
18
+ name: "Free",
19
+ tagline: "For individuals exploring the tool",
20
+ monthlyPrice: 0,
21
+ yearlyMonthlyPrice: 0,
22
+ checkoutUrl: null,
23
+ accentColor: "rgb(148,163,184)",
24
+ accentBg: "rgba(148,163,184,0.08)",
25
+ accentBorder: "rgba(148,163,184,0.2)",
26
+ features: [
27
+ "Up to 250 LOC scanned",
28
+ "Single-file insights",
29
+ "Basic LLM queries",
30
+ ],
31
+ },
32
+ {
33
+ tier: "pro",
34
+ name: "Pro",
35
+ tagline: "For professional developers",
36
+ monthlyPrice: 39,
37
+ yearlyMonthlyPrice: 32,
38
+ checkoutUrl: "https://prism0x2a.lemonsqueezy.com/checkout/buy/a9097951-5d54-438c-89ef-3e093d88f6c6",
39
+ highlighted: true,
40
+ accentColor: "rgb(96,165,250)",
41
+ accentBg: "rgba(59,130,246,0.12)",
42
+ accentBorder: "rgba(59,130,246,0.35)",
43
+ features: [
44
+ "Unlimited LOC",
45
+ "Monorepo support",
46
+ "Aggregate scan",
47
+ "Cross-workspace insights",
48
+ "LLM insights",
49
+ "Custom queries",
50
+ ],
51
+ },
52
+ {
53
+ tier: "team",
54
+ name: "Team",
55
+ tagline: "For engineering teams",
56
+ monthlyPrice: 99,
57
+ yearlyMonthlyPrice: 82,
58
+ unit: "dev",
59
+ checkoutUrl: "https://prism0x2a.lemonsqueezy.com/checkout/buy/ddcff26c-303a-4993-a7a7-73129b150a97",
60
+ accentColor: "rgb(52,211,153)",
61
+ accentBg: "rgba(52,211,153,0.1)",
62
+ accentBorder: "rgba(52,211,153,0.3)",
63
+ features: [
64
+ "Everything in Pro",
65
+ "Cross-layer context",
66
+ "Auto insights",
67
+ "Team sync",
68
+ "CI integration",
69
+ "Priority support",
70
+ ],
71
+ },
72
+ ];
73
+
74
+ const FORGE_PLAN: PlanDef = {
75
+ tier: "forge-pro",
76
+ name: "forge0x2B Pro",
77
+ tagline: "Unlimited AI generation for forge users",
78
+ monthlyPrice: 29,
79
+ yearlyMonthlyPrice: 24,
80
+ checkoutUrl: "https://prism0x2a.lemonsqueezy.com/checkout/buy/21c1146e-9fea-4c32-a4fc-c5a5e64215e7",
81
+ accentColor: "rgb(244,114,182)",
82
+ accentBg: "rgba(236,72,153,0.12)",
83
+ accentBorder: "rgba(236,72,153,0.3)",
84
+ features: [
85
+ "Unlimited forge generation",
86
+ "Unlimited forge generation (AI)",
87
+ "No prism0x2A features",
88
+ ],
89
+ };
90
+
91
+ const SPECTRUM_PLAN: PlanDef = {
92
+ tier: "spectrum",
93
+ name: "Spectrum 0x55",
94
+ tagline: "prism Pro + forge Pro — the full stack",
95
+ monthlyPrice: 49,
96
+ yearlyMonthlyPrice: 41,
97
+ checkoutUrl: "https://prism0x2a.lemonsqueezy.com/checkout/buy/64d25b45-7c4a-410d-b4aa-7504f98ab5f7",
98
+ highlighted: true,
99
+ accentColor: "rgb(167,139,250)",
100
+ accentBg: "rgba(99,102,241,0.15)",
101
+ accentBorder: "rgba(167,139,250,0.35)",
102
+ features: [
103
+ "Everything in prism Pro",
104
+ "Everything in forge Pro",
105
+ "Best value bundle",
106
+ ],
107
+ };
108
+
109
+ const FAQ: { q: string; a: string }[] = [
110
+ {
111
+ q: "What is the difference between Pro and Team?",
112
+ a: "Pro gives one developer unlimited scans, LLM insights, and monorepo support. Team adds cross-layer context, auto insights, CI integration, and team sync — billed per developer seat.",
113
+ },
114
+ {
115
+ q: "What is Spectrum 0x55?",
116
+ a: "Spectrum 0x55 bundles prism0x2A Pro and forge0x2B Pro at a discounted price. You get all prism features plus unlimited AI generation in forge — for €49/mo instead of €68/mo.",
117
+ },
118
+ {
119
+ q: "Can I switch plans?",
120
+ a: "Yes — manage your subscription at any time via your Lemonsqueezy billing portal. Upgrades take effect immediately; downgrades apply at the next billing cycle.",
121
+ },
122
+ {
123
+ q: "Is there a free trial?",
124
+ a: "The Free tier is available indefinitely. Paid plans are billed monthly or yearly with no trial period, but you can cancel at any time.",
125
+ },
126
+ {
127
+ q: "How does offline grace period work?",
128
+ a: "prism validates your license once every 30 days. If it cannot reach Lemonsqueezy, you continue working for a 7-day grace period before features are restricted.",
129
+ },
130
+ ];
131
+
132
+ // ─── Page ──────────────────────────────────────────────────────────────────────
133
+
134
+ export default function PricingPage() {
135
+ const [yearly, setYearly] = useState(false);
136
+ const { tq } = useTargetPath();
137
+ const { license } = useLicense(tq);
138
+ const currentTier = license?.tier ?? "free";
139
+
140
+ return (
141
+ <div className="flex flex-col min-h-screen" style={{ background: "var(--bg-app)" }}>
142
+ <PrismDock />
143
+
144
+ <main className="flex-1 flex flex-col items-center px-6 pt-32 pb-24 gap-16">
145
+
146
+ {/* Hero */}
147
+ <div className="text-center flex flex-col items-center gap-4 max-w-xl">
148
+ <h1 className="text-4xl font-bold text-slate-100 tracking-tight">
149
+ Simple, transparent pricing
150
+ </h1>
151
+ <p className="text-slate-400 text-base leading-relaxed">
152
+ Start free. Upgrade when your codebase grows. Cancel anytime.
153
+ </p>
154
+ <BillingToggle yearly={yearly} onChange={setYearly} />
155
+ </div>
156
+
157
+ {/* prism plans */}
158
+ <section className="w-full max-w-4xl flex flex-col gap-6">
159
+ <h2 className="text-xs font-semibold text-slate-500 uppercase tracking-widest">
160
+ prism<span className="font-mono">0x2A</span> — Code intelligence
161
+ </h2>
162
+ <div className="grid grid-cols-1 sm:grid-cols-3 gap-4">
163
+ {PRISM_PLANS.map((plan) => (
164
+ <PricingCard
165
+ key={plan.tier}
166
+ {...plan}
167
+ yearly={yearly}
168
+ isCurrent={currentTier === plan.tier}
169
+ />
170
+ ))}
171
+ </div>
172
+ </section>
173
+
174
+ {/* forge + spectrum */}
175
+ <section className="w-full max-w-4xl flex flex-col gap-6">
176
+ <h2 className="text-xs font-semibold text-slate-500 uppercase tracking-widest">
177
+ forge<span className="font-mono">0x2B</span> + bundles
178
+ </h2>
179
+ <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
180
+ <PricingCard
181
+ {...FORGE_PLAN}
182
+ yearly={yearly}
183
+ isCurrent={currentTier === "forge-pro"}
184
+ />
185
+ <div className="relative">
186
+ <div
187
+ className="absolute -top-3 left-1/2 -translate-x-1/2 text-xs px-3 py-0.5 rounded-full font-semibold z-10"
188
+ style={{
189
+ background: "linear-gradient(90deg, rgba(59,130,246,0.2), rgba(236,72,153,0.2))",
190
+ color: "rgb(167,139,250)",
191
+ border: "1px solid rgba(167,139,250,0.3)",
192
+ }}
193
+ >
194
+ Best value
195
+ </div>
196
+ <PricingCard
197
+ {...SPECTRUM_PLAN}
198
+ yearly={yearly}
199
+ isCurrent={currentTier === "spectrum"}
200
+ />
201
+ </div>
202
+ </div>
203
+ </section>
204
+
205
+ {/* Tier comparison callout */}
206
+ <section className="w-full max-w-4xl">
207
+ <div
208
+ className="rounded-xl p-6 flex flex-col gap-4"
209
+ style={{
210
+ background: "var(--surface-panel)",
211
+ border: "1px solid var(--border-default)",
212
+ }}
213
+ >
214
+ <h2 className="text-xs font-semibold text-slate-500 uppercase tracking-widest">
215
+ Tier feature map
216
+ </h2>
217
+ <div className="overflow-x-auto">
218
+ <table className="w-full text-xs text-slate-400 border-collapse">
219
+ <thead>
220
+ <tr className="border-b" style={{ borderColor: "rgba(51,65,85,0.4)" }}>
221
+ <th className="text-left py-2 pr-4 font-medium text-slate-300 w-1/3">Feature</th>
222
+ <th className="py-2 px-2 font-medium text-slate-400">Free</th>
223
+ <th className="py-2 px-2 font-medium text-sky-400">Pro</th>
224
+ <th className="py-2 px-2 font-medium text-emerald-400">Team</th>
225
+ <th className="py-2 px-2 font-medium text-violet-400">Spectrum</th>
226
+ <th className="py-2 px-2 font-medium text-pink-400">forge Pro</th>
227
+ </tr>
228
+ </thead>
229
+ <tbody>
230
+ {[
231
+ ["Unlimited LOC", false, true, true, true, false],
232
+ ["Monorepo support", false, true, true, true, false],
233
+ ["Aggregate scan", false, true, true, true, false],
234
+ ["LLM insights", false, true, true, true, false],
235
+ ["Custom queries", false, true, true, true, false],
236
+ ["Cross-layer context", false, false, true, false, false],
237
+ ["Auto insights", false, false, true, false, false],
238
+ ["Team sync / CI", false, false, true, false, false],
239
+ ["forge unlimited gen.", false, false, false, true, true ],
240
+ ].map(([label, free, pro, team, spectrum, forge]) => (
241
+ <tr key={String(label)} className="border-b" style={{ borderColor: "rgba(51,65,85,0.2)" }}>
242
+ <td className="py-2 pr-4 text-slate-400">{String(label)}</td>
243
+ {[free, pro, team, spectrum, forge].map((v, i) => (
244
+ <td key={i} className="py-2 px-2 text-center">
245
+ {v ? (
246
+ <span style={{ color: ["rgb(71,85,105)","rgb(96,165,250)","rgb(52,211,153)","rgb(167,139,250)","rgb(244,114,182)"][i] }}>✦</span>
247
+ ) : (
248
+ <span className="text-slate-700">–</span>
249
+ )}
250
+ </td>
251
+ ))}
252
+ </tr>
253
+ ))}
254
+ </tbody>
255
+ </table>
256
+ </div>
257
+ </div>
258
+ </section>
259
+
260
+ {/* FAQ */}
261
+ <section className="w-full max-w-2xl flex flex-col gap-4">
262
+ <h2 className="text-xs font-semibold text-slate-500 uppercase tracking-widest">FAQ</h2>
263
+ <div className="flex flex-col gap-3">
264
+ {FAQ.map(({ q, a }) => (
265
+ <details
266
+ key={q}
267
+ className="group rounded-xl px-5 py-4"
268
+ style={{
269
+ background: "var(--surface-panel)",
270
+ border: "1px solid var(--border-default)",
271
+ }}
272
+ >
273
+ <summary className="text-sm font-medium text-slate-300 cursor-pointer list-none flex items-center justify-between gap-2">
274
+ {q}
275
+ <span className="text-slate-600 group-open:rotate-180 transition-transform text-xs">▼</span>
276
+ </summary>
277
+ <p className="mt-3 text-sm text-slate-500 leading-relaxed">{a}</p>
278
+ </details>
279
+ ))}
280
+ </div>
281
+ </section>
282
+ </main>
283
+
284
+ <footer className="text-center py-4 text-xs text-slate-600">
285
+ <span className="font-mono">0x2A = 42.</span> The answer to all questions.
286
+ </footer>
287
+ </div>
288
+ );
289
+ }
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import { useState, useEffect, useCallback } from "react";
4
+ import Link from "next/link";
4
5
  import { ANTHROPIC_MODELS, type PrismConfig } from "@/lib/prism/configSchema";
5
6
  import { PrismDock } from "@/components/PrismDock";
6
7
  import { useLicense } from "@/lib/prism/hooks/useLicense";
@@ -112,21 +113,48 @@ function KeyStatusBadge({
112
113
  // ── License helpers ────────────────────────────────────────────────────────────
113
114
 
114
115
  const TIER_COLORS: Record<LicenseTier, { bg: string; text: string; border: string }> = {
115
- free: { bg: "rgba(148,163,184,0.08)", text: "rgb(148,163,184)", border: "rgba(148,163,184,0.2)" },
116
- pro: { bg: "rgba(99,102,241,0.12)", text: "rgb(129,140,248)", border: "rgba(99,102,241,0.3)" },
117
- team: { bg: "rgba(52,211,153,0.1)", text: "rgb(52,211,153)", border: "rgba(52,211,153,0.25)" },
118
- enterprise: { bg: "rgba(251,191,36,0.1)", text: "rgb(251,191,36)", border: "rgba(251,191,36,0.25)" },
116
+ free: { bg: "rgba(148,163,184,0.08)", text: "rgb(148,163,184)", border: "rgba(148,163,184,0.2)" },
117
+ pro: { bg: "rgba(59,130,246,0.12)", text: "rgb(96,165,250)", border: "rgba(59,130,246,0.3)" },
118
+ "forge-pro": { bg: "rgba(236,72,153,0.12)", text: "rgb(244,114,182)", border: "rgba(236,72,153,0.3)" },
119
+ spectrum: { bg: "rgba(99,102,241,0.12)", text: "rgb(167,139,250)", border: "rgba(99,102,241,0.3)" },
120
+ team: { bg: "rgba(52,211,153,0.1)", text: "rgb(52,211,153)", border: "rgba(52,211,153,0.25)" },
121
+ enterprise: { bg: "rgba(251,191,36,0.1)", text: "rgb(251,191,36)", border: "rgba(251,191,36,0.25)" },
122
+ };
123
+
124
+ const TIER_LABEL: Record<LicenseTier, string> = {
125
+ free: "Free",
126
+ pro: "Pro",
127
+ "forge-pro": "forge Pro",
128
+ spectrum: "Spectrum 0x55",
129
+ team: "Team",
130
+ enterprise: "Enterprise",
119
131
  };
120
132
 
121
133
  function TierBadge({ tier }: { tier: LicenseTier }) {
122
134
  const c = TIER_COLORS[tier];
135
+ if (tier === "spectrum") {
136
+ return (
137
+ <span
138
+ className="inline-flex items-center gap-1.5 text-xs px-2.5 py-1 rounded-full font-semibold tracking-wide"
139
+ style={{
140
+ background: "linear-gradient(90deg, rgba(59,130,246,0.15), rgba(236,72,153,0.15))",
141
+ color: "rgb(167,139,250)",
142
+ border: "1px solid rgba(167,139,250,0.35)",
143
+ }}
144
+ >
145
+ <span className="w-1.5 h-1.5 rounded-full inline-block"
146
+ style={{ background: "linear-gradient(90deg, rgb(96,165,250), rgb(244,114,182))" }} />
147
+ Spectrum 0x55
148
+ </span>
149
+ );
150
+ }
123
151
  return (
124
152
  <span
125
153
  className="inline-flex items-center gap-1.5 text-xs px-2.5 py-1 rounded-full font-semibold uppercase tracking-wide"
126
154
  style={{ background: c.bg, color: c.text, border: `1px solid ${c.border}` }}
127
155
  >
128
156
  <span className="w-1.5 h-1.5 rounded-full inline-block" style={{ background: c.text }} />
129
- {tier}
157
+ {TIER_LABEL[tier]}
130
158
  </span>
131
159
  );
132
160
  }
@@ -136,6 +164,15 @@ function fmtDate(ts: number | null): string {
136
164
  return new Date(ts * 1000).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric" });
137
165
  }
138
166
 
167
+ function fmtRelative(ts: number | null): string {
168
+ if (!ts) return "never";
169
+ const diff = Math.floor(Date.now() / 1000) - ts;
170
+ if (diff < 60) return "just now";
171
+ if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;
172
+ if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;
173
+ return `${Math.floor(diff / 86400)}d ago`;
174
+ }
175
+
139
176
  // ── Component ─────────────────────────────────────────────────────────────────
140
177
 
141
178
  export default function SettingsPage() {
@@ -143,26 +180,25 @@ export default function SettingsPage() {
143
180
  const { license, isPro, refresh: refreshLicense } = useLicense(tq);
144
181
 
145
182
  // ── license activation state ────────────────────────────────────────────────
146
- const [licenseJson, setLicenseJson] = useState("");
183
+ const [licenseKeyInput, setLicenseKeyInput] = useState("");
147
184
  const [licenseActivating, setLicenseActivating] = useState(false);
185
+ const [licenseRevalidating, setLicenseRevalidating] = useState(false);
148
186
  const [licenseMsg, setLicenseMsg] = useState<{ ok: boolean; text: string } | null>(null);
149
- const [showActivate, setShowActivate] = useState(false);
150
187
 
151
188
  async function handleActivateLicense() {
189
+ if (!licenseKeyInput.trim()) return;
152
190
  setLicenseActivating(true);
153
191
  setLicenseMsg(null);
154
192
  try {
155
- const body = JSON.parse(licenseJson);
156
- const res = await fetch(`/api/license${tq}`, {
193
+ const res = await fetch(`/api/license/activate${tq}`, {
157
194
  method: "POST",
158
195
  headers: { "Content-Type": "application/json" },
159
- body: JSON.stringify(body),
196
+ body: JSON.stringify({ licenseKey: licenseKeyInput.trim() }),
160
197
  });
161
198
  const data = await res.json();
162
199
  if (!res.ok) throw new Error(data.error ?? "Activation failed");
163
- setLicenseMsg({ ok: true, text: `Activated — tier: ${data.tier}` });
164
- setLicenseJson("");
165
- setShowActivate(false);
200
+ setLicenseMsg({ ok: true, text: `Activated — ${data.productName} (${data.tier})` });
201
+ setLicenseKeyInput("");
166
202
  refreshLicense();
167
203
  } catch (err) {
168
204
  setLicenseMsg({ ok: false, text: err instanceof Error ? err.message : String(err) });
@@ -171,10 +207,34 @@ export default function SettingsPage() {
171
207
  }
172
208
  }
173
209
 
174
- async function handleResetLicense() {
175
- await fetch(`/api/license${tq}`, { method: "DELETE" });
176
- refreshLicense();
210
+ async function handleRevalidateLicense() {
211
+ setLicenseRevalidating(true);
212
+ setLicenseMsg(null);
213
+ try {
214
+ const res = await fetch(`/api/license/validate${tq}`, { method: "POST" });
215
+ const data = await res.json();
216
+ if (!res.ok) throw new Error(data.error ?? "Re-validation failed");
217
+ setLicenseMsg({ ok: true, text: `Validated — ${data.tier}, last check: now` });
218
+ refreshLicense();
219
+ } catch (err) {
220
+ setLicenseMsg({ ok: false, text: err instanceof Error ? err.message : String(err) });
221
+ } finally {
222
+ setLicenseRevalidating(false);
223
+ }
224
+ }
225
+
226
+ async function handleDeactivateLicense() {
177
227
  setLicenseMsg(null);
228
+ try {
229
+ const res = await fetch(`/api/license/deactivate${tq}`, { method: "POST" });
230
+ if (!res.ok) {
231
+ const data = await res.json();
232
+ throw new Error(data.error ?? "Deactivation failed");
233
+ }
234
+ refreshLicense();
235
+ } catch (err) {
236
+ setLicenseMsg({ ok: false, text: err instanceof Error ? err.message : String(err) });
237
+ }
178
238
  }
179
239
 
180
240
  const [provider, setProvider] = useState<"anthropic-direct" | "atlas-embedded">("anthropic-direct");
@@ -491,80 +551,141 @@ export default function SettingsPage() {
491
551
  {license && <TierBadge tier={license.tier} />}
492
552
  </div>
493
553
 
494
- {license && (
495
- <div className="flex flex-col gap-2 text-xs text-slate-500">
554
+ {/* State 2: Activating */}
555
+ {licenseActivating && (
556
+ <div className="flex items-center gap-2 text-sm text-slate-400">
557
+ <span className="animate-spin inline-block w-4 h-4 border-2 border-indigo-400 border-t-transparent rounded-full" />
558
+ Activating with Lemonsqueezy…
559
+ </div>
560
+ )}
561
+
562
+ {/* State 3: Active license */}
563
+ {!licenseActivating && isPro && license && (
564
+ <div className="flex flex-col gap-2.5 text-xs text-slate-500">
565
+ {license.productName && (
566
+ <div className="flex items-center justify-between">
567
+ <span>Product</span>
568
+ <span className="text-slate-300 font-medium">{license.productName}</span>
569
+ </div>
570
+ )}
571
+ {license.userId && (
572
+ <div className="flex items-center justify-between">
573
+ <span>Account</span>
574
+ <span className="font-mono text-slate-400 truncate max-w-48">{license.userId}</span>
575
+ </div>
576
+ )}
496
577
  <div className="flex items-center justify-between">
497
- <span>Issued</span>
498
- <span className="font-mono text-slate-400">{fmtDate(license.issuedAt)}</span>
578
+ <span>Last validated</span>
579
+ <span className="font-mono text-slate-400">{fmtRelative(license.validatedAt)}</span>
499
580
  </div>
500
581
  <div className="flex items-center justify-between">
501
- <span>Expires</span>
502
- <span className="font-mono text-slate-400">
503
- {license.tier === "free" ? "Free tier" : fmtDate(license.expiresAt)}
582
+ <span>Subscription</span>
583
+ <span className={`font-medium ${license.subscriptionStatus === "active" ? "text-emerald-400" : "text-amber-400"}`}>
584
+ {license.subscriptionStatus === "active"
585
+ ? "Active"
586
+ : license.subscriptionStatus === "cancelled"
587
+ ? `Cancelled${license.expiresAt ? `, active until ${fmtDate(license.expiresAt)}` : ""}`
588
+ : license.subscriptionStatus ?? "Unknown"}
504
589
  </span>
505
590
  </div>
506
- {license.userId && (
591
+ {license.instanceId && (
507
592
  <div className="flex items-center justify-between">
508
- <span>User</span>
509
- <span className="font-mono text-slate-400 truncate max-w-48">{license.userId}</span>
593
+ <span>Instance</span>
594
+ <span className="font-mono text-slate-500 text-[10px] truncate max-w-40">{license.instanceId}</span>
595
+ </div>
596
+ )}
597
+ {license.activationLimit !== null && license.activationUsage !== null && (
598
+ <div className="flex items-center justify-between">
599
+ <span>Activations</span>
600
+ <span className="font-mono text-slate-400">
601
+ {license.activationUsage} / {license.activationLimit ?? "∞"}
602
+ </span>
510
603
  </div>
511
604
  )}
605
+ {license.cacheStatus === "grace" && (
606
+ <p className="text-amber-400 text-xs">
607
+ Cache expired — re-validation overdue. Running in 7-day grace period.
608
+ {license.gracePeriodEnd && ` Expires ${fmtDate(license.gracePeriodEnd)}.`}
609
+ </p>
610
+ )}
512
611
  {license.isExpired && (
513
- <p className="text-red-400 text-xs mt-1">License expired — downgraded to free tier.</p>
612
+ <p className="text-red-400 text-xs">Subscription expired — downgraded to free tier.</p>
514
613
  )}
515
614
  </div>
516
615
  )}
517
616
 
518
- {/* Activate form */}
519
- {!showActivate ? (
520
- <div className="flex items-center gap-3 pt-1 border-t" style={{ borderColor: "var(--border-default)" }}>
617
+ {/* State 3 actions */}
618
+ {!licenseActivating && isPro && (
619
+ <div className="flex flex-wrap items-center gap-3 pt-1 border-t" style={{ borderColor: "var(--border-default)" }}>
521
620
  <button
522
- onClick={() => { setShowActivate(true); setLicenseMsg(null); }}
621
+ onClick={handleRevalidateLicense}
622
+ disabled={licenseRevalidating}
523
623
  className={S.btnSecondary}
524
624
  style={S.btnSecondaryStyle}
525
625
  >
526
- {isPro ? "Replace License" : "Activate License"}
626
+ {licenseRevalidating ? "Checking…" : "Validate now"}
627
+ </button>
628
+ <a
629
+ href="https://prism0x2a.lemonsqueezy.com/billing"
630
+ target="_blank"
631
+ rel="noopener noreferrer"
632
+ className="text-xs text-indigo-400 hover:text-indigo-300 transition-colors"
633
+ >
634
+ Manage subscription →
635
+ </a>
636
+ <button
637
+ onClick={handleDeactivateLicense}
638
+ className="text-xs text-red-400 hover:text-red-300 transition-colors ml-auto"
639
+ >
640
+ Deactivate this instance
527
641
  </button>
528
- {isPro && (
529
- <button
530
- onClick={handleResetLicense}
531
- className="text-xs text-red-400 hover:text-red-300 transition-colors"
532
- >
533
- Reset to free
534
- </button>
535
- )}
536
642
  </div>
537
- ) : (
643
+ )}
644
+
645
+ {/* State 1: No license — key input */}
646
+ {!licenseActivating && !isPro && (
538
647
  <div className="flex flex-col gap-3 pt-1 border-t" style={{ borderColor: "var(--border-default)" }}>
539
- <label className={S.label}>Paste license JSON</label>
540
- <textarea
541
- rows={5}
542
- value={licenseJson}
543
- onChange={(e) => setLicenseJson(e.target.value)}
544
- placeholder={'{\n "tier": "pro",\n "expiresAt": 0\n}'}
545
- className={S.textarea}
546
- style={S.inputStyle}
547
- autoFocus
548
- />
648
+ <div className="flex flex-col gap-1.5">
649
+ <label className={S.label}>License Key</label>
650
+ <input
651
+ type="text"
652
+ value={licenseKeyInput}
653
+ onChange={(e) => setLicenseKeyInput(e.target.value)}
654
+ onKeyDown={(e) => { if (e.key === "Enter") handleActivateLicense(); }}
655
+ placeholder="LS-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX"
656
+ className={S.input}
657
+ style={S.inputStyle}
658
+ spellCheck={false}
659
+ />
660
+ </div>
549
661
  <div className="flex items-center gap-3">
550
662
  <button
551
663
  onClick={handleActivateLicense}
552
- disabled={licenseActivating || !licenseJson.trim()}
664
+ disabled={!licenseKeyInput.trim()}
553
665
  className={S.btnPrimary}
554
- style={{ background: "rgb(99,102,241)", color: "#fff" }}
666
+ style={{ background: "rgb(99,102,241)", color: "#fff", opacity: licenseKeyInput.trim() ? 1 : 0.4 }}
555
667
  >
556
- {licenseActivating ? "Activating…" : "Activate"}
668
+ Activate
557
669
  </button>
558
- <button
559
- onClick={() => { setShowActivate(false); setLicenseJson(""); setLicenseMsg(null); }}
560
- className="text-xs text-slate-500 hover:text-slate-300 transition-colors"
670
+ <Link
671
+ href="/pricing"
672
+ className="text-xs text-indigo-400 hover:text-indigo-300 transition-colors"
561
673
  >
562
- Cancel
563
- </button>
674
+ View Plans →
675
+ </Link>
676
+ <a
677
+ href="https://prism0x2a.lemonsqueezy.com"
678
+ target="_blank"
679
+ rel="noopener noreferrer"
680
+ className="text-xs text-slate-500 hover:text-slate-400 transition-colors"
681
+ >
682
+ Get a license →
683
+ </a>
564
684
  </div>
565
685
  </div>
566
686
  )}
567
687
 
688
+ {/* Message */}
568
689
  {licenseMsg && (
569
690
  <p className={`text-xs font-mono ${licenseMsg.ok ? "text-emerald-400" : "text-red-400"}`}>
570
691
  {licenseMsg.text}
@@ -11,6 +11,7 @@ const NAV = [
11
11
  { href: "/blue", label: "BLUE", color: "rgb(59,130,246)" },
12
12
  { href: "/amber", label: "AMBER", color: "rgb(251,191,36)" },
13
13
  { href: "/green", label: "GREEN", color: "rgb(52,211,153)" },
14
+ { href: "/pricing", label: "Plans", color: "rgb(167,139,250)" },
14
15
  { href: "/settings", label: "⚙", color: undefined },
15
16
  ] as const;
16
17