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":"ReleaseFitIntake-DBeb9AFJ.js","names":["__iconNode","__iconNode"],"sources":["../../node_modules/lucide-react/dist/esm/icons/route.mjs","../../node_modules/lucide-react/dist/esm/icons/timer.mjs","../../node_modules/lucide-react/dist/esm/icons/workflow.mjs","../../src/components/AgentReportPreview.jsx","../../src/components/ReleaseFitIntake.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: \"6\", cy: \"19\", r: \"3\", key: \"1kj8tv\" }],\n [\"path\", { d: \"M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15\", key: \"1d8sl\" }],\n [\"circle\", { cx: \"18\", cy: \"5\", r: \"3\", key: \"gq8acd\" }]\n];\nconst Route = createLucideIcon(\"route\", __iconNode);\n\nexport { __iconNode, Route as default };\n//# sourceMappingURL=route.mjs.map\n","/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"line\", { x1: \"10\", x2: \"14\", y1: \"2\", y2: \"2\", key: \"14vaq8\" }],\n [\"line\", { x1: \"12\", x2: \"15\", y1: \"14\", y2: \"11\", key: \"17fdiu\" }],\n [\"circle\", { cx: \"12\", cy: \"14\", r: \"8\", key: \"1e1u0o\" }]\n];\nconst Timer = createLucideIcon(\"timer\", __iconNode);\n\nexport { __iconNode, Timer as default };\n//# sourceMappingURL=timer.mjs.map\n","/**\n * @license lucide-react v1.18.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"8\", height: \"8\", x: \"3\", y: \"3\", rx: \"2\", key: \"by2w9f\" }],\n [\"path\", { d: \"M7 11v4a2 2 0 0 0 2 2h4\", key: \"xkn7yn\" }],\n [\"rect\", { width: \"8\", height: \"8\", x: \"13\", y: \"13\", rx: \"2\", key: \"1cgmvn\" }]\n];\nconst Workflow = createLucideIcon(\"workflow\", __iconNode);\n\nexport { __iconNode, Workflow as default };\n//# sourceMappingURL=workflow.mjs.map\n","import React from 'react';\nimport { AlertTriangle, CheckCircle2, FileText, FolderTree } from 'lucide-react';\n\nconst COPY = {\n en: {\n eyebrow: 'Proof artifact',\n title: 'What the agent returns after agent-run --stage',\n body:\n 'Command success is not the handoff. The agent should return the staged upload root plus JSON and Markdown reports that a human can review before unlock or upload.',\n pathsTitle: 'Default artifacts',\n paths: [\n { label: 'Staged upload root', value: 'out/agent-stage', Icon: FolderTree },\n { label: 'Machine-readable report', value: 'out/agent/shipscreens.agent-report.json', Icon: FileText },\n { label: 'Human summary', value: 'out/agent/shipscreens.agent-summary.md', Icon: FileText },\n ],\n checksTitle: 'Report should answer',\n checks: [\n 'Which config, profile, mode, and command ran.',\n 'Which locale/device/slide counts passed.',\n 'Where the staged iOS or Android upload roots are.',\n 'Which warnings and paid/unlock next steps remain.',\n ],\n codeTitle: 'Example report shape',\n code: `{\n \"command\": \"agent-run\",\n \"status\": \"ok\",\n \"profile\": \"appstore\",\n \"outputs\": {\n \"stageRoot\": \"out/agent-stage\",\n \"reportJson\": \"out/agent/shipscreens.agent-report.json\"\n },\n \"nextSteps\": [\n \"Review the staged upload root before store submission.\",\n \"Unlock Pro, then rerun with --require-pro.\"\n ]\n}`,\n warning: 'If the report is missing, rerun with --stage or pass --report-json / --report-md.',\n },\n ja: {\n eyebrow: 'Proof artifact',\n title: 'agent-run --stage のあとに agent が返すもの',\n body:\n 'コマンドが成功しただけでは引き継ぎ完了ではありません。agent は staged upload root と JSON/Markdown の report を返し、人間が Pro 解除やアップロード前に確認できる状態にします。',\n pathsTitle: '標準 artifacts',\n paths: [\n { label: '提出用 staging root', value: 'out/agent-stage', Icon: FolderTree },\n { label: '機械可読 report', value: 'out/agent/shipscreens.agent-report.json', Icon: FileText },\n { label: '人間向け summary', value: 'out/agent/shipscreens.agent-summary.md', Icon: FileText },\n ],\n checksTitle: 'report が答えること',\n checks: [\n 'どの config / profile / mode / command で実行したか。',\n 'どの locale / device / slide 数が通ったか。',\n 'iOS または Android の staged upload root がどこか。',\n '残っている警告と Pro 解除/次アクションは何か。',\n ],\n codeTitle: 'report の例',\n code: `{\n \"command\": \"agent-run\",\n \"status\": \"ok\",\n \"profile\": \"appstore\",\n \"outputs\": {\n \"stageRoot\": \"out/agent-stage\",\n \"reportJson\": \"out/agent/shipscreens.agent-report.json\"\n },\n \"nextSteps\": [\n \"Review the staged upload root before store submission.\",\n \"Unlock Pro, then rerun with --require-pro.\"\n ]\n}`,\n warning: 'report がない場合は --stage、または --report-json / --report-md を付けて再実行します。',\n },\n};\n\nconst normalizeLang = (lang) => ((lang || '').split('-')[0] === 'ja' ? 'ja' : 'en');\n\nconst AgentReportPreview = ({ lang = 'en', sectionId = 'agent-report-preview', className = '' }) => {\n const copy = COPY[normalizeLang(lang)];\n\n return (\n <section\n id={sectionId}\n className={`scroll-mt-24 rounded-2xl border border-emerald-500/25 bg-slate-900/70 p-5 space-y-5 ${className}`.trim()}\n >\n <div className=\"space-y-2\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-emerald-200 font-semibold\">{copy.eyebrow}</div>\n <h2 className=\"text-xl font-bold text-white\">{copy.title}</h2>\n <p className=\"text-sm text-slate-300 leading-relaxed\">{copy.body}</p>\n </div>\n\n <div className=\"grid lg:grid-cols-[0.9fr_1.1fr] gap-5 items-start\">\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <div className=\"text-sm font-bold text-white\">{copy.pathsTitle}</div>\n <div className=\"grid gap-2\">\n {copy.paths.map(({ label, value, Icon }) => (\n <div key={value} className=\"rounded-xl border border-slate-800 bg-slate-950/80 p-3 flex items-start gap-3\">\n <Icon size={16} className=\"mt-0.5 text-emerald-300 shrink-0\" />\n <div className=\"min-w-0\">\n <div className=\"text-xs text-slate-400\">{label}</div>\n <code className=\"block text-xs text-slate-100 break-words\">{value}</code>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"text-sm font-bold text-white\">{copy.checksTitle}</div>\n <ul className=\"space-y-2 text-sm text-slate-300\">\n {copy.checks.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <CheckCircle2 size={15} className=\"mt-0.5 text-emerald-300 shrink-0\" />\n <span>{item}</span>\n </li>\n ))}\n </ul>\n </div>\n </div>\n\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950/90 p-4 space-y-3\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold\">{copy.codeTitle}</div>\n <pre className=\"text-xs text-slate-200 whitespace-pre-wrap overflow-x-auto\">{copy.code}</pre>\n <div className=\"flex items-start gap-2 rounded-xl border border-amber-400/20 bg-amber-500/10 p-3 text-xs text-amber-100\">\n <AlertTriangle size={14} className=\"mt-0.5 shrink-0\" />\n <span>{copy.warning}</span>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default AgentReportPreview;\n","import React, { useMemo, useState } from 'react';\nimport { ArrowRight, CheckCircle2, ClipboardCopy, Route, Timer, Workflow } from 'lucide-react';\nimport CopyButton from './CopyButton';\nimport { buildReleaseFitDesignPartnerHref } from '../lib/designPartnerPrefill';\n\nconst OPTIONS = {\n en: {\n timeline: [\n { id: 'this_week', label: 'This week' },\n { id: 'this_month', label: 'This month' },\n { id: 'later', label: 'Later' },\n ],\n workflow: [\n { id: 'design_stack', label: 'Figma / Canva / AI' },\n { id: 'fastlane_ci', label: 'Fastlane / CI' },\n { id: 'manual_browser', label: 'Manual / browser' },\n ],\n scope: [\n { id: 'iphone_first', label: 'iPhone first' },\n { id: 'ios_android', label: 'iOS + Android' },\n { id: 'matrix', label: '2+ locales / devices' },\n ],\n blocker: [\n { id: 'panel_clarity', label: 'Panel #1 clarity' },\n { id: 'upload_roots', label: 'Fastlane roots' },\n { id: 'review_risk', label: 'Review / iPad risk' },\n { id: 'matrix_drift', label: 'Locale/device drift' },\n ],\n },\n ja: {\n timeline: [\n { id: 'this_week', label: '今週' },\n { id: 'this_month', label: '今月' },\n { id: 'later', label: '未定 / 後で' },\n ],\n workflow: [\n { id: 'design_stack', label: 'Figma / Canva / AI' },\n { id: 'fastlane_ci', label: 'Fastlane / CI' },\n { id: 'manual_browser', label: '手作業 / browser' },\n ],\n scope: [\n { id: 'iphone_first', label: 'iPhone first' },\n { id: 'ios_android', label: 'iOS + Android' },\n { id: 'matrix', label: '2+ 言語 / 端末' },\n ],\n blocker: [\n { id: 'panel_clarity', label: '1枚目訴求' },\n { id: 'upload_roots', label: 'Fastlane root' },\n { id: 'review_risk', label: '審査 / iPad' },\n { id: 'matrix_drift', label: '言語/端末 drift' },\n ],\n },\n};\n\nconst COPY = {\n en: {\n eyebrow: 'Release-fit intake',\n title: 'Choose the release path before the agent runs',\n body:\n 'The first decision is not template style. Pick the release context so the agent runs the smallest useful path and returns the right proof.',\n groups: {\n appUrl: 'App / store URL',\n timeline: 'Release timing',\n workflow: 'Current workflow',\n scope: 'Scope',\n blocker: 'Main blocker',\n },\n appUrlPlaceholder: 'https://apps.apple.com/... or https://play.google.com/...',\n recommendation: 'Recommended path',\n why: 'Why this path',\n firstRun: 'First run',\n report: 'Expected report proof',\n copyPrompt: 'Copy release-fit agent prompt',\n requestCta: 'Request release-fit review',\n openCta: 'Open this path',\n copiedLabel: 'Copied',\n paths: {\n iphone_quick: {\n title: 'iPhone-first quick ship',\n href: '/tools/first-export/?entry_source=release_fit_intake_iphone#agent-handoff',\n why: 'Best when the release is near and the safest first proof is a small 5-panel iPhone export.',\n firstRun: 'Run agent-run --stage in raw mode, then review panel order, 01..05 naming, and staged upload roots.',\n report: 'out/agent-stage plus JSON/Markdown report with warnings and Pro unlock next step.',\n },\n fastlane_ci: {\n title: 'Fastlane / CI release contract',\n href: '/tools/agent-cli/?entry_source=release_fit_intake_fastlane#agent-bootstrap',\n why: 'Best when existing screenshots are fine but Fastlane paths, CI reruns, or upload roots drift.',\n firstRun: 'Let the agent inspect the repo, choose MCP or CLI, then run validate/copy check/agent-run --stage.',\n report: 'Config, profile, staged roots, failed checks, and next CI command.',\n },\n locale_matrix: {\n title: 'Locale/device matrix',\n href: '/tools/screenshot-workload-calculator/?entry_source=release_fit_intake_matrix',\n why: 'Best when the main risk is multiplying screenshots across locales, devices, or stores.',\n firstRun: 'Trim the matrix first, then run a smaller staged proof before expanding.',\n report: 'Locale/device counts, missing slots, staged roots, and expansion warning list.',\n },\n aso_review: {\n title: 'ASO / App Review gate',\n href: '/tools/app-review-aso/?entry_source=release_fit_intake_aso',\n why: 'Best when screenshot #1 is vague, claims need review, or iPad/App Review risk is the blocker.',\n firstRun: 'Lock panel #1, review-safe claims, iPad scope, then run agent-run --stage.',\n report: 'Panel clarity notes, review-safe warnings, staged roots, and exact next fixes.',\n },\n },\n promptIntro: 'Use ShipScreens as the build step for our mobile release screenshots.',\n },\n ja: {\n eyebrow: 'Release-fit intake',\n title: 'agent を動かす前にリリースパスを選ぶ',\n body:\n '最初に決めるのはテンプレの見た目ではありません。リリース文脈を選び、agent が最小の有効パスを実行して正しい proof を返せるようにします。',\n groups: {\n appUrl: 'アプリ / store URL',\n timeline: 'リリース時期',\n workflow: '現在の運用',\n scope: 'スコープ',\n blocker: '主な blocker',\n },\n appUrlPlaceholder: 'https://apps.apple.com/... または https://play.google.com/...',\n recommendation: '推奨パス',\n why: 'このパスの理由',\n firstRun: '最初の実行',\n report: '期待する report proof',\n copyPrompt: 'release-fit agent prompt をコピー',\n requestCta: 'release-fit review を依頼',\n openCta: 'このパスを開く',\n copiedLabel: 'コピー済み',\n paths: {\n iphone_quick: {\n title: 'iPhone-first quick ship',\n href: '/tools/first-export/?entry_source=release_fit_intake_iphone#agent-handoff',\n why: 'リリースが近く、まず5枚構成の iPhone export proof を小さく確認するのが安全な場合。',\n firstRun: 'raw mode の agent-run --stage を実行し、訴求順、01..05 命名、staged upload root を確認。',\n report: 'out/agent-stage と JSON/Markdown report。警告と Pro 解除の次アクションを含む。',\n },\n fastlane_ci: {\n title: 'Fastlane / CI release contract',\n href: '/tools/agent-cli/?entry_source=release_fit_intake_fastlane#agent-bootstrap',\n why: '既存スクショはあるが、Fastlane path、CI 再実行、upload root が崩れる場合。',\n firstRun: 'agent が repo を確認し、MCP か CLI を選び、validate/copy check/agent-run --stage を実行。',\n report: 'config、profile、staged root、失敗した check、次の CI command。',\n },\n locale_matrix: {\n title: 'Locale/device matrix',\n href: '/tools/screenshot-workload-calculator/?entry_source=release_fit_intake_matrix',\n why: '主なリスクが言語、端末、ストア展開によるスクショ枚数と drift の増加である場合。',\n firstRun: 'まず matrix を削り、小さな staged proof を作ってから拡張。',\n report: 'locale/device 数、missing slot、staged root、拡張時の warning list。',\n },\n aso_review: {\n title: 'ASO / App Review gate',\n href: '/tools/app-review-aso/?entry_source=release_fit_intake_aso',\n why: '1枚目が曖昧、訴求や claim の安全性、iPad/App Review リスクが blocker の場合。',\n firstRun: '1枚目訴求、審査で安全な表現、iPad scope を固定してから agent-run --stage。',\n report: '訴求 clarity、review-safe warning、staged root、次に直す箇所。',\n },\n },\n promptIntro: 'このモバイルアプリのリリース用スクリーンショットは、ShipScreens をビルド工程として使って進めてください。',\n },\n};\n\nconst normalizeLang = (lang) => ((lang || '').split('-')[0] === 'ja' ? 'ja' : 'en');\n\nconst selectPath = ({ workflow, scope, blocker }) => {\n if (workflow === 'fastlane_ci' || blocker === 'upload_roots') return 'fastlane_ci';\n if (scope === 'matrix' || blocker === 'matrix_drift') return 'locale_matrix';\n if (blocker === 'panel_clarity' || blocker === 'review_risk') return 'aso_review';\n return 'iphone_quick';\n};\n\nconst labelFor = (options, key, id) => options[key].find((item) => item.id === id)?.label || id;\n\nconst OptionGroup = ({ label, options, value, onChange }) => (\n <div className=\"space-y-2\">\n <div className=\"text-xs font-semibold text-slate-400\">{label}</div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-2\">\n {options.map((item) => {\n const active = item.id === value;\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => onChange(item.id)}\n className={`min-h-10 rounded-xl border px-3 py-2 text-xs font-semibold transition ${\n active\n ? 'border-cyan-300 bg-cyan-400/10 text-white'\n : 'border-slate-800 bg-slate-950 text-slate-300 hover:bg-slate-900'\n }`}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n);\n\nconst ReleaseFitIntake = ({\n lang = 'en',\n sectionId = 'release-fit-intake',\n className = '',\n requestHref = '',\n onPromptCopied,\n onPathClick,\n onRequestClick,\n}) => {\n const locale = normalizeLang(lang);\n const copy = COPY[locale];\n const options = OPTIONS[locale];\n const [answers, setAnswers] = useState({\n timeline: 'this_week',\n workflow: 'design_stack',\n scope: 'iphone_first',\n blocker: 'panel_clarity',\n });\n const [appUrl, setAppUrl] = useState('');\n\n const pathKey = selectPath(answers);\n const path = copy.paths[pathKey];\n const resolvedRequestHref =\n requestHref ||\n buildReleaseFitDesignPartnerHref({\n answers,\n pathKey,\n appUrl,\n });\n const prompt = useMemo(() => {\n const fields = [\n appUrl.trim() ? `${copy.groups.appUrl}: ${appUrl.trim()}` : '',\n `${copy.groups.timeline}: ${labelFor(options, 'timeline', answers.timeline)}`,\n `${copy.groups.workflow}: ${labelFor(options, 'workflow', answers.workflow)}`,\n `${copy.groups.scope}: ${labelFor(options, 'scope', answers.scope)}`,\n `${copy.groups.blocker}: ${labelFor(options, 'blocker', answers.blocker)}`,\n `${copy.recommendation}: ${path.title}`,\n ].filter(Boolean);\n const suffix =\n locale === 'ja'\n ? '既存のデザイン運用は維持し、この repo を確認して、workspace-local MCP が使えるなら MCP、無ければ CLI を選び、PNGフォルダが無ければ接続端末/エミュレータの現在画面を capture し、最小の有効スコープで agent-run --stage を実行し、out/agent-stage と shipscreens.agent-report.json / shipscreens.agent-summary.md のパス、警告、次アクションを短く返してください。端末/言語スコープ、1枚目訴求、ストアアップロード承認が不明なときだけ確認してください。'\n : 'Keep the existing design workflow, inspect this repo, choose workspace-local MCP if available otherwise CLI, capture current device/emulator screens if no screenshot folder exists, run agent-run --stage for the smallest useful scope, and return the out/agent-stage path plus shipscreens.agent-report.json / shipscreens.agent-summary.md paths, warnings, and next steps. Only ask me if device or locale scope, panel #1 messaging, or store-upload approval is unclear.';\n\n return `${copy.promptIntro}\\n\\nRelease context:\\n- ${fields.join('\\n- ')}\\n\\n${suffix}`;\n }, [answers, appUrl, copy, locale, options, path.title]);\n\n const setAnswer = (key) => (value) => setAnswers((current) => ({ ...current, [key]: value }));\n\n return (\n <section\n id={sectionId}\n className={`scroll-mt-24 rounded-2xl border border-cyan-500/25 bg-slate-900/70 p-5 space-y-5 ${className}`.trim()}\n >\n <div className=\"space-y-2\">\n <div className=\"text-[11px] uppercase tracking-[0.2em] text-cyan-200 font-semibold\">{copy.eyebrow}</div>\n <h2 className=\"text-xl font-bold text-white\">{copy.title}</h2>\n <p className=\"text-sm text-slate-300 leading-relaxed\">{copy.body}</p>\n </div>\n\n <div className=\"grid lg:grid-cols-[1.05fr_0.95fr] gap-5 items-start\">\n <div className=\"space-y-4\">\n <label className=\"block space-y-2\">\n <span className=\"text-xs font-semibold text-slate-400\">{copy.groups.appUrl}</span>\n <input\n type=\"url\"\n value={appUrl}\n onChange={(event) => setAppUrl(event.target.value)}\n placeholder={copy.appUrlPlaceholder}\n className=\"w-full rounded-xl border border-slate-800 bg-slate-950 px-3 py-2 text-sm text-white placeholder:text-slate-600 outline-none focus:border-cyan-300\"\n />\n </label>\n <OptionGroup\n label={copy.groups.timeline}\n options={options.timeline}\n value={answers.timeline}\n onChange={setAnswer('timeline')}\n />\n <OptionGroup\n label={copy.groups.workflow}\n options={options.workflow}\n value={answers.workflow}\n onChange={setAnswer('workflow')}\n />\n <OptionGroup label={copy.groups.scope} options={options.scope} value={answers.scope} onChange={setAnswer('scope')} />\n <OptionGroup\n label={copy.groups.blocker}\n options={options.blocker}\n value={answers.blocker}\n onChange={setAnswer('blocker')}\n />\n </div>\n\n <div className=\"rounded-2xl border border-slate-800 bg-slate-950/90 p-4 space-y-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold\">\n <Route size={14} className=\"text-cyan-300\" />\n {copy.recommendation}\n </div>\n <h3 className=\"text-lg font-bold text-white\">{path.title}</h3>\n </div>\n\n <div className=\"space-y-3 text-sm\">\n <div className=\"flex items-start gap-2 text-slate-300\">\n <CheckCircle2 size={16} className=\"mt-0.5 text-emerald-300 shrink-0\" />\n <span>\n <span className=\"font-semibold text-slate-100\">{copy.why}: </span>\n {path.why}\n </span>\n </div>\n <div className=\"flex items-start gap-2 text-slate-300\">\n <Workflow size={16} className=\"mt-0.5 text-blue-300 shrink-0\" />\n <span>\n <span className=\"font-semibold text-slate-100\">{copy.firstRun}: </span>\n {path.firstRun}\n </span>\n </div>\n <div className=\"flex items-start gap-2 text-slate-300\">\n <Timer size={16} className=\"mt-0.5 text-amber-300 shrink-0\" />\n <span>\n <span className=\"font-semibold text-slate-100\">{copy.report}: </span>\n {path.report}\n </span>\n </div>\n </div>\n\n <div className=\"rounded-xl border border-slate-800 bg-slate-950 p-3\">\n <pre className=\"text-xs text-slate-200 whitespace-pre-wrap\">{prompt}</pre>\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-2\">\n <CopyButton\n value={prompt}\n onCopied={() => onPromptCopied?.({ pathKey, answers })}\n className=\"inline-flex items-center justify-center gap-2 px-3 py-2 rounded-lg border border-cyan-500/40 bg-cyan-500/10 text-cyan-100 hover:bg-cyan-500/15 transition text-xs font-semibold\"\n >\n {({ copyLabel, copyState }) => (\n <>\n <ClipboardCopy size={14} />\n {copyState === 'idle' ? copy.copyPrompt : copyLabel || copy.copiedLabel}\n </>\n )}\n </CopyButton>\n <a\n href={path.href}\n onClick={(event) => onPathClick?.(event, { pathKey, answers })}\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 {copy.openCta} <ArrowRight size={14} />\n </a>\n <a\n href={resolvedRequestHref}\n onClick={(event) => onRequestClick?.(event, { pathKey, answers, appUrl })}\n className=\"inline-flex items-center justify-center gap-2 px-3 py-2 rounded-lg bg-blue-500 text-white hover:bg-blue-600 transition text-xs font-semibold\"\n >\n {copy.requestCta} <ArrowRight size={14} />\n </a>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ReleaseFitIntake;\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,n as r}from"./index-D7D6ZRCW.js";import{n as i,t as a}from"./circle-check-X08qqy40.js";import{i as o,n as s,r as c,t as l}from"./designPartnerRequest-DYqMElJd.js";var u=e(t(),1),d=n(),f={en:{badge:`Warm lead request`,title:`Send the prefilled async review request from this page`,body:`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.`,emailLabel:`Work email`,appLabel:`App / URL`,reviewModeLabel:`Reply mode`,reviewModeValues:{async_email:`Async email review`,live_call:`15-min live call`},submitCta:`Send prefilled request now`,submitLoading:`Sending request...`,submitSuccess:`Request sent. We will reply within 1 business day.`,submitSuccessNoCopy:`Request sent. We could not send a copy to your inbox, but the request is recorded.`,submitError:`Direct request failed. Use the review or pay-first path below as fallback.`},ja:{badge:`warm lead request`,title:`このページから async review をそのまま依頼できます`,body:`通話は必須ではありません。この release thread にメールアドレスは紐づいているので、この場で依頼を送れば 1営業日以内に最初の release-risk teardown と次の提案をメールで返します。`,emailLabel:`メールアドレス`,appLabel:`アプリ名 / URL`,reviewModeLabel:`返信方法`,reviewModeValues:{async_email:`メールで async review`,live_call:`15分の live call`},submitCta:`この内容で今すぐ依頼する`,submitLoading:`依頼を送信中...`,submitSuccess:`依頼を受け付けました。1営業日以内に返信します。`,submitSuccessNoCopy:`依頼は受け付けました。控えメールは送れませんでしたが、内容は記録済みです。`,submitError:`直接送信に失敗しました。下の review または pay-first 導線を使ってください。`}},p={dark:{container:`border-cyan-400/30 bg-cyan-500/10`,badge:`border-cyan-300/30 bg-cyan-400/10 text-cyan-100`,title:`text-white`,body:`text-cyan-50/90`,metaCard:`border-black/5 bg-white/40`,metaLabel:`text-cyan-200/80`,metaValue:`text-cyan-50`,button:`bg-cyan-500 text-slate-950 hover:bg-cyan-400 disabled:bg-cyan-500/50`,success:`text-emerald-200`,error:`text-rose-200`},light:{container:`border-cyan-200 bg-cyan-50`,badge:`border-cyan-200 bg-white text-cyan-700`,title:`text-slate-900`,body:`text-slate-700`,metaCard:`border-slate-200 bg-white`,metaLabel:`text-slate-500`,metaValue:`text-slate-900`,button:`bg-cyan-600 text-white hover:bg-cyan-700 disabled:bg-cyan-400`,success:`text-emerald-700`,error:`text-rose-700`}},m=({lang:e=`en`,variant:t=`light`,form:n={},attribution:m={},entrySource:h=``,leadId:g=``,sourcePage:_=`pricing`,submitSurface:v=`sales_entry_quick_card`,className:y=``})=>{let b=f[e]||f.en,x=p[t]||p.light,S=c({form:n,defaultReviewMode:`async_email`}),C=l(n,{leadId:g,defaultReviewMode:`async_email`}),w=b.reviewModeValues?.[S.reviewMode]||b.reviewModeValues?.async_email||``,T=(0,u.useRef)(!1),[E,D]=(0,u.useState)(!1),[O,k]=(0,u.useState)({status:`idle`,confirmationSent:!0,requestId:``});return(0,u.useEffect)(()=>{if(!S.contactEmail){T.current=!1;return}T.current||(T.current=!0,r(`design_partner_prefilled_request_ready`,{submit_surface:v,entry_source:h||void 0,sales_entry:`yes`,lead_id:g||void 0,...C}))},[h,n.appUrl,n.contactEmail,n.contactName,g,S.contactEmail,C,v]),S.contactEmail?(0,d.jsxs)(`section`,{className:`rounded-2xl border p-5 space-y-4 ${x.container} ${y}`.trim(),children:[(0,d.jsxs)(`div`,{className:`inline-flex items-center gap-2 rounded-full border px-3 py-1 text-[11px] font-semibold ${x.badge}`,children:[(0,d.jsx)(a,{size:14}),b.badge]}),(0,d.jsxs)(`div`,{className:`space-y-2`,children:[(0,d.jsx)(`h2`,{className:`text-lg font-bold ${x.title}`,children:b.title}),(0,d.jsx)(`p`,{className:`text-sm leading-relaxed ${x.body}`,children:b.body})]}),(0,d.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-3`,children:[(0,d.jsxs)(`div`,{className:`rounded-xl border px-4 py-3 ${x.metaCard}`,children:[(0,d.jsx)(`div`,{className:`text-[11px] font-semibold uppercase tracking-[0.16em] ${x.metaLabel}`,children:b.emailLabel}),(0,d.jsx)(`div`,{className:`mt-1 break-all text-sm font-semibold ${x.metaValue}`,children:S.contactEmail})]}),S.appLabel?(0,d.jsxs)(`div`,{className:`rounded-xl border px-4 py-3 ${x.metaCard}`,children:[(0,d.jsx)(`div`,{className:`text-[11px] font-semibold uppercase tracking-[0.16em] ${x.metaLabel}`,children:b.appLabel}),(0,d.jsx)(`div`,{className:`mt-1 break-all text-sm font-semibold ${x.metaValue}`,children:S.appLabel})]}):null,(0,d.jsxs)(`div`,{className:`rounded-xl border px-4 py-3 ${x.metaCard}`,children:[(0,d.jsx)(`div`,{className:`text-[11px] font-semibold uppercase tracking-[0.16em] ${x.metaLabel}`,children:b.reviewModeLabel}),(0,d.jsx)(`div`,{className:`mt-1 break-all text-sm font-semibold ${x.metaValue}`,children:w})]})]}),(0,d.jsxs)(`button`,{type:`button`,onClick:async t=>{if(t.preventDefault(),E)return;let i=s({form:n,attribution:m,entrySource:h,leadId:g,lang:e,sourcePage:_,pagePath:typeof window<`u`?window.location.pathname:``,pageUrl:typeof window<`u`?window.location.href:``,defaultReviewMode:`async_email`});r(`design_partner_cta_click`,{cta:`submit_prefilled_request`,channel:`direct_request`,submit_surface:v,entry_source:h||void 0,sales_entry:`yes`,...C});try{D(!0);let e=await o(i);k({status:`success`,confirmationSent:e?.confirmationSent!==!1,requestId:e?.requestId||``}),r(`design_partner_request_submitted`,{channel:`direct_request`,confirmation_sent:e?.confirmationSent===!1?`no`:`yes`,submit_surface:v,entry_source:h||void 0,sales_entry:`yes`,...C})}catch(e){console.error(`Failed to submit sales-entry request`,e),k({status:`error`,confirmationSent:!1,requestId:``}),r(`design_partner_request_failed`,{channel:`direct_request`,submit_surface:v,entry_source:h||void 0,sales_entry:`yes`,...C})}finally{D(!1)}},disabled:E,className:`inline-flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 text-sm font-bold transition disabled:cursor-not-allowed ${x.button}`,children:[E?b.submitLoading:b.submitCta,(0,d.jsx)(i,{size:16})]}),(0,d.jsxs)(`div`,{"aria-live":`polite`,className:`text-xs`,children:[O.status===`success`?(0,d.jsxs)(`div`,{className:x.success,children:[O.confirmationSent?b.submitSuccess:b.submitSuccessNoCopy,O.requestId?` #${O.requestId}`:``]}):null,O.status===`error`?(0,d.jsx)(`div`,{className:x.error,children:b.submitError}):null]})]}):null};export{m as t};
|
|
2
|
+
//# sourceMappingURL=SalesEntryQuickRequestCard-Bfa93AYu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SalesEntryQuickRequestCard-Bfa93AYu.js","names":[],"sources":["../../src/components/SalesEntryQuickRequestCard.jsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { ArrowRight, CheckCircle2 } from 'lucide-react';\nimport { trackEvent } from '../lib/analytics';\nimport {\n buildDesignPartnerRequestMeta,\n buildDesignPartnerRequestPayload,\n describeDesignPartnerQuickRequest,\n submitDesignPartnerRequest,\n} from '../lib/designPartnerRequest';\n\nconst COPY = {\n en: {\n badge: 'Warm lead request',\n title: 'Send the prefilled async review request from this page',\n body:\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 emailLabel: 'Work email',\n appLabel: 'App / URL',\n reviewModeLabel: 'Reply mode',\n reviewModeValues: {\n async_email: 'Async email review',\n live_call: '15-min live call',\n },\n submitCta: 'Send prefilled request now',\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 the review or pay-first path below as fallback.',\n },\n ja: {\n badge: 'warm lead request',\n title: 'このページから async review をそのまま依頼できます',\n body:\n '通話は必須ではありません。この release thread にメールアドレスは紐づいているので、この場で依頼を送れば 1営業日以内に最初の release-risk teardown と次の提案をメールで返します。',\n emailLabel: 'メールアドレス',\n appLabel: 'アプリ名 / URL',\n reviewModeLabel: '返信方法',\n reviewModeValues: {\n async_email: 'メールで async review',\n live_call: '15分の live call',\n },\n submitCta: 'この内容で今すぐ依頼する',\n submitLoading: '依頼を送信中...',\n submitSuccess: '依頼を受け付けました。1営業日以内に返信します。',\n submitSuccessNoCopy: '依頼は受け付けました。控えメールは送れませんでしたが、内容は記録済みです。',\n submitError: '直接送信に失敗しました。下の review または pay-first 導線を使ってください。',\n },\n};\n\nconst THEMES = {\n dark: {\n container: 'border-cyan-400/30 bg-cyan-500/10',\n badge: 'border-cyan-300/30 bg-cyan-400/10 text-cyan-100',\n title: 'text-white',\n body: 'text-cyan-50/90',\n metaCard: 'border-black/5 bg-white/40',\n metaLabel: 'text-cyan-200/80',\n metaValue: 'text-cyan-50',\n button: 'bg-cyan-500 text-slate-950 hover:bg-cyan-400 disabled:bg-cyan-500/50',\n success: 'text-emerald-200',\n error: 'text-rose-200',\n },\n light: {\n container: 'border-cyan-200 bg-cyan-50',\n badge: 'border-cyan-200 bg-white text-cyan-700',\n title: 'text-slate-900',\n body: 'text-slate-700',\n metaCard: 'border-slate-200 bg-white',\n metaLabel: 'text-slate-500',\n metaValue: 'text-slate-900',\n button: 'bg-cyan-600 text-white hover:bg-cyan-700 disabled:bg-cyan-400',\n success: 'text-emerald-700',\n error: 'text-rose-700',\n },\n};\n\nconst SalesEntryQuickRequestCard = ({\n lang = 'en',\n variant = 'light',\n form = {},\n attribution = {},\n entrySource = '',\n leadId = '',\n sourcePage = 'pricing',\n submitSurface = 'sales_entry_quick_card',\n className = '',\n}) => {\n const copy = COPY[lang] || COPY.en;\n const theme = THEMES[variant] || THEMES.light;\n const quickRequestSummary = describeDesignPartnerQuickRequest({ form, defaultReviewMode: 'async_email' });\n const requestMeta = buildDesignPartnerRequestMeta(form, { leadId, defaultReviewMode: 'async_email' });\n const reviewModeValue =\n copy.reviewModeValues?.[quickRequestSummary.reviewMode] || copy.reviewModeValues?.async_email || '';\n const quickReadyLoggedRef = useRef(false);\n const [isSubmittingRequest, setIsSubmittingRequest] = useState(false);\n const [submitState, setSubmitState] = useState({ status: 'idle', confirmationSent: true, requestId: '' });\n\n useEffect(() => {\n if (!quickRequestSummary.contactEmail) {\n quickReadyLoggedRef.current = false;\n return;\n }\n if (quickReadyLoggedRef.current) return;\n quickReadyLoggedRef.current = true;\n trackEvent('design_partner_prefilled_request_ready', {\n submit_surface: submitSurface,\n entry_source: entrySource || undefined,\n sales_entry: 'yes',\n lead_id: leadId || undefined,\n ...requestMeta,\n });\n }, [\n entrySource,\n form.appUrl,\n form.contactEmail,\n form.contactName,\n leadId,\n quickRequestSummary.contactEmail,\n requestMeta,\n submitSurface,\n ]);\n\n if (!quickRequestSummary.contactEmail) return null;\n\n const handleSubmit = async (event) => {\n event.preventDefault();\n if (isSubmittingRequest) return;\n\n const payload = buildDesignPartnerRequestPayload({\n form,\n attribution,\n entrySource,\n leadId,\n lang,\n sourcePage,\n pagePath: typeof window !== 'undefined' ? window.location.pathname : '',\n pageUrl: typeof window !== 'undefined' ? window.location.href : '',\n defaultReviewMode: 'async_email',\n });\n\n trackEvent('design_partner_cta_click', {\n cta: 'submit_prefilled_request',\n channel: 'direct_request',\n submit_surface: submitSurface,\n entry_source: entrySource || undefined,\n sales_entry: 'yes',\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: submitSurface,\n entry_source: entrySource || undefined,\n sales_entry: 'yes',\n ...requestMeta,\n });\n } catch (err) {\n console.error('Failed to submit sales-entry request', err);\n setSubmitState({ status: 'error', confirmationSent: false, requestId: '' });\n trackEvent('design_partner_request_failed', {\n channel: 'direct_request',\n submit_surface: submitSurface,\n entry_source: entrySource || undefined,\n sales_entry: 'yes',\n ...requestMeta,\n });\n } finally {\n setIsSubmittingRequest(false);\n }\n };\n\n return (\n <section className={`rounded-2xl border p-5 space-y-4 ${theme.container} ${className}`.trim()}>\n <div className={`inline-flex items-center gap-2 rounded-full border px-3 py-1 text-[11px] font-semibold ${theme.badge}`}>\n <CheckCircle2 size={14} />\n {copy.badge}\n </div>\n <div className=\"space-y-2\">\n <h2 className={`text-lg font-bold ${theme.title}`}>{copy.title}</h2>\n <p className={`text-sm leading-relaxed ${theme.body}`}>{copy.body}</p>\n </div>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <div className={`rounded-xl border px-4 py-3 ${theme.metaCard}`}>\n <div className={`text-[11px] font-semibold uppercase tracking-[0.16em] ${theme.metaLabel}`}>{copy.emailLabel}</div>\n <div className={`mt-1 break-all text-sm font-semibold ${theme.metaValue}`}>{quickRequestSummary.contactEmail}</div>\n </div>\n {quickRequestSummary.appLabel ? (\n <div className={`rounded-xl border px-4 py-3 ${theme.metaCard}`}>\n <div className={`text-[11px] font-semibold uppercase tracking-[0.16em] ${theme.metaLabel}`}>{copy.appLabel}</div>\n <div className={`mt-1 break-all text-sm font-semibold ${theme.metaValue}`}>{quickRequestSummary.appLabel}</div>\n </div>\n ) : null}\n <div className={`rounded-xl border px-4 py-3 ${theme.metaCard}`}>\n <div className={`text-[11px] font-semibold uppercase tracking-[0.16em] ${theme.metaLabel}`}>{copy.reviewModeLabel}</div>\n <div className={`mt-1 break-all text-sm font-semibold ${theme.metaValue}`}>{reviewModeValue}</div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmittingRequest}\n className={`inline-flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 text-sm font-bold transition disabled:cursor-not-allowed ${theme.button}`}\n >\n {isSubmittingRequest ? copy.submitLoading : copy.submitCta}\n <ArrowRight size={16} />\n </button>\n <div aria-live=\"polite\" className=\"text-xs\">\n {submitState.status === 'success' ? (\n <div className={theme.success}>\n {submitState.confirmationSent ? copy.submitSuccess : copy.submitSuccessNoCopy}\n {submitState.requestId ? ` #${submitState.requestId}` : ''}\n </div>\n ) : null}\n {submitState.status === 'error' ? <div className={theme.error}>{copy.submitError}</div> : null}\n </div>\n </section>\n );\n};\n\nexport default SalesEntryQuickRequestCard;\n"],"mappings":"qPAUM,EAAO,CACX,GAAI,CACF,MAAO,oBACP,MAAO,yDACP,KACE,gNACF,WAAY,aACZ,SAAU,YACV,gBAAiB,aACjB,iBAAkB,CAChB,YAAa,qBACb,UAAW,kBACb,EACA,UAAW,6BACX,cAAe,qBACf,cAAe,qDACf,oBAAqB,qFACrB,YAAa,4EACf,EACA,GAAI,CACF,MAAO,oBACP,MAAO,mCACP,KACE,+GACF,WAAY,UACZ,SAAU,aACV,gBAAiB,OACjB,iBAAkB,CAChB,YAAa,oBACb,UAAW,gBACb,EACA,UAAW,eACX,cAAe,YACf,cAAe,2BACf,oBAAqB,wCACrB,YAAa,iDACf,CACF,EAEM,EAAS,CACb,KAAM,CACJ,UAAW,oCACX,MAAO,kDACP,MAAO,aACP,KAAM,kBACN,SAAU,6BACV,UAAW,mBACX,UAAW,eACX,OAAQ,uEACR,QAAS,mBACT,MAAO,eACT,EACA,MAAO,CACL,UAAW,6BACX,MAAO,yCACP,MAAO,iBACP,KAAM,iBACN,SAAU,4BACV,UAAW,iBACX,UAAW,iBACX,OAAQ,gEACR,QAAS,mBACT,MAAO,eACT,CACF,EAEM,GAA8B,CAClC,OAAO,KACP,UAAU,QACV,OAAO,CAAC,EACR,cAAc,CAAC,EACf,cAAc,GACd,SAAS,GACT,aAAa,UACb,gBAAgB,yBAChB,YAAY,MACR,CACJ,IAAM,EAAO,EAAK,IAAS,EAAK,GAC1B,EAAQ,EAAO,IAAY,EAAO,MAClC,EAAsB,EAAkC,CAAE,OAAM,kBAAmB,aAAc,CAAC,EAClG,EAAc,EAA8B,EAAM,CAAE,SAAQ,kBAAmB,aAAc,CAAC,EAC9F,EACJ,EAAK,mBAAmB,EAAoB,aAAe,EAAK,kBAAkB,aAAe,GAC7F,GAAA,EAAA,EAAA,QAA6B,EAAK,EAClC,CAAC,EAAqB,IAAA,EAAA,EAAA,UAAmC,EAAK,EAC9D,CAAC,EAAa,IAAA,EAAA,EAAA,UAA2B,CAAE,OAAQ,OAAQ,iBAAkB,GAAM,UAAW,EAAG,CAAC,EAqFxG,OAnFA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,EAAoB,aAAc,CACrC,EAAoB,QAAU,GAC9B,MACF,CACI,EAAoB,UACxB,EAAoB,QAAU,GAC9B,EAAW,yCAA0C,CACnD,eAAgB,EAChB,aAAc,GAAe,IAAA,GAC7B,YAAa,MACb,QAAS,GAAU,IAAA,GACnB,GAAG,CACL,CAAC,EACH,EAAG,CACD,EACA,EAAK,OACL,EAAK,aACL,EAAK,YACL,EACA,EAAoB,aACpB,EACA,CACF,CAAC,EAEI,EAAoB,cA2DvB,EAAA,EAAA,MAAC,UAAD,CAAS,UAAW,oCAAoC,EAAM,UAAU,GAAG,IAAY,KAAK,WAA5F,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,0FAA0F,EAAM,iBAAhH,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,KAAM,EAAK,CAAA,EACxB,EAAK,KACH,KACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW,qBAAqB,EAAM,iBAAU,EAAK,KAAU,CAAA,GACnE,EAAA,EAAA,KAAC,IAAD,CAAG,UAAW,2BAA2B,EAAM,gBAAS,EAAK,IAAQ,CAAA,CAClE,KACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qCAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,+BAA+B,EAAM,oBAArD,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,yDAAyD,EAAM,qBAAc,EAAK,UAAgB,CAAA,GAClH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,wCAAwC,EAAM,qBAAc,EAAoB,YAAkB,CAAA,CAC/G,IACJ,EAAoB,UACnB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,+BAA+B,EAAM,oBAArD,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,yDAAyD,EAAM,qBAAc,EAAK,QAAc,CAAA,GAChH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,wCAAwC,EAAM,qBAAc,EAAoB,QAAc,CAAA,CAC3G,IACH,MACJ,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,+BAA+B,EAAM,oBAArD,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,yDAAyD,EAAM,qBAAc,EAAK,eAAqB,CAAA,GACvH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,wCAAwC,EAAM,qBAAc,CAAqB,CAAA,CAC9F,GACF,KACL,EAAA,EAAA,MAAC,SAAD,CACE,KAAK,SACL,QAAS,KApFa,IAAU,CAEpC,GADA,EAAM,eAAe,EACjB,EAAqB,OAEzB,IAAM,EAAU,EAAiC,CAC/C,OACA,cACA,cACA,SACA,OACA,aACA,SAAU,OAAO,OAAW,IAAc,OAAO,SAAS,SAAW,GACrE,QAAS,OAAO,OAAW,IAAc,OAAO,SAAS,KAAO,GAChE,kBAAmB,aACrB,CAAC,EAED,EAAW,2BAA4B,CACrC,IAAK,2BACL,QAAS,iBACT,eAAgB,EAChB,aAAc,GAAe,IAAA,GAC7B,YAAa,MACb,GAAG,CACL,CAAC,EAED,GAAI,CACF,EAAuB,EAAI,EAC3B,IAAM,EAAW,MAAM,EAA2B,CAAO,EACzD,EAAe,CACb,OAAQ,UACR,iBAAkB,GAAU,mBAAqB,GACjD,UAAW,GAAU,WAAa,EACpC,CAAC,EACD,EAAW,mCAAoC,CAC7C,QAAS,iBACT,kBAAmB,GAAU,mBAAqB,GAAQ,KAAO,MACjE,eAAgB,EAChB,aAAc,GAAe,IAAA,GAC7B,YAAa,MACb,GAAG,CACL,CAAC,CACH,OAAS,EAAK,CACZ,QAAQ,MAAM,uCAAwC,CAAG,EACzD,EAAe,CAAE,OAAQ,QAAS,iBAAkB,GAAO,UAAW,EAAG,CAAC,EAC1E,EAAW,gCAAiC,CAC1C,QAAS,iBACT,eAAgB,EAChB,aAAc,GAAe,IAAA,GAC7B,YAAa,MACb,GAAG,CACL,CAAC,CACH,QAAU,CACR,EAAuB,EAAK,CAC9B,CACF,EA+BM,SAAU,EACV,UAAW,sIAAsI,EAAM,kBAJzJ,CAMG,EAAsB,EAAK,cAAgB,EAAK,WACjD,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAK,CAAA,CACjB,KACR,EAAA,EAAA,MAAC,MAAD,CAAK,YAAU,SAAS,UAAU,mBAAlC,CACG,EAAY,SAAW,WACtB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAM,iBAAtB,CACG,EAAY,iBAAmB,EAAK,cAAgB,EAAK,oBACzD,EAAY,UAAY,KAAK,EAAY,YAAc,EACrD,IACH,KACH,EAAY,SAAW,SAAU,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAM,eAAQ,EAAK,WAAiB,CAAA,EAAI,IACvF,GACE,IAtGmC,IAwGhD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,c as r,h as i,n as a,o,p as s,r as c,s as l,x as u}from"./index-D7D6ZRCW.js";import{n as d,r as f,s as p}from"./LanguageSwitcher-hFv9zl1u.js";import{n as m}from"./circle-check-X08qqy40.js";import{n as h,t as g}from"./lock-Di7P18Ts.js";import{t as _}from"./SiteHeader-CJqQ0pL3.js";import{t as v}from"./shield-check-CxpHNdp0.js";import{t as y}from"./triangle-alert-BA0HP6zD.js";import{t as b}from"./SalesEntryQuickRequestCard-Bfa93AYu.js";import{n as x,r as S,t as C}from"./designPartnerSalesEntry-BpRINg3I.js";import{t as w}from"./TrustSalesEntryPanel-DuncpgMs.js";var T=p(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),E=e(t(),1),D=n(),O=e=>(e||``).split(`-`)[0]===`ja`?`ja`:`en`,k={en:{metaTitle:`Security - ShipScreens`,badge:`Security`,title:`Security overview`,subtitle:`ShipScreens keeps screenshot rendering local by default and uses managed services for auth, billing, and API controls.`,updated:`Last updated: 2026-02-26`,sections:[{icon:v,title:`Security model`,bullets:[`Serverless architecture with least-privilege IAM as the default.`,`Auth and API access use Cognito + API Gateway + Lambda controls.`,`Stripe webhook endpoints enforce signature verification.`]},{icon:g,title:`Data protection`,bullets:[`HTTPS/TLS is required for transport.`,`DynamoDB data is encrypted at rest.`,`By default, base screenshots and generated outputs are not uploaded to ShipScreens.`]},{icon:h,title:`Billing boundary`,bullets:[`Payment processing is handled by Stripe.`,`ShipScreens does not store card numbers or full payment credentials.`]},{icon:T,title:`Dependency and runtime posture`,bullets:[`CI runs production dependency audits and fails on high+ issues by default.`,`Node.js follows current LTS security patch levels in CI and local workflow guidance.`,`Dependabot is enabled for npm and GitHub Actions updates.`]},{icon:y,title:`Incident response`,bullets:[`Detection via monitoring and logs, then containment with rate limits or WAF rules.`,`User impact is communicated through support and status updates when necessary.`,`Recovery includes evidence review and key/config rotation when required.`]}],linksTitle:`Related policies`,links:{proof:`Proof`,privacy:`Privacy Policy`,terms:`Terms`,legal:`Legal (Japan)`,whitepaper:`Technical security whitepaper`},contactLabel:`Security contact`,contactCta:`Contact support`,supportEmail:`support@shimaumaservices.co.jp`},ja:{metaTitle:`セキュリティ - ShipScreens`,badge:`セキュリティ`,title:`セキュリティ概要`,subtitle:`ShipScreens はスクリーンショット生成を原則ローカルで完結し、認証・課金・API保護はマネージドサービスで実装しています。`,updated:`最終更新: 2026-02-26`,sections:[{icon:v,title:`セキュリティモデル`,bullets:[`サーバーレス構成 + 最小権限 IAM を基本方針とします。`,`認証/API 制御は Cognito + API Gateway + Lambda を利用します。`,`Stripe webhook は署名検証を必須化しています。`]},{icon:g,title:`データ保護`,bullets:[`通信は HTTPS/TLS を前提とします。`,`DynamoDB の保存データは暗号化(at-rest)されます。`,`元スクリーンショットと生成物は、既定で ShipScreens にアップロードしません。`]},{icon:h,title:`課金境界`,bullets:[`決済処理は Stripe が担当します。`,`ShipScreens はカード番号等の完全な決済情報を保持しません。`]},{icon:T,title:`依存関係とランタイム運用`,bullets:[`CI で本番依存の監査を実行し、high 以上は既定で失敗させます。`,`Node.js は LTS セキュリティパッチ水準へ追従します。`,`Dependabot を npm / GitHub Actions に対して有効化しています。`]},{icon:y,title:`インシデント対応`,bullets:[`監視で検知し、必要に応じてレート制限/WAF で封じ込めます。`,`ユーザー影響がある場合はサポート窓口を通じて通知します。`,`証跡確認と鍵/設定ローテーションを含めて復旧します。`]}],linksTitle:`関連ポリシー`,links:{proof:`実績`,privacy:`プライバシー`,terms:`利用規約`,legal:`特商法表記`,whitepaper:`技術ホワイトペーパー(リポジトリ)`},contactLabel:`セキュリティ連絡先`,contactCta:`サポートへ連絡`,supportEmail:`support@shimaumaservices.co.jp`}},A=`https://github.com/iamjamb/shipscreens/blob/main/docs/security-whitepaper.md`,j=()=>{let{i18n:e}=u(),t=O(e.resolvedLanguage||e.language),n=k[t]||k.en,p=l(),h=typeof window>`u`?null:i(new URLSearchParams(window.location.search)),g=p.entry_source||``,y=s(g),T={entrySource:g,leadId:h?.leadId||o(),preset:h?.preset||``,appName:h?.appName||``,appUrl:h?.appUrl||``,contactEmail:h?.contactEmail||``,contactName:h?.contactName||``,xHandle:h?.xHandle||``,reviewMode:h?.reviewMode||`async_email`,releaseTimeline:h?.releaseTimeline||``,platform:h?.platform||``,scope:h?.scope||``,workflow:h?.workflow||``,blocker:h?.blocker||``},j={contactEmail:T.contactEmail,contactName:T.contactName,xHandle:T.xHandle,appName:T.appName,appUrl:T.appUrl,reviewMode:T.reviewMode,releaseTimeline:T.releaseTimeline,platform:T.platform,scope:T.scope,workflow:T.workflow,blocker:T.blocker,notes:``},M=y?r(`/`,T):`/`,N=y?r(`/pricing`,T):`/pricing`,P=y?r(`/proof`,T):`/proof`,F=y?r(`/privacy`,T):`/privacy`,I=y?r(`/terms`,T):`/terms`,L=y?r(`/legal`,T):`/legal`,R=C(T),z=x(T),B=(0,E.useMemo)(()=>S({entrySource:g,leadId:T.leadId,contactEmail:T.contactEmail}),[g,T.leadId,T.contactEmail]);return f(`titles.security`,{defaultValue:n.metaTitle}),(0,E.useEffect)(()=>{a(`security_view`,{path:typeof window<`u`?window.location.pathname:`/security`,...B})},[B]),(0,D.jsxs)(`div`,{className:`min-h-screen bg-slate-50 text-slate-800`,children:[(0,D.jsx)(d,{}),(0,D.jsx)(_,{variant:`light`,active:`pricing`,logoHref:M,pricingHref:N,showX:!1}),(0,D.jsxs)(`main`,{className:`max-w-4xl mx-auto px-4 py-12 space-y-8`,children:[(0,D.jsxs)(`section`,{className:`space-y-3`,children:[(0,D.jsxs)(`div`,{className:`inline-flex items-center gap-2 px-3 py-1.5 rounded-full border border-slate-200 bg-white text-slate-700 text-xs font-semibold`,children:[(0,D.jsx)(v,{size:14}),n.badge]}),(0,D.jsx)(`h1`,{className:`text-3xl font-bold`,children:n.title}),(0,D.jsx)(`p`,{className:`text-slate-700 leading-relaxed`,children:n.subtitle}),(0,D.jsx)(`p`,{className:`text-xs text-slate-500`,children:n.updated})]}),y?(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsx)(b,{lang:t,variant:`light`,form:j,attribution:p,entrySource:g,leadId:T.leadId,sourcePage:`security`,submitSurface:`security_sales_entry_quick_card`}),(0,D.jsx)(w,{lang:t,variant:`light`,contactEmail:T.contactEmail,appName:T.appName,appUrl:T.appUrl,requestHref:R,payFirstHref:z,onRequestClick:e=>c(e,`security_cta_click`,{cta:`open_request_review_sales_entry`,...B}),onPayFirstClick:e=>c(e,`security_cta_click`,{cta:`open_pay_first_sales_entry`,...B})})]}):null,(0,D.jsx)(`section`,{className:`space-y-4`,children:n.sections.map(e=>{let t=e.icon;return(0,D.jsxs)(`article`,{className:`bg-white rounded-2xl border border-slate-200 shadow-xs p-5 space-y-3`,children:[(0,D.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,D.jsx)(`div`,{className:`w-9 h-9 rounded-xl border border-slate-200 bg-slate-50 flex items-center justify-center text-slate-700`,children:(0,D.jsx)(t,{size:16})}),(0,D.jsx)(`h2`,{className:`text-lg font-semibold`,children:e.title})]}),(0,D.jsx)(`ul`,{className:`list-disc pl-5 space-y-1 text-sm text-slate-700`,children:e.bullets.map(e=>(0,D.jsx)(`li`,{children:e},e))})]},e.title)})}),(0,D.jsxs)(`section`,{className:`bg-white rounded-2xl border border-slate-200 shadow-xs p-5 space-y-3`,children:[(0,D.jsx)(`h2`,{className:`text-lg font-semibold`,children:n.linksTitle}),(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-3 text-sm`,children:[(0,D.jsx)(`a`,{href:P,onClick:e=>c(e,`security_cta_click`,{cta:`open_proof`}),className:`text-blue-700 hover:text-blue-800 underline underline-offset-4`,children:n.links.proof}),(0,D.jsx)(`a`,{href:F,onClick:e=>c(e,`security_cta_click`,{cta:`open_privacy`}),className:`text-blue-700 hover:text-blue-800 underline underline-offset-4`,children:n.links.privacy}),(0,D.jsx)(`a`,{href:I,onClick:e=>c(e,`security_cta_click`,{cta:`open_terms`}),className:`text-blue-700 hover:text-blue-800 underline underline-offset-4`,children:n.links.terms}),(0,D.jsx)(`a`,{href:L,onClick:e=>c(e,`security_cta_click`,{cta:`open_legal`}),className:`text-blue-700 hover:text-blue-800 underline underline-offset-4`,children:n.links.legal}),(0,D.jsx)(`a`,{href:A,target:`_blank`,rel:`noopener noreferrer`,onClick:e=>c(e,`security_cta_click`,{cta:`open_whitepaper_repo`}),className:`text-blue-700 hover:text-blue-800 underline underline-offset-4`,children:n.links.whitepaper})]})]}),(0,D.jsxs)(`section`,{className:`bg-white rounded-2xl border border-slate-200 shadow-xs p-5 space-y-2`,children:[(0,D.jsx)(`div`,{className:`text-sm font-semibold`,children:n.contactLabel}),(0,D.jsxs)(`a`,{href:`mailto:${n.supportEmail}`,onClick:()=>a(`security_cta_click`,{cta:`contact_support`}),className:`inline-flex items-center gap-2 text-blue-700 hover:text-blue-800 underline underline-offset-4`,children:[n.contactCta,(0,D.jsx)(m,{size:14})]}),(0,D.jsx)(`div`,{className:`text-xs text-slate-500`,children:n.supportEmail})]})]})]})};export{j as default};
|
|
2
|
+
//# sourceMappingURL=Security-C1OmAgom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Security-C1OmAgom.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/server.mjs","../../src/pages/Security.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 [\"rect\", { width: \"20\", height: \"8\", x: \"2\", y: \"2\", rx: \"2\", ry: \"2\", key: \"ngkwjq\" }],\n [\"rect\", { width: \"20\", height: \"8\", x: \"2\", y: \"14\", rx: \"2\", ry: \"2\", key: \"iecqi9\" }],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"6\", y2: \"6\", key: \"16zg32\" }],\n [\"line\", { x1: \"6\", x2: \"6.01\", y1: \"18\", y2: \"18\", key: \"nzw8ys\" }]\n];\nconst Server = createLucideIcon(\"server\", __iconNode);\n\nexport { __iconNode, Server as default };\n//# sourceMappingURL=server.mjs.map\n","import React, { useEffect, useMemo } from 'react';\nimport { AlertTriangle, ArrowRight, CreditCard, Lock, Server, ShieldCheck } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport SalesEntryQuickRequestCard from '../components/SalesEntryQuickRequestCard';\nimport StagingBadge from '../components/StagingBadge';\nimport SiteHeader from '../components/SiteHeader';\nimport TrustSalesEntryPanel from '../components/TrustSalesEntryPanel';\nimport usePageTitle from '../hooks/usePageTitle';\nimport { trackEvent, trackEventAndFollowLink } from '../lib/analytics';\nimport { getAttributionLeadId, getAttributionParams } from '../lib/attribution';\nimport {\n buildDesignPartnerContextHref,\n isDirectSalesEntrySource,\n sanitizeDesignPartnerQueryPrefill,\n} from '../lib/designPartnerPrefill';\nimport {\n buildDesignPartnerRequestReviewHref,\n buildSalesEntryPayFirstHref,\n buildSalesEntryTrackingContext,\n} from '../lib/designPartnerSalesEntry';\n\nconst normalizeLang = (lang) => {\n const base = (lang || '').split('-')[0];\n return base === 'ja' ? 'ja' : 'en';\n};\n\nconst COPY = {\n en: {\n metaTitle: 'Security - ShipScreens',\n badge: 'Security',\n title: 'Security overview',\n subtitle:\n 'ShipScreens keeps screenshot rendering local by default and uses managed services for auth, billing, and API controls.',\n updated: 'Last updated: 2026-02-26',\n sections: [\n {\n icon: ShieldCheck,\n title: 'Security model',\n bullets: [\n 'Serverless architecture with least-privilege IAM as the default.',\n 'Auth and API access use Cognito + API Gateway + Lambda controls.',\n 'Stripe webhook endpoints enforce signature verification.',\n ],\n },\n {\n icon: Lock,\n title: 'Data protection',\n bullets: [\n 'HTTPS/TLS is required for transport.',\n 'DynamoDB data is encrypted at rest.',\n 'By default, base screenshots and generated outputs are not uploaded to ShipScreens.',\n ],\n },\n {\n icon: CreditCard,\n title: 'Billing boundary',\n bullets: [\n 'Payment processing is handled by Stripe.',\n 'ShipScreens does not store card numbers or full payment credentials.',\n ],\n },\n {\n icon: Server,\n title: 'Dependency and runtime posture',\n bullets: [\n 'CI runs production dependency audits and fails on high+ issues by default.',\n 'Node.js follows current LTS security patch levels in CI and local workflow guidance.',\n 'Dependabot is enabled for npm and GitHub Actions updates.',\n ],\n },\n {\n icon: AlertTriangle,\n title: 'Incident response',\n bullets: [\n 'Detection via monitoring and logs, then containment with rate limits or WAF rules.',\n 'User impact is communicated through support and status updates when necessary.',\n 'Recovery includes evidence review and key/config rotation when required.',\n ],\n },\n ],\n linksTitle: 'Related policies',\n links: {\n proof: 'Proof',\n privacy: 'Privacy Policy',\n terms: 'Terms',\n legal: 'Legal (Japan)',\n whitepaper: 'Technical security whitepaper',\n },\n contactLabel: 'Security contact',\n contactCta: 'Contact support',\n supportEmail: 'support@shimaumaservices.co.jp',\n },\n ja: {\n metaTitle: 'セキュリティ - ShipScreens',\n badge: 'セキュリティ',\n title: 'セキュリティ概要',\n subtitle:\n 'ShipScreens はスクリーンショット生成を原則ローカルで完結し、認証・課金・API保護はマネージドサービスで実装しています。',\n updated: '最終更新: 2026-02-26',\n sections: [\n {\n icon: ShieldCheck,\n title: 'セキュリティモデル',\n bullets: [\n 'サーバーレス構成 + 最小権限 IAM を基本方針とします。',\n '認証/API 制御は Cognito + API Gateway + Lambda を利用します。',\n 'Stripe webhook は署名検証を必須化しています。',\n ],\n },\n {\n icon: Lock,\n title: 'データ保護',\n bullets: [\n '通信は HTTPS/TLS を前提とします。',\n 'DynamoDB の保存データは暗号化(at-rest)されます。',\n '元スクリーンショットと生成物は、既定で ShipScreens にアップロードしません。',\n ],\n },\n {\n icon: CreditCard,\n title: '課金境界',\n bullets: [\n '決済処理は Stripe が担当します。',\n 'ShipScreens はカード番号等の完全な決済情報を保持しません。',\n ],\n },\n {\n icon: Server,\n title: '依存関係とランタイム運用',\n bullets: [\n 'CI で本番依存の監査を実行し、high 以上は既定で失敗させます。',\n 'Node.js は LTS セキュリティパッチ水準へ追従します。',\n 'Dependabot を npm / GitHub Actions に対して有効化しています。',\n ],\n },\n {\n icon: AlertTriangle,\n title: 'インシデント対応',\n bullets: [\n '監視で検知し、必要に応じてレート制限/WAF で封じ込めます。',\n 'ユーザー影響がある場合はサポート窓口を通じて通知します。',\n '証跡確認と鍵/設定ローテーションを含めて復旧します。',\n ],\n },\n ],\n linksTitle: '関連ポリシー',\n links: {\n proof: '実績',\n privacy: 'プライバシー',\n terms: '利用規約',\n legal: '特商法表記',\n whitepaper: '技術ホワイトペーパー(リポジトリ)',\n },\n contactLabel: 'セキュリティ連絡先',\n contactCta: 'サポートへ連絡',\n supportEmail: 'support@shimaumaservices.co.jp',\n },\n};\n\nconst WHITEPAPER_HREF = 'https://github.com/iamjamb/shipscreens/blob/main/docs/security-whitepaper.md';\n\nconst Security = () => {\n const { i18n } = useTranslation();\n const lang = normalizeLang(i18n.resolvedLanguage || i18n.language);\n const copy = COPY[lang] || COPY.en;\n const attribution = getAttributionParams();\n const prefill =\n typeof window === 'undefined'\n ? null\n : sanitizeDesignPartnerQueryPrefill(new URLSearchParams(window.location.search));\n const entrySource = attribution.entry_source || '';\n const isSalesEntry = isDirectSalesEntrySource(entrySource);\n const salesContext = {\n entrySource,\n leadId: prefill?.leadId || getAttributionLeadId(),\n preset: prefill?.preset || '',\n appName: prefill?.appName || '',\n appUrl: prefill?.appUrl || '',\n contactEmail: prefill?.contactEmail || '',\n contactName: prefill?.contactName || '',\n xHandle: prefill?.xHandle || '',\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 };\n const requestForm = {\n contactEmail: salesContext.contactEmail,\n contactName: salesContext.contactName,\n xHandle: salesContext.xHandle,\n appName: salesContext.appName,\n appUrl: salesContext.appUrl,\n reviewMode: salesContext.reviewMode,\n releaseTimeline: salesContext.releaseTimeline,\n platform: salesContext.platform,\n scope: salesContext.scope,\n workflow: salesContext.workflow,\n blocker: salesContext.blocker,\n notes: '',\n };\n const logoHref = isSalesEntry ? buildDesignPartnerContextHref('/', salesContext) : '/';\n const pricingHref = isSalesEntry ? buildDesignPartnerContextHref('/pricing', salesContext) : '/pricing';\n const proofHref = isSalesEntry ? buildDesignPartnerContextHref('/proof', salesContext) : '/proof';\n const privacyHref = isSalesEntry ? buildDesignPartnerContextHref('/privacy', salesContext) : '/privacy';\n const termsHref = isSalesEntry ? buildDesignPartnerContextHref('/terms', salesContext) : '/terms';\n const legalHref = isSalesEntry ? buildDesignPartnerContextHref('/legal', salesContext) : '/legal';\n const requestReviewHref = buildDesignPartnerRequestReviewHref(salesContext);\n const payFirstHref = buildSalesEntryPayFirstHref(salesContext);\n const salesEntryTrackingContext = useMemo(\n () =>\n buildSalesEntryTrackingContext({\n entrySource,\n leadId: salesContext.leadId,\n contactEmail: salesContext.contactEmail,\n }),\n [entrySource, salesContext.leadId, salesContext.contactEmail],\n );\n usePageTitle('titles.security', { defaultValue: copy.metaTitle });\n\n useEffect(() => {\n trackEvent('security_view', {\n path: typeof window !== 'undefined' ? window.location.pathname : '/security',\n ...salesEntryTrackingContext,\n });\n }, [salesEntryTrackingContext]);\n\n return (\n <div className=\"min-h-screen bg-slate-50 text-slate-800\">\n <StagingBadge />\n <SiteHeader variant=\"light\" active=\"pricing\" logoHref={logoHref} pricingHref={pricingHref} showX={false} />\n\n <main className=\"max-w-4xl mx-auto px-4 py-12 space-y-8\">\n <section className=\"space-y-3\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full border border-slate-200 bg-white text-slate-700 text-xs font-semibold\">\n <ShieldCheck size={14} />\n {copy.badge}\n </div>\n <h1 className=\"text-3xl font-bold\">{copy.title}</h1>\n <p className=\"text-slate-700 leading-relaxed\">{copy.subtitle}</p>\n <p className=\"text-xs text-slate-500\">{copy.updated}</p>\n </section>\n\n {isSalesEntry ? (\n <div className=\"space-y-4\">\n <SalesEntryQuickRequestCard\n lang={lang}\n variant=\"light\"\n form={requestForm}\n attribution={attribution}\n entrySource={entrySource}\n leadId={salesContext.leadId}\n sourcePage=\"security\"\n submitSurface=\"security_sales_entry_quick_card\"\n />\n <TrustSalesEntryPanel\n lang={lang}\n variant=\"light\"\n contactEmail={salesContext.contactEmail}\n appName={salesContext.appName}\n appUrl={salesContext.appUrl}\n requestHref={requestReviewHref}\n payFirstHref={payFirstHref}\n onRequestClick={(event) =>\n trackEventAndFollowLink(event, 'security_cta_click', {\n cta: 'open_request_review_sales_entry',\n ...salesEntryTrackingContext,\n })\n }\n onPayFirstClick={(event) =>\n trackEventAndFollowLink(event, 'security_cta_click', {\n cta: 'open_pay_first_sales_entry',\n ...salesEntryTrackingContext,\n })\n }\n />\n </div>\n ) : null}\n\n <section className=\"space-y-4\">\n {copy.sections.map((section) => {\n const Icon = section.icon;\n return (\n <article key={section.title} className=\"bg-white rounded-2xl border border-slate-200 shadow-xs p-5 space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-9 h-9 rounded-xl border border-slate-200 bg-slate-50 flex items-center justify-center text-slate-700\">\n <Icon size={16} />\n </div>\n <h2 className=\"text-lg font-semibold\">{section.title}</h2>\n </div>\n <ul className=\"list-disc pl-5 space-y-1 text-sm text-slate-700\">\n {section.bullets.map((bullet) => (\n <li key={bullet}>{bullet}</li>\n ))}\n </ul>\n </article>\n );\n })}\n </section>\n\n <section className=\"bg-white rounded-2xl border border-slate-200 shadow-xs p-5 space-y-3\">\n <h2 className=\"text-lg font-semibold\">{copy.linksTitle}</h2>\n <div className=\"flex flex-wrap gap-3 text-sm\">\n <a\n href={proofHref}\n onClick={(event) => trackEventAndFollowLink(event, 'security_cta_click', { cta: 'open_proof' })}\n className=\"text-blue-700 hover:text-blue-800 underline underline-offset-4\"\n >\n {copy.links.proof}\n </a>\n <a\n href={privacyHref}\n onClick={(event) => trackEventAndFollowLink(event, 'security_cta_click', { cta: 'open_privacy' })}\n className=\"text-blue-700 hover:text-blue-800 underline underline-offset-4\"\n >\n {copy.links.privacy}\n </a>\n <a\n href={termsHref}\n onClick={(event) => trackEventAndFollowLink(event, 'security_cta_click', { cta: 'open_terms' })}\n className=\"text-blue-700 hover:text-blue-800 underline underline-offset-4\"\n >\n {copy.links.terms}\n </a>\n <a\n href={legalHref}\n onClick={(event) => trackEventAndFollowLink(event, 'security_cta_click', { cta: 'open_legal' })}\n className=\"text-blue-700 hover:text-blue-800 underline underline-offset-4\"\n >\n {copy.links.legal}\n </a>\n <a\n href={WHITEPAPER_HREF}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(event) => trackEventAndFollowLink(event, 'security_cta_click', { cta: 'open_whitepaper_repo' })}\n className=\"text-blue-700 hover:text-blue-800 underline underline-offset-4\"\n >\n {copy.links.whitepaper}\n </a>\n </div>\n </section>\n\n <section className=\"bg-white rounded-2xl border border-slate-200 shadow-xs p-5 space-y-2\">\n <div className=\"text-sm font-semibold\">{copy.contactLabel}</div>\n <a\n href={`mailto:${copy.supportEmail}`}\n onClick={() => trackEvent('security_cta_click', { cta: 'contact_support' })}\n className=\"inline-flex items-center gap-2 text-blue-700 hover:text-blue-800 underline underline-offset-4\"\n >\n {copy.contactCta}\n <ArrowRight size={14} />\n </a>\n <div className=\"text-xs text-slate-500\">{copy.supportEmail}</div>\n </section>\n </main>\n </div>\n );\n};\n\nexport default Security;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,x as r}from"./index-D7D6ZRCW.js";import{n as i,r as a}from"./LanguageSwitcher-hFv9zl1u.js";import{n as o,t as s}from"./eye-CHvLhG2r.js";import{t as c}from"./SiteHeader-CJqQ0pL3.js";import{t as l}from"./smartphone-DXKiqu57.js";import{r as u,t as d}from"./useAuth-CoS4r8yi.js";var f=e(t(),1),p=n(),m=()=>{if(typeof window>`u`)return null;let e=new URLSearchParams(window.location.search).get(`next`);return!e||!e.startsWith(`/`)||e.startsWith(`//`)?null:e},h=()=>{let{t:e}=r();a(`titles.signIn`);let{isAuthenticated:t,isLoading:n}=d(),h=m(),[g,_]=(0,f.useState)(``),[v,y]=(0,f.useState)(``),[b,x]=(0,f.useState)(!1),[S,C]=(0,f.useState)(``),[w,T]=(0,f.useState)(!1);return(0,f.useEffect)(()=>{!n&&t&&(window.location.href=h||`/app/`)},[t,n,h]),(0,p.jsxs)(`div`,{className:`min-h-screen bg-linear-to-b from-slate-950 via-slate-900 to-slate-950 text-white flex flex-col`,children:[(0,p.jsx)(i,{}),(0,p.jsx)(c,{variant:`dark`,showX:!1}),(0,p.jsx)(`main`,{className:`flex-1 flex items-center justify-center px-4 pb-12`,children:(0,p.jsxs)(`div`,{className:`w-full max-w-md bg-slate-900/70 border border-slate-800 rounded-2xl shadow-2xl p-8 space-y-6`,children:[(0,p.jsxs)(`div`,{className:`text-center space-y-2`,children:[(0,p.jsx)(`div`,{className:`inline-flex items-center justify-center w-12 h-12 rounded-xl bg-slate-800 border border-slate-700 text-white shadow-lg`,children:(0,p.jsx)(l,{size:24})}),(0,p.jsx)(`h1`,{className:`text-2xl font-bold`,children:e(`auth.title`)}),(0,p.jsx)(`p`,{className:`text-slate-400 text-sm`,children:e(`auth.subtitle`)})]}),(0,p.jsxs)(`form`,{onSubmit:async t=>{t.preventDefault(),C(``),T(!0);try{await u({username:g,password:v}),window.location.href=h||`/app/`}catch(t){C(e(`auth.errors.${t?.name||t?.code}`,e(`auth.errors.default`)))}finally{T(!1)}},className:`space-y-4`,children:[(0,p.jsxs)(`div`,{className:`space-y-2`,children:[(0,p.jsx)(`label`,{htmlFor:`signin-email`,className:`block text-sm text-slate-300`,children:e(`auth.email`)}),(0,p.jsx)(`input`,{id:`signin-email`,type:`email`,value:g,onChange:e=>_(e.target.value),required:!0,autoComplete:`email`,className:`w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500`,placeholder:e(`auth.placeholders.email`)})]}),(0,p.jsxs)(`div`,{className:`space-y-2`,children:[(0,p.jsx)(`label`,{htmlFor:`signin-password`,className:`block text-sm text-slate-300`,children:e(`auth.password`)}),(0,p.jsxs)(`div`,{className:`relative`,children:[(0,p.jsx)(`input`,{id:`signin-password`,type:b?`text`:`password`,value:v,onChange:e=>y(e.target.value),required:!0,autoComplete:`current-password`,className:`w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 pr-12 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500`,placeholder:e(`auth.placeholders.password`)}),(0,p.jsx)(`button`,{type:`button`,onClick:()=>x(e=>!e),className:`absolute inset-y-0 right-0 flex items-center px-3 text-slate-400 hover:text-slate-200`,"aria-label":b?e(`auth.actions.hidePassword`,{defaultValue:`Hide password`}):e(`auth.actions.showPassword`,{defaultValue:`Show password`}),title:b?e(`auth.actions.hidePassword`,{defaultValue:`Hide password`}):e(`auth.actions.showPassword`,{defaultValue:`Show password`}),children:b?(0,p.jsx)(o,{size:18}):(0,p.jsx)(s,{size:18})})]}),(0,p.jsx)(`div`,{className:`flex justify-end`,children:(0,p.jsx)(`a`,{href:h?`/forgot-password?next=${encodeURIComponent(h)}`:`/forgot-password`,className:`text-xs text-blue-300 hover:text-blue-200 underline underline-offset-4`,children:e(`auth.links.forgotPassword`)})})]}),S&&(0,p.jsx)(`div`,{role:`alert`,className:`text-sm text-rose-400 bg-rose-950/40 border border-rose-700/50 rounded-lg px-3 py-2`,children:S}),(0,p.jsx)(`button`,{type:`submit`,disabled:w,className:`w-full bg-blue-500 hover:bg-blue-600 text-white font-semibold rounded-lg py-3 transition disabled:opacity-60 disabled:cursor-not-allowed`,children:e(`auth.actions.signIn`)})]}),(0,p.jsxs)(`div`,{className:`text-center text-sm text-slate-400 space-y-1`,children:[(0,p.jsxs)(`div`,{children:[e(`auth.actions.needAccount`),` `,(0,p.jsx)(`button`,{type:`button`,className:`text-blue-300 hover:text-blue-200 underline`,onClick:()=>{window.location.href=h?`/signup?next=${encodeURIComponent(h)}`:`/signup`},children:e(`auth.actions.goToSignUp`)})]}),(0,p.jsxs)(`div`,{className:`text-slate-500 text-xs`,children:[(0,p.jsx)(`div`,{children:e(`auth.helper.terms`)}),(0,p.jsxs)(`div`,{className:`mt-1 flex items-center justify-center gap-2`,children:[(0,p.jsx)(`a`,{href:`/terms`,className:`underline underline-offset-4 hover:text-slate-200`,children:e(`landing.footer.terms`)}),(0,p.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,p.jsx)(`a`,{href:`/privacy`,className:`underline underline-offset-4 hover:text-slate-200`,children:e(`landing.footer.privacy`)})]})]})]})]})})]})};export{h as default};
|
|
2
|
+
//# sourceMappingURL=SignIn-C_wwnmvu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignIn-C_wwnmvu.js","names":[],"sources":["../../src/pages/SignIn.jsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { signIn } from 'aws-amplify/auth';\nimport { Eye, EyeOff, Smartphone } from 'lucide-react';\nimport useAuth from '../hooks/useAuth';\nimport usePageTitle from '../hooks/usePageTitle';\nimport StagingBadge from '../components/StagingBadge';\nimport SiteHeader from '../components/SiteHeader';\n\nconst readNextPath = () => {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const next = params.get('next');\n if (!next) return null;\n if (!next.startsWith('/') || next.startsWith('//')) return null;\n return next;\n};\n\nconst SignIn = () => {\n const { t } = useTranslation();\n usePageTitle('titles.signIn');\n const { isAuthenticated, isLoading } = useAuth();\n const nextPath = readNextPath();\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [passwordVisible, setPasswordVisible] = useState(false);\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n if (!isLoading && isAuthenticated) {\n window.location.href = nextPath || '/app/';\n }\n }, [isAuthenticated, isLoading, nextPath]);\n\n const handleSubmit = async (e) => {\n e.preventDefault();\n setError('');\n setBusy(true);\n try {\n await signIn({ username: email, password });\n window.location.href = nextPath || '/app/';\n } catch (err) {\n const key = err?.name || err?.code;\n setError(t(`auth.errors.${key}`, t('auth.errors.default')));\n } finally {\n setBusy(false);\n }\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 flex flex-col\">\n <StagingBadge />\n <SiteHeader variant=\"dark\" showX={false} />\n <main className=\"flex-1 flex items-center justify-center px-4 pb-12\">\n <div className=\"w-full max-w-md bg-slate-900/70 border border-slate-800 rounded-2xl shadow-2xl p-8 space-y-6\">\n <div className=\"text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center w-12 h-12 rounded-xl bg-slate-800 border border-slate-700 text-white shadow-lg\">\n <Smartphone size={24} />\n </div>\n <h1 className=\"text-2xl font-bold\">{t('auth.title')}</h1>\n <p className=\"text-slate-400 text-sm\">{t('auth.subtitle')}</p>\n </div>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"signin-email\" className=\"block text-sm text-slate-300\">\n {t('auth.email')}\n </label>\n <input\n id=\"signin-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoComplete=\"email\"\n className=\"w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500\"\n placeholder={t('auth.placeholders.email')}\n />\n </div>\n <div className=\"space-y-2\">\n <label htmlFor=\"signin-password\" className=\"block text-sm text-slate-300\">\n {t('auth.password')}\n </label>\n <div className=\"relative\">\n <input\n id=\"signin-password\"\n type={passwordVisible ? 'text' : 'password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n autoComplete=\"current-password\"\n className=\"w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 pr-12 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500\"\n placeholder={t('auth.placeholders.password')}\n />\n <button\n type=\"button\"\n onClick={() => setPasswordVisible((prev) => !prev)}\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-slate-400 hover:text-slate-200\"\n aria-label={\n passwordVisible\n ? t('auth.actions.hidePassword', { defaultValue: 'Hide password' })\n : t('auth.actions.showPassword', { defaultValue: 'Show password' })\n }\n title={\n passwordVisible\n ? t('auth.actions.hidePassword', { defaultValue: 'Hide password' })\n : t('auth.actions.showPassword', { defaultValue: 'Show password' })\n }\n >\n {passwordVisible ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n <div className=\"flex justify-end\">\n <a\n href={nextPath ? `/forgot-password?next=${encodeURIComponent(nextPath)}` : '/forgot-password'}\n className=\"text-xs text-blue-300 hover:text-blue-200 underline underline-offset-4\"\n >\n {t('auth.links.forgotPassword')}\n </a>\n </div>\n </div>\n {error && (\n <div\n role=\"alert\"\n className=\"text-sm text-rose-400 bg-rose-950/40 border border-rose-700/50 rounded-lg px-3 py-2\"\n >\n {error}\n </div>\n )}\n <button\n type=\"submit\"\n disabled={busy}\n className=\"w-full bg-blue-500 hover:bg-blue-600 text-white font-semibold rounded-lg py-3 transition disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n {t('auth.actions.signIn')}\n </button>\n </form>\n <div className=\"text-center text-sm text-slate-400 space-y-1\">\n <div>\n {t('auth.actions.needAccount')}{' '}\n <button\n type=\"button\"\n className=\"text-blue-300 hover:text-blue-200 underline\"\n onClick={() => {\n window.location.href = nextPath ? `/signup?next=${encodeURIComponent(nextPath)}` : '/signup';\n }}\n >\n {t('auth.actions.goToSignUp')}\n </button>\n </div>\n <div className=\"text-slate-500 text-xs\">\n <div>{t('auth.helper.terms')}</div>\n <div className=\"mt-1 flex items-center justify-center gap-2\">\n <a href=\"/terms\" className=\"underline underline-offset-4 hover:text-slate-200\">\n {t('landing.footer.terms')}\n </a>\n <span aria-hidden=\"true\">·</span>\n <a href=\"/privacy\" className=\"underline underline-offset-4 hover:text-slate-200\">\n {t('landing.footer.privacy')}\n </a>\n </div>\n </div>\n </div>\n </div>\n </main>\n </div>\n );\n};\n\nexport default SignIn;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,x as r}from"./index-D7D6ZRCW.js";import{n as i,r as a}from"./LanguageSwitcher-hFv9zl1u.js";import{n as o,t as s}from"./eye-CHvLhG2r.js";import{t as c}from"./SiteHeader-CJqQ0pL3.js";import{_ as l,a as u,b as d,c as f,d as p,f as m,g as h,h as g,i as _,l as v,m as y,n as b,o as x,p as S,r as C,s as w,t as T,u as E,v as D,y as O}from"./useAuth-CoS4r8yi.js";var k=e=>h(v,p(`ConfirmSignUp`),E(),{...f,...e});async function A(e){let{username:t,confirmationCode:n,options:r}=e,i=l.getConfig().Auth?.Cognito;O(i);let{userPoolId:a,userPoolClientId:o,userPoolEndpoint:s}=i,c=r?.clientMetadata;y(!!t,g.EmptyConfirmSignUpUsername),y(!!n,g.EmptyConfirmSignUpCode);let f=u({username:t,userPoolId:a,userPoolClientId:o}),{Session:p}=await k({endpointResolver:w({endpointOverride:s})})({region:S(i.userPoolId),userAgentValue:m(D.ConfirmSignUp)},{Username:t,ConfirmationCode:n,ClientMetadata:c,ForceAliasCreation:r?.forceAliasCreation,ClientId:i.userPoolClientId,UserContextData:f});return new Promise((e,n)=>{try{let n={isSignUpComplete:!0,nextStep:{signUpStep:`DONE`}},r=x.getState();if(!r.active||r.username!==t){e(n),_();return}x.dispatch({type:`SET_SESSION`,value:p});let i=d.listen(`auth-internal`,({payload:t})=>{switch(t.event){case`autoSignIn`:e({isSignUpComplete:!0,nextStep:{signUpStep:`COMPLETE_AUTO_SIGN_IN`}}),i()}});d.dispatch(`auth-internal`,{event:`confirmSignUp`,data:n})}catch(e){n(e)}})}var j=e(t(),1),M=n(),N=()=>{if(typeof window>`u`)return null;let e=new URLSearchParams(window.location.search).get(`next`);return!e||!e.startsWith(`/`)||e.startsWith(`//`)?null:e},P=()=>{let{t:e}=r();a(`titles.signUp`);let{isAuthenticated:t,isLoading:n}=T(),l=N(),[u,d]=(0,j.useState)(`form`),[f,p]=(0,j.useState)(``),[m,h]=(0,j.useState)(``),[g,_]=(0,j.useState)(!1),[v,y]=(0,j.useState)(``),[x,S]=(0,j.useState)(``),[w,E]=(0,j.useState)(``),[D,O]=(0,j.useState)(!1);return(0,j.useEffect)(()=>{!n&&t&&(window.location.href=l||`/app/`)},[t,n,l]),(0,M.jsxs)(`div`,{className:`min-h-screen bg-linear-to-b from-slate-950 via-slate-900 to-slate-950 text-white flex flex-col`,children:[(0,M.jsx)(i,{}),(0,M.jsx)(c,{variant:`dark`,showX:!1}),(0,M.jsx)(`main`,{className:`flex-1 flex items-center justify-center px-4 pb-12`,children:(0,M.jsxs)(`div`,{className:`w-full max-w-md bg-slate-900/70 border border-slate-800 rounded-2xl shadow-2xl p-8 space-y-6`,children:[(0,M.jsxs)(`div`,{className:`text-center space-y-2`,children:[(0,M.jsx)(`div`,{className:`inline-flex items-center justify-center w-12 h-12 rounded-xl bg-blue-500/10 text-blue-300 border border-blue-500/30`,children:(0,M.jsx)(`span`,{className:`font-black text-lg`,children:`S`})}),(0,M.jsx)(`h1`,{className:`text-2xl font-bold`,children:e(u===`form`?`auth.signupTitle`:`auth.actions.confirm`)}),(0,M.jsx)(`p`,{className:`text-slate-400 text-sm`,children:e(u===`form`?`auth.signupSubtitle`:`auth.code`)})]}),u===`form`&&(0,M.jsxs)(`form`,{onSubmit:async t=>{t.preventDefault(),E(``),S(``),O(!0);try{await b({username:f,password:m,options:{userAttributes:{email:f}}}),S(e(`auth.success.signup`)),d(`confirm`)}catch(t){E(e(`auth.errors.${t?.name||t?.code}`,e(`auth.errors.default`)))}finally{O(!1)}},className:`space-y-4`,children:[(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(`label`,{htmlFor:`signup-email`,className:`block text-sm text-slate-300`,children:e(`auth.email`)}),(0,M.jsx)(`input`,{id:`signup-email`,type:`email`,value:f,onChange:e=>p(e.target.value),required:!0,autoComplete:`email`,className:`w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500`,placeholder:e(`auth.placeholders.email`)})]}),(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(`label`,{htmlFor:`signup-password`,className:`block text-sm text-slate-300`,children:e(`auth.password`)}),(0,M.jsxs)(`div`,{className:`relative`,children:[(0,M.jsx)(`input`,{id:`signup-password`,type:g?`text`:`password`,value:m,onChange:e=>h(e.target.value),required:!0,autoComplete:`new-password`,className:`w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 pr-12 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500`,placeholder:e(`auth.placeholders.passwordNew`)}),(0,M.jsx)(`button`,{type:`button`,onClick:()=>_(e=>!e),className:`absolute inset-y-0 right-0 flex items-center px-3 text-slate-400 hover:text-slate-200`,"aria-label":g?e(`auth.actions.hidePassword`,{defaultValue:`Hide password`}):e(`auth.actions.showPassword`,{defaultValue:`Show password`}),title:g?e(`auth.actions.hidePassword`,{defaultValue:`Hide password`}):e(`auth.actions.showPassword`,{defaultValue:`Show password`}),children:g?(0,M.jsx)(o,{size:18}):(0,M.jsx)(s,{size:18})})]})]}),w&&(0,M.jsx)(`div`,{role:`alert`,className:`text-sm text-rose-400 bg-rose-950/40 border border-rose-700/50 rounded-lg px-3 py-2`,children:w}),x&&(0,M.jsx)(`div`,{role:`status`,className:`text-sm text-emerald-300 bg-emerald-950/40 border border-emerald-700/50 rounded-lg px-3 py-2`,children:x}),(0,M.jsx)(`button`,{type:`submit`,disabled:D,className:`w-full bg-blue-500 hover:bg-blue-600 text-white font-semibold rounded-lg py-3 transition disabled:opacity-60 disabled:cursor-not-allowed`,children:e(`auth.actions.createAccount`)})]}),u===`confirm`&&(0,M.jsxs)(`form`,{onSubmit:async t=>{t.preventDefault(),E(``),S(``),O(!0);try{await A({username:f,confirmationCode:v}),S(e(`auth.success.confirm`)),await C({username:f,password:m}),window.location.href=l||`/app/`}catch(t){E(e(`auth.errors.${t?.name||t?.code}`,e(`auth.errors.default`)))}finally{O(!1)}},className:`space-y-4`,children:[(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(`label`,{htmlFor:`signup-email`,className:`block text-sm text-slate-300`,children:e(`auth.email`)}),(0,M.jsx)(`input`,{id:`signup-email`,type:`email`,value:f,onChange:e=>p(e.target.value),required:!0,autoComplete:`email`,className:`w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500`,placeholder:e(`auth.placeholders.email`)})]}),(0,M.jsxs)(`div`,{className:`space-y-2`,children:[(0,M.jsx)(`label`,{htmlFor:`signup-code`,className:`block text-sm text-slate-300`,children:e(`auth.code`)}),(0,M.jsx)(`input`,{id:`signup-code`,type:`text`,value:v,onChange:e=>y(e.target.value),required:!0,className:`w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500`,placeholder:`123456`})]}),w&&(0,M.jsx)(`div`,{role:`alert`,className:`text-sm text-rose-400 bg-rose-950/40 border border-rose-700/50 rounded-lg px-3 py-2`,children:w}),x&&(0,M.jsx)(`div`,{role:`status`,className:`text-sm text-emerald-300 bg-emerald-950/40 border border-emerald-700/50 rounded-lg px-3 py-2`,children:x}),(0,M.jsx)(`button`,{type:`submit`,disabled:D,className:`w-full bg-blue-500 hover:bg-blue-600 text-white font-semibold rounded-lg py-3 transition disabled:opacity-60 disabled:cursor-not-allowed`,children:e(`auth.actions.confirm`)})]}),(0,M.jsxs)(`div`,{className:`text-center text-sm text-slate-400 space-y-1`,children:[(0,M.jsxs)(`div`,{children:[e(`auth.actions.haveAccount`),` `,(0,M.jsx)(`button`,{type:`button`,className:`text-blue-300 hover:text-blue-200 underline`,onClick:()=>{window.location.href=l?`/signin?next=${encodeURIComponent(l)}`:`/signin`},children:e(`auth.actions.goToSignIn`)})]}),(0,M.jsxs)(`div`,{className:`text-slate-500 text-xs`,children:[(0,M.jsx)(`div`,{children:e(`auth.helper.terms`)}),(0,M.jsxs)(`div`,{className:`mt-1 flex items-center justify-center gap-2`,children:[(0,M.jsx)(`a`,{href:`/terms`,className:`underline underline-offset-4 hover:text-slate-200`,children:e(`landing.footer.terms`)}),(0,M.jsx)(`span`,{"aria-hidden":`true`,children:`·`}),(0,M.jsx)(`a`,{href:`/privacy`,className:`underline underline-offset-4 hover:text-slate-200`,children:e(`landing.footer.privacy`)})]})]})]})]})})]})};export{P as default};
|
|
2
|
+
//# sourceMappingURL=SignUp-Dm5HalC6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignUp-Dm5HalC6.js","names":[],"sources":["../../node_modules/aws-amplify/node_modules/@aws-amplify/auth/dist/esm/foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmSignUpClient.mjs","../../node_modules/aws-amplify/node_modules/@aws-amplify/auth/dist/esm/providers/cognito/apis/confirmSignUp.mjs","../../src/pages/SignUp.jsx"],"sourcesContent":["import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers';\nimport { DEFAULT_SERVICE_CLIENT_API_CONFIG } from './constants.mjs';\nimport { cognitoUserPoolTransferHandler } from './shared/handler/cognitoUserPoolTransferHandler.mjs';\nimport { createUserPoolSerializer } from './shared/serde/createUserPoolSerializer.mjs';\nimport { createUserPoolDeserializer } from './shared/serde/createUserPoolDeserializer.mjs';\nimport '@aws-amplify/core/internals/aws-client-utils';\nimport '@aws-amplify/core/internals/utils';\n\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nconst createConfirmSignUpClient = (config) => composeServiceApi(cognitoUserPoolTransferHandler, createUserPoolSerializer('ConfirmSignUp'), createUserPoolDeserializer(), {\n ...DEFAULT_SERVICE_CLIENT_API_CONFIG,\n ...config,\n});\n\nexport { createConfirmSignUpClient };\n//# sourceMappingURL=createConfirmSignUpClient.mjs.map\n","import { Amplify } from '@aws-amplify/core';\nimport { assertTokenProviderConfig, AuthAction, HubInternal } from '@aws-amplify/core/internals/utils';\nimport { assertValidationError } from '../../../errors/utils/assertValidationError.mjs';\nimport { AuthValidationErrorCode } from '../../../errors/types/validation.mjs';\nimport { getRegionFromUserPoolId } from '../../../foundation/parsers/regionParsers.mjs';\nimport { getAuthUserAgentValue } from '../../../utils/getAuthUserAgentValue.mjs';\nimport { getUserContextData } from '../utils/userContextData.mjs';\nimport '@aws-amplify/core/internals/aws-client-utils/composers';\nimport '@aws-amplify/core/internals/aws-client-utils';\nimport '../../../foundation/factories/serviceClients/cognitoIdentityProvider/shared/handler/cognitoUserPoolTransferHandler.mjs';\nimport '../../../foundation/factories/serviceClients/cognitoIdentityProvider/constants.mjs';\nimport '../../../common/AuthErrorStrings.mjs';\nimport '../types/errors.mjs';\nimport { createConfirmSignUpClient } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/createConfirmSignUpClient.mjs';\nimport { createCognitoUserPoolEndpointResolver } from '../factories/createCognitoUserPoolEndpointResolver.mjs';\nimport { autoSignInStore } from '../../../client/utils/store/autoSignInStore.mjs';\nimport '../../../client/utils/store/signInStore.mjs';\nimport { resetAutoSignIn } from './autoSignIn.mjs';\n\n// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n/**\n * Confirms a new user account.\n *\n * @param input - The ConfirmSignUpInput object.\n * @returns ConfirmSignUpOutput\n * @throws -{@link ConfirmSignUpException }\n * Thrown due to an invalid confirmation code.\n * @throws -{@link AuthValidationErrorCode }\n * Thrown due to an empty confirmation code\n * @throws AuthTokenConfigException - Thrown when the token provider config is invalid.\n */\nasync function confirmSignUp(input) {\n const { username, confirmationCode, options } = input;\n const authConfig = Amplify.getConfig().Auth?.Cognito;\n assertTokenProviderConfig(authConfig);\n const { userPoolId, userPoolClientId, userPoolEndpoint } = authConfig;\n const clientMetadata = options?.clientMetadata;\n assertValidationError(!!username, AuthValidationErrorCode.EmptyConfirmSignUpUsername);\n assertValidationError(!!confirmationCode, AuthValidationErrorCode.EmptyConfirmSignUpCode);\n const UserContextData = getUserContextData({\n username,\n userPoolId,\n userPoolClientId,\n });\n const confirmSignUpClient = createConfirmSignUpClient({\n endpointResolver: createCognitoUserPoolEndpointResolver({\n endpointOverride: userPoolEndpoint,\n }),\n });\n const { Session: session } = await confirmSignUpClient({\n region: getRegionFromUserPoolId(authConfig.userPoolId),\n userAgentValue: getAuthUserAgentValue(AuthAction.ConfirmSignUp),\n }, {\n Username: username,\n ConfirmationCode: confirmationCode,\n ClientMetadata: clientMetadata,\n ForceAliasCreation: options?.forceAliasCreation,\n ClientId: authConfig.userPoolClientId,\n UserContextData,\n });\n return new Promise((resolve, reject) => {\n try {\n const signUpOut = {\n isSignUpComplete: true,\n nextStep: {\n signUpStep: 'DONE',\n },\n };\n const autoSignInStoreState = autoSignInStore.getState();\n if (!autoSignInStoreState.active ||\n autoSignInStoreState.username !== username) {\n resolve(signUpOut);\n resetAutoSignIn();\n return;\n }\n autoSignInStore.dispatch({ type: 'SET_SESSION', value: session });\n const stopListener = HubInternal.listen('auth-internal', ({ payload }) => {\n switch (payload.event) {\n case 'autoSignIn':\n resolve({\n isSignUpComplete: true,\n nextStep: {\n signUpStep: 'COMPLETE_AUTO_SIGN_IN',\n },\n });\n stopListener();\n }\n });\n HubInternal.dispatch('auth-internal', {\n event: 'confirmSignUp',\n data: signUpOut,\n });\n }\n catch (error) {\n reject(error);\n }\n });\n}\n\nexport { confirmSignUp };\n//# sourceMappingURL=confirmSignUp.mjs.map\n","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { signUp, confirmSignUp, signIn } from 'aws-amplify/auth';\nimport { Eye, EyeOff } from 'lucide-react';\nimport useAuth from '../hooks/useAuth';\nimport usePageTitle from '../hooks/usePageTitle';\nimport StagingBadge from '../components/StagingBadge';\nimport SiteHeader from '../components/SiteHeader';\n\nconst readNextPath = () => {\n if (typeof window === 'undefined') return null;\n const params = new URLSearchParams(window.location.search);\n const next = params.get('next');\n if (!next) return null;\n if (!next.startsWith('/') || next.startsWith('//')) return null;\n return next;\n};\n\nconst SignUp = () => {\n const { t } = useTranslation();\n usePageTitle('titles.signUp');\n const { isAuthenticated, isLoading } = useAuth();\n const nextPath = readNextPath();\n const [stage, setStage] = useState('form'); // form | confirm\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [passwordVisible, setPasswordVisible] = useState(false);\n const [code, setCode] = useState('');\n const [message, setMessage] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n if (!isLoading && isAuthenticated) {\n window.location.href = nextPath || '/app/';\n }\n }, [isAuthenticated, isLoading, nextPath]);\n\n const handleSignUp = async (e) => {\n e.preventDefault();\n setError('');\n setMessage('');\n setBusy(true);\n try {\n await signUp({ username: email, password, options: { userAttributes: { email } } });\n setMessage(t('auth.success.signup'));\n setStage('confirm');\n } catch (err) {\n const key = err?.name || err?.code;\n setError(t(`auth.errors.${key}`, t('auth.errors.default')));\n } finally {\n setBusy(false);\n }\n };\n\n const handleConfirm = async (e) => {\n e.preventDefault();\n setError('');\n setMessage('');\n setBusy(true);\n try {\n await confirmSignUp({ username: email, confirmationCode: code });\n setMessage(t('auth.success.confirm'));\n // 自動でサインインして /app へ\n await signIn({ username: email, password });\n window.location.href = nextPath || '/app/';\n } catch (err) {\n const key = err?.name || err?.code;\n setError(t(`auth.errors.${key}`, t('auth.errors.default')));\n } finally {\n setBusy(false);\n }\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 flex flex-col\">\n <StagingBadge />\n <SiteHeader variant=\"dark\" showX={false} />\n <main className=\"flex-1 flex items-center justify-center px-4 pb-12\">\n <div className=\"w-full max-w-md bg-slate-900/70 border border-slate-800 rounded-2xl shadow-2xl p-8 space-y-6\">\n <div className=\"text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center w-12 h-12 rounded-xl bg-blue-500/10 text-blue-300 border border-blue-500/30\">\n <span className=\"font-black text-lg\">S</span>\n </div>\n <h1 className=\"text-2xl font-bold\">{stage === 'form' ? t('auth.signupTitle') : t('auth.actions.confirm')}</h1>\n <p className=\"text-slate-400 text-sm\">{stage === 'form' ? t('auth.signupSubtitle') : t('auth.code')}</p>\n </div>\n\n {stage === 'form' && (\n <form onSubmit={handleSignUp} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"signup-email\" className=\"block text-sm text-slate-300\">\n {t('auth.email')}\n </label>\n <input\n id=\"signup-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoComplete=\"email\"\n className=\"w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500\"\n placeholder={t('auth.placeholders.email')}\n />\n </div>\n <div className=\"space-y-2\">\n <label htmlFor=\"signup-password\" className=\"block text-sm text-slate-300\">\n {t('auth.password')}\n </label>\n <div className=\"relative\">\n <input\n id=\"signup-password\"\n type={passwordVisible ? 'text' : 'password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n required\n autoComplete=\"new-password\"\n className=\"w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 pr-12 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500\"\n placeholder={t('auth.placeholders.passwordNew')}\n />\n <button\n type=\"button\"\n onClick={() => setPasswordVisible((prev) => !prev)}\n className=\"absolute inset-y-0 right-0 flex items-center px-3 text-slate-400 hover:text-slate-200\"\n aria-label={\n passwordVisible\n ? t('auth.actions.hidePassword', { defaultValue: 'Hide password' })\n : t('auth.actions.showPassword', { defaultValue: 'Show password' })\n }\n title={\n passwordVisible\n ? t('auth.actions.hidePassword', { defaultValue: 'Hide password' })\n : t('auth.actions.showPassword', { defaultValue: 'Show password' })\n }\n >\n {passwordVisible ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n </div>\n {error && (\n <div\n role=\"alert\"\n className=\"text-sm text-rose-400 bg-rose-950/40 border border-rose-700/50 rounded-lg px-3 py-2\"\n >\n {error}\n </div>\n )}\n {message && (\n <div\n role=\"status\"\n className=\"text-sm text-emerald-300 bg-emerald-950/40 border border-emerald-700/50 rounded-lg px-3 py-2\"\n >\n {message}\n </div>\n )}\n <button\n type=\"submit\"\n disabled={busy}\n className=\"w-full bg-blue-500 hover:bg-blue-600 text-white font-semibold rounded-lg py-3 transition disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n {t('auth.actions.createAccount')}\n </button>\n </form>\n )}\n\n {stage === 'confirm' && (\n <form onSubmit={handleConfirm} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label htmlFor=\"signup-email\" className=\"block text-sm text-slate-300\">\n {t('auth.email')}\n </label>\n <input\n id=\"signup-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n autoComplete=\"email\"\n className=\"w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500\"\n placeholder={t('auth.placeholders.email')}\n />\n </div>\n <div className=\"space-y-2\">\n <label htmlFor=\"signup-code\" className=\"block text-sm text-slate-300\">\n {t('auth.code')}\n </label>\n <input\n id=\"signup-code\"\n type=\"text\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n required\n className=\"w-full rounded-lg bg-slate-950 border border-slate-700 px-4 py-3 text-sm focus:outline-hidden focus:ring-2 focus:ring-blue-500\"\n placeholder=\"123456\"\n />\n </div>\n {error && (\n <div\n role=\"alert\"\n className=\"text-sm text-rose-400 bg-rose-950/40 border border-rose-700/50 rounded-lg px-3 py-2\"\n >\n {error}\n </div>\n )}\n {message && (\n <div\n role=\"status\"\n className=\"text-sm text-emerald-300 bg-emerald-950/40 border border-emerald-700/50 rounded-lg px-3 py-2\"\n >\n {message}\n </div>\n )}\n <button\n type=\"submit\"\n disabled={busy}\n className=\"w-full bg-blue-500 hover:bg-blue-600 text-white font-semibold rounded-lg py-3 transition disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n {t('auth.actions.confirm')}\n </button>\n </form>\n )}\n\n <div className=\"text-center text-sm text-slate-400 space-y-1\">\n <div>\n {t('auth.actions.haveAccount')}{' '}\n <button\n type=\"button\"\n className=\"text-blue-300 hover:text-blue-200 underline\"\n onClick={() => {\n window.location.href = nextPath ? `/signin?next=${encodeURIComponent(nextPath)}` : '/signin';\n }}\n >\n {t('auth.actions.goToSignIn')}\n </button>\n </div>\n <div className=\"text-slate-500 text-xs\">\n <div>{t('auth.helper.terms')}</div>\n <div className=\"mt-1 flex items-center justify-center gap-2\">\n <a href=\"/terms\" className=\"underline underline-offset-4 hover:text-slate-200\">\n {t('landing.footer.terms')}\n </a>\n <span aria-hidden=\"true\">·</span>\n <a href=\"/privacy\" className=\"underline underline-offset-4 hover:text-slate-200\">\n {t('landing.footer.privacy')}\n </a>\n </div>\n </div>\n </div>\n </div>\n </main>\n </div>\n );\n};\n\nexport default SignUp;\n"],"x_google_ignoreList":[0,1],"mappings":"iaAUA,IAAM,EAA6B,GAAW,EAAkB,EAAgC,EAAyB,eAAe,EAAG,EAA2B,EAAG,CACrK,GAAG,EACH,GAAG,CACP,CAAC,ECmBD,eAAe,EAAc,EAAO,CAChC,GAAM,CAAE,WAAU,mBAAkB,WAAY,EAC1C,EAAa,EAAQ,UAAU,EAAE,MAAM,QAC7C,EAA0B,CAAU,EACpC,GAAM,CAAE,aAAY,mBAAkB,oBAAqB,EACrD,EAAiB,GAAS,eAChC,EAAsB,CAAC,CAAC,EAAU,EAAwB,0BAA0B,EACpF,EAAsB,CAAC,CAAC,EAAkB,EAAwB,sBAAsB,EACxF,IAAM,EAAkB,EAAmB,CACvC,WACA,aACA,kBACJ,CAAC,EAMK,CAAE,QAAS,GAAY,MALD,EAA0B,CAClD,iBAAkB,EAAsC,CACpD,iBAAkB,CACtB,CAAC,CACL,CACqD,EAAE,CACnD,OAAQ,EAAwB,EAAW,UAAU,EACrD,eAAgB,EAAsB,EAAW,aAAa,CAClE,EAAG,CACC,SAAU,EACV,iBAAkB,EAClB,eAAgB,EAChB,mBAAoB,GAAS,mBAC7B,SAAU,EAAW,iBACrB,iBACJ,CAAC,EACD,OAAO,IAAI,SAAS,EAAS,IAAW,CACpC,GAAI,CACA,IAAM,EAAY,CACd,iBAAkB,GAClB,SAAU,CACN,WAAY,MAChB,CACJ,EACM,EAAuB,EAAgB,SAAS,EACtD,GAAI,CAAC,EAAqB,QACtB,EAAqB,WAAa,EAAU,CAC5C,EAAQ,CAAS,EACjB,EAAgB,EAChB,MACJ,CACA,EAAgB,SAAS,CAAE,KAAM,cAAe,MAAO,CAAQ,CAAC,EAChE,IAAM,EAAe,EAAY,OAAO,iBAAkB,CAAE,aAAc,CACtE,OAAQ,EAAQ,MAAhB,CACI,IAAK,aACD,EAAQ,CACJ,iBAAkB,GAClB,SAAU,CACN,WAAY,uBAChB,CACJ,CAAC,EACD,EAAa,CACrB,CACJ,CAAC,EACD,EAAY,SAAS,gBAAiB,CAClC,MAAO,gBACP,KAAM,CACV,CAAC,CACL,OACO,EAAO,CACV,EAAO,CAAK,CAChB,CACJ,CAAC,CACL,sBCzFM,MAAqB,CACzB,GAAI,OAAO,OAAW,IAAa,OAAO,KAE1C,IAAM,EAAO,IADM,gBAAgB,OAAO,SAAS,MACtC,EAAO,IAAI,MAAM,EAG9B,MAFI,CAAC,GACD,CAAC,EAAK,WAAW,GAAG,GAAK,EAAK,WAAW,IAAI,EAAU,KACpD,CACT,EAEM,MAAe,CACnB,GAAM,CAAE,KAAM,EAAe,EAC7B,EAAa,eAAe,EAC5B,GAAM,CAAE,kBAAiB,aAAc,EAAQ,EACzC,EAAW,EAAa,EACxB,CAAC,EAAO,IAAA,EAAA,EAAA,UAAqB,MAAM,EACnC,CAAC,EAAO,IAAA,EAAA,EAAA,UAAqB,EAAE,EAC/B,CAAC,EAAU,IAAA,EAAA,EAAA,UAAwB,EAAE,EACrC,CAAC,EAAiB,IAAA,EAAA,EAAA,UAA+B,EAAK,EACtD,CAAC,EAAM,IAAA,EAAA,EAAA,UAAoB,EAAE,EAC7B,CAAC,EAAS,IAAA,EAAA,EAAA,UAAuB,EAAE,EACnC,CAAC,EAAO,IAAA,EAAA,EAAA,UAAqB,EAAE,EAC/B,CAAC,EAAM,IAAA,EAAA,EAAA,UAAoB,EAAK,EA4CtC,OA1CA,EAAA,EAAA,eAAgB,CACV,CAAC,GAAa,IAChB,OAAO,SAAS,KAAO,GAAY,QAEvC,EAAG,CAAC,EAAiB,EAAW,CAAQ,CAAC,GAuCvC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0GAAf,EACE,EAAA,EAAA,KAAC,EAAD,CAAe,CAAA,GACf,EAAA,EAAA,KAAC,EAAD,CAAY,QAAQ,OAAO,MAAO,EAAQ,CAAA,GAC1C,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,+DACd,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wGAAf,EACA,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,iCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,gIACb,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,8BAAqB,GAAO,CAAA,CACzC,CAAA,GACL,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,8BAAyC,EAAnB,IAAU,OAAW,mBAAwB,sBAAsB,CAAM,CAAA,GAC7G,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,kCAA6C,EAAnB,IAAU,OAAW,sBAA2B,WAAW,CAAK,CAAA,CACpG,IAEJ,IAAU,SACT,EAAA,EAAA,MAAC,OAAD,CAAM,SAAU,KAnDI,IAAM,CAChC,EAAE,eAAe,EACjB,EAAS,EAAE,EACX,EAAW,EAAE,EACb,EAAQ,EAAI,EACZ,GAAI,CACF,MAAM,EAAO,CAAE,SAAU,EAAO,WAAU,QAAS,CAAE,eAAgB,CAAE,OAAM,CAAE,CAAE,CAAC,EAClF,EAAW,EAAE,qBAAqB,CAAC,EACnC,EAAS,SAAS,CACpB,OAAS,EAAK,CAEZ,EAAS,EAAE,eADC,GAAK,MAAQ,GAAK,OACG,EAAE,qBAAqB,CAAC,CAAC,CAC5D,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAoCsC,UAAU,qBAAxC,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,QAAQ,eAAe,UAAU,wCACrC,EAAE,YAAY,CACV,CAAA,GACP,EAAA,EAAA,KAAC,QAAD,CACE,GAAG,eACH,KAAK,QACL,MAAO,EACP,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EACxC,SAAA,GACA,aAAa,QACb,UAAU,iIACV,YAAa,EAAE,yBAAyB,CACzC,CAAA,CACE,KACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,QAAQ,kBAAkB,UAAU,wCACxC,EAAE,eAAe,CACb,CAAA,GACP,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,oBAAf,EACE,EAAA,EAAA,KAAC,QAAD,CACE,GAAG,kBACH,KAAM,EAAkB,OAAS,WACjC,MAAO,EACP,SAAW,GAAM,EAAY,EAAE,OAAO,KAAK,EAC3C,SAAA,GACA,aAAa,eACb,UAAU,uIACV,YAAa,EAAE,+BAA+B,CAC/C,CAAA,GACD,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,YAAe,EAAoB,GAAS,CAAC,CAAI,EACjD,UAAU,wFACV,aACE,EACI,EAAE,4BAA6B,CAAE,aAAc,eAAgB,CAAC,EAChE,EAAE,4BAA6B,CAAE,aAAc,eAAgB,CAAC,EAEtE,MACE,EACI,EAAE,4BAA6B,CAAE,aAAc,eAAgB,CAAC,EAChE,EAAE,4BAA6B,CAAE,aAAc,eAAgB,CAAC,WAGrE,GAAkB,EAAA,EAAA,KAAC,EAAD,CAAQ,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,KAAC,EAAD,CAAK,KAAM,EAAK,CAAA,CACpD,CAAA,CACL,GACF,IACJ,IACC,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,QACL,UAAU,+FAET,CACE,CAAA,EAEN,IACC,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,SACL,UAAU,wGAET,CACE,CAAA,GAEP,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,SAAU,EACV,UAAU,oJAET,EAAE,4BAA4B,CACzB,CAAA,CACJ,IAGP,IAAU,YACT,EAAA,EAAA,MAAC,OAAD,CAAM,SAAU,KA/GK,IAAM,CACjC,EAAE,eAAe,EACjB,EAAS,EAAE,EACX,EAAW,EAAE,EACb,EAAQ,EAAI,EACZ,GAAI,CACF,MAAM,EAAc,CAAE,SAAU,EAAO,iBAAkB,CAAK,CAAC,EAC/D,EAAW,EAAE,sBAAsB,CAAC,EAEpC,MAAM,EAAO,CAAE,SAAU,EAAO,UAAS,CAAC,EAC1C,OAAO,SAAS,KAAO,GAAY,OACrC,OAAS,EAAK,CAEZ,EAAS,EAAE,eADC,GAAK,MAAQ,GAAK,OACG,EAAE,qBAAqB,CAAC,CAAC,CAC5D,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EA8FuC,UAAU,qBAAzC,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,QAAQ,eAAe,UAAU,wCACrC,EAAE,YAAY,CACV,CAAA,GACP,EAAA,EAAA,KAAC,QAAD,CACE,GAAG,eACH,KAAK,QACL,MAAO,EACP,SAAW,GAAM,EAAS,EAAE,OAAO,KAAK,EACxC,SAAA,GACA,aAAa,QACb,UAAU,iIACV,YAAa,EAAE,yBAAyB,CACzC,CAAA,CACE,KACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,EACE,EAAA,EAAA,KAAC,QAAD,CAAO,QAAQ,cAAc,UAAU,wCACpC,EAAE,WAAW,CACT,CAAA,GACP,EAAA,EAAA,KAAC,QAAD,CACE,GAAG,cACH,KAAK,OACL,MAAO,EACP,SAAW,GAAM,EAAQ,EAAE,OAAO,KAAK,EACvC,SAAA,GACA,UAAU,iIACV,YAAY,QACb,CAAA,CACE,IACJ,IACC,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,QACL,UAAU,+FAET,CACE,CAAA,EAEN,IACC,EAAA,EAAA,KAAC,MAAD,CACE,KAAK,SACL,UAAU,wGAET,CACE,CAAA,GAEP,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,SAAU,EACV,UAAU,oJAET,EAAE,sBAAsB,CACnB,CAAA,CACJ,KAGR,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,wDAAf,EACE,EAAA,EAAA,MAAC,MAAD,CAAA,SAAA,CACG,EAAE,0BAA0B,EAAG,KAChC,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,UAAU,8CACV,YAAe,CACb,OAAO,SAAS,KAAO,EAAW,gBAAgB,mBAAmB,CAAQ,IAAM,SACrF,WAEC,EAAE,yBAAyB,CACtB,CAAA,CACL,CAAA,CAAA,GACL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kCAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAA,SAAM,EAAE,mBAAmB,CAAO,CAAA,GAClC,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,uDAAf,EACE,EAAA,EAAA,KAAC,IAAD,CAAG,KAAK,SAAS,UAAU,6DACxB,EAAE,sBAAsB,CACxB,CAAA,GACH,EAAA,EAAA,KAAC,OAAD,CAAM,cAAY,gBAAO,GAAO,CAAA,GAChC,EAAA,EAAA,KAAC,IAAD,CAAG,KAAK,WAAW,UAAU,6DAC1B,EAAE,wBAAwB,CAC1B,CAAA,CACA,GACF,GACF,GACA,GACD,CAAA,CACH,GAET"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,x as r}from"./index-D7D6ZRCW.js";import{a as i,o as a,s as o,t as s}from"./LanguageSwitcher-hFv9zl1u.js";var c=o(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),l=e(t(),1),u=n(),d=({className:e})=>(0,u.jsx)(`a`,{href:`https://x.com/shipscreenscom`,target:`_blank`,rel:`noopener noreferrer`,className:`focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-500 rounded-md ${e}`,"aria-label":`ShipScreens on X (opens in new tab)`,children:(0,u.jsx)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`currentColor`,"aria-hidden":`true`,children:(0,u.jsx)(`path`,{d:`M20.5 3h-2.4L12 9.6 6.9 3H3l7.2 9.1L3.2 21h2.4L12 14l6.6 7h3.1l-7.7-9.5L20.5 3Z`})})}),f=({variant:e=`dark`,active:t=null,logoHref:n=`/`,toolsHref:o=`/tools/`,pricingHref:f=`/pricing`,openAppHref:p=`/app/`,showTools:m=!0,showPricing:h=!0,showOpenApp:g=!0,showX:_=!0,showLanguageSwitcher:v=!0,languageSwitcherClassName:y=`hidden sm:flex`,onToolsClick:b,onPricingClick:x,onOpenAppClick:S,primaryCta:C=null})=>{let{t:w}=r(),T=e===`dark`,E=!!(C?.href&&C?.label),[D,O]=(0,l.useState)(!1),k=(0,l.useRef)(null),A=(0,l.useRef)(null),j=(0,l.useCallback)(()=>O(!1),[]);i({isOpen:D,onClose:j,panelRef:k,initialFocusRef:A});let M=T?`focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950 rounded-md`:`focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2 focus-visible:ring-offset-white rounded-md`,N=T?`text-sm text-slate-300 hover:text-white transition-colors ${M}`:`text-sm text-slate-600 hover:text-slate-900 transition-colors ${M}`,P=T?`text-white font-semibold`:`text-slate-900 font-semibold`,F=e=>`${N}${t===e?` ${P}`:``}`,I=T?`flex items-center justify-between px-3 py-2 rounded-lg border border-slate-800 bg-slate-950 text-sm text-slate-200 hover:bg-slate-900 transition ${M}`:`flex items-center justify-between px-3 py-2 rounded-lg border border-slate-200 bg-white text-sm text-slate-800 hover:bg-slate-50 transition ${M}`,L=T?`border-blue-500 text-white`:`border-blue-600 text-slate-900`,R=e=>`${I}${t===e?` ${L}`:``}`;return(0,u.jsxs)(u.Fragment,{children:[T?(0,u.jsxs)(`header`,{className:`max-w-6xl mx-auto px-4 py-4 sm:px-6 sm:py-6 flex items-center justify-between gap-4`,children:[(0,u.jsxs)(`a`,{href:n,className:`flex items-center gap-3 hover:opacity-90 transition-opacity ${M}`,children:[(0,u.jsx)(`div`,{className:`w-10 h-10 rounded-xl border border-slate-800 bg-slate-950 p-1 flex items-center justify-center overflow-hidden shadow-xs`,children:(0,u.jsx)(`img`,{src:`/app/assets/icons/favicon-32x32.png`,alt:`ShipScreens`,className:`w-full h-full object-contain`,loading:`lazy`})}),(0,u.jsx)(`span`,{className:`text-lg font-bold`,children:`ShipScreens`})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-2 sm:gap-3`,children:[v&&(0,u.jsx)(s,{className:y}),_&&(0,u.jsx)(d,{className:`hidden sm:inline text-slate-300 hover:text-white transition-colors`}),m&&(0,u.jsx)(`a`,{href:o,onClick:b,className:`hidden sm:inline ${F(`tools`)}`,"aria-current":t===`tools`?`page`:void 0,children:w(`landing.nav.tools`)}),h&&(0,u.jsx)(`a`,{href:f,onClick:x,className:`hidden sm:inline ${F(`pricing`)}`,"aria-current":t===`pricing`?`page`:void 0,children:w(`landing.nav.pricing`,{defaultValue:`Pricing`})}),g&&(0,u.jsx)(`a`,{href:p,onClick:S,className:`${E?`hidden sm:inline `:``}${F(`app`)}`,"aria-current":t===`app`?`page`:void 0,children:w(`landing.nav.openApp`)}),E&&(0,u.jsx)(`a`,{href:C.href,onClick:C.onClick,className:`px-3 py-1.5 sm:px-4 sm:py-2 text-sm whitespace-nowrap rounded-lg bg-white text-slate-900 font-semibold hover:scale-[1.02] transition ${M}`,children:C.label}),(0,u.jsx)(`button`,{type:`button`,onClick:()=>O(!0),className:`sm:hidden p-2 rounded-lg border border-slate-800 bg-slate-950 text-slate-200 hover:bg-slate-900 transition ${M}`,"aria-label":w(`common.menu`,{defaultValue:`Menu`}),"aria-controls":`shipscreens-mobile-menu`,"aria-expanded":D,children:(0,u.jsx)(c,{size:18})})]})]}):(0,u.jsx)(`header`,{className:`border-b border-slate-200 bg-white`,children:(0,u.jsxs)(`div`,{className:`max-w-4xl mx-auto px-4 py-4 flex items-center justify-between gap-4`,children:[(0,u.jsxs)(`a`,{href:n,className:`flex items-center gap-3 hover:opacity-90 transition-opacity ${M}`,children:[(0,u.jsx)(`div`,{className:`w-9 h-9 rounded-xl border border-slate-200 bg-white p-1 flex items-center justify-center overflow-hidden shadow-xs`,children:(0,u.jsx)(`img`,{src:`/app/assets/icons/favicon-32x32.png`,alt:`ShipScreens`,className:`w-full h-full object-contain`,loading:`lazy`})}),(0,u.jsx)(`span`,{className:`font-bold text-slate-900`,children:`ShipScreens`})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-3`,children:[v&&(0,u.jsx)(s,{className:y}),_&&(0,u.jsx)(d,{className:`hidden sm:inline text-slate-500 hover:text-slate-900 transition-colors`}),m&&(0,u.jsx)(`a`,{href:o,onClick:b,className:`hidden sm:inline ${F(`tools`)}`,"aria-current":t===`tools`?`page`:void 0,children:w(`landing.nav.tools`)}),h&&(0,u.jsx)(`a`,{href:f,onClick:x,className:`hidden sm:inline ${F(`pricing`)}`,"aria-current":t===`pricing`?`page`:void 0,children:w(`landing.nav.pricing`,{defaultValue:`Pricing`})}),g&&(0,u.jsx)(`a`,{href:p,onClick:S,className:F(`app`),"aria-current":t===`app`?`page`:void 0,children:w(`landing.nav.openApp`)}),C?.href&&C?.label&&(0,u.jsx)(`a`,{href:C.href,onClick:C.onClick,className:`px-4 py-2 rounded-lg bg-slate-900 text-white font-semibold hover:bg-slate-800 transition ${M}`,children:C.label}),(0,u.jsx)(`button`,{type:`button`,onClick:()=>O(!0),className:`sm:hidden p-2 rounded-lg border border-slate-200 bg-white text-slate-700 hover:bg-slate-50 transition ${M}`,"aria-label":w(`common.menu`,{defaultValue:`Menu`}),"aria-controls":`shipscreens-mobile-menu`,"aria-expanded":D,children:(0,u.jsx)(c,{size:18})})]})]})}),(()=>{if(!D)return null;let e=T?`bg-slate-900/70`:`bg-slate-900/40`,n=T?`bg-slate-950 border-slate-800 text-white`:`bg-white border-slate-200 text-slate-800`,r=T?`border-slate-800`:`border-slate-200`,i=T?`border-slate-800 text-slate-200 hover:bg-slate-900 ${M}`:`border-slate-200 text-slate-600 hover:bg-slate-50 ${M}`,c=e=>t=>{e?.(t),j()},l=w(`common.menu`,{defaultValue:`Menu`});return(0,u.jsx)(`div`,{className:`fixed inset-0 z-2200 ${e} backdrop-blur-xs p-4 sm:hidden`,role:`dialog`,"aria-modal":`true`,"aria-label":l,onMouseDown:e=>{e.target===e.currentTarget&&j()},children:(0,u.jsxs)(`div`,{ref:k,id:`shipscreens-mobile-menu`,className:`w-full max-w-sm ml-auto rounded-2xl shadow-2xl border overflow-hidden ${n}`,children:[(0,u.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-3 border-b ${r}`,children:[(0,u.jsx)(`div`,{className:`text-sm font-bold`,children:l}),(0,u.jsx)(`button`,{ref:A,type:`button`,onClick:j,className:`p-2 rounded-lg border transition ${i}`,"aria-label":w(`common.close`,{defaultValue:`Close`}),title:w(`common.close`,{defaultValue:`Close`}),children:(0,u.jsx)(a,{size:16})})]}),(0,u.jsxs)(`div`,{className:`p-4 space-y-3`,children:[v&&(0,u.jsx)(s,{className:`w-full justify-center`}),(0,u.jsxs)(`div`,{className:`space-y-2`,children:[m&&(0,u.jsx)(`a`,{href:o,onClick:c(b),className:R(`tools`),"aria-current":t===`tools`?`page`:void 0,children:(0,u.jsx)(`span`,{children:w(`landing.nav.tools`)})}),h&&(0,u.jsx)(`a`,{href:f,onClick:c(x),className:R(`pricing`),"aria-current":t===`pricing`?`page`:void 0,children:(0,u.jsx)(`span`,{children:w(`landing.nav.pricing`,{defaultValue:`Pricing`})})}),g&&(0,u.jsx)(`a`,{href:p,onClick:c(S),className:R(`app`),"aria-current":t===`app`?`page`:void 0,children:(0,u.jsx)(`span`,{children:w(`landing.nav.openApp`)})}),_&&(0,u.jsx)(`a`,{href:`https://x.com/shipscreenscom`,target:`_blank`,rel:`noopener noreferrer`,className:I,children:(0,u.jsx)(`span`,{children:`X`})})]}),C?.href&&C?.label&&(0,u.jsx)(`a`,{href:C.href,onClick:c(C.onClick),className:`w-full inline-flex items-center justify-center px-4 py-2 rounded-lg font-semibold transition ${T?`bg-white text-slate-900 hover:scale-[1.02]`:`bg-slate-900 text-white hover:bg-slate-800`} ${M}`,children:C.label})]})]})})})()]})};export{f as t};
|
|
2
|
+
//# sourceMappingURL=SiteHeader-CJqQ0pL3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteHeader-CJqQ0pL3.js","names":[],"sources":["../../node_modules/lucide-react/dist/esm/icons/menu.mjs","../../src/components/SiteHeader.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: \"M4 5h16\", key: \"1tepv9\" }],\n [\"path\", { d: \"M4 12h16\", key: \"1lakjw\" }],\n [\"path\", { d: \"M4 19h16\", key: \"1djgab\" }]\n];\nconst Menu = createLucideIcon(\"menu\", __iconNode);\n\nexport { __iconNode, Menu as default };\n//# sourceMappingURL=menu.mjs.map\n","import React, { useCallback, useRef, useState } from 'react';\nimport { Menu, X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport LanguageSwitcher from './LanguageSwitcher';\nimport useModalA11y from '../hooks/useModalA11y';\n\nconst XLink = ({ className }) => (\n <a\n href=\"https://x.com/shipscreenscom\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-500 rounded-md ${className}`}\n aria-label=\"ShipScreens on X (opens in new tab)\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M20.5 3h-2.4L12 9.6 6.9 3H3l7.2 9.1L3.2 21h2.4L12 14l6.6 7h3.1l-7.7-9.5L20.5 3Z\" />\n </svg>\n </a>\n);\n\nconst SiteHeader = ({\n variant = 'dark',\n active = null, // 'tools' | 'pricing' | 'app' | null\n logoHref = '/',\n toolsHref = '/tools/',\n pricingHref = '/pricing',\n openAppHref = '/app/',\n showTools = true,\n showPricing = true,\n showOpenApp = true,\n showX = true,\n showLanguageSwitcher = true,\n languageSwitcherClassName = 'hidden sm:flex',\n onToolsClick,\n onPricingClick,\n onOpenAppClick,\n primaryCta = null, // { href, label, onClick }\n}) => {\n const { t } = useTranslation();\n const isDark = variant === 'dark';\n const hasPrimaryCta = Boolean(primaryCta?.href && primaryCta?.label);\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n const mobileMenuPanelRef = useRef(null);\n const mobileMenuCloseRef = useRef(null);\n\n const closeMobileMenu = useCallback(() => setMobileMenuOpen(false), []);\n\n useModalA11y({\n isOpen: mobileMenuOpen,\n onClose: closeMobileMenu,\n panelRef: mobileMenuPanelRef,\n initialFocusRef: mobileMenuCloseRef,\n });\n\n const focusRing = isDark\n ? 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-950 rounded-md'\n : 'focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2 focus-visible:ring-offset-white rounded-md';\n const linkBase = isDark\n ? `text-sm text-slate-300 hover:text-white transition-colors ${focusRing}`\n : `text-sm text-slate-600 hover:text-slate-900 transition-colors ${focusRing}`;\n const linkActive = isDark ? 'text-white font-semibold' : 'text-slate-900 font-semibold';\n const linkClass = (id) => `${linkBase}${active === id ? ` ${linkActive}` : ''}`;\n\n const mobileMenuLinkBase = isDark\n ? `flex items-center justify-between px-3 py-2 rounded-lg border border-slate-800 bg-slate-950 text-sm text-slate-200 hover:bg-slate-900 transition ${focusRing}`\n : `flex items-center justify-between px-3 py-2 rounded-lg border border-slate-200 bg-white text-sm text-slate-800 hover:bg-slate-50 transition ${focusRing}`;\n const mobileMenuLinkActive = isDark ? 'border-blue-500 text-white' : 'border-blue-600 text-slate-900';\n const mobileMenuLinkClass = (id) => `${mobileMenuLinkBase}${active === id ? ` ${mobileMenuLinkActive}` : ''}`;\n\n const renderMobileMenu = () => {\n if (!mobileMenuOpen) return null;\n\n const menuBg = isDark ? 'bg-slate-900/70' : 'bg-slate-900/40';\n const panelBase = isDark ? 'bg-slate-950 border-slate-800 text-white' : 'bg-white border-slate-200 text-slate-800';\n const panelHeaderBorder = isDark ? 'border-slate-800' : 'border-slate-200';\n const closeButtonStyle = isDark\n ? `border-slate-800 text-slate-200 hover:bg-slate-900 ${focusRing}`\n : `border-slate-200 text-slate-600 hover:bg-slate-50 ${focusRing}`;\n\n const handleNav = (callback) => (event) => {\n callback?.(event);\n closeMobileMenu();\n };\n\n const menuLabel = t('common.menu', { defaultValue: 'Menu' });\n\n return (\n <div\n className={`fixed inset-0 z-2200 ${menuBg} backdrop-blur-xs p-4 sm:hidden`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={menuLabel}\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) closeMobileMenu();\n }}\n >\n <div\n ref={mobileMenuPanelRef}\n id=\"shipscreens-mobile-menu\"\n className={`w-full max-w-sm ml-auto rounded-2xl shadow-2xl border overflow-hidden ${panelBase}`}\n >\n <div className={`flex items-center justify-between px-4 py-3 border-b ${panelHeaderBorder}`}>\n <div className=\"text-sm font-bold\">{menuLabel}</div>\n <button\n ref={mobileMenuCloseRef}\n type=\"button\"\n onClick={closeMobileMenu}\n className={`p-2 rounded-lg border transition ${closeButtonStyle}`}\n aria-label={t('common.close', { defaultValue: 'Close' })}\n title={t('common.close', { defaultValue: 'Close' })}\n >\n <X size={16} />\n </button>\n </div>\n\n <div className=\"p-4 space-y-3\">\n {showLanguageSwitcher && <LanguageSwitcher className=\"w-full justify-center\" />}\n\n <div className=\"space-y-2\">\n {showTools && (\n <a\n href={toolsHref}\n onClick={handleNav(onToolsClick)}\n className={mobileMenuLinkClass('tools')}\n aria-current={active === 'tools' ? 'page' : undefined}\n >\n <span>{t('landing.nav.tools')}</span>\n </a>\n )}\n\n {showPricing && (\n <a\n href={pricingHref}\n onClick={handleNav(onPricingClick)}\n className={mobileMenuLinkClass('pricing')}\n aria-current={active === 'pricing' ? 'page' : undefined}\n >\n <span>{t('landing.nav.pricing', { defaultValue: 'Pricing' })}</span>\n </a>\n )}\n\n {showOpenApp && (\n <a\n href={openAppHref}\n onClick={handleNav(onOpenAppClick)}\n className={mobileMenuLinkClass('app')}\n aria-current={active === 'app' ? 'page' : undefined}\n >\n <span>{t('landing.nav.openApp')}</span>\n </a>\n )}\n\n {showX && (\n <a\n href=\"https://x.com/shipscreenscom\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={mobileMenuLinkBase}\n >\n <span>X</span>\n </a>\n )}\n </div>\n\n {primaryCta?.href && primaryCta?.label && (\n <a\n href={primaryCta.href}\n onClick={handleNav(primaryCta.onClick)}\n className={`w-full inline-flex items-center justify-center px-4 py-2 rounded-lg font-semibold transition ${\n isDark ? 'bg-white text-slate-900 hover:scale-[1.02]' : 'bg-slate-900 text-white hover:bg-slate-800'\n } ${focusRing}`}\n >\n {primaryCta.label}\n </a>\n )}\n </div>\n </div>\n </div>\n );\n };\n\n const headerContent = isDark ? (\n <header className=\"max-w-6xl mx-auto px-4 py-4 sm:px-6 sm:py-6 flex items-center justify-between gap-4\">\n <a href={logoHref} className={`flex items-center gap-3 hover:opacity-90 transition-opacity ${focusRing}`}>\n <div className=\"w-10 h-10 rounded-xl border border-slate-800 bg-slate-950 p-1 flex items-center justify-center overflow-hidden shadow-xs\">\n <img\n src=\"/app/assets/icons/favicon-32x32.png\"\n alt=\"ShipScreens\"\n className=\"w-full h-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n <span className=\"text-lg font-bold\">ShipScreens</span>\n </a>\n\n <div className=\"flex items-center gap-2 sm:gap-3\">\n {showLanguageSwitcher && <LanguageSwitcher className={languageSwitcherClassName} />}\n {showX && <XLink className=\"hidden sm:inline text-slate-300 hover:text-white transition-colors\" />}\n\n {showTools && (\n <a\n href={toolsHref}\n onClick={onToolsClick}\n className={`hidden sm:inline ${linkClass('tools')}`}\n aria-current={active === 'tools' ? 'page' : undefined}\n >\n {t('landing.nav.tools')}\n </a>\n )}\n\n {showPricing && (\n <a\n href={pricingHref}\n onClick={onPricingClick}\n className={`hidden sm:inline ${linkClass('pricing')}`}\n aria-current={active === 'pricing' ? 'page' : undefined}\n >\n {t('landing.nav.pricing', { defaultValue: 'Pricing' })}\n </a>\n )}\n\n {showOpenApp && (\n <a\n href={openAppHref}\n onClick={onOpenAppClick}\n className={`${hasPrimaryCta ? 'hidden sm:inline ' : ''}${linkClass('app')}`}\n aria-current={active === 'app' ? 'page' : undefined}\n >\n {t('landing.nav.openApp')}\n </a>\n )}\n\n {hasPrimaryCta && (\n <a\n href={primaryCta.href}\n onClick={primaryCta.onClick}\n className={`px-3 py-1.5 sm:px-4 sm:py-2 text-sm whitespace-nowrap rounded-lg bg-white text-slate-900 font-semibold hover:scale-[1.02] transition ${focusRing}`}\n >\n {primaryCta.label}\n </a>\n )}\n\n <button\n type=\"button\"\n onClick={() => setMobileMenuOpen(true)}\n className={`sm:hidden p-2 rounded-lg border border-slate-800 bg-slate-950 text-slate-200 hover:bg-slate-900 transition ${focusRing}`}\n aria-label={t('common.menu', { defaultValue: 'Menu' })}\n aria-controls=\"shipscreens-mobile-menu\"\n aria-expanded={mobileMenuOpen}\n >\n <Menu size={18} />\n </button>\n </div>\n </header>\n ) : (\n <header className=\"border-b border-slate-200 bg-white\">\n <div className=\"max-w-4xl mx-auto px-4 py-4 flex items-center justify-between gap-4\">\n <a href={logoHref} className={`flex items-center gap-3 hover:opacity-90 transition-opacity ${focusRing}`}>\n <div className=\"w-9 h-9 rounded-xl border border-slate-200 bg-white p-1 flex items-center justify-center overflow-hidden shadow-xs\">\n <img\n src=\"/app/assets/icons/favicon-32x32.png\"\n alt=\"ShipScreens\"\n className=\"w-full h-full object-contain\"\n loading=\"lazy\"\n />\n </div>\n <span className=\"font-bold text-slate-900\">ShipScreens</span>\n </a>\n\n <div className=\"flex items-center gap-3\">\n {showLanguageSwitcher && <LanguageSwitcher className={languageSwitcherClassName} />}\n {showX && <XLink className=\"hidden sm:inline text-slate-500 hover:text-slate-900 transition-colors\" />}\n\n {showTools && (\n <a\n href={toolsHref}\n onClick={onToolsClick}\n className={`hidden sm:inline ${linkClass('tools')}`}\n aria-current={active === 'tools' ? 'page' : undefined}\n >\n {t('landing.nav.tools')}\n </a>\n )}\n\n {showPricing && (\n <a\n href={pricingHref}\n onClick={onPricingClick}\n className={`hidden sm:inline ${linkClass('pricing')}`}\n aria-current={active === 'pricing' ? 'page' : undefined}\n >\n {t('landing.nav.pricing', { defaultValue: 'Pricing' })}\n </a>\n )}\n\n {showOpenApp && (\n <a\n href={openAppHref}\n onClick={onOpenAppClick}\n className={linkClass('app')}\n aria-current={active === 'app' ? 'page' : undefined}\n >\n {t('landing.nav.openApp')}\n </a>\n )}\n\n {primaryCta?.href && primaryCta?.label && (\n <a\n href={primaryCta.href}\n onClick={primaryCta.onClick}\n className={`px-4 py-2 rounded-lg bg-slate-900 text-white font-semibold hover:bg-slate-800 transition ${focusRing}`}\n >\n {primaryCta.label}\n </a>\n )}\n\n <button\n type=\"button\"\n onClick={() => setMobileMenuOpen(true)}\n className={`sm:hidden p-2 rounded-lg border border-slate-200 bg-white text-slate-700 hover:bg-slate-50 transition ${focusRing}`}\n aria-label={t('common.menu', { defaultValue: 'Menu' })}\n aria-controls=\"shipscreens-mobile-menu\"\n aria-expanded={mobileMenuOpen}\n >\n <Menu size={18} />\n </button>\n </div>\n </div>\n </header>\n );\n\n return (\n <>\n {headerContent}\n {renderMobileMenu()}\n </>\n );\n};\n\nexport default SiteHeader;\n"],"x_google_ignoreList":[0],"mappings":"sKAcA,IAAM,EAAO,EAAiB,OAAQ,CAJpC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAEL,CAAU,mBCR1C,GAAS,CAAE,gBACf,EAAA,EAAA,KAAC,IAAD,CACE,KAAK,+BACL,OAAO,SACP,IAAI,sBACJ,UAAW,4FAA4F,IACvG,aAAW,gDAEX,EAAA,EAAA,KAAC,MAAD,CAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,YAAY,KAAK,eAAe,cAAY,iBAC9E,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,iFAAmF,CAAA,CACxF,CAAA,CACJ,CAAA,EAGC,GAAc,CAClB,UAAU,OACV,SAAS,KACT,WAAW,IACX,YAAY,UACZ,cAAc,WACd,cAAc,QACd,YAAY,GACZ,cAAc,GACd,cAAc,GACd,QAAQ,GACR,uBAAuB,GACvB,4BAA4B,iBAC5B,eACA,iBACA,iBACA,aAAa,QACT,CACJ,GAAM,CAAE,KAAM,EAAe,EACvB,EAAS,IAAY,OACrB,EAAgB,GAAQ,GAAY,MAAQ,GAAY,OACxD,CAAC,EAAgB,IAAA,EAAA,EAAA,UAA8B,EAAK,EACpD,GAAA,EAAA,EAAA,QAA4B,IAAI,EAChC,GAAA,EAAA,EAAA,QAA4B,IAAI,EAEhC,GAAA,EAAA,EAAA,iBAAoC,EAAkB,EAAK,EAAG,CAAC,CAAC,EAEtE,EAAa,CACX,OAAQ,EACR,QAAS,EACT,SAAU,EACV,gBAAiB,CACnB,CAAC,EAED,IAAM,EAAY,EACd,2JACA,uJACE,EAAW,EACb,6DAA6D,IAC7D,iEAAiE,IAC/D,EAAa,EAAS,2BAA6B,+BACnD,EAAa,GAAO,GAAG,IAAW,IAAW,EAAK,IAAI,IAAe,KAErE,EAAqB,EACvB,oJAAoJ,IACpJ,+IAA+I,IAC7I,EAAuB,EAAS,6BAA+B,iCAC/D,EAAuB,GAAO,GAAG,IAAqB,IAAW,EAAK,IAAI,IAAyB,KAwQzG,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,CAvJoB,GACpB,EAAA,EAAA,MAAC,SAAD,CAAQ,UAAU,+FAAlB,EACE,EAAA,EAAA,MAAC,IAAD,CAAG,KAAM,EAAU,UAAW,+DAA+D,aAA7F,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,qIACb,EAAA,EAAA,KAAC,MAAD,CACE,IAAI,sCACJ,IAAI,cACJ,UAAU,+BACV,QAAQ,MACT,CAAA,CACE,CAAA,GACL,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,6BAAoB,aAAiB,CAAA,CACpD,KAEH,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,4CAAf,CACG,IAAwB,EAAA,EAAA,KAAC,EAAD,CAAkB,UAAW,CAA4B,CAAA,EACjF,IAAS,EAAA,EAAA,KAAC,EAAD,CAAO,UAAU,oEAAsE,CAAA,EAEhG,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EACT,UAAW,oBAAoB,EAAU,OAAO,IAChD,eAAc,IAAW,QAAU,OAAS,IAAA,YAE3C,EAAE,mBAAmB,CACrB,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EACT,UAAW,oBAAoB,EAAU,SAAS,IAClD,eAAc,IAAW,UAAY,OAAS,IAAA,YAE7C,EAAE,sBAAuB,CAAE,aAAc,SAAU,CAAC,CACpD,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EACT,UAAW,GAAG,EAAgB,oBAAsB,KAAK,EAAU,KAAK,IACxE,eAAc,IAAW,MAAQ,OAAS,IAAA,YAEzC,EAAE,qBAAqB,CACvB,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EAAW,KACjB,QAAS,EAAW,QACpB,UAAW,wIAAwI,aAElJ,EAAW,KACX,CAAA,GAGL,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,YAAe,EAAkB,EAAI,EACrC,UAAW,8GAA8G,IACzH,aAAY,EAAE,cAAe,CAAE,aAAc,MAAO,CAAC,EACrD,gBAAc,0BACd,gBAAe,YAEf,EAAA,EAAA,KAAC,EAAD,CAAM,KAAM,EAAK,CAAA,CACX,CAAA,CACL,GACC,KAER,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,+CAChB,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+EAAf,EACE,EAAA,EAAA,MAAC,IAAD,CAAG,KAAM,EAAU,UAAW,+DAA+D,aAA7F,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+HACb,EAAA,EAAA,KAAC,MAAD,CACE,IAAI,sCACJ,IAAI,cACJ,UAAU,+BACV,QAAQ,MACT,CAAA,CACE,CAAA,GACL,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,oCAA2B,aAAiB,CAAA,CAC3D,KAEH,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,mCAAf,CACG,IAAwB,EAAA,EAAA,KAAC,EAAD,CAAkB,UAAW,CAA4B,CAAA,EACjF,IAAS,EAAA,EAAA,KAAC,EAAD,CAAO,UAAU,wEAA0E,CAAA,EAEpG,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EACT,UAAW,oBAAoB,EAAU,OAAO,IAChD,eAAc,IAAW,QAAU,OAAS,IAAA,YAE3C,EAAE,mBAAmB,CACrB,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EACT,UAAW,oBAAoB,EAAU,SAAS,IAClD,eAAc,IAAW,UAAY,OAAS,IAAA,YAE7C,EAAE,sBAAuB,CAAE,aAAc,SAAU,CAAC,CACpD,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EACT,UAAW,EAAU,KAAK,EAC1B,eAAc,IAAW,MAAQ,OAAS,IAAA,YAEzC,EAAE,qBAAqB,CACvB,CAAA,EAGN,GAAY,MAAQ,GAAY,QAC/B,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EAAW,KACjB,QAAS,EAAW,QACpB,UAAW,4FAA4F,aAEtG,EAAW,KACX,CAAA,GAGH,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,YAAe,EAAkB,EAAI,EACrC,UAAW,yGAAyG,IACpH,aAAY,EAAE,cAAe,CAAE,aAAc,MAAO,CAAC,EACrD,gBAAc,0BACd,gBAAe,YAEf,EAAA,EAAA,KAAC,EAAD,CAAM,KAAM,EAAK,CAAA,CACb,CAAA,CACL,GACF,GACC,CAAA,OAnQuB,CAC7B,GAAI,CAAC,EAAgB,OAAO,KAE5B,IAAM,EAAS,EAAS,kBAAoB,kBACtC,EAAY,EAAS,2CAA6C,2CAClE,EAAoB,EAAS,mBAAqB,mBAClD,EAAmB,EACrB,sDAAsD,IACtD,qDAAqD,IAEnD,EAAa,GAAc,GAAU,CACzC,IAAW,CAAK,EAChB,EAAgB,CAClB,EAEM,EAAY,EAAE,cAAe,CAAE,aAAc,MAAO,CAAC,EAE3D,OACE,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,wBAAwB,EAAO,iCAC1C,KAAK,SACL,aAAW,OACX,aAAY,EACZ,YAAc,GAAU,CAClB,EAAM,SAAW,EAAM,eAAe,EAAgB,CAC5D,YAEA,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACL,GAAG,0BACH,UAAW,yEAAyE,aAHtF,EAKE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,wDAAwD,aAAxE,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BAAqB,CAAe,CAAA,GACnD,EAAA,EAAA,KAAC,SAAD,CACE,IAAK,EACL,KAAK,SACL,QAAS,EACT,UAAW,oCAAoC,IAC/C,aAAY,EAAE,eAAgB,CAAE,aAAc,OAAQ,CAAC,EACvD,MAAO,EAAE,eAAgB,CAAE,aAAc,OAAQ,CAAC,YAElD,EAAA,EAAA,KAAC,EAAD,CAAG,KAAM,EAAK,CAAA,CACR,CAAA,CACL,KAEL,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,yBAAf,CACG,IAAwB,EAAA,EAAA,KAAC,EAAD,CAAkB,UAAU,uBAAyB,CAAA,GAE9E,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,qBAAf,CACG,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EAAU,CAAY,EAC/B,UAAW,EAAoB,OAAO,EACtC,eAAc,IAAW,QAAU,OAAS,IAAA,aAE5C,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAE,mBAAmB,CAAQ,CAAA,CACnC,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EAAU,CAAc,EACjC,UAAW,EAAoB,SAAS,EACxC,eAAc,IAAW,UAAY,OAAS,IAAA,aAE9C,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAE,sBAAuB,CAAE,aAAc,SAAU,CAAC,CAAQ,CAAA,CAClE,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EACN,QAAS,EAAU,CAAc,EACjC,UAAW,EAAoB,KAAK,EACpC,eAAc,IAAW,MAAQ,OAAS,IAAA,aAE1C,EAAA,EAAA,KAAC,OAAD,CAAA,SAAO,EAAE,qBAAqB,CAAQ,CAAA,CACrC,CAAA,EAGJ,IACC,EAAA,EAAA,KAAC,IAAD,CACE,KAAK,+BACL,OAAO,SACP,IAAI,sBACJ,UAAW,YAEX,EAAA,EAAA,KAAC,OAAD,CAAA,SAAM,GAAO,CAAA,CACZ,CAAA,CAEF,IAEJ,GAAY,MAAQ,GAAY,QAC/B,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EAAW,KACjB,QAAS,EAAU,EAAW,OAAO,EACrC,UAAW,gGACT,EAAS,6CAA+C,6CACzD,GAAG,aAEH,EAAW,KACX,CAAA,CAEF,GACF,GACF,CAAA,CAET,GA2JsB,CAClB,CAAA,CAAA,CAEN"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"./chunk-BHe-jwch.js";import{S as e,b as t,x as n}from"./index-D7D6ZRCW.js";import{n as r,t as i}from"./circle-check-X08qqy40.js";e();var a=t(),o=({href:e,onClick:t,compact:o=!1,className:s=``})=>{let{t:c}=n(),l=c(`common.cliPreflight`,{returnObjects:!0})||{},u=l.bullets||[],d=o?u.slice(0,3):u;return l.title?(0,a.jsxs)(`div`,{className:`rounded-2xl border border-slate-800 bg-slate-900/60 ${o?`p-4`:`p-6`} space-y-2 ${s}`,children:[(0,a.jsx)(`div`,{className:`${o?`text-sm`:`text-lg`} font-bold text-white`,children:l.title}),l.body&&(0,a.jsx)(`p`,{className:`${o?`text-xs`:`text-sm`} text-slate-300`,children:l.body}),d.length>0&&(0,a.jsx)(`ul`,{className:`space-y-1 ${o?`text-xs`:`text-sm`} text-slate-300`,children:d.map(e=>(0,a.jsxs)(`li`,{className:`flex items-center gap-2`,children:[(0,a.jsx)(i,{size:o?14:16,className:`text-emerald-400`}),e]},e))}),l.note&&(0,a.jsx)(`p`,{className:`text-[11px] text-slate-500`,children:l.note}),e&&l.cta&&(0,a.jsxs)(`a`,{href:e,onClick:t,className:`inline-flex items-center gap-2 text-xs font-semibold text-blue-200 hover:text-blue-100 transition-colors ${o?`pt-1`:`pt-2`}`,children:[l.cta,` `,(0,a.jsx)(r,{size:12})]})]}):null},s=({primary:e,secondary:t,note:n})=>!e?.label||!e?.href?null:(0,a.jsx)(`div`,{className:`fixed inset-x-4 bottom-4 z-1200 sm:hidden`,style:{paddingBottom:`env(safe-area-inset-bottom)`},children:(0,a.jsxs)(`div`,{className:`rounded-2xl border border-slate-700 bg-slate-950/95 backdrop-blur-sm p-3 shadow-xl shadow-slate-900/40`,children:[n&&(0,a.jsx)(`div`,{className:`text-[10px] text-slate-400 mb-2`,children:n}),(0,a.jsxs)(`div`,{className:`flex gap-2`,children:[(0,a.jsx)(`a`,{href:e.href,onClick:e.onClick,className:`flex-1 inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl bg-blue-500 text-white text-sm font-semibold hover:bg-blue-600 transition`,children:e.label}),t?.label&&t?.href&&(0,a.jsx)(`a`,{href:t.href,onClick:t.onClick,className:`flex-1 inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 text-sm font-semibold hover:bg-slate-900 transition`,children:t.label})]})]})});export{o as n,s as t};
|
|
2
|
+
//# sourceMappingURL=StickyMobileCta-REC3DROG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StickyMobileCta-REC3DROG.js","names":[],"sources":["../../src/components/CliPreflightCard.jsx","../../src/components/StickyMobileCta.jsx"],"sourcesContent":["import React from 'react';\nimport { ArrowRight, CheckCircle2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\n\nconst CliPreflightCard = ({ href, onClick, compact = false, className = '' }) => {\n const { t } = useTranslation();\n const copy = t('common.cliPreflight', { returnObjects: true }) || {};\n const bullets = copy.bullets || [];\n const showBullets = compact ? bullets.slice(0, 3) : bullets;\n\n if (!copy.title) return null;\n\n return (\n <div\n className={`rounded-2xl border border-slate-800 bg-slate-900/60 ${compact ? 'p-4' : 'p-6'} space-y-2 ${className}`}\n >\n <div className={`${compact ? 'text-sm' : 'text-lg'} font-bold text-white`}>{copy.title}</div>\n {copy.body && <p className={`${compact ? 'text-xs' : 'text-sm'} text-slate-300`}>{copy.body}</p>}\n {showBullets.length > 0 && (\n <ul className={`space-y-1 ${compact ? 'text-xs' : 'text-sm'} text-slate-300`}>\n {showBullets.map((item) => (\n <li key={item} className=\"flex items-center gap-2\">\n <CheckCircle2 size={compact ? 14 : 16} className=\"text-emerald-400\" />\n {item}\n </li>\n ))}\n </ul>\n )}\n {copy.note && <p className=\"text-[11px] text-slate-500\">{copy.note}</p>}\n {href && copy.cta && (\n <a\n href={href}\n onClick={onClick}\n className={`inline-flex items-center gap-2 text-xs font-semibold text-blue-200 hover:text-blue-100 transition-colors ${compact ? 'pt-1' : 'pt-2'}`}\n >\n {copy.cta} <ArrowRight size={12} />\n </a>\n )}\n </div>\n );\n};\n\nexport default CliPreflightCard;\n","import React from 'react';\n\nconst StickyMobileCta = ({ primary, secondary, note }) => {\n if (!primary?.label || !primary?.href) return null;\n\n return (\n <div\n className=\"fixed inset-x-4 bottom-4 z-1200 sm:hidden\"\n style={{ paddingBottom: 'env(safe-area-inset-bottom)' }}\n >\n <div className=\"rounded-2xl border border-slate-700 bg-slate-950/95 backdrop-blur-sm p-3 shadow-xl shadow-slate-900/40\">\n {note && <div className=\"text-[10px] text-slate-400 mb-2\">{note}</div>}\n <div className=\"flex gap-2\">\n <a\n href={primary.href}\n onClick={primary.onClick}\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl bg-blue-500 text-white text-sm font-semibold hover:bg-blue-600 transition\"\n >\n {primary.label}\n </a>\n {secondary?.label && secondary?.href && (\n <a\n href={secondary.href}\n onClick={secondary.onClick}\n className=\"flex-1 inline-flex items-center justify-center gap-2 px-4 py-2 rounded-xl border border-slate-700 bg-slate-950 text-slate-200 text-sm font-semibold hover:bg-slate-900 transition\"\n >\n {secondary.label}\n </a>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default StickyMobileCta;\n"],"mappings":"sJAIM,GAAoB,CAAE,OAAM,UAAS,UAAU,GAAO,YAAY,MAAS,CAC/E,GAAM,CAAE,KAAM,EAAe,EACvB,EAAO,EAAE,sBAAuB,CAAE,cAAe,EAAK,CAAC,GAAK,CAAC,EAC7D,EAAU,EAAK,SAAW,CAAC,EAC3B,EAAc,EAAU,EAAQ,MAAM,EAAG,CAAC,EAAI,EAIpD,OAFK,EAAK,OAGR,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,uDAAuD,EAAU,MAAQ,MAAM,aAAa,aADzG,EAGE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,GAAG,EAAU,UAAY,UAAU,gCAAyB,EAAK,KAAW,CAAA,EAC3F,EAAK,OAAQ,EAAA,EAAA,KAAC,IAAD,CAAG,UAAW,GAAG,EAAU,UAAY,UAAU,0BAAmB,EAAK,IAAQ,CAAA,EAC9F,EAAY,OAAS,IACpB,EAAA,EAAA,KAAC,KAAD,CAAI,UAAW,aAAa,EAAU,UAAY,UAAU,0BACzD,EAAY,IAAK,IAChB,EAAA,EAAA,MAAC,KAAD,CAAe,UAAU,mCAAzB,EACE,EAAA,EAAA,KAAC,EAAD,CAAc,KAAM,EAAU,GAAK,GAAI,UAAU,kBAAoB,CAAA,EACpE,CACC,GAHK,CAGL,CACL,CACC,CAAA,EAEL,EAAK,OAAQ,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,sCAA8B,EAAK,IAAQ,CAAA,EACrE,GAAQ,EAAK,MACZ,EAAA,EAAA,MAAC,IAAD,CACQ,OACG,UACT,UAAW,4GAA4G,EAAU,OAAS,kBAH5I,CAKG,EAAK,IAAI,KAAC,EAAA,EAAA,KAAC,EAAD,CAAY,KAAM,EAAK,CAAA,CACjC,GAEF,IA5BiB,IA8B1B,ECtCM,GAAmB,CAAE,UAAS,YAAW,UACzC,CAAC,GAAS,OAAS,CAAC,GAAS,KAAa,MAG5C,EAAA,EAAA,KAAC,MAAD,CACE,UAAU,4CACV,MAAO,CAAE,cAAe,6BAA8B,YAEtD,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,kHAAf,CACG,IAAQ,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2CAAmC,CAAU,CAAA,GACrE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,sBAAf,EACE,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EAAQ,KACd,QAAS,EAAQ,QACjB,UAAU,+JAET,EAAQ,KACR,CAAA,EACF,GAAW,OAAS,GAAW,OAC9B,EAAA,EAAA,KAAC,IAAD,CACE,KAAM,EAAU,KAChB,QAAS,EAAU,QACnB,UAAU,6LAET,EAAU,KACV,CAAA,CAEF,GACF,GACF,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{r as e}from"./chunk-BHe-jwch.js";import{S as t,b as n,n as r,r as i,x as a}from"./index-D7D6ZRCW.js";import{n as o,r as s,s as c}from"./LanguageSwitcher-hFv9zl1u.js";import{n as l}from"./circle-check-X08qqy40.js";import{t as u}from"./chevron-down-BIXHKpnf.js";import{t as d}from"./CopyButton-BFCx6EPg.js";import{t as f}from"./copy-KD-LYJ0z.js";import{t as p}from"./crop-K1LOmRty.js";import{t as m}from"./folder-tree-raVH0Y5V.js";import{t as h}from"./grid-3x3-cWuhGQfz.js";import{t as g}from"./SiteHeader-CJqQ0pL3.js";import{n as _,t as v}from"./StickyMobileCta-REC3DROG.js";import{t as y}from"./FitPanel-B1J0V1jK.js";import{t as b}from"./AgentHandoffPanel-Bf_AJepG.js";import{t as x}from"./ToolGuardrailsPanel-Cclxwdrb.js";var S=c(`tablet`,[[`rect`,{width:`16`,height:`20`,x:`4`,y:`2`,rx:`2`,ry:`2`,key:`76otgf`}],[`line`,{x1:`12`,x2:`12.01`,y1:`18`,y2:`18`,key:`1dp563`}]]),C=e(t(),1),w=n(),T=e=>(e||``).split(`-`)[0]===`ja`?`ja`:`en`,E={en:{badge:`Store assets pipeline kit`,title:`Store Assets Pipeline Kit`,subtitle:`Capture -> copy -> layout -> export. Keep your existing design tools, then lock an outcome-first panel order + path naming with reproducible outputs and upload checks before App Store / Google Play upload.`,ctaPrimary:`Tell your coding agent to handle release ops`,ctaSecondary:`Back to tools`,agentPromptTitle:`Give your agent this prompt`,agentPromptBody:`Use this when iPad/review requirements, safe areas, or upload roots are the real bottleneck.`,agentPrompt:`Use ShipScreens as the build step for our store-assets release step. Keep our current capture/layout workflow, inspect this repo, choose the best path for this workspace (workspace-local MCP if available, otherwise pure CLI), shrink the device/locale matrix to the smallest set you can rerun confidently, keep iPad/review-safe source files and Play-safe areas in scope, generate deterministic Fastlane-ready outputs, run verify/stage, and return a short report with output paths, warnings, and next steps. Only ask me if device or locale scope or panel #1 messaging is unclear.`,agentPromptNote:`Recommended: give one instruction, then review the first export and upload roots.`,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`,heroCliCmd:[`npx --yes shipscreens wizard`,`npx --yes shipscreens agent-run --mode raw --zip --out out/agent --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.`,navTools:`Tools`,overviewTitle:`Pipeline overview`,overviewSteps:[`Capture`,`Copy`,`Layout`,`Export`,`Upload (ASC/Play)`],checklistTitle:`Checklists`,checklists:[{key:`ipad13`,icon:S,title:`iPad 13-inch capture`,body:`Get the right source before you generate.`,bullets:[`Use a real device shot when possible (13-inch / 2064x2752).`,`If you use Simulator, export at native size (no scaling).`,`Keep UI clean; avoid overlays that won’t match store previews.`]},{key:`ordering`,icon:m,title:`Stable ordering + per-locale folders`,body:`Make re-uploads boring and predictable.`,bullets:[`Pick a fixed screenshot count (e.g. 5) and zero-pad names: 01.png..05.png.`,`Keep panel #1 focused on one user outcome and target audience.`,`Clarity check: if panel #1 could fit many apps, rewrite it with one concrete outcome.`,`Use one folder per locale (en-US/, ja-JP/) so exports never mix.`,`Re-export the same tree every release; the stores stay consistent.`]},{key:`buckets`,icon:h,title:`Size bucket shortcuts`,body:`Start minimal, expand later.`,bullets:[`iPhone-only: pick the largest iPhone bucket first.`,`Add iPad 13-inch only if you ship iPad-first.`,`Android: one phone bucket; add tablet only if needed.`]},{key:`play-safe`,icon:p,title:`Play feature graphic safe area`,body:`Avoid hidden crops in Play previews.`,bullets:[`Keep text/logos inside the central 80-86% area.`,`Avoid edge-aligned UI; Play crops in some previews.`,`Preview in Play Console before you finalize.`,`If screenshots still look generic, add a short app preview video as supporting proof.`]}],treeTitle:`Minimal folder tree (manual uploads)`,treeBody:`Start iPhone-only with 5 screenshots. Add more buckets later if needed.`,treeExample:[`screenshots/`,` en-US/`,` 01.png`,` 02.png`,` 03.png`,` 04.png`,` 05.png`,` de-DE/`,` 01.png`,` 02.png`,` 03.png`,` 04.png`,` 05.png`].join(`
|
|
3
|
+
`),note:`Translation happens outside ShipScreens; we focus on reproducible exports, upload-ready outputs, and CI guardrails (verify + stage) while keeping your brand style intact.`,scopeNote:`Upload is handled in App Store Connect / Play Console.`,assetsTitle:`Templates & tools`,assetsCta:`Open tool`,assets:[{key:`csv`,title:`Screenshot copy CSV template`,desc:`Download a copy template and estimate workload.`,href:`/tools/screenshot-workload-calculator/`},{key:`framework`,title:`5-panel screenshot script`,desc:`Hook -> Problem -> Proof -> How -> CTA.`,href:`/tools/5-panel-screenshot-framework/`}],nextTitle:`Next: start from the coding-agent guide`,nextBody:`Hand off the current store-assets workflow first, then use the sample project only when you want to test the browser fallback yourself.`,nextCtaSample:`Open sample project`},ja:{badge:`ストア素材パイプラインキット`,title:`ストア素材パイプラインキット`,subtitle:`Capture -> Copy -> Layout -> Export。既存ツールはそのまま使い、成果訴求順 + パス命名を固定した再現性出力と提出前チェックで提出前事故を減らす。`,ctaPrimary:`AIエージェントでリリース工程を固める`,ctaSecondary:`ツール一覧へ`,agentPromptTitle:`coding agent に渡すプロンプト`,agentPromptBody:`iPad 審査、safe area、upload root が実ボトルネックなら、手で整える前にこれを渡します。`,agentPrompt:`ShipScreens を使って、ストア素材のリリース工程を固めてください。今の capture/layout フローは維持し、この repo を確認して、このプロジェクトで MCP が使えるならそれを使い、無ければ CLI を使ってください。端末/言語の行列を最小の再実行しやすい構成に絞り、iPad/review-safe な素材、Play safe area、verify と stage を実行し、出力パス・警告・次の作業を短く報告してください。端末/言語スコープか1枚目訴求が不明なときだけ確認してください。`,agentPromptNote:`おすすめは、1回指示して最初のエクスポートと upload root だけ確認することです。`,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`,heroCliCmd:[`npx --yes shipscreens wizard`,`npx --yes shipscreens agent-run --mode raw --zip --out out/agent --stage`].join(`
|
|
4
|
+
`),proUnlockTitle:`Proを解除(CLI)`,proUnlockBody:`透かし解除&フル一括(端末×言語)のために、まずはCLI認証を実行:`,proUnlockCmd:`npx --yes shipscreens auth login`,proUnlockNote:`初回のみブラウザでサインインします。以後は agent-run --require-pro で再実行。`,navTools:`ツール一覧`,overviewTitle:`パイプライン概要`,overviewSteps:[`素材取り`,`コピー`,`レイアウト`,`出力`,`アップロード (ASC/Play)`],checklistTitle:`チェックリスト`,checklists:[{key:`ipad13`,icon:S,title:`iPad 13-inch 実スクショ`,body:`生成前の素材を揃える。`,bullets:[`実機があれば 13-inch / 2064x2752 の実スクショを用意。`,`Simulator を使う場合は native サイズで書き出す。`,`ストア表示とズレるUIオーバーレイは避ける。`]},{key:`ordering`,icon:m,title:`順序固定 (01..05) + ロケール別フォルダ`,body:`毎回の更新を退屈にする。`,bullets:[`枚数を固定し、ファイル名は 01..05 のゼロ埋めにする(1,10,2 を防止)。`,`1枚目は「誰が・何を得るか」を1メッセージに絞る。`,`確認: 1枚目の訴求が他の多くのアプリにも当てはまるなら、成果を具体化して書き直す。`,`ロケールごとにフォルダを分ける(en-US/, ja-JP/)。`,`毎リリース同じツリーを再出力してアップロードする。`]},{key:`buckets`,icon:h,title:`サイズバケット削減`,body:`最小セットでまず出す。`,bullets:[`iPhone-only は最大サイズ1バケットから。`,`iPad は13-inchが必要な場合のみ追加。`,`Android はスマホ1バケット、必要ならタブレット。`]},{key:`play-safe`,icon:p,title:`Play feature graphic 安全域`,body:`隠れクロップを避ける。`,bullets:[`文字/ロゴは中央 80-86% に収める。`,`端に寄せすぎない(プレビューで切れる)。`,`Play Console のプレビューで最終確認。`,`スクショだけで埋もれる場合は短いアプリ動画を補助で追加。`]}],treeTitle:`最小フォルダツリー(手動アップロード)`,treeBody:`まずは iPhone-only + 5枚から。必要になってからバケットを増やす。`,treeExample:[`screenshots/`,` en-US/`,` 01.png`,` 02.png`,` 03.png`,` 04.png`,` 05.png`,` de-DE/`,` 01.png`,` 02.png`,` 03.png`,` 04.png`,` 05.png`].join(`
|
|
5
|
+
`),note:`翻訳は外部でOK。ShipScreensは見た目を崩さずに、レイアウト/順序の安定・再現性出力・Fastlane公式パス生成(CI)と verify+stage の事故防止を担います。`,scopeNote:`アップロードは App Store Connect / Play Console 側で行います。`,assetsTitle:`テンプレ/ツール`,assetsCta:`ツールを開く`,assets:[{key:`csv`,title:`コピーCSVテンプレ + 作業量見積もり`,desc:`CSV雛形と端末x言語の計算。`,href:`/tools/screenshot-workload-calculator/`},{key:`framework`,title:`5枚構成スクリプト`,desc:`Hook -> Problem -> Proof -> How -> CTA。`,href:`/tools/5-panel-screenshot-framework/`}],nextTitle:`次: まず coding agent ガイドから進める`,nextBody:`現状の store-assets workflow を coding agent に渡し、ブラウザ fallback はサンプル確認が必要なときだけ使います。`,nextCtaSample:`サンプルを開く`}},D=()=>{let{i18n:e,t}=a(),n=T(e.resolvedLanguage||e.language),c=E[n]||E.en,p=t(`landing.partner`,{returnObjects:!0})||{},h=Array.isArray(p.scopeBullets)?p.scopeBullets.filter(Boolean):[],S=`support@shimaumaservices.co.jp`,D=t(`landing.partner.emailSubject`,{defaultValue:`ShipScreens first export review`}),O=t(`landing.partner.emailBody`,{defaultValue:``}),k=`mailto:${S}?subject=${encodeURIComponent(D)}&body=${encodeURIComponent(O)}`,A=t(`landing.partner.offerCta`,{defaultValue:n===`ja`?`15分レビューを開く`:`Open 15-min review`}),j=`#agent-handoff`,M=`/app/?sample=5panel&entry_source=store_assets_pipeline_open_sample_project`,N=t(`common.copy`,{defaultValue:`Copy`}),P=t(`common.showCommands`,{defaultValue:`Show commands`}),F=typeof window>`u`?!0:window.matchMedia(`(min-width: 640px)`).matches;return s(`titles.storeAssetsPipeline`,{defaultValue:c.title}),(0,C.useEffect)(()=>{r(`tool_view`,{tool:`store_assets_pipeline`})},[]),(0,w.jsxs)(`div`,{className:`min-h-screen bg-linear-to-b from-slate-950 via-slate-900 to-slate-950 text-white`,children:[(0,w.jsx)(o,{}),(0,w.jsx)(g,{variant:`dark`,active:`tools`,openAppHref:`/app/?sample=5panel&entry_source=store_assets_pipeline_open_app_header`,onToolsClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_tools_header`}),onPricingClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`pricing_header`}),onOpenAppClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_app_header`}),primaryCta:{href:j,label:(0,w.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[t(`landing.nav.primaryCta`),` `,(0,w.jsx)(l,{size:16})]}),onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_agent_cli_header`})}}),(0,w.jsxs)(`main`,{className:`max-w-5xl mx-auto px-6 pb-24 space-y-10`,children:[(0,w.jsxs)(`section`,{className:`max-w-3xl mx-auto text-center space-y-4`,children:[(0,w.jsx)(`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:c.badge}),(0,w.jsx)(`h1`,{className:`text-3xl md:text-5xl font-black leading-tight`,children:c.title}),(0,w.jsx)(`p`,{className:`text-slate-300 text-lg leading-relaxed`,children:c.subtitle}),c.agentPrompt&&(0,w.jsx)(b,{sectionId:`agent-handoff`,lang:n,prompt:c.agentPrompt,promptTitle:c.agentPromptTitle,promptBody:c.agentPromptBody,promptNote:c.agentPromptNote,guideHref:`/tools/agent-cli/?entry_source=store_assets_pipeline_agent_handoff#agent-bootstrap`,className:`max-w-4xl mx-auto text-left`,onPromptCopied:e=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`copy_agent_prompt`,client:e.id}),onBundleCopied:e=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`copy_bootstrap_bundle_${e.id}`,client:e.id}),onClientCommandCopied:e=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`copy_client_bootstrap_${e.id}`,client:e.id}),onClientDownload:e=>r(`tool_download`,{tool:`store_assets_pipeline`,asset:`client_bootstrap_${e.id}`,client:e.id}),onGuideClick:(e,t)=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_agent_handoff_guide`,client:t.id})}),(0,w.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,w.jsx)(`div`,{className:`text-[11px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:c.heroCliTitle}),(0,w.jsx)(`p`,{className:`text-xs text-slate-400`,children:c.heroCliNote}),(0,w.jsx)(`p`,{className:`text-xs text-slate-500`,children:c.heroCliSummary}),(0,w.jsx)(d,{value:c.heroCliCmd,onCopied:()=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,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,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(f,{size:14}),t===`idle`?c.heroCliCopyLabel:e||N]})}),(0,w.jsxs)(`details`,{className:`group`,open:F,children:[(0,w.jsxs)(`summary`,{className:`flex items-center justify-between text-[11px] font-semibold text-slate-400 cursor-pointer list-none`,children:[(0,w.jsx)(`span`,{children:P}),(0,w.jsx)(u,{size:14,className:`text-slate-500 transition-transform duration-200 group-open:rotate-180`})]}),(0,w.jsx)(`div`,{className:`mt-2 rounded-xl border border-slate-800 bg-slate-950 p-3`,children:(0,w.jsx)(`pre`,{className:`text-xs text-slate-200 whitespace-pre-wrap`,children:c.heroCliCmd})})]}),(0,w.jsxs)(`div`,{className:`pt-1 space-y-2`,children:[(0,w.jsx)(`div`,{className:`text-[10px] uppercase tracking-[0.2em] text-slate-500 font-semibold`,children:c.heroCliTemplatesLabel}),(0,w.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,w.jsx)(`a`,{href:`/downloads/shipscreens-agent-cli-config.yml`,download:!0,onClick:()=>r(`tool_download`,{tool:`store_assets_pipeline`,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,w.jsx)(`a`,{href:`/downloads/shipscreens-agent-cli-copy.csv`,download:!0,onClick:()=>r(`tool_download`,{tool:`store_assets_pipeline`,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,w.jsx)(x,{title:n===`ja`?`詳細: CLIガードレール + Pro解除`:`Advanced: CLI guardrails + Pro unlock`,codeToggleLabel:P,copyButtonLabel:N,preflightHref:`/tools/agent-cli/#preflight`,onPreflightClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_cli_preflight`}),proUnlockTitle:c.proUnlockTitle,proUnlockBody:c.proUnlockBody,proUnlockCmd:c.proUnlockCmd,proUnlockNote:c.proUnlockNote,onProUnlockCopied:()=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`copy_cli_pro_unlock`})}),(0,w.jsx)(_,{compact:!0,href:`/tools/agent-cli/#preflight`,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_cli_preflight_card`}),className:`max-w-xl mx-auto`})]}),(0,w.jsx)(y,{className:`max-w-4xl mx-auto w-full`}),(0,w.jsxs)(`section`,{className:`space-y-4`,children:[(0,w.jsx)(`h2`,{className:`text-lg font-bold text-white text-center`,children:c.overviewTitle}),(0,w.jsx)(`div`,{className:`flex flex-wrap justify-center gap-2 text-sm text-slate-300`,children:c.overviewSteps.map(e=>(0,w.jsx)(`span`,{className:`px-3 py-1 rounded-full border border-slate-800 bg-slate-900/70`,children:e},e))})]}),(0,w.jsxs)(`section`,{className:`space-y-4`,children:[(0,w.jsx)(`h2`,{className:`text-lg font-bold text-white text-center`,children:c.checklistTitle}),(0,w.jsx)(`div`,{className:`grid md:grid-cols-3 gap-6`,children:c.checklists.map(e=>{let t=e.icon;return(0,w.jsxs)(`div`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,w.jsx)(`div`,{className:`w-10 h-10 rounded-xl border border-slate-800 bg-slate-950 flex items-center justify-center`,children:(0,w.jsx)(t,{size:18,className:`text-slate-200`})}),(0,w.jsx)(`div`,{className:`text-lg font-bold text-white`,children:e.title})]}),(0,w.jsx)(`p`,{className:`text-sm text-slate-300 leading-relaxed`,children:e.body}),(0,w.jsx)(`ul`,{className:`text-xs text-slate-400 list-disc pl-4 space-y-1`,children:e.bullets.map(e=>(0,w.jsx)(`li`,{children:e},e))})]},e.key)})}),(0,w.jsxs)(`div`,{className:`text-xs text-slate-500 text-center space-y-1`,children:[(0,w.jsx)(`p`,{children:c.note}),(0,w.jsx)(`p`,{children:c.scopeNote})]}),(0,w.jsxs)(`div`,{className:`max-w-3xl mx-auto bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-4`,children:[(0,w.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,w.jsx)(`div`,{className:`w-10 h-10 rounded-xl border border-slate-800 bg-slate-950 flex items-center justify-center`,children:(0,w.jsx)(m,{size:18,className:`text-slate-200`})}),(0,w.jsx)(`div`,{className:`text-lg font-bold text-white`,children:c.treeTitle})]}),(0,w.jsx)(`p`,{className:`text-sm text-slate-300 leading-relaxed`,children:c.treeBody}),(0,w.jsx)(`div`,{className:`rounded-xl border border-slate-800 bg-slate-950/80 p-4 overflow-x-auto`,children:(0,w.jsx)(`pre`,{className:`text-xs text-slate-200 whitespace-pre`,children:c.treeExample})})]})]}),(0,w.jsxs)(`section`,{className:`space-y-4`,children:[(0,w.jsx)(`h2`,{className:`text-lg font-bold text-white text-center`,children:c.assetsTitle}),(0,w.jsx)(`div`,{className:`grid md:grid-cols-2 gap-6`,children:c.assets.map(e=>(0,w.jsxs)(`a`,{href:e.href,onClick:()=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_${e.key}`}),className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 space-y-3 hover:border-slate-700 transition`,children:[(0,w.jsx)(`div`,{className:`text-lg font-bold text-white`,children:e.title}),(0,w.jsx)(`div`,{className:`text-sm text-slate-300`,children:e.desc}),(0,w.jsxs)(`div`,{className:`text-xs text-blue-200 flex items-center gap-2`,children:[c.assetsCta,` `,(0,w.jsx)(l,{size:14})]})]},e.key))})]}),(0,w.jsxs)(`section`,{className:`bg-slate-900/60 border border-slate-800 rounded-2xl p-6 flex flex-col md:flex-row items-start md:items-center justify-between gap-4`,children:[(0,w.jsxs)(`div`,{className:`space-y-1`,children:[(0,w.jsx)(`div`,{className:`text-sm font-bold text-white`,children:c.nextTitle}),(0,w.jsx)(`div`,{className:`text-sm text-slate-300`,children:c.nextBody})]}),(0,w.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3 w-full md:w-auto`,children:[(0,w.jsxs)(`a`,{href:j,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_agent_cli_footer`}),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 w-full md:w-auto`,children:[c.ctaPrimary,` `,(0,w.jsx)(l,{size:16})]}),(0,w.jsxs)(`a`,{href:M,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_sample_project_body`}),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 w-full md:w-auto`,children:[c.nextCtaSample,` `,(0,w.jsx)(l,{size:16})]})]})]}),(0,w.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,w.jsx)(`div`,{className:`text-lg font-bold text-white`,children:p.title||t(`landing.partner.title`)}),(0,w.jsx)(`div`,{className:`text-sm text-slate-300 leading-relaxed`,children:p.body||t(`landing.partner.body`)}),h.length>0&&(0,w.jsx)(`ul`,{className:`space-y-2 text-sm text-slate-300 list-disc pl-5`,children:h.map(e=>(0,w.jsx)(`li`,{children:e},e))}),(0,w.jsxs)(`div`,{className:`flex flex-col sm:flex-row gap-3`,children:[(0,w.jsxs)(`a`,{href:`/design-partner/?entry_source=store_assets_pipeline_design_partner_offer&scope=matrix&blocker=naming_order`,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_design_partner_offer`}),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:[A,` `,(0,w.jsx)(l,{size:16})]}),(0,w.jsx)(`a`,{href:k,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`email_design_partner`}),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:p.emailCta||t(`landing.partner.emailCta`)}),(0,w.jsx)(`a`,{href:`https://x.com/shipscreenscom`,target:`_blank`,rel:`noopener noreferrer`,onClick:()=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`dm_design_partner`}),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:p.dmCta||t(`landing.partner.dmCta`)}),(0,w.jsx)(`a`,{href:`/pricing?offer=pay_first&entry_source=store_assets_pipeline_pay_first_partner_block`,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`open_pay_first_from_partner_block`}),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:p.payFirstCta||t(`landing.partner.payFirstCta`)})]}),(0,w.jsxs)(`div`,{className:`text-xs text-slate-500`,children:[p.emailLabel||t(`landing.partner.emailLabel`),` `,(0,w.jsx)(`a`,{href:`mailto:${S}`,className:`underline underline-offset-4 hover:text-white`,children:S})]})]}),(0,w.jsx)(`section`,{className:`max-w-3xl mx-auto text-center space-y-4 pt-2`,children:(0,w.jsx)(`a`,{href:`/tools/`,onClick:()=>r(`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`back_to_tools`}),className:`text-xs text-slate-500 hover:text-slate-300 transition-colors underline underline-offset-4`,children:c.ctaSecondary})})]}),(0,w.jsx)(v,{primary:{label:c.ctaPrimary,href:j,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`sticky_primary_agent`})},secondary:{label:c.nextCtaSample,href:M,onClick:e=>i(e,`tool_cta_click`,{tool:`store_assets_pipeline`,cta:`sticky_secondary_sample`})}})]})};export{D as default};
|
|
6
|
+
//# sourceMappingURL=StoreAssetsPipeline-DNnnBp0D.js.map
|