export function mobileAppCalculator(form: FormTs) {
// Platform base costs
const platformCosts: Record<string, number> = {
'ios': 25000,
'android': 25000,
'cross-platform': 35000,
'both-native': 50000
};
// App complexity multipliers
const complexityMultipliers: Record<string, number> = {
'simple': 0.6, // Basic app, few screens
'moderate': 1.0, // Standard features
'complex': 1.6, // Advanced features
'enterprise': 2.5 // Full-featured enterprise
};
// Design level multipliers
const designMultipliers: Record<string, number> = {
'basic': 0.8,
'standard': 1.0,
'custom': 1.4,
'premium': 2.0
};
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Mobile App Development Calculator',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
form.addSpacer({ height: 20 });
// Platform Section
const platformSection = form.addSubform('platform', { title: '📱 Platform & Technology' });
platformSection.addRow(row => {
row.addRadioButton('platform', {
label: 'Target Platform',
options: [
{ id: 'ios', name: 'iOS Only (iPhone/iPad) - $25,000+' },
{ id: 'android', name: 'Android Only - $25,000+' },
{ id: 'cross-platform', name: 'Cross-Platform (React Native/Flutter) - $35,000+' },
{ id: 'both-native', name: 'Both Native Apps - $50,000+' }
],
defaultValue: 'cross-platform',
orientation: 'vertical',
isRequired: true
});
});
platformSection.addRow(row => {
row.addDropdown('framework', {
label: 'Technology Stack',
options: [
{ id: 'react-native', name: 'React Native' },
{ id: 'flutter', name: 'Flutter' },
{ id: 'swift', name: 'Swift (iOS Native)' },
{ id: 'kotlin', name: 'Kotlin (Android Native)' },
{ id: 'ionic', name: 'Ionic/Capacitor' }
],
defaultValue: 'react-native',
isVisible: () => {
const platform = platformSection.radioButton('platform')?.value();
return platform === 'cross-platform';
}
}, '1fr');
});
// App Complexity Section
const complexitySection = form.addSubform('complexity', { title: '⚙️ App Complexity' });
complexitySection.addRow(row => {
row.addRadioButton('appComplexity', {
label: 'Overall Complexity',
options: [
{ id: 'simple', name: 'Simple (-40%) - 5-10 screens, basic features, minimal backend' },
{ id: 'moderate', name: 'Moderate - 10-20 screens, user accounts, API integration' },
{ id: 'complex', name: 'Complex (+60%) - 20-40 screens, advanced features, real-time' },
{ id: 'enterprise', name: 'Enterprise (+150%) - 40+ screens, multiple user roles, complex logic' }
],
defaultValue: 'moderate',
orientation: 'vertical',
isRequired: true
});
});
complexitySection.addRow(row => {
row.addSlider('screenCount', {
label: 'Estimated Number of Screens',
min: 5,
max: 100,
step: 5,
defaultValue: 15,
showValue: true,
unit: 'screens'
}, '1fr');
});
// Design Section
const designSection = form.addSubform('design', { title: '🎨 UI/UX Design' });
designSection.addRow(row => {
row.addRadioButton('designLevel', {
label: 'Design Approach',
options: [
{ id: 'basic', name: 'Basic (-20%) - Standard components, minimal customization' },
{ id: 'standard', name: 'Standard - Custom design following platform guidelines' },
{ id: 'custom', name: 'Custom (+40%) - Unique branded experience' },
{ id: 'premium', name: 'Premium (+100%) - Award-worthy, animations, microinteractions' }
],
defaultValue: 'standard',
orientation: 'vertical'
});
});
designSection.addRow(row => {
row.addCheckbox('prototyping', {
label: 'Interactive Prototyping (+$2,000)',
defaultValue: true
}, '1fr');
row.addCheckbox('designSystem', {
label: 'Design System/Style Guide (+$3,000)',
defaultValue: false
}, '1fr');
});
// User Features Section
const userSection = form.addSubform('userFeatures', { title: '👤 User Features' });
userSection.addRow(row => {
row.addCheckbox('userAuth', {
label: 'User Registration/Login (+$2,000)',
defaultValue: true
}, '1fr');
row.addDropdown('authType', {
label: 'Authentication Type',
options: [
{ id: 'email', name: 'Email/Password Only' },
{ id: 'social', name: 'Social Login (+$500)' },
{ id: 'phone', name: 'Phone/SMS (+$800)' },
{ id: 'biometric', name: 'Biometric (+$1,000)' },
{ id: 'all', name: 'All Methods (+$2,000)' }
],
defaultValue: 'social',
isVisible: () => userSection.checkbox('userAuth')?.value() === true
}, '1fr');
});
userSection.addRow(row => {
row.addCheckbox('userProfiles', {
label: 'User Profiles (+$1,500)',
defaultValue: true
}, '1fr');
row.addCheckbox('settings', {
label: 'Settings & Preferences (+$800)',
defaultValue: true
}, '1fr');
});
userSection.addRow(row => {
row.addCheckbox('notifications', {
label: 'Push Notifications (+$1,500)',
defaultValue: true
}, '1fr');
row.addCheckbox('inAppMessaging', {
label: 'In-App Messaging/Chat (+$5,000)',
defaultValue: false
}, '1fr');
});
// Core Features Section
const coreSection = form.addSubform('coreFeatures', { title: '🔧 Core Features' });
coreSection.addRow(row => {
row.addCheckbox('search', {
label: 'Search Functionality (+$1,500)',
defaultValue: true
}, '1fr');
row.addCheckbox('filters', {
label: 'Advanced Filters (+$1,000)',
defaultValue: false
}, '1fr');
});
coreSection.addRow(row => {
row.addCheckbox('maps', {
label: 'Maps/Location Services (+$3,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('geofencing', {
label: 'Geofencing (+$2,000)',
defaultValue: false
}, '1fr');
});
coreSection.addRow(row => {
row.addCheckbox('camera', {
label: 'Camera/Photo Features (+$2,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('ar', {
label: 'Augmented Reality (+$10,000)',
defaultValue: false
}, '1fr');
});
coreSection.addRow(row => {
row.addCheckbox('calendar', {
label: 'Calendar/Scheduling (+$2,500)',
defaultValue: false
}, '1fr');
row.addCheckbox('booking', {
label: 'Booking/Reservations (+$4,000)',
defaultValue: false
}, '1fr');
});
// E-commerce Features Section
const ecomSection = form.addSubform('ecommerce', { title: '🛒 E-commerce Features' });
ecomSection.addRow(row => {
row.addCheckbox('productCatalog', {
label: 'Product Catalog (+$3,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('cart', {
label: 'Shopping Cart (+$2,000)',
defaultValue: false
}, '1fr');
});
ecomSection.addRow(row => {
row.addCheckbox('payments', {
label: 'Payment Processing (+$3,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('subscriptions', {
label: 'Subscription/IAP (+$4,000)',
defaultValue: false
}, '1fr');
});
ecomSection.addRow(row => {
row.addCheckbox('orderTracking', {
label: 'Order Tracking (+$2,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('wishlist', {
label: 'Wishlist/Favorites (+$1,000)',
defaultValue: false
}, '1fr');
});
// Social Features Section
const socialSection = form.addSubform('social', { title: '👥 Social Features' });
socialSection.addRow(row => {
row.addCheckbox('socialFeed', {
label: 'Social Feed/Timeline (+$5,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('following', {
label: 'Follow/Friend System (+$3,000)',
defaultValue: false
}, '1fr');
});
socialSection.addRow(row => {
row.addCheckbox('comments', {
label: 'Comments/Reviews (+$2,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('sharing', {
label: 'Social Sharing (+$1,000)',
defaultValue: true
}, '1fr');
});
socialSection.addRow(row => {
row.addCheckbox('contentCreation', {
label: 'User-Generated Content (+$4,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('moderation', {
label: 'Content Moderation (+$2,500)',
defaultValue: false
}, '1fr');
});
// Backend & Infrastructure Section
const backendSection = form.addSubform('backend', { title: '☁️ Backend & Infrastructure' });
backendSection.addRow(row => {
row.addRadioButton('backendType', {
label: 'Backend Solution',
options: [
{ id: 'baas', name: 'Backend-as-a-Service (Firebase, AWS Amplify) - Included' },
{ id: 'custom-simple', name: 'Custom Backend (Simple) +$8,000' },
{ id: 'custom-complex', name: 'Custom Backend (Complex) +$20,000' },
{ id: 'enterprise', name: 'Enterprise Backend +$40,000' }
],
defaultValue: 'baas',
orientation: 'vertical'
});
});
backendSection.addRow(row => {
row.addCheckbox('apiIntegration', {
label: 'Third-Party API Integration (+$1,500/API)',
defaultValue: false
}, '1fr');
row.addInteger('apiCount', {
label: 'Number of APIs',
min: 1,
max: 10,
defaultValue: 2,
isVisible: () => backendSection.checkbox('apiIntegration')?.value() === true
}, '1fr');
});
backendSection.addRow(row => {
row.addCheckbox('offlineMode', {
label: 'Offline Mode/Sync (+$4,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('realtime', {
label: 'Real-time Updates (+$3,000)',
defaultValue: false
}, '1fr');
});
// Admin & Analytics Section
const adminSection = form.addSubform('admin', { title: '📊 Admin & Analytics' });
adminSection.addRow(row => {
row.addCheckbox('adminPanel', {
label: 'Admin Dashboard/CMS (+$8,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('analytics', {
label: 'Analytics Integration (+$1,500)',
defaultValue: true
}, '1fr');
});
adminSection.addRow(row => {
row.addCheckbox('crashReporting', {
label: 'Crash Reporting (+$500)',
defaultValue: true
}, '1fr');
row.addCheckbox('abTesting', {
label: 'A/B Testing Setup (+$2,000)',
defaultValue: false
}, '1fr');
});
// Launch Services Section
const launchSection = form.addSubform('launch', { title: '🚀 Launch & Post-Launch' });
launchSection.addRow(row => {
row.addCheckbox('appStoreSetup', {
label: 'App Store Submission (+$500)',
defaultValue: true
}, '1fr');
row.addCheckbox('asoSetup', {
label: 'ASO (App Store Optimization) (+$1,500)',
defaultValue: false
}, '1fr');
});
launchSection.addRow(row => {
row.addCheckbox('betaTesting', {
label: 'Beta Testing Program (+$2,000)',
defaultValue: false
}, '1fr');
row.addCheckbox('documentation', {
label: 'Technical Documentation (+$1,500)',
defaultValue: false
}, '1fr');
});
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
// Price Summary Section
const summarySection = form.addSubform('summary', { title: '💰 Your Estimate', isCollapsible: false });
const getBasePrice = () => {
const platform = platformSection.radioButton('platform')?.value() || 'cross-platform';
const complexity = complexitySection.radioButton('appComplexity')?.value() || 'moderate';
const design = designSection.radioButton('designLevel')?.value() || 'standard';
const base = platformCosts[platform] || 35000;
const complexMult = complexityMultipliers[complexity] || 1;
const designMult = designMultipliers[design] || 1;
return base * complexMult * designMult;
};
summarySection.addRow(row => {
row.addPriceDisplay('basePrice', {
label: 'Base Development Cost',
computedValue: () => Math.round(getBasePrice()),
variant: 'default'
}, '1fr');
});
summarySection.addRow(row => {
row.addPriceDisplay('designCost', {
label: 'Design & Prototyping',
computedValue: () => {
let total = 0;
if (designSection.checkbox('prototyping')?.value()) total += 2000;
if (designSection.checkbox('designSystem')?.value()) total += 3000;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
row.addPriceDisplay('userFeaturesCost', {
label: 'User Features',
computedValue: () => {
let total = 0;
if (userSection.checkbox('userAuth')?.value()) {
total += 2000;
const authType = userSection.dropdown('authType')?.value() || 'email';
const authCosts: Record<string, number> = {
'email': 0, 'social': 500, 'phone': 800, 'biometric': 1000, 'all': 2000
};
total += authCosts[authType] || 0;
}
if (userSection.checkbox('userProfiles')?.value()) total += 1500;
if (userSection.checkbox('settings')?.value()) total += 800;
if (userSection.checkbox('notifications')?.value()) total += 1500;
if (userSection.checkbox('inAppMessaging')?.value()) total += 5000;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
});
summarySection.addRow(row => {
row.addPriceDisplay('coreFeaturesCost', {
label: 'Core Features',
computedValue: () => {
let total = 0;
if (coreSection.checkbox('search')?.value()) total += 1500;
if (coreSection.checkbox('filters')?.value()) total += 1000;
if (coreSection.checkbox('maps')?.value()) total += 3000;
if (coreSection.checkbox('geofencing')?.value()) total += 2000;
if (coreSection.checkbox('camera')?.value()) total += 2000;
if (coreSection.checkbox('ar')?.value()) total += 10000;
if (coreSection.checkbox('calendar')?.value()) total += 2500;
if (coreSection.checkbox('booking')?.value()) total += 4000;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
row.addPriceDisplay('ecomCost', {
label: 'E-commerce',
computedValue: () => {
let total = 0;
if (ecomSection.checkbox('productCatalog')?.value()) total += 3000;
if (ecomSection.checkbox('cart')?.value()) total += 2000;
if (ecomSection.checkbox('payments')?.value()) total += 3000;
if (ecomSection.checkbox('subscriptions')?.value()) total += 4000;
if (ecomSection.checkbox('orderTracking')?.value()) total += 2000;
if (ecomSection.checkbox('wishlist')?.value()) total += 1000;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
});
summarySection.addRow(row => {
row.addPriceDisplay('socialCost', {
label: 'Social Features',
computedValue: () => {
let total = 0;
if (socialSection.checkbox('socialFeed')?.value()) total += 5000;
if (socialSection.checkbox('following')?.value()) total += 3000;
if (socialSection.checkbox('comments')?.value()) total += 2000;
if (socialSection.checkbox('sharing')?.value()) total += 1000;
if (socialSection.checkbox('contentCreation')?.value()) total += 4000;
if (socialSection.checkbox('moderation')?.value()) total += 2500;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
row.addPriceDisplay('backendCost', {
label: 'Backend & Infrastructure',
computedValue: () => {
let total = 0;
const backendType = backendSection.radioButton('backendType')?.value() || 'baas';
const backendCosts: Record<string, number> = {
'baas': 0, 'custom-simple': 8000, 'custom-complex': 20000, 'enterprise': 40000
};
total += backendCosts[backendType] || 0;
if (backendSection.checkbox('apiIntegration')?.value()) {
const count = backendSection.integer('apiCount')?.value() || 2;
total += count * 1500;
}
if (backendSection.checkbox('offlineMode')?.value()) total += 4000;
if (backendSection.checkbox('realtime')?.value()) total += 3000;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
});
summarySection.addRow(row => {
row.addPriceDisplay('adminCost', {
label: 'Admin & Analytics',
computedValue: () => {
let total = 0;
if (adminSection.checkbox('adminPanel')?.value()) total += 8000;
if (adminSection.checkbox('analytics')?.value()) total += 1500;
if (adminSection.checkbox('crashReporting')?.value()) total += 500;
if (adminSection.checkbox('abTesting')?.value()) total += 2000;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
row.addPriceDisplay('launchCost', {
label: 'Launch Services',
computedValue: () => {
let total = 0;
if (launchSection.checkbox('appStoreSetup')?.value()) total += 500;
if (launchSection.checkbox('asoSetup')?.value()) total += 1500;
if (launchSection.checkbox('betaTesting')?.value()) total += 2000;
if (launchSection.checkbox('documentation')?.value()) total += 1500;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
});
summarySection.addSpacer({ showLine: true, lineStyle: 'solid', lineColor: '#e2e8f0' });
summarySection.addRow(row => {
row.addPriceDisplay('totalEstimate', {
label: 'Total Estimated Cost',
computedValue: () => {
let total = getBasePrice();
// Design
if (designSection.checkbox('prototyping')?.value()) total += 2000;
if (designSection.checkbox('designSystem')?.value()) total += 3000;
// User features
if (userSection.checkbox('userAuth')?.value()) {
total += 2000;
const authType = userSection.dropdown('authType')?.value() || 'email';
const authCosts: Record<string, number> = {
'email': 0, 'social': 500, 'phone': 800, 'biometric': 1000, 'all': 2000
};
total += authCosts[authType] || 0;
}
if (userSection.checkbox('userProfiles')?.value()) total += 1500;
if (userSection.checkbox('settings')?.value()) total += 800;
if (userSection.checkbox('notifications')?.value()) total += 1500;
if (userSection.checkbox('inAppMessaging')?.value()) total += 5000;
// Core features
if (coreSection.checkbox('search')?.value()) total += 1500;
if (coreSection.checkbox('filters')?.value()) total += 1000;
if (coreSection.checkbox('maps')?.value()) total += 3000;
if (coreSection.checkbox('geofencing')?.value()) total += 2000;
if (coreSection.checkbox('camera')?.value()) total += 2000;
if (coreSection.checkbox('ar')?.value()) total += 10000;
if (coreSection.checkbox('calendar')?.value()) total += 2500;
if (coreSection.checkbox('booking')?.value()) total += 4000;
// E-commerce
if (ecomSection.checkbox('productCatalog')?.value()) total += 3000;
if (ecomSection.checkbox('cart')?.value()) total += 2000;
if (ecomSection.checkbox('payments')?.value()) total += 3000;
if (ecomSection.checkbox('subscriptions')?.value()) total += 4000;
if (ecomSection.checkbox('orderTracking')?.value()) total += 2000;
if (ecomSection.checkbox('wishlist')?.value()) total += 1000;
// Social
if (socialSection.checkbox('socialFeed')?.value()) total += 5000;
if (socialSection.checkbox('following')?.value()) total += 3000;
if (socialSection.checkbox('comments')?.value()) total += 2000;
if (socialSection.checkbox('sharing')?.value()) total += 1000;
if (socialSection.checkbox('contentCreation')?.value()) total += 4000;
if (socialSection.checkbox('moderation')?.value()) total += 2500;
// Backend
const backendType = backendSection.radioButton('backendType')?.value() || 'baas';
const backendCosts: Record<string, number> = {
'baas': 0, 'custom-simple': 8000, 'custom-complex': 20000, 'enterprise': 40000
};
total += backendCosts[backendType] || 0;
if (backendSection.checkbox('apiIntegration')?.value()) {
const count = backendSection.integer('apiCount')?.value() || 2;
total += count * 1500;
}
if (backendSection.checkbox('offlineMode')?.value()) total += 4000;
if (backendSection.checkbox('realtime')?.value()) total += 3000;
// Admin
if (adminSection.checkbox('adminPanel')?.value()) total += 8000;
if (adminSection.checkbox('analytics')?.value()) total += 1500;
if (adminSection.checkbox('crashReporting')?.value()) total += 500;
if (adminSection.checkbox('abTesting')?.value()) total += 2000;
// Launch
if (launchSection.checkbox('appStoreSetup')?.value()) total += 500;
if (launchSection.checkbox('asoSetup')?.value()) total += 1500;
if (launchSection.checkbox('betaTesting')?.value()) total += 2000;
if (launchSection.checkbox('documentation')?.value()) total += 1500;
return Math.round(total);
},
variant: 'large'
});
});
summarySection.addRow(row => {
row.addTextPanel('timelineNote', {
computedValue: () => {
const complexity = complexitySection.radioButton('appComplexity')?.value() || 'moderate';
const timelines: Record<string, string> = {
'simple': 'Estimated timeline: 2-3 months',
'moderate': 'Estimated timeline: 3-5 months',
'complex': 'Estimated timeline: 5-8 months',
'enterprise': 'Estimated timeline: 8-12+ months'
};
return timelines[complexity] || '';
},
customStyles: { 'font-size': '0.9rem', 'color': '#059669' }
});
});
const finalSection = form.addSubform('final', {
title: '🧾 Summary',
isCollapsible: false,
sticky: 'bottom'
});
finalSection.addRow(row => {
row.addPriceDisplay('totalEstimate', {
label: 'Total Estimated Cost',
computedValue: () => {
let total = getBasePrice();
if (designSection.checkbox('prototyping')?.value()) total += 2000;
if (designSection.checkbox('designSystem')?.value()) total += 3000;
if (userSection.checkbox('userAuth')?.value()) {
total += 2000;
const authType = userSection.dropdown('authType')?.value() || 'email';
const authCosts: Record<string, number> = {
'email': 0, 'social': 500, 'phone': 800, 'biometric': 1000, 'all': 2000
};
total += authCosts[authType] || 0;
}
if (userSection.checkbox('userProfiles')?.value()) total += 1500;
if (userSection.checkbox('settings')?.value()) total += 800;
if (userSection.checkbox('notifications')?.value()) total += 1500;
if (userSection.checkbox('inAppMessaging')?.value()) total += 5000;
if (coreSection.checkbox('search')?.value()) total += 1500;
if (coreSection.checkbox('filters')?.value()) total += 1000;
if (coreSection.checkbox('maps')?.value()) total += 3000;
if (coreSection.checkbox('geofencing')?.value()) total += 2000;
if (coreSection.checkbox('camera')?.value()) total += 2000;
if (coreSection.checkbox('ar')?.value()) total += 10000;
if (coreSection.checkbox('calendar')?.value()) total += 2500;
if (coreSection.checkbox('booking')?.value()) total += 4000;
if (ecomSection.checkbox('productCatalog')?.value()) total += 3000;
if (ecomSection.checkbox('cart')?.value()) total += 2000;
if (ecomSection.checkbox('payments')?.value()) total += 3000;
if (ecomSection.checkbox('subscriptions')?.value()) total += 4000;
if (ecomSection.checkbox('orderTracking')?.value()) total += 2000;
if (ecomSection.checkbox('wishlist')?.value()) total += 1000;
if (socialSection.checkbox('socialFeed')?.value()) total += 5000;
if (socialSection.checkbox('following')?.value()) total += 3000;
if (socialSection.checkbox('comments')?.value()) total += 2000;
if (socialSection.checkbox('sharing')?.value()) total += 1000;
if (socialSection.checkbox('contentCreation')?.value()) total += 4000;
if (socialSection.checkbox('moderation')?.value()) total += 2500;
const backendType = backendSection.radioButton('backendType')?.value() || 'baas';
const backendCosts: Record<string, number> = {
'baas': 0, 'custom-simple': 8000, 'custom-complex': 20000, 'enterprise': 40000
};
total += backendCosts[backendType] || 0;
if (backendSection.checkbox('apiIntegration')?.value()) {
const count = backendSection.integer('apiCount')?.value() || 2;
total += count * 1500;
}
if (backendSection.checkbox('offlineMode')?.value()) total += 4000;
if (backendSection.checkbox('realtime')?.value()) total += 3000;
if (adminSection.checkbox('adminPanel')?.value()) total += 8000;
if (adminSection.checkbox('analytics')?.value()) total += 1500;
if (adminSection.checkbox('crashReporting')?.value()) total += 500;
if (adminSection.checkbox('abTesting')?.value()) total += 2000;
if (launchSection.checkbox('appStoreSetup')?.value()) total += 500;
if (launchSection.checkbox('asoSetup')?.value()) total += 1500;
if (launchSection.checkbox('betaTesting')?.value()) total += 2000;
if (launchSection.checkbox('documentation')?.value()) total += 1500;
return Math.round(total);
},
variant: 'large'
});
});
finalSection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'Final pricing after requirements analysis.',
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'font-style': 'italic' }
});
});
form.configureSubmitButton({
label: 'Request Proposal'
});
}