export function fuelCostCalculator(form: FormTs) {
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Fuel Cost Calculator',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
form.addSpacer({ height: 20 });
// Unit System Section
const unitSection = form.addSubform('units', { title: '๐ Unit System' });
unitSection.addRow(row => {
row.addRadioButton('unitSystem', {
label: 'Measurement System',
options: [
{ id: 'us', name: 'US (miles, gallons, $/gallon)' },
{ id: 'metric', name: 'Metric (km, liters, $/liter)' }
],
defaultValue: 'us',
isRequired: true
});
});
// Trip Details Section
const tripSection = form.addSubform('trip', { title: '๐ Trip Details' });
tripSection.addRow(row => {
row.addCheckbox('useAddresses', {
label: 'Calculate distance from addresses',
defaultValue: true,
tooltip: 'Use address inputs to calculate distance automatically'
});
});
tripSection.addRow(row => {
row.addAddress('originAddress', {
label: 'Starting Point',
placeholder: 'Enter starting address...',
distanceUnit: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'miles' : 'km',
isRequired: () => tripSection.checkbox('useAddresses')?.value() === true,
isVisible: () => tripSection.checkbox('useAddresses')?.value() === true
});
});
tripSection.addRow(row => {
row.addAddress('destAddress', {
label: 'Destination',
placeholder: 'Enter destination address...',
showMap: true,
showDistance: true,
referenceAddress: () => tripSection.address('originAddress')?.value() ?? null,
distanceUnit: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'miles' : 'km',
isRequired: () => tripSection.checkbox('useAddresses')?.value() === true,
isVisible: () => tripSection.checkbox('useAddresses')?.value() === true
});
});
tripSection.addRow(row => {
row.addDecimal('distance', {
label: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'Trip Distance (miles)' : 'Trip Distance (km)',
min: 0,
max: 100000,
defaultValue: 250,
placeholder: 'e.g. 250',
isRequired: () => tripSection.checkbox('useAddresses')?.value() !== true,
isVisible: () => tripSection.checkbox('useAddresses')?.value() !== true,
computedValue: () => {
if (tripSection.checkbox('useAddresses')?.value() === true) {
const destField = tripSection.address('destAddress');
return destField?.distance() ?? null;
}
return null;
}
}, '1fr');
row.addCheckbox('roundTrip', {
label: 'Round Trip',
defaultValue: false,
tooltip: 'Check if you need to return'
}, '1fr');
});
tripSection.addRow(row => {
row.addTextPanel('distanceInfo', {
computedValue: () => {
if (tripSection.checkbox('useAddresses')?.value() !== true) return '';
const destField = tripSection.address('destAddress');
const dist = destField?.distance();
if (dist == null) return 'Enter both addresses to calculate distance';
const unit = unitSection.radioButton('unitSystem')?.value() === 'us' ? 'miles' : 'km';
return `๐ Calculated distance: ${Math.round(dist)} ${unit}`;
},
customStyles: { 'font-size': '0.9rem', 'color': '#0369a1', 'background': '#e0f2fe', 'padding': '10px', 'border-radius': '6px' },
isVisible: () => tripSection.checkbox('useAddresses')?.value() === true
});
});
tripSection.addRow(row => {
row.addDropdown('tripType', {
label: 'Trip Type',
options: [
{ id: 'one-time', name: 'One-time Trip' },
{ id: 'daily', name: 'Daily Commute' },
{ id: 'weekly', name: 'Weekly Trip' }
],
defaultValue: 'one-time'
});
});
// Helper to get distance from addresses or manual input
const getTripDistance = () => {
if (tripSection.checkbox('useAddresses')?.value() === true) {
const destField = tripSection.address('destAddress');
return destField?.distance() ?? 250;
}
return getTripDistance();
};
// Vehicle Section
const vehicleSection = form.addSubform('vehicle', { title: '๐ Vehicle Information' });
vehicleSection.addRow(row => {
row.addDecimal('fuelEfficiency', {
label: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'Fuel Efficiency (MPG)' : 'Fuel Efficiency (L/100km)',
min: 1,
max: unitSection.radioButton('unitSystem')?.value() === 'us' ? 100 : 30,
defaultValue: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 28 : 8.5,
placeholder: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'e.g. 28' : 'e.g. 8.5',
isRequired: true,
tooltip: () => unitSection.radioButton('unitSystem')?.value() === 'us'
? 'Miles per gallon - higher is better'
: 'Liters per 100km - lower is better'
}, '1fr');
row.addDropdown('drivingConditions', {
label: 'Driving Conditions',
options: [
{ id: 'city', name: 'City (stop and go)' },
{ id: 'highway', name: 'Highway (cruise)' },
{ id: 'mixed', name: 'Mixed' }
],
defaultValue: 'mixed',
tooltip: 'Affects fuel efficiency estimate'
}, '1fr');
});
vehicleSection.addRow(row => {
row.addTextPanel('conditionAdjustment', {
computedValue: () => {
const conditions = vehicleSection.dropdown('drivingConditions')?.value() || 'mixed';
const adjustments: Record<string, string> = {
'city': 'City driving typically reduces efficiency by 10-15%',
'highway': 'Highway driving often improves efficiency by 5-10%',
'mixed': 'Using your entered efficiency as-is'
};
return adjustments[conditions] || '';
},
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'text-align': 'center' }
});
});
// Fuel Price Section
const priceSection = form.addSubform('price', { title: 'โฝ Fuel Price' });
priceSection.addRow(row => {
row.addDecimal('fuelPrice', {
label: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'Price per Gallon' : 'Price per Liter',
min: 0,
max: 20,
defaultValue: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 3.50 : 1.65,
placeholder: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? 'e.g. 3.50' : 'e.g. 1.65',
isRequired: true
}, '1fr');
row.addDropdown('fuelType', {
label: 'Fuel Type',
options: [
{ id: 'regular', name: 'Regular Unleaded' },
{ id: 'midgrade', name: 'Mid-Grade' },
{ id: 'premium', name: 'Premium' },
{ id: 'diesel', name: 'Diesel' }
],
defaultValue: 'regular'
}, '1fr');
});
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
// Results Section
const resultsSection = form.addSubform('results', { title: '๐ Trip Cost Breakdown', isCollapsible: false });
resultsSection.addRow(row => {
row.addPriceDisplay('totalDistance', {
label: 'Total Distance',
computedValue: () => {
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
return isRoundTrip ? distance * 2 : distance;
},
variant: 'default',
prefix: '',
suffix: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? ' miles' : ' km'
}, '1fr');
row.addPriceDisplay('fuelNeeded', {
label: 'Fuel Needed',
computedValue: () => {
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
const totalDistance = isRoundTrip ? distance * 2 : distance;
const efficiency = vehicleSection.decimal('fuelEfficiency')?.value() || (unitSystem === 'us' ? 28 : 8.5);
const conditions = vehicleSection.dropdown('drivingConditions')?.value() || 'mixed';
// Adjust efficiency based on conditions
let adjustedEfficiency = efficiency;
if (unitSystem === 'us') {
if (conditions === 'city') adjustedEfficiency = efficiency * 0.85;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 1.05;
} else {
// For L/100km, higher is worse
if (conditions === 'city') adjustedEfficiency = efficiency * 1.15;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 0.95;
}
let fuelNeeded: number;
if (unitSystem === 'us') {
fuelNeeded = totalDistance / adjustedEfficiency;
} else {
fuelNeeded = (totalDistance / 100) * adjustedEfficiency;
}
return Math.round(fuelNeeded * 100) / 100;
},
variant: 'default',
prefix: '',
suffix: () => unitSection.radioButton('unitSystem')?.value() === 'us' ? ' gallons' : ' liters'
}, '1fr');
});
resultsSection.addRow(row => {
row.addPriceDisplay('tripCost', {
label: 'Trip Fuel Cost',
computedValue: () => {
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
const totalDistance = isRoundTrip ? distance * 2 : distance;
const efficiency = vehicleSection.decimal('fuelEfficiency')?.value() || (unitSystem === 'us' ? 28 : 8.5);
const fuelPrice = priceSection.decimal('fuelPrice')?.value() || (unitSystem === 'us' ? 3.50 : 1.65);
const conditions = vehicleSection.dropdown('drivingConditions')?.value() || 'mixed';
let adjustedEfficiency = efficiency;
if (unitSystem === 'us') {
if (conditions === 'city') adjustedEfficiency = efficiency * 0.85;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 1.05;
} else {
if (conditions === 'city') adjustedEfficiency = efficiency * 1.15;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 0.95;
}
let fuelNeeded: number;
if (unitSystem === 'us') {
fuelNeeded = totalDistance / adjustedEfficiency;
} else {
fuelNeeded = (totalDistance / 100) * adjustedEfficiency;
}
return Math.round(fuelNeeded * fuelPrice * 100) / 100;
},
variant: 'large'
});
});
// Cost per Distance
resultsSection.addRow(row => {
row.addTextPanel('costPerDistance', {
computedValue: () => {
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const efficiencyValue = vehicleSection.decimal('fuelEfficiency')?.value();
const fuelPriceValue = priceSection.decimal('fuelPrice')?.value();
const isValidNumber = (val: unknown): val is number =>
typeof val === 'number' && !Number.isNaN(val);
const defaults = {
us: { efficiency: 28, fuelPrice: 3.50 },
metric: { efficiency: 8.5, fuelPrice: 1.65 }
};
const currentDefaults = unitSystem === 'us' ? defaults.us : defaults.metric;
const efficiency = isValidNumber(efficiencyValue) ? efficiencyValue : currentDefaults.efficiency;
const fuelPrice = isValidNumber(fuelPriceValue) ? fuelPriceValue : currentDefaults.fuelPrice;
if (efficiency <= 0) {
return 'Enter valid fuel efficiency';
}
let costPerUnit: number;
if (unitSystem === 'us') {
costPerUnit = fuelPrice / efficiency; // $ per mile
return `Cost: $${(Number(costPerUnit) || 0).toFixed(2)} per mile`;
} else {
costPerUnit = (efficiency / 100) * fuelPrice; // $ per km
return `Cost: $${(Number(costPerUnit) || 0).toFixed(2)} per km`;
}
},
customStyles: { 'font-size': '0.95rem', 'color': '#475569', 'text-align': 'center', 'font-weight': '500' }
});
});
// Recurring Costs Section
const recurringSection = form.addSubform('recurring', { title: '๐
Recurring Costs', isCollapsible: false });
recurringSection.addRow(row => {
row.addPriceDisplay('dailyCost', {
label: 'Daily Cost',
computedValue: () => {
const tripType = tripSection.dropdown('tripType')?.value() || 'one-time';
if (tripType === 'one-time') return 0;
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
const totalDistance = isRoundTrip ? distance * 2 : distance;
const efficiency = vehicleSection.decimal('fuelEfficiency')?.value() || (unitSystem === 'us' ? 28 : 8.5);
const fuelPrice = priceSection.decimal('fuelPrice')?.value() || (unitSystem === 'us' ? 3.50 : 1.65);
const conditions = vehicleSection.dropdown('drivingConditions')?.value() || 'mixed';
let adjustedEfficiency = efficiency;
if (unitSystem === 'us') {
if (conditions === 'city') adjustedEfficiency = efficiency * 0.85;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 1.05;
} else {
if (conditions === 'city') adjustedEfficiency = efficiency * 1.15;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 0.95;
}
let fuelNeeded: number;
if (unitSystem === 'us') {
fuelNeeded = totalDistance / adjustedEfficiency;
} else {
fuelNeeded = (totalDistance / 100) * adjustedEfficiency;
}
const tripCost = fuelNeeded * fuelPrice;
if (tripType === 'daily') return Math.round(tripCost * 100) / 100;
if (tripType === 'weekly') return Math.round((tripCost / 7) * 100) / 100;
return 0;
},
variant: 'default',
isVisible: () => tripSection.dropdown('tripType')?.value() !== 'one-time'
}, '1fr');
row.addPriceDisplay('weeklyCost', {
label: 'Weekly Cost',
computedValue: () => {
const tripType = tripSection.dropdown('tripType')?.value() || 'one-time';
if (tripType === 'one-time') return 0;
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
const totalDistance = isRoundTrip ? distance * 2 : distance;
const efficiency = vehicleSection.decimal('fuelEfficiency')?.value() || (unitSystem === 'us' ? 28 : 8.5);
const fuelPrice = priceSection.decimal('fuelPrice')?.value() || (unitSystem === 'us' ? 3.50 : 1.65);
const conditions = vehicleSection.dropdown('drivingConditions')?.value() || 'mixed';
let adjustedEfficiency = efficiency;
if (unitSystem === 'us') {
if (conditions === 'city') adjustedEfficiency = efficiency * 0.85;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 1.05;
} else {
if (conditions === 'city') adjustedEfficiency = efficiency * 1.15;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 0.95;
}
let fuelNeeded: number;
if (unitSystem === 'us') {
fuelNeeded = totalDistance / adjustedEfficiency;
} else {
fuelNeeded = (totalDistance / 100) * adjustedEfficiency;
}
const tripCost = fuelNeeded * fuelPrice;
if (tripType === 'daily') return Math.round(tripCost * 5 * 100) / 100; // 5 work days
if (tripType === 'weekly') return Math.round(tripCost * 100) / 100;
return 0;
},
variant: 'default',
isVisible: () => tripSection.dropdown('tripType')?.value() !== 'one-time'
}, '1fr');
row.addPriceDisplay('monthlyCost', {
label: 'Monthly Cost',
computedValue: () => {
const tripType = tripSection.dropdown('tripType')?.value() || 'one-time';
if (tripType === 'one-time') return 0;
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
const totalDistance = isRoundTrip ? distance * 2 : distance;
const efficiency = vehicleSection.decimal('fuelEfficiency')?.value() || (unitSystem === 'us' ? 28 : 8.5);
const fuelPrice = priceSection.decimal('fuelPrice')?.value() || (unitSystem === 'us' ? 3.50 : 1.65);
const conditions = vehicleSection.dropdown('drivingConditions')?.value() || 'mixed';
let adjustedEfficiency = efficiency;
if (unitSystem === 'us') {
if (conditions === 'city') adjustedEfficiency = efficiency * 0.85;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 1.05;
} else {
if (conditions === 'city') adjustedEfficiency = efficiency * 1.15;
else if (conditions === 'highway') adjustedEfficiency = efficiency * 0.95;
}
let fuelNeeded: number;
if (unitSystem === 'us') {
fuelNeeded = totalDistance / adjustedEfficiency;
} else {
fuelNeeded = (totalDistance / 100) * adjustedEfficiency;
}
const tripCost = fuelNeeded * fuelPrice;
if (tripType === 'daily') return Math.round(tripCost * 22 * 100) / 100; // ~22 work days
if (tripType === 'weekly') return Math.round(tripCost * 4.33 * 100) / 100;
return 0;
},
variant: 'success',
isVisible: () => tripSection.dropdown('tripType')?.value() !== 'one-time'
}, '1fr');
});
recurringSection.addRow(row => {
row.addTextPanel('recurringNote', {
computedValue: () => {
const tripType = tripSection.dropdown('tripType')?.value() || 'one-time';
if (tripType === 'one-time') {
return 'Select "Daily Commute" or "Weekly Trip" above to see recurring costs';
}
return tripType === 'daily' ? 'Based on 5 working days per week, 22 days per month' : 'Based on 4.33 weeks per month';
},
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'text-align': 'center' }
});
});
// Summary Section
const summarySection = form.addSubform('summary', {
title: '๐งพ Summary',
isCollapsible: false,
sticky: 'bottom'
});
summarySection.addRow(row => {
row.addTextPanel('summaryText', {
computedValue: () => {
const unitSystem = unitSection.radioButton('unitSystem')?.value() || 'us';
const distance = getTripDistance();
const isRoundTrip = tripSection.checkbox('roundTrip')?.value() || false;
const efficiency = vehicleSection.decimal('fuelEfficiency')?.value() || (unitSystem === 'us' ? 28 : 8.5);
const fuelPrice = priceSection.decimal('fuelPrice')?.value() || (unitSystem === 'us' ? 3.50 : 1.65);
const totalDistance = isRoundTrip ? distance * 2 : distance;
const distanceUnit = unitSystem === 'us' ? 'miles' : 'km';
const efficiencyUnit = unitSystem === 'us' ? 'MPG' : 'L/100km';
const volumeUnit = unitSystem === 'us' ? 'gallon' : 'liter';
// Show route info if addresses are used
let routeInfo = '';
if (tripSection.checkbox('useAddresses')?.value() === true) {
const originAddr = tripSection.address('originAddress')?.value();
const destAddr = tripSection.address('destAddress')?.value();
const originCity = originAddr?.formattedAddress?.split(',')[0] || 'Start';
const destCity = destAddr?.formattedAddress?.split(',')[0] || 'End';
routeInfo = `${originCity} โ ${destCity} | `;
}
return `${routeInfo}${totalDistance} ${distanceUnit}${isRoundTrip ? ' (round trip)' : ''} at ${efficiency} ${efficiencyUnit} @ $${(Number(fuelPrice) || 0).toFixed(2)}/${volumeUnit}`;
},
customStyles: { 'font-size': '0.95rem', 'font-weight': '500', 'text-align': 'center', 'color': '#1e293b' }
});
});
summarySection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'Estimates based on average conditions. Actual fuel costs may vary based on driving style, traffic, weather, and vehicle condition.',
customStyles: { 'font-size': '0.8rem', 'color': '#64748b', 'text-align': 'center' }
});
});
form.configureSubmitButton({
label: 'Save Trip'
});
}