shipscreens 0.1.6 → 0.1.7

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 (531) hide show
  1. package/README.md +14 -4
  2. package/bin/shipscreens.js +352 -18
  3. package/cli/commands/captureScreenshots.js +409 -0
  4. package/cli/commands/importScreenshots.js +377 -0
  5. package/cli/commands/inspectReleaseContext.js +607 -0
  6. package/cli/commands/planRelease.js +324 -0
  7. package/cli/commands/writeStarterConfig.js +233 -0
  8. package/cli/mcpServer.js +172 -3
  9. package/dist/.well-known/ai-agents.json +58 -11
  10. package/dist/.well-known/llms-full.txt +80 -17
  11. package/dist/.well-known/llms.txt +38 -12
  12. package/dist/.well-known/mcp-server.json +4 -4
  13. package/dist/ai-agents.json +58 -11
  14. package/dist/app/assets/AgentCli-nIqgOG-i.js +17 -0
  15. package/dist/app/assets/AgentCli-nIqgOG-i.js.map +1 -0
  16. package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
  17. package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
  18. package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
  19. package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
  20. package/dist/app/assets/App-BRKxkubQ.css +1 -0
  21. package/dist/app/assets/App-CZiyX8-L.js +14 -0
  22. package/dist/app/assets/App-CZiyX8-L.js.map +1 -0
  23. package/dist/app/assets/AppReviewAso-DYOCuqgV.js +4 -0
  24. package/dist/app/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
  25. package/dist/app/assets/Cancelled-CP6V6uDb.js +2 -0
  26. package/dist/app/assets/Cancelled-CP6V6uDb.js.map +1 -0
  27. package/dist/app/assets/CopyButton-BFCx6EPg.js +2 -0
  28. package/dist/app/assets/CopyButton-BFCx6EPg.js.map +1 -0
  29. package/dist/app/assets/DesignPartner-B4J7f0Bx.js +4 -0
  30. package/dist/app/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
  31. package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
  32. package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
  33. package/dist/app/assets/FirstExport-qfY7uE8r.js +6 -0
  34. package/dist/app/assets/FirstExport-qfY7uE8r.js.map +1 -0
  35. package/dist/app/assets/FitPanel-B1J0V1jK.js +2 -0
  36. package/dist/app/assets/FitPanel-B1J0V1jK.js.map +1 -0
  37. package/dist/app/assets/FivePanelFramework-C4yq58kM.js +62 -0
  38. package/dist/app/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
  39. package/dist/app/assets/ForgotPassword-KF_HFGyb.js +2 -0
  40. package/dist/app/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
  41. package/dist/app/assets/Landing-B_CvZDXJ.js +2 -0
  42. package/dist/app/assets/Landing-B_CvZDXJ.js.map +1 -0
  43. package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
  44. package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
  45. package/dist/app/assets/Legal-BwGbEjDk.js +2 -0
  46. package/dist/app/assets/Legal-BwGbEjDk.js.map +1 -0
  47. package/dist/app/assets/NotFound-Ba1Bw7uu.js +2 -0
  48. package/dist/app/assets/NotFound-Ba1Bw7uu.js.map +1 -0
  49. package/dist/app/assets/Pricing-Dt-V4Gqc.js +20 -0
  50. package/dist/app/assets/Pricing-Dt-V4Gqc.js.map +1 -0
  51. package/dist/app/assets/Privacy-C6MrXYPO.js +2 -0
  52. package/dist/app/assets/Privacy-C6MrXYPO.js.map +1 -0
  53. package/dist/app/assets/Proof-C3DDFAhm.js +20 -0
  54. package/dist/app/assets/Proof-C3DDFAhm.js.map +1 -0
  55. package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
  56. package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
  57. package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
  58. package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
  59. package/dist/app/assets/Security-C1OmAgom.js +2 -0
  60. package/dist/app/assets/Security-C1OmAgom.js.map +1 -0
  61. package/dist/app/assets/SignIn-C_wwnmvu.js +2 -0
  62. package/dist/app/assets/SignIn-C_wwnmvu.js.map +1 -0
  63. package/dist/app/assets/SignUp-Dm5HalC6.js +2 -0
  64. package/dist/app/assets/SignUp-Dm5HalC6.js.map +1 -0
  65. package/dist/app/assets/SiteHeader-CJqQ0pL3.js +2 -0
  66. package/dist/app/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
  67. package/dist/app/assets/StickyMobileCta-REC3DROG.js +2 -0
  68. package/dist/app/assets/StickyMobileCta-REC3DROG.js.map +1 -0
  69. package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
  70. package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
  71. package/dist/app/assets/Success-D6b4wLPD.js +2 -0
  72. package/dist/app/assets/Success-D6b4wLPD.js.map +1 -0
  73. package/dist/app/assets/Terms-BMt39FQK.js +2 -0
  74. package/dist/app/assets/Terms-BMt39FQK.js.map +1 -0
  75. package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
  76. package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
  77. package/dist/app/assets/ToolsIndex-d1szo5bn.js +6 -0
  78. package/dist/app/assets/ToolsIndex-d1szo5bn.js.map +1 -0
  79. package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
  80. package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
  81. package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
  82. package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
  83. package/dist/app/assets/agentHandoff-BGmHqDwv.js +2 -0
  84. package/dist/app/assets/agentHandoff-BGmHqDwv.js.map +1 -0
  85. package/dist/app/assets/apiClient-3WVm94VW.js +2 -0
  86. package/dist/app/assets/apiClient-3WVm94VW.js.map +1 -0
  87. package/dist/app/assets/calculator-CofuwQa8.js +2 -0
  88. package/dist/app/assets/calculator-CofuwQa8.js.map +1 -0
  89. package/dist/app/assets/check-Fm2iQO64.js +2 -0
  90. package/dist/app/assets/check-Fm2iQO64.js.map +1 -0
  91. package/dist/app/assets/chevron-down-BIXHKpnf.js +2 -0
  92. package/dist/app/assets/chevron-down-BIXHKpnf.js.map +1 -0
  93. package/dist/app/assets/chunk-BHe-jwch.js +1 -0
  94. package/dist/app/assets/circle-check-X08qqy40.js +2 -0
  95. package/dist/app/assets/circle-check-X08qqy40.js.map +1 -0
  96. package/dist/app/assets/copy-KD-LYJ0z.js +2 -0
  97. package/dist/app/assets/copy-KD-LYJ0z.js.map +1 -0
  98. package/dist/app/assets/crop-K1LOmRty.js +2 -0
  99. package/dist/app/assets/crop-K1LOmRty.js.map +1 -0
  100. package/dist/app/assets/designPartnerRequest-DYqMElJd.js +2 -0
  101. package/dist/app/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
  102. package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
  103. package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
  104. package/dist/app/assets/download-BXzoc-Y3.js +2 -0
  105. package/dist/app/assets/download-BXzoc-Y3.js.map +1 -0
  106. package/dist/app/assets/eye-CHvLhG2r.js +2 -0
  107. package/dist/app/assets/eye-CHvLhG2r.js.map +1 -0
  108. package/dist/app/assets/file-text-CU-ETLz1.js +2 -0
  109. package/dist/app/assets/file-text-CU-ETLz1.js.map +1 -0
  110. package/dist/app/assets/folder-tree-raVH0Y5V.js +2 -0
  111. package/dist/app/assets/folder-tree-raVH0Y5V.js.map +1 -0
  112. package/dist/app/assets/grid-3x3-cWuhGQfz.js +2 -0
  113. package/dist/app/assets/grid-3x3-cWuhGQfz.js.map +1 -0
  114. package/dist/app/assets/hardeningOffer-tkjlPDU-.js +2 -0
  115. package/dist/app/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
  116. package/dist/app/assets/hero/agent-starter-workflow.png +0 -0
  117. package/dist/app/assets/hero/agent-starter-workflow.webp +0 -0
  118. package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
  119. package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
  120. package/dist/app/assets/index-BW_YmKvl.css +2 -0
  121. package/dist/app/assets/index-D7D6ZRCW.js +212 -0
  122. package/dist/app/assets/index-D7D6ZRCW.js.map +1 -0
  123. package/dist/app/assets/jszip.min-XyfP2hUJ.js +3 -0
  124. package/dist/app/assets/jszip.min-XyfP2hUJ.js.map +1 -0
  125. package/dist/app/assets/layout-grid-Cq_e979G.js +2 -0
  126. package/dist/app/assets/layout-grid-Cq_e979G.js.map +1 -0
  127. package/dist/app/assets/lock-Di7P18Ts.js +2 -0
  128. package/dist/app/assets/lock-Di7P18Ts.js.map +1 -0
  129. package/dist/app/assets/rocket-DHdrCHKD.js +2 -0
  130. package/dist/app/assets/rocket-DHdrCHKD.js.map +1 -0
  131. package/dist/app/assets/shield-check-CxpHNdp0.js +2 -0
  132. package/dist/app/assets/shield-check-CxpHNdp0.js.map +1 -0
  133. package/dist/app/assets/smartphone-DXKiqu57.js +2 -0
  134. package/dist/app/assets/smartphone-DXKiqu57.js.map +1 -0
  135. package/dist/app/assets/stripeClient-CuZgvzca.js +2 -0
  136. package/dist/app/assets/stripeClient-CuZgvzca.js.map +1 -0
  137. package/dist/app/assets/terminal-J0iyJTv2.js +2 -0
  138. package/dist/app/assets/terminal-J0iyJTv2.js.map +1 -0
  139. package/dist/app/assets/triangle-alert-BA0HP6zD.js +2 -0
  140. package/dist/app/assets/triangle-alert-BA0HP6zD.js.map +1 -0
  141. package/dist/app/assets/useAuth-CoS4r8yi.js +22 -0
  142. package/dist/app/assets/useAuth-CoS4r8yi.js.map +1 -0
  143. package/dist/app/assets/users-C-fz7pbn.js +2 -0
  144. package/dist/app/assets/users-C-fz7pbn.js.map +1 -0
  145. package/dist/app/index.html +9 -8
  146. package/dist/assets/AgentCli-nIqgOG-i.js +17 -0
  147. package/dist/assets/AgentCli-nIqgOG-i.js.map +1 -0
  148. package/dist/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
  149. package/dist/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
  150. package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
  151. package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
  152. package/dist/assets/App-BRKxkubQ.css +1 -0
  153. package/dist/assets/App-CZiyX8-L.js +14 -0
  154. package/dist/assets/App-CZiyX8-L.js.map +1 -0
  155. package/dist/assets/AppReviewAso-DYOCuqgV.js +4 -0
  156. package/dist/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
  157. package/dist/assets/Cancelled-CP6V6uDb.js +2 -0
  158. package/dist/assets/Cancelled-CP6V6uDb.js.map +1 -0
  159. package/dist/assets/CopyButton-BFCx6EPg.js +2 -0
  160. package/dist/assets/CopyButton-BFCx6EPg.js.map +1 -0
  161. package/dist/assets/DesignPartner-B4J7f0Bx.js +4 -0
  162. package/dist/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
  163. package/dist/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
  164. package/dist/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
  165. package/dist/assets/FirstExport-qfY7uE8r.js +6 -0
  166. package/dist/assets/FirstExport-qfY7uE8r.js.map +1 -0
  167. package/dist/assets/FitPanel-B1J0V1jK.js +2 -0
  168. package/dist/assets/FitPanel-B1J0V1jK.js.map +1 -0
  169. package/dist/assets/FivePanelFramework-C4yq58kM.js +62 -0
  170. package/dist/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
  171. package/dist/assets/ForgotPassword-KF_HFGyb.js +2 -0
  172. package/dist/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
  173. package/dist/assets/Landing-B_CvZDXJ.js +2 -0
  174. package/dist/assets/Landing-B_CvZDXJ.js.map +1 -0
  175. package/dist/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
  176. package/dist/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
  177. package/dist/assets/Legal-BwGbEjDk.js +2 -0
  178. package/dist/assets/Legal-BwGbEjDk.js.map +1 -0
  179. package/dist/assets/NotFound-Ba1Bw7uu.js +2 -0
  180. package/dist/assets/NotFound-Ba1Bw7uu.js.map +1 -0
  181. package/dist/assets/Pricing-Dt-V4Gqc.js +20 -0
  182. package/dist/assets/Pricing-Dt-V4Gqc.js.map +1 -0
  183. package/dist/assets/Privacy-C6MrXYPO.js +2 -0
  184. package/dist/assets/Privacy-C6MrXYPO.js.map +1 -0
  185. package/dist/assets/Proof-C3DDFAhm.js +20 -0
  186. package/dist/assets/Proof-C3DDFAhm.js.map +1 -0
  187. package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
  188. package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
  189. package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
  190. package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
  191. package/dist/assets/Security-C1OmAgom.js +2 -0
  192. package/dist/assets/Security-C1OmAgom.js.map +1 -0
  193. package/dist/assets/SignIn-C_wwnmvu.js +2 -0
  194. package/dist/assets/SignIn-C_wwnmvu.js.map +1 -0
  195. package/dist/assets/SignUp-Dm5HalC6.js +2 -0
  196. package/dist/assets/SignUp-Dm5HalC6.js.map +1 -0
  197. package/dist/assets/SiteHeader-CJqQ0pL3.js +2 -0
  198. package/dist/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
  199. package/dist/assets/StickyMobileCta-REC3DROG.js +2 -0
  200. package/dist/assets/StickyMobileCta-REC3DROG.js.map +1 -0
  201. package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
  202. package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
  203. package/dist/assets/Success-D6b4wLPD.js +2 -0
  204. package/dist/assets/Success-D6b4wLPD.js.map +1 -0
  205. package/dist/assets/Terms-BMt39FQK.js +2 -0
  206. package/dist/assets/Terms-BMt39FQK.js.map +1 -0
  207. package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
  208. package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
  209. package/dist/assets/ToolsIndex-d1szo5bn.js +6 -0
  210. package/dist/assets/ToolsIndex-d1szo5bn.js.map +1 -0
  211. package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
  212. package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
  213. package/dist/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
  214. package/dist/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
  215. package/dist/assets/agentHandoff-BGmHqDwv.js +2 -0
  216. package/dist/assets/agentHandoff-BGmHqDwv.js.map +1 -0
  217. package/dist/assets/apiClient-3WVm94VW.js +2 -0
  218. package/dist/assets/apiClient-3WVm94VW.js.map +1 -0
  219. package/dist/assets/calculator-CofuwQa8.js +2 -0
  220. package/dist/assets/calculator-CofuwQa8.js.map +1 -0
  221. package/dist/assets/check-Fm2iQO64.js +2 -0
  222. package/dist/assets/check-Fm2iQO64.js.map +1 -0
  223. package/dist/assets/chevron-down-BIXHKpnf.js +2 -0
  224. package/dist/assets/chevron-down-BIXHKpnf.js.map +1 -0
  225. package/dist/assets/chunk-BHe-jwch.js +1 -0
  226. package/dist/assets/circle-check-X08qqy40.js +2 -0
  227. package/dist/assets/circle-check-X08qqy40.js.map +1 -0
  228. package/dist/assets/copy-KD-LYJ0z.js +2 -0
  229. package/dist/assets/copy-KD-LYJ0z.js.map +1 -0
  230. package/dist/assets/crop-K1LOmRty.js +2 -0
  231. package/dist/assets/crop-K1LOmRty.js.map +1 -0
  232. package/dist/assets/designPartnerRequest-DYqMElJd.js +2 -0
  233. package/dist/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
  234. package/dist/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
  235. package/dist/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
  236. package/dist/assets/download-BXzoc-Y3.js +2 -0
  237. package/dist/assets/download-BXzoc-Y3.js.map +1 -0
  238. package/dist/assets/eye-CHvLhG2r.js +2 -0
  239. package/dist/assets/eye-CHvLhG2r.js.map +1 -0
  240. package/dist/assets/file-text-CU-ETLz1.js +2 -0
  241. package/dist/assets/file-text-CU-ETLz1.js.map +1 -0
  242. package/dist/assets/folder-tree-raVH0Y5V.js +2 -0
  243. package/dist/assets/folder-tree-raVH0Y5V.js.map +1 -0
  244. package/dist/assets/grid-3x3-cWuhGQfz.js +2 -0
  245. package/dist/assets/grid-3x3-cWuhGQfz.js.map +1 -0
  246. package/dist/assets/hardeningOffer-tkjlPDU-.js +2 -0
  247. package/dist/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
  248. package/dist/assets/hero/agent-starter-workflow.png +0 -0
  249. package/dist/assets/hero/agent-starter-workflow.webp +0 -0
  250. package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
  251. package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
  252. package/dist/assets/index-BW_YmKvl.css +2 -0
  253. package/dist/assets/index-D7D6ZRCW.js +212 -0
  254. package/dist/assets/index-D7D6ZRCW.js.map +1 -0
  255. package/dist/assets/jszip.min-XyfP2hUJ.js +3 -0
  256. package/dist/assets/jszip.min-XyfP2hUJ.js.map +1 -0
  257. package/dist/assets/layout-grid-Cq_e979G.js +2 -0
  258. package/dist/assets/layout-grid-Cq_e979G.js.map +1 -0
  259. package/dist/assets/lock-Di7P18Ts.js +2 -0
  260. package/dist/assets/lock-Di7P18Ts.js.map +1 -0
  261. package/dist/assets/rocket-DHdrCHKD.js +2 -0
  262. package/dist/assets/rocket-DHdrCHKD.js.map +1 -0
  263. package/dist/assets/shield-check-CxpHNdp0.js +2 -0
  264. package/dist/assets/shield-check-CxpHNdp0.js.map +1 -0
  265. package/dist/assets/smartphone-DXKiqu57.js +2 -0
  266. package/dist/assets/smartphone-DXKiqu57.js.map +1 -0
  267. package/dist/assets/stripeClient-CuZgvzca.js +2 -0
  268. package/dist/assets/stripeClient-CuZgvzca.js.map +1 -0
  269. package/dist/assets/terminal-J0iyJTv2.js +2 -0
  270. package/dist/assets/terminal-J0iyJTv2.js.map +1 -0
  271. package/dist/assets/triangle-alert-BA0HP6zD.js +2 -0
  272. package/dist/assets/triangle-alert-BA0HP6zD.js.map +1 -0
  273. package/dist/assets/useAuth-CoS4r8yi.js +22 -0
  274. package/dist/assets/useAuth-CoS4r8yi.js.map +1 -0
  275. package/dist/assets/users-C-fz7pbn.js +2 -0
  276. package/dist/assets/users-C-fz7pbn.js.map +1 -0
  277. package/dist/cancelled/index.html +3 -2
  278. package/dist/design-partner/index.html +6 -5
  279. package/dist/downloads/shipscreens-github-actions-template.yml +1 -1
  280. package/dist/forgot-password/index.html +3 -2
  281. package/dist/index.html +9 -8
  282. package/dist/legal/index.html +3 -2
  283. package/dist/llms-full.txt +80 -17
  284. package/dist/llms.txt +38 -12
  285. package/dist/mcp-server.json +4 -4
  286. package/dist/pricing/index.html +6 -5
  287. package/dist/privacy/index.html +3 -2
  288. package/dist/proof/index.html +6 -5
  289. package/dist/security/index.html +3 -2
  290. package/dist/signin/index.html +3 -2
  291. package/dist/signup/index.html +3 -2
  292. package/dist/success/index.html +3 -2
  293. package/dist/terms/index.html +3 -2
  294. package/dist/tools/5-panel-screenshot-framework/index.html +6 -5
  295. package/dist/tools/agent-cli/index.html +8 -7
  296. package/dist/tools/app-review-aso/index.html +6 -5
  297. package/dist/tools/app-store-localization-screenshot-automation/index.html +8 -7
  298. package/dist/tools/app-store-screenshot-automation/index.html +8 -7
  299. package/dist/tools/app-store-screenshot-requirements-checklist/index.html +8 -7
  300. package/dist/tools/claude-code-mcp-screenshot-automation/index.html +8 -7
  301. package/dist/tools/cursor-mcp-screenshot-automation/index.html +8 -7
  302. package/dist/tools/deterministic-screenshot-reruns/index.html +8 -7
  303. package/dist/tools/device-locale-screenshot-matrix/index.html +8 -7
  304. package/dist/tools/fastlane-screenshot-folder-structure/index.html +8 -7
  305. package/dist/tools/fastlane-screenshot-pipeline/index.html +8 -7
  306. package/dist/tools/fastlane-screenshots/index.html +6 -5
  307. package/dist/tools/first-export/index.html +6 -5
  308. package/dist/tools/gemini-cli-mcp-screenshot-automation/index.html +8 -7
  309. package/dist/tools/google-play-screenshot-automation/index.html +8 -7
  310. package/dist/tools/google-play-screenshot-requirements-checklist/index.html +8 -7
  311. package/dist/tools/index.html +6 -5
  312. package/dist/tools/ipad-screenshot-review-requirements/index.html +8 -7
  313. package/dist/tools/openai-responses-tool-screenshot-automation/index.html +8 -7
  314. package/dist/tools/screenshot-ci-pipeline/index.html +8 -7
  315. package/dist/tools/screenshot-naming-order-drift/index.html +8 -7
  316. package/dist/tools/screenshot-workload-calculator/index.html +6 -5
  317. package/dist/tools/store-assets-pipeline/index.html +3 -2
  318. package/dist/tools/vscode-copilot-mcp-screenshot-automation/index.html +8 -7
  319. package/package.json +7 -7
  320. package/dist/app/assets/AgentCli-xKYtzL3B.js +0 -17
  321. package/dist/app/assets/AgentCli-xKYtzL3B.js.map +0 -1
  322. package/dist/app/assets/App-C1cNw_fn.js +0 -13
  323. package/dist/app/assets/App-C1cNw_fn.js.map +0 -1
  324. package/dist/app/assets/App-oQfE_p3A.css +0 -1
  325. package/dist/app/assets/AppReviewAso-CaIT-L7Z.js +0 -4
  326. package/dist/app/assets/AppReviewAso-CaIT-L7Z.js.map +0 -1
  327. package/dist/app/assets/Cancelled-Dmw7PTD-.js +0 -2
  328. package/dist/app/assets/Cancelled-Dmw7PTD-.js.map +0 -1
  329. package/dist/app/assets/CopyButton-CPRHmu8l.js +0 -2
  330. package/dist/app/assets/CopyButton-CPRHmu8l.js.map +0 -1
  331. package/dist/app/assets/DesignPartner-Ckp1GhNv.js +0 -4
  332. package/dist/app/assets/DesignPartner-Ckp1GhNv.js.map +0 -1
  333. package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js +0 -100
  334. package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js.map +0 -1
  335. package/dist/app/assets/FirstExport-RXbvVQdK.js +0 -6
  336. package/dist/app/assets/FirstExport-RXbvVQdK.js.map +0 -1
  337. package/dist/app/assets/FitPanel-ic91y-49.js +0 -2
  338. package/dist/app/assets/FitPanel-ic91y-49.js.map +0 -1
  339. package/dist/app/assets/FivePanelFramework-BZKNcycb.js +0 -62
  340. package/dist/app/assets/FivePanelFramework-BZKNcycb.js.map +0 -1
  341. package/dist/app/assets/ForgotPassword-CKOfAvWk.js +0 -2
  342. package/dist/app/assets/ForgotPassword-CKOfAvWk.js.map +0 -1
  343. package/dist/app/assets/Landing-D0cuDDUk.js +0 -2
  344. package/dist/app/assets/Landing-D0cuDDUk.js.map +0 -1
  345. package/dist/app/assets/LanguageSwitcher-BrToLEgF.js +0 -2
  346. package/dist/app/assets/LanguageSwitcher-BrToLEgF.js.map +0 -1
  347. package/dist/app/assets/Legal-Cm-hVzjY.js +0 -2
  348. package/dist/app/assets/Legal-Cm-hVzjY.js.map +0 -1
  349. package/dist/app/assets/NotFound-B0I6I440.js +0 -2
  350. package/dist/app/assets/NotFound-B0I6I440.js.map +0 -1
  351. package/dist/app/assets/Pricing-p-NIjjtK.js +0 -29
  352. package/dist/app/assets/Pricing-p-NIjjtK.js.map +0 -1
  353. package/dist/app/assets/Privacy-BhfPkK0y.js +0 -2
  354. package/dist/app/assets/Privacy-BhfPkK0y.js.map +0 -1
  355. package/dist/app/assets/Proof-D-7QbTGX.js +0 -20
  356. package/dist/app/assets/Proof-D-7QbTGX.js.map +0 -1
  357. package/dist/app/assets/Security-DFafJQIT.js +0 -2
  358. package/dist/app/assets/Security-DFafJQIT.js.map +0 -1
  359. package/dist/app/assets/SignIn--6nNsUCm.js +0 -2
  360. package/dist/app/assets/SignIn--6nNsUCm.js.map +0 -1
  361. package/dist/app/assets/SignUp-yh5ydmFf.js +0 -2
  362. package/dist/app/assets/SignUp-yh5ydmFf.js.map +0 -1
  363. package/dist/app/assets/SiteHeader-NTK-cM9O.js +0 -2
  364. package/dist/app/assets/SiteHeader-NTK-cM9O.js.map +0 -1
  365. package/dist/app/assets/StickyMobileCta-DVXAyhaH.js +0 -2
  366. package/dist/app/assets/StickyMobileCta-DVXAyhaH.js.map +0 -1
  367. package/dist/app/assets/StoreAssetsPipeline-Cbs1bNK5.js +0 -6
  368. package/dist/app/assets/StoreAssetsPipeline-Cbs1bNK5.js.map +0 -1
  369. package/dist/app/assets/Success-C3n0m1XU.js +0 -2
  370. package/dist/app/assets/Success-C3n0m1XU.js.map +0 -1
  371. package/dist/app/assets/Terms-C72ybAwA.js +0 -2
  372. package/dist/app/assets/Terms-C72ybAwA.js.map +0 -1
  373. package/dist/app/assets/ToolGuardrailsPanel-meKxUeSB.js +0 -2
  374. package/dist/app/assets/ToolGuardrailsPanel-meKxUeSB.js.map +0 -1
  375. package/dist/app/assets/ToolsIndex-CnvNTvyW.js +0 -6
  376. package/dist/app/assets/ToolsIndex-CnvNTvyW.js.map +0 -1
  377. package/dist/app/assets/WorkloadCalculator-CK4qVUcQ.js +0 -5
  378. package/dist/app/assets/WorkloadCalculator-CK4qVUcQ.js.map +0 -1
  379. package/dist/app/assets/arrow-right-Dglia5EE.js +0 -2
  380. package/dist/app/assets/arrow-right-Dglia5EE.js.map +0 -1
  381. package/dist/app/assets/calculator-CAgtsVuH.js +0 -2
  382. package/dist/app/assets/calculator-CAgtsVuH.js.map +0 -1
  383. package/dist/app/assets/check-B5h9hATV.js +0 -2
  384. package/dist/app/assets/check-B5h9hATV.js.map +0 -1
  385. package/dist/app/assets/chevron-down-By2Ts8dG.js +0 -2
  386. package/dist/app/assets/chevron-down-By2Ts8dG.js.map +0 -1
  387. package/dist/app/assets/circle-check-DaJ6APMi.js +0 -2
  388. package/dist/app/assets/circle-check-DaJ6APMi.js.map +0 -1
  389. package/dist/app/assets/clipboard-copy-IDfWU9SE.js +0 -2
  390. package/dist/app/assets/clipboard-copy-IDfWU9SE.js.map +0 -1
  391. package/dist/app/assets/copy-KSn4Rc2b.js +0 -2
  392. package/dist/app/assets/copy-KSn4Rc2b.js.map +0 -1
  393. package/dist/app/assets/crop-C9hwiw0i.js +0 -2
  394. package/dist/app/assets/crop-C9hwiw0i.js.map +0 -1
  395. package/dist/app/assets/download-eqwxO8bs.js +0 -2
  396. package/dist/app/assets/download-eqwxO8bs.js.map +0 -1
  397. package/dist/app/assets/eye-Dg61f0nU.js +0 -2
  398. package/dist/app/assets/eye-Dg61f0nU.js.map +0 -1
  399. package/dist/app/assets/file-text-BQPKCil3.js +0 -2
  400. package/dist/app/assets/file-text-BQPKCil3.js.map +0 -1
  401. package/dist/app/assets/folder-tree-9hq6oigy.js +0 -2
  402. package/dist/app/assets/folder-tree-9hq6oigy.js.map +0 -1
  403. package/dist/app/assets/grid-3x3-BHXRyOIx.js +0 -2
  404. package/dist/app/assets/grid-3x3-BHXRyOIx.js.map +0 -1
  405. package/dist/app/assets/index-my6BmN7T.js +0 -204
  406. package/dist/app/assets/index-my6BmN7T.js.map +0 -1
  407. package/dist/app/assets/index-rv91vbLH.css +0 -1
  408. package/dist/app/assets/layout-grid-DDQvnEgx.js +0 -2
  409. package/dist/app/assets/layout-grid-DDQvnEgx.js.map +0 -1
  410. package/dist/app/assets/rocket-0KMviRpJ.js +0 -2
  411. package/dist/app/assets/rocket-0KMviRpJ.js.map +0 -1
  412. package/dist/app/assets/shield-check-BvKEQ2hc.js +0 -2
  413. package/dist/app/assets/shield-check-BvKEQ2hc.js.map +0 -1
  414. package/dist/app/assets/signIn-Ckla1_0O.js +0 -2
  415. package/dist/app/assets/signIn-Ckla1_0O.js.map +0 -1
  416. package/dist/app/assets/smartphone-I0w1b2DV.js +0 -2
  417. package/dist/app/assets/smartphone-I0w1b2DV.js.map +0 -1
  418. package/dist/app/assets/terminal-CLpUSQqd.js +0 -2
  419. package/dist/app/assets/terminal-CLpUSQqd.js.map +0 -1
  420. package/dist/app/assets/triangle-alert-w7TZ0yy2.js +0 -2
  421. package/dist/app/assets/triangle-alert-w7TZ0yy2.js.map +0 -1
  422. package/dist/app/assets/useAuth-N3hsUaDj.js +0 -4
  423. package/dist/app/assets/useAuth-N3hsUaDj.js.map +0 -1
  424. package/dist/app/assets/users-DsQdkuR3.js +0 -2
  425. package/dist/app/assets/users-DsQdkuR3.js.map +0 -1
  426. package/dist/assets/AgentCli-xKYtzL3B.js +0 -17
  427. package/dist/assets/AgentCli-xKYtzL3B.js.map +0 -1
  428. package/dist/assets/App-C1cNw_fn.js +0 -13
  429. package/dist/assets/App-C1cNw_fn.js.map +0 -1
  430. package/dist/assets/App-oQfE_p3A.css +0 -1
  431. package/dist/assets/AppReviewAso-CaIT-L7Z.js +0 -4
  432. package/dist/assets/AppReviewAso-CaIT-L7Z.js.map +0 -1
  433. package/dist/assets/Cancelled-Dmw7PTD-.js +0 -2
  434. package/dist/assets/Cancelled-Dmw7PTD-.js.map +0 -1
  435. package/dist/assets/CopyButton-CPRHmu8l.js +0 -2
  436. package/dist/assets/CopyButton-CPRHmu8l.js.map +0 -1
  437. package/dist/assets/DesignPartner-Ckp1GhNv.js +0 -4
  438. package/dist/assets/DesignPartner-Ckp1GhNv.js.map +0 -1
  439. package/dist/assets/FastlaneScreenshots-CB-zv5Us.js +0 -100
  440. package/dist/assets/FastlaneScreenshots-CB-zv5Us.js.map +0 -1
  441. package/dist/assets/FirstExport-RXbvVQdK.js +0 -6
  442. package/dist/assets/FirstExport-RXbvVQdK.js.map +0 -1
  443. package/dist/assets/FitPanel-ic91y-49.js +0 -2
  444. package/dist/assets/FitPanel-ic91y-49.js.map +0 -1
  445. package/dist/assets/FivePanelFramework-BZKNcycb.js +0 -62
  446. package/dist/assets/FivePanelFramework-BZKNcycb.js.map +0 -1
  447. package/dist/assets/ForgotPassword-CKOfAvWk.js +0 -2
  448. package/dist/assets/ForgotPassword-CKOfAvWk.js.map +0 -1
  449. package/dist/assets/Landing-D0cuDDUk.js +0 -2
  450. package/dist/assets/Landing-D0cuDDUk.js.map +0 -1
  451. package/dist/assets/LanguageSwitcher-BrToLEgF.js +0 -2
  452. package/dist/assets/LanguageSwitcher-BrToLEgF.js.map +0 -1
  453. package/dist/assets/Legal-Cm-hVzjY.js +0 -2
  454. package/dist/assets/Legal-Cm-hVzjY.js.map +0 -1
  455. package/dist/assets/NotFound-B0I6I440.js +0 -2
  456. package/dist/assets/NotFound-B0I6I440.js.map +0 -1
  457. package/dist/assets/Pricing-p-NIjjtK.js +0 -29
  458. package/dist/assets/Pricing-p-NIjjtK.js.map +0 -1
  459. package/dist/assets/Privacy-BhfPkK0y.js +0 -2
  460. package/dist/assets/Privacy-BhfPkK0y.js.map +0 -1
  461. package/dist/assets/Proof-D-7QbTGX.js +0 -20
  462. package/dist/assets/Proof-D-7QbTGX.js.map +0 -1
  463. package/dist/assets/Security-DFafJQIT.js +0 -2
  464. package/dist/assets/Security-DFafJQIT.js.map +0 -1
  465. package/dist/assets/SignIn--6nNsUCm.js +0 -2
  466. package/dist/assets/SignIn--6nNsUCm.js.map +0 -1
  467. package/dist/assets/SignUp-yh5ydmFf.js +0 -2
  468. package/dist/assets/SignUp-yh5ydmFf.js.map +0 -1
  469. package/dist/assets/SiteHeader-NTK-cM9O.js +0 -2
  470. package/dist/assets/SiteHeader-NTK-cM9O.js.map +0 -1
  471. package/dist/assets/StickyMobileCta-DVXAyhaH.js +0 -2
  472. package/dist/assets/StickyMobileCta-DVXAyhaH.js.map +0 -1
  473. package/dist/assets/StoreAssetsPipeline-Cbs1bNK5.js +0 -6
  474. package/dist/assets/StoreAssetsPipeline-Cbs1bNK5.js.map +0 -1
  475. package/dist/assets/Success-C3n0m1XU.js +0 -2
  476. package/dist/assets/Success-C3n0m1XU.js.map +0 -1
  477. package/dist/assets/Terms-C72ybAwA.js +0 -2
  478. package/dist/assets/Terms-C72ybAwA.js.map +0 -1
  479. package/dist/assets/ToolGuardrailsPanel-meKxUeSB.js +0 -2
  480. package/dist/assets/ToolGuardrailsPanel-meKxUeSB.js.map +0 -1
  481. package/dist/assets/ToolsIndex-CnvNTvyW.js +0 -6
  482. package/dist/assets/ToolsIndex-CnvNTvyW.js.map +0 -1
  483. package/dist/assets/WorkloadCalculator-CK4qVUcQ.js +0 -5
  484. package/dist/assets/WorkloadCalculator-CK4qVUcQ.js.map +0 -1
  485. package/dist/assets/arrow-right-Dglia5EE.js +0 -2
  486. package/dist/assets/arrow-right-Dglia5EE.js.map +0 -1
  487. package/dist/assets/calculator-CAgtsVuH.js +0 -2
  488. package/dist/assets/calculator-CAgtsVuH.js.map +0 -1
  489. package/dist/assets/check-B5h9hATV.js +0 -2
  490. package/dist/assets/check-B5h9hATV.js.map +0 -1
  491. package/dist/assets/chevron-down-By2Ts8dG.js +0 -2
  492. package/dist/assets/chevron-down-By2Ts8dG.js.map +0 -1
  493. package/dist/assets/circle-check-DaJ6APMi.js +0 -2
  494. package/dist/assets/circle-check-DaJ6APMi.js.map +0 -1
  495. package/dist/assets/clipboard-copy-IDfWU9SE.js +0 -2
  496. package/dist/assets/clipboard-copy-IDfWU9SE.js.map +0 -1
  497. package/dist/assets/copy-KSn4Rc2b.js +0 -2
  498. package/dist/assets/copy-KSn4Rc2b.js.map +0 -1
  499. package/dist/assets/crop-C9hwiw0i.js +0 -2
  500. package/dist/assets/crop-C9hwiw0i.js.map +0 -1
  501. package/dist/assets/download-eqwxO8bs.js +0 -2
  502. package/dist/assets/download-eqwxO8bs.js.map +0 -1
  503. package/dist/assets/eye-Dg61f0nU.js +0 -2
  504. package/dist/assets/eye-Dg61f0nU.js.map +0 -1
  505. package/dist/assets/file-text-BQPKCil3.js +0 -2
  506. package/dist/assets/file-text-BQPKCil3.js.map +0 -1
  507. package/dist/assets/folder-tree-9hq6oigy.js +0 -2
  508. package/dist/assets/folder-tree-9hq6oigy.js.map +0 -1
  509. package/dist/assets/grid-3x3-BHXRyOIx.js +0 -2
  510. package/dist/assets/grid-3x3-BHXRyOIx.js.map +0 -1
  511. package/dist/assets/index-my6BmN7T.js +0 -204
  512. package/dist/assets/index-my6BmN7T.js.map +0 -1
  513. package/dist/assets/index-rv91vbLH.css +0 -1
  514. package/dist/assets/layout-grid-DDQvnEgx.js +0 -2
  515. package/dist/assets/layout-grid-DDQvnEgx.js.map +0 -1
  516. package/dist/assets/rocket-0KMviRpJ.js +0 -2
  517. package/dist/assets/rocket-0KMviRpJ.js.map +0 -1
  518. package/dist/assets/shield-check-BvKEQ2hc.js +0 -2
  519. package/dist/assets/shield-check-BvKEQ2hc.js.map +0 -1
  520. package/dist/assets/signIn-Ckla1_0O.js +0 -2
  521. package/dist/assets/signIn-Ckla1_0O.js.map +0 -1
  522. package/dist/assets/smartphone-I0w1b2DV.js +0 -2
  523. package/dist/assets/smartphone-I0w1b2DV.js.map +0 -1
  524. package/dist/assets/terminal-CLpUSQqd.js +0 -2
  525. package/dist/assets/terminal-CLpUSQqd.js.map +0 -1
  526. package/dist/assets/triangle-alert-w7TZ0yy2.js +0 -2
  527. package/dist/assets/triangle-alert-w7TZ0yy2.js.map +0 -1
  528. package/dist/assets/useAuth-N3hsUaDj.js +0 -4
  529. package/dist/assets/useAuth-N3hsUaDj.js.map +0 -1
  530. package/dist/assets/users-DsQdkuR3.js +0 -2
  531. package/dist/assets/users-DsQdkuR3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkloadCalculator-BbFWF2Ls.js","names":[],"sources":["../../src/pages/WorkloadCalculator.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ArrowRight, Calculator, ChevronDown, ClipboardCopy, Download } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport AgentHandoffPanel from '../components/AgentHandoffPanel';\nimport CliPreflightCard from '../components/CliPreflightCard';\nimport CopyButton from '../components/CopyButton';\nimport FitPanel from '../components/FitPanel';\nimport StagingBadge from '../components/StagingBadge';\nimport StickyMobileCta from '../components/StickyMobileCta';\nimport SiteHeader from '../components/SiteHeader';\nimport ToolGuardrailsPanel from '../components/ToolGuardrailsPanel';\nimport usePageTitle from '../hooks/usePageTitle';\nimport { trackEvent, trackEventAndFollowLink } from '../lib/analytics';\n\nconst clampNumber = (value, { min, max, fallback }) => {\n const num = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(num)) return fallback;\n return Math.max(min, Math.min(max, num));\n};\n\nconst normalizeLang = (lang) => {\n const base = (lang || '').split('-')[0];\n return base === 'ja' ? 'ja' : 'en';\n};\n\nconst COPY = {\n en: {\n badge: 'Screenshot workload & size buckets',\n title: 'Screenshot Workload Calculator',\n subtitle:\n 'Existing tools can draft screenshots, but release reruns still break on device x locale scale. Estimate workload first, then choose a minimum set that keeps panel #1 clear and rerunnable.',\n heroCliTitle: 'CLI quickstart (2 steps)',\n heroCliNote: 'wizard -> agent-run --stage (raw mode, no Playwright).',\n heroCliSummary: 'Outputs: fastlane/ + reproducible ZIP + staged upload root + proof reports.',\n heroCliCopyLabel: 'Copy all commands',\n heroCliTemplatesLabel: 'Starter templates',\n heroCliConfigLabel: 'config.yml',\n heroCliCsvLabel: 'copy.csv',\n heroCliCmd: [\n 'npx --yes shipscreens wizard',\n 'npx --yes shipscreens agent-run --mode raw --zip --out out/agent --stage',\n ].join('\\n'),\n tellAgentCta: 'Use your agent to trim the matrix',\n agentPromptTitle: 'Recommended: let your coding agent trim the matrix first',\n agentPromptBody: 'Use this when device × locale growth is the real bottleneck, not screenshot drafting.',\n agentPrompt:\n 'Use ShipScreens as the build step for our screenshot release workload. Keep our current design workflow, inspect this repo, choose the best path for this workspace (workspace-local MCP if available, otherwise pure CLI), shrink the device x locale matrix to the smallest set we can rerun confidently, keep panel #1 concrete, generate deterministic Fastlane-ready outputs, run verify/stage, and return a short report with output paths, warnings, and next steps. Only ask me if device or locale scope or panel #1 messaging is unclear.',\n agentPromptNote:\n 'Best flow: hand off once, then approve the minimum matrix and the first export.',\n proUnlockTitle: 'Unlock Pro (CLI)',\n proUnlockBody: 'Remove the watermark and unlock full matrix batch exports via CLI auth:',\n proUnlockCmd: 'npx --yes shipscreens auth login',\n proUnlockNote: 'Completes a one-time browser sign-in; then rerun agent-run with --require-pro.',\n navTools: 'Tools',\n presetsTitle: 'Presets',\n presetIosOnly: 'iOS only',\n presetIosAndroid: 'iOS + Android',\n inputsTitle: 'Inputs',\n resultsTitle: 'Results',\n screenshotsPerLocaleLabel: 'Screenshots per locale',\n screenshotsPerLocaleHelp: 'Typical: 5–8',\n localesLabel: 'Locales',\n localesHelp: 'Typical: 1–12',\n iosDeviceSizesLabel: 'iOS device sizes',\n iosDeviceSizesToggle: 'Include iOS',\n iosDeviceSizesHelp: 'Example: 4 (iPhone + iPad variants)',\n androidDeviceSizesLabel: 'Android device sizes',\n androidDeviceSizesToggle: 'Include Android',\n androidDeviceSizesHelp: 'Example: 2 (phone + tablet)',\n minutesPerImageLabel: 'Manual minutes per image',\n minutesPerImageHelp: 'Estimate: export + rename + folder sorting',\n totalImagesLabel: 'Total images',\n totalImagesFormula: ({ shots, locales, deviceSizes }) => `${shots} shots × ${locales} locales × ${deviceSizes} device sizes`,\n multiplierLabel: 'Multiplier',\n multiplierSuffix: '×',\n multiplierHelp: ({ multiplier }) => `1 base shot turns into ${multiplier} variants`,\n manualTimeLabel: 'Manual time estimate',\n manualTimeFormula: ({ images, minutesPerImage }) => `${images} images × ${minutesPerImage} min/image`,\n withShipScreensLabel: 'With ShipScreens',\n withShipScreensNote:\n 'Bring translations. Wizard scaffolds config + placeholders. ShipScreens locks panel order + layout, then agent-run builds, verifies, stages, and reports Fastlane-ready folders (deliver/supply). Screenshots stay local. Before scaling matrix size, check panel #1: if the same line could fit many apps, rewrite it with one concrete outcome.',\n downloadCsv: 'Download CSV copy template',\n startSample: 'Open sample project (free)',\n example: 'Example: 5 screenshots × 10 locales × 4 device sizes = 200 images.',\n minSetTitle: 'Suggested v1 minimum set',\n minSetBody: 'Use size buckets to avoid the full matrix on day one.',\n minSetBullets: {\n iosBase: 'iPhone-only: start with the largest iPhone bucket + 5 frames.',\n iosIpad: 'Add iPad 13-inch only if you ship iPad-first.',\n androidPhone: 'Android: start with 1 phone bucket.',\n androidTablet: 'Add tablet only if you need it.',\n none: 'Select at least one platform to see a suggested minimum set.',\n },\n minSetNote: 'You can expand later; rerunnable exports make it safe.',\n nextTitle: 'Next: structure your screenshots',\n nextBody: 'Use the 5-panel framework (Hook → Problem → Proof → How → CTA) so screenshot #1 states outcome and audience quickly.',\n nextCtaSample: 'Open sample project',\n nextCta: 'Open 5-panel framework',\n feedbackText:\n 'Want feedback on your screenshot workflow? We are talking to early users and can help set up a reproducible export pipeline.',\n feedbackCta: 'Open 15-min review intake',\n },\n ja: {\n badge: 'スクショ作業量 + サイズバケット',\n title: 'スクショ作業量 計算ツール',\n subtitle: '既存ツールで初稿は作れても、運用では端末x言語で崩れやすい。作業量を先に見積もり、1枚目の訴求が伝わる最小セットと再実行パスを決める。',\n heroCliTitle: 'CLIクイックスタート(2ステップ)',\n heroCliNote: 'wizard -> agent-run --stage(raw / Playwright不要)。',\n heroCliSummary: '出力: fastlane/ + 再現性ZIP + staged upload root + proof report。',\n heroCliCopyLabel: 'コマンドをすべてコピー',\n heroCliTemplatesLabel: 'スターター雛形',\n heroCliConfigLabel: 'config.yml',\n heroCliCsvLabel: 'copy.csv',\n heroCliCmd: [\n 'npx --yes shipscreens wizard',\n 'npx --yes shipscreens agent-run --mode raw --zip --out out/agent --stage',\n ].join('\\n'),\n tellAgentCta: 'coding agent に最小構成を決めさせる',\n agentPromptTitle: '既定導線: coding agent に最小構成を任せる',\n agentPromptBody: 'ボトルネックがスクショ作成そのものではなく、端末×言語の行列増加なら、まずこれを渡します。',\n agentPrompt:\n 'ShipScreens を使って、スクリーンショット運用の release workload を設計して固めてください。既存のデザイン運用は維持し、この repo を確認して、このワークスペースで使えるなら workspace-local MCP、無ければ CLI を選び、端末×言語の行列を最小の再実行しやすい構成に絞り、1枚目訴求を具体化し、verify と stage を実行し、出力パス・警告・次の作業を短く報告してください。端末/言語スコープか 1枚目訴求が不明なときだけ確認してください。',\n agentPromptNote:\n 'おすすめは、1回指示してサイズバケットと最初のエクスポートだけ確認することです。',\n proUnlockTitle: 'Proを解除(CLI)',\n proUnlockBody: '透かし解除&フル一括(端末×言語)のために、まずはCLI認証を実行:',\n proUnlockCmd: 'npx --yes shipscreens auth login',\n proUnlockNote: '初回のみブラウザでサインインします。以後は agent-run --require-pro で再実行。',\n navTools: 'ツール',\n presetsTitle: 'プリセット',\n presetIosOnly: 'iOS のみ',\n presetIosAndroid: 'iOS + Android',\n inputsTitle: '入力',\n resultsTitle: '結果',\n screenshotsPerLocaleLabel: '言語あたりのスクショ枚数',\n screenshotsPerLocaleHelp: '目安: 5〜8',\n localesLabel: '言語数',\n localesHelp: '目安: 1〜12',\n iosDeviceSizesLabel: 'iOS 端末サイズ数',\n iosDeviceSizesToggle: 'iOS を含める',\n iosDeviceSizesHelp: '例: 4(iPhone + iPad など)',\n androidDeviceSizesLabel: 'Android 端末サイズ数',\n androidDeviceSizesToggle: 'Android を含める',\n androidDeviceSizesHelp: '例: 2(スマホ + タブレット)',\n minutesPerImageLabel: '1枚あたりの手作業(分)',\n minutesPerImageHelp: '目安: エクスポート + リネーム + フォルダ整理',\n totalImagesLabel: '合計画像数',\n totalImagesFormula: ({ shots, locales, deviceSizes }) => `${shots} 枚 × ${locales} 言語 × ${deviceSizes} サイズ`,\n multiplierLabel: '増加倍率',\n multiplierSuffix: '倍',\n multiplierHelp: ({ multiplier }) => `1枚が ${multiplier} 枚に増える`,\n manualTimeLabel: '手作業の見積もり',\n manualTimeFormula: ({ images, minutesPerImage }) => `${images} 枚 × ${minutesPerImage} 分/枚`,\n withShipScreensLabel: 'ShipScreens なら',\n withShipScreensNote:\n '翻訳は外部でOK。wizard で雛形を作り、訴求順 + レイアウト固定 -> Fastlane公式パスへ再現性出力。提出前チェック(verify と stage)で混在や制約をアップロード前に検知します。スクショはローカル。行列を増やす前に「1枚目見出しが他の多くのアプリにも当てはまるなら、成果を具体化して書き直す」を実施。',\n downloadCsv: 'CSVコピー雛形をダウンロード',\n startSample: 'サンプルを開く(無料)',\n example: '例: 5枚 × 10言語 × 4サイズ = 200枚',\n minSetTitle: 'v1最小セットの目安',\n minSetBody: 'サイズバケットでまず出す。',\n minSetBullets: {\n iosBase: 'iPhone-only: 最大サイズ1バケット + 5枚',\n iosIpad: 'iPadは13-inchが必要な場合のみ',\n androidPhone: 'Androidはスマホ1バケットから',\n androidTablet: '必要ならタブレットを追加',\n none: '少なくとも1つのプラットフォームを選択してください。',\n },\n minSetNote: '後から増やせる。再実行できるから安心。',\n nextTitle: '次: スクショの構成を固める',\n nextBody: '5枚構成テンプレ(Hook→Problem→Proof→How→CTA)で、1枚目に成果と対象ユーザーを明確に置けます。',\n nextCtaSample: 'サンプルを開く',\n nextCta: '5枚構成テンプレを開く',\n feedbackText: 'スクショ作業フローの相談があれば、15分だけ聞かせてください。改善案やテンプレをご案内します。',\n feedbackCta: '15分レビューを開く',\n },\n};\n\nconst WorkloadCalculator = () => {\n const { t, i18n } = useTranslation();\n usePageTitle('titles.workloadCalculator');\n\n const lang = normalizeLang(i18n.resolvedLanguage || i18n.language);\n const numberLocale = lang === 'ja' ? 'ja-JP' : 'en-US';\n const copy = COPY[lang] || COPY.en;\n const partnerCopy = t('landing.partner', { returnObjects: true }) || {};\n const partnerScopeBullets = Array.isArray(partnerCopy.scopeBullets) ? partnerCopy.scopeBullets.filter(Boolean) : [];\n const openAppHref = '/app/?sample=5panel&entry_source=screenshot_workload_calculator_open_app_header';\n const agentHandoffHref = '#agent-handoff';\n const agentCliGuideHref = '/tools/agent-cli/?entry_source=screenshot_workload_calculator_agent_handoff#agent-bootstrap';\n const designPartnerHref =\n '/design-partner/?entry_source=screenshot_workload_calculator_design_partner_offer&scope=matrix&workflow=figma&blocker=naming_order';\n const payFirstPartnerHref = '/pricing?offer=pay_first&entry_source=screenshot_workload_calculator_pay_first_partner_block';\n const configDownloadHref = '/downloads/shipscreens-agent-cli-config.yml';\n const csvDownloadHref = '/downloads/shipscreens-agent-cli-copy.csv';\n const sampleProjectHref = '/app/?sample=5panel&entry_source=screenshot_workload_calculator_open_sample_project';\n const designPartnerOfferLabel = lang === 'ja' ? 'オファー詳細を見る' : 'See offer details';\n const supportEmail = 'support@shimaumaservices.co.jp';\n const partnerSubject = t('landing.partner.emailSubject', { defaultValue: 'ShipScreens release setup review' });\n const partnerBody = t('landing.partner.emailBody', { defaultValue: '' });\n const partnerMailto = `mailto:${supportEmail}?subject=${encodeURIComponent(partnerSubject)}&body=${encodeURIComponent(\n partnerBody\n )}`;\n const copyButtonLabel = t('common.copy', { defaultValue: 'Copy' });\n const codeToggleLabel = t('common.showCommands', { defaultValue: 'Show commands' });\n const defaultCodeOpen = typeof window === 'undefined' ? true : window.matchMedia('(min-width: 640px)').matches;\n\n const numberFormatter = useMemo(() => new Intl.NumberFormat(numberLocale), [numberLocale]);\n const formatNumber = useCallback((value) => numberFormatter.format(value), [numberFormatter]);\n const formatDuration = useCallback(\n (minutes) => {\n if (!Number.isFinite(minutes) || minutes <= 0) return lang === 'ja' ? '0分' : '0m';\n if (minutes < 60) return `${Math.round(minutes)}${lang === 'ja' ? '分' : 'm'}`;\n const hours = minutes / 60;\n if (hours < 24) return `${hours.toFixed(hours < 10 ? 1 : 0)}${lang === 'ja' ? '時間' : 'h'}`;\n const days = hours / 24;\n return `${days.toFixed(days < 10 ? 1 : 0)}${lang === 'ja' ? '日' : 'd'}`;\n },\n [lang]\n );\n\n useEffect(() => {\n trackEvent('tool_view', { tool: 'screenshot_workload_calculator' });\n }, []);\n\n const hasInteractedRef = useRef(false);\n const markInteracted = useCallback(() => {\n if (hasInteractedRef.current) return;\n hasInteractedRef.current = true;\n trackEvent('tool_interact', { tool: 'screenshot_workload_calculator' });\n }, []);\n\n const [screenshotsPerLocale, setScreenshotsPerLocale] = useState(5);\n const [localeCount, setLocaleCount] = useState(10);\n const [includeIOS, setIncludeIOS] = useState(true);\n const [includeAndroid, setIncludeAndroid] = useState(true);\n const [iosDeviceSizes, setIosDeviceSizes] = useState(4);\n const [androidDeviceSizes, setAndroidDeviceSizes] = useState(2);\n const [minutesPerImage, setMinutesPerImage] = useState(2);\n\n const minSetBullets = useMemo(() => {\n const bullets = [];\n if (includeIOS) {\n if (copy.minSetBullets?.iosBase) bullets.push(copy.minSetBullets.iosBase);\n if (copy.minSetBullets?.iosIpad) bullets.push(copy.minSetBullets.iosIpad);\n }\n if (includeAndroid) {\n if (copy.minSetBullets?.androidPhone) bullets.push(copy.minSetBullets.androidPhone);\n if (androidDeviceSizes > 1 && copy.minSetBullets?.androidTablet) {\n bullets.push(copy.minSetBullets.androidTablet);\n }\n }\n if (!bullets.length && copy.minSetBullets?.none) {\n bullets.push(copy.minSetBullets.none);\n }\n return bullets;\n }, [copy, includeIOS, includeAndroid, androidDeviceSizes]);\n\n const presets = useMemo(\n () => [\n {\n key: 'ios_only',\n label: copy.presetIosOnly,\n localeCount: 6,\n screenshotsPerLocale: 5,\n includeIOS: true,\n iosDeviceSizes: 2,\n includeAndroid: false,\n androidDeviceSizes: 0,\n },\n {\n key: 'ios_android',\n label: copy.presetIosAndroid,\n localeCount: 6,\n screenshotsPerLocale: 5,\n includeIOS: true,\n iosDeviceSizes: 2,\n includeAndroid: true,\n androidDeviceSizes: 1,\n },\n ],\n [copy.presetIosAndroid, copy.presetIosOnly]\n );\n\n const applyPreset = useCallback(\n (preset) => {\n if (!preset) return;\n markInteracted();\n setLocaleCount(preset.localeCount);\n setScreenshotsPerLocale(preset.screenshotsPerLocale);\n setIncludeIOS(preset.includeIOS);\n setIosDeviceSizes(preset.iosDeviceSizes);\n setIncludeAndroid(preset.includeAndroid);\n setAndroidDeviceSizes(preset.androidDeviceSizes);\n },\n [markInteracted]\n );\n\n const totals = useMemo(() => {\n const shots = clampNumber(screenshotsPerLocale, { min: 1, max: 50, fallback: 5 });\n const locales = clampNumber(localeCount, { min: 1, max: 50, fallback: 10 });\n const iosSizes = includeIOS ? clampNumber(iosDeviceSizes, { min: 1, max: 10, fallback: 4 }) : 0;\n const androidSizes = includeAndroid ? clampNumber(androidDeviceSizes, { min: 1, max: 10, fallback: 2 }) : 0;\n const deviceSizes = iosSizes + androidSizes;\n const totalImages = shots * locales * deviceSizes;\n const multiplier = locales * deviceSizes;\n const manualMinutes = totalImages * clampNumber(minutesPerImage, { min: 0.25, max: 30, fallback: 2 });\n\n return {\n shots,\n locales,\n iosSizes,\n androidSizes,\n deviceSizes,\n totalImages,\n multiplier,\n manualMinutes,\n };\n }, [androidDeviceSizes, includeAndroid, includeIOS, iosDeviceSizes, localeCount, minutesPerImage, screenshotsPerLocale]);\n\n const downloadCsvTemplate = () => {\n const slideCount = Math.min(50, Math.max(1, Math.trunc(totals.shots)));\n const headerCells = ['Locale'];\n for (let i = 1; i <= slideCount; i += 1) {\n headerCells.push(`Header_${i}`, `Subtitle_${i}`);\n }\n const enRow = ['en-US'];\n const jaRow = ['ja-JP'];\n for (let i = 1; i <= slideCount; i += 1) {\n enRow.push(`Headline ${i}`, `Subtitle ${i}`);\n jaRow.push(`ヘッドライン${i}`, `サブタイトル${i}`);\n }\n const csvLines = [headerCells.join(','), enRow.join(','), jaRow.join(',')];\n const csvContent = `\\ufeff${csvLines.join('\\n')}`;\n const csv = `data:text/csv;charset=utf-8,${encodeURIComponent(csvContent)}`;\n const link = document.createElement('a');\n link.href = csv;\n link.download = 'shipscreens-copy-template.csv';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n trackEvent('tool_download', { tool: 'screenshot_workload_calculator', asset: 'csv_template' });\n };\n\n return (\n <div className=\"min-h-screen bg-linear-to-b from-slate-950 via-slate-900 to-slate-950 text-white\">\n <StagingBadge />\n <SiteHeader\n variant=\"dark\"\n active=\"tools\"\n openAppHref={openAppHref}\n onToolsClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'open_tools_header' })\n }\n onPricingClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'pricing_header' })\n }\n onOpenAppClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'open_app_header' })\n }\n primaryCta={{\n href: agentHandoffHref,\n label: (\n <span className=\"inline-flex items-center gap-2\">\n {copy.tellAgentCta} <ArrowRight size={16} />\n </span>\n ),\n onClick: (event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_agent_handoff_header',\n }),\n }}\n />\n\n <main className=\"max-w-5xl mx-auto px-6 pb-24 space-y-10\">\n <section className=\"max-w-3xl mx-auto text-center space-y-4\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full border border-slate-800 bg-slate-900/60 text-slate-200 text-xs font-semibold\">\n <Calculator size={14} />\n {copy.badge}\n </div>\n <h1 className=\"text-3xl md:text-5xl font-black leading-tight\">{copy.title}</h1>\n <p className=\"text-slate-300 text-lg leading-relaxed\">\n {copy.subtitle}\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center pt-2\">\n <a\n href={agentHandoffHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_agent_handoff_hero',\n })\n }\n className=\"inline-flex items-center justify-center gap-2 px-5 py-3 rounded-xl bg-blue-500 text-white font-bold hover:bg-blue-600 transition\"\n >\n {copy.tellAgentCta} <ArrowRight size={16} />\n </a>\n <a\n href={sampleProjectHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_sample_project_hero',\n })\n }\n className=\"inline-flex items-center justify-center gap-2 px-5 py-3 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 font-bold hover:bg-slate-900 transition\"\n >\n {copy.startSample} <ArrowRight size={16} />\n </a>\n </div>\n <AgentHandoffPanel\n sectionId=\"agent-handoff\"\n lang={lang}\n prompt={copy.agentPrompt}\n promptTitle={copy.agentPromptTitle}\n promptBody={copy.agentPromptBody}\n promptNote={copy.agentPromptNote}\n guideHref={agentCliGuideHref}\n className=\"max-w-4xl mx-auto text-left\"\n onPromptCopied={(client) =>\n trackEvent('tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'copy_agent_prompt', client: client.id })\n }\n onBundleCopied={(client) =>\n trackEvent('tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: `copy_bootstrap_bundle_${client.id}`,\n client: client.id,\n })\n }\n onClientCommandCopied={(client) =>\n trackEvent('tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: `copy_client_bootstrap_${client.id}`,\n client: client.id,\n })\n }\n onClientDownload={(client) =>\n trackEvent('tool_download', {\n tool: 'screenshot_workload_calculator',\n asset: `client_bootstrap_${client.id}`,\n client: client.id,\n })\n }\n onGuideClick={(event, client) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_agent_handoff_guide',\n client: client.id,\n })\n }\n />\n <div className=\"max-w-xl mx-auto text-left bg-slate-900/60 border border-slate-800 rounded-2xl p-4 space-y-2\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold\">{copy.heroCliTitle}</div>\n <p className=\"text-xs text-slate-400\">{copy.heroCliNote}</p>\n <p className=\"text-xs text-slate-500\">{copy.heroCliSummary}</p>\n <CopyButton\n value={copy.heroCliCmd}\n onCopied={() => trackEvent('tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'copy_cli_hero' })}\n className=\"inline-flex items-center justify-center gap-2 px-3 py-2 rounded-lg border border-slate-700 bg-slate-950 text-slate-200 hover:bg-slate-900 transition text-xs font-semibold\"\n >\n {({ copyLabel, copyState }) => (\n <>\n <ClipboardCopy size={14} />\n {copyState === 'idle' ? copy.heroCliCopyLabel : copyLabel || copyButtonLabel}\n </>\n )}\n </CopyButton>\n <details className=\"group\" open={defaultCodeOpen}>\n <summary className=\"flex items-center justify-between text-[11px] font-semibold text-slate-400 cursor-pointer list-none\">\n <span>{codeToggleLabel}</span>\n <ChevronDown size={14} className=\"text-slate-500 transition-transform duration-200 group-open:rotate-180\" />\n </summary>\n <div className=\"mt-2 rounded-xl border border-slate-800 bg-slate-950 p-3\">\n <pre className=\"text-xs text-slate-200 whitespace-pre-wrap\">{copy.heroCliCmd}</pre>\n </div>\n </details>\n <div className=\"pt-1 space-y-2\">\n <div className=\"text-[10px] uppercase tracking-[0.2em] text-slate-500 font-semibold\">\n {copy.heroCliTemplatesLabel}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <a\n href={configDownloadHref}\n download\n onClick={() => trackEvent('tool_download', { tool: 'screenshot_workload_calculator', asset: 'config_template' })}\n className=\"inline-flex items-center justify-center gap-2 px-2.5 py-1.5 rounded-md border border-slate-700 bg-slate-950 text-[11px] text-slate-200 hover:bg-slate-900 transition\"\n >\n {copy.heroCliConfigLabel}\n </a>\n <a\n href={csvDownloadHref}\n download\n onClick={() => trackEvent('tool_download', { tool: 'screenshot_workload_calculator', asset: 'copy_template' })}\n className=\"inline-flex items-center justify-center gap-2 px-2.5 py-1.5 rounded-md border border-slate-700 bg-slate-950 text-[11px] text-slate-200 hover:bg-slate-900 transition\"\n >\n {copy.heroCliCsvLabel}\n </a>\n </div>\n </div>\n </div>\n <ToolGuardrailsPanel\n title={lang === 'ja' ? '詳細: CLIガードレール + Pro解除' : 'Advanced: CLI guardrails + Pro unlock'}\n codeToggleLabel={codeToggleLabel}\n copyButtonLabel={copyButtonLabel}\n preflightHref=\"/tools/agent-cli/#preflight\"\n onPreflightClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_cli_preflight',\n })\n }\n proUnlockTitle={copy.proUnlockTitle}\n proUnlockBody={copy.proUnlockBody}\n proUnlockCmd={copy.proUnlockCmd}\n proUnlockNote={copy.proUnlockNote}\n onProUnlockCopied={() =>\n trackEvent('tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'copy_cli_pro_unlock' })\n }\n />\n <CliPreflightCard\n compact\n href=\"/tools/agent-cli/#preflight\"\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_cli_preflight_card',\n })\n }\n className=\"max-w-xl mx-auto\"\n />\n </section>\n\n <FitPanel className=\"max-w-4xl mx-auto w-full\" />\n\n <section className=\"grid lg:grid-cols-2 gap-6\">\n <div className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-5\">\n <h2 className=\"text-lg font-bold text-white\">{copy.inputsTitle}</h2>\n\n <div className=\"space-y-2\">\n <div className=\"text-[10px] font-bold text-slate-400 uppercase tracking-wider\">\n {copy.presetsTitle}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {presets.map((preset) => (\n <button\n key={preset.key}\n type=\"button\"\n onClick={() => applyPreset(preset)}\n className=\"px-3 py-1.5 rounded-lg border border-slate-700 bg-slate-950 text-xs font-semibold text-slate-200 hover:bg-slate-900 transition-colors\"\n >\n {preset.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <label className=\"space-y-1\">\n <div className=\"text-sm font-semibold text-slate-200\">{copy.screenshotsPerLocaleLabel}</div>\n <input\n type=\"number\"\n min={1}\n max={50}\n value={screenshotsPerLocale}\n onChange={(e) => {\n markInteracted();\n setScreenshotsPerLocale(clampNumber(e.target.value, { min: 1, max: 50, fallback: 5 }));\n }}\n className=\"w-full rounded-xl bg-slate-950 border border-slate-800 px-3 py-2 text-white focus:outline-hidden focus:ring-2 focus:ring-blue-500/60\"\n />\n <div className=\"text-xs text-slate-500\">{copy.screenshotsPerLocaleHelp}</div>\n </label>\n\n <label className=\"space-y-1\">\n <div className=\"text-sm font-semibold text-slate-200\">{copy.localesLabel}</div>\n <input\n type=\"number\"\n min={1}\n max={50}\n value={localeCount}\n onChange={(e) => {\n markInteracted();\n setLocaleCount(clampNumber(e.target.value, { min: 1, max: 50, fallback: 10 }));\n }}\n className=\"w-full rounded-xl bg-slate-950 border border-slate-800 px-3 py-2 text-white focus:outline-hidden focus:ring-2 focus:ring-blue-500/60\"\n />\n <div className=\"text-xs text-slate-500\">{copy.localesHelp}</div>\n </label>\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold text-slate-200\">{copy.iosDeviceSizesLabel}</div>\n <label className=\"flex items-center gap-2 text-xs text-slate-400\">\n <input\n type=\"checkbox\"\n checked={includeIOS}\n onChange={(e) => {\n markInteracted();\n setIncludeIOS(e.target.checked);\n }}\n />\n {copy.iosDeviceSizesToggle}\n </label>\n </div>\n <input\n type=\"number\"\n min={1}\n max={10}\n disabled={!includeIOS}\n value={iosDeviceSizes}\n onChange={(e) => {\n markInteracted();\n setIosDeviceSizes(clampNumber(e.target.value, { min: 1, max: 10, fallback: 4 }));\n }}\n className=\"w-full rounded-xl bg-slate-950 border border-slate-800 px-3 py-2 text-white disabled:opacity-40 focus:outline-hidden focus:ring-2 focus:ring-blue-500/60\"\n />\n <div className=\"text-xs text-slate-500\">{copy.iosDeviceSizesHelp}</div>\n </div>\n\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm font-semibold text-slate-200\">{copy.androidDeviceSizesLabel}</div>\n <label className=\"flex items-center gap-2 text-xs text-slate-400\">\n <input\n type=\"checkbox\"\n checked={includeAndroid}\n onChange={(e) => {\n markInteracted();\n setIncludeAndroid(e.target.checked);\n }}\n />\n {copy.androidDeviceSizesToggle}\n </label>\n </div>\n <input\n type=\"number\"\n min={1}\n max={10}\n disabled={!includeAndroid}\n value={androidDeviceSizes}\n onChange={(e) => {\n markInteracted();\n setAndroidDeviceSizes(clampNumber(e.target.value, { min: 1, max: 10, fallback: 2 }));\n }}\n className=\"w-full rounded-xl bg-slate-950 border border-slate-800 px-3 py-2 text-white disabled:opacity-40 focus:outline-hidden focus:ring-2 focus:ring-blue-500/60\"\n />\n <div className=\"text-xs text-slate-500\">{copy.androidDeviceSizesHelp}</div>\n </div>\n\n <label className=\"space-y-1\">\n <div className=\"text-sm font-semibold text-slate-200\">{copy.minutesPerImageLabel}</div>\n <input\n type=\"number\"\n min={0.25}\n max={30}\n step={0.25}\n value={minutesPerImage}\n onChange={(e) => {\n markInteracted();\n setMinutesPerImage(clampNumber(e.target.value, { min: 0.25, max: 30, fallback: 2 }));\n }}\n className=\"w-full rounded-xl bg-slate-950 border border-slate-800 px-3 py-2 text-white focus:outline-hidden focus:ring-2 focus:ring-blue-500/60\"\n />\n <div className=\"text-xs text-slate-500\">{copy.minutesPerImageHelp}</div>\n </label>\n </div>\n\n <div className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-5\">\n <h2 className=\"text-lg font-bold text-white\">{copy.resultsTitle}</h2>\n\n <div className=\"grid sm:grid-cols-2 gap-4\">\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950 p-4\">\n <div className=\"text-xs text-slate-500\">{copy.totalImagesLabel}</div>\n <div className=\"text-3xl font-black text-white\">{formatNumber(totals.totalImages)}</div>\n <div className=\"text-xs text-slate-500 mt-1\">\n {copy.totalImagesFormula({\n shots: formatNumber(totals.shots),\n locales: formatNumber(totals.locales),\n deviceSizes: formatNumber(totals.deviceSizes),\n })}\n </div>\n </div>\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950 p-4\">\n <div className=\"text-xs text-slate-500\">{copy.multiplierLabel}</div>\n <div className=\"text-3xl font-black text-white\">\n {formatNumber(totals.multiplier)}\n {copy.multiplierSuffix}\n </div>\n <div className=\"text-xs text-slate-500 mt-1\">{copy.multiplierHelp({ multiplier: formatNumber(totals.multiplier) })}</div>\n </div>\n </div>\n\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950 p-4 space-y-2\">\n <div className=\"text-xs text-slate-500\">{copy.manualTimeLabel}</div>\n <div className=\"text-2xl font-black text-white\">{formatDuration(totals.manualMinutes)}</div>\n <div className=\"text-xs text-slate-500\">\n {copy.manualTimeFormula({ images: formatNumber(totals.totalImages), minutesPerImage: formatNumber(minutesPerImage) })}\n </div>\n </div>\n\n <div className=\"rounded-2xl border border-blue-500/40 bg-blue-500/10 p-4 space-y-2\">\n <div className=\"text-xs text-blue-200 font-semibold\">{copy.withShipScreensLabel}</div>\n <div className=\"text-sm text-slate-200\">\n {lang === 'ja' ? (\n <>\n 元スクショ <span className=\"font-bold text-white\">{formatNumber(totals.shots)}</span> 枚と CSV{' '}\n <span className=\"font-bold text-white\">{formatNumber(totals.locales)}</span> 行を用意して、一括で出力できます。\n </>\n ) : (\n <>\n Prepare <span className=\"font-bold text-white\">{formatNumber(totals.shots)}</span> base screenshots, import{' '}\n <span className=\"font-bold text-white\">{formatNumber(totals.locales)}</span> locales, then export the full set.\n </>\n )}\n </div>\n <div className=\"text-xs text-slate-300\">{copy.withShipScreensNote}</div>\n </div>\n\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950 p-4 space-y-2\">\n <div className=\"text-xs text-slate-500\">{copy.minSetTitle}</div>\n <div className=\"text-sm text-slate-200\">{copy.minSetBody}</div>\n <ul className=\"text-xs text-slate-400 space-y-1 list-disc list-inside\">\n {minSetBullets.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n <div className=\"text-xs text-slate-500\">{copy.minSetNote}</div>\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={downloadCsvTemplate}\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 hover:bg-slate-900 transition\"\n >\n <Download size={16} />\n {copy.downloadCsv}\n </button>\n <a\n href={agentHandoffHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_agent_handoff_results',\n })\n }\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl bg-blue-500 text-white font-bold hover:bg-blue-600 transition\"\n >\n {copy.tellAgentCta} <ArrowRight size={16} />\n </a>\n <a\n href={sampleProjectHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_sample_project_results',\n })\n }\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 font-bold hover:bg-slate-900 transition\"\n >\n {copy.startSample} <ArrowRight size={16} />\n </a>\n </div>\n\n <div className=\"text-xs text-slate-500\">\n {lang === 'ja' ? (\n <>\n 例: 5枚 × 10言語 × 4サイズ = <span className=\"text-slate-200 font-semibold\">200枚</span>.\n </>\n ) : (\n <>\n Example: 5 screenshots × 10 locales × 4 device sizes = <span className=\"text-slate-200 font-semibold\">200 images</span>.\n </>\n )}\n </div>\n </div>\n </section>\n\n <section className=\"max-w-3xl mx-auto bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4\">\n <p className=\"text-sm text-slate-400\">{copy.feedbackText}</p>\n <div className=\"text-lg font-bold text-white\">{partnerCopy.title || copy.feedbackCta}</div>\n <div className=\"text-sm text-slate-300 leading-relaxed\">{partnerCopy.body}</div>\n {partnerScopeBullets.length > 0 && (\n <ul className=\"space-y-2 text-sm text-slate-300 list-disc pl-5\">\n {partnerScopeBullets.map((item) => (\n <li key={item}>{item}</li>\n ))}\n </ul>\n )}\n <a\n href={designPartnerHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_design_partner_offer',\n })\n }\n className=\"inline-flex items-center gap-2 text-sm text-blue-300 hover:text-blue-200 transition-colors underline underline-offset-4\"\n >\n {designPartnerOfferLabel} <ArrowRight size={14} />\n </a>\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <a\n href={partnerMailto}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'email_design_partner',\n })\n }\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl bg-blue-500 text-white font-bold hover:bg-blue-600 transition\"\n >\n {partnerCopy.emailCta || t('landing.partner.emailCta')} <ArrowRight size={16} />\n </a>\n <a\n href=\"https://x.com/shipscreenscom\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={() => trackEvent('tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'dm_design_partner' })}\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 font-bold hover:bg-slate-900 transition\"\n >\n {partnerCopy.dmCta || t('landing.partner.dmCta')}\n </a>\n <a\n href={payFirstPartnerHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_pay_first_from_partner_block',\n })\n }\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl border border-emerald-500/40 bg-emerald-500/10 text-emerald-100 font-bold hover:bg-emerald-500/15 transition\"\n >\n {partnerCopy.payFirstCta || t('landing.partner.payFirstCta')} <ArrowRight size={16} />\n </a>\n </div>\n <div className=\"text-xs text-slate-500\">\n {partnerCopy.emailLabel || t('landing.partner.emailLabel')}{' '}\n <a href={`mailto:${supportEmail}`} className=\"underline underline-offset-4 hover:text-white\">\n {supportEmail}\n </a>\n </div>\n </section>\n\n <section className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 flex flex-col md:flex-row items-start md:items-center justify-between gap-4\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-bold text-white\">{copy.nextTitle}</div>\n <div className=\"text-sm text-slate-300\">{copy.nextBody}</div>\n </div>\n <div className=\"flex flex-col sm:flex-row gap-3 w-full md:w-auto\">\n <a\n href={sampleProjectHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'open_sample_project',\n })\n }\n className=\"inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl bg-blue-500 text-white font-bold hover:bg-blue-600 transition w-full md:w-auto\"\n >\n {copy.nextCtaSample} <ArrowRight size={16} />\n </a>\n <a\n href=\"/tools/5-panel-screenshot-framework/\"\n onClick={() => trackEvent('tool_cta_click', { tool: 'screenshot_workload_calculator', cta: 'open_framework' })}\n className=\"inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 font-bold hover:bg-slate-900 transition w-full md:w-auto\"\n >\n {copy.nextCta} <ArrowRight size={16} />\n </a>\n </div>\n </section>\n </main>\n <StickyMobileCta\n primary={{\n label: copy.tellAgentCta,\n href: agentHandoffHref,\n onClick: (event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'sticky_primary_agent',\n }),\n }}\n secondary={{\n label: copy.startSample,\n href: sampleProjectHref,\n onClick: (event) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'screenshot_workload_calculator',\n cta: 'sticky_secondary_sample',\n }),\n }}\n />\n </div>\n );\n};\n\nexport default WorkloadCalculator;\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=`shipscreens-agent-client`,t=(e,t=[],n=null)=>t.includes(e)?e:n,n=(n=[],r=null)=>{if(typeof window>`u`)return r;try{return t(window.localStorage.getItem(e),n,r)}catch{return r}},r=t=>{if(!(!t||typeof window>`u`))try{window.localStorage.setItem(e,t)}catch{}};export{n,t as r,r as t};
2
+ //# sourceMappingURL=agentHandoff-BGmHqDwv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentHandoff-BGmHqDwv.js","names":[],"sources":["../../src/lib/agentHandoff.js"],"sourcesContent":["export const AGENT_HANDOFF_STORAGE_KEY = 'shipscreens-agent-client';\n\nexport const resolveAgentClientId = (candidate, validIds = [], fallback = null) =>\n validIds.includes(candidate) ? candidate : fallback;\n\nexport const readPersistedAgentClientId = (validIds = [], fallback = null) => {\n if (typeof window === 'undefined') return fallback;\n try {\n return resolveAgentClientId(window.localStorage.getItem(AGENT_HANDOFF_STORAGE_KEY), validIds, fallback);\n } catch {\n return fallback;\n }\n};\n\nexport const persistAgentClientId = (clientId) => {\n if (!clientId || typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(AGENT_HANDOFF_STORAGE_KEY, clientId);\n } catch {\n // Ignore storage failures; the handoff still works without persistence.\n }\n};\n"],"mappings":"AAAA,IAAa,EAA4B,2BAE5B,GAAwB,EAAW,EAAW,CAAC,EAAG,EAAW,OACxE,EAAS,SAAS,CAAS,EAAI,EAAY,EAEhC,GAA8B,EAAW,CAAC,EAAG,EAAW,OAAS,CAC5E,GAAI,OAAO,OAAW,IAAa,OAAO,EAC1C,GAAI,CACF,OAAO,EAAqB,OAAO,aAAa,QAAQ,CAAyB,EAAG,EAAU,CAAQ,CACxG,MAAQ,CACN,OAAO,CACT,CACF,EAEa,EAAwB,GAAa,CAC5C,MAAC,GAAY,OAAO,OAAW,KACnC,GAAI,CACF,OAAO,aAAa,QAAQ,EAA2B,CAAQ,CACjE,MAAQ,CAER,CACF"}
@@ -0,0 +1,2 @@
1
+ var e=``,t={"Content-Type":`application/json`},n=e=>e?{Authorization:`Bearer ${e}`}:void 0,r=async(n,r={})=>{let i=`${e}${n}`,a=await fetch(i,{...r,headers:{...t,...r.headers||{}}});if(!a.ok){let e=await a.text();throw a.status===401&&typeof window<`u`&&window.dispatchEvent(new CustomEvent(`auth:unauthorized`)),Error(`API error ${a.status}: ${e}`)}return a.status===204?null:a.json()},i=(e,t,i=`/billing/checkout`)=>r(i,{method:`POST`,body:JSON.stringify(e),headers:n(t)}),a=e=>r(`/me`,{method:`GET`,headers:n(e)}),o=e=>r(`/billing/portal`,{method:`POST`,headers:n(e)}),s=e=>r(`/team/workspaces`,{method:`GET`,headers:n(e)}),c=(e,t)=>r(`/team/workspaces`,{method:`POST`,body:JSON.stringify(e),headers:n(t)}),l=(e,t)=>r(`/team/workspaces/${encodeURIComponent(e)}/projects`,{method:`GET`,headers:n(t)}),u=(e,t,i)=>r(`/team/workspaces/${encodeURIComponent(e)}/projects`,{method:`POST`,body:JSON.stringify(t),headers:n(i)}),d=(e,t,i)=>r(`/team/workspaces/${encodeURIComponent(e)}/projects/${encodeURIComponent(t)}`,{method:`GET`,headers:n(i)}),f=(e,t,i,a)=>r(`/team/workspaces/${encodeURIComponent(e)}/projects/${encodeURIComponent(t)}`,{method:`PUT`,body:JSON.stringify(i),headers:n(a)}),p=(e,t,i)=>r(`/team/workspaces/${encodeURIComponent(e)}/invites`,{method:`POST`,body:JSON.stringify(t),headers:n(i)}),m=(e,t)=>r(`/team/invites/${encodeURIComponent(e)}/accept`,{method:`POST`,headers:n(t)});export{p as a,a as c,s as d,f,o as i,d as l,r as n,u as o,i as r,c as s,m as t,l as u};
2
+ //# sourceMappingURL=apiClient-3WVm94VW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient-3WVm94VW.js","names":[],"sources":["../../src/lib/apiClient.js"],"sourcesContent":["const API_BASE = import.meta.env?.VITE_API_ENDPOINT || '';\n\nconst jsonHeaders = { 'Content-Type': 'application/json' };\nconst authHeaders = (token) => (token ? { Authorization: `Bearer ${token}` } : undefined);\n\nconst apiFetch = async (path, options = {}) => {\n const url = `${API_BASE}${path}`;\n const resp = await fetch(url, {\n ...options,\n headers: { ...jsonHeaders, ...(options.headers || {}) },\n });\n if (!resp.ok) {\n const message = await resp.text();\n if (resp.status === 401 && typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('auth:unauthorized'));\n }\n throw new Error(`API error ${resp.status}: ${message}`);\n }\n if (resp.status === 204) return null;\n return resp.json();\n};\n\nexport const saveProject = (payload) => apiFetch('/projects', { method: 'POST', body: JSON.stringify(payload) });\nexport const loadProject = (id) => apiFetch(`/projects/${id}`, { method: 'GET' });\nexport const createCheckoutSession = (payload, token, path = '/billing/checkout') =>\n apiFetch(path, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const getCurrentUserProfile = (token) =>\n apiFetch('/me', { method: 'GET', headers: authHeaders(token) });\nexport const createPortalSession = (token) =>\n apiFetch('/billing/portal', { method: 'POST', headers: authHeaders(token) });\n\n// --- Team (MVP) ---\nexport const listTeamWorkspaces = (token) => apiFetch('/team/workspaces', { method: 'GET', headers: authHeaders(token) });\nexport const createTeamWorkspace = (payload, token) =>\n apiFetch('/team/workspaces', { method: 'POST', body: JSON.stringify(payload), headers: authHeaders(token) });\nexport const getTeamWorkspace = (workspaceId, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}`, { method: 'GET', headers: authHeaders(token) });\nexport const listTeamProjects = (workspaceId, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects`, { method: 'GET', headers: authHeaders(token) });\nexport const createTeamProject = (workspaceId, payload, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const getTeamProject = (workspaceId, projectId, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects/${encodeURIComponent(projectId)}`, {\n method: 'GET',\n headers: authHeaders(token),\n });\nexport const updateTeamProject = (workspaceId, projectId, payload, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/projects/${encodeURIComponent(projectId)}`, {\n method: 'PUT',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const createTeamInvite = (workspaceId, payload, token) =>\n apiFetch(`/team/workspaces/${encodeURIComponent(workspaceId)}/invites`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: authHeaders(token),\n });\nexport const acceptTeamInvite = (inviteToken, token) =>\n apiFetch(`/team/invites/${encodeURIComponent(inviteToken)}/accept`, { method: 'POST', headers: authHeaders(token) });\n\nexport default apiFetch;\n"],"mappings":"AAAA,IAAM,EAAiD,GAEjD,EAAc,CAAE,eAAgB,kBAAmB,EACnD,EAAe,GAAW,EAAQ,CAAE,cAAe,UAAU,GAAQ,EAAI,IAAA,GAEzE,EAAW,MAAO,EAAM,EAAU,CAAC,IAAM,CAC7C,IAAM,EAAM,GAAG,IAAW,IACpB,EAAO,MAAM,MAAM,EAAK,CAC5B,GAAG,EACH,QAAS,CAAE,GAAG,EAAa,GAAI,EAAQ,SAAW,CAAC,CAAG,CACxD,CAAC,EACD,GAAI,CAAC,EAAK,GAAI,CACZ,IAAM,EAAU,MAAM,EAAK,KAAK,EAIhC,MAHI,EAAK,SAAW,KAAO,OAAO,OAAW,KAC3C,OAAO,cAAc,IAAI,YAAY,mBAAmB,CAAC,EAEjD,MAAM,aAAa,EAAK,OAAO,IAAI,GAAS,CACxD,CAEA,OADI,EAAK,SAAW,IAAY,KACzB,EAAK,KAAK,CACnB,EAIa,GAAyB,EAAS,EAAO,EAAO,sBAC3D,EAAS,EAAM,CACb,OAAQ,OACR,KAAM,KAAK,UAAU,CAAO,EAC5B,QAAS,EAAY,CAAK,CAC5B,CAAC,EACU,EAAyB,GACpC,EAAS,MAAO,CAAE,OAAQ,MAAO,QAAS,EAAY,CAAK,CAAE,CAAC,EACnD,EAAuB,GAClC,EAAS,kBAAmB,CAAE,OAAQ,OAAQ,QAAS,EAAY,CAAK,CAAE,CAAC,EAGhE,EAAsB,GAAU,EAAS,mBAAoB,CAAE,OAAQ,MAAO,QAAS,EAAY,CAAK,CAAE,CAAC,EAC3G,GAAuB,EAAS,IAC3C,EAAS,mBAAoB,CAAE,OAAQ,OAAQ,KAAM,KAAK,UAAU,CAAO,EAAG,QAAS,EAAY,CAAK,CAAE,CAAC,EAGhG,GAAoB,EAAa,IAC5C,EAAS,oBAAoB,mBAAmB,CAAW,EAAE,WAAY,CAAE,OAAQ,MAAO,QAAS,EAAY,CAAK,CAAE,CAAC,EAC5G,GAAqB,EAAa,EAAS,IACtD,EAAS,oBAAoB,mBAAmB,CAAW,EAAE,WAAY,CACvE,OAAQ,OACR,KAAM,KAAK,UAAU,CAAO,EAC5B,QAAS,EAAY,CAAK,CAC5B,CAAC,EACU,GAAkB,EAAa,EAAW,IACrD,EAAS,oBAAoB,mBAAmB,CAAW,EAAE,YAAY,mBAAmB,CAAS,IAAK,CACxG,OAAQ,MACR,QAAS,EAAY,CAAK,CAC5B,CAAC,EACU,GAAqB,EAAa,EAAW,EAAS,IACjE,EAAS,oBAAoB,mBAAmB,CAAW,EAAE,YAAY,mBAAmB,CAAS,IAAK,CACxG,OAAQ,MACR,KAAM,KAAK,UAAU,CAAO,EAC5B,QAAS,EAAY,CAAK,CAC5B,CAAC,EACU,GAAoB,EAAa,EAAS,IACrD,EAAS,oBAAoB,mBAAmB,CAAW,EAAE,UAAW,CACtE,OAAQ,OACR,KAAM,KAAK,UAAU,CAAO,EAC5B,QAAS,EAAY,CAAK,CAC5B,CAAC,EACU,GAAoB,EAAa,IAC5C,EAAS,iBAAiB,mBAAmB,CAAW,EAAE,SAAU,CAAE,OAAQ,OAAQ,QAAS,EAAY,CAAK,CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`calculator`,[[`rect`,{width:`16`,height:`20`,x:`4`,y:`2`,rx:`2`,key:`1nb95v`}],[`line`,{x1:`8`,x2:`16`,y1:`6`,y2:`6`,key:`x4nwl0`}],[`line`,{x1:`16`,x2:`16`,y1:`14`,y2:`18`,key:`wjye3r`}],[`path`,{d:`M16 10h.01`,key:`1m94wz`}],[`path`,{d:`M12 10h.01`,key:`1nrarc`}],[`path`,{d:`M8 10h.01`,key:`19clt8`}],[`path`,{d:`M12 14h.01`,key:`1etili`}],[`path`,{d:`M8 14h.01`,key:`6423bh`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}],[`path`,{d:`M8 18h.01`,key:`lrp35t`}]]);export{t};
2
+ //# sourceMappingURL=calculator-CofuwQa8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator-CofuwQa8.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/calculator.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"16\", height: \"20\", x: \"4\", y: \"2\", rx: \"2\", key: \"1nb95v\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"6\", y2: \"6\", key: \"x4nwl0\" }],\n [\"line\", { x1: \"16\", x2: \"16\", y1: \"14\", y2: \"18\", key: \"wjye3r\" }],\n [\"path\", { d: \"M16 10h.01\", key: \"1m94wz\" }],\n [\"path\", { d: \"M12 10h.01\", key: \"1nrarc\" }],\n [\"path\", { d: \"M8 10h.01\", key: \"19clt8\" }],\n [\"path\", { d: \"M12 14h.01\", key: \"1etili\" }],\n [\"path\", { d: \"M8 14h.01\", key: \"6423bh\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }],\n [\"path\", { d: \"M8 18h.01\", key: \"lrp35t\" }]\n];\nconst Calculator = createLucideIcon(\"calculator\", __iconNode);\n\nexport { __iconNode, Calculator as default };\n//# sourceMappingURL=calculator.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAqBA,IAAM,EAAa,EAAiB,aAAc,CAXhD,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC9E,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,KAAM,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC/D,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,GAAI,KAAM,IAAK,QAAS,CAAC,EAClE,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAS,CAAC,EAC3C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAS,CAAC,EAC3C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAS,CAAC,EAC3C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,EAC1C,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAS,CAAC,EAC3C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,CAEM,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);export{t};
2
+ //# sourceMappingURL=check-Fm2iQO64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-Fm2iQO64.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/check.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAUA,IAAM,EAAQ,EAAiB,QAAS,CADpB,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,QAAS,CAAC,CAC5B,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]);export{t};
2
+ //# sourceMappingURL=chevron-down-BIXHKpnf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chevron-down-BIXHKpnf.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/chevron-down.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAUA,IAAM,EAAc,EAAiB,eAAgB,CADjC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAS,CAAC,CACZ,CAAU"}
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),l=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")});export{l as n,c as r,o as t};
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]),n=e(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]);export{t as n,n as t};
2
+ //# sourceMappingURL=circle-check-X08qqy40.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circle-check-X08qqy40.js","names":["__iconNode"],"sources":["../../node_modules/lucide-react/dist/esm/icons/arrow-right.mjs","../../node_modules/lucide-react/dist/esm/icons/circle-check.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.mjs.map\n","/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m9 12 2 2 4-4\", key: \"dzmm74\" }]\n];\nconst CircleCheck = createLucideIcon(\"circle-check\", __iconNode);\n\nexport { __iconNode, CircleCheck as default };\n//# sourceMappingURL=circle-check.mjs.map\n"],"x_google_ignoreList":[0,1],"mappings":"mDAaA,IAAM,EAAa,EAAiB,cAAeA,CAHjD,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,CAEGA,CAAU,ECAvD,EAAc,EAAiB,eAAgB,CAHnD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,CAEK,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]);export{t};
2
+ //# sourceMappingURL=copy-KD-LYJ0z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-KD-LYJ0z.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/copy.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAO,EAAiB,OAAQ,CAHpC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EACvF,CAAC,OAAQ,CAAE,EAAG,0DAA2D,IAAK,QAAS,CAAC,CAEpD,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`crop`,[[`path`,{d:`M6 2v14a2 2 0 0 0 2 2h14`,key:`ron5a4`}],[`path`,{d:`M18 22V8a2 2 0 0 0-2-2H2`,key:`7s9ehn`}]]);export{t};
2
+ //# sourceMappingURL=crop-K1LOmRty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop-K1LOmRty.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/crop.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M6 2v14a2 2 0 0 0 2 2h14\", key: \"ron5a4\" }],\n [\"path\", { d: \"M18 22V8a2 2 0 0 0-2-2H2\", key: \"7s9ehn\" }]\n];\nconst Crop = createLucideIcon(\"crop\", __iconNode);\n\nexport { __iconNode, Crop as default };\n//# sourceMappingURL=crop.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAO,EAAiB,OAAQ,CAHpC,CAAC,OAAQ,CAAE,EAAG,2BAA4B,IAAK,QAAS,CAAC,EACzD,CAAC,OAAQ,CAAE,EAAG,2BAA4B,IAAK,QAAS,CAAC,CAErB,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{m as e}from"./index-D7D6ZRCW.js";import{n as t}from"./apiClient-3WVm94VW.js";var n=(e,t=500)=>String(e??``).trim().slice(0,t),r=new Set([`async_email`,`live_call`]),i=(e,t=``)=>{let i=n(e,50);return r.has(i)?i:r.has(t)?t:``},a=e=>{let t=n(e,80).replace(/^@+/,``);return t?`@${t}`:``},o=e=>{let t=n(e,500);if(!t)return null;try{return new URL(t.includes(`://`)?t:`https://${t}`)}catch{return null}},s=e=>{let t=o(e);if(!t?.hostname)return e;let n=t.hostname.replace(/^www\./i,``);if(/play\.google\.com$/i.test(n))return t.searchParams.get(`id`)||n;if(/apps\.apple\.com$/i.test(n)){let e=[...t.pathname.split(`/`).filter(Boolean)].reverse().find(e=>!/^id\d+$/i.test(e)&&!/^[a-z]{2}$/i.test(e));return e?e.replace(/-/g,` `):n}return n},c=({form:e={},defaultReviewMode:t=``}={})=>{let r=n(e.contactEmail,200).toLowerCase(),a=n(e.appName,160),o=n(e.appUrl,500);return{contactEmail:r,appLabel:a||s(o),reviewMode:i(e.reviewMode,t)}},l=(t={},{leadId:r=``,defaultReviewMode:a=``}={})=>Object.fromEntries(Object.entries({has_email:n(t.contactEmail,200)?`yes`:`no`,has_app_name:n(t.appName,160)?`yes`:`no`,has_app_url:n(t.appUrl,500)?`yes`:`no`,has_notes:n(t.notes,2e3)?`yes`:`no`,review_mode:i(t.reviewMode,a)||void 0,release_timeline:n(t.releaseTimeline,50)||`unknown`,platform:n(t.platform,50)||`unknown`,scope:n(t.scope,50)||`unknown`,workflow:n(t.workflow,50)||`unknown`,blocker:n(t.blocker,50)||`unknown`,lead_id:e(r)}).filter(([,e])=>e)),u=({form:e={},attribution:t={},entrySource:r=``,leadId:o=``,sourcePage:s=`design_partner`,lang:c=`en`,pagePath:l=``,pageUrl:u=``,defaultReviewMode:d=``}={})=>Object.fromEntries(Object.entries({name:n(e.contactName,120),email:n(e.contactEmail,200).toLowerCase(),xHandle:a(e.xHandle),appName:n(e.appName,160),appUrl:n(e.appUrl,500),reviewMode:i(e.reviewMode,d),releaseTimeline:n(e.releaseTimeline,50),platform:n(e.platform,50),scope:n(e.scope,50),workflow:n(e.workflow,50),blocker:n(e.blocker,50),notes:n(e.notes,2e3),entrySource:n(r||t.entry_source,100),leadId:n(o||t.lead_id,120),sourcePage:n(s,100),lang:n(c,20),pagePath:n(l,200),pageUrl:n(u,500),referrerHost:n(t.referrer_host,200),agentSurface:n(t.agent_surface,80),utmSource:n(t.utm_source,100),utmMedium:n(t.utm_medium,100),utmCampaign:n(t.utm_campaign,150),utmContent:n(t.utm_content,150)}).filter(([,e])=>e)),d=e=>t(`/design-partner/request`,{method:`POST`,body:JSON.stringify(e)});export{d as i,u as n,c as r,l as t};
2
+ //# sourceMappingURL=designPartnerRequest-DYqMElJd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"designPartnerRequest-DYqMElJd.js","names":[],"sources":["../../src/lib/designPartnerRequest.js"],"sourcesContent":["import { sanitizeDesignPartnerLeadId } from './designPartnerPrefill.js';\nimport apiFetch from './apiClient.js';\n\nconst trimString = (value, maxLength = 500) => String(value ?? '').trim().slice(0, maxLength);\nconst DESIGN_PARTNER_REVIEW_MODES = new Set(['async_email', 'live_call']);\nconst normalizeReviewMode = (value, fallback = '') => {\n const normalized = trimString(value, 50);\n if (DESIGN_PARTNER_REVIEW_MODES.has(normalized)) return normalized;\n return DESIGN_PARTNER_REVIEW_MODES.has(fallback) ? fallback : '';\n};\n\nconst normalizeXHandle = (value) => {\n const normalized = trimString(value, 80).replace(/^@+/, '');\n return normalized ? `@${normalized}` : '';\n};\n\nconst parseMaybeUrl = (value) => {\n const normalized = trimString(value, 500);\n if (!normalized) return null;\n\n try {\n return new URL(normalized.includes('://') ? normalized : `https://${normalized}`);\n } catch {\n return null;\n }\n};\n\nconst describeAppLabelFromUrl = (appUrl) => {\n const parsed = parseMaybeUrl(appUrl);\n if (!parsed?.hostname) return appUrl;\n\n const host = parsed.hostname.replace(/^www\\./i, '');\n if (/play\\.google\\.com$/i.test(host)) {\n return parsed.searchParams.get('id') || host;\n }\n if (/apps\\.apple\\.com$/i.test(host)) {\n const parts = parsed.pathname.split('/').filter(Boolean);\n const slug = [...parts].reverse().find((part) => !/^id\\d+$/i.test(part) && !/^[a-z]{2}$/i.test(part));\n return slug ? slug.replace(/-/g, ' ') : host;\n }\n return host;\n};\n\nexport const describeDesignPartnerQuickRequest = ({ form = {}, defaultReviewMode = '' } = {}) => {\n const contactEmail = trimString(form.contactEmail, 200).toLowerCase();\n const appName = trimString(form.appName, 160);\n const appUrl = trimString(form.appUrl, 500);\n const appLabel = appName || describeAppLabelFromUrl(appUrl);\n const reviewMode = normalizeReviewMode(form.reviewMode, defaultReviewMode);\n\n return {\n contactEmail,\n appLabel,\n reviewMode,\n };\n};\n\nexport const buildDesignPartnerRequestMeta = (form = {}, { leadId = '', defaultReviewMode = '' } = {}) =>\n Object.fromEntries(\n Object.entries({\n has_email: trimString(form.contactEmail, 200) ? 'yes' : 'no',\n has_app_name: trimString(form.appName, 160) ? 'yes' : 'no',\n has_app_url: trimString(form.appUrl, 500) ? 'yes' : 'no',\n has_notes: trimString(form.notes, 2000) ? 'yes' : 'no',\n review_mode: normalizeReviewMode(form.reviewMode, defaultReviewMode) || undefined,\n release_timeline: trimString(form.releaseTimeline, 50) || 'unknown',\n platform: trimString(form.platform, 50) || 'unknown',\n scope: trimString(form.scope, 50) || 'unknown',\n workflow: trimString(form.workflow, 50) || 'unknown',\n blocker: trimString(form.blocker, 50) || 'unknown',\n lead_id: sanitizeDesignPartnerLeadId(leadId),\n }).filter(([, value]) => value),\n );\n\nexport const buildDesignPartnerRequestPayload = ({\n form = {},\n attribution = {},\n entrySource = '',\n leadId = '',\n sourcePage = 'design_partner',\n lang = 'en',\n pagePath = '',\n pageUrl = '',\n defaultReviewMode = '',\n} = {}) =>\n Object.fromEntries(\n Object.entries({\n name: trimString(form.contactName, 120),\n email: trimString(form.contactEmail, 200).toLowerCase(),\n xHandle: normalizeXHandle(form.xHandle),\n appName: trimString(form.appName, 160),\n appUrl: trimString(form.appUrl, 500),\n reviewMode: normalizeReviewMode(form.reviewMode, defaultReviewMode),\n releaseTimeline: trimString(form.releaseTimeline, 50),\n platform: trimString(form.platform, 50),\n scope: trimString(form.scope, 50),\n workflow: trimString(form.workflow, 50),\n blocker: trimString(form.blocker, 50),\n notes: trimString(form.notes, 2000),\n entrySource: trimString(entrySource || attribution.entry_source, 100),\n leadId: trimString(leadId || attribution.lead_id, 120),\n sourcePage: trimString(sourcePage, 100),\n lang: trimString(lang, 20),\n pagePath: trimString(pagePath, 200),\n pageUrl: trimString(pageUrl, 500),\n referrerHost: trimString(attribution.referrer_host, 200),\n agentSurface: trimString(attribution.agent_surface, 80),\n utmSource: trimString(attribution.utm_source, 100),\n utmMedium: trimString(attribution.utm_medium, 100),\n utmCampaign: trimString(attribution.utm_campaign, 150),\n utmContent: trimString(attribution.utm_content, 150),\n }).filter(([, value]) => value),\n );\n\nexport const submitDesignPartnerRequest = (payload) =>\n apiFetch('/design-partner/request', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{l as e,m as t,u as n}from"./index-D7D6ZRCW.js";var r=(e,t=500)=>String(e??``).trim().slice(0,t),i=e=>{let t=r(e);if(!t)return null;try{return new URL(t.includes(`://`)?t:`https://${t}`)}catch{return null}},a=(e,t=``)=>{let n=r(t,160);if(n)return n;let a=r(e);if(!a)return``;let o=i(a);if(o?.hostname){let e=o.hostname.replace(/^www\./i,``);if(/play\.google\.com$/i.test(e))return o.searchParams.get(`id`)||e;if(/apps\.apple\.com$/i.test(e)){let t=[...o.pathname.split(`/`).filter(Boolean)].reverse().find(e=>!/^id\d+$/i.test(e)&&!/^[a-z]{2}$/i.test(e));return t?t.replace(/-/g,` `):e}return e}return a.replace(/^https?:\/\//i,``).split(/[/?#]/)[0]||a},o=(t={})=>`${e(t)}#request-review`,s=(e={})=>n({offer:`pay_first`,...e}),c=({entrySource:e=``,leadId:n=``,contactEmail:i=``}={})=>{let a=t(n),o=r(e,120),s=r(i,200).toLowerCase();return Object.fromEntries(Object.entries({sales_entry:o?`yes`:`no`,entry_source:o||void 0,lead_id:a||void 0,has_prefill_email:s?`yes`:`no`}).filter(([,e])=>e))};export{a as i,s as n,c as r,o as t};
2
+ //# sourceMappingURL=designPartnerSalesEntry-BpRINg3I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"designPartnerSalesEntry-BpRINg3I.js","names":[],"sources":["../../src/lib/designPartnerSalesEntry.js"],"sourcesContent":["import {\n buildDesignPartnerHref,\n buildOfferPricingHref,\n sanitizeDesignPartnerLeadId,\n} from './designPartnerPrefill.js';\n\nconst trimText = (value, maxLength = 500) => String(value ?? '').trim().slice(0, maxLength);\n\nconst parseMaybeUrl = (value) => {\n const normalized = trimText(value);\n if (!normalized) return null;\n\n try {\n return new URL(normalized.includes('://') ? normalized : `https://${normalized}`);\n } catch {\n return null;\n }\n};\n\nexport const describeSalesEntryAppLabel = (appUrl, appName = '') => {\n const normalizedAppName = trimText(appName, 160);\n if (normalizedAppName) return normalizedAppName;\n\n const normalized = trimText(appUrl);\n if (!normalized) return '';\n\n const parsed = parseMaybeUrl(normalized);\n if (parsed?.hostname) {\n const host = parsed.hostname.replace(/^www\\./i, '');\n if (/play\\.google\\.com$/i.test(host)) {\n return parsed.searchParams.get('id') || host;\n }\n if (/apps\\.apple\\.com$/i.test(host)) {\n const parts = parsed.pathname.split('/').filter(Boolean);\n const slug = [...parts].reverse().find((part) => !/^id\\d+$/i.test(part) && !/^[a-z]{2}$/i.test(part));\n return slug ? slug.replace(/-/g, ' ') : host;\n }\n return host;\n }\n\n return normalized.replace(/^https?:\\/\\//i, '').split(/[/?#]/)[0] || normalized;\n};\n\nexport const buildDesignPartnerRequestReviewHref = (context = {}) => `${buildDesignPartnerHref(context)}#request-review`;\n\nexport const buildSalesEntryPayFirstHref = (context = {}) =>\n buildOfferPricingHref({\n offer: 'pay_first',\n ...context,\n });\n\nexport const buildSalesEntryTrackingContext = ({ entrySource = '', leadId = '', contactEmail = '' } = {}) => {\n const sanitizedLeadId = sanitizeDesignPartnerLeadId(leadId);\n const normalizedEntrySource = trimText(entrySource, 120);\n const normalizedEmail = trimText(contactEmail, 200).toLowerCase();\n\n return Object.fromEntries(\n Object.entries({\n sales_entry: normalizedEntrySource ? 'yes' : 'no',\n entry_source: normalizedEntrySource || undefined,\n lead_id: sanitizedLeadId || undefined,\n has_prefill_email: normalizedEmail ? 'yes' : 'no',\n }).filter(([, value]) => value),\n );\n};\n"],"mappings":"sDAMA,IAAM,GAAY,EAAO,EAAY,MAAQ,OAAO,GAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAG,CAAS,EAEpF,EAAiB,GAAU,CAC/B,IAAM,EAAa,EAAS,CAAK,EACjC,GAAI,CAAC,EAAY,OAAO,KAExB,GAAI,CACF,OAAO,IAAI,IAAI,EAAW,SAAS,KAAK,EAAI,EAAa,WAAW,GAAY,CAClF,MAAQ,CACN,OAAO,IACT,CACF,EAEa,GAA8B,EAAQ,EAAU,KAAO,CAClE,IAAM,EAAoB,EAAS,EAAS,GAAG,EAC/C,GAAI,EAAmB,OAAO,EAE9B,IAAM,EAAa,EAAS,CAAM,EAClC,GAAI,CAAC,EAAY,MAAO,GAExB,IAAM,EAAS,EAAc,CAAU,EACvC,GAAI,GAAQ,SAAU,CACpB,IAAM,EAAO,EAAO,SAAS,QAAQ,UAAW,EAAE,EAClD,GAAI,sBAAsB,KAAK,CAAI,EACjC,OAAO,EAAO,aAAa,IAAI,IAAI,GAAK,EAE1C,GAAI,qBAAqB,KAAK,CAAI,EAAG,CAEnC,IAAM,EAAO,CAAC,GADA,EAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAC/B,CAAK,EAAE,QAAQ,EAAE,KAAM,GAAS,CAAC,WAAW,KAAK,CAAI,GAAK,CAAC,cAAc,KAAK,CAAI,CAAC,EACpG,OAAO,EAAO,EAAK,QAAQ,KAAM,GAAG,EAAI,CAC1C,CACA,OAAO,CACT,CAEA,OAAO,EAAW,QAAQ,gBAAiB,EAAE,EAAE,MAAM,OAAO,EAAE,IAAM,CACtE,EAEa,GAAuC,EAAU,CAAC,IAAM,GAAG,EAAuB,CAAO,EAAE,iBAE3F,GAA+B,EAAU,CAAC,IACrD,EAAsB,CACpB,MAAO,YACP,GAAG,CACL,CAAC,EAEU,GAAkC,CAAE,cAAc,GAAI,SAAS,GAAI,eAAe,IAAO,CAAC,IAAM,CAC3G,IAAM,EAAkB,EAA4B,CAAM,EACpD,EAAwB,EAAS,EAAa,GAAG,EACjD,EAAkB,EAAS,EAAc,GAAG,EAAE,YAAY,EAEhE,OAAO,OAAO,YACZ,OAAO,QAAQ,CACb,YAAa,EAAwB,MAAQ,KAC7C,aAAc,GAAyB,IAAA,GACvC,QAAS,GAAmB,IAAA,GAC5B,kBAAmB,EAAkB,MAAQ,IAC/C,CAAC,EAAE,QAAQ,EAAG,KAAW,CAAK,CAChC,CACF"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
2
+ //# sourceMappingURL=download-BXzoc-Y3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-BXzoc-Y3.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/download.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAcA,IAAM,EAAW,EAAiB,WAAY,CAJ5C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAS,CAAC,EAC1E,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,CAEF,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),n=e(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]);export{t as n,n as t};
2
+ //# sourceMappingURL=eye-CHvLhG2r.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eye-CHvLhG2r.js","names":["__iconNode"],"sources":["../../node_modules/lucide-react/dist/esm/icons/eye-off.mjs","../../node_modules/lucide-react/dist/esm/icons/eye.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",\n key: \"ct8e1f\"\n }\n ],\n [\"path\", { d: \"M14.084 14.158a3 3 0 0 1-4.242-4.242\", key: \"151rxh\" }],\n [\n \"path\",\n {\n d: \"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",\n key: \"13bj9a\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n];\nconst EyeOff = createLucideIcon(\"eye-off\", __iconNode);\n\nexport { __iconNode, EyeOff as default };\n//# sourceMappingURL=eye-off.mjs.map\n","/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",\n key: \"1nclc0\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst Eye = createLucideIcon(\"eye\", __iconNode);\n\nexport { __iconNode, Eye as default };\n//# sourceMappingURL=eye.mjs.map\n"],"x_google_ignoreList":[0,1],"mappings":"mDA2BA,IAAM,EAAS,EAAiB,UAAWA,CAjBzC,CACE,OACA,CACE,EAAG,iGACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,uCAAwC,IAAK,QAAS,CAAC,EACrE,CACE,OACA,CACE,EAAG,+FACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAS,CAAC,CAEFA,CAAU,ECR/C,EAAM,EAAiB,MAAO,CATlC,CACE,OACA,CACE,EAAG,wGACH,IAAK,QACP,CACF,EACA,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAS,CAAC,CAEtB,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]);export{t};
2
+ //# sourceMappingURL=file-text-CU-ETLz1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-text-CU-ETLz1.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/file-text.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAsBA,IAAM,EAAW,EAAiB,YAAa,CAZ7C,CACE,OACA,CACE,EAAG,iHACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAS,CAAC,EACxD,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAEI,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`folder-tree`,[[`path`,{d:`M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z`,key:`hod4my`}],[`path`,{d:`M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z`,key:`w4yl2u`}],[`path`,{d:`M3 5a2 2 0 0 0 2 2h3`,key:`f2jnh7`}],[`path`,{d:`M3 3v13a2 2 0 0 0 2 2h3`,key:`k8epm1`}]]);export{t};
2
+ //# sourceMappingURL=folder-tree-raVH0Y5V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-tree-raVH0Y5V.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/folder-tree.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"hod4my\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z\",\n key: \"w4yl2u\"\n }\n ],\n [\"path\", { d: \"M3 5a2 2 0 0 0 2 2h3\", key: \"f2jnh7\" }],\n [\"path\", { d: \"M3 3v13a2 2 0 0 0 2 2h3\", key: \"k8epm1\" }]\n];\nconst FolderTree = createLucideIcon(\"folder-tree\", __iconNode);\n\nexport { __iconNode, FolderTree as default };\n//# sourceMappingURL=folder-tree.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDA2BA,IAAM,EAAa,EAAiB,cAAe,CAjBjD,CACE,OACA,CACE,EAAG,qHACH,IAAK,QACP,CACF,EACA,CACE,OACA,CACE,EAAG,2HACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,uBAAwB,IAAK,QAAS,CAAC,EACrD,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAS,CAAC,CAEP,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{s as e}from"./LanguageSwitcher-hFv9zl1u.js";var t=e(`grid-3x3`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M3 15h18`,key:`5xshup`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]);export{t};
2
+ //# sourceMappingURL=grid-3x3-cWuhGQfz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-3x3-cWuhGQfz.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/grid-3x3.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M3 9h18\", key: \"1pudct\" }],\n [\"path\", { d: \"M3 15h18\", key: \"5xshup\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"M15 3v18\", key: \"14nvp0\" }]\n];\nconst Grid3x3 = createLucideIcon(\"grid-3x3\", __iconNode);\n\nexport { __iconNode, Grid3x3 as default };\n//# sourceMappingURL=grid-3x3.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAgBA,IAAM,EAAU,EAAiB,WAAY,CAN3C,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC9E,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAEE,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{m as e}from"./index-D7D6ZRCW.js";import{t}from"./stripeClient-CuZgvzca.js";var n=`release_hardening_sprint`,r=`launch_pass`,i=`release_teardown_review`,a=Object.freeze({[n]:Object.freeze({priceEnv:`VITE_STRIPE_HARDENING_PRICE_ID`,paymentLinkEnv:`VITE_STRIPE_HARDENING_PAYMENT_LINK`}),[r]:Object.freeze({priceEnv:`VITE_STRIPE_LAUNCH_PASS_PRICE_ID`,paymentLinkEnv:`VITE_STRIPE_LAUNCH_PASS_PAYMENT_LINK`}),[i]:Object.freeze({priceEnv:`VITE_STRIPE_TEARDOWN_PRICE_ID`,paymentLinkEnv:`VITE_STRIPE_TEARDOWN_PAYMENT_LINK`})}),o=(e,t=500)=>String(e??``).trim().slice(0,t),s=e=>({BASE_URL:`/app/`,DEV:!1,MODE:`production`,PROD:!0,SSR:!1})[e]||``,c=e=>o(e,100),l=e=>a[c(e)]||null,u=e=>{let t=l(e);return t?.priceEnv?s(t.priceEnv):``},d=e=>{let t=l(e);return t?.paymentLinkEnv?s(t.paymentLinkEnv):``},f=e=>!!(d(e)||u(e)),p=()=>f(n),m=({offer:t=n,entrySource:r=``,sourcePage:i=``,form:a={},leadId:s=``}={})=>Object.fromEntries(Object.entries({offer:c(t),entry_source:o(r,100),lead_id:e(s),source_page:o(i,100),app_url:o(a.appUrl,500),release_timeline:o(a.releaseTimeline,50),platform:o(a.platform,50),scope:o(a.scope,50),workflow:o(a.workflow,50),blocker:o(a.blocker,50)}).filter(([,e])=>e)),h=({path:t=`/success`,offer:r=n,entrySource:i=``,leadId:a=``}={})=>{let s=String(t||`/success`).startsWith(`/`)?String(t||`/success`):`/success`,l=new URL(s,`https://shipscreens.local`),u=c(r);u&&l.searchParams.set(`offer`,u);let d=o(i,100);d&&l.searchParams.set(`entry_source`,d);let f=e(a);return f&&l.searchParams.set(`lead_id`,f),`${l.pathname}${l.search}${l.hash}`},g=async({offer:e=n,email:r=``,entrySource:i=``,sourcePage:a=``,form:o={},token:s=``,leadId:f=``}={})=>{let p=c(e);if(!l(p))throw Error(`Unsupported one-time offer: ${p||`missing`}`);let g=d(p);if(g)return window.location.assign(g),null;let _=u(p);if(!_)throw Error(`${p} checkout is not configured`);return t({endpoint:`/offers/checkout`,mode:`payment`,offer:p,priceId:_,email:r,token:s,successPath:h({path:`/success`,offer:p,entrySource:i,leadId:f}),cancelPath:h({path:`/cancelled`,offer:p,entrySource:i,leadId:f}),metadata:m({offer:p,entrySource:i,sourcePage:a,form:o,leadId:f})})},_=(e={})=>g({...e,offer:n});export{f as a,p as i,r as n,_ as o,i as r,g as s,n as t};
2
+ //# sourceMappingURL=hardeningOffer-tkjlPDU-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardeningOffer-tkjlPDU-.js","names":[],"sources":["../../src/lib/hardeningOffer.js"],"sourcesContent":["import { createCheckout } from './stripeClient.js';\nimport { sanitizeDesignPartnerLeadId } from './designPartnerPrefill.js';\n\nexport const HARDENING_OFFER_KEY = 'release_hardening_sprint';\nexport const LAUNCH_PASS_OFFER_KEY = 'launch_pass';\nexport const PAID_TEARDOWN_OFFER_KEY = 'release_teardown_review';\n\nexport const ONE_TIME_OFFER_CONFIG = Object.freeze({\n [HARDENING_OFFER_KEY]: Object.freeze({\n priceEnv: 'VITE_STRIPE_HARDENING_PRICE_ID',\n paymentLinkEnv: 'VITE_STRIPE_HARDENING_PAYMENT_LINK',\n }),\n [LAUNCH_PASS_OFFER_KEY]: Object.freeze({\n priceEnv: 'VITE_STRIPE_LAUNCH_PASS_PRICE_ID',\n paymentLinkEnv: 'VITE_STRIPE_LAUNCH_PASS_PAYMENT_LINK',\n }),\n [PAID_TEARDOWN_OFFER_KEY]: Object.freeze({\n priceEnv: 'VITE_STRIPE_TEARDOWN_PRICE_ID',\n paymentLinkEnv: 'VITE_STRIPE_TEARDOWN_PAYMENT_LINK',\n }),\n});\n\nconst trimString = (value, maxLength = 500) => String(value ?? '').trim().slice(0, maxLength);\nconst getEnvValue = (key) => import.meta.env?.[key] || '';\nconst normalizeOfferKey = (offer) => trimString(offer, 100);\nconst getOneTimeOfferConfig = (offer) => ONE_TIME_OFFER_CONFIG[normalizeOfferKey(offer)] || null;\n\nexport const getOneTimeOfferPriceId = (offer) => {\n const config = getOneTimeOfferConfig(offer);\n return config?.priceEnv ? getEnvValue(config.priceEnv) : '';\n};\n\nexport const getOneTimeOfferPaymentLink = (offer) => {\n const config = getOneTimeOfferConfig(offer);\n return config?.paymentLinkEnv ? getEnvValue(config.paymentLinkEnv) : '';\n};\n\nexport const getHardeningOfferPriceId = () => getOneTimeOfferPriceId(HARDENING_OFFER_KEY);\n\nexport const getHardeningOfferPaymentLink = () => getOneTimeOfferPaymentLink(HARDENING_OFFER_KEY);\n\nexport const hasOneTimeOfferCheckout = (offer) =>\n Boolean(getOneTimeOfferPaymentLink(offer) || getOneTimeOfferPriceId(offer));\n\nexport const hasHardeningOfferCheckout = () =>\n hasOneTimeOfferCheckout(HARDENING_OFFER_KEY);\n\nexport const buildOneTimeOfferMetadata = ({\n offer = HARDENING_OFFER_KEY,\n entrySource = '',\n sourcePage = '',\n form = {},\n leadId = '',\n} = {}) =>\n Object.fromEntries(\n Object.entries({\n offer: normalizeOfferKey(offer),\n entry_source: trimString(entrySource, 100),\n lead_id: sanitizeDesignPartnerLeadId(leadId),\n source_page: trimString(sourcePage, 100),\n app_url: trimString(form.appUrl, 500),\n release_timeline: trimString(form.releaseTimeline, 50),\n platform: trimString(form.platform, 50),\n scope: trimString(form.scope, 50),\n workflow: trimString(form.workflow, 50),\n blocker: trimString(form.blocker, 50),\n }).filter(([, value]) => value),\n );\n\nexport const buildHardeningOfferMetadata = (context = {}) =>\n buildOneTimeOfferMetadata({ ...context, offer: HARDENING_OFFER_KEY });\n\nexport const buildOneTimeOfferReturnPath = ({\n path = '/success',\n offer = HARDENING_OFFER_KEY,\n entrySource = '',\n leadId = '',\n} = {}) => {\n const normalizedPath = String(path || '/success').startsWith('/') ? String(path || '/success') : '/success';\n const url = new URL(normalizedPath, 'https://shipscreens.local');\n const normalizedOffer = normalizeOfferKey(offer);\n if (normalizedOffer) {\n url.searchParams.set('offer', normalizedOffer);\n }\n\n const normalizedEntrySource = trimString(entrySource, 100);\n if (normalizedEntrySource) {\n url.searchParams.set('entry_source', normalizedEntrySource);\n }\n\n const normalizedLeadId = sanitizeDesignPartnerLeadId(leadId);\n if (normalizedLeadId) {\n url.searchParams.set('lead_id', normalizedLeadId);\n }\n\n return `${url.pathname}${url.search}${url.hash}`;\n};\n\nexport const startOneTimeOfferCheckout = async ({\n offer = HARDENING_OFFER_KEY,\n email = '',\n entrySource = '',\n sourcePage = '',\n form = {},\n token = '',\n leadId = '',\n} = {}) => {\n const normalizedOffer = normalizeOfferKey(offer);\n if (!getOneTimeOfferConfig(normalizedOffer)) {\n throw new Error(`Unsupported one-time offer: ${normalizedOffer || 'missing'}`);\n }\n\n const paymentLink = getOneTimeOfferPaymentLink(normalizedOffer);\n if (paymentLink) {\n window.location.assign(paymentLink);\n return null;\n }\n\n const priceId = getOneTimeOfferPriceId(normalizedOffer);\n if (!priceId) {\n throw new Error(`${normalizedOffer} checkout is not configured`);\n }\n\n return createCheckout({\n endpoint: '/offers/checkout',\n mode: 'payment',\n offer: normalizedOffer,\n priceId,\n email,\n token,\n successPath: buildOneTimeOfferReturnPath({\n path: '/success',\n offer: normalizedOffer,\n entrySource,\n leadId,\n }),\n cancelPath: buildOneTimeOfferReturnPath({\n path: '/cancelled',\n offer: normalizedOffer,\n entrySource,\n leadId,\n }),\n metadata: buildOneTimeOfferMetadata({ offer: normalizedOffer, entrySource, sourcePage, form, leadId }),\n });\n};\n\nexport const startHardeningOfferCheckout = (context = {}) =>\n startOneTimeOfferCheckout({ ...context, offer: HARDENING_OFFER_KEY });\n"],"mappings":"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"}