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.
- package/README.md +14 -4
- package/bin/shipscreens.js +352 -18
- package/cli/commands/captureScreenshots.js +409 -0
- package/cli/commands/importScreenshots.js +377 -0
- package/cli/commands/inspectReleaseContext.js +607 -0
- package/cli/commands/planRelease.js +324 -0
- package/cli/commands/writeStarterConfig.js +233 -0
- package/cli/mcpServer.js +172 -3
- package/dist/.well-known/ai-agents.json +58 -11
- package/dist/.well-known/llms-full.txt +80 -17
- package/dist/.well-known/llms.txt +38 -12
- package/dist/.well-known/mcp-server.json +4 -4
- package/dist/ai-agents.json +58 -11
- package/dist/app/assets/AgentCli-nIqgOG-i.js +17 -0
- package/dist/app/assets/AgentCli-nIqgOG-i.js.map +1 -0
- package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
- package/dist/app/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
- package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
- package/dist/app/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
- package/dist/app/assets/App-BRKxkubQ.css +1 -0
- package/dist/app/assets/App-CZiyX8-L.js +14 -0
- package/dist/app/assets/App-CZiyX8-L.js.map +1 -0
- package/dist/app/assets/AppReviewAso-DYOCuqgV.js +4 -0
- package/dist/app/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
- package/dist/app/assets/Cancelled-CP6V6uDb.js +2 -0
- package/dist/app/assets/Cancelled-CP6V6uDb.js.map +1 -0
- package/dist/app/assets/CopyButton-BFCx6EPg.js +2 -0
- package/dist/app/assets/CopyButton-BFCx6EPg.js.map +1 -0
- package/dist/app/assets/DesignPartner-B4J7f0Bx.js +4 -0
- package/dist/app/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
- package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
- package/dist/app/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
- package/dist/app/assets/FirstExport-qfY7uE8r.js +6 -0
- package/dist/app/assets/FirstExport-qfY7uE8r.js.map +1 -0
- package/dist/app/assets/FitPanel-B1J0V1jK.js +2 -0
- package/dist/app/assets/FitPanel-B1J0V1jK.js.map +1 -0
- package/dist/app/assets/FivePanelFramework-C4yq58kM.js +62 -0
- package/dist/app/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
- package/dist/app/assets/ForgotPassword-KF_HFGyb.js +2 -0
- package/dist/app/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
- package/dist/app/assets/Landing-B_CvZDXJ.js +2 -0
- package/dist/app/assets/Landing-B_CvZDXJ.js.map +1 -0
- package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
- package/dist/app/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
- package/dist/app/assets/Legal-BwGbEjDk.js +2 -0
- package/dist/app/assets/Legal-BwGbEjDk.js.map +1 -0
- package/dist/app/assets/NotFound-Ba1Bw7uu.js +2 -0
- package/dist/app/assets/NotFound-Ba1Bw7uu.js.map +1 -0
- package/dist/app/assets/Pricing-Dt-V4Gqc.js +20 -0
- package/dist/app/assets/Pricing-Dt-V4Gqc.js.map +1 -0
- package/dist/app/assets/Privacy-C6MrXYPO.js +2 -0
- package/dist/app/assets/Privacy-C6MrXYPO.js.map +1 -0
- package/dist/app/assets/Proof-C3DDFAhm.js +20 -0
- package/dist/app/assets/Proof-C3DDFAhm.js.map +1 -0
- package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
- package/dist/app/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
- package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
- package/dist/app/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
- package/dist/app/assets/Security-C1OmAgom.js +2 -0
- package/dist/app/assets/Security-C1OmAgom.js.map +1 -0
- package/dist/app/assets/SignIn-C_wwnmvu.js +2 -0
- package/dist/app/assets/SignIn-C_wwnmvu.js.map +1 -0
- package/dist/app/assets/SignUp-Dm5HalC6.js +2 -0
- package/dist/app/assets/SignUp-Dm5HalC6.js.map +1 -0
- package/dist/app/assets/SiteHeader-CJqQ0pL3.js +2 -0
- package/dist/app/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
- package/dist/app/assets/StickyMobileCta-REC3DROG.js +2 -0
- package/dist/app/assets/StickyMobileCta-REC3DROG.js.map +1 -0
- package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
- package/dist/app/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
- package/dist/app/assets/Success-D6b4wLPD.js +2 -0
- package/dist/app/assets/Success-D6b4wLPD.js.map +1 -0
- package/dist/app/assets/Terms-BMt39FQK.js +2 -0
- package/dist/app/assets/Terms-BMt39FQK.js.map +1 -0
- package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
- package/dist/app/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
- package/dist/app/assets/ToolsIndex-d1szo5bn.js +6 -0
- package/dist/app/assets/ToolsIndex-d1szo5bn.js.map +1 -0
- package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
- package/dist/app/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
- package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
- package/dist/app/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
- package/dist/app/assets/agentHandoff-BGmHqDwv.js +2 -0
- package/dist/app/assets/agentHandoff-BGmHqDwv.js.map +1 -0
- package/dist/app/assets/apiClient-3WVm94VW.js +2 -0
- package/dist/app/assets/apiClient-3WVm94VW.js.map +1 -0
- package/dist/app/assets/calculator-CofuwQa8.js +2 -0
- package/dist/app/assets/calculator-CofuwQa8.js.map +1 -0
- package/dist/app/assets/check-Fm2iQO64.js +2 -0
- package/dist/app/assets/check-Fm2iQO64.js.map +1 -0
- package/dist/app/assets/chevron-down-BIXHKpnf.js +2 -0
- package/dist/app/assets/chevron-down-BIXHKpnf.js.map +1 -0
- package/dist/app/assets/chunk-BHe-jwch.js +1 -0
- package/dist/app/assets/circle-check-X08qqy40.js +2 -0
- package/dist/app/assets/circle-check-X08qqy40.js.map +1 -0
- package/dist/app/assets/copy-KD-LYJ0z.js +2 -0
- package/dist/app/assets/copy-KD-LYJ0z.js.map +1 -0
- package/dist/app/assets/crop-K1LOmRty.js +2 -0
- package/dist/app/assets/crop-K1LOmRty.js.map +1 -0
- package/dist/app/assets/designPartnerRequest-DYqMElJd.js +2 -0
- package/dist/app/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
- package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
- package/dist/app/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
- package/dist/app/assets/download-BXzoc-Y3.js +2 -0
- package/dist/app/assets/download-BXzoc-Y3.js.map +1 -0
- package/dist/app/assets/eye-CHvLhG2r.js +2 -0
- package/dist/app/assets/eye-CHvLhG2r.js.map +1 -0
- package/dist/app/assets/file-text-CU-ETLz1.js +2 -0
- package/dist/app/assets/file-text-CU-ETLz1.js.map +1 -0
- package/dist/app/assets/folder-tree-raVH0Y5V.js +2 -0
- package/dist/app/assets/folder-tree-raVH0Y5V.js.map +1 -0
- package/dist/app/assets/grid-3x3-cWuhGQfz.js +2 -0
- package/dist/app/assets/grid-3x3-cWuhGQfz.js.map +1 -0
- package/dist/app/assets/hardeningOffer-tkjlPDU-.js +2 -0
- package/dist/app/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
- package/dist/app/assets/hero/agent-starter-workflow.png +0 -0
- package/dist/app/assets/hero/agent-starter-workflow.webp +0 -0
- package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
- package/dist/app/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
- package/dist/app/assets/index-BW_YmKvl.css +2 -0
- package/dist/app/assets/index-D7D6ZRCW.js +212 -0
- package/dist/app/assets/index-D7D6ZRCW.js.map +1 -0
- package/dist/app/assets/jszip.min-XyfP2hUJ.js +3 -0
- package/dist/app/assets/jszip.min-XyfP2hUJ.js.map +1 -0
- package/dist/app/assets/layout-grid-Cq_e979G.js +2 -0
- package/dist/app/assets/layout-grid-Cq_e979G.js.map +1 -0
- package/dist/app/assets/lock-Di7P18Ts.js +2 -0
- package/dist/app/assets/lock-Di7P18Ts.js.map +1 -0
- package/dist/app/assets/rocket-DHdrCHKD.js +2 -0
- package/dist/app/assets/rocket-DHdrCHKD.js.map +1 -0
- package/dist/app/assets/shield-check-CxpHNdp0.js +2 -0
- package/dist/app/assets/shield-check-CxpHNdp0.js.map +1 -0
- package/dist/app/assets/smartphone-DXKiqu57.js +2 -0
- package/dist/app/assets/smartphone-DXKiqu57.js.map +1 -0
- package/dist/app/assets/stripeClient-CuZgvzca.js +2 -0
- package/dist/app/assets/stripeClient-CuZgvzca.js.map +1 -0
- package/dist/app/assets/terminal-J0iyJTv2.js +2 -0
- package/dist/app/assets/terminal-J0iyJTv2.js.map +1 -0
- package/dist/app/assets/triangle-alert-BA0HP6zD.js +2 -0
- package/dist/app/assets/triangle-alert-BA0HP6zD.js.map +1 -0
- package/dist/app/assets/useAuth-CoS4r8yi.js +22 -0
- package/dist/app/assets/useAuth-CoS4r8yi.js.map +1 -0
- package/dist/app/assets/users-C-fz7pbn.js +2 -0
- package/dist/app/assets/users-C-fz7pbn.js.map +1 -0
- package/dist/app/index.html +9 -8
- package/dist/assets/AgentCli-nIqgOG-i.js +17 -0
- package/dist/assets/AgentCli-nIqgOG-i.js.map +1 -0
- package/dist/assets/AgentHandoffPanel-Bf_AJepG.js +2 -0
- package/dist/assets/AgentHandoffPanel-Bf_AJepG.js.map +1 -0
- package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js +2 -0
- package/dist/assets/AgentStarterWorkflowFigure-DW4SMMy7.js.map +1 -0
- package/dist/assets/App-BRKxkubQ.css +1 -0
- package/dist/assets/App-CZiyX8-L.js +14 -0
- package/dist/assets/App-CZiyX8-L.js.map +1 -0
- package/dist/assets/AppReviewAso-DYOCuqgV.js +4 -0
- package/dist/assets/AppReviewAso-DYOCuqgV.js.map +1 -0
- package/dist/assets/Cancelled-CP6V6uDb.js +2 -0
- package/dist/assets/Cancelled-CP6V6uDb.js.map +1 -0
- package/dist/assets/CopyButton-BFCx6EPg.js +2 -0
- package/dist/assets/CopyButton-BFCx6EPg.js.map +1 -0
- package/dist/assets/DesignPartner-B4J7f0Bx.js +4 -0
- package/dist/assets/DesignPartner-B4J7f0Bx.js.map +1 -0
- package/dist/assets/FastlaneScreenshots-cdZE6cGY.js +90 -0
- package/dist/assets/FastlaneScreenshots-cdZE6cGY.js.map +1 -0
- package/dist/assets/FirstExport-qfY7uE8r.js +6 -0
- package/dist/assets/FirstExport-qfY7uE8r.js.map +1 -0
- package/dist/assets/FitPanel-B1J0V1jK.js +2 -0
- package/dist/assets/FitPanel-B1J0V1jK.js.map +1 -0
- package/dist/assets/FivePanelFramework-C4yq58kM.js +62 -0
- package/dist/assets/FivePanelFramework-C4yq58kM.js.map +1 -0
- package/dist/assets/ForgotPassword-KF_HFGyb.js +2 -0
- package/dist/assets/ForgotPassword-KF_HFGyb.js.map +1 -0
- package/dist/assets/Landing-B_CvZDXJ.js +2 -0
- package/dist/assets/Landing-B_CvZDXJ.js.map +1 -0
- package/dist/assets/LanguageSwitcher-hFv9zl1u.js +2 -0
- package/dist/assets/LanguageSwitcher-hFv9zl1u.js.map +1 -0
- package/dist/assets/Legal-BwGbEjDk.js +2 -0
- package/dist/assets/Legal-BwGbEjDk.js.map +1 -0
- package/dist/assets/NotFound-Ba1Bw7uu.js +2 -0
- package/dist/assets/NotFound-Ba1Bw7uu.js.map +1 -0
- package/dist/assets/Pricing-Dt-V4Gqc.js +20 -0
- package/dist/assets/Pricing-Dt-V4Gqc.js.map +1 -0
- package/dist/assets/Privacy-C6MrXYPO.js +2 -0
- package/dist/assets/Privacy-C6MrXYPO.js.map +1 -0
- package/dist/assets/Proof-C3DDFAhm.js +20 -0
- package/dist/assets/Proof-C3DDFAhm.js.map +1 -0
- package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js +27 -0
- package/dist/assets/ReleaseFitIntake-DBeb9AFJ.js.map +1 -0
- package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js +2 -0
- package/dist/assets/SalesEntryQuickRequestCard-Bfa93AYu.js.map +1 -0
- package/dist/assets/Security-C1OmAgom.js +2 -0
- package/dist/assets/Security-C1OmAgom.js.map +1 -0
- package/dist/assets/SignIn-C_wwnmvu.js +2 -0
- package/dist/assets/SignIn-C_wwnmvu.js.map +1 -0
- package/dist/assets/SignUp-Dm5HalC6.js +2 -0
- package/dist/assets/SignUp-Dm5HalC6.js.map +1 -0
- package/dist/assets/SiteHeader-CJqQ0pL3.js +2 -0
- package/dist/assets/SiteHeader-CJqQ0pL3.js.map +1 -0
- package/dist/assets/StickyMobileCta-REC3DROG.js +2 -0
- package/dist/assets/StickyMobileCta-REC3DROG.js.map +1 -0
- package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js +6 -0
- package/dist/assets/StoreAssetsPipeline-DNnnBp0D.js.map +1 -0
- package/dist/assets/Success-D6b4wLPD.js +2 -0
- package/dist/assets/Success-D6b4wLPD.js.map +1 -0
- package/dist/assets/Terms-BMt39FQK.js +2 -0
- package/dist/assets/Terms-BMt39FQK.js.map +1 -0
- package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js +2 -0
- package/dist/assets/ToolGuardrailsPanel-Cclxwdrb.js.map +1 -0
- package/dist/assets/ToolsIndex-d1szo5bn.js +6 -0
- package/dist/assets/ToolsIndex-d1szo5bn.js.map +1 -0
- package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js +2 -0
- package/dist/assets/TrustSalesEntryPanel-DuncpgMs.js.map +1 -0
- package/dist/assets/WorkloadCalculator-BbFWF2Ls.js +5 -0
- package/dist/assets/WorkloadCalculator-BbFWF2Ls.js.map +1 -0
- package/dist/assets/agentHandoff-BGmHqDwv.js +2 -0
- package/dist/assets/agentHandoff-BGmHqDwv.js.map +1 -0
- package/dist/assets/apiClient-3WVm94VW.js +2 -0
- package/dist/assets/apiClient-3WVm94VW.js.map +1 -0
- package/dist/assets/calculator-CofuwQa8.js +2 -0
- package/dist/assets/calculator-CofuwQa8.js.map +1 -0
- package/dist/assets/check-Fm2iQO64.js +2 -0
- package/dist/assets/check-Fm2iQO64.js.map +1 -0
- package/dist/assets/chevron-down-BIXHKpnf.js +2 -0
- package/dist/assets/chevron-down-BIXHKpnf.js.map +1 -0
- package/dist/assets/chunk-BHe-jwch.js +1 -0
- package/dist/assets/circle-check-X08qqy40.js +2 -0
- package/dist/assets/circle-check-X08qqy40.js.map +1 -0
- package/dist/assets/copy-KD-LYJ0z.js +2 -0
- package/dist/assets/copy-KD-LYJ0z.js.map +1 -0
- package/dist/assets/crop-K1LOmRty.js +2 -0
- package/dist/assets/crop-K1LOmRty.js.map +1 -0
- package/dist/assets/designPartnerRequest-DYqMElJd.js +2 -0
- package/dist/assets/designPartnerRequest-DYqMElJd.js.map +1 -0
- package/dist/assets/designPartnerSalesEntry-BpRINg3I.js +2 -0
- package/dist/assets/designPartnerSalesEntry-BpRINg3I.js.map +1 -0
- package/dist/assets/download-BXzoc-Y3.js +2 -0
- package/dist/assets/download-BXzoc-Y3.js.map +1 -0
- package/dist/assets/eye-CHvLhG2r.js +2 -0
- package/dist/assets/eye-CHvLhG2r.js.map +1 -0
- package/dist/assets/file-text-CU-ETLz1.js +2 -0
- package/dist/assets/file-text-CU-ETLz1.js.map +1 -0
- package/dist/assets/folder-tree-raVH0Y5V.js +2 -0
- package/dist/assets/folder-tree-raVH0Y5V.js.map +1 -0
- package/dist/assets/grid-3x3-cWuhGQfz.js +2 -0
- package/dist/assets/grid-3x3-cWuhGQfz.js.map +1 -0
- package/dist/assets/hardeningOffer-tkjlPDU-.js +2 -0
- package/dist/assets/hardeningOffer-tkjlPDU-.js.map +1 -0
- package/dist/assets/hero/agent-starter-workflow.png +0 -0
- package/dist/assets/hero/agent-starter-workflow.webp +0 -0
- package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js +6 -0
- package/dist/assets/html2canvas-pro.esm-OQkwCdu_.js.map +1 -0
- package/dist/assets/index-BW_YmKvl.css +2 -0
- package/dist/assets/index-D7D6ZRCW.js +212 -0
- package/dist/assets/index-D7D6ZRCW.js.map +1 -0
- package/dist/assets/jszip.min-XyfP2hUJ.js +3 -0
- package/dist/assets/jszip.min-XyfP2hUJ.js.map +1 -0
- package/dist/assets/layout-grid-Cq_e979G.js +2 -0
- package/dist/assets/layout-grid-Cq_e979G.js.map +1 -0
- package/dist/assets/lock-Di7P18Ts.js +2 -0
- package/dist/assets/lock-Di7P18Ts.js.map +1 -0
- package/dist/assets/rocket-DHdrCHKD.js +2 -0
- package/dist/assets/rocket-DHdrCHKD.js.map +1 -0
- package/dist/assets/shield-check-CxpHNdp0.js +2 -0
- package/dist/assets/shield-check-CxpHNdp0.js.map +1 -0
- package/dist/assets/smartphone-DXKiqu57.js +2 -0
- package/dist/assets/smartphone-DXKiqu57.js.map +1 -0
- package/dist/assets/stripeClient-CuZgvzca.js +2 -0
- package/dist/assets/stripeClient-CuZgvzca.js.map +1 -0
- package/dist/assets/terminal-J0iyJTv2.js +2 -0
- package/dist/assets/terminal-J0iyJTv2.js.map +1 -0
- package/dist/assets/triangle-alert-BA0HP6zD.js +2 -0
- package/dist/assets/triangle-alert-BA0HP6zD.js.map +1 -0
- package/dist/assets/useAuth-CoS4r8yi.js +22 -0
- package/dist/assets/useAuth-CoS4r8yi.js.map +1 -0
- package/dist/assets/users-C-fz7pbn.js +2 -0
- package/dist/assets/users-C-fz7pbn.js.map +1 -0
- package/dist/cancelled/index.html +3 -2
- package/dist/design-partner/index.html +6 -5
- package/dist/downloads/shipscreens-github-actions-template.yml +1 -1
- package/dist/forgot-password/index.html +3 -2
- package/dist/index.html +9 -8
- package/dist/legal/index.html +3 -2
- package/dist/llms-full.txt +80 -17
- package/dist/llms.txt +38 -12
- package/dist/mcp-server.json +4 -4
- package/dist/pricing/index.html +6 -5
- package/dist/privacy/index.html +3 -2
- package/dist/proof/index.html +6 -5
- package/dist/security/index.html +3 -2
- package/dist/signin/index.html +3 -2
- package/dist/signup/index.html +3 -2
- package/dist/success/index.html +3 -2
- package/dist/terms/index.html +3 -2
- package/dist/tools/5-panel-screenshot-framework/index.html +6 -5
- package/dist/tools/agent-cli/index.html +8 -7
- package/dist/tools/app-review-aso/index.html +6 -5
- package/dist/tools/app-store-localization-screenshot-automation/index.html +8 -7
- package/dist/tools/app-store-screenshot-automation/index.html +8 -7
- package/dist/tools/app-store-screenshot-requirements-checklist/index.html +8 -7
- package/dist/tools/claude-code-mcp-screenshot-automation/index.html +8 -7
- package/dist/tools/cursor-mcp-screenshot-automation/index.html +8 -7
- package/dist/tools/deterministic-screenshot-reruns/index.html +8 -7
- package/dist/tools/device-locale-screenshot-matrix/index.html +8 -7
- package/dist/tools/fastlane-screenshot-folder-structure/index.html +8 -7
- package/dist/tools/fastlane-screenshot-pipeline/index.html +8 -7
- package/dist/tools/fastlane-screenshots/index.html +6 -5
- package/dist/tools/first-export/index.html +6 -5
- package/dist/tools/gemini-cli-mcp-screenshot-automation/index.html +8 -7
- package/dist/tools/google-play-screenshot-automation/index.html +8 -7
- package/dist/tools/google-play-screenshot-requirements-checklist/index.html +8 -7
- package/dist/tools/index.html +6 -5
- package/dist/tools/ipad-screenshot-review-requirements/index.html +8 -7
- package/dist/tools/openai-responses-tool-screenshot-automation/index.html +8 -7
- package/dist/tools/screenshot-ci-pipeline/index.html +8 -7
- package/dist/tools/screenshot-naming-order-drift/index.html +8 -7
- package/dist/tools/screenshot-workload-calculator/index.html +6 -5
- package/dist/tools/store-assets-pipeline/index.html +3 -2
- package/dist/tools/vscode-copilot-mcp-screenshot-automation/index.html +8 -7
- package/package.json +7 -7
- package/dist/app/assets/AgentCli-xKYtzL3B.js +0 -17
- package/dist/app/assets/AgentCli-xKYtzL3B.js.map +0 -1
- package/dist/app/assets/App-C1cNw_fn.js +0 -13
- package/dist/app/assets/App-C1cNw_fn.js.map +0 -1
- package/dist/app/assets/App-oQfE_p3A.css +0 -1
- package/dist/app/assets/AppReviewAso-CaIT-L7Z.js +0 -4
- package/dist/app/assets/AppReviewAso-CaIT-L7Z.js.map +0 -1
- package/dist/app/assets/Cancelled-Dmw7PTD-.js +0 -2
- package/dist/app/assets/Cancelled-Dmw7PTD-.js.map +0 -1
- package/dist/app/assets/CopyButton-CPRHmu8l.js +0 -2
- package/dist/app/assets/CopyButton-CPRHmu8l.js.map +0 -1
- package/dist/app/assets/DesignPartner-Ckp1GhNv.js +0 -4
- package/dist/app/assets/DesignPartner-Ckp1GhNv.js.map +0 -1
- package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js +0 -100
- package/dist/app/assets/FastlaneScreenshots-CB-zv5Us.js.map +0 -1
- package/dist/app/assets/FirstExport-RXbvVQdK.js +0 -6
- package/dist/app/assets/FirstExport-RXbvVQdK.js.map +0 -1
- package/dist/app/assets/FitPanel-ic91y-49.js +0 -2
- package/dist/app/assets/FitPanel-ic91y-49.js.map +0 -1
- package/dist/app/assets/FivePanelFramework-BZKNcycb.js +0 -62
- package/dist/app/assets/FivePanelFramework-BZKNcycb.js.map +0 -1
- package/dist/app/assets/ForgotPassword-CKOfAvWk.js +0 -2
- package/dist/app/assets/ForgotPassword-CKOfAvWk.js.map +0 -1
- package/dist/app/assets/Landing-D0cuDDUk.js +0 -2
- package/dist/app/assets/Landing-D0cuDDUk.js.map +0 -1
- package/dist/app/assets/LanguageSwitcher-BrToLEgF.js +0 -2
- package/dist/app/assets/LanguageSwitcher-BrToLEgF.js.map +0 -1
- package/dist/app/assets/Legal-Cm-hVzjY.js +0 -2
- package/dist/app/assets/Legal-Cm-hVzjY.js.map +0 -1
- package/dist/app/assets/NotFound-B0I6I440.js +0 -2
- package/dist/app/assets/NotFound-B0I6I440.js.map +0 -1
- package/dist/app/assets/Pricing-p-NIjjtK.js +0 -29
- package/dist/app/assets/Pricing-p-NIjjtK.js.map +0 -1
- package/dist/app/assets/Privacy-BhfPkK0y.js +0 -2
- package/dist/app/assets/Privacy-BhfPkK0y.js.map +0 -1
- package/dist/app/assets/Proof-D-7QbTGX.js +0 -20
- package/dist/app/assets/Proof-D-7QbTGX.js.map +0 -1
- package/dist/app/assets/Security-DFafJQIT.js +0 -2
- package/dist/app/assets/Security-DFafJQIT.js.map +0 -1
- package/dist/app/assets/SignIn--6nNsUCm.js +0 -2
- package/dist/app/assets/SignIn--6nNsUCm.js.map +0 -1
- package/dist/app/assets/SignUp-yh5ydmFf.js +0 -2
- package/dist/app/assets/SignUp-yh5ydmFf.js.map +0 -1
- package/dist/app/assets/SiteHeader-NTK-cM9O.js +0 -2
- package/dist/app/assets/SiteHeader-NTK-cM9O.js.map +0 -1
- package/dist/app/assets/StickyMobileCta-DVXAyhaH.js +0 -2
- package/dist/app/assets/StickyMobileCta-DVXAyhaH.js.map +0 -1
- package/dist/app/assets/StoreAssetsPipeline-Cbs1bNK5.js +0 -6
- package/dist/app/assets/StoreAssetsPipeline-Cbs1bNK5.js.map +0 -1
- package/dist/app/assets/Success-C3n0m1XU.js +0 -2
- package/dist/app/assets/Success-C3n0m1XU.js.map +0 -1
- package/dist/app/assets/Terms-C72ybAwA.js +0 -2
- package/dist/app/assets/Terms-C72ybAwA.js.map +0 -1
- package/dist/app/assets/ToolGuardrailsPanel-meKxUeSB.js +0 -2
- package/dist/app/assets/ToolGuardrailsPanel-meKxUeSB.js.map +0 -1
- package/dist/app/assets/ToolsIndex-CnvNTvyW.js +0 -6
- package/dist/app/assets/ToolsIndex-CnvNTvyW.js.map +0 -1
- package/dist/app/assets/WorkloadCalculator-CK4qVUcQ.js +0 -5
- package/dist/app/assets/WorkloadCalculator-CK4qVUcQ.js.map +0 -1
- package/dist/app/assets/arrow-right-Dglia5EE.js +0 -2
- package/dist/app/assets/arrow-right-Dglia5EE.js.map +0 -1
- package/dist/app/assets/calculator-CAgtsVuH.js +0 -2
- package/dist/app/assets/calculator-CAgtsVuH.js.map +0 -1
- package/dist/app/assets/check-B5h9hATV.js +0 -2
- package/dist/app/assets/check-B5h9hATV.js.map +0 -1
- package/dist/app/assets/chevron-down-By2Ts8dG.js +0 -2
- package/dist/app/assets/chevron-down-By2Ts8dG.js.map +0 -1
- package/dist/app/assets/circle-check-DaJ6APMi.js +0 -2
- package/dist/app/assets/circle-check-DaJ6APMi.js.map +0 -1
- package/dist/app/assets/clipboard-copy-IDfWU9SE.js +0 -2
- package/dist/app/assets/clipboard-copy-IDfWU9SE.js.map +0 -1
- package/dist/app/assets/copy-KSn4Rc2b.js +0 -2
- package/dist/app/assets/copy-KSn4Rc2b.js.map +0 -1
- package/dist/app/assets/crop-C9hwiw0i.js +0 -2
- package/dist/app/assets/crop-C9hwiw0i.js.map +0 -1
- package/dist/app/assets/download-eqwxO8bs.js +0 -2
- package/dist/app/assets/download-eqwxO8bs.js.map +0 -1
- package/dist/app/assets/eye-Dg61f0nU.js +0 -2
- package/dist/app/assets/eye-Dg61f0nU.js.map +0 -1
- package/dist/app/assets/file-text-BQPKCil3.js +0 -2
- package/dist/app/assets/file-text-BQPKCil3.js.map +0 -1
- package/dist/app/assets/folder-tree-9hq6oigy.js +0 -2
- package/dist/app/assets/folder-tree-9hq6oigy.js.map +0 -1
- package/dist/app/assets/grid-3x3-BHXRyOIx.js +0 -2
- package/dist/app/assets/grid-3x3-BHXRyOIx.js.map +0 -1
- package/dist/app/assets/index-my6BmN7T.js +0 -204
- package/dist/app/assets/index-my6BmN7T.js.map +0 -1
- package/dist/app/assets/index-rv91vbLH.css +0 -1
- package/dist/app/assets/layout-grid-DDQvnEgx.js +0 -2
- package/dist/app/assets/layout-grid-DDQvnEgx.js.map +0 -1
- package/dist/app/assets/rocket-0KMviRpJ.js +0 -2
- package/dist/app/assets/rocket-0KMviRpJ.js.map +0 -1
- package/dist/app/assets/shield-check-BvKEQ2hc.js +0 -2
- package/dist/app/assets/shield-check-BvKEQ2hc.js.map +0 -1
- package/dist/app/assets/signIn-Ckla1_0O.js +0 -2
- package/dist/app/assets/signIn-Ckla1_0O.js.map +0 -1
- package/dist/app/assets/smartphone-I0w1b2DV.js +0 -2
- package/dist/app/assets/smartphone-I0w1b2DV.js.map +0 -1
- package/dist/app/assets/terminal-CLpUSQqd.js +0 -2
- package/dist/app/assets/terminal-CLpUSQqd.js.map +0 -1
- package/dist/app/assets/triangle-alert-w7TZ0yy2.js +0 -2
- package/dist/app/assets/triangle-alert-w7TZ0yy2.js.map +0 -1
- package/dist/app/assets/useAuth-N3hsUaDj.js +0 -4
- package/dist/app/assets/useAuth-N3hsUaDj.js.map +0 -1
- package/dist/app/assets/users-DsQdkuR3.js +0 -2
- package/dist/app/assets/users-DsQdkuR3.js.map +0 -1
- package/dist/assets/AgentCli-xKYtzL3B.js +0 -17
- package/dist/assets/AgentCli-xKYtzL3B.js.map +0 -1
- package/dist/assets/App-C1cNw_fn.js +0 -13
- package/dist/assets/App-C1cNw_fn.js.map +0 -1
- package/dist/assets/App-oQfE_p3A.css +0 -1
- package/dist/assets/AppReviewAso-CaIT-L7Z.js +0 -4
- package/dist/assets/AppReviewAso-CaIT-L7Z.js.map +0 -1
- package/dist/assets/Cancelled-Dmw7PTD-.js +0 -2
- package/dist/assets/Cancelled-Dmw7PTD-.js.map +0 -1
- package/dist/assets/CopyButton-CPRHmu8l.js +0 -2
- package/dist/assets/CopyButton-CPRHmu8l.js.map +0 -1
- package/dist/assets/DesignPartner-Ckp1GhNv.js +0 -4
- package/dist/assets/DesignPartner-Ckp1GhNv.js.map +0 -1
- package/dist/assets/FastlaneScreenshots-CB-zv5Us.js +0 -100
- package/dist/assets/FastlaneScreenshots-CB-zv5Us.js.map +0 -1
- package/dist/assets/FirstExport-RXbvVQdK.js +0 -6
- package/dist/assets/FirstExport-RXbvVQdK.js.map +0 -1
- package/dist/assets/FitPanel-ic91y-49.js +0 -2
- package/dist/assets/FitPanel-ic91y-49.js.map +0 -1
- package/dist/assets/FivePanelFramework-BZKNcycb.js +0 -62
- package/dist/assets/FivePanelFramework-BZKNcycb.js.map +0 -1
- package/dist/assets/ForgotPassword-CKOfAvWk.js +0 -2
- package/dist/assets/ForgotPassword-CKOfAvWk.js.map +0 -1
- package/dist/assets/Landing-D0cuDDUk.js +0 -2
- package/dist/assets/Landing-D0cuDDUk.js.map +0 -1
- package/dist/assets/LanguageSwitcher-BrToLEgF.js +0 -2
- package/dist/assets/LanguageSwitcher-BrToLEgF.js.map +0 -1
- package/dist/assets/Legal-Cm-hVzjY.js +0 -2
- package/dist/assets/Legal-Cm-hVzjY.js.map +0 -1
- package/dist/assets/NotFound-B0I6I440.js +0 -2
- package/dist/assets/NotFound-B0I6I440.js.map +0 -1
- package/dist/assets/Pricing-p-NIjjtK.js +0 -29
- package/dist/assets/Pricing-p-NIjjtK.js.map +0 -1
- package/dist/assets/Privacy-BhfPkK0y.js +0 -2
- package/dist/assets/Privacy-BhfPkK0y.js.map +0 -1
- package/dist/assets/Proof-D-7QbTGX.js +0 -20
- package/dist/assets/Proof-D-7QbTGX.js.map +0 -1
- package/dist/assets/Security-DFafJQIT.js +0 -2
- package/dist/assets/Security-DFafJQIT.js.map +0 -1
- package/dist/assets/SignIn--6nNsUCm.js +0 -2
- package/dist/assets/SignIn--6nNsUCm.js.map +0 -1
- package/dist/assets/SignUp-yh5ydmFf.js +0 -2
- package/dist/assets/SignUp-yh5ydmFf.js.map +0 -1
- package/dist/assets/SiteHeader-NTK-cM9O.js +0 -2
- package/dist/assets/SiteHeader-NTK-cM9O.js.map +0 -1
- package/dist/assets/StickyMobileCta-DVXAyhaH.js +0 -2
- package/dist/assets/StickyMobileCta-DVXAyhaH.js.map +0 -1
- package/dist/assets/StoreAssetsPipeline-Cbs1bNK5.js +0 -6
- package/dist/assets/StoreAssetsPipeline-Cbs1bNK5.js.map +0 -1
- package/dist/assets/Success-C3n0m1XU.js +0 -2
- package/dist/assets/Success-C3n0m1XU.js.map +0 -1
- package/dist/assets/Terms-C72ybAwA.js +0 -2
- package/dist/assets/Terms-C72ybAwA.js.map +0 -1
- package/dist/assets/ToolGuardrailsPanel-meKxUeSB.js +0 -2
- package/dist/assets/ToolGuardrailsPanel-meKxUeSB.js.map +0 -1
- package/dist/assets/ToolsIndex-CnvNTvyW.js +0 -6
- package/dist/assets/ToolsIndex-CnvNTvyW.js.map +0 -1
- package/dist/assets/WorkloadCalculator-CK4qVUcQ.js +0 -5
- package/dist/assets/WorkloadCalculator-CK4qVUcQ.js.map +0 -1
- package/dist/assets/arrow-right-Dglia5EE.js +0 -2
- package/dist/assets/arrow-right-Dglia5EE.js.map +0 -1
- package/dist/assets/calculator-CAgtsVuH.js +0 -2
- package/dist/assets/calculator-CAgtsVuH.js.map +0 -1
- package/dist/assets/check-B5h9hATV.js +0 -2
- package/dist/assets/check-B5h9hATV.js.map +0 -1
- package/dist/assets/chevron-down-By2Ts8dG.js +0 -2
- package/dist/assets/chevron-down-By2Ts8dG.js.map +0 -1
- package/dist/assets/circle-check-DaJ6APMi.js +0 -2
- package/dist/assets/circle-check-DaJ6APMi.js.map +0 -1
- package/dist/assets/clipboard-copy-IDfWU9SE.js +0 -2
- package/dist/assets/clipboard-copy-IDfWU9SE.js.map +0 -1
- package/dist/assets/copy-KSn4Rc2b.js +0 -2
- package/dist/assets/copy-KSn4Rc2b.js.map +0 -1
- package/dist/assets/crop-C9hwiw0i.js +0 -2
- package/dist/assets/crop-C9hwiw0i.js.map +0 -1
- package/dist/assets/download-eqwxO8bs.js +0 -2
- package/dist/assets/download-eqwxO8bs.js.map +0 -1
- package/dist/assets/eye-Dg61f0nU.js +0 -2
- package/dist/assets/eye-Dg61f0nU.js.map +0 -1
- package/dist/assets/file-text-BQPKCil3.js +0 -2
- package/dist/assets/file-text-BQPKCil3.js.map +0 -1
- package/dist/assets/folder-tree-9hq6oigy.js +0 -2
- package/dist/assets/folder-tree-9hq6oigy.js.map +0 -1
- package/dist/assets/grid-3x3-BHXRyOIx.js +0 -2
- package/dist/assets/grid-3x3-BHXRyOIx.js.map +0 -1
- package/dist/assets/index-my6BmN7T.js +0 -204
- package/dist/assets/index-my6BmN7T.js.map +0 -1
- package/dist/assets/index-rv91vbLH.css +0 -1
- package/dist/assets/layout-grid-DDQvnEgx.js +0 -2
- package/dist/assets/layout-grid-DDQvnEgx.js.map +0 -1
- package/dist/assets/rocket-0KMviRpJ.js +0 -2
- package/dist/assets/rocket-0KMviRpJ.js.map +0 -1
- package/dist/assets/shield-check-BvKEQ2hc.js +0 -2
- package/dist/assets/shield-check-BvKEQ2hc.js.map +0 -1
- package/dist/assets/signIn-Ckla1_0O.js +0 -2
- package/dist/assets/signIn-Ckla1_0O.js.map +0 -1
- package/dist/assets/smartphone-I0w1b2DV.js +0 -2
- package/dist/assets/smartphone-I0w1b2DV.js.map +0 -1
- package/dist/assets/terminal-CLpUSQqd.js +0 -2
- package/dist/assets/terminal-CLpUSQqd.js.map +0 -1
- package/dist/assets/triangle-alert-w7TZ0yy2.js +0 -2
- package/dist/assets/triangle-alert-w7TZ0yy2.js.map +0 -1
- package/dist/assets/useAuth-N3hsUaDj.js +0 -4
- package/dist/assets/useAuth-N3hsUaDj.js.map +0 -1
- package/dist/assets/users-DsQdkuR3.js +0 -2
- package/dist/assets/users-DsQdkuR3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignPartner-B4J7f0Bx.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/clock-3.mjs","../../src/pages/DesignPartner.jsx"],"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 [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 6v6h4\", key: \"135r8i\" }]\n];\nconst Clock3 = createLucideIcon(\"clock-3\", __iconNode);\n\nexport { __iconNode, Clock3 as default };\n//# sourceMappingURL=clock-3.mjs.map\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { ArrowRight, CheckCircle2, ClipboardCopy, Clock3, ShieldCheck, Users } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport CopyButton from '../components/CopyButton';\nimport SiteHeader from '../components/SiteHeader';\nimport StagingBadge from '../components/StagingBadge';\nimport usePageTitle from '../hooks/usePageTitle';\nimport { trackEvent, trackEventAndFollowLink } from '../lib/analytics';\nimport { getAttributionLeadId, getAttributionParams } from '../lib/attribution';\nimport {\n buildDesignPartnerRequestMeta,\n buildDesignPartnerRequestPayload,\n describeDesignPartnerQuickRequest,\n submitDesignPartnerRequest,\n} from '../lib/designPartnerRequest';\nimport {\n buildDesignPartnerContextHref,\n buildOfferPricingHref,\n isDirectSalesEntrySource,\n shouldPrioritizeDesignPartnerRequest,\n sanitizeDesignPartnerQueryPrefill,\n} from '../lib/designPartnerPrefill';\nimport { hasHardeningOfferCheckout, startHardeningOfferCheckout } from '../lib/hardeningOffer';\n\nconst normalizeLang = (lang) => {\n const base = (lang || '').split('-')[0];\n return base === 'ja' ? 'ja' : 'en';\n};\n\nconst DEFAULT_FORM = Object.freeze({\n contactName: '',\n contactEmail: '',\n xHandle: '',\n appUrl: '',\n reviewMode: 'async_email',\n releaseTimeline: '',\n platform: '',\n scope: '',\n workflow: '',\n blocker: '',\n notes: '',\n});\n\nconst buildInitialForm = () => {\n if (typeof window === 'undefined') return { ...DEFAULT_FORM };\n const prefill = sanitizeDesignPartnerQueryPrefill(new URLSearchParams(window.location.search));\n return {\n contactName: prefill.contactName,\n contactEmail: prefill.contactEmail,\n xHandle: prefill.xHandle,\n appUrl: prefill.appUrl,\n reviewMode: prefill.reviewMode || 'async_email',\n releaseTimeline: prefill.releaseTimeline,\n platform: prefill.platform,\n scope: prefill.scope,\n workflow: prefill.workflow,\n blocker: prefill.blocker,\n notes: '',\n };\n};\n\nconst buildCheckoutEntrySource = (entrySource) => {\n const normalized = String(entrySource || '').trim();\n if (!normalized) return 'design_partner_buy_now';\n return normalized.endsWith('_buy_now') ? normalized : `${normalized}_buy_now`;\n};\n\nconst isAgentStarterRequestEntrySource = (entrySource) =>\n /(^|_)agent_starter_request(_|$)/i.test(String(entrySource || '').trim());\n\nconst parseMaybeUrl = (value) => {\n const normalized = String(value || '').trim();\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 guessAppLabel = (value) => {\n const normalized = String(value || '').trim();\n if (!normalized) return '';\n\n const parsed = parseMaybeUrl(normalized);\n if (parsed?.hostname) return parsed.hostname.replace(/^www\\./i, '');\n\n const simplified = normalized.replace(/^https?:\\/\\//i, '').split(/[/?#]/)[0];\n return simplified || normalized;\n};\n\nconst getOptionLabel = (options, value, fallback) => {\n const match = (options || []).find((option) => option.value === value);\n return match?.label || fallback;\n};\n\nconst buildRequestRows = (copy, form) => {\n const { intake } = copy;\n const missing = intake.notFilled;\n\n return [\n [intake.appUrlLabel, form.appUrl.trim() || missing],\n [intake.reviewModeLabel, getOptionLabel(intake.reviewModeOptions, form.reviewMode, missing)],\n [intake.releaseTimelineLabel, getOptionLabel(intake.releaseTimelineOptions, form.releaseTimeline, missing)],\n [intake.platformLabel, getOptionLabel(intake.platformOptions, form.platform, missing)],\n [intake.scopeLabel, getOptionLabel(intake.scopeOptions, form.scope, missing)],\n [intake.workflowLabel, getOptionLabel(intake.workflowOptions, form.workflow, missing)],\n [intake.blockerLabel, getOptionLabel(intake.blockerOptions, form.blocker, missing)],\n ];\n};\n\nconst buildEmailBody = (copy, form) => {\n const rows = buildRequestRows(copy, form).map(([label, value]) => `- ${label}: ${value}`);\n const notesLine = form.notes.trim() ? `- ${copy.intake.notesLabel}: ${form.notes.trim()}` : null;\n return [copy.intake.emailGreeting, '', copy.intake.emailLead, '', ...rows, notesLine, '', copy.intake.emailClosing]\n .filter(Boolean)\n .join('\\n');\n};\n\nconst buildDmBody = (copy, form) => {\n const rows = buildRequestRows(copy, form).map(([label, value]) => `${label}: ${value}`);\n const notesLine = form.notes.trim() ? `${copy.intake.notesLabel}: ${form.notes.trim()}` : null;\n return [copy.intake.dmLead, ...rows, notesLine].filter(Boolean).join('\\n');\n};\n\nconst COPY = {\n en: {\n badge: 'Paid hardening scope',\n title: 'Async review or 15-min call to scope a deterministic release step around your screenshot workflow',\n subtitle:\n 'For teams that already have screenshot creation working but still lose time at release. Start with an async email review if you do not want a call, or use a short live call if faster. We identify where Fastlane paths, naming/order, locale/device growth, iPad review, or upload roots break, then scope the shortest paid hardening path.',\n fitTitle: 'Best fit',\n fitBullets: [\n 'You own an active commercial app with a near-term release or recurring update cadence.',\n 'You ship iOS and/or Android updates regularly.',\n 'The pain is naming/order drift, iPad/review surprises, locale/device expansion, or upload-root churn.',\n 'You want to keep Figma/Canva/AI/manual creation and harden the release step instead of replacing the design stack.',\n ],\n processTitle: 'What happens next',\n process: [\n {\n title: '1) Current workflow snapshot',\n body: 'You send the current toolchain, release cadence, and the exact point where screenshot updates break. Async email review is the default; live call is optional.',\n },\n {\n title: '2) Hardening scope mapping',\n body: 'We map the shortest paid scope to a usable first export: iPhone-first scope, 01..05 naming, panel order, deterministic build/verify/stage, and upload-safe roots.',\n },\n {\n title: '3) Clear yes/no on the next paid step',\n body: 'You get a concrete action list and a clear yes/no on the first paid deliverable, not a generic audit.',\n },\n ],\n scopeTitle: 'If the fit is right, the paid scope covers',\n scopeBullets: [\n 'Naming / order / folder contract for the exact device-locale scope you ship next.',\n 'verify / stage checks so mixed roots and slot-map drift are caught before upload.',\n 'A usable first export for the upcoming release, not a long redesign project.',\n 'Fastlane-ready handoff while keeping Figma/Canva/AI/manual creation in place as the upstream workflow.',\n ],\n scopeNote: 'This is not a visual redesign engagement. The point is to harden the release path around the screenshots you already make.',\n trustTitle: 'Trust links',\n trustLinks: {\n pricing: 'Pricing',\n proof: 'Proof',\n security: 'Security',\n terms: 'Terms',\n privacy: 'Privacy',\n legal: 'Legal (Japan)',\n },\n ctaTitle: 'Request a review',\n buyNowTitle: 'Need the scope locked now?',\n buyNowPrice: '$750 one-time founding pilot',\n buyNowBody:\n 'Stripe checkout opens immediately. We follow up by email within 1 business day to confirm scope and schedule.',\n buyNowCta: 'Buy founding sprint',\n buyNowLoading: 'Opening checkout...',\n emailCta: 'Apply by email',\n dmCta: 'DM on X',\n firstExportCta: 'Tell your agent to run first export',\n agentCliCta: 'Open tell-your-agent guide',\n mailSubject: 'ShipScreens hardening scope review request',\n note: 'No hard sell. No redesign required. Async email review is fine if you do not want a meeting.',\n payFirstCta: 'See pay-first path',\n directEntryTitle: 'You are already in the direct review path',\n directEntryBody:\n 'No need to run first export first. If this release is already blocked by screenshot ops, send the request here. Async email review is the default, and you can still choose a short live call if that is easier.',\n directEntryPrefillBody:\n 'We prefilled the work email we already have from the outreach thread. You can send the request as-is and only expand the extra fields if something is missing.',\n directEntryQuickTitle: 'Ready to send the request now?',\n directEntryQuickBody:\n 'No call required. Your work email is already attached to this release thread. Send the request now and we will reply within 1 business day with the first release-risk teardown and next-step recommendation.',\n directEntryQuickEmailLabel: 'Work email',\n directEntryQuickAppLabel: 'App / URL',\n directEntryQuickReplyModeLabel: 'Reply mode',\n directEntryQuickCta: 'Send prefilled request now',\n agentStarterRequest: {\n badge: 'Agent Starter request',\n title: 'Request $5/mo Agent Starter for AI-agent screenshot exports',\n subtitle:\n 'For developers who want Codex or another coding agent to turn connected device or emulator screenshots into store-ready panels and Fastlane-ready exports. Send the app and release target, then we reply async with the setup/account path.',\n fitTitle: 'Best fit for Agent Starter',\n fitBullets: [\n 'You want an agent to operate ShipScreens from real device or emulator screenshots.',\n 'You need a store-ready first pass without learning screenshot specs, naming, or upload folders first.',\n 'You are comfortable with a lightweight monthly plan if it removes the watermark and keeps exports repeatable.',\n 'You prefer async email setup over a sales call.',\n ],\n processTitle: 'How the Starter handoff works',\n process: [\n {\n title: '1) Send the app target',\n body: 'Use the form to send the app URL, release timing, and whether the first run is iPhone-only or a broader matrix.',\n },\n {\n title: '2) We confirm setup',\n body: 'We reply by email with the account/payment next step and the exact agent instruction path to run ShipScreens.',\n },\n {\n title: '3) Your agent runs export',\n body: 'Codex, Claude Code, Cursor, or another agent can use the docs and CLI path to create panels and stage upload-ready folders.',\n },\n ],\n scopeTitle: 'Agent Starter includes',\n scopeBullets: [\n 'Watermark removal for the Starter workflow once the $5/mo subscription is active.',\n 'Agent-ready instructions for screenshot input, panel generation, validation, and Fastlane-ready staging.',\n 'iPhone-first default scope with a path to expand devices and locales later.',\n 'Async setup help so the first agent run does not get stuck on account or folder details.',\n ],\n scopeNote:\n 'The live $5 checkout is feature-flagged. Until the price ID is enabled, this request keeps the same Starter intent and attribution.',\n ctaTitle: 'Request $5 Agent Starter',\n note: 'No call required. Send the request and we reply async with the account and setup path.',\n mailSubject: 'ShipScreens Agent Starter request',\n agentStarterPlanTitle: 'Starter request path',\n agentStarterPlanPrice: '$5/mo once checkout is enabled',\n agentStarterPlanBody:\n 'This form preserves the Starter intent while live checkout is being enabled. It is separate from the larger release hardening pilot.',\n agentStarterPlanCta: 'Use this Starter request',\n intake: {\n title: 'Request Agent Starter in 60 seconds',\n contactTitle: 'Send the Starter request directly',\n contactHint: 'Send the request here and we will reply by email with the account/setup path.',\n notesPlaceholder:\n 'Optional: which agent you use, where screenshots come from, and what store submission folder you need first.',\n submitCta: 'Send $5 Starter request',\n emailLead:\n 'I want to request Agent Starter so my coding agent can use ShipScreens for store-ready screenshot exports.',\n dmLead: 'ShipScreens Agent Starter request',\n },\n },\n intake: {\n title: 'Prepare the request in 60 seconds',\n hint: 'Fill only what you know. The buttons below generate an email or DM draft immediately.',\n selectPlaceholder: 'Select',\n contactTitle: 'Send the request directly',\n contactHint: 'Best path: send the request here and we will reply by email within 1 business day.',\n contactHintSalesEntry:\n 'Fastest path: your work email is already prefilled from our earlier note. Send it directly, or expand the extra fields only if they help.',\n advancedFieldsLabel: 'Add release details (optional)',\n contactEmailLabel: 'Work email',\n contactEmailPlaceholder: 'you@company.com',\n contactNameLabel: 'Name',\n contactNamePlaceholder: 'Optional',\n xHandleLabel: 'X handle',\n xHandlePlaceholder: '@yourhandle (optional)',\n appUrlLabel: 'App / URL',\n appUrlPlaceholder: 'https://apps.apple.com/... or https://play.google.com/...',\n reviewModeLabel: 'Reply mode',\n reviewModeOptions: [\n { value: 'async_email', label: 'Async email review' },\n { value: 'live_call', label: '15-min live call' },\n ],\n releaseTimelineLabel: 'Release timeline',\n releaseTimelineOptions: [\n { value: 'this_week', label: 'This week' },\n { value: 'this_month', label: 'This month' },\n { value: 'next_quarter', label: 'Next quarter+' },\n ],\n platformLabel: 'Platform',\n platformOptions: [\n { value: 'ios', label: 'iOS' },\n { value: 'android', label: 'Android' },\n { value: 'ios_android', label: 'iOS + Android' },\n ],\n scopeLabel: 'Scope',\n scopeOptions: [\n { value: 'iphone_first', label: 'iPhone-first (5 panels)' },\n { value: 'matrix', label: 'Device / locale matrix' },\n { value: 'review_fix', label: 'iPad / review fix first' },\n ],\n workflowLabel: 'Current workflow',\n workflowOptions: [\n { value: 'figma', label: 'Figma' },\n { value: 'canva', label: 'Canva' },\n { value: 'ai_manual', label: 'AI / manual' },\n { value: 'fastlane_ci', label: 'Fastlane / CI' },\n ],\n blockerLabel: 'Biggest blocker',\n blockerOptions: [\n { value: 'panel_hook', label: 'Panel #1 / hook clarity' },\n { value: 'naming_order', label: 'Naming / order drift' },\n { value: 'ipad_review', label: 'iPad / review surprises' },\n { value: 'upload_roots', label: 'Upload roots / Fastlane' },\n ],\n notesLabel: 'Context',\n notesPlaceholder: 'Optional: release date, current pain, or what you want from the first paid deliverable.',\n submitCta: 'Send request directly',\n submitLoading: 'Sending request...',\n submitSuccess: 'Request sent. We will reply within 1 business day.',\n submitSuccessNoCopy: 'Request sent. We could not send a copy to your inbox, but the request is recorded.',\n submitError: 'Direct request failed. Use email or X DM below as fallback.',\n subjectLabel: 'Subject',\n emailDraftLabel: 'Email draft',\n dmDraftLabel: 'DM note',\n copyRequestCta: 'Copy email draft',\n copyDmCta: 'Copy DM note',\n previewTitle: 'Preview',\n notFilled: 'Not filled yet',\n supportEmailLabel: 'Email:',\n emailGreeting: 'Hi ShipScreens team,',\n emailLead: 'I want an async review or short call to decide whether a paid hardening scope makes sense.',\n emailClosing: 'Thanks.',\n dmLead: 'Screenshot hardening review request',\n },\n },\n ja: {\n badge: '有償リリース整備スコープ',\n title: '既存のスクショ運用に再現できる リリース工程を足す async review / 15分 call',\n subtitle:\n '既にスクショ作成は回っているのに、リリース時の事故で詰まるチーム向け。通話したくなければ async email review から始められます。Fastlane パス、命名/順序、端末/言語拡張、iPad審査、提出ルートのどこで壊れるかを整理し、最短の有償リリース整備スコープを決めます。',\n fitTitle: '向いているケース',\n fitBullets: [\n '近いリリース、または継続的な更新がある商用アプリを運用している。',\n 'iOS/Android の更新を継続している。',\n '命名/順序崩れ、iPad審査、端末/言語拡張、提出ルート事故が痛い。',\n 'Figma/Canva/AI/手動作成はそのままに、デザインではなくリリース工程を固めたい。',\n ],\n processTitle: '次に起きること',\n process: [\n {\n title: '1) 現行フローの把握',\n body: '現在のツール構成、更新頻度、どこで壊れるかを整理します。まずは async email review が既定で、必要なら短い call に切り替えます。',\n },\n {\n title: '2) リリース整備スコープを設計',\n body: 'iPhone-first、01..05 命名、訴求順、build と提出前チェック、提出ルートまで含め、最初の有償成果物をどこに置くか決めます。',\n },\n {\n title: '3) 次の有償ステップを yes/no 判定',\n body: '次のリリースに直結する具体タスクと、最初の有償成果物をやるかどうかを判断します。',\n },\n ],\n scopeTitle: '適合する場合の有償スコープ',\n scopeBullets: [\n '次に出す端末/言語範囲に対して、naming / order / folder contract を固定する。',\n '提出前チェック(verify / stage)で混在ルートや slot-map 崩れをアップロード前に止める。',\n '次のリリースで使える初回エクスポートまで持っていく。',\n 'Figma/Canva/AI/手動作成はそのまま、上流は変えずにアップロードしやすいリリース工程だけ固める。',\n ],\n scopeNote: '見た目の全面リデザインではありません。既存の制作物を前提に、リリース運用を再現できる状態にします。',\n trustTitle: '関連リンク',\n trustLinks: {\n pricing: '料金',\n proof: '実績',\n security: 'セキュリティ',\n terms: '利用規約',\n privacy: 'プライバシー',\n legal: '特商法表記',\n },\n ctaTitle: 'レビューを依頼する',\n buyNowTitle: '今すぐスコープを確定したい場合',\n buyNowPrice: '$750 one-time founding pilot',\n buyNowBody:\n 'Stripe 決済をすぐ開きます。購入後 1 営業日以内にメールで scope と進め方を確認します。',\n buyNowCta: '創業パイロットを購入',\n buyNowLoading: '決済を開いています...',\n emailCta: 'メールで依頼',\n dmCta: 'XでDM',\n firstExportCta: 'first export を開く',\n agentCliCta: 'coding agent ガイドを開く',\n mailSubject: 'ShipScreens リリース整備レビュー相談',\n note: '売り込み目的ではありません。通話は必須ではなく、async email review だけでも進められます。',\n payFirstCta: 'pay-first 導線を見る',\n directEntryTitle: 'すでに直接レビュー導線に入っています',\n directEntryBody:\n 'first export を先に試す必要はありません。今回のリリースがスクショ運用で詰まっているなら、この場で依頼してください。まずは async email review で進められ、必要なら短い call も選べます。',\n directEntryPrefillBody:\n '前回の連絡で使ったメールアドレスはすでに入っています。このまま依頼を送って、足りない情報だけ後から追加できます。',\n directEntryQuickTitle: 'このまま依頼を送れます',\n directEntryQuickBody:\n '通話は必須ではありません。この release thread にメールアドレスは紐づいているので、そのまま送信すれば 1営業日以内に最初の release-risk teardown と次の提案を返します。',\n directEntryQuickEmailLabel: 'メールアドレス',\n directEntryQuickAppLabel: 'アプリ名 / URL',\n directEntryQuickReplyModeLabel: '返信方法',\n directEntryQuickCta: 'この内容で今すぐ依頼する',\n agentStarterRequest: {\n badge: 'Agent Starter 申込',\n title: 'AIエージェント用スクショ書き出しの $5/mo Agent Starter を申し込む',\n subtitle:\n 'Codex などの coding agent に、実機やエミュレータのスクショ素材からストア提出用パネルと Fastlane-ready export を作らせたい開発者向けです。アプリと次のリリース対象を送れば、アカウントとセットアップ導線をメールで返します。',\n fitTitle: 'Agent Starter に向いているケース',\n fitBullets: [\n '実機またはエミュレータのスクショ素材を元に、agent に ShipScreens を操作させたい。',\n 'スクショ仕様、命名、提出フォルダを先に学ばずに、ストア提出用の初回案が欲しい。',\n '月額 $5 程度で watermark を外し、同じ手順で再実行できるなら十分価値がある。',\n '営業 call ではなく async email でセットアップしたい。',\n ],\n processTitle: 'Starter handoff の流れ',\n process: [\n {\n title: '1) アプリと対象を送る',\n body: 'フォームでアプリURL、リリース時期、最初は iPhone-only か端末/言語マトリクスかを送ります。',\n },\n {\n title: '2) セットアップを確認する',\n body: 'アカウント/支払いの次ステップと、agent に渡す ShipScreens 実行手順をメールで返します。',\n },\n {\n title: '3) agent が export する',\n body: 'Codex、Claude Code、Cursor などの agent が docs と CLI 導線を使い、panel 作成と提出用フォルダ staging まで進めます。',\n },\n ],\n scopeTitle: 'Agent Starter に含めるもの',\n scopeBullets: [\n '$5/mo subscription が有効になった後の Starter workflow watermark removal。',\n 'スクショ入力、panel generation、validation、Fastlane-ready staging までの agent-ready instruction。',\n '最初は iPhone-first を既定にし、後から端末/言語を広げられる導線。',\n '初回 agent run がアカウントや folder detail で止まらないための async setup help。',\n ],\n scopeNote:\n 'live $5 checkout は feature flag で切り替えます。Price ID を有効化するまでは、このフォームで Starter intent と attribution を保持します。',\n ctaTitle: '$5 Agent Starter を申し込む',\n note: '通話は不要です。依頼を送れば、アカウントとセットアップ導線をメールで返します。',\n mailSubject: 'ShipScreens Agent Starter 申込',\n agentStarterPlanTitle: 'Starter 申込導線',\n agentStarterPlanPrice: 'checkout 有効化後は $5/mo',\n agentStarterPlanBody:\n 'live checkout 有効化まで、Starter intent をこのフォームで保持します。大きめの release hardening pilot とは別導線です。',\n agentStarterPlanCta: 'Starter 申込として進める',\n intake: {\n title: '60秒で Agent Starter を申し込む',\n contactTitle: 'Starter 申込を直接送信',\n contactHint: 'ここから送れば、アカウントとセットアップ導線をメールで返します。',\n notesPlaceholder:\n '任意: 利用する agent、スクショ素材の取得元、最初に必要なストア提出フォルダなど。',\n submitCta: '$5 Starter 申込を送る',\n emailLead:\n 'coding agent に ShipScreens を使わせてストア提出用スクショを書き出したいので、Agent Starter を申し込みたいです。',\n dmLead: 'ShipScreens Agent Starter 申込',\n },\n },\n intake: {\n title: '60秒で依頼内容を作る',\n hint: '分かる項目だけで十分です。下のボタンでメール文面やDM下書きをその場で作れます。',\n selectPlaceholder: '選択してください',\n contactTitle: 'この場で直接依頼する',\n contactHint: '最短はこのフォーム送信です。1営業日以内にメールで返信します。',\n contactHintSalesEntry:\n '最短はそのまま直接送信です。前回の連絡で使ったメールアドレスは入っているので、必要なら補足だけ追加してください。',\n advancedFieldsLabel: 'リリース詳細を追加する(任意)',\n contactEmailLabel: 'メールアドレス',\n contactEmailPlaceholder: 'you@company.com',\n contactNameLabel: 'お名前',\n contactNamePlaceholder: '任意',\n xHandleLabel: 'Xハンドル',\n xHandlePlaceholder: '@yourhandle(任意)',\n appUrlLabel: 'アプリ名 / URL',\n appUrlPlaceholder: 'https://apps.apple.com/... または https://play.google.com/...',\n reviewModeLabel: '返信方法',\n reviewModeOptions: [\n { value: 'async_email', label: 'メールで async review' },\n { value: 'live_call', label: '15分の live call' },\n ],\n releaseTimelineLabel: 'リリース予定',\n releaseTimelineOptions: [\n { value: 'this_week', label: '今週' },\n { value: 'this_month', label: '今月' },\n { value: 'next_quarter', label: '来四半期以降' },\n ],\n platformLabel: '対象プラットフォーム',\n platformOptions: [\n { value: 'ios', label: 'iOS' },\n { value: 'android', label: 'Android' },\n { value: 'ios_android', label: 'iOS + Android' },\n ],\n scopeLabel: 'まず固めたい範囲',\n scopeOptions: [\n { value: 'iphone_first', label: 'iPhone-first(5枚)' },\n { value: 'matrix', label: '端末 / 言語マトリクス' },\n { value: 'review_fix', label: 'iPad / 審査事故の解消を先に' },\n ],\n workflowLabel: '現在の運用',\n workflowOptions: [\n { value: 'figma', label: 'Figma' },\n { value: 'canva', label: 'Canva' },\n { value: 'ai_manual', label: 'AI / 手動' },\n { value: 'fastlane_ci', label: 'Fastlane / CI' },\n ],\n blockerLabel: '最大の詰まり',\n blockerOptions: [\n { value: 'panel_hook', label: '1枚目の訴求が曖昧' },\n { value: 'naming_order', label: '命名 / 順序が崩れる' },\n { value: 'ipad_review', label: 'iPad / 審査で事故る' },\n { value: 'upload_roots', label: '提出ルート / Fastlane が不安定' },\n ],\n notesLabel: '補足',\n notesPlaceholder: '任意: リリース予定日、今の詰まり、最初の有償成果物に期待することなど。',\n submitCta: 'この内容で依頼する',\n submitLoading: '依頼を送信中...',\n submitSuccess: '依頼を受け付けました。1営業日以内に返信します。',\n submitSuccessNoCopy: '依頼は受け付けました。控えメールは送れませんでしたが、内容は記録済みです。',\n submitError: '直接送信に失敗しました。下のメールまたはX DMを利用してください。',\n subjectLabel: '件名',\n emailDraftLabel: 'メール下書き',\n dmDraftLabel: 'DM下書き',\n copyRequestCta: 'メール文面をコピー',\n copyDmCta: 'DM文面をコピー',\n previewTitle: 'プレビュー',\n notFilled: '未入力',\n supportEmailLabel: 'メール:',\n emailGreeting: 'ShipScreens チーム様',\n emailLead: '有償リリース整備スコープに進むべきか判断したいので、async review か short call を希望します。',\n emailClosing: 'よろしくお願いします。',\n dmLead: 'スクショのリリース整備レビュー依頼',\n },\n },\n};\n\nconst DesignPartner = () => {\n const { i18n } = useTranslation();\n const lang = normalizeLang(i18n.resolvedLanguage || i18n.language);\n const baseCopy = COPY[lang] || COPY.en;\n const [form, setForm] = useState(buildInitialForm);\n const [isCheckoutLoading, setIsCheckoutLoading] = useState(false);\n const [isSubmittingRequest, setIsSubmittingRequest] = useState(false);\n const [submitState, setSubmitState] = useState({ status: 'idle', confirmationSent: true, requestId: '' });\n const intakeStartedRef = useRef(false);\n const quickReadyLoggedRef = useRef(false);\n const attribution = getAttributionParams();\n const requestPrefill =\n typeof window === 'undefined'\n ? { preset: '' }\n : sanitizeDesignPartnerQueryPrefill(new URLSearchParams(window.location.search));\n const requestEntrySource = attribution.entry_source || 'design_partner_direct';\n const isAgentStarterRequestEntry = isAgentStarterRequestEntrySource(requestEntrySource);\n const copy = useMemo(() => {\n const override = isAgentStarterRequestEntry ? baseCopy.agentStarterRequest : null;\n if (!override) return baseCopy;\n return {\n ...baseCopy,\n ...override,\n intake: {\n ...baseCopy.intake,\n ...(override.intake || {}),\n },\n };\n }, [baseCopy, isAgentStarterRequestEntry]);\n\n usePageTitle(isAgentStarterRequestEntry ? 'titles.agentStarterRequest' : 'titles.designPartner', {\n defaultValue: copy.title,\n });\n\n const supportEmail = 'support@shimaumaservices.co.jp';\n const requestForm = useMemo(\n () => (form.reviewMode ? form : { ...form, reviewMode: 'async_email' }),\n [form],\n );\n const emailSubjectSuffix = guessAppLabel(form.appUrl);\n const emailSubject = emailSubjectSuffix ? `${copy.mailSubject} - ${emailSubjectSuffix}` : copy.mailSubject;\n const emailBody = buildEmailBody(copy, requestForm);\n const dmBody = buildDmBody(copy, requestForm);\n const previewRows = buildRequestRows(copy, requestForm);\n const mailtoHref = `mailto:${supportEmail}?subject=${encodeURIComponent(emailSubject)}&body=${encodeURIComponent(emailBody)}`;\n const openAppHref = '/app/?sample=5panel&entry_source=design_partner_open_app_header';\n const firstExportHref = '/tools/first-export/?entry_source=design_partner_offer#agent-handoff';\n const agentCliHref = '/tools/agent-cli/?entry_source=design_partner_offer#tell-your-agent';\n const requestLeadId =\n getAttributionLeadId() ||\n requestPrefill.leadId;\n const isDirectBookingEntry = isDirectSalesEntrySource(requestEntrySource);\n const prioritizeRequestReview =\n isAgentStarterRequestEntry || shouldPrioritizeDesignPartnerRequest(requestEntrySource);\n const hasDirectContactPrefill = isDirectBookingEntry && Boolean(form.contactEmail.trim());\n const quickRequestSummary = describeDesignPartnerQuickRequest({ form: requestForm, defaultReviewMode: 'async_email' });\n const requestMeta = useMemo(\n () => buildDesignPartnerRequestMeta(requestForm, { leadId: requestLeadId, defaultReviewMode: 'async_email' }),\n [requestForm, requestLeadId],\n );\n const checkoutEntrySource = buildCheckoutEntrySource(requestEntrySource);\n const pricingTrustHref = buildOfferPricingHref({\n entrySource: requestEntrySource,\n leadId: requestLeadId,\n appUrl: requestForm.appUrl,\n contactEmail: requestForm.contactEmail,\n contactName: requestForm.contactName,\n xHandle: requestForm.xHandle,\n reviewMode: requestForm.reviewMode,\n releaseTimeline: requestForm.releaseTimeline,\n platform: requestForm.platform,\n scope: requestForm.scope,\n workflow: requestForm.workflow,\n blocker: requestForm.blocker,\n });\n const reviewContext = {\n entrySource: requestEntrySource,\n leadId: requestLeadId,\n preset: requestPrefill.preset,\n appUrl: requestForm.appUrl,\n contactEmail: requestForm.contactEmail,\n contactName: requestForm.contactName,\n xHandle: requestForm.xHandle,\n reviewMode: requestForm.reviewMode,\n releaseTimeline: requestForm.releaseTimeline,\n platform: requestForm.platform,\n scope: requestForm.scope,\n workflow: requestForm.workflow,\n blocker: requestForm.blocker,\n };\n const payFirstHref = buildOfferPricingHref({\n offer: 'pay_first',\n entrySource: checkoutEntrySource,\n leadId: requestLeadId,\n appUrl: requestForm.appUrl,\n contactEmail: requestForm.contactEmail,\n contactName: requestForm.contactName,\n xHandle: requestForm.xHandle,\n reviewMode: requestForm.reviewMode,\n releaseTimeline: requestForm.releaseTimeline,\n platform: requestForm.platform,\n scope: requestForm.scope,\n workflow: requestForm.workflow,\n blocker: requestForm.blocker,\n });\n const logoHref = isDirectBookingEntry ? buildDesignPartnerContextHref('/', reviewContext) : '/';\n const proofTrustHref = isDirectBookingEntry ? buildDesignPartnerContextHref('/proof', reviewContext) : '/proof';\n const directCheckoutFallbackHref = payFirstHref;\n const directCheckoutEnabled = !isAgentStarterRequestEntry && hasHardeningOfferCheckout();\n const quickReplyModeValue = getOptionLabel(\n copy.intake.reviewModeOptions,\n quickRequestSummary.reviewMode || 'async_email',\n copy.intake.selectPlaceholder,\n );\n\n useEffect(() => {\n trackEvent('design_partner_view', {\n path: typeof window !== 'undefined' ? window.location.pathname : '/design-partner',\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n agent_starter_request: isAgentStarterRequestEntry ? 'yes' : 'no',\n lead_id: requestLeadId || undefined,\n });\n }, [isAgentStarterRequestEntry, isDirectBookingEntry, requestEntrySource, requestLeadId]);\n\n useEffect(() => {\n if (!hasDirectContactPrefill) {\n quickReadyLoggedRef.current = false;\n return;\n }\n if (quickReadyLoggedRef.current) return;\n quickReadyLoggedRef.current = true;\n trackEvent('design_partner_prefilled_request_ready', {\n entry_source: requestEntrySource,\n sales_entry: 'yes',\n lead_id: requestLeadId || undefined,\n has_app_url: requestForm.appUrl.trim() ? 'yes' : 'no',\n ...requestMeta,\n });\n }, [\n hasDirectContactPrefill,\n requestEntrySource,\n requestLeadId,\n requestForm.appUrl,\n requestForm.contactEmail,\n requestForm.contactName,\n requestForm.reviewMode,\n requestMeta,\n ]);\n\n const handleFieldChange = (field) => (event) => {\n const next = { ...form, [field]: event.target.value };\n\n if (!intakeStartedRef.current) {\n trackEvent('design_partner_intake_started', {\n field,\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n ...buildDesignPartnerRequestMeta(next, { leadId: requestLeadId, defaultReviewMode: 'async_email' }),\n });\n intakeStartedRef.current = true;\n }\n\n setForm(next);\n if (submitState.status !== 'idle') {\n setSubmitState({ status: 'idle', confirmationSent: true, requestId: '' });\n }\n };\n\n const handleDirectRequestSubmit = async (event, { cta = 'submit_request', surface = 'contact_panel' } = {}) => {\n event.preventDefault();\n if (isSubmittingRequest) return;\n\n const payload = buildDesignPartnerRequestPayload({\n form: requestForm,\n attribution,\n entrySource: requestEntrySource,\n leadId: requestLeadId,\n lang,\n sourcePage: 'design_partner',\n pagePath: typeof window !== 'undefined' ? window.location.pathname : '/design-partner/',\n pageUrl: typeof window !== 'undefined' ? window.location.href : '',\n defaultReviewMode: 'async_email',\n });\n\n trackEvent('design_partner_cta_click', {\n cta,\n channel: 'direct_request',\n submit_surface: surface,\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n ...requestMeta,\n });\n\n try {\n setIsSubmittingRequest(true);\n const response = await submitDesignPartnerRequest(payload);\n setSubmitState({\n status: 'success',\n confirmationSent: response?.confirmationSent !== false,\n requestId: response?.requestId || '',\n });\n trackEvent('design_partner_request_submitted', {\n channel: 'direct_request',\n confirmation_sent: response?.confirmationSent === false ? 'no' : 'yes',\n submit_surface: surface,\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n ...requestMeta,\n });\n } catch (err) {\n console.error('Failed to submit design partner request', err);\n setSubmitState({ status: 'error', confirmationSent: false, requestId: '' });\n trackEvent('design_partner_request_failed', {\n channel: 'direct_request',\n submit_surface: surface,\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n ...requestMeta,\n });\n } finally {\n setIsSubmittingRequest(false);\n }\n };\n\n const handleDirectCheckout = async (event) => {\n trackEvent('design_partner_cta_click', {\n cta: isDirectBookingEntry ? 'buy_hardening_sprint_sales_entry' : 'buy_hardening_sprint',\n channel: directCheckoutEnabled ? 'stripe' : 'fallback',\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n ...requestMeta,\n });\n\n if (!directCheckoutEnabled) {\n return;\n }\n\n event.preventDefault();\n if (isCheckoutLoading) return;\n\n try {\n setIsCheckoutLoading(true);\n await startHardeningOfferCheckout({\n email: requestForm.contactEmail,\n entrySource: checkoutEntrySource,\n sourcePage: 'design_partner',\n form: requestForm,\n leadId: requestLeadId,\n });\n } catch (err) {\n console.error('Failed to start direct hardening checkout', err);\n window.location.assign(directCheckoutFallbackHref);\n } finally {\n setIsCheckoutLoading(false);\n }\n };\n\n const advancedFields = (\n <>\n <label className=\"sm:col-span-2 space-y-2\">\n <span className=\"text-xs font-semibold text-slate-300\">{copy.intake.xHandleLabel}</span>\n <input\n type=\"text\"\n value={form.xHandle}\n onChange={handleFieldChange('xHandle')}\n placeholder={copy.intake.xHandlePlaceholder}\n className=\"w-full rounded-xl border border-slate-700 bg-slate-950 px-3 py-2.5 text-sm text-white placeholder:text-slate-500 focus:border-blue-400 focus:outline-hidden\"\n />\n </label>\n\n <FieldSelect\n label={copy.intake.releaseTimelineLabel}\n value={form.releaseTimeline}\n options={copy.intake.releaseTimelineOptions}\n placeholder={copy.intake.selectPlaceholder}\n onChange={handleFieldChange('releaseTimeline')}\n />\n <FieldSelect\n label={copy.intake.platformLabel}\n value={form.platform}\n options={copy.intake.platformOptions}\n placeholder={copy.intake.selectPlaceholder}\n onChange={handleFieldChange('platform')}\n />\n <FieldSelect\n label={copy.intake.scopeLabel}\n value={form.scope}\n options={copy.intake.scopeOptions}\n placeholder={copy.intake.selectPlaceholder}\n onChange={handleFieldChange('scope')}\n />\n <FieldSelect\n label={copy.intake.workflowLabel}\n value={form.workflow}\n options={copy.intake.workflowOptions}\n placeholder={copy.intake.selectPlaceholder}\n onChange={handleFieldChange('workflow')}\n />\n <FieldSelect\n label={copy.intake.blockerLabel}\n value={form.blocker}\n options={copy.intake.blockerOptions}\n placeholder={copy.intake.selectPlaceholder}\n onChange={handleFieldChange('blocker')}\n className=\"sm:col-span-2\"\n />\n <label className=\"sm:col-span-2 space-y-2\">\n <span className=\"text-xs font-semibold text-slate-300\">{copy.intake.notesLabel}</span>\n <textarea\n value={form.notes}\n onChange={handleFieldChange('notes')}\n placeholder={copy.intake.notesPlaceholder}\n rows={4}\n className=\"w-full rounded-xl border border-slate-700 bg-slate-950 px-3 py-2.5 text-sm text-white placeholder:text-slate-500 focus:border-blue-400 focus:outline-hidden\"\n />\n </label>\n </>\n );\n\n const requestReviewSection = (\n <section id=\"request-review\" className=\"max-w-4xl mx-auto bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-5\">\n <div className=\"space-y-2\">\n <h2 className=\"text-xl font-bold text-white\">{copy.ctaTitle}</h2>\n <p className=\"text-sm text-slate-400\">{copy.intake.title}</p>\n </div>\n\n {isDirectBookingEntry ? (\n <div className=\"rounded-2xl border border-blue-400/30 bg-blue-500/10 p-4 space-y-1\">\n <div className=\"text-sm font-bold text-white\">{copy.directEntryTitle}</div>\n <p className=\"text-sm text-blue-100/90\">{copy.directEntryBody}</p>\n {hasDirectContactPrefill ? <p className=\"text-sm text-blue-100/90\">{copy.directEntryPrefillBody}</p> : null}\n </div>\n ) : null}\n\n {hasDirectContactPrefill ? (\n <div className=\"rounded-2xl border border-cyan-400/30 bg-cyan-500/10 p-4 space-y-3\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-bold text-white\">{copy.directEntryQuickTitle}</div>\n <p className=\"text-sm text-cyan-100/90\">{copy.directEntryQuickBody}</p>\n </div>\n <div className=\"grid gap-2 text-xs text-cyan-100/85 sm:grid-cols-3\">\n <div>\n <div className=\"font-semibold text-cyan-50\">{copy.directEntryQuickEmailLabel}</div>\n <div className=\"break-all\">{quickRequestSummary.contactEmail}</div>\n </div>\n {quickRequestSummary.appLabel ? (\n <div>\n <div className=\"font-semibold text-cyan-50\">{copy.directEntryQuickAppLabel}</div>\n <div className=\"break-all\">{quickRequestSummary.appLabel}</div>\n </div>\n ) : null}\n <div>\n <div className=\"font-semibold text-cyan-50\">{copy.directEntryQuickReplyModeLabel}</div>\n <div>{quickReplyModeValue}</div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={(event) =>\n handleDirectRequestSubmit(event, {\n cta: 'submit_prefilled_request',\n surface: 'prefilled_quick_card',\n })\n }\n disabled={isSubmittingRequest}\n className=\"w-full inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl bg-cyan-500 text-slate-950 font-bold hover:bg-cyan-400 disabled:cursor-not-allowed disabled:bg-cyan-500/50 transition\"\n >\n {isSubmittingRequest ? copy.intake.submitLoading : copy.directEntryQuickCta}\n <ArrowRight size={16} />\n </button>\n <div aria-live=\"polite\" className=\"text-xs\">\n {submitState.status === 'success' ? (\n <div className=\"text-emerald-200\">\n {submitState.confirmationSent ? copy.intake.submitSuccess : copy.intake.submitSuccessNoCopy}\n {submitState.requestId ? ` #${submitState.requestId}` : ''}\n </div>\n ) : null}\n {submitState.status === 'error' ? <div className=\"text-rose-200\">{copy.intake.submitError}</div> : null}\n </div>\n </div>\n ) : null}\n\n {isAgentStarterRequestEntry ? (\n <div className=\"rounded-2xl border border-emerald-400/30 bg-emerald-500/10 p-4 space-y-3\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"text-sm font-bold text-white\">{copy.agentStarterPlanTitle}</div>\n <div className=\"text-xs font-semibold tracking-[0.2em] text-emerald-200 uppercase\">\n {copy.agentStarterPlanPrice}\n </div>\n </div>\n <a\n href=\"#request-review\"\n onClick={() =>\n trackEvent('design_partner_cta_click', {\n cta: 'agent_starter_request_focus',\n channel: 'direct_request',\n entry_source: requestEntrySource,\n agent_starter_request: 'yes',\n ...requestMeta,\n })\n }\n className=\"inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl bg-emerald-500 text-white font-bold hover:bg-emerald-600 transition\"\n >\n {copy.agentStarterPlanCta} <ArrowRight size={16} />\n </a>\n </div>\n <p className=\"text-sm text-emerald-50/90\">{copy.agentStarterPlanBody}</p>\n </div>\n ) : (\n <div className=\"rounded-2xl border border-emerald-400/30 bg-emerald-500/10 p-4 space-y-3\">\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"text-sm font-bold text-white\">{copy.buyNowTitle}</div>\n <div className=\"text-xs font-semibold tracking-[0.2em] text-emerald-200 uppercase\">{copy.buyNowPrice}</div>\n </div>\n <a\n href={directCheckoutFallbackHref}\n onClick={handleDirectCheckout}\n className=\"inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl bg-emerald-500 text-white font-bold hover:bg-emerald-600 transition\"\n >\n {isCheckoutLoading ? copy.buyNowLoading : copy.buyNowCta} <ArrowRight size={16} />\n </a>\n </div>\n <p className=\"text-sm text-emerald-50/90\">{copy.buyNowBody}</p>\n </div>\n )}\n\n <div className=\"grid sm:grid-cols-2 gap-3\">\n <label className=\"space-y-2\">\n <span className=\"text-xs font-semibold text-slate-300\">{copy.intake.contactEmailLabel}</span>\n <input\n type=\"email\"\n value={form.contactEmail}\n onChange={handleFieldChange('contactEmail')}\n placeholder={copy.intake.contactEmailPlaceholder}\n className=\"w-full rounded-xl border border-slate-700 bg-slate-950 px-3 py-2.5 text-sm text-white placeholder:text-slate-500 focus:border-blue-400 focus:outline-hidden\"\n />\n </label>\n <label className=\"space-y-2\">\n <span className=\"text-xs font-semibold text-slate-300\">{copy.intake.contactNameLabel}</span>\n <input\n type=\"text\"\n value={form.contactName}\n onChange={handleFieldChange('contactName')}\n placeholder={copy.intake.contactNamePlaceholder}\n className=\"w-full rounded-xl border border-slate-700 bg-slate-950 px-3 py-2.5 text-sm text-white placeholder:text-slate-500 focus:border-blue-400 focus:outline-hidden\"\n />\n </label>\n <label className=\"sm:col-span-2 space-y-2\">\n <span className=\"text-xs font-semibold text-slate-300\">{copy.intake.appUrlLabel}</span>\n <input\n type=\"text\"\n value={form.appUrl}\n onChange={handleFieldChange('appUrl')}\n placeholder={copy.intake.appUrlPlaceholder}\n className=\"w-full rounded-xl border border-slate-700 bg-slate-950 px-3 py-2.5 text-sm text-white placeholder:text-slate-500 focus:border-blue-400 focus:outline-hidden\"\n />\n </label>\n <FieldSelect\n label={copy.intake.reviewModeLabel}\n value={requestForm.reviewMode}\n options={copy.intake.reviewModeOptions}\n placeholder={copy.intake.selectPlaceholder}\n onChange={handleFieldChange('reviewMode')}\n />\n {!isDirectBookingEntry ? advancedFields : null}\n </div>\n\n <div className=\"grid lg:grid-cols-[1.05fr_0.95fr] gap-4\">\n <div className=\"space-y-3\">\n <div className=\"rounded-2xl border border-blue-400/30 bg-blue-500/10 p-4 space-y-3\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-bold text-white\">{copy.intake.contactTitle}</div>\n <p className=\"text-xs text-blue-100/90\">\n {isDirectBookingEntry ? copy.intake.contactHintSalesEntry : copy.intake.contactHint}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={(event) => handleDirectRequestSubmit(event, { cta: 'submit_request', surface: 'contact_panel' })}\n disabled={isSubmittingRequest || !form.contactEmail.trim()}\n className=\"w-full 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 disabled:cursor-not-allowed disabled:bg-blue-500/50 transition\"\n >\n {isSubmittingRequest ? copy.intake.submitLoading : copy.intake.submitCta}\n <ArrowRight size={16} />\n </button>\n <div aria-live=\"polite\" className=\"text-xs\">\n {submitState.status === 'success' ? (\n <div className=\"text-emerald-200\">\n {submitState.confirmationSent ? copy.intake.submitSuccess : copy.intake.submitSuccessNoCopy}\n {submitState.requestId ? ` #${submitState.requestId}` : ''}\n </div>\n ) : null}\n {submitState.status === 'error' ? <div className=\"text-rose-200\">{copy.intake.submitError}</div> : null}\n </div>\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <a\n href={mailtoHref}\n onClick={(event) =>\n trackEventAndFollowLink(event, 'design_partner_cta_click', {\n cta: 'email_apply',\n channel: 'email',\n ...requestMeta,\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.emailCta} <ArrowRight size={16} />\n </a>\n <a\n href=\"https://x.com/shipscreenscom\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(event) =>\n trackEventAndFollowLink(event, 'design_partner_cta_click', {\n cta: 'dm_apply',\n channel: 'x_dm',\n ...requestMeta,\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 hover:bg-slate-900 transition\"\n >\n {copy.dmCta}\n </a>\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <CopyButton\n value={emailBody}\n onCopied={() =>\n trackEvent('design_partner_cta_click', {\n cta: 'copy_apply',\n channel: 'copy',\n ...requestMeta,\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 hover:bg-slate-900 transition text-sm font-semibold\"\n >\n <ClipboardCopy size={16} />\n {copy.intake.copyRequestCta}\n </CopyButton>\n <CopyButton\n value={dmBody}\n onCopied={() =>\n trackEvent('design_partner_cta_click', {\n cta: 'copy_dm_apply',\n channel: 'x_dm',\n ...requestMeta,\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 hover:bg-slate-900 transition text-sm font-semibold\"\n >\n <ClipboardCopy size={16} />\n {copy.intake.copyDmCta}\n </CopyButton>\n </div>\n\n <p className=\"text-xs text-slate-500\">{copy.intake.hint}</p>\n <div className=\"text-xs text-slate-500\">\n {copy.intake.supportEmailLabel}{' '}\n <a href={`mailto:${supportEmail}`} className=\"underline underline-offset-4 hover:text-white\">\n {supportEmail}\n </a>\n </div>\n\n {isDirectBookingEntry ? (\n <details className=\"rounded-2xl border border-slate-800 bg-slate-950/70 p-4\">\n <summary className=\"cursor-pointer text-sm font-semibold text-slate-200\">\n {copy.intake.advancedFieldsLabel}\n </summary>\n <div className=\"mt-4 grid sm:grid-cols-2 gap-3\">{advancedFields}</div>\n </details>\n ) : null}\n </div>\n\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950/70 p-4 space-y-3\">\n <div className=\"text-sm font-bold text-white\">{copy.intake.previewTitle}</div>\n <div className=\"space-y-1 text-xs\">\n <div className=\"text-slate-500\">{copy.intake.subjectLabel}</div>\n <div className=\"text-slate-200 break-all\">{emailSubject}</div>\n </div>\n <div className=\"space-y-2\">\n {previewRows.map(([label, value]) => (\n <div key={label} className=\"flex items-start justify-between gap-4 text-xs border-t border-slate-800 pt-2 first:border-t-0 first:pt-0\">\n <span className=\"text-slate-500\">{label}</span>\n <span className=\"text-right text-slate-200\">{value}</span>\n </div>\n ))}\n </div>\n <div className=\"space-y-2 border-t border-slate-800 pt-2\">\n <PreviewRow label={copy.intake.contactEmailLabel} value={form.contactEmail || copy.intake.notFilled} />\n <PreviewRow label={copy.intake.contactNameLabel} value={form.contactName || copy.intake.notFilled} />\n <PreviewRow label={copy.intake.xHandleLabel} value={form.xHandle || copy.intake.notFilled} />\n </div>\n {form.notes.trim() ? (\n <div className=\"space-y-1\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-500\">{copy.intake.notesLabel}</div>\n <pre className=\"text-xs text-slate-200 whitespace-pre-wrap leading-relaxed\">{form.notes}</pre>\n </div>\n ) : null}\n <div className=\"space-y-1\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-500\">{copy.intake.emailDraftLabel}</div>\n <pre className=\"text-xs text-slate-200 whitespace-pre-wrap leading-relaxed\">{emailBody}</pre>\n </div>\n <div className=\"space-y-1\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-500\">{copy.intake.dmDraftLabel}</div>\n <pre className=\"text-xs text-slate-200 whitespace-pre-wrap leading-relaxed\">{dmBody}</pre>\n </div>\n </div>\n </div>\n\n {!isDirectBookingEntry ? (\n <div className=\"flex flex-wrap gap-3 text-sm\">\n <a\n href={firstExportHref}\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_first_export' })}\n className=\"text-blue-200 hover:text-blue-100 underline underline-offset-4\"\n >\n {copy.firstExportCta}\n </a>\n <a\n href={agentCliHref}\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_agent_cli' })}\n className=\"text-blue-200 hover:text-blue-100 underline underline-offset-4\"\n >\n {copy.agentCliCta}\n </a>\n <a\n href={payFirstHref}\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_pay_first' })}\n className=\"text-blue-200 hover:text-blue-100 underline underline-offset-4\"\n >\n {copy.payFirstCta}\n </a>\n </div>\n ) : null}\n </section>\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 logoHref={logoHref}\n pricingHref={pricingTrustHref}\n openAppHref={openAppHref}\n onToolsClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_tools_header' })}\n onPricingClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_pricing_header' })}\n onOpenAppClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_app_header' })}\n primaryCta={{\n href: prioritizeRequestReview ? '#request-review' : agentCliHref,\n label: prioritizeRequestReview ? copy.intake.submitCta : copy.agentCliCta,\n onClick: (event) =>\n trackEventAndFollowLink(event, 'design_partner_cta_click', {\n cta: prioritizeRequestReview ? 'jump_request_header' : 'open_agent_cli_header',\n entry_source: requestEntrySource,\n sales_entry: isDirectBookingEntry ? 'yes' : 'no',\n agent_starter_request: isAgentStarterRequestEntry ? 'yes' : 'no',\n lead_id: requestLeadId || undefined,\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 <Users 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\">{copy.subtitle}</p>\n <p className=\"text-xs text-slate-500\">{copy.note}</p>\n </section>\n\n {prioritizeRequestReview ? requestReviewSection : null}\n\n <section className=\"max-w-3xl mx-auto bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3\">\n <div className=\"text-lg font-bold text-white\">{copy.fitTitle}</div>\n <ul className=\"space-y-2 text-sm text-slate-300\">\n {copy.fitBullets.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <CheckCircle2 size={16} className=\"mt-0.5 text-green-400 shrink-0\" />\n <span>{item}</span>\n </li>\n ))}\n </ul>\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-3\">\n <div className=\"text-lg font-bold text-white\">{copy.scopeTitle}</div>\n <ul className=\"space-y-2 text-sm text-slate-300\">\n {copy.scopeBullets.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <CheckCircle2 size={16} className=\"mt-0.5 text-green-400 shrink-0\" />\n <span>{item}</span>\n </li>\n ))}\n </ul>\n <p className=\"text-xs text-slate-500\">{copy.scopeNote}</p>\n </section>\n\n <section className=\"max-w-5xl mx-auto space-y-4\">\n <div className=\"text-xl font-bold text-center\">{copy.processTitle}</div>\n <div className=\"grid md:grid-cols-3 gap-4\">\n {copy.process.map((item) => (\n <div key={item.title} className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-5 space-y-2\">\n <div className=\"inline-flex items-center gap-2 text-xs font-semibold text-blue-200\">\n <Clock3 size={14} />\n async / 15 min\n </div>\n <div className=\"text-sm font-bold text-white\">{item.title}</div>\n <p className=\"text-sm text-slate-300 leading-relaxed\">{item.body}</p>\n </div>\n ))}\n </div>\n </section>\n\n {prioritizeRequestReview ? null : requestReviewSection}\n\n <section className=\"max-w-3xl mx-auto bg-slate-900/50 border border-slate-800 rounded-2xl p-6 space-y-3\">\n <div className=\"inline-flex items-center gap-2 text-sm font-semibold text-slate-200\">\n <ShieldCheck size={16} className=\"text-blue-300\" />\n {copy.trustTitle}\n </div>\n <div className=\"flex flex-wrap gap-3 text-xs text-slate-300\">\n <a\n href={pricingTrustHref}\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_pricing' })}\n className=\"hover:text-white underline underline-offset-4\"\n >\n {copy.trustLinks.pricing}\n </a>\n <a\n href={proofTrustHref}\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_proof' })}\n className=\"hover:text-white underline underline-offset-4\"\n >\n {copy.trustLinks.proof}\n </a>\n <a\n href=\"/security\"\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_security' })}\n className=\"hover:text-white underline underline-offset-4\"\n >\n {copy.trustLinks.security}\n </a>\n <a\n href=\"/terms\"\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_terms' })}\n className=\"hover:text-white underline underline-offset-4\"\n >\n {copy.trustLinks.terms}\n </a>\n <a\n href=\"/privacy\"\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_privacy' })}\n className=\"hover:text-white underline underline-offset-4\"\n >\n {copy.trustLinks.privacy}\n </a>\n <a\n href=\"/legal\"\n onClick={(event) => trackEventAndFollowLink(event, 'design_partner_cta_click', { cta: 'open_legal' })}\n className=\"hover:text-white underline underline-offset-4\"\n >\n {copy.trustLinks.legal}\n </a>\n </div>\n </section>\n </main>\n </div>\n );\n};\n\nconst FieldSelect = ({ label, value, options, placeholder, onChange, className = '' }) => (\n <label className={`space-y-2 ${className}`.trim()}>\n <span className=\"text-xs font-semibold text-slate-300\">{label}</span>\n <select\n value={value}\n onChange={onChange}\n className=\"w-full rounded-xl border border-slate-700 bg-slate-950 px-3 py-2.5 text-sm text-white focus:border-blue-400 focus:outline-hidden\"\n >\n <option value=\"\">{placeholder}</option>\n {(options || []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n);\n\nconst PreviewRow = ({ label, value }) => (\n <div className=\"flex items-start justify-between gap-4 text-xs\">\n <span className=\"text-slate-500\">{label}</span>\n <span className=\"text-right text-slate-200\">{value}</span>\n </div>\n);\n\nexport default DesignPartner;\n"],"x_google_ignoreList":[0],"mappings":"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CE,iVACF,SAAU,WACV,WAAY,CACV,yFACA,iDACA,wGACA,oHACF,EACA,aAAc,oBACd,QAAS,CACP,CACE,MAAO,+BACP,KAAM,gKACR,EACA,CACE,MAAO,6BACP,KAAM,mKACR,EACA,CACE,MAAO,wCACP,KAAM,uGACR,CACF,EACA,WAAY,6CACZ,aAAc,CACZ,oFACA,oFACA,+EACA,wGACF,EACA,UAAW,6HACX,WAAY,cACZ,WAAY,CACV,QAAS,UACT,MAAO,QACP,SAAU,WACV,MAAO,QACP,QAAS,UACT,MAAO,eACT,EACA,SAAU,mBACV,YAAa,6BACb,YAAa,+BACb,WACE,gHACF,UAAW,sBACX,cAAe,sBACf,SAAU,iBACV,MAAO,UACP,eAAgB,sCAChB,YAAa,6BACb,YAAa,6CACb,KAAM,+FACN,YAAa,qBACb,iBAAkB,4CAClB,gBACE,mNACF,uBACE,iKACF,sBAAuB,iCACvB,qBACE,gNACF,2BAA4B,aAC5B,yBAA0B,YAC1B,+BAAgC,aAChC,oBAAqB,6BACrB,oBAAqB,CACnB,MAAO,wBACP,MAAO,8DACP,SACE,+OACF,SAAU,6BACV,WAAY,CACV,qFACA,wGACA,gHACA,iDACF,EACA,aAAc,gCACd,QAAS,CACP,CACE,MAAO,yBACP,KAAM,iHACR,EACA,CACE,MAAO,sBACP,KAAM,+GACR,EACA,CACE,MAAO,4BACP,KAAM,6HACR,CACF,EACA,WAAY,yBACZ,aAAc,CACZ,oFACA,2GACA,8EACA,0FACF,EACA,UACE,sIACF,SAAU,2BACV,KAAM,yFACN,YAAa,oCACb,sBAAuB,uBACvB,sBAAuB,iCACvB,qBACE,uIACF,oBAAqB,2BACrB,OAAQ,CACN,MAAO,sCACP,aAAc,oCACd,YAAa,gFACb,iBACE,+GACF,UAAW,0BACX,UACE,6GACF,OAAQ,mCACV,CACF,EACA,OAAQ,CACN,MAAO,oCACP,KAAM,wFACN,kBAAmB,SACnB,aAAc,4BACd,YAAa,qFACb,sBACE,4IACF,oBAAqB,iCACrB,kBAAmB,aACnB,wBAAyB,kBACzB,iBAAkB,OAClB,uBAAwB,WACxB,aAAc,WACd,mBAAoB,yBACpB,YAAa,YACb,kBAAmB,4DACnB,gBAAiB,aACjB,kBAAmB,CACjB,CAAE,MAAO,cAAe,MAAO,oBAAqB,EACpD,CAAE,MAAO,YAAa,MAAO,kBAAmB,CAClD,EACA,qBAAsB,mBACtB,uBAAwB,CACtB,CAAE,MAAO,YAAa,MAAO,WAAY,EACzC,CAAE,MAAO,aAAc,MAAO,YAAa,EAC3C,CAAE,MAAO,eAAgB,MAAO,eAAgB,CAClD,EACA,cAAe,WACf,gBAAiB,CACf,CAAE,MAAO,MAAO,MAAO,KAAM,EAC7B,CAAE,MAAO,UAAW,MAAO,SAAU,EACrC,CAAE,MAAO,cAAe,MAAO,eAAgB,CACjD,EACA,WAAY,QACZ,aAAc,CACZ,CAAE,MAAO,eAAgB,MAAO,yBAA0B,EAC1D,CAAE,MAAO,SAAU,MAAO,wBAAyB,EACnD,CAAE,MAAO,aAAc,MAAO,yBAA0B,CAC1D,EACA,cAAe,mBACf,gBAAiB,CACf,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,QAAS,MAAO,OAAQ,EACjC,CAAE,MAAO,YAAa,MAAO,aAAc,EAC3C,CAAE,MAAO,cAAe,MAAO,eAAgB,CACjD,EACA,aAAc,kBACd,eAAgB,CACd,CAAE,MAAO,aAAc,MAAO,yBAA0B,EACxD,CAAE,MAAO,eAAgB,MAAO,sBAAuB,EACvD,CAAE,MAAO,cAAe,MAAO,yBAA0B,EACzD,CAAE,MAAO,eAAgB,MAAO,yBAA0B,CAC5D,EACA,WAAY,UACZ,iBAAkB,0FAClB,UAAW,wBACX,cAAe,qBACf,cAAe,qDACf,oBAAqB,qFACrB,YAAa,8DACb,aAAc,UACd,gBAAiB,cACjB,aAAc,UACd,eAAgB,mBAChB,UAAW,eACX,aAAc,UACd,UAAW,iBACX,kBAAmB,SACnB,cAAe,uBACf,UAAW,6FACX,aAAc,UACd,OAAQ,qCACV,CACF,EACA,GAAI,CACF,MAAO,eACP,MAAO,oDACP,SACE,oJACF,SAAU,WACV,WAAY,CACV,mCACA,0BACA,qCACA,gDACF,EACA,aAAc,UACd,QAAS,CACP,CACE,MAAO,cACP,KAAM,8EACR,EACA,CACE,MAAO,mBACP,KAAM,0EACR,EACA,CACE,MAAO,yBACP,KAAM,0CACR,CACF,EACA,WAAY,gBACZ,aAAc,CACZ,0DACA,0DACA,6BACA,wDACF,EACA,UAAW,oDACX,WAAY,QACZ,WAAY,CACV,QAAS,KACT,MAAO,KACP,SAAU,SACV,MAAO,OACP,QAAS,SACT,MAAO,OACT,EACA,SAAU,YACV,YAAa,kBACb,YAAa,+BACb,WACE,sDACF,UAAW,aACX,cAAe,eACf,SAAU,SACV,MAAO,OACP,eAAgB,mBAChB,YAAa,sBACb,YAAa,2BACb,KAAM,yDACN,YAAa,kBACb,iBAAkB,qBAClB,gBACE,kHACF,uBACE,2DACF,sBAAuB,cACvB,qBACE,0GACF,2BAA4B,UAC5B,yBAA0B,aAC1B,+BAAgC,OAChC,oBAAqB,eACrB,oBAAqB,CACnB,MAAO,mBACP,MAAO,+CACP,SACE,sIACF,SAAU,0BACV,WAAY,CACV,qDACA,0CACA,gDACA,sCACF,EACA,aAAc,sBACd,QAAS,CACP,CACE,MAAO,eACP,KAAM,uDACR,EACA,CACE,MAAO,iBACP,KAAM,uDACR,EACA,CACE,MAAO,uBACP,KAAM,wFACR,CACF,EACA,WAAY,uBACZ,aAAc,CACZ,mEACA,yFACA,2CACA,gEACF,EACA,UACE,0GACF,SAAU,yBACV,KAAM,0CACN,YAAa,+BACb,sBAAuB,eACvB,sBAAuB,uBACvB,qBACE,yFACF,oBAAqB,mBACrB,OAAQ,CACN,MAAO,2BACP,aAAc,kBACd,YAAa,mCACb,iBACE,+CACF,UAAW,mBACX,UACE,+EACF,OAAQ,8BACV,CACF,EACA,OAAQ,CACN,MAAO,cACP,KAAM,2CACN,kBAAmB,WACnB,aAAc,aACd,YAAa,kCACb,sBACE,2DACF,oBAAqB,kBACrB,kBAAmB,UACnB,wBAAyB,kBACzB,iBAAkB,MAClB,uBAAwB,KACxB,aAAc,QACd,mBAAoB,kBACpB,YAAa,aACb,kBAAmB,6DACnB,gBAAiB,OACjB,kBAAmB,CACjB,CAAE,MAAO,cAAe,MAAO,mBAAoB,EACnD,CAAE,MAAO,YAAa,MAAO,g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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,l as r,n as i,r as a,x as o}from"./index-D7D6ZRCW.js";import{n as s,r as c,s as l}from"./LanguageSwitcher-hFv9zl1u.js";import{n as u}from"./circle-check-X08qqy40.js";import{t as d}from"./chevron-down-BIXHKpnf.js";import{t as f}from"./CopyButton-BFCx6EPg.js";import{t as p}from"./copy-KD-LYJ0z.js";import{t as m}from"./folder-tree-raVH0Y5V.js";import{t as h}from"./SiteHeader-CJqQ0pL3.js";import{n as g,t as _}from"./StickyMobileCta-REC3DROG.js";import{t as v}from"./FitPanel-B1J0V1jK.js";import{t as y}from"./AgentHandoffPanel-Bf_AJepG.js";import{t as b}from"./ToolGuardrailsPanel-Cclxwdrb.js";var x=l(`mail`,[[`path`,{d:`m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7`,key:`132q7q`}],[`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`,key:`izxlao`}]]),S=e(t(),1),C=n(),w=e=>(e||``).split(`-`)[0]===`ja`?`ja`:`en`,T={en:{badge:`Fastlane cheat sheet`,title:`Fastlane screenshot folder structure`,subtitle:`Keep Figma, Fastlane, and your current capture flow. Add the deterministic release step Fastlane does not give you: copy/paste the deliver + supply paths, lock outcome-first panel order, and stop path/order drift before upload.`,primaryCta:`Use your agent for the Fastlane workflow`,secondaryCta:`Open sample project (free)`,agentPromptTitle:`Give your agent this prompt`,agentPromptBody:`Use this when Fastlane paths, naming, or upload roots keep drifting release to release.`,agentPrompt:`Use ShipScreens as the build step for our Fastlane screenshot release step. Keep our current Figma/Fastlane/manual workflow, inspect this repo, choose the best path for this workspace (workspace-local MCP if available, otherwise pure CLI), produce deterministic deliver + supply-safe roots, lock 01..05 naming and panel order, run verify/stage before upload, and return the report with output paths, warnings, and next steps. Only ask me if device or locale scope or panel #1 messaging is unclear.`,agentPromptNote:`Recommended: tell your coding agent once, then keep Fastlane as the upload lane.`,heroCliTitle:`CLI quickstart (2 steps)`,heroCliNote:`wizard -> agent-run (raw mode, no Playwright).`,heroCliSummary:`Outputs: fastlane/ + reproducible ZIP + staged upload root + proof report.`,heroCliCopyLabel:`Copy all commands`,heroCliTemplatesLabel:`Starter templates`,heroCliConfigLabel:`config.yml`,heroCliCsvLabel:`copy.csv`,heroCliCmd:[`npx --yes shipscreens wizard`,`npx --yes shipscreens agent-run --mode raw --zip --out out/fastlane --stage`].join(`
|
|
2
|
+
`),proUnlockTitle:`Unlock Pro (CLI)`,proUnlockBody:`Remove the watermark and unlock full matrix batch exports via CLI auth:`,proUnlockCmd:`npx --yes shipscreens auth login`,proUnlockNote:`Completes a one-time browser sign-in; then rerun agent-run with --require-pro.`,trustNote:`Privacy-first: exports run locally (browser/CI). No uploads to ShipScreens.`,structureTitle:`Expected paths (deliver + supply)`,structureBody:`Most Fastlane failures come from path/numbering drift, not design quality. Keep this structure consistent per locale and device/bucket while preserving your own visual style. For panel #1, run a clarity check: if the line could fit many apps, rewrite it with one concrete outcome.`,structureCode:`fastlane/
|
|
3
|
+
screenshots/ # iOS (deliver)
|
|
4
|
+
en-US/
|
|
5
|
+
iphone69_01.png
|
|
6
|
+
iphone69_02.png
|
|
7
|
+
metadata/
|
|
8
|
+
android/ # Android (supply)
|
|
9
|
+
en-US/
|
|
10
|
+
images/
|
|
11
|
+
phoneScreenshots/
|
|
12
|
+
01.png
|
|
13
|
+
02.png
|
|
14
|
+
|
|
15
|
+
fastlane_assets.zip # reproducible artifact (optional)`,namingTitle:`Deterministic naming contract (copy/paste)`,namingBody:`Use one naming schema across reruns so panel order, locale, and device stay machine-checkable release after release.`,namingCode:`1) {platform}/{locale}/{device}/{slot}.png
|
|
16
|
+
2) platform: ios | android
|
|
17
|
+
3) locale: en-US, ja-JP
|
|
18
|
+
4) device: iphone67, iphone65, ipad13 (or Android bucket token)
|
|
19
|
+
5) slot: 01..05`,yamlMiniTitle:`Minimal YAML (single lane)`,yamlMiniBody:`Start with one lane, prove reruns, then expand matrix size.`,yamlMiniCode:`platform: ios
|
|
20
|
+
locale: en-US
|
|
21
|
+
device: iphone67
|
|
22
|
+
slots: [01, 02, 03, 04, 05]
|
|
23
|
+
path: "{platform}/{locale}/{device}/{slot}.png"`,yamlMatrixTitle:`Full matrix YAML (iOS + Android)`,yamlMatrixBody:`Use this when you need both stores with stable slot numbering.`,yamlMatrixCode:`platforms: [ios, android]
|
|
24
|
+
locales: [en-US, ja-JP]
|
|
25
|
+
ios: [iphone67, iphone65, ipad13]
|
|
26
|
+
android: [phoneScreenshots, sevenInchScreenshots, tenInchScreenshots]
|
|
27
|
+
slots: [01, 02, 03, 04, 05]
|
|
28
|
+
path: "{platform}/{locale}/{device}/{slot}.png"`,folderTreeTitle:`Folder tree template`,folderTreeBody:`Keep this tree stable and reruns usually become edits instead of firefights.`,folderTreeCode:`ios/
|
|
29
|
+
en-US/
|
|
30
|
+
iphone67/01.png ... 05.png
|
|
31
|
+
iphone65/01.png ... 05.png
|
|
32
|
+
ipad13/01.png ... 05.png
|
|
33
|
+
ja-JP/
|
|
34
|
+
iphone67/01.png ... 05.png
|
|
35
|
+
android/
|
|
36
|
+
en-US/
|
|
37
|
+
phoneScreenshots/01.png ... 05.png
|
|
38
|
+
sevenInchScreenshots/01.png ... 05.png
|
|
39
|
+
tenInchScreenshots/01.png ... 05.png`,bucketsTitle:`Android buckets (supply)`,bucketsBody:`ShipScreens supports these upload buckets (use what matches your device set): phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, tvScreenshots, wearScreenshots.`,localTitle:`Local quickstart (no browser)`,localBody:`Run shipscreens wizard (step-by-step), swap PNGs, then let agent-run build, verify, stage, and report before upload.`,localCode:`npx --yes shipscreens wizard
|
|
40
|
+
# replace assets/en-US/01.png..05.png
|
|
41
|
+
npx --yes shipscreens agent-run --mode raw --zip --out out/fastlane --stage --profile appstore`,pipelineTitle:`Recommended CI pipeline (copy/paste)`,pipelineBody:`Validate, lock, then agent-run build/verify/stage/report so each release reruns safely. Rendered mode uses Playwright Chromium.`,pipelineCode:`npm ci
|
|
42
|
+
npx playwright install --with-deps chromium
|
|
43
|
+
npm run shipscreens:validate
|
|
44
|
+
npm run shipscreens:lock -- --check
|
|
45
|
+
npm run shipscreens -- agent-run --mode rendered --zip --out out/fastlane --stage --profile appstore --json`,partnerTitle:`Need help getting your first export?`,partnerBody:`We do short 15-min workflow reviews and map your current setup to an upload-ready export with clearer screenshot positioning.`,partnerEmailCta:`Email us`,partnerDmCta:`DM on X`},ja:{badge:`Fastlane チートシート`,title:`Fastlane 用スクショのフォルダ構成`,subtitle:`Figma、Fastlane、今の素材取りはそのまま。Fastlane だけでは止めにくい提出事故を防ぐ決定論的なリリース工程を足します。deliver / supply が期待するパスを固定し、成果訴求順を保った再現性出力にします。`,primaryCta:`AIエージェントで Fastlane のリリース工程を固める`,secondaryCta:`サンプルを開く(無料)`,agentPromptTitle:`coding agent に渡すプロンプト`,agentPromptBody:`Fastlane のパス、命名、upload root が毎回揺れるときは、手で直すより先にこれを渡します。`,agentPrompt:`ShipScreens を使って、Fastlane 用スクリーンショットのリリース工程を固めてください。今の Figma/Fastlane/手動フローは維持し、この repo を確認して、このプロジェクトで MCP が使えるならそれを、無ければ CLI を選び、deliver/supply-safe な root、01..05 命名、訴求順、提出前チェック(verify と stage)まで整えて、出力パス・警告・次の作業を短く報告してください。端末/言語スコープか 1枚目訴求が不明なときだけ確認してください。`,agentPromptNote:`おすすめは、1回指示して Fastlane の upload lane を安定化させることです。`,heroCliTitle:`CLIクイックスタート(2ステップ)`,heroCliNote:`wizard -> agent-run(raw / Playwright不要)。`,heroCliSummary:`出力: fastlane/ + 再現性ZIP + staged upload root + proof report。`,heroCliCopyLabel:`コマンドをすべてコピー`,heroCliTemplatesLabel:`スターター雛形`,heroCliConfigLabel:`config.yml`,heroCliCsvLabel:`copy.csv`,heroCliCmd:[`npx --yes shipscreens wizard`,`npx --yes shipscreens agent-run --mode raw --zip --out out/fastlane --stage`].join(`
|
|
46
|
+
`),proUnlockTitle:`Proを解除(CLI)`,proUnlockBody:`透かし解除&フル一括(端末×言語)のために、まずはCLI認証を実行:`,proUnlockCmd:`npx --yes shipscreens auth login`,proUnlockNote:`初回のみブラウザでサインインします。以後は --require-pro で再実行。`,trustNote:`プライバシー: 出力はローカル(ブラウザ/CI)。ShipScreensへアップロード不要。`,structureTitle:`期待されるパス(deliver + supply)`,structureBody:`Fastlaneの失敗原因はデザインよりパス/連番ドリフトが多いです。見た目は維持したまま、言語/端末(バケット)単位でこの形に揃えます。1枚目は「他の多くのアプリにも当てはまる文言なら、成果を具体化して書き直す」を確認します。`,structureCode:`fastlane/
|
|
47
|
+
screenshots/ # iOS (deliver)
|
|
48
|
+
en-US/
|
|
49
|
+
iphone69_01.png
|
|
50
|
+
iphone69_02.png
|
|
51
|
+
metadata/
|
|
52
|
+
android/ # Android (supply)
|
|
53
|
+
en-US/
|
|
54
|
+
images/
|
|
55
|
+
phoneScreenshots/
|
|
56
|
+
01.png
|
|
57
|
+
02.png
|
|
58
|
+
|
|
59
|
+
fastlane_assets.zip # 再現性のあるZIP(任意)`,namingTitle:`命名契約(コピペ)`,namingBody:`この命名ルールを固定すると、毎リリースで順序崩れを防ぎやすくなります。`,namingCode:`1) {platform}/{locale}/{device}/{slot}.png
|
|
60
|
+
2) platform: ios | android
|
|
61
|
+
3) locale: en-US, ja-JP
|
|
62
|
+
4) device: iphone67, iphone65, ipad13(またはAndroid bucket)
|
|
63
|
+
5) slot: 01..05`,yamlMiniTitle:`最小YAML(単一路線)`,yamlMiniBody:`まず1レーンで再実行を固定し、その後に行列を広げます。`,yamlMiniCode:`platform: ios
|
|
64
|
+
locale: en-US
|
|
65
|
+
device: iphone67
|
|
66
|
+
slots: [01, 02, 03, 04, 05]
|
|
67
|
+
path: "{platform}/{locale}/{device}/{slot}.png"`,yamlMatrixTitle:`フル行列YAML(iOS + Android)`,yamlMatrixBody:`両ストア運用で連番を固定したい場合のテンプレです。`,yamlMatrixCode:`platforms: [ios, android]
|
|
68
|
+
locales: [en-US, ja-JP]
|
|
69
|
+
ios: [iphone67, iphone65, ipad13]
|
|
70
|
+
android: [phoneScreenshots, sevenInchScreenshots, tenInchScreenshots]
|
|
71
|
+
slots: [01, 02, 03, 04, 05]
|
|
72
|
+
path: "{platform}/{locale}/{device}/{slot}.png"`,folderTreeTitle:`フォルダツリー雛形`,folderTreeBody:`この木構造を固定すると、毎回の再実行が「修正のみ」になりやすいです。`,folderTreeCode:`ios/
|
|
73
|
+
en-US/
|
|
74
|
+
iphone67/01.png ... 05.png
|
|
75
|
+
iphone65/01.png ... 05.png
|
|
76
|
+
ipad13/01.png ... 05.png
|
|
77
|
+
ja-JP/
|
|
78
|
+
iphone67/01.png ... 05.png
|
|
79
|
+
android/
|
|
80
|
+
en-US/
|
|
81
|
+
phoneScreenshots/01.png ... 05.png
|
|
82
|
+
sevenInchScreenshots/01.png ... 05.png
|
|
83
|
+
tenInchScreenshots/01.png ... 05.png`,bucketsTitle:`Android buckets(supply)`,bucketsBody:`対応バケット: phoneScreenshots / sevenInchScreenshots / tenInchScreenshots / tvScreenshots / wearScreenshots`,localTitle:`ローカル最短(ブラウザ不要)`,localBody:`shipscreens wizard(ステップ式)で雛形作成後、agent-run で build / verify / stage / report まで実行。`,localCode:`npx --yes shipscreens wizard
|
|
84
|
+
# assets/en-US/01.png〜05.png を差し替え
|
|
85
|
+
npx --yes shipscreens agent-run --mode raw --zip --out out/fastlane --stage --profile appstore`,pipelineTitle:`CIパイプライン(コピペ)`,pipelineBody:`validate / lock の後に agent-run で build / verify / stage / report を回し、毎リリースを安全に再実行します(rendered mode)。`,pipelineCode:`npm ci
|
|
86
|
+
npx playwright install --with-deps chromium
|
|
87
|
+
npm run shipscreens:validate
|
|
88
|
+
npm run shipscreens:lock -- --check
|
|
89
|
+
npm run shipscreens -- agent-run --mode rendered --zip --out out/fastlane --stage --profile appstore --json`,partnerTitle:`初回エクスポートが詰まったら`,partnerBody:`15分だけ現状を聞かせてください。既存運用は変えずに、アップロードしやすいリリース工程と訴求改善のどこを先に固めるべきかを返します。`,partnerEmailCta:`メールする`,partnerDmCta:`XでDM`}},E=(e,t)=>{if(!t)return e;let[n,r=``]=String(e||``).split(`#`);return`${n}${n.includes(`?`)?`&`:`?`}entry_source=${encodeURIComponent(t)}${r?`#${r}`:``}`},D=({label:e,code:t,tool:n,assetKey:r,toggleLabel:a,defaultOpen:o,analyticsParams:s={}})=>(0,C.jsxs)(`div`,{className:`rounded-2xl border border-slate-800 bg-slate-950/80 p-5 space-y-3`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-3`,children:[(0,C.jsx)(`div`,{className:`min-w-0`,children:e&&(0,C.jsx)(`div`,{className:`text-[11px] uppercase tracking-[0.2em] text-slate-500`,children:e})}),(0,C.jsx)(f,{value:t,onCopied:()=>i(`tool_download`,{tool:n,asset:r,...s}),className:`shrink-0 inline-flex items-center gap-2 text-[11px] px-2.5 py-1.5 rounded-md border border-slate-700 bg-slate-900/60 text-slate-200 hover:bg-slate-900 transition`,children:({copyLabel:e})=>(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(p,{size:14}),e]})})]}),(0,C.jsxs)(`details`,{className:`group`,open:o,children:[(0,C.jsxs)(`summary`,{className:`flex items-center justify-between text-[11px] font-semibold text-slate-400 cursor-pointer list-none`,children:[(0,C.jsx)(`span`,{children:a}),(0,C.jsx)(d,{size:14,className:`text-slate-500 transition-transform duration-200 group-open:rotate-180`})]}),(0,C.jsx)(`pre`,{className:`mt-2 text-xs text-slate-200 font-mono whitespace-pre leading-relaxed overflow-auto`,children:t})]})]}),O=()=>{let{i18n:e,t}=o(),n=w(e.resolvedLanguage||e.language),l=T[n]||T.en,O=t(`landing.partner`,{returnObjects:!0})||{},k=Array.isArray(O.scopeBullets)?O.scopeBullets.filter(Boolean):[],A=(typeof window<`u`?window.location.pathname:`/tools/fastlane-screenshots/`).startsWith(`/tools/fastlane-screenshot-folder-structure`),j=A?`fastlane_screenshot_folder_structure`:`default`,M=A?`fastlane_screenshot_folder_structure_intent`:`fastlane_screenshots`,N={intent_route:j},P=(e,t={})=>i(e,{tool:`fastlane_screenshots`,...t,...N}),F=(e,t)=>a(e,`tool_cta_click`,{tool:`fastlane_screenshots`,cta:t,...N}),I=(e,t)=>E(e,`${M}_${t}`),L=r({entrySource:`${M}_design_partner_offer`,preset:`fastlane_paths`}),R=I(`/pricing?offer=pay_first`,`pay_first_partner_block`),z=t(`landing.partner.offerCta`,{defaultValue:n===`ja`?`15分レビューを開く`:`Open 15-min review`}),B=I(`/`,`open_logo_header`),V=I(`/tools/`,`open_tools_header`),H=I(`/pricing`,`open_pricing_header`),U=I(`/app/?sample=5panel`,`open_app_header`),W=`#agent-handoff`,G=I(`/tools/agent-cli/#agent-bootstrap`,`open_agent_handoff_guide`),K=I(`/app/?sample=5panel`,`open_sample_project_hero`),q=I(`/app/?sample=5panel`,`open_sample_project_footer`),J=I(`/app/?sample=5panel`,`open_sample_project_sticky`),Y=I(`/tools/agent-cli/#preflight`,`open_cli_preflight`),X=t(`common.copy`,{defaultValue:`Copy`}),Z=t(`common.showCommands`,{defaultValue:`Show commands`}),Q=typeof window>`u`?!0:window.matchMedia(`(min-width: 640px)`).matches,$=`support@shimaumaservices.co.jp`,ee=t(`landing.partner.emailSubject`,{defaultValue:`ShipScreens release setup review`}),te=t(`landing.partner.emailBody`,{defaultValue:``}),ne=`mailto:${$}?subject=${encodeURIComponent(ee)}&body=${encodeURIComponent(te)}`;return c(`titles.fastlaneScreenshots`,{defaultValue:l.title}),(0,S.useEffect)(()=>{i(`tool_view`,{tool:`fastlane_screenshots`,intent_route:j})},[j]),(0,C.jsxs)(`div`,{className:`min-h-screen bg-linear-to-b from-slate-950 via-slate-900 to-slate-950 text-white`,children:[(0,C.jsx)(s,{}),(0,C.jsx)(h,{variant:`dark`,active:`tools`,logoHref:B,toolsHref:V,pricingHref:H,openAppHref:U,onToolsClick:e=>F(e,`open_tools_header`),onPricingClick:e=>F(e,`pricing_header`),onOpenAppClick:e=>F(e,`open_app_header`),primaryCta:{href:W,label:(0,C.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[t(`landing.nav.primaryCta`),` `,(0,C.jsx)(u,{size:16})]}),onClick:e=>F(e,`open_agent_cli_header`)}}),(0,C.jsxs)(`main`,{className:`max-w-5xl mx-auto px-6 pb-24 space-y-10`,children:[(0,C.jsxs)(`section`,{className:`max-w-3xl mx-auto text-center space-y-4 pt-6`,children:[(0,C.jsxs)(`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`,children:[(0,C.jsx)(m,{size:14}),l.badge]}),(0,C.jsx)(`h1`,{className:`text-3xl md:text-5xl font-black leading-tight`,children:l.title}),(0,C.jsx)(`p`,{className:`text-slate-300 text-lg leading-relaxed`,children:l.subtitle}),(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 justify-center pt-2`,children:[(0,C.jsxs)(`a`,{href:W,onClick:e=>F(e,`open_agent_cli_hero`),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`,children:[l.primaryCta,` `,(0,C.jsx)(u,{size:16})]}),(0,C.jsxs)(`a`,{href:K,onClick:e=>F(e,`open_sample_project_hero`),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`,children:[l.secondaryCta,` `,(0,C.jsx)(u,{size:16})]})]}),l.agentPrompt&&(0,C.jsx)(y,{sectionId:`agent-handoff`,lang:n,prompt:l.agentPrompt,promptTitle:l.agentPromptTitle,promptBody:l.agentPromptBody,promptNote:l.agentPromptNote,guideHref:G,className:`max-w-4xl mx-auto text-left`,onPromptCopied:e=>P(`tool_cta_click`,{cta:`copy_agent_prompt`,client:e.id}),onBundleCopied:e=>P(`tool_cta_click`,{cta:`copy_bootstrap_bundle_${e.id}`,client:e.id}),onClientCommandCopied:e=>P(`tool_cta_click`,{cta:`copy_client_bootstrap_${e.id}`,client:e.id}),onClientDownload:e=>P(`tool_download`,{asset:`client_bootstrap_${e.id}`,client:e.id}),onGuideClick:(e,t)=>a(e,`tool_cta_click`,{tool:`fastlane_screenshots`,cta:`open_agent_handoff_guide`,client:t.id,...N})}),(0,C.jsxs)(`div`,{className:`max-w-xl mx-auto text-left bg-slate-900/60 border border-slate-800 rounded-2xl p-4 space-y-2`,children:[(0,C.jsx)(`div`,{className:`text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:l.heroCliTitle}),(0,C.jsx)(`p`,{className:`text-xs text-slate-400`,children:l.heroCliNote}),(0,C.jsx)(`p`,{className:`text-xs text-slate-500`,children:l.heroCliSummary}),(0,C.jsx)(f,{value:l.heroCliCmd,onCopied:()=>P(`tool_cta_click`,{cta:`copy_cli_hero`}),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`,children:({copyLabel:e,copyState:t})=>(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(p,{size:14}),t===`idle`?l.heroCliCopyLabel:e]})}),(0,C.jsxs)(`details`,{className:`group`,open:Q,children:[(0,C.jsxs)(`summary`,{className:`flex items-center justify-between text-[11px] font-semibold text-slate-400 cursor-pointer list-none`,children:[(0,C.jsx)(`span`,{children:Z}),(0,C.jsx)(d,{size:14,className:`text-slate-500 transition-transform duration-200 group-open:rotate-180`})]}),(0,C.jsx)(`div`,{className:`mt-2 rounded-xl border border-slate-800 bg-slate-950 p-3`,children:(0,C.jsx)(`pre`,{className:`text-xs text-slate-200 whitespace-pre-wrap`,children:l.heroCliCmd})})]}),(0,C.jsxs)(`div`,{className:`pt-1 space-y-2`,children:[(0,C.jsx)(`div`,{className:`text-[10px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:l.heroCliTemplatesLabel}),(0,C.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,C.jsx)(`a`,{href:`/downloads/shipscreens-agent-cli-config.yml`,download:!0,onClick:()=>P(`tool_download`,{asset:`config_template`}),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`,children:l.heroCliConfigLabel}),(0,C.jsx)(`a`,{href:`/downloads/shipscreens-agent-cli-copy.csv`,download:!0,onClick:()=>P(`tool_download`,{asset:`copy_template`}),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`,children:l.heroCliCsvLabel})]})]})]}),(0,C.jsx)(b,{title:n===`ja`?`詳細: CLIガードレール + Pro解除`:`Advanced: CLI guardrails + Pro unlock`,codeToggleLabel:Z,copyButtonLabel:X,preflightHref:Y,onPreflightClick:e=>F(e,`open_cli_preflight`),proUnlockTitle:l.proUnlockTitle,proUnlockBody:l.proUnlockBody,proUnlockCmd:l.proUnlockCmd,proUnlockNote:l.proUnlockNote,onProUnlockCopied:()=>P(`tool_cta_click`,{cta:`copy_cli_pro_unlock`})}),(0,C.jsx)(g,{compact:!0,href:Y,onClick:e=>F(e,`open_cli_preflight_card`),className:`max-w-xl mx-auto`}),(0,C.jsx)(`div`,{className:`text-xs text-slate-500 font-medium`,children:l.trustNote})]}),(0,C.jsx)(v,{className:`max-w-4xl mx-auto w-full`}),(0,C.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3`,children:[(0,C.jsx)(`h2`,{className:`text-lg font-bold text-white`,children:l.structureTitle}),(0,C.jsx)(`p`,{className:`text-sm text-slate-300`,children:l.structureBody}),(0,C.jsx)(D,{label:`paths`,code:l.structureCode,tool:`fastlane_screenshots`,assetKey:`fastlane_paths`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N})]}),(0,C.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3`,children:[(0,C.jsx)(`h2`,{className:`text-lg font-bold text-white`,children:l.namingTitle}),(0,C.jsx)(`p`,{className:`text-sm text-slate-300`,children:l.namingBody}),(0,C.jsx)(D,{label:`naming`,code:l.namingCode,tool:`fastlane_screenshots`,assetKey:`naming_contract`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N}),(0,C.jsx)(D,{label:`yaml-minimal`,code:l.yamlMiniCode,tool:`fastlane_screenshots`,assetKey:`yaml_minimal`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N}),(0,C.jsx)(`p`,{className:`text-xs text-slate-400`,children:l.yamlMiniBody}),(0,C.jsx)(D,{label:`yaml-matrix`,code:l.yamlMatrixCode,tool:`fastlane_screenshots`,assetKey:`yaml_matrix`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N}),(0,C.jsx)(`p`,{className:`text-xs text-slate-400`,children:l.yamlMatrixBody}),(0,C.jsx)(D,{label:`folder-tree`,code:l.folderTreeCode,tool:`fastlane_screenshots`,assetKey:`folder_tree_template`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N}),(0,C.jsx)(`p`,{className:`text-xs text-slate-400`,children:l.folderTreeBody})]}),(0,C.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3`,children:[(0,C.jsx)(`h2`,{className:`text-lg font-bold text-white`,children:l.bucketsTitle}),(0,C.jsx)(`p`,{className:`text-sm text-slate-300`,children:l.bucketsBody})]}),(0,C.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3`,children:[(0,C.jsx)(`h2`,{className:`text-lg font-bold text-white`,children:l.localTitle}),(0,C.jsx)(`p`,{className:`text-sm text-slate-300`,children:l.localBody}),(0,C.jsx)(D,{label:`local`,code:l.localCode,tool:`fastlane_screenshots`,assetKey:`local_quickstart`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N})]}),(0,C.jsxs)(`details`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 group`,children:[(0,C.jsxs)(`summary`,{className:`flex items-center justify-between text-sm font-bold text-white cursor-pointer list-none`,children:[(0,C.jsx)(`span`,{children:l.pipelineTitle}),(0,C.jsxs)(`span`,{className:`flex items-center gap-2 text-[10px] font-semibold text-slate-400`,children:[n===`ja`?`詳細`:`ADVANCED`,(0,C.jsx)(d,{size:14,className:`text-slate-500`})]})]}),(0,C.jsxs)(`div`,{className:`mt-3 space-y-3`,children:[(0,C.jsx)(`p`,{className:`text-sm text-slate-300`,children:l.pipelineBody}),(0,C.jsx)(D,{label:`ci`,code:l.pipelineCode,tool:`fastlane_screenshots`,assetKey:`ci_pipeline`,toggleLabel:Z,defaultOpen:Q,analyticsParams:N})]})]}),(0,C.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4`,children:[(0,C.jsxs)(`div`,{className:`space-y-1`,children:[(0,C.jsx)(`div`,{className:`text-sm font-bold text-white`,children:O.title||l.partnerTitle}),(0,C.jsx)(`div`,{className:`text-sm text-slate-300`,children:O.body||l.partnerBody})]}),k.length>0&&(0,C.jsx)(`ul`,{className:`space-y-2 text-sm text-slate-300 list-disc pl-5`,children:k.map(e=>(0,C.jsx)(`li`,{children:e},e))}),(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3`,children:[(0,C.jsxs)(`a`,{href:L,onClick:e=>F(e,`open_design_partner_offer`),className:`inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl bg-white text-slate-900 font-bold hover:scale-[1.02] transition w-full md:w-auto`,children:[z,` `,(0,C.jsx)(u,{size:16})]}),(0,C.jsxs)(`a`,{href:ne,onClick:()=>P(`tool_cta_click`,{cta:`email_design_partner`}),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`,children:[(0,C.jsx)(x,{size:16}),O.emailCta||l.partnerEmailCta]}),(0,C.jsx)(`a`,{href:`https://x.com/shipscreenscom`,target:`_blank`,rel:`noopener noreferrer`,onClick:()=>P(`tool_cta_click`,{cta:`dm_design_partner`}),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`,children:O.dmCta||l.partnerDmCta}),(0,C.jsxs)(`a`,{href:R,onClick:e=>F(e,`open_pay_first_from_partner_block`),className:`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 w-full md:w-auto`,children:[O.payFirstCta||t(`landing.partner.payFirstCta`),` `,(0,C.jsx)(u,{size:16})]})]}),(0,C.jsxs)(`div`,{className:`text-xs text-slate-500`,children:[O.emailLabel||t(`landing.partner.emailLabel`),` `,(0,C.jsx)(`a`,{href:`mailto:${$}`,className:`underline underline-offset-4 hover:text-white`,children:$})]})]}),(0,C.jsx)(`section`,{className:`max-w-3xl mx-auto text-center space-y-3 pt-2`,children:(0,C.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 justify-center`,children:[(0,C.jsxs)(`a`,{href:W,onClick:e=>F(e,`open_agent_cli_footer`),className:`inline-flex items-center justify-center gap-2 px-5 py-3 rounded-xl bg-white text-slate-900 font-bold hover:scale-[1.02] transition`,children:[l.primaryCta,` `,(0,C.jsx)(u,{size:16})]}),(0,C.jsxs)(`a`,{href:q,onClick:e=>F(e,`open_sample_project_footer`),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 hover:bg-slate-900 transition`,children:[l.secondaryCta,` `,(0,C.jsx)(u,{size:16})]})]})})]}),(0,C.jsx)(_,{primary:{label:l.primaryCta,href:W,onClick:e=>F(e,`sticky_primary`)},secondary:{label:l.secondaryCta,href:J,onClick:e=>F(e,`sticky_secondary`)}})]})};export{O as default};
|
|
90
|
+
//# sourceMappingURL=FastlaneScreenshots-cdZE6cGY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FastlaneScreenshots-cdZE6cGY.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/mail.mjs","../../src/pages/FastlaneScreenshots.jsx"],"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: \"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\", key: \"132q7q\" }],\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.mjs.map\n","import React, { useEffect } from 'react';\nimport { ArrowRight, ChevronDown, Copy, FolderTree, Mail } 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';\nimport { buildDesignPartnerHref } from '../lib/designPartnerPrefill';\n\nconst normalizeLang = (lang) => {\n const base = (lang || '').split('-')[0];\n return base === 'ja' ? 'ja' : 'en';\n};\n\nconst COPY = {\n en: {\n badge: 'Fastlane cheat sheet',\n title: 'Fastlane screenshot folder structure',\n subtitle:\n 'Keep Figma, Fastlane, and your current capture flow. Add the deterministic release step Fastlane does not give you: copy/paste the deliver + supply paths, lock outcome-first panel order, and stop path/order drift before upload.',\n primaryCta: 'Use your agent for the Fastlane workflow',\n secondaryCta: 'Open sample project (free)',\n agentPromptTitle: 'Give your agent this prompt',\n agentPromptBody: 'Use this when Fastlane paths, naming, or upload roots keep drifting release to release.',\n agentPrompt:\n 'Use ShipScreens as the build step for our Fastlane screenshot release step. Keep our current Figma/Fastlane/manual workflow, inspect this repo, choose the best path for this workspace (workspace-local MCP if available, otherwise pure CLI), produce deterministic deliver + supply-safe roots, lock 01..05 naming and panel order, run verify/stage before upload, and return the report with output paths, warnings, and next steps. Only ask me if device or locale scope or panel #1 messaging is unclear.',\n agentPromptNote: 'Recommended: tell your coding agent once, then keep Fastlane as the upload lane.',\n heroCliTitle: 'CLI quickstart (2 steps)',\n heroCliNote: 'wizard -> agent-run (raw mode, no Playwright).',\n heroCliSummary: 'Outputs: fastlane/ + reproducible ZIP + staged upload root + proof report.',\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/fastlane --stage',\n ].join('\\n'),\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 trustNote: 'Privacy-first: exports run locally (browser/CI). No uploads to ShipScreens.',\n structureTitle: 'Expected paths (deliver + supply)',\n structureBody:\n 'Most Fastlane failures come from path/numbering drift, not design quality. Keep this structure consistent per locale and device/bucket while preserving your own visual style. For panel #1, run a clarity check: if the line could fit many apps, rewrite it with one concrete outcome.',\n structureCode: `fastlane/\n screenshots/ # iOS (deliver)\n en-US/\n iphone69_01.png\n iphone69_02.png\n metadata/\n android/ # Android (supply)\n en-US/\n images/\n phoneScreenshots/\n 01.png\n 02.png\n\nfastlane_assets.zip # reproducible artifact (optional)`,\n namingTitle: 'Deterministic naming contract (copy/paste)',\n namingBody:\n 'Use one naming schema across reruns so panel order, locale, and device stay machine-checkable release after release.',\n namingCode: `1) {platform}/{locale}/{device}/{slot}.png\n2) platform: ios | android\n3) locale: en-US, ja-JP\n4) device: iphone67, iphone65, ipad13 (or Android bucket token)\n5) slot: 01..05`,\n yamlMiniTitle: 'Minimal YAML (single lane)',\n yamlMiniBody: 'Start with one lane, prove reruns, then expand matrix size.',\n yamlMiniCode: `platform: ios\nlocale: en-US\ndevice: iphone67\nslots: [01, 02, 03, 04, 05]\npath: \"{platform}/{locale}/{device}/{slot}.png\"`,\n yamlMatrixTitle: 'Full matrix YAML (iOS + Android)',\n yamlMatrixBody: 'Use this when you need both stores with stable slot numbering.',\n yamlMatrixCode: `platforms: [ios, android]\nlocales: [en-US, ja-JP]\nios: [iphone67, iphone65, ipad13]\nandroid: [phoneScreenshots, sevenInchScreenshots, tenInchScreenshots]\nslots: [01, 02, 03, 04, 05]\npath: \"{platform}/{locale}/{device}/{slot}.png\"`,\n folderTreeTitle: 'Folder tree template',\n folderTreeBody: 'Keep this tree stable and reruns usually become edits instead of firefights.',\n folderTreeCode: `ios/\n en-US/\n iphone67/01.png ... 05.png\n iphone65/01.png ... 05.png\n ipad13/01.png ... 05.png\n ja-JP/\n iphone67/01.png ... 05.png\nandroid/\n en-US/\n phoneScreenshots/01.png ... 05.png\n sevenInchScreenshots/01.png ... 05.png\n tenInchScreenshots/01.png ... 05.png`,\n bucketsTitle: 'Android buckets (supply)',\n bucketsBody:\n 'ShipScreens supports these upload buckets (use what matches your device set): phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, tvScreenshots, wearScreenshots.',\n localTitle: 'Local quickstart (no browser)',\n localBody: 'Run shipscreens wizard (step-by-step), swap PNGs, then let agent-run build, verify, stage, and report before upload.',\n localCode: `npx --yes shipscreens wizard\n# replace assets/en-US/01.png..05.png\nnpx --yes shipscreens agent-run --mode raw --zip --out out/fastlane --stage --profile appstore`,\n pipelineTitle: 'Recommended CI pipeline (copy/paste)',\n pipelineBody: 'Validate, lock, then agent-run build/verify/stage/report so each release reruns safely. Rendered mode uses Playwright Chromium.',\n pipelineCode: `npm ci\nnpx playwright install --with-deps chromium\nnpm run shipscreens:validate\nnpm run shipscreens:lock -- --check\nnpm run shipscreens -- agent-run --mode rendered --zip --out out/fastlane --stage --profile appstore --json`,\n partnerTitle: 'Need help getting your first export?',\n partnerBody: 'We do short 15-min workflow reviews and map your current setup to an upload-ready export with clearer screenshot positioning.',\n partnerEmailCta: 'Email us',\n partnerDmCta: 'DM on X',\n },\n ja: {\n badge: 'Fastlane チートシート',\n title: 'Fastlane 用スクショのフォルダ構成',\n subtitle:\n 'Figma、Fastlane、今の素材取りはそのまま。Fastlane だけでは止めにくい提出事故を防ぐ決定論的なリリース工程を足します。deliver / supply が期待するパスを固定し、成果訴求順を保った再現性出力にします。',\n primaryCta: 'AIエージェントで Fastlane のリリース工程を固める',\n secondaryCta: 'サンプルを開く(無料)',\n agentPromptTitle: 'coding agent に渡すプロンプト',\n agentPromptBody: 'Fastlane のパス、命名、upload root が毎回揺れるときは、手で直すより先にこれを渡します。',\n agentPrompt:\n 'ShipScreens を使って、Fastlane 用スクリーンショットのリリース工程を固めてください。今の Figma/Fastlane/手動フローは維持し、この repo を確認して、このプロジェクトで MCP が使えるならそれを、無ければ CLI を選び、deliver/supply-safe な root、01..05 命名、訴求順、提出前チェック(verify と stage)まで整えて、出力パス・警告・次の作業を短く報告してください。端末/言語スコープか 1枚目訴求が不明なときだけ確認してください。',\n agentPromptNote: 'おすすめは、1回指示して Fastlane の upload lane を安定化させることです。',\n heroCliTitle: 'CLIクイックスタート(2ステップ)',\n heroCliNote: 'wizard -> agent-run(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/fastlane --stage',\n ].join('\\n'),\n proUnlockTitle: 'Proを解除(CLI)',\n proUnlockBody: '透かし解除&フル一括(端末×言語)のために、まずはCLI認証を実行:',\n proUnlockCmd: 'npx --yes shipscreens auth login',\n proUnlockNote: '初回のみブラウザでサインインします。以後は --require-pro で再実行。',\n trustNote: 'プライバシー: 出力はローカル(ブラウザ/CI)。ShipScreensへアップロード不要。',\n structureTitle: '期待されるパス(deliver + supply)',\n structureBody: 'Fastlaneの失敗原因はデザインよりパス/連番ドリフトが多いです。見た目は維持したまま、言語/端末(バケット)単位でこの形に揃えます。1枚目は「他の多くのアプリにも当てはまる文言なら、成果を具体化して書き直す」を確認します。',\n structureCode: `fastlane/\n screenshots/ # iOS (deliver)\n en-US/\n iphone69_01.png\n iphone69_02.png\n metadata/\n android/ # Android (supply)\n en-US/\n images/\n phoneScreenshots/\n 01.png\n 02.png\n\nfastlane_assets.zip # 再現性のあるZIP(任意)`,\n namingTitle: '命名契約(コピペ)',\n namingBody: 'この命名ルールを固定すると、毎リリースで順序崩れを防ぎやすくなります。',\n namingCode: `1) {platform}/{locale}/{device}/{slot}.png\n2) platform: ios | android\n3) locale: en-US, ja-JP\n4) device: iphone67, iphone65, ipad13(またはAndroid bucket)\n5) slot: 01..05`,\n yamlMiniTitle: '最小YAML(単一路線)',\n yamlMiniBody: 'まず1レーンで再実行を固定し、その後に行列を広げます。',\n yamlMiniCode: `platform: ios\nlocale: en-US\ndevice: iphone67\nslots: [01, 02, 03, 04, 05]\npath: \"{platform}/{locale}/{device}/{slot}.png\"`,\n yamlMatrixTitle: 'フル行列YAML(iOS + Android)',\n yamlMatrixBody: '両ストア運用で連番を固定したい場合のテンプレです。',\n yamlMatrixCode: `platforms: [ios, android]\nlocales: [en-US, ja-JP]\nios: [iphone67, iphone65, ipad13]\nandroid: [phoneScreenshots, sevenInchScreenshots, tenInchScreenshots]\nslots: [01, 02, 03, 04, 05]\npath: \"{platform}/{locale}/{device}/{slot}.png\"`,\n folderTreeTitle: 'フォルダツリー雛形',\n folderTreeBody: 'この木構造を固定すると、毎回の再実行が「修正のみ」になりやすいです。',\n folderTreeCode: `ios/\n en-US/\n iphone67/01.png ... 05.png\n iphone65/01.png ... 05.png\n ipad13/01.png ... 05.png\n ja-JP/\n iphone67/01.png ... 05.png\nandroid/\n en-US/\n phoneScreenshots/01.png ... 05.png\n sevenInchScreenshots/01.png ... 05.png\n tenInchScreenshots/01.png ... 05.png`,\n bucketsTitle: 'Android buckets(supply)',\n bucketsBody:\n '対応バケット: phoneScreenshots / sevenInchScreenshots / tenInchScreenshots / tvScreenshots / wearScreenshots',\n localTitle: 'ローカル最短(ブラウザ不要)',\n localBody: 'shipscreens wizard(ステップ式)で雛形作成後、agent-run で build / verify / stage / report まで実行。',\n localCode: `npx --yes shipscreens wizard\n# assets/en-US/01.png〜05.png を差し替え\nnpx --yes shipscreens agent-run --mode raw --zip --out out/fastlane --stage --profile appstore`,\n pipelineTitle: 'CIパイプライン(コピペ)',\n pipelineBody: 'validate / lock の後に agent-run で build / verify / stage / report を回し、毎リリースを安全に再実行します(rendered mode)。',\n pipelineCode: `npm ci\nnpx playwright install --with-deps chromium\nnpm run shipscreens:validate\nnpm run shipscreens:lock -- --check\nnpm run shipscreens -- agent-run --mode rendered --zip --out out/fastlane --stage --profile appstore --json`,\n partnerTitle: '初回エクスポートが詰まったら',\n partnerBody:\n '15分だけ現状を聞かせてください。既存運用は変えずに、アップロードしやすいリリース工程と訴求改善のどこを先に固めるべきかを返します。',\n partnerEmailCta: 'メールする',\n partnerDmCta: 'XでDM',\n },\n};\n\nconst withEntrySource = (href, entrySource) => {\n if (!entrySource) return href;\n const [beforeHash, hash = ''] = String(href || '').split('#');\n const separator = beforeHash.includes('?') ? '&' : '?';\n return `${beforeHash}${separator}entry_source=${encodeURIComponent(entrySource)}${hash ? `#${hash}` : ''}`;\n};\n\nconst CodeBlock = ({ label, code, tool, assetKey, toggleLabel, defaultOpen, analyticsParams = {} }) => (\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950/80 p-5 space-y-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n {label && <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-500\">{label}</div>}\n </div>\n <CopyButton\n value={code}\n onCopied={() => trackEvent('tool_download', { tool, asset: assetKey, ...analyticsParams })}\n className=\"shrink-0 inline-flex items-center gap-2 text-[11px] px-2.5 py-1.5 rounded-md border border-slate-700 bg-slate-900/60 text-slate-200 hover:bg-slate-900 transition\"\n >\n {({ copyLabel }) => (\n <>\n <Copy size={14} />\n {copyLabel}\n </>\n )}\n </CopyButton>\n </div>\n <details className=\"group\" open={defaultOpen}>\n <summary className=\"flex items-center justify-between text-[11px] font-semibold text-slate-400 cursor-pointer list-none\">\n <span>{toggleLabel}</span>\n <ChevronDown size={14} className=\"text-slate-500 transition-transform duration-200 group-open:rotate-180\" />\n </summary>\n <pre className=\"mt-2 text-xs text-slate-200 font-mono whitespace-pre leading-relaxed overflow-auto\">{code}</pre>\n </details>\n </div>\n);\n\nconst FastlaneScreenshots = () => {\n const { i18n, t } = useTranslation();\n const lang = normalizeLang(i18n.resolvedLanguage || i18n.language);\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 currentPath = typeof window !== 'undefined' ? window.location.pathname : '/tools/fastlane-screenshots/';\n const isFolderStructureIntent = currentPath.startsWith('/tools/fastlane-screenshot-folder-structure');\n const intentRoute = isFolderStructureIntent ? 'fastlane_screenshot_folder_structure' : 'default';\n const entrySourcePrefix = isFolderStructureIntent ? 'fastlane_screenshot_folder_structure_intent' : 'fastlane_screenshots';\n const analyticsParams = { intent_route: intentRoute };\n const trackFastlaneEvent = (name, params = {}) =>\n trackEvent(name, { tool: 'fastlane_screenshots', ...params, ...analyticsParams });\n const trackFastlaneLink = (event, cta) =>\n trackEventAndFollowLink(event, 'tool_cta_click', { tool: 'fastlane_screenshots', cta, ...analyticsParams });\n const buildInternalHref = (href, suffix) => withEntrySource(href, `${entrySourcePrefix}_${suffix}`);\n const designPartnerOfferHref = buildDesignPartnerHref({\n entrySource: `${entrySourcePrefix}_design_partner_offer`,\n preset: 'fastlane_paths',\n });\n const payFirstPartnerHref = buildInternalHref('/pricing?offer=pay_first', 'pay_first_partner_block');\n const designPartnerOfferLabel = t('landing.partner.offerCta', {\n defaultValue: lang === 'ja' ? '15分レビューを開く' : 'Open 15-min review',\n });\n\n const logoHref = buildInternalHref('/', 'open_logo_header');\n const toolsHref = buildInternalHref('/tools/', 'open_tools_header');\n const pricingHref = buildInternalHref('/pricing', 'open_pricing_header');\n const openAppHref = buildInternalHref('/app/?sample=5panel', 'open_app_header');\n const agentHandoffHref = '#agent-handoff';\n const agentCliGuideHref = buildInternalHref('/tools/agent-cli/#agent-bootstrap', 'open_agent_handoff_guide');\n const sampleProjectHeroHref = buildInternalHref('/app/?sample=5panel', 'open_sample_project_hero');\n const sampleProjectFooterHref = buildInternalHref('/app/?sample=5panel', 'open_sample_project_footer');\n const sampleProjectStickyHref = buildInternalHref('/app/?sample=5panel', 'open_sample_project_sticky');\n const preflightHref = buildInternalHref('/tools/agent-cli/#preflight', 'open_cli_preflight');\n const configDownloadHref = '/downloads/shipscreens-agent-cli-config.yml';\n const csvDownloadHref = '/downloads/shipscreens-agent-cli-copy.csv';\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 supportEmail = 'support@shimaumaservices.co.jp';\n const mailSubject = t('landing.partner.emailSubject', { defaultValue: 'ShipScreens release setup review' });\n const mailBody = t('landing.partner.emailBody', { defaultValue: '' });\n const partnerMailto = `mailto:${supportEmail}?subject=${encodeURIComponent(mailSubject)}&body=${encodeURIComponent(\n mailBody\n )}`;\n\n usePageTitle('titles.fastlaneScreenshots', { defaultValue: copy.title });\n\n useEffect(() => {\n trackEvent('tool_view', { tool: 'fastlane_screenshots', intent_route: intentRoute });\n }, [intentRoute]);\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 logoHref={logoHref}\n toolsHref={toolsHref}\n pricingHref={pricingHref}\n openAppHref={openAppHref}\n onToolsClick={(event) => trackFastlaneLink(event, 'open_tools_header')}\n onPricingClick={(event) => trackFastlaneLink(event, 'pricing_header')}\n onOpenAppClick={(event) => trackFastlaneLink(event, 'open_app_header')}\n primaryCta={{\n href: agentHandoffHref,\n label: (\n <span className=\"inline-flex items-center gap-2\">\n {t('landing.nav.primaryCta')} <ArrowRight size={16} />\n </span>\n ),\n onClick: (event) => trackFastlaneLink(event, 'open_agent_cli_header'),\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 pt-6\">\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 <FolderTree 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\">{copy.subtitle}</p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center pt-2\">\n <a\n href={agentHandoffHref}\n onClick={(event) => trackFastlaneLink(event, 'open_agent_cli_hero')}\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.primaryCta} <ArrowRight size={16} />\n </a>\n <a\n href={sampleProjectHeroHref}\n onClick={(event) => trackFastlaneLink(event, 'open_sample_project_hero')}\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.secondaryCta} <ArrowRight size={16} />\n </a>\n </div>\n {copy.agentPrompt && (\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 trackFastlaneEvent('tool_cta_click', { cta: 'copy_agent_prompt', client: client.id })\n }\n onBundleCopied={(client) =>\n trackFastlaneEvent('tool_cta_click', {\n cta: `copy_bootstrap_bundle_${client.id}`,\n client: client.id,\n })\n }\n onClientCommandCopied={(client) =>\n trackFastlaneEvent('tool_cta_click', {\n cta: `copy_client_bootstrap_${client.id}`,\n client: client.id,\n })\n }\n onClientDownload={(client) =>\n trackFastlaneEvent('tool_download', {\n asset: `client_bootstrap_${client.id}`,\n client: client.id,\n })\n }\n onGuideClick={(event, client) =>\n trackEventAndFollowLink(event, 'tool_cta_click', {\n tool: 'fastlane_screenshots',\n cta: 'open_agent_handoff_guide',\n client: client.id,\n ...analyticsParams,\n })\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={() => trackFastlaneEvent('tool_cta_click', { 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 <Copy size={14} />\n {copyState === 'idle' ? copy.heroCliCopyLabel : copyLabel}\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={() => trackFastlaneEvent('tool_download', { 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={() => trackFastlaneEvent('tool_download', { 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={preflightHref}\n onPreflightClick={(event) => trackFastlaneLink(event, 'open_cli_preflight')}\n proUnlockTitle={copy.proUnlockTitle}\n proUnlockBody={copy.proUnlockBody}\n proUnlockCmd={copy.proUnlockCmd}\n proUnlockNote={copy.proUnlockNote}\n onProUnlockCopied={() => trackFastlaneEvent('tool_cta_click', { cta: 'copy_cli_pro_unlock' })}\n />\n <CliPreflightCard\n compact\n href={preflightHref}\n onClick={(event) => trackFastlaneLink(event, 'open_cli_preflight_card')}\n className=\"max-w-xl mx-auto\"\n />\n <div className=\"text-xs text-slate-500 font-medium\">{copy.trustNote}</div>\n </section>\n\n <FitPanel className=\"max-w-4xl mx-auto w-full\" />\n\n <section className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3\">\n <h2 className=\"text-lg font-bold text-white\">{copy.structureTitle}</h2>\n <p className=\"text-sm text-slate-300\">{copy.structureBody}</p>\n <CodeBlock\n label=\"paths\"\n code={copy.structureCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"fastlane_paths\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n </section>\n\n <section className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3\">\n <h2 className=\"text-lg font-bold text-white\">{copy.namingTitle}</h2>\n <p className=\"text-sm text-slate-300\">{copy.namingBody}</p>\n <CodeBlock\n label=\"naming\"\n code={copy.namingCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"naming_contract\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n <CodeBlock\n label=\"yaml-minimal\"\n code={copy.yamlMiniCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"yaml_minimal\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n <p className=\"text-xs text-slate-400\">{copy.yamlMiniBody}</p>\n <CodeBlock\n label=\"yaml-matrix\"\n code={copy.yamlMatrixCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"yaml_matrix\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n <p className=\"text-xs text-slate-400\">{copy.yamlMatrixBody}</p>\n <CodeBlock\n label=\"folder-tree\"\n code={copy.folderTreeCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"folder_tree_template\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n <p className=\"text-xs text-slate-400\">{copy.folderTreeBody}</p>\n </section>\n\n <section className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3\">\n <h2 className=\"text-lg font-bold text-white\">{copy.bucketsTitle}</h2>\n <p className=\"text-sm text-slate-300\">{copy.bucketsBody}</p>\n </section>\n\n <section className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3\">\n <h2 className=\"text-lg font-bold text-white\">{copy.localTitle}</h2>\n <p className=\"text-sm text-slate-300\">{copy.localBody}</p>\n <CodeBlock\n label=\"local\"\n code={copy.localCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"local_quickstart\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n </section>\n\n <details className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 group\">\n <summary className=\"flex items-center justify-between text-sm font-bold text-white cursor-pointer list-none\">\n <span>{copy.pipelineTitle}</span>\n <span className=\"flex items-center gap-2 text-[10px] font-semibold text-slate-400\">\n {lang === 'ja' ? '詳細' : 'ADVANCED'}\n <ChevronDown size={14} className=\"text-slate-500\" />\n </span>\n </summary>\n <div className=\"mt-3 space-y-3\">\n <p className=\"text-sm text-slate-300\">{copy.pipelineBody}</p>\n <CodeBlock\n label=\"ci\"\n code={copy.pipelineCode}\n tool=\"fastlane_screenshots\"\n assetKey=\"ci_pipeline\"\n toggleLabel={codeToggleLabel}\n defaultOpen={defaultCodeOpen}\n analyticsParams={analyticsParams}\n />\n </div>\n </details>\n\n <section className=\"bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-bold text-white\">{partnerCopy.title || copy.partnerTitle}</div>\n <div className=\"text-sm text-slate-300\">{partnerCopy.body || copy.partnerBody}</div>\n </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 <div className=\"flex flex-col sm:flex-row gap-3\">\n <a\n href={designPartnerOfferHref}\n onClick={(event) => trackFastlaneLink(event, 'open_design_partner_offer')}\n className=\"inline-flex items-center justify-center gap-2 px-4 py-3 rounded-xl bg-white text-slate-900 font-bold hover:scale-[1.02] transition w-full md:w-auto\"\n >\n {designPartnerOfferLabel} <ArrowRight size={16} />\n </a>\n <a\n href={partnerMailto}\n onClick={() => trackFastlaneEvent('tool_cta_click', { cta: 'email_design_partner' })}\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 <Mail size={16} />\n {partnerCopy.emailCta || copy.partnerEmailCta}\n </a>\n <a\n href=\"https://x.com/shipscreenscom\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={() => trackFastlaneEvent('tool_cta_click', { cta: 'dm_design_partner' })}\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 {partnerCopy.dmCta || copy.partnerDmCta}\n </a>\n <a\n href={payFirstPartnerHref}\n onClick={(event) => trackFastlaneLink(event, 'open_pay_first_from_partner_block')}\n className=\"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 w-full md:w-auto\"\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=\"max-w-3xl mx-auto text-center space-y-3 pt-2\">\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <a\n href={agentHandoffHref}\n onClick={(event) => trackFastlaneLink(event, 'open_agent_cli_footer')}\n className=\"inline-flex items-center justify-center gap-2 px-5 py-3 rounded-xl bg-white text-slate-900 font-bold hover:scale-[1.02] transition\"\n >\n {copy.primaryCta} <ArrowRight size={16} />\n </a>\n <a\n href={sampleProjectFooterHref}\n onClick={(event) => trackFastlaneLink(event, 'open_sample_project_footer')}\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 hover:bg-slate-900 transition\"\n >\n {copy.secondaryCta} <ArrowRight size={16} />\n </a>\n </div>\n </section>\n </main>\n <StickyMobileCta\n primary={{\n label: copy.primaryCta,\n href: agentHandoffHref,\n onClick: (event) => trackFastlaneLink(event, 'sticky_primary'),\n }}\n secondary={{\n label: copy.secondaryCta,\n href: sampleProjectStickyHref,\n onClick: (event) => trackFastlaneLink(event, 'sticky_secondary'),\n }}\n />\n </div>\n );\n};\n\nexport default FastlaneScreenshots;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,l as ee,n as r,r as i,s as te,x as a}from"./index-D7D6ZRCW.js";import{n as o,r as s}from"./LanguageSwitcher-hFv9zl1u.js";import{n as c,t as l}from"./circle-check-X08qqy40.js";import{t as u}from"./chevron-down-BIXHKpnf.js";import{r as d,t as f}from"./CopyButton-BFCx6EPg.js";import{t as ne}from"./SiteHeader-CJqQ0pL3.js";import{t as re}from"./rocket-DHdrCHKD.js";import{n as p,t as m}from"./ReleaseFitIntake-DBeb9AFJ.js";import{t as h}from"./terminal-J0iyJTv2.js";import{n as g,t as _}from"./StickyMobileCta-REC3DROG.js";import{t as v}from"./FitPanel-B1J0V1jK.js";import{t as y}from"./AgentHandoffPanel-Bf_AJepG.js";var b=e(t(),1),x=n(),ie=e=>(e||``).split(`-`)[0]===`ja`?`ja`:`en`,S={en:{badge:`5-minute first export`,title:`Turn your current screenshots into a deterministic first export in 5 minutes`,subtitle:`You may already have design tools or Fastlane scripts. This page does not replace them; it adds a deterministic first-export layer (fastlane/ + ZIP) with clear panel order, iPhone-first scope, and upload-safe roots. If you already use a coding agent, tell it to use ShipScreens and let it carry the same contract into CLI/MCP and CI.`,quickPathTitle:`Fastest path (agent-first if available)`,quickPathBullets:[`Start from the 5-panel sample project and reuse your current screenshots/copy.`,`Keep panel #1 to one concrete outcome for one user type.`,`Use zero-padded 01..05 naming and verify upload roots before scaling devices/locales.`,`If a coding agent is already in your workflow, hand this to the agent instead of rebuilding the release step yourself.`],agentPromptTitle:`Already using a coding agent?`,agentPromptBody:`Paste this instead of clicking through everything manually.`,agentPrompt:`Use ShipScreens to turn our current screenshots into a deterministic first export. Keep the existing design workflow, choose the best path for this workspace (workspace-local MCP if available, otherwise pure CLI), create a Fastlane-ready ZIP, run verify/stage before upload, and only ask me if device or locale scope or panel #1 messaging is unclear.`,agentPromptNote:`Browser-first is still here. Agent-first is the better default when you are already building with Claude/Cursor/Copilot/Gemini.`,demoTitle:`Run a demo export (no assets required)`,demoBody:`If you just want to sanity-check the folder roots and the deterministic ZIP first, run the demo. It generates a throwaway project and stages a clean upload root.`,demoCmd:`npx --yes shipscreens demo`,demoBullets:[`Output tree: fastlane/ + reproducible ZIP`,`Stages a clean upload root (deliver/supply-safe)`,`Delete the demo folder anytime`],demoNote:`First run may take longer while npx downloads the package.`,heroCliTitle:`CLI quickstart (2 steps)`,heroCliNote:`wizard -> agent-run --stage (raw mode, no Playwright).`,heroCliSummary:`Outputs: fastlane/ + reproducible ZIP + staged upload root + proof reports.`,heroCliCopyLabel:`Copy all commands`,heroCliTemplatesLabel:`Starter templates`,heroCliConfigLabel:`config.yml`,heroCliCsvLabel:`copy.csv`,heroCiTemplatesLabel:`CI templates`,heroCiGithubLabel:`GitHub Actions`,heroCiBitriseLabel:`Bitrise`,ctas:{cli:`Tell your agent (CLI/MCP)`,goPro:`Go Pro`,sample:`Open sample project`},trustTitle:`Check trust basics before upgrade`,trustLinks:{pricing:`Pricing`,terms:`Terms`,privacy:`Privacy`,legal:`Legal (Japan)`,security:`Security`,proof:`Proof`},steps:[{title:`Run the CLI wizard (or open the sample)`,body:`Scaffold config + placeholders from wizard, or start from the 5-panel sample and keep your current visual style.`},{title:`Lock panel order + export upload-ready outputs`,body:`Generate fastlane/ + reproducible ZIP with stable numbering/path naming and a clear Hook -> CTA panel flow.`},{title:`Review verify + stage proof`,body:`Run agent-run --stage so build, verify, stage, and report stay together before upload or unlock.`}],quickstartTitle:`Agent/CI handoff (copy/paste)`,quickstartBody:`Paste these commands when the agent falls back to pure CLI or when you run the rendered release pipeline yourself.`,quickstartCmd:[`npm ci`,`npx playwright install --with-deps chromium`,`npm run shipscreens:validate`,`npm run shipscreens:lock -- --check`,`npx --yes shipscreens agent-run --mode raw --out out/agent --zip --stage --profile appstore`].join(`
|
|
2
|
+
`),cliTitle:`Prefer CLI (no browser)?`,cliBody:`Run shipscreens wizard, replace placeholders, and build in raw mode first; then add verify/stage to catch drift before upload.`,cliCmd:[`npx --yes shipscreens wizard`,`# replace assets/en-US/01.png..05.png`,`npx --yes shipscreens agent-run --mode raw --zip --out out/agent --stage`].join(`
|
|
3
|
+
`),cliCta:`Open the agent-first guide`,proTitle:`Upgrade unlocks`,proBullets:[`Unlock CI-grade reruns (rendered exports)`,`Full matrix batch exports (devices × locales)`,`CSV/JSON copy import at scale`,`No watermark`],proUnlockTitle:`Unlock Pro (CLI)`,proUnlockBody:`Remove the watermark and unlock full matrix exports via CLI auth:`,proUnlockCmd:`npx --yes shipscreens auth login`,proUnlockNote:`Completes a one-time browser sign-in; then rerun agent-run with --require-pro.`,advancedTitle:`Advanced: CLI + CI guardrails`,advancedBody:`Optional for first export. Use this when you need deterministic reruns in CI or a non-interactive handoff to coding agents.`,note:`Free exports are watermarked. Keep your current design tools and art direction; ShipScreens adds deterministic reruns, 01..05 naming discipline, and upload guardrails. Clarity check: if screenshot #1 could fit many apps, rewrite it with one concrete outcome.`},ja:{badge:`5分で初回エクスポート`,title:`今あるスクショから、決定論的な初回エクスポートを5分で作る`,subtitle:`既存のデザインツールやFastlaneスクリプトはそのままで、今あるスクショに決定論的な初回エクスポート層(fastlane/ + ZIP)を足すページです。1枚目訴求、iPhone-first の最小構成、パス/順序の崩れを止めます。coding agent を使っているなら、ShipScreens を使って進めてと渡して同じ契約を CLI/MCP / CI へ載せられます。`,quickPathTitle:`最短導線(agent がいれば agent-first)`,quickPathBullets:[`5枚構成サンプルを開き、今あるスクショ/コピーを流し込む。`,`1枚目は「誰に、どんな成果か」を1つに絞る。`,`01..05 の連番命名と upload root の確認を先に済ませる。`,`coding agent を使っているなら、自分で組み立て直さず agent にそのまま委譲する。`],agentPromptTitle:`coding agent を使っていますか?`,agentPromptBody:`手で進める代わりに、まずこれを貼るのが最短です。`,agentPrompt:`ShipScreens を使って、今あるスクリーンショットから決定論的な first export を作ってください。既存のデザイン運用は維持し、このワークスペースで使えるなら workspace-local MCP、無ければ CLI を選び、Fastlane-ready ZIP と verify/stage まで進めて、端末/言語スコープか 1枚目訴求が不明なときだけ確認してください。`,agentPromptNote:`browser-first 導線も残しますが、Claude/Cursor/Copilot/Gemini が既にあるなら agent-first の方が良いUXです。`,demoTitle:`デモを書き出す(素材不要)`,demoBody:`まずフォルダ構成と再現性ZIPだけ確認したい場合はデモが最短です。捨てプロジェクトを生成し、クリーンな提出ルートまで stage します。`,demoCmd:`npx --yes shipscreens demo`,demoBullets:[`出力: fastlane/ + 再現性ZIP`,`提出用のクリーンなルートを stage`,`デモは削除してOK`],demoNote:`初回は npx がパッケージを取得するため時間がかかる場合があります。`,heroCliTitle:`CLIクイックスタート(2ステップ)`,heroCliNote:`wizard -> agent-run --stage(raw / Playwright不要)。`,heroCliSummary:`出力: fastlane/ + 再現性ZIP + staged upload root + proof report。`,heroCliCopyLabel:`コマンドをすべてコピー`,heroCliTemplatesLabel:`スターター雛形`,heroCliConfigLabel:`config.yml`,heroCliCsvLabel:`copy.csv`,heroCiTemplatesLabel:`CIテンプレ`,heroCiGithubLabel:`GitHub Actions`,heroCiBitriseLabel:`Bitrise`,ctas:{cli:`agent に任せる(CLI/MCP)`,goPro:`Proにアップグレード`,sample:`サンプルを開く`},trustTitle:`アップグレード前に料金・規約を確認`,trustLinks:{pricing:`料金`,terms:`利用規約`,privacy:`プライバシー`,legal:`特商法表記`,security:`セキュリティ`,proof:`実績`},steps:[{title:`CLI wizard で雛形作成(サンプルでも可)`,body:`wizard で雛形を作るか、5枚構成サンプルから開始し、既存の見た目を維持したまま進めます。`},{title:`訴求順を固定してアップロード用出力を作る`,body:`Hook->CTA の流れを維持しながら、連番/パス命名を固定して fastlane/ + 再現性ZIP を出力。`},{title:`verify + stage の proof を確認`,body:`agent-run --stage で build / verify / stage / report をまとめて実行し、アップロードや Pro 解除の前に確認します。`}],quickstartTitle:`agent/CI handoff(コピペ)`,quickstartBody:`agent が pure CLI に fallback したとき、または rendered release pipeline を自分で回すときのコマンドです。`,quickstartCmd:[`npm ci`,`npx playwright install --with-deps chromium`,`npm run shipscreens:validate`,`npm run shipscreens:lock -- --check`,`npx --yes shipscreens agent-run --mode raw --out out/agent --zip --stage --profile appstore`].join(`
|
|
4
|
+
`),cliTitle:`CLIで完結したい場合`,cliBody:`shipscreens wizard で雛形を作って raw モードで出力し、次に verify/stage を足して提出前に崩れを検知します。`,cliCmd:[`npx --yes shipscreens wizard`,`# assets/en-US/01.png〜05.png を差し替え`,`npx --yes shipscreens agent-run --mode raw --zip --out out/agent --stage`].join(`
|
|
5
|
+
`),cliCta:`agent-first ガイドを開く`,proTitle:`Proでできること`,proBullets:[`CIで再実行(rendered出力)`,`フル一括(端末×言語)`,`CSV/JSON copy 取り込み`,`透かしなし`],proUnlockTitle:`Proを解除(CLI)`,proUnlockBody:`透かし解除&フル一括(端末×言語)のために、まずはCLI認証を実行:`,proUnlockCmd:`npx --yes shipscreens auth login`,proUnlockNote:`初回のみブラウザでサインインします。以後は agent-run --require-pro で再実行。`,advancedTitle:`詳細: CLI + CI ガードレール`,advancedBody:`初回出力では任意。CIで再実行性を固定したい場合や、coding agent に non-interactive に渡したい場合に使います。`,note:`無料版は透かし付きです。既存の見た目とツールはそのままに、ShipScreensで再実行性、01..05 命名、提出前ガードレールを追加します。確認: 1枚目見出しが他の多くのアプリにも当てはまるなら、成果を具体化します。`}},C=()=>{let{i18n:e,t}=a(),n=ie(e.resolvedLanguage||e.language),C=S[n]||S.en,w=t(`landing.partner`,{returnObjects:!0})||{},T=Array.isArray(w.scopeBullets)?w.scopeBullets.filter(Boolean):[],E=(te().entry_source||``)===`quick_ship_iphone_only_first_export`,D=E?{quick_ship_path:`iphone_only`}:{},O=`support@shimaumaservices.co.jp`,k=n===`ja`?`返金: デジタルサービスの性質上、法令で必要な場合を除き返金はありません。いつでも解約可能です。会社: Shimauma Services, Inc.(東京)。`:`Refund: due to the digital nature of the service, payments are non-refundable except where required by law. Cancel anytime. Company: Shimauma Services, Inc. (Tokyo).`,A=n===`ja`?`問い合わせ`:`Contact`,j=E?`quick_ship_iphone_only_open_app_header`:`first_export_open_app_header`,M=E?`quick_ship_iphone_only_go_pro_footer`:`first_export_go_pro_footer`,N=E?`quick_ship_iphone_only_open_sample_project`:`first_export_open_sample_project`,P=E?`quick_ship_iphone_only_open_sample_project_footer`:`first_export_open_sample_project_footer`,F=`/app/?sample=5panel&entry_source=${j}`,I=`#agent-handoff`,L=n===`ja`?`運用テンプレパック`:`Ops template pack`,R=n===`ja`?`トップ20カテゴリ×2(CSV)`:`Top20 category x2 (CSV)`,ae=n===`ja`?`ローカライズ受け渡し(CSV)`:`Localization handoff (CSV)`,z=n===`ja`?`ローカライズCIチェック(MD)`:`Localization CI checklist (MD)`,B=n===`ja`?`ASO変種管理テンプレ(CSV)`:`ASO variant matrix (CSV)`,V=n===`ja`?`日本向けケース資料(MD)`:`Japan case snapshots (MD)`,H=`/app/?sample=5panel&upgrade=1&entry_source=${M}`,U=`/app/?sample=5panel&entry_source=${N}`,W=`/app/?sample=5panel&entry_source=${P}`,G=E?`quick_ship_iphone_only_design_partner_offer`:`first_export_design_partner_offer`,K=E?`quick_ship_iphone_only_pay_first_partner_block`:`first_export_pay_first_partner_block`,q=ee({entrySource:G,preset:`manual_figma`}),J=`/pricing?offer=pay_first&entry_source=${K}`,Y=n===`ja`?`オファー詳細を見る`:`See offer details`,X=t(`common.copy`,{defaultValue:`Copy`}),[oe,Z]=(0,b.useState)(`cli`),Q=oe===`cli`,$=Q?{title:C.cliTitle,body:C.cliBody,cmd:C.cliCmd,cta:`copy_cli_quickstart`}:{title:C.quickstartTitle,body:C.quickstartBody,cmd:C.quickstartCmd,cta:`copy_ci_quickstart`};return s(`titles.firstExport`,{defaultValue:C.title}),(0,b.useEffect)(()=>{r(`tool_view`,{tool:`first_export`}),E&&r(`quick_ship_path_progress`,{step:`first_export_view`})},[E]),(0,x.jsxs)(`div`,{className:`min-h-screen bg-linear-to-b from-slate-950 via-slate-900 to-slate-950 text-white`,children:[(0,x.jsx)(o,{}),(0,x.jsx)(ne,{variant:`dark`,active:`tools`,openAppHref:F,onToolsClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_tools_header`}),onPricingClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`pricing_header`}),onOpenAppClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_app_header`,...D}),primaryCta:{href:I,label:(0,x.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[C.ctas.cli,` `,(0,x.jsx)(c,{size:16})]}),onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_agent_cli_header`})}}),(0,x.jsxs)(`main`,{className:`max-w-5xl mx-auto px-6 pb-24 space-y-12`,children:[(0,x.jsxs)(`section`,{className:`max-w-3xl mx-auto text-center space-y-4`,children:[(0,x.jsxs)(`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`,children:[(0,x.jsx)(re,{size:14}),C.badge]}),(0,x.jsx)(`h1`,{className:`text-3xl md:text-5xl font-black leading-tight`,children:C.title}),(0,x.jsx)(`p`,{className:`text-slate-300 text-lg leading-relaxed`,children:C.subtitle}),(0,x.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 justify-center pt-2`,children:[(0,x.jsxs)(`a`,{href:I,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_agent_cli_hero`}),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`,children:[C.ctas.cli,` `,(0,x.jsx)(c,{size:16})]}),(0,x.jsxs)(`a`,{href:U,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_sample_project_hero`,...D}),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`,children:[C.ctas.sample,` `,(0,x.jsx)(c,{size:16})]})]}),C.agentPrompt&&(0,x.jsx)(y,{sectionId:`agent-handoff`,lang:n,prompt:C.agentPrompt,promptTitle:C.agentPromptTitle,promptBody:C.agentPromptBody,promptNote:C.agentPromptNote,guideHref:`/tools/agent-cli/?entry_source=first_export_agent_handoff#agent-bootstrap`,className:`max-w-4xl mx-auto text-left`,onPromptCopied:e=>r(`tool_cta_click`,{tool:`first_export`,cta:`copy_agent_prompt`,client:e.id}),onBundleCopied:e=>r(`tool_cta_click`,{tool:`first_export`,cta:`copy_bootstrap_bundle_${e.id}`,client:e.id}),onClientCommandCopied:e=>r(`tool_cta_click`,{tool:`first_export`,cta:`copy_client_bootstrap_${e.id}`,client:e.id}),onClientDownload:e=>r(`tool_download`,{tool:`first_export`,asset:`client_bootstrap_${e.id}`,client:e.id}),onGuideClick:(e,t)=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_agent_handoff_guide`,client:t.id})}),(0,x.jsx)(m,{lang:n,className:`max-w-4xl mx-auto text-left`,onPromptCopied:({pathKey:e})=>r(`tool_cta_click`,{tool:`first_export`,cta:`copy_release_fit_prompt`,path:e}),onPathClick:(e,{pathKey:t})=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_release_fit_path`,path:t}),onRequestClick:(e,{pathKey:t})=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_release_fit_request`,path:t,has_app_url:e.currentTarget.href.includes(`appUrl=`)?`yes`:`no`})}),(0,x.jsx)(p,{lang:n,className:`max-w-4xl mx-auto text-left`}),(0,x.jsxs)(`div`,{className:`max-w-xl mx-auto text-left bg-slate-900/60 border border-slate-800 rounded-2xl p-4 space-y-2`,children:[(0,x.jsx)(`div`,{className:`text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:C.quickPathTitle}),C.quickPathBullets?.length>0&&(0,x.jsx)(`ul`,{className:`space-y-1 text-xs text-slate-300`,children:C.quickPathBullets.map(e=>(0,x.jsxs)(`li`,{className:`flex items-start gap-2`,children:[(0,x.jsx)(l,{size:14,className:`mt-0.5 text-green-400 shrink-0`}),(0,x.jsx)(`span`,{children:e})]},e))}),(0,x.jsxs)(`div`,{className:`pt-1 space-y-1.5`,children:[(0,x.jsx)(`div`,{className:`text-[11px] text-slate-500 font-semibold`,children:C.trustTitle}),(0,x.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,x.jsx)(`a`,{href:`/pricing`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_pricing_trust`}),className:`text-[11px] text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:C.trustLinks.pricing}),(0,x.jsx)(`a`,{href:`/terms`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_terms_trust`}),className:`text-[11px] text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:C.trustLinks.terms}),(0,x.jsx)(`a`,{href:`/privacy`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_privacy_trust`}),className:`text-[11px] text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:C.trustLinks.privacy}),(0,x.jsx)(`a`,{href:`/legal`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_legal_trust`}),className:`text-[11px] text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:C.trustLinks.legal}),(0,x.jsx)(`a`,{href:`/security`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_security_trust`}),className:`text-[11px] text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:C.trustLinks.security}),(0,x.jsx)(`a`,{href:`/proof`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_proof_trust`}),className:`text-[11px] text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:C.trustLinks.proof})]}),(0,x.jsxs)(`p`,{className:`text-[11px] text-slate-500`,children:[k,` `,A,`:`,` `,(0,x.jsx)(`a`,{href:`mailto:${O}`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_contact_trust`}),className:`underline underline-offset-4 hover:text-slate-300`,children:O})]})]})]}),(0,x.jsx)(`p`,{className:`text-xs text-slate-500`,children:C.note})]}),(0,x.jsx)(v,{className:`max-w-4xl mx-auto w-full`}),(0,x.jsx)(`section`,{className:`grid md:grid-cols-3 gap-6`,children:C.steps.map((e,t)=>(0,x.jsxs)(`div`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3`,children:[(0,x.jsxs)(`div`,{className:`text-xs font-semibold text-blue-200`,children:[`STEP `,t+1]}),(0,x.jsx)(`div`,{className:`text-lg font-bold text-white`,children:e.title}),(0,x.jsx)(`p`,{className:`text-sm text-slate-300 leading-relaxed`,children:e.body})]},e.title))}),(0,x.jsxs)(`details`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 group`,children:[(0,x.jsxs)(`summary`,{className:`flex items-center justify-between text-sm font-bold text-white cursor-pointer list-none`,children:[(0,x.jsx)(`span`,{children:C.advancedTitle}),(0,x.jsxs)(`span`,{className:`flex items-center gap-2 text-[10px] font-semibold text-slate-400`,children:[`CLI/CI `,(0,x.jsx)(u,{size:14,className:`text-slate-500`})]})]}),(0,x.jsxs)(`div`,{className:`mt-3 space-y-4`,children:[(0,x.jsx)(`p`,{className:`text-sm text-slate-300`,children:C.advancedBody}),(0,x.jsxs)(`div`,{className:`flex flex-col md:flex-row md:items-center md:justify-between gap-3`,children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-2 text-sm font-bold text-white`,children:[Q?(0,x.jsx)(h,{size:16,className:`text-blue-300`}):(0,x.jsx)(l,{size:16,className:`text-blue-300`}),$.title]}),(0,x.jsxs)(`div`,{className:`inline-flex gap-2 rounded-lg border border-slate-700 bg-slate-950 p-1`,children:[(0,x.jsx)(`button`,{type:`button`,onClick:()=>Z(`cli`),className:`px-3 py-1.5 rounded-md text-xs font-semibold transition-colors ${Q?`bg-white text-slate-900`:`text-slate-400 hover:text-slate-200`}`,children:C.cliTitle}),(0,x.jsx)(`button`,{type:`button`,onClick:()=>Z(`ci`),className:`px-3 py-1.5 rounded-md text-xs font-semibold transition-colors ${Q?`text-slate-400 hover:text-slate-200`:`bg-white text-slate-900`}`,children:C.quickstartTitle})]})]}),(0,x.jsx)(`p`,{className:`text-sm text-slate-300`,children:$.body}),(0,x.jsx)(`div`,{className:`rounded-xl border border-slate-800 bg-slate-950 p-4`,children:(0,x.jsx)(`pre`,{className:`text-xs text-slate-200 whitespace-pre-wrap`,children:$.cmd})}),(0,x.jsx)(f,{value:$.cmd,onCopied:()=>r(`tool_cta_click`,{tool:`first_export`,cta:$.cta}),className:`inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg border border-slate-700 bg-slate-950 text-slate-200 hover:bg-slate-900 transition text-sm font-semibold`,children:({copyLabel:e})=>(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(d,{size:14}),e||X]})}),Q&&(0,x.jsxs)(`a`,{href:`/tools/agent-cli/`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_agent_cli`}),className:`inline-flex items-center gap-2 text-sm text-blue-200 hover:text-blue-100 transition-colors`,children:[C.cliCta,` `,(0,x.jsx)(c,{size:14})]}),(0,x.jsxs)(`div`,{className:`pt-1 space-y-2`,children:[(0,x.jsx)(`div`,{className:`text-[10px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:C.heroCliTemplatesLabel}),(0,x.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,x.jsx)(`a`,{href:`/downloads/shipscreens-agent-cli-config.yml`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`config_template`}),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`,children:C.heroCliConfigLabel}),(0,x.jsx)(`a`,{href:`/downloads/shipscreens-agent-cli-copy.csv`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`copy_template`}),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`,children:C.heroCliCsvLabel})]})]}),(0,x.jsxs)(`div`,{className:`pt-1 space-y-2`,children:[(0,x.jsx)(`div`,{className:`text-[10px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:C.heroCiTemplatesLabel}),(0,x.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,x.jsx)(`a`,{href:`/downloads/shipscreens-github-actions-template.yml`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`ci_template_github_actions`}),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`,children:C.heroCiGithubLabel}),(0,x.jsx)(`a`,{href:`/downloads/shipscreens-bitrise-template.yml`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`ci_template_bitrise`}),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`,children:C.heroCiBitriseLabel})]})]}),(0,x.jsxs)(`div`,{className:`pt-1 space-y-2`,children:[(0,x.jsx)(`div`,{className:`text-[10px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:L}),(0,x.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,x.jsx)(`a`,{href:`/downloads/shipscreens-top20-category-headline-pack-2026-02.csv`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`top20_category_pack_csv`}),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`,children:R}),(0,x.jsx)(`a`,{href:`/downloads/shipscreens-localization-handoff-template.csv`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`localization_handoff_csv`}),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`,children:ae}),(0,x.jsx)(`a`,{href:`/downloads/shipscreens-localization-ci-checklist-2026-02.md`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`localization_ci_checklist_md`}),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`,children:z}),(0,x.jsx)(`a`,{href:`/downloads/shipscreens-aso-variant-matrix-template.csv`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`aso_variant_matrix_csv`}),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`,children:B}),(0,x.jsx)(`a`,{href:`/downloads/shipscreens-japan-case-snapshots-2026-02.md`,download:!0,onClick:()=>r(`tool_download`,{tool:`first_export`,asset:`jp_case_snapshots_md`}),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`,children:V})]})]}),(0,x.jsxs)(`div`,{className:`text-left bg-slate-900/60 border border-slate-800 rounded-2xl p-4 space-y-2`,children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-2 text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:[(0,x.jsx)(h,{size:14,className:`text-blue-300`}),C.demoTitle]}),(0,x.jsx)(`p`,{className:`text-xs text-slate-400`,children:C.demoBody}),(0,x.jsx)(`div`,{className:`rounded-xl border border-slate-800 bg-slate-950 p-3`,children:(0,x.jsx)(`pre`,{className:`text-xs text-slate-200 whitespace-pre-wrap`,children:C.demoCmd})}),(0,x.jsx)(f,{value:C.demoCmd,onCopied:()=>r(`tool_cta_click`,{tool:`first_export`,cta:`copy_demo_cmd`}),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`,children:({copyLabel:e,copyState:t})=>(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(d,{size:14}),t===`idle`?X:e||X]})}),C.demoBullets?.length>0&&(0,x.jsx)(`ul`,{className:`space-y-1 text-xs text-slate-300 pt-1`,children:C.demoBullets.map(e=>(0,x.jsxs)(`li`,{className:`flex items-start gap-2`,children:[(0,x.jsx)(l,{size:14,className:`mt-0.5 text-green-400 shrink-0`}),(0,x.jsx)(`span`,{children:e})]},e))}),C.demoNote&&(0,x.jsx)(`div`,{className:`text-[11px] text-slate-500`,children:C.demoNote})]}),(0,x.jsx)(g,{compact:!0,href:`/tools/agent-cli/#preflight`,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_cli_preflight`}),className:`max-w-xl`})]})]}),(0,x.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4`,children:[(0,x.jsx)(`div`,{className:`text-lg font-bold text-white`,children:C.proTitle}),(0,x.jsx)(`ul`,{className:`space-y-2 text-sm text-slate-300`,children:C.proBullets.map(e=>(0,x.jsxs)(`li`,{className:`flex items-center gap-2`,children:[(0,x.jsx)(l,{size:16,className:`text-green-400`}),e]},e))}),(0,x.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 pt-2`,children:[(0,x.jsxs)(`a`,{href:H,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`go_pro_footer`,...D}),className:`inline-flex items-center justify-center gap-2 px-5 py-3 rounded-xl bg-white text-slate-900 font-bold hover:scale-[1.02] transition`,children:[C.ctas.goPro,` `,(0,x.jsx)(c,{size:16})]}),(0,x.jsxs)(`a`,{href:W,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_sample_project_footer`,...D}),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 hover:bg-slate-900 transition`,children:[C.ctas.sample,` `,(0,x.jsx)(c,{size:16})]})]}),(0,x.jsxs)(`div`,{className:`pt-4 border-t border-slate-800/80 space-y-2`,children:[(0,x.jsx)(`div`,{className:`text-sm font-bold text-white`,children:C.proUnlockTitle}),C.proUnlockBody&&(0,x.jsx)(`p`,{className:`text-sm text-slate-300`,children:C.proUnlockBody}),(0,x.jsx)(`div`,{className:`rounded-xl border border-slate-800 bg-slate-950/80 p-4`,children:(0,x.jsx)(`pre`,{className:`text-xs text-slate-200 whitespace-pre-wrap`,children:C.proUnlockCmd})}),(0,x.jsx)(`div`,{className:`flex flex-col sm:flex-row gap-3`,children:(0,x.jsx)(f,{value:C.proUnlockCmd,onCopied:()=>r(`tool_cta_click`,{tool:`first_export`,cta:`copy_cli_pro_unlock`}),className:`inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg border border-slate-700 bg-slate-950 text-slate-200 hover:bg-slate-900 transition text-sm font-semibold`,children:({copyLabel:e})=>(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(d,{size:14}),e||X]})})}),C.proUnlockNote&&(0,x.jsx)(`div`,{className:`text-xs text-slate-500`,children:C.proUnlockNote})]})]}),(0,x.jsxs)(`section`,{id:`design-partner`,className:`max-w-3xl mx-auto bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4`,children:[(0,x.jsx)(`div`,{className:`text-lg font-bold text-white`,children:w.title||t(`landing.partner.title`)}),(0,x.jsx)(`div`,{className:`text-sm text-slate-300 leading-relaxed`,children:w.body||t(`landing.partner.body`)}),T.length>0&&(0,x.jsx)(`ul`,{className:`space-y-2 text-sm text-slate-300 list-disc pl-5`,children:T.map(e=>(0,x.jsx)(`li`,{children:e},e))}),(0,x.jsxs)(`a`,{href:q,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_design_partner_offer`,...D}),className:`inline-flex items-center gap-2 text-sm text-blue-200 hover:text-blue-100 underline underline-offset-4`,children:[Y,` `,(0,x.jsx)(c,{size:14})]}),(0,x.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3`,children:[(0,x.jsxs)(`a`,{href:q,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_design_partner_offer_primary`,...D}),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`,children:[w.jumpCta||Y,` `,(0,x.jsx)(c,{size:16})]}),(0,x.jsx)(`a`,{href:`https://x.com/shipscreenscom`,target:`_blank`,rel:`noopener noreferrer`,onClick:()=>r(`tool_cta_click`,{tool:`first_export`,cta:`dm_design_partner`,...D}),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`,children:w.dmCta||t(`landing.partner.dmCta`)}),(0,x.jsxs)(`a`,{href:J,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`open_pay_first_from_partner_block`,...D}),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-semibold hover:bg-emerald-500/15 transition`,children:[w.payFirstCta||t(`landing.partner.payFirstCta`),` `,(0,x.jsx)(c,{size:16})]})]}),(0,x.jsxs)(`div`,{className:`text-xs text-slate-500`,children:[w.emailLabel||t(`landing.partner.emailLabel`),` `,(0,x.jsx)(`a`,{href:`mailto:${O}`,className:`underline underline-offset-4 hover:text-white`,children:O})]})]})]}),(0,x.jsx)(_,{note:C.note,primary:{label:C.ctas.cli,href:I,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`sticky_primary_agent`})},secondary:{label:C.ctas.sample,href:U,onClick:e=>i(e,`tool_cta_click`,{tool:`first_export`,cta:`sticky_secondary_sample`,...D})}})]})};export{C as default};
|
|
6
|
+
//# sourceMappingURL=FirstExport-qfY7uE8r.js.map
|