PageSourceSearch

https://www.freshmango.ee/assets/ProblemValidationPage-pzEXQHdo.js

js freshmango.ee collected 2026-10-07 05:58:16 UTC 23,321 bytes, 1 lines download raw bytes

1import{d as Ae,r as u,R as ae,s as Te,j as e,m as g,L as Le,B as b,T as re,c as Me,P as Ie,n as Ve,o as He,p as De,I as ze,q as Fe,J as oe}from"./index-D0bcju6s.js";import{P as Ee}from"./PlatformLayout-sUHrD-At.js";import{C as j,a as w}from"./card-C5hPmaEk.js";import{L as me}from"./label-DXs9ctzA.js";import{T as f}from"./textarea-iqR00ww4.js";import{B as K}from"./badge-Dcr7iZoH.js";import{S as Re}from"./slider-BtB05S0E.js";import{S as ie,a as le,b as ne,c as ce,d as N}from"./select-DEUE7wiK.js";import{u as qe}from"./useStartupData-D22C0l57.js";import{a as Oe}from"./ToolPageShell-1DWFOyAx.js";import{M as $e}from"./MetricResultCard-DHmQ7QjR.js";import{V as Ue}from"./VerdictCard-e6s-KTRg.js";import{u as We}from"./useToolExport-BMi_8bmc.js";import{T as Be}from"./target-C_3SI4zT.js";import{W as Ke}from"./wand-sparkles-DGdu9gY4.js";import{U as ue}from"./users-DxHvUqrW.js";import{P as O}from"./plus-CYJgbzgj.js";import{T as $}from"./trash-2-CIELDGi0.js";import{L as de}from"./lightbulb-DCE5Ucs7.js";import"./LayoutHeaderContext-C6I4c3Yb.js";import"./index-BdQq_4o_.js";import"./index-CQhuChtS.js";import"./index-D2MpAq_3.js";import"./chevron-down-BT30bVTw.js";import"./chevron-up-DWwlCiZg.js";import"./check-D_bcFwYU.js";import"./download-BxJ-KAB2.js";import"./save-DUdMWOrg.js";import"./circle-help-CmVHV0mO.js";import"./circle-check-big-CC-gQAjJ.js";import"./logo-primary-mK6EX6OS.js";function l({label:n,helper:d,children:S}){return e.jsxs("div",{className:"space-y-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(me,{className:"text-xs font-medium text-muted-foreground",children:n}),d&&e.jsx(Ve,{children:e.jsxs(He,{children:[e.jsx(De,{children:e.jsx(ze,{className:"w-3 h-3 text-muted-foreground/50"})}),e.jsx(Fe,{side:"top",className:"max-w-[240px] text-xs",children:d})]})})]}),S]})}function U({label:n,value:d,onChange:S,min:I=1,max:V=10,step:H=1,helper:D}){return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx(me,{className:"text-xs font-medium text-muted-foreground",children:n}),e.jsxs("span",{className:"text-sm font-semibold text-foreground",children:[d,"/",V]})]}),e.jsx(Re,{value:[d],onValueChange:([r])=>S(r),min:I,max:V,step:H}),D&&e.jsx("p",{className:"text-[11px] text-muted-foreground/70",children:D})]})}function M(n,d){return n>=d[0]?"healthy":n>=d[1]?"warning":"critical"}function Ss(){const{startup:n}=Ae(),{saveProblemValidationData:d,loadProblemValidationData:S,saveSolutionDesignData:I,loadSolutionDesignData:V}=qe(),[H,D]=u.useState(!1),[r,v]=u.useState({targetCustomer:"",problem:"",currentSolution:"",painLevel:"",frequency:""}),[c,z]=u.useState([]),[p,F]=u.useState([]),[he,Y]=u.useState(""),[pe,J]=u.useState(!1),[i,x]=u.useState({hypothesis:"",targetOutcome:"",valueProposition:"",keyAssumptions:[],successMetrics:[]}),[W,G]=u.useState(""),[B,_]=u.useState("");u.useEffect(()=>{(async()=>{if(n){try{const[t,a]=await Promise.all([S(),V()]);if(t){const o=t;v(o.problemStatement||o.problem_statement||{targetCustomer:"",problem:"",currentSolution:"",painLevel:"",frequency:""}),z(o.interviews||[]),F(o.assumptions||[])}if(a){const o=a,m=o.solutionHypothesis||o.solution_hypothesis||{};x({hypothesis:m.hypothesis||"",targetOutcome:m.targetOutcome||"",valueProposition:m.valueProposition||"",keyAssumptions:Array.isArray(m.keyAssumptions)?m.keyAssumptions:[],successMetrics:Array.isArray(m.successMetrics)?m.successMetrics:[]})}}catch{}D(!0)}})()},[n]);const X=ae.useRef({problemStatement:r,interviews:c,assumptions:p});X.current={problemStatement:r,interviews:c,assumptions:p};const Q=ae.useRef({solutionHypothesis:i,mvpFeatures:[]});Q.current={solutionHypothesis:i,mvpFeatures:[]},u.useEffect(()=>{if(!H||!n)return;const s=setTimeout(()=>{d(X.current).catch(()=>{}),I(Q.current).catch(()=>{})},1200);return()=>clearTimeout(s)},[JSON.stringify(r),JSON.stringify(c),JSON.stringify(p),JSON.stringify(i),H,n==null?void 0:n.id]),u.useEffect(()=>{if(!r.targetCustomer||!r.problem){Y("");return}const s=setTimeout(async()=>{J(!0);try{const{data:t,error:a}=await Te.functions.invoke("generate-problem-statement",{body:r});!a&&(t!=null&&t.statement)&&Y(t.statement)}catch{}J(!1)},1500);return()=>clearTimeout(s)},[r.targetCustomer,r.problem,r.currentSolution]);const h=c.filter(s=>s.status==="completed").length,k=h>0?c.filter(s=>s.status==="completed"&&s.problemScore>0).reduce((s,t)=>s+t.problemScore,0)/h:0,C=h>0?c.filter(s=>s.status==="completed"&&s.urgencyScore>0).reduce((s,t)=>s+t.urgencyScore,0)/h:0,P=p.filter(s=>s.riskLevel==="high").length,E=Object.values(r).filter(s=>s.trim()!=="").length,R=[i.hypothesis,i.targetOutcome,i.valueProposition].filter(s=>s.trim()!=="").length,ge=E/5*25,xe=Math.min(h/3,1)*25,be=Math.min(p.length/3,1)*15,ye=R/3*25,A=Math.round(ge+xe+be+ye),fe=()=>{z(s=>[...s,{id:Date.now().toString(),customerName:"",customerSegment:"",date:"",status:"planned",problemScore:5,urgencyScore:5,insights:""}])},y=(s,t)=>{z(a=>a.map(o=>o.id===s?{...o,...t}:o))},ve=s=>{z(t=>t.filter(a=>a.id!==s))},je=()=>{F(s=>[...s,{id:Date.now().toString(),description:"",impact:3,confidence:3,riskLevel:"medium",evidence:""}])},T=(s,t)=>{F(a=>a.map(o=>o.id===s?{...o,...t}:o))},we=s=>{F(t=>t.filter(a=>a.id!==s))},Z=()=>{W.trim()&&(x(s=>({...s,keyAssumptions:[...s.keyAssumptions,W.trim()]})),G(""))},ee=()=>{B.trim()&&(x(s=>({...s,successMetrics:[...s.successMetrics,B.trim()]})),_(""))},Ne=async()=>
1{if(n)try{await Promise.all([d({problemStatement:r,interviews:c,assumptions:p,isCompleted:A>=80,progress:A}),I({solutionHypothesis:i,mvpFeatures:[],isCompleted:A>=80,progress:A})]),oe.success("Progress saved")}catch{oe.error("Failed to save")}},q=[{label:"Problem Clarity",value:`${E}/5`,rawValue:E,status:M(E,[5,3]),benchmark:"Fill all 5 fields",explanation:"A clear problem statement is the foundation of everything. You should be able to describe who has the problem, what the problem is, how they currently solve it, how painful it is, and how often it occurs."},{label:"Customer Interviews",value:`${h}`,rawValue:h,status:M(h,[5,3]),benchmark:"Target: 5+ completed",explanation:"Customer interviews are the gold standard for problem validation. You need at least 5 quality conversations to spot patterns. Look for consistent pain points across different customers."},{label:"Avg. Pain Score",value:k>0?`${k.toFixed(1)}/10`:"-",rawValue:k,status:k>0?M(k,[7,4]):"critical",benchmark:"Strong signal: 7+",explanation:'Pain score reflects how significant the problem is for your target customers. Scores below 7 suggest the problem may not be urgent enough for people to pay for a solution. Aim for "hair on fire" problems.'},{label:"Avg. Urgency",value:C>0?`${C.toFixed(1)}/10`:"-",rawValue:C,status:C>0?M(C,[7,4]):"critical",benchmark:"Strong signal: 7+",explanation:"Urgency measures how soon customers need a solution. High pain + low urgency means they'll procrastinate adopting your product. High urgency drives faster sales cycles and organic word-of-mouth."},{label:"High-Risk Assumptions",value:`${P}`,rawValue:P,status:P===0?"healthy":P<=2?"warning":"critical",benchmark:"Identify & mitigate",explanation:"Every startup is built on assumptions. High-risk assumptions are the ones that, if wrong, would kill your business. Identify them early and design cheap experiments to validate or invalidate them."},{label:"Solution Hypothesis",value:`${R}/3`,rawValue:R,status:M(R,[3,2]),benchmark:"Complete all 3 fields",explanation:"Your solution hypothesis should clearly state what you're building, the target outcome for users, and your unique value proposition. This becomes the north star for your MVP."}],L=q.filter(s=>s.status==="healthy").length,se=L>=6?"healthy":L>=4?"warning":"critical",te=L>=6?"Your problem is well-validated and your solution hypothesis is strong. You're ready to build.":L>=4?"Good progress! A few areas still need attention before you start building.":"You need more validation before moving forward. Focus on the red metrics.",{handleExport:Se,exporting:ke}=We({toolName:"Problem-Solution Validator",toolSubtitle:"Validate the problem, then design the minimum solution, before you build.",getMetrics:()=>q.map(s=>({label:s.label,value:s.value,status:s.status,benchmark:s.benchmark})),getSections:()=>[{title:"Problem Statement",type:"key-value",data:[{label:"Target Customer",value:r.targetCustomer||"-"},{label:"Problem",value:r.problem||"-"},{label:"Current Solution",value:r.currentSolution||"-"},{label:"Pain Level",value:r.painLevel||"-"},{label:"Frequency",value:r.frequency||"-"}]},...c.filter(s=>s.status==="completed").length>0?[{title:"Completed Interviews",type:"table",data:{headers:["Customer","Segment","Pain","Urgency"],rows:c.filter(s=>s.status==="completed").map(s=>[s.customerName,s.customerSegment,`${s.problemScore}/10`,`${s.urgencyScore}/10`])}}]:[],...i.hypothesis?[{title:"Solution Hypothesis",type:"key-value",data:[{label:"Hypothesis",value:i.hypothesis},{label:"Target Outcome",value:i.targetOutcome||"-"},{label:"Value Proposition",value:i.valueProposition||"-"}]}]:[]],getVerdict:()=>({status:se,message:te})}),Ce=[{id:"problem",label:"Problem Statement",icon:Be,description:"Define the specific problem you're solving, who experiences it, and how they currently deal with it. A well-articulated problem is half the solution.",tip:'The #1 reason startups fail is building something nobody wants. Before you write a single line of code, you need to prove the problem is real, painful, and frequent. Use the "Five Whys" technique to dig beneath surface-level complaints to the root cause. Your problem statement should pass the "Mom Test", even your mom would understand it.',content:e.jsx(j,{children:e.jsxs(w,{className:"p-5 space-y-5",children:[e.jsx(l,{label:"Target Customer",helper:"Be specific: role, company size, industry, geography",children:e.jsx(g,{placeholder:'e.g., "Series A SaaS founders with 10-50 employees in Europe"',value:r.targetCustomer,onChange:s=>v(t=>({...t,targetCustomer:s.target.value})),className:"h-10 bg-card"})}),e.jsx(l,{label:"The Problem",helper:"Describe the pain point in their words, not yours",children:e.jsx(f,{placeholder:'e.g., "They spend 8+ hours per week manually tracking customer churn signals across 5 different tools"',value:r.problem,onChange:s=>v(t=>({...t,problem:s.target.value})),rows:3,className:"resize-none bg-card"})}),e.jsx(l,{label:"Current Solution",helper:"How do they solve this today? Spreadsheets? Manual work? A competitor?",children:e.jsx(f,{placeholder:'e.g., "They use a combination of spreadsheets, CRM reports, and weekly manual check-ins"',value:r.currentSolution,onChange:s=>v(t=>({...t,currentSolution:s.target.value})),rows:3,className:"resize-none bg-card"})}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(l,{label:"Pain Level",helper:"How painful is this problem on a daily basis?",children:e.jsx(g,{placeholder:'e.g., "Critical, they lose 15% of revenue annually to preventable churn"',value:r.painLevel,onChange:s=>v(t=>({...t,painLevel:s.target.value})),className:"h-10 bg-card"})}),e.jsx(l,{label:"Frequency",helper:"How often does this problem occur?",children:e.jsx(g,{placeholder:'e.g., "Daily, every morning starts with a churn review"',value:r.frequency,onChange:s=>v(t=>({...t,frequency:s.target.value})),className:"h-10 bg-card"})})]}),r.targetCustomer&&r.problem&&e.jsxs("div",{className:"p-4 rounded-lg border border-primary/15 bg-primary/[0.02]",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(Ke,{className:"w-4 h-4 text-primary"}),e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-primary",children:"AI-Generated Problem Statement"})]}),pe?e.jsxs("div",{className:"flex items-center gap-2 text-muted-foreground text-sm",children:[e.jsx(Le,{className:"w-3.5 h-3.5 animate-spin"}),e.jsx("span",{children:"Generating…"})]}
1):e.jsxs("p",{className:"text-sm italic text-foreground/70 leading-relaxed",children:['"',he||`${r.targetCustomer} struggle with ${r.problem.toLowerCase()}.`,'"']})]})]})})},{id:"interviews",label:"Interviews",icon:ue,description:"Track your customer discovery interviews. Each conversation brings you closer to understanding whether the problem is real and worth solving.",tip:'The best interviews follow the "Mom Test": never ask "Would you use this?" Instead, ask about their current behavior: "Tell me about the last time you dealt with [problem]." Past behavior is the strongest predictor of future action. Aim for at least 5 quality interviews before drawing conclusions.',content:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"flex items-center gap-3",children:e.jsxs(K,{variant:"outline",className:"text-xs",children:[h," completed • ",c.length-h," pending"]})}),e.jsxs(b,{onClick:fe,size:"sm",className:"gap-1.5",children:[e.jsx(O,{className:"w-3.5 h-3.5"}),"Add Interview"]})]}),c.length===0&&e.jsx(j,{className:"border-dashed",children:e.jsxs(w,{className:"p-8 text-center",children:[e.jsx(ue,{className:"w-8 h-8 text-muted-foreground/30 mx-auto mb-3"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"No interviews yet. Add your first customer interview to start validating."})]})}),c.map((s,t)=>e.jsx(j,{children:e.jsxs(w,{className:"p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-6 h-6 rounded-full bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground",children:t+1}),e.jsx(g,{placeholder:"Customer name",value:s.customerName,onChange:a=>y(s.id,{customerName:a.target.value}),className:"h-8 text-sm font-medium border-0 bg-transparent shadow-none p-0 focus-visible:ring-0 w-auto"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(ie,{value:s.status,onValueChange:a=>y(s.id,{status:a}),children:[e.jsx(le,{className:"h-7 text-xs w-[110px]",children:e.jsx(ne,{})}),e.jsxs(ce,{children:[e.jsx(N,{value:"planned",children:"Planned"}),e.jsx(N,{value:"completed",children:"Completed"}),e.jsx(N,{value:"cancelled",children:"Cancelled"})]})]}),e.jsx(b,{variant:"ghost",size:"icon",className:"h-7 w-7",onClick:()=>ve(s.id),children:e.jsx($,{className:"w-3.5 h-3.5"})})]})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(l,{label:"Segment",children:e.jsx(g,{placeholder:"e.g., Small business owner",value:s.customerSegment,onChange:a=>y(s.id,{customerSegment:a.target.value}),className:"h-9 text-sm bg-card"})}),e.jsx(l,{label:"Date",children:e.jsx(g,{type:"date",value:s.date,onChange:a=>y(s.id,{date:a.target.value}),className:"h-9 text-sm bg-card"})})]}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(U,{label:"Problem Score",value:s.problemScore,onChange:a=>y(s.id,{problemScore:a}),helper:"1 = minor inconvenience, 10 = critical pain"}),e.jsx(U,{label:"Urgency Score",value:s.urgencyScore,onChange:a=>y(s.id,{urgencyScore:a}),helper:"1 = can wait months, 10 = needs it now"})]}),e.jsx(l,{label:"Key Insights",children:e.jsx(f,{placeholder:"What did you learn? Key quotes, surprising findings, patterns…",value:s.insights,onChange:a=>y(s.id,{insights:a.target.value}),rows:2,className:"resize-none text-sm bg-card"})})]})},s.id))]})},{id:"assumptions",label:"Assumptions",icon:re,description:"List the key assumptions your business rests on. Every startup is a stack of untested beliefs, surface and stress-test the riskiest ones first.",tip:"The most dangerous assumptions are the ones you don't even realize you're making. Force yourself to write down at least 5 assumptions across categories: problem (is it real?), customer (will they pay?), market (is it big enough?), and solution (can we build it?). Then rank by impact × uncertainty to find your riskiest bets.",content:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(K,{variant:"outline",className:"text-xs",children:[p.length," assumptions • ",P," high-risk"]}),e.jsxs(b,{onClick:je,size:"sm",className:"gap-1.5",children:[e.jsx(O,{className:"w-3.5 h-3.5"}),"Add Assumption"]})]}),p.length===0&&e.jsx(j,{className:"border-dashed",children:e.jsxs(w,{className:"p-8 text-center",children:[e.jsx(re,{className:"w-8 h-8 text-muted-foreground
1/30 mx-auto mb-3"}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"No assumptions listed yet. Start by identifying your riskiest beliefs."})]})}),p.map((s,t)=>e.jsx(j,{children:e.jsxs(w,{className:"p-4 space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:Me("w-6 h-6 rounded-full flex items-center justify-center text-xs",s.riskLevel==="high"?"bg-red-100 text-red-600":s.riskLevel==="medium"?"bg-amber-100 text-amber-600":"bg-emerald-100 text-emerald-600"),children:t+1}),e.jsxs(K,{variant:s.riskLevel==="high"?"destructive":s.riskLevel==="medium"?"default":"secondary",className:"text-[10px]",children:[s.riskLevel," risk"]})]}),e.jsx(b,{variant:"ghost",size:"icon",className:"h-7 w-7",onClick:()=>we(s.id),children:e.jsx($,{className:"w-3.5 h-3.5"})})]}),e.jsx(l,{label:"Assumption",children:e.jsx(f,{placeholder:'e.g., "Users will pay $49/month for automated churn prediction"',value:s.description,onChange:a=>T(s.id,{description:a.target.value}),rows:2,className:"resize-none text-sm bg-card"})}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-3",children:[e.jsx(U,{label:"Impact",value:s.impact,onChange:a=>T(s.id,{impact:a}),max:5,helper:"If wrong, how bad?"}),e.jsx(U,{label:"Confidence",value:s.confidence,onChange:a=>T(s.id,{confidence:a}),max:5,helper:"How sure are you?"}),e.jsx(l,{label:"Risk Level",children:e.jsxs(ie,{value:s.riskLevel,onValueChange:a=>T(s.id,{riskLevel:a}),children:[e.jsx(le,{className:"h-9 text-sm",children:e.jsx(ne,{})}),e.jsxs(ce,{children:[e.jsx(N,{value:"low",children:"Low"}),e.jsx(N,{value:"medium",children:"Medium"}),e.jsx(N,{value:"high",children:"High"})]})]})})]}),e.jsx(l,{label:"Evidence / Validation Plan",children:e.jsx(f,{placeholder:"What evidence do you have? How will you test this?",value:s.evidence,onChange:a=>T(s.id,{evidence:a.target.value}),rows:2,className:"resize-none text-sm bg-card"})})]})},s.id))]})},{id:"hypothesis",label:"Solution Hypothesis",icon:de,description:"Based on your validated problem, define your solution hypothesis, what you're building, the outcome it delivers, and why it's uniquely valuable.",tip:`A great solution hypothesis follows this format: "We believe that [building X] for [target customer] will achieve [outcome] because [insight from research]." Keep it testable. If you can't prove it wrong, it's not a hypothesis, it's a wish.`,content:e.jsx(j,{children:e.jsxs(w,{className:"p-5 space-y-5",children:[e.jsx(l,{label:"Solution Hypothesis",helper:"What are you building and why will it work?",children:e.jsx(f,{placeholder:'e.g., "We believe that an AI-powered churn prediction dashboard will reduce SaaS churn by 30% because founders currently lack real-time visibility into at-risk accounts"',value:i.hypothesis,onChange:s=>x(t=>({...t,hypothesis:s.target.value})),rows:3,className:"resize-none bg-card"})}),e.jsx(l,{label:"Target Outcome",helper:"What measurable result will your solution deliver?",children:e.jsx(g,{placeholder:'e.g., "Reduce time-to-identify churning customers from 2 weeks to 2 hours"',value:i.targetOutcome,onChange:s=>x(t=>({...t,targetOutcome:s.target.value})),className:"h-10 bg-card"})}),e.jsx(l,{label:"Value Proposition",helper:"Why should customers choose you over alternatives?",children:e.jsx(f,{placeholder:'e.g., "Unlike manual CRM reports, our tool automatically surfaces churn signals and recommends interventions, saving 8 hours/week per account manager"',value:i.valueProposition,onChange:s=>x(t=>({...t,valueProposition:s.target.value})),rows:2,className:"resize-none bg-card"})}),e.jsx(l,{label:"Key Assumptions",helper:"Critical beliefs that must be true for your solution to succeed",children:e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(g,{placeholder:"Add a key assumption…",value:W,onChange:s=>G(s.target.value),onKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),Z())},className:"h-9 text-sm bg-card"}),e.jsx(b,{onClick:Z,size:"sm",variant:"outline",className:"h-9 px-3",children:e.jsx(O,{className:"w-3.5 h-3.5"})})]}),i.keyAssumptions.map((s,t)=>e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded-md bg-muted/50 border border-border",children:[e.jsx("span",{className:"text-sm text-foreground flex-1",children:s}),e.jsx(b,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:()=>x(a=>({...a,keyAssumptions:a.keyAssumptions.filter((o,m)=>m!==t)})),children:e.jsx($,{className:"w-3 h-3"})})]},t))]})}),e.jsx(l,{label:"Success Metrics",helper:"How will you know your solution is working?",children:e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(g,{placeholder:"Add a success metric…",value:B,onChange:s=>_(s.target.value),onKeyDown:s=>{s.key==="Enter"&&(s.preventDefault(),ee())},className:"h-9 text-sm bg-card"}),e.jsx(b,{onClick:ee,size:"sm",variant:"outline",className:"h-9 px-3",children:e.jsx(O,{className:"w-3.5 h-3.5"})})]}),i.successMetrics.map((s,t)=>e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded-md bg-muted/50 border border-border",children:[e.jsx("span",{className:"text-sm text-foreground flex-1",children:s}),e.jsx(b,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:()=>x(a=>({...a,successMetrics:a.successMetrics.filter((o,m)=>m!==t)})),children:e.jsx($,{className:"w-3 h-3"})})]},t))]})})]})})}],Pe=e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"grid grid-cols-2 gap-2.5",children:q.map(s=>e.jsx($e,{metric:s},s.label))}),e.jsx(Ue,{status:se,title:"Validation Status",message:te,detail
1:`${L} of ${q.length} metrics are healthy • ${A}% complete`})]});return e.jsx(Ee,{breadcrumbItems:[{label:"Tools",href:"/tools"},{label:"Problem-Solution Validator"}],children:e.jsx(Ie,{page:"roadmap",children:e.jsx(Oe,{title:"Problem-Solution Validator",subtitle:"Validate the problem, then design the minimum solution, before you build.",icon:de,intro:{summary:"The #1 reason startups fail is building something nobody wants. This tool guides you through a structured process: first, articulate and validate the problem with real customer evidence. Then, design the minimum viable solution that addresses the core pain point. Every section builds on the previous one.",outcomes:["Articulate your problem in one clear, testable sentence","Conduct and track customer discovery interviews","Identify and prioritize your riskiest assumptions","Define a solution hypothesis grounded in evidence"],whenToUse:"Use this as your very first tool, before building, before fundraising, before hiring. Revisit after every round of customer discovery to sharpen your thesis. If you can't fill out the Problem Statement tab convincingly, you're not ready to build."},tabs:Ce,resultsPanel:Pe,onSave:Ne,onExport:Se,exporting:ke})})})}export{Ss as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.