@@ -45,7 +45,7 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
4545 model : {
4646 tiers : {
4747 Registered : {
48- overview : "Registered partners are typically transactional resellers or LARs who help us fulfill orders or introduce Recast into unique opportunities. These partners don’t require a formal partnership agreement — we simply transact through them when the customer requests it . They may also bring Recast into a deal where we do the selling and delivery, earning up to 5% rebate at Recast’s discretion.\nThe only requirement is that the partner is set up in Salesforce with a valid bill-to address and primary finance contact. On the order form, the bill-to is the partner, and the ship-to is the customer.\nThese relationships are lightweight and transactional — low overhead, but still important when we need a resale mechanism or local presence ." ,
48+ overview : "Registered partners are either License Added Resellers ( LARs) or referral partners who help Recast reach more customers.\n\n* LARs handle the transaction — they place the order and act as the bill-to on behalf of the customer . They earn up to a 5% margin on those deals.\n\n* Referral partners introduce Recast to a customer or opportunity. If we close the deal directly, they can receive up to a 5% rebate at Recast’s discretion.\n\nThese partnerships are lightweight and transactional — no formal agreement is required. We simply set up the partner in Salesforce with valid billing information and process orders as needed.\nThey’re a low-overhead way for Recast to fulfill deals or expand into new opportunities through trusted local or resale partners ." ,
4949 requirements : [
5050 "Create Salesforce account with bill-to and finance contact" ,
5151 "No formal agreement required" ,
@@ -237,19 +237,19 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
237237 html += renderDropdown ( ) ;
238238 html += renderOverview ( data . overview ) ;
239239 html += '</div>' ;
240- html += '<div class="grid gap-4" aria-live="polite ">' ;
241- html += renderRequirements ( data . requirements , data . isPremier ) ;
242- html += renderBenefits ( data . benefits ) ;
240+ html += '<div class="space-y-4 ">' ;
241+ html += renderRequirementsCard ( data . requirements , data . isPremier ) ;
242+ html += renderBenefitsCard ( data . benefits ) ;
243243 if ( data . isStandard ) {
244- html += renderMargins ( ) ;
244+ html += renderMarginsCard ( ) ;
245245 } else {
246- html += renderDetails ( data . specific ) ;
246+ html += renderDetailsCard ( data . specific ) ;
247247 }
248- html += '</div>' ;
249- html += renderROE ( ) ;
248+ html += renderROECard ( ) ;
250249 if ( STATE . partnerType !== "Registered" ) {
251- html += renderOnboarding ( ) ;
250+ html += renderOnboardingCard ( ) ;
252251 }
252+ html += '</div>' ;
253253 html += '<footer class="pt-2 text-xs text-[#4A5568]">Preview purposes only. Program terms subject to agreement.</footer>' ;
254254 html += "</div>" ;
255255 document . getElementById ( "app" ) . innerHTML = html ;
@@ -304,7 +304,8 @@ <h1 class="mt-4 text-3xl font-semibold tracking-tight sm:text-4xl">
304304 function renderDropdown ( ) {
305305 let options = '' ;
306306 PARTNER_TYPES . forEach ( ( t ) => {
307- options += `<option value="${ t } " ${ STATE . partnerType === t ? 'selected' : '' } >${ t } </option>` ;
307+ const display = t === "Registered" ? "Registered (LAR/Referral)" : t ;
308+ options += `<option value="${ t } " ${ STATE . partnerType === t ? 'selected' : '' } >${ display } </option>` ;
308309 } ) ;
309310 return `
310311 <div class="rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md">
@@ -323,7 +324,7 @@ <h3 class="text-lg font-semibold">Overview</h3>
323324 </div>
324325 ` ;
325326 }
326- function renderRequirements ( reqs , isPremier ) {
327+ function renderRequirementsCard ( reqs , isPremier ) {
327328 let listHtml = "" ;
328329 reqs . forEach ( ( r ) => {
329330 listHtml += `
@@ -351,14 +352,16 @@ <h3 class="text-lg font-semibold">Overview</h3>
351352 }
352353 }
353354 return `
354- <div class="rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md">
355- <h3 class="text-lg font-semibold">Requirements</h3>
356- <ul class="mt-3 grid gap-2 sm:grid-cols-2">${ listHtml } </ul>
357- ${ businessPlanHtml }
358- </div>
355+ <details class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
356+ <summary class="cursor-pointer p-5 font-semibold text-lg hover:bg-[#F7F9FB] transition-colors">Requirements</summary>
357+ <div class="p-5 pt-0">
358+ <ul class="mt-3 grid gap-2 sm:grid-cols-2">${ listHtml } </ul>
359+ ${ businessPlanHtml }
360+ </div>
361+ </details>
359362 ` ;
360363 }
361- function renderBenefits ( bens ) {
364+ function renderBenefitsCard ( bens ) {
362365 let listHtml = "" ;
363366 bens . forEach ( ( b ) => {
364367 listHtml += `
@@ -369,13 +372,15 @@ <h3 class="text-lg font-semibold">Requirements</h3>
369372 ` ;
370373 } ) ;
371374 return `
372- <div class="rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md">
373- <h3 class="text-lg font-semibold">Benefits</h3>
374- <ul class="mt-3 grid gap-2 sm:grid-cols-2">${ listHtml } </ul>
375- </div>
375+ <details class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
376+ <summary class="cursor-pointer p-5 font-semibold text-lg hover:bg-[#F7F9FB] transition-colors">Benefits</summary>
377+ <div class="p-5 pt-0">
378+ <ul class="mt-3 grid gap-2 sm:grid-cols-2">${ listHtml } </ul>
379+ </div>
380+ </details>
376381 ` ;
377382 }
378- function renderMargins ( ) {
383+ function renderMarginsCard ( ) {
379384 const disabled = STATE . partnerType === "Registered" ;
380385 const universe = STATE . model . margins [ STATE . commitment ] [ STATE . dealType ] ;
381386 const key = STATE . partnerType === "Registered" ? "Registered" : "Preferred|Premier" ;
@@ -411,40 +416,42 @@ <h3 class="text-lg font-semibold">Benefits</h3>
411416 ` ;
412417 }
413418 return `
414- <div class="rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md">
415- <div class="flex items-start justify-between flex-col sm:flex-row gap-4">
416- <h3 class="text-lg font-semibold">Margins</h3>
417- <div class="flex flex-wrap items-center gap-3">
418- <label class="flex items-center gap-2 text-sm ${ disabled ? "opacity-60" : "" } " title="For your first 3 net-new deals, we co-sell end-to-end and you keep full margin.">
419- <input type="checkbox" id="newPartner" class="h-4 w-4 accent-[#0070F3]" ${ disabled ? "disabled" : "" } ${ STATE . newPartner ? "checked" : "" } />
420- <span>New partner boost (first 3 net-new deals)</span>
421- </label>
422- <select id="commitment" class="rounded-xl border border-[#E2E8F0] bg-white px-3 py-1 text-sm focus:ring-2 focus:ring-[#0070F3]">
423- <option ${ STATE . commitment === "Annual" ? "selected" : "" } >Annual</option>
424- <option ${ STATE . commitment === "Monthly" ? "selected" : "" } >Monthly</option>
425- </select>
426- <select id="dealType" class="rounded-xl border border-[#E2E8F0] bg-white px-3 py-1 text-sm focus:ring-2 focus:ring-[#0070F3]">
427- <option ${ STATE . dealType === "Net New" ? "selected" : "" } >Net New</option>
428- <option ${ STATE . dealType === "Renewal" ? "selected" : "" } >Renewal</option>
429- </select>
419+ <details class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
420+ <summary class="cursor-pointer p-5 font-semibold text-lg hover:bg-[#F7F9FB] transition-colors">Margins</summary>
421+ <div class="p-5 pt-0">
422+ <div class="flex items-start justify-between flex-col sm:flex-row gap-4">
423+ <div class="flex flex-wrap items-center gap-3">
424+ <label class="flex items-center gap-2 text-sm ${ disabled ? "opacity-60" : "" } " title="For your first 3 net-new deals, we co-sell end-to-end and you keep full margin.">
425+ <input type="checkbox" id="newPartner" class="h-4 w-4 accent-[#0070F3]" ${ disabled ? "disabled" : "" } ${ STATE . newPartner ? "checked" : "" } />
426+ <span>New partner boost (first 3 net-new deals)</span>
427+ </label>
428+ <select id="commitment" class="rounded-xl border border-[#E2E8F0] bg-white px-3 py-1 text-sm focus:ring-2 focus:ring-[#0070F3]">
429+ <option ${ STATE . commitment === "Annual" ? "selected" : "" } >Annual</option>
430+ <option ${ STATE . commitment === "Monthly" ? "selected" : "" } >Monthly</option>
431+ </select>
432+ <select id="dealType" class="rounded-xl border border-[#E2E8F0] bg-white px-3 py-1 text-sm focus:ring-2 focus:ring-[#0070F3]">
433+ <option ${ STATE . dealType === "Net New" ? "selected" : "" } >Net New</option>
434+ <option ${ STATE . dealType === "Renewal" ? "selected" : "" } >Renewal</option>
435+ </select>
436+ </div>
430437 </div>
438+ <div class="mt-3">${ contentHtml } </div>
431439 </div>
432- <div class="mt-3">${ contentHtml } </div>
433- </div>
440+ </details>
434441 ` ;
435442 }
436- function renderDetails ( specific ) {
443+ function renderDetailsCard ( specific ) {
437444 let tableHtml = '<table class="min-w-full divide-y divide-[#E2E8F0]"><thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Partner Type</th><th class="px-6 py-3 text-left text-sm font-semibold">Tier Eligibility</th><th class="px-6 py-3 text-left text-sm font-semibold">Margin</th><th class="px-6 py-3 text-left text-sm font-semibold">Deal Registration</th><th class="px-6 py-3 text-left text-sm font-semibold">MDF Access</th><th class="px-6 py-3 text-left text-sm font-semibold">Enablement</th></tr></thead><tbody class="divide-y divide-[#E2E8F0]">' ;
438445 tableHtml += `<tr><td class="px-6 py-4 text-sm font-medium">${ specific . partnerType } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ specific . tierEligibility } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ specific . margin } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ specific . dealRegistration } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ specific . mdfAccess } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ specific . enablement } </td></tr>` ;
439446 tableHtml += '</tbody></table>' ;
440447 return `
441- <div class="rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md overflow-hidden">
442- <h3 class="text-lg font-semibold mb-4 ">Details</h3 >
443- <div class="overflow-x-auto">${ tableHtml } </div>
444- </div >
448+ <details class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
449+ <summary class="cursor-pointer p-5 font-semibold text-lg hover:bg-[#F7F9FB] transition-colors ">Details</summary >
450+ <div class="p-5 pt-0 overflow-x-auto">${ tableHtml } </div>
451+ </details >
445452 ` ;
446453 }
447- function renderROE ( ) {
454+ function renderROECard ( ) {
448455 let principlesTable = '<table class="min-w-full divide-y divide-[#E2E8F0]"><thead><tr><th class="px-6 py-3 text-left text-sm font-semibold">Principle</th><th class="px-6 py-3 text-left text-sm font-semibold">Description</th><th class="px-6 py-3 text-left text-sm font-semibold">Intent</th></tr></thead><tbody class="divide-y divide-[#E2E8F0]">' ;
449456 STATE . model . roe . principles . forEach ( ( p ) => {
450457 principlesTable += `<tr><td class="px-6 py-4 text-sm font-medium">${ p . principle } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ p . description } </td><td class="px-6 py-4 text-sm text-[#4A5568]">${ p . intent } </td></tr>` ;
@@ -469,27 +476,30 @@ <h3 class="text-lg font-semibold mb-4">Details</h3>
469476 } ) ;
470477 summaryTable += '</tbody></table>' ;
471478 return `
472- <div class="mt-8 space-y-8">
473- <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
474- <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Rules of Engagement (ROE)</h3>
475- <div class="overflow-x-auto">${ principlesTable } </div>
476- </div>
477- <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
478- <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Margin Bands & Definitions</h3>
479- <div class="overflow-x-auto">${ bandsTable } </div>
480- </div>
481- <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
482- <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Partner Margin Governance</h3>
483- <div class="overflow-x-auto">${ governanceTable } </div>
484- </div>
485- <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
486- <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Example Summary Table</h3>
487- <div class="overflow-x-auto">${ summaryTable } </div>
479+ <details class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
480+ <summary class="cursor-pointer p-5 font-semibold text-lg hover:bg-[#F7F9FB] transition-colors">Rules of Engagement</summary>
481+ <div class="p-5 pt-0 space-y-8">
482+ <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
483+ <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Rules of Engagement (ROE)</h3>
484+ <div class="overflow-x-auto">${ principlesTable } </div>
485+ </div>
486+ <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
487+ <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Margin Bands & Definitions</h3>
488+ <div class="overflow-x-auto">${ bandsTable } </div>
489+ </div>
490+ <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
491+ <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Partner Margin Governance</h3>
492+ <div class="overflow-x-auto">${ governanceTable } </div>
493+ </div>
494+ <div class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
495+ <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Example Summary Table</h3>
496+ <div class="overflow-x-auto">${ summaryTable } </div>
497+ </div>
488498 </div>
489- </div >
499+ </details >
490500 ` ;
491501 }
492- function renderOnboarding ( ) {
502+ function renderOnboardingCard ( ) {
493503 const steps = STATE . model . onboarding . steps ;
494504 let buttonsHtml = "" ;
495505 steps . forEach ( ( s , i ) => {
@@ -516,13 +526,15 @@ <h3 class="text-lg font-semibold p-5 border-b border-[#E2E8F0]">Example Summary
516526 ` ;
517527 } ) ;
518528 return `
519- <div class="mt-8 rounded-2xl border border-[#E2E8F0] bg-white p-5 shadow-md">
520- <div class="flex items-start justify-between flex-col sm:flex-row gap-4">
521- <h3 class="text-lg font-semibold">Onboarding Requirements</h3>
522- <div class="flex gap-2">${ buttonsHtml } </div>
529+ <details class="rounded-2xl border border-[#E2E8F0] bg-white shadow-md overflow-hidden">
530+ <summary class="cursor-pointer p-5 font-semibold text-lg hover:bg-[#F7F9FB] transition-colors">Onboarding Requirements</summary>
531+ <div class="p-5 pt-0">
532+ <div class="flex items-start justify-between flex-col sm:flex-row gap-4">
533+ <div class="flex gap-2">${ buttonsHtml } </div>
534+ </div>
535+ <ul class="mt-3 grid gap-2 sm:grid-cols-2">${ listHtml } </ul>
523536 </div>
524- <ul class="mt-3 grid gap-2 sm:grid-cols-2">${ listHtml } </ul>
525- </div>
537+ </details>
526538 ` ;
527539 }
528540 function renderBusinessPlan ( ) {
0 commit comments