1import{j as t}from"./index-CRQcHE7J.js";const l=e=>e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),a=e=>Math.round(e).toLocaleString("en-GB");function h(e){const o=e.currency?e.currency==="USD"?"$":"£":e.rail==="shopify"?"$":"£",r=l(e.companyName),s=e.level==="reached",n=e.rail==="shopify",p=s?n?`${e.companyName}: your Morvo overage ceiling has been reached`:`${e.companyName}: your Morvo overage is adding up this cycle`:n?`${e.companyName}: you're close to your Morvo overage ceiling`:`${e.companyName}: your Morvo overage is building this cycle`,i=s?n?"You've reached your overage ceiling":"Your overage is adding up":n?"You're close to your overage ceiling":"Your overage is building this cycle",c=n?s?"We would never stop your service over a billing ceiling, so Morvo carries on answering your shoppers exactly as it is. What the ceiling does mean is that no further charges can be added to this billing period. Moving to a plan that fits your usage is the tidy way to put it right, and it works out cheaper than paying overage.":"The ceiling is there to protect you from an unexpectedly large bill, and we would never stop your service if you reach it. Morvo keeps answering your shoppers either way. What it does mean is that no further charges can be added to this period, so it is worth moving to a plan that fits before you get there.":s?"Nothing is switched off and nothing is at risk. This is just a heads-up that on your current plan the overage on your next bill is meaningful, and a larger plan would cost you less.":"Nothing is switched off. At the rate you're going, the overage on your next bill will be a fair chunk on top of your plan, and a larger plan would work out cheaper.",d=n&&e.ceiling?`<tr><td style="padding: 6px 0; color: #71717a; font-size: 14px;">Your ceiling</td> 2 <td style="padding: 6px 0; text-align: right; font-size: 14px; font-weight: 600;">${o}${a(e.ceiling)}</td></tr>`:"",g=` 3<!DOCTYPE html> 4<html> 5<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head> 6<body style="margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f5;"> 7 <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background-color: #f4f4f5;"> 8 <tr><td align="center" style="padding: 40px 20px;"> 9 <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="max-width: 600px; background-color: #ffffff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1);"> 10 <tr><td style="background: linear-gradient(135deg, #7c3aed 0%, #a855f7 100%); padding: 32px 40px; text-align: center;"> 11 <img src="https://morvo.co.uk/morvo-logo.png" alt="Morvo" height="40" style="height: 40px;"> 12 </td></tr> 13 <tr><td style="padding: 40px;"> 14 <h1 style="margin: 0 0 16px; font-size: 26px; font-weight: 700; color: #18181b;">${i}</h1> 15 <p style="margin: 0 0 16px; font-size: 16px; line-height: 1.6; color: #52525b;"> 16 ${r} has used <strong>${a(e.used)}</strong> conversations this cycle, against a plan of 17 ${a(e.planConversations)}. ${e.daysLeftInCycle>0?`There ${e.daysLeftInCycle===1?"is":"are"} ${e.daysLeftInCycle} day${e.daysLeftInCycle===1?"":"s"} still to go.`:""} 18 </p> 19 20 <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="border: 1px solid #eee; border-radius: 10px; padding: 16px 20px; margin: 0 0 20px;"> 21 <tr><td style="padding: 6px 0; color: #71717a; font-size: 14px;">Overage so far</td> 22 <td style="padding: 6px 0; text-align: right; font-size: 14px; font-weight: 600; color: #b45309;">${o}${a(e.overageSoFar)}</td></tr> 23 ${d} 24 </table> 25 26 <p style="margin: 0 0 20px; font-size: 16px; line-height: 1.6; color: #52525b;">${c}</p> 27 28 <div style="background: #faf5ff; border-left: 4px solid #7c3aed; border-radius: 6px; padding: 16px 18px; margin: 0 0 24px;"> 29 <p style="margin: 0 0 4px; font-size: 16px; color: #18181b;"> 30 <strong>We'd suggest ${a(e.suggestedConversations)} conversations a month</strong> 31 </p> 32 <p style="margin: 0; font-size: 15px; line-height: 1.5; color: #52525b;"> 33 That covers what you're actually using, for ${o}${a(e.suggestedPrice)} a month. 34 </p> 35 </div> 36 37 <table role="presentation" cellspacing="0" cellpadding="0" style="margin: 0 0 24px;"><tr> 38 <td style="border-radius: 8px; background: linear-gradient(135deg, #7c3aed 0%, #a855f7 100%);"> 39 <a href="${e.actionUrl}" style="display: inline-block; padding: 14px 28px; font-size: 16px; font-weight: 600; color: #ffffff; text-decoration: none;"> 40 ${n?"Change your plan in Shopify":"Adjust your plan"} 41 </a> 42 </td></tr></table> 43 44 <p style="margin: 0; font-size: 13px; color: #a1a1aa;"> 45 Not sure what to pick? Just reply to this email and we'll look at your usage with you. 46 </p> 47 </td></tr> 48 <tr><td style="padding: 0 40px 28px; text-align: center;"> 49 <p style="margin: 0; font-size: 12px; color: #a1a1aa;">Morvo · [email protected]</p> 50 </td></tr> 51 </table> 52 </td></tr> 53 </table> 54</body> 55</html>`;return{subject:p,html:g}}function u(e){const o=e.currency?e.currency==="USD"?"$":"£":e.rail==="shopify"?"$":"£";l(e.companyName);const r=e.direction==="up",s=r?`${e.companyName}: we've moved you to a plan that fits your usage`:`${e.companyName}: we've moved you to a smaller, cheaper plan`,i=` 56<!DOCTYPE html> 57<html> 58<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head> 59<body style="margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f5;"> 60 <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="background-color: #f4f4f5;"> 61 <tr><td align="center" style="padding: 40px 20px;"> 62 <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="max-width: 600px; background-color: #ffffff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1);"> 63 <tr><td style="background: linear-gradient(135deg, #7c3aed 0%, #a855f7 100%); padding: 32px 40px; text-align: center;"> 64 <img src="https://morvo.co.uk/morvo-logo.png" alt="Morvo" height="40" style="height: 40px;"> 65 </td></tr> 66 <tr><td style="padding: 40px;"> 67 <h1 style="margin: 0 0 16px; font-size: 26px; font-weight: 700; color: #18181b;">${r?"Your plan has grown with you":"Your plan just got cheaper"}</h1> 68 <p style="margin: 0 0 20px; font-size: 16px; line-height: 1.6; color: #52525b;">${r?"Your shoppers have used more than your plan for two billing cycles running, which means paying overage on top every month. Moving you up to a plan that covers your real usage works out cheaper than staying put.":"You've used well under your plan for two billing cycles running, so we've moved you down to one that fits. Same Morvo, smaller bill. If usage grows again, overage has you covered and we'll right-size you back up."}</p> 69 70 <table role="presentation" width="100%" cellspacing="0" cellpadding="0" style="border: 1px solid #eee; border-radius: 10px; margin: 0 0 20px;"> 71 <tr> 72 <td style="padding: 16px 20px; width: 50%; border-right: 1px solid #eee;"> 73 <p style="margin: 0 0 2px; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; color: #a1a1aa;">Was</p> 74 <p style="margin: 0; font-size: 18px; font-weight: 600; color: #71717a;">${a(e.oldConversations)} conversations</p> 75 <p style="margin: 2px 0 0; font-size: 14px; color: #a1a1aa;">${o}${a(e.oldPrice)}/month</p> 76 </td> 77 <td style="padding: 16px 20px; width: 50%;"> 78 <p style="margin: 0 0 2px; font-size: 12px; text-transform: uppercase; letter-spacing: 1px; color: #7c3aed;">From ${l(e.effectiveLabel)}</p> 79 <p style="margin: 0; font-size: 18px; font-weight: 700; color: #18181b;">${a(e.newConversations)} conversations</p> 80 <p style="margin: 2px 0 0; font-size: 14px; color: #52525b;">${o}${a(e.newPrice)}/month</p> 81 </td> 82 </tr> 83 </table> 84 85 <p style="margin: 0 0 20px; font-size: 16px; line-height: 1.6; color: #52525b;"> 86 Not right for you? You can ${e.rail==="shopify"?"change your plan in the Morvo app in your Shopify admin":"adjust your plan from your Morvo dashboard"} at any time, or just reply to this email. 87 </p> 88 89 <table role="presentation" cellspacing="0" cellpadding="0" style="margin: 0 0 24px;"><tr> 90 <td style="border-radius: 8px; background: linear-gradient(135deg, #7c3aed 0%, #a855f7 100%);"> 91 <a href="${e.actionUrl}" style="display: inline-block; padding: 14px 28px; font-size: 16px; font-weight: 600; color: #ffffff; text-decoration: none;"> 92 ${e.rail==="shopify"?"Review your plan in Shopify":"Review your plan"} 93 </a> 94 </td></tr></table> 95 </td></tr> 96 <tr><td style="padding: 0 40px 28px; text-align: center;"> 97 <p style="margin: 0; font-size: 12px; color: #a1a1aa;">Morvo · [email protected]</p> 98 </td></tr> 99 </table> 100 </td></tr> 101 </table> 102</body> 103</html>`;return{subject:s,html:i}}const f=[{title:"Shopify · approaching (80%)",note:"$690 of the $800 approved ceiling.",input:{rail:"shopify",level:"approaching",companyName:"Sugar Riot",planConversations:2e3,used:3150,overageSoFar:690,ceiling:800,suggestedConversations:4500,suggestedPrice:990,actionUrl:"https://admin.shopify.com/store/sugar-riot/apps",daysLeftInCycle:9}},{title:"Shopify · reached (100%)",note:"Ceiling hit. Morvo keeps serving; we can't bill further this period.",input:{rail:"shopify",level:"reached",companyName:"Sugar Riot",planConversations:2e3,used:3400,overageSoFar:800,ceiling:800,suggestedConversations:4500,suggestedPrice:990,actionUrl:"https://admin.shopify.com/store/sugar-riot/apps",daysLeftInCycle:6}}
103,{title:"Self-serve · building",note:"No hard ceiling on this rail, so the trigger is the bill running away.",input:{rail:"self-serve",level:"approaching",companyName:"Northfield Cycles",planConversations:500,used:2416,overageSoFar:1e3,suggestedConversations:3500,suggestedPrice:700,actionUrl:"https://morvo.co.uk/account",daysLeftInCycle:9}},{title:"Self-serve · adding up",note:"Later in the cycle, overage now well past the plan price.",input:{rail:"self-serve",level:"reached",companyName:"Northfield Cycles",planConversations:500,used:3300,overageSoFar:1500,suggestedConversations:3500,suggestedPrice:700,actionUrl:"https://morvo.co.uk/account",daysLeftInCycle:3}}],y=[{title:"Plan-flex · moved UP (self-serve)",note:"After 2 consecutive over-plan cycles. Terms 8.5's advance notice.",input:{rail:"self-serve",direction:"up",companyName:"Northfield Cycles",oldConversations:500,newConversations:2500,oldPrice:150,newPrice:550,effectiveLabel:"12 August 2026",actionUrl:"https://morvo.co.uk/account"}},{title:"Plan-flex · moved DOWN (self-serve)",note:"After 2 consecutive cycles under 60% of plan.",input:{rail:"self-serve",direction:"down",companyName:"Northfield Cycles",oldConversations:5e3,newConversations:2e3,oldPrice:1100,newPrice:440,effectiveLabel:"12 August 2026",actionUrl:"https://morvo.co.uk/account"}}],x=()=>t.jsxs("div",{className:"min-h-screen bg-background p-6",children:[t.jsx("h1",{className:"mb-1 text-2xl font-bold",children:"Usage ceiling alerts"}),t.jsx("p",{className:"mb-6 text-sm text-muted-foreground",children:"Sent at 80% and 100%. Same shape both rails; the consequence paragraph differs because the rails differ."}),t.jsxs("div",{className:"flex flex-wrap gap-8",children:[f.map(e=>{const{subject:o,html:r}=h(e.input);return t.jsxs("div",{className:"min-w-[380px] max-w-[640px] flex-1",children:[t.jsx("h2",{className:"text-lg font-bold",children:e.title}),t.jsx("p",{className:"mb-1 text-sm text-muted-foreground",children:e.note}),t.jsxs("p",{className:"mb-2 text-xs",children:[t.jsx("span",{className:"text-muted-foreground",children:"Subject: "}),t.jsx("span",{className:"font-medium",children:o})]}),t.jsx("iframe",{title:e.title,srcDoc:r,className:"h-[760px] w-full rounded-lg border"})]},e.title)}),y.map(e=>{const{subject:o,html:r}=u(e.input);return t.jsxs("div",{className:"min-w-[380px] max-w-[640px] flex-1",children:[t.jsx("h2",{className:"text-lg font-bold",children:e.title}),t.jsx("p",{className:"mb-1 text-sm text-muted-foreground",children:e.note}),t.jsxs("p",{className:"mb-2 text-xs",children:[t.jsx("span",{className:"text-muted-foreground",children:"Subject: "}),t.jsx("span",{className:"font-medium",children:o})]}),t.jsx("iframe",{title:e.title,srcDoc:r,className:"h-[760px] w-full rounded-lg border"})]},e.title)})]})]});export{x 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.