export function personalInjuryClaimCalculator(form: FormTs) {
// Pain and suffering multipliers by injury severity
const severityMultipliers: Record<string, { min: number; max: number }> = {
'minor': { min: 1.5, max: 2 },
'moderate': { min: 2, max: 3 },
'serious': { min: 3, max: 4 },
'severe': { min: 4, max: 5 },
'catastrophic': { min: 5, max: 7 }
};
// Recovery time impacts
const recoveryMultipliers: Record<string, number> = {
'weeks': 1.0,
'months': 1.25,
'six-months': 1.5,
'year-plus': 1.75,
'permanent': 2.0
};
// Liability factors
const liabilityFactors: Record<string, number> = {
'clear': 1.0,
'mostly-clear': 0.85,
'shared': 0.6,
'disputed': 0.4
};
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Personal Injury Claim Estimator',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
form.addSpacer({ height: 20 });
// Accident Information Section
const accidentSection = form.addSubform('accidentInfo', { title: '🚗 Accident Information' });
accidentSection.addRow(row => {
row.addDropdown('accidentType', {
label: 'Type of Accident',
options: [
{ id: 'auto', name: 'Car/Auto Accident' },
{ id: 'motorcycle', name: 'Motorcycle Accident' },
{ id: 'truck', name: 'Truck Accident' },
{ id: 'pedestrian', name: 'Pedestrian Accident' },
{ id: 'bicycle', name: 'Bicycle Accident' },
{ id: 'slip-fall', name: 'Slip and Fall' },
{ id: 'workplace', name: 'Workplace Injury' },
{ id: 'medical', name: 'Medical Malpractice' },
{ id: 'product', name: 'Product Liability' },
{ id: 'other', name: 'Other Personal Injury' }
],
defaultValue: 'auto',
isRequired: true
}, '1fr');
row.addDropdown('liability', {
label: 'Liability Situation',
options: [
{ id: 'clear', name: 'Clear liability (other party at fault)' },
{ id: 'mostly-clear', name: 'Mostly clear (minor comparative fault)' },
{ id: 'shared', name: 'Shared fault (significant comparative)' },
{ id: 'disputed', name: 'Disputed liability' }
],
defaultValue: 'clear',
isRequired: true
}, '1fr');
});
// Injury Details Section
const injurySection = form.addSubform('injuryDetails', { title: '🏥 Injury Details' });
injurySection.addRow(row => {
row.addDropdown('injurySeverity', {
label: 'Injury Severity',
options: [
{ id: 'minor', name: 'Minor (sprains, strains, bruises)' },
{ id: 'moderate', name: 'Moderate (fractures, herniated discs)' },
{ id: 'serious', name: 'Serious (surgery required, long recovery)' },
{ id: 'severe', name: 'Severe (multiple surgeries, permanent impact)' },
{ id: 'catastrophic', name: 'Catastrophic (TBI, spinal cord, amputation)' }
],
defaultValue: 'moderate',
isRequired: true
}, '1fr');
row.addDropdown('recoveryTime', {
label: 'Expected Recovery Time',
options: [
{ id: 'weeks', name: 'A few weeks' },
{ id: 'months', name: '1-6 months' },
{ id: 'six-months', name: '6-12 months' },
{ id: 'year-plus', name: 'Over 1 year' },
{ id: 'permanent', name: 'Permanent injury' }
],
defaultValue: 'months',
isRequired: true
}, '1fr');
});
injurySection.addRow(row => {
row.addCheckbox('hospitalized', {
label: 'Required hospitalization',
defaultValue: false
}, '1fr');
row.addCheckbox('surgery', {
label: 'Required surgery',
defaultValue: false
}, '1fr');
});
injurySection.addRow(row => {
row.addCheckbox('ongoingTreatment', {
label: 'Ongoing medical treatment needed',
defaultValue: false
}, '1fr');
row.addCheckbox('permanentDisability', {
label: 'Permanent disability or impairment',
defaultValue: false
}, '1fr');
});
// Economic Damages Section
const economicSection = form.addSubform('economicDamages', { title: '💵 Economic Damages' });
economicSection.addRow(row => {
row.addMoney('medicalExpenses', {
label: 'Medical Expenses (to date)',
min: 0,
max: 10000000,
defaultValue: 5000,
isRequired: true,
tooltip: 'Include all medical bills: ER, doctors, specialists, physical therapy, medications, medical equipment'
}, '1fr');
row.addMoney('futureMedical', {
label: 'Estimated Future Medical Costs',
min: 0,
max: 10000000,
defaultValue: 0,
tooltip: 'Projected future treatment, surgeries, therapy, medications'
}, '1fr');
});
economicSection.addRow(row => {
row.addMoney('lostWages', {
label: 'Lost Wages (to date)',
min: 0,
max: 5000000,
defaultValue: 0,
tooltip: 'Income lost due to inability to work'
}, '1fr');
row.addMoney('futureLostIncome', {
label: 'Future Lost Earning Capacity',
min: 0,
max: 10000000,
defaultValue: 0,
tooltip: 'Projected future income loss due to disability or reduced capacity'
}, '1fr');
});
economicSection.addRow(row => {
row.addMoney('propertyDamage', {
label: 'Property Damage',
min: 0,
max: 500000,
defaultValue: 0,
tooltip: 'Vehicle damage, personal property, etc.'
}, '1fr');
row.addMoney('outOfPocket', {
label: 'Other Out-of-Pocket Expenses',
min: 0,
max: 100000,
defaultValue: 0,
tooltip: 'Transportation to appointments, home modifications, etc.'
}, '1fr');
});
// Non-Economic Damages Section
const nonEconomicSection = form.addSubform('nonEconomicDamages', { title: '💔 Non-Economic Damages' });
nonEconomicSection.addRow(row => {
row.addDropdown('painLevel', {
label: 'Pain and Suffering Level',
options: [
{ id: 'mild', name: 'Mild - temporary discomfort' },
{ id: 'moderate', name: 'Moderate - significant pain during recovery' },
{ id: 'severe', name: 'Severe - intense ongoing pain' },
{ id: 'extreme', name: 'Extreme - chronic debilitating pain' }
],
defaultValue: 'moderate'
}, '1fr');
row.addDropdown('emotionalDistress', {
label: 'Emotional/Mental Impact',
options: [
{ id: 'minimal', name: 'Minimal impact' },
{ id: 'moderate', name: 'Moderate (anxiety, sleep issues)' },
{ id: 'significant', name: 'Significant (PTSD, depression)' },
{ id: 'severe', name: 'Severe (major psychological trauma)' }
],
defaultValue: 'moderate'
}, '1fr');
});
nonEconomicSection.addRow(row => {
row.addCheckbox('lossOfEnjoyment', {
label: 'Loss of enjoyment of life',
defaultValue: false
}, '1fr');
row.addCheckbox('lossOfConsortium', {
label: 'Loss of consortium (impact on relationships)',
defaultValue: false
}, '1fr');
});
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
// Estimate Summary Section
const summarySection = form.addSubform('summary', { title: '📊 Claim Estimate Summary', isCollapsible: false });
summarySection.addRow(row => {
row.addPriceDisplay('totalEconomic', {
label: 'Total Economic Damages',
computedValue: () => {
const medical = economicSection.money('medicalExpenses')?.value() || 0;
const futureMedical = economicSection.money('futureMedical')?.value() || 0;
const lostWages = economicSection.money('lostWages')?.value() || 0;
const futureLost = economicSection.money('futureLostIncome')?.value() || 0;
const property = economicSection.money('propertyDamage')?.value() || 0;
const outOfPocket = economicSection.money('outOfPocket')?.value() || 0;
return medical + futureMedical + lostWages + futureLost + property + outOfPocket;
},
variant: 'default'
}, '1fr');
row.addTextPanel('multiplierUsed', {
computedValue: () => {
const severity = injurySection.dropdown('injurySeverity')?.value() || 'moderate';
const mult = severityMultipliers[severity];
return `Pain & Suffering Multiplier: ${mult?.min || 2}x - ${mult?.max || 3}x`;
},
customStyles: { 'font-size': '0.9rem', 'color': '#64748b', 'text-align': 'center', 'padding-top': '8px' }
}, '1fr');
});
summarySection.addRow(row => {
row.addPriceDisplay('painSufferingLow', {
label: 'Pain & Suffering (Low Est.)',
computedValue: () => {
const severity = injurySection.dropdown('injurySeverity')?.value() || 'moderate';
const recovery = injurySection.dropdown('recoveryTime')?.value() || 'months';
const painLevel = nonEconomicSection.dropdown('painLevel')?.value() || 'moderate';
const medical = economicSection.money('medicalExpenses')?.value() || 0;
const futureMedical = economicSection.money('futureMedical')?.value() || 0;
const totalMedical = medical + futureMedical;
const baseMult = severityMultipliers[severity]?.min || 2;
const recoveryMult = recoveryMultipliers[recovery] || 1;
let painAdjust = 1.0;
if (painLevel === 'severe') painAdjust = 1.2;
if (painLevel === 'extreme') painAdjust = 1.4;
let additionalFactors = 0;
if (injurySection.checkbox('surgery')?.value()) additionalFactors += 0.2;
if (injurySection.checkbox('permanentDisability')?.value()) additionalFactors += 0.5;
if (nonEconomicSection.checkbox('lossOfEnjoyment')?.value()) additionalFactors += 0.15;
if (nonEconomicSection.checkbox('lossOfConsortium')?.value()) additionalFactors += 0.15;
return totalMedical * baseMult * recoveryMult * painAdjust * (1 + additionalFactors);
},
variant: 'default'
}, '1fr');
row.addPriceDisplay('painSufferingHigh', {
label: 'Pain & Suffering (High Est.)',
computedValue: () => {
const severity = injurySection.dropdown('injurySeverity')?.value() || 'moderate';
const recovery = injurySection.dropdown('recoveryTime')?.value() || 'months';
const painLevel = nonEconomicSection.dropdown('painLevel')?.value() || 'moderate';
const medical = economicSection.money('medicalExpenses')?.value() || 0;
const futureMedical = economicSection.money('futureMedical')?.value() || 0;
const totalMedical = medical + futureMedical;
const baseMult = severityMultipliers[severity]?.max || 3;
const recoveryMult = recoveryMultipliers[recovery] || 1;
let painAdjust = 1.0;
if (painLevel === 'severe') painAdjust = 1.2;
if (painLevel === 'extreme') painAdjust = 1.4;
let additionalFactors = 0;
if (injurySection.checkbox('surgery')?.value()) additionalFactors += 0.2;
if (injurySection.checkbox('permanentDisability')?.value()) additionalFactors += 0.5;
if (nonEconomicSection.checkbox('lossOfEnjoyment')?.value()) additionalFactors += 0.15;
if (nonEconomicSection.checkbox('lossOfConsortium')?.value()) additionalFactors += 0.15;
return totalMedical * baseMult * recoveryMult * painAdjust * (1 + additionalFactors);
},
variant: 'default'
}, '1fr');
});
const finalSection = form.addSubform('final', {
title: '💰 Estimated Claim Value Range',
isCollapsible: false,
sticky: 'bottom'
});
finalSection.addRow(row => {
row.addPriceDisplay('lowEstimate', {
label: 'Low Estimate',
computedValue: () => {
const liability = accidentSection.dropdown('liability')?.value() || 'clear';
const liabilityFactor = liabilityFactors[liability] || 1;
// Economic damages
const medical = economicSection.money('medicalExpenses')?.value() || 0;
const futureMedical = economicSection.money('futureMedical')?.value() || 0;
const lostWages = economicSection.money('lostWages')?.value() || 0;
const futureLost = economicSection.money('futureLostIncome')?.value() || 0;
const property = economicSection.money('propertyDamage')?.value() || 0;
const outOfPocket = economicSection.money('outOfPocket')?.value() || 0;
const totalEconomic = medical + futureMedical + lostWages + futureLost + property + outOfPocket;
// Pain and suffering (low)
const severity = injurySection.dropdown('injurySeverity')?.value() || 'moderate';
const recovery = injurySection.dropdown('recoveryTime')?.value() || 'months';
const painLevel = nonEconomicSection.dropdown('painLevel')?.value() || 'moderate';
const totalMedical = medical + futureMedical;
const baseMult = severityMultipliers[severity]?.min || 2;
const recoveryMult = recoveryMultipliers[recovery] || 1;
let painAdjust = 1.0;
if (painLevel === 'severe') painAdjust = 1.2;
if (painLevel === 'extreme') painAdjust = 1.4;
let additionalFactors = 0;
if (injurySection.checkbox('surgery')?.value()) additionalFactors += 0.2;
if (injurySection.checkbox('permanentDisability')?.value()) additionalFactors += 0.5;
if (nonEconomicSection.checkbox('lossOfEnjoyment')?.value()) additionalFactors += 0.15;
if (nonEconomicSection.checkbox('lossOfConsortium')?.value()) additionalFactors += 0.15;
const painSuffering = totalMedical * baseMult * recoveryMult * painAdjust * (1 + additionalFactors);
return Math.round((totalEconomic + painSuffering) * liabilityFactor);
},
variant: 'large'
}, '1fr');
row.addPriceDisplay('highEstimate', {
label: 'High Estimate',
computedValue: () => {
const liability = accidentSection.dropdown('liability')?.value() || 'clear';
const liabilityFactor = liabilityFactors[liability] || 1;
// Economic damages
const medical = economicSection.money('medicalExpenses')?.value() || 0;
const futureMedical = economicSection.money('futureMedical')?.value() || 0;
const lostWages = economicSection.money('lostWages')?.value() || 0;
const futureLost = economicSection.money('futureLostIncome')?.value() || 0;
const property = economicSection.money('propertyDamage')?.value() || 0;
const outOfPocket = economicSection.money('outOfPocket')?.value() || 0;
const totalEconomic = medical + futureMedical + lostWages + futureLost + property + outOfPocket;
// Pain and suffering (high)
const severity = injurySection.dropdown('injurySeverity')?.value() || 'moderate';
const recovery = injurySection.dropdown('recoveryTime')?.value() || 'months';
const painLevel = nonEconomicSection.dropdown('painLevel')?.value() || 'moderate';
const totalMedical = medical + futureMedical;
const baseMult = severityMultipliers[severity]?.max || 3;
const recoveryMult = recoveryMultipliers[recovery] || 1;
let painAdjust = 1.0;
if (painLevel === 'severe') painAdjust = 1.2;
if (painLevel === 'extreme') painAdjust = 1.4;
let additionalFactors = 0;
if (injurySection.checkbox('surgery')?.value()) additionalFactors += 0.2;
if (injurySection.checkbox('permanentDisability')?.value()) additionalFactors += 0.5;
if (nonEconomicSection.checkbox('lossOfEnjoyment')?.value()) additionalFactors += 0.15;
if (nonEconomicSection.checkbox('lossOfConsortium')?.value()) additionalFactors += 0.15;
const painSuffering = totalMedical * baseMult * recoveryMult * painAdjust * (1 + additionalFactors);
return Math.round((totalEconomic + painSuffering) * liabilityFactor);
},
variant: 'large'
}, '1fr');
});
finalSection.addRow(row => {
row.addTextPanel('liabilityNote', {
computedValue: () => {
const liability = accidentSection.dropdown('liability')?.value() || 'clear';
const factor = liabilityFactors[liability] || 1;
if (factor < 1) {
return `Note: Estimates adjusted for comparative fault (${Math.round(factor * 100)}% recovery potential)`;
}
return '';
},
customStyles: { 'font-size': '0.85rem', 'color': '#f59e0b', 'text-align': 'center', 'font-style': 'italic' }
});
});
finalSection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'This calculator provides general estimates only. Actual case values depend on many factors including specific facts, evidence, insurance coverage, jurisdiction, and legal strategy. No attorney-client relationship is formed. Consult with a personal injury attorney for accurate case evaluation.',
customStyles: { 'font-size': '0.8rem', 'color': '#64748b', 'font-style': 'italic' }
});
});
form.configureSubmitButton({
label: 'Get Free Case Evaluation'
});
}