PageSourceSearch

https://noevo.io/assets/PricingPage-t7eKrH23.js

js noevo.io collected 2026-10-07 17:41:24 UTC 32,317 bytes, 2 lines download raw bytes

1import{c3 as Te,bj as d,r as C,j as t,bL as De,s as oe,$ as se,a0 as ie,a1 as Q,a2 as V,c4 as ne,c5 as _e,bp as Ue,a3 as We,K as M,a9 as re,B as T,aC as Fe,I as Le,N as Ye,L as $e,G as Me,z as qe,x as me,c6 as te}from"./admin-B3bIzeqg.js";import{S as A}from"./index-Bma_Yyjt.js";import{getStripe as Be,getStripeEnvironment as be,tierPriceId as ze,arePaidPlansAvailable as Ke}from"./stripe-GHvzO4jk.js";import{u as He}from"./useSubscription-kZt5pckz.js";import{f as Je,p as Qe}from"./tierPointsQuota-DQag1Jwt.js";import{a as K}from"./tierLimits-jR_x3NRf.js";import{P as Ve}from"./PageMeta-NYwIGAIq.js";import"./counselor-CDRYau9G.js";var Ce={exports:{}},Ge="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",Xe=Ge,Ze=Xe;function je(){}function Se(){}Se.resetWarningCache=je;var et=function(){function n(a,i,o,l,u,v){if(v!==Ze){var c=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name="Invariant Violation",c}}n.isRequired=n;function e(){return n}var r={array:n,bigint:n,bool:n,func:n,number:n,object:n,string:n,symbol:n,any:n,arrayOf:e,element:n,elementType:n,instanceOf:e,node:n,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:Se,resetWarningCache:je};return r.PropTypes=r,r};Ce.exports=et();var tt=Ce.exports;const x=Te(tt);function he(n,e){var r=Object.keys(n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(n);e&&(a=a.filter(function(i){return Object.getOwnPropertyDescriptor(n,i).enumerable})),r.push.apply(r,a)}return r}function fe(n){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=null?arguments[e]:{};e%2?he(Object(r),!0).forEach(function(a){ke(n,a,r[a])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):he(Object(r)).forEach(function(a){Object.defineProperty(n,a,Object.getOwnPropertyDescriptor(r,a))})}return n}function J(n){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?J=function(e){return typeof e}:J=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},J(n)}function ke(n,e,r){return e in n?Object.defineProperty(n,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):n[e]=r,n}function nt(n,e){if(n==null)return{};var r={},a=Object.keys(n),i,o;for(o=0;o<a.length;o++)i=a[o],!(e.indexOf(i)>=0)&&(r[i]=n[i]);return r}function rt(n,e){if(n==null)return{};var r=nt(n,e),a,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);for(i=0;i<o.length;i++)a=o[i],!(e.indexOf(a)>=0)&&Object.prototype.propertyIsEnumerable.call(n,a)&&(r[a]=n[a])}return r}function Ne(n,e){return at(n)||ot(n,e)||st(n,e)||it()}function at(n){if(Array.isArray(n))return n}function ot(n,e){var r=n&&(typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"]);if(r!=null){var a=[],i=!0,o=!1,l,u;try{for(r=r.call(n);!(i=(l=r.next()).done)&&(a.push(l.value),!(e&&a.length===e));i=!0);}catch(v){o=!0,u=v}finally{try{!i&&r.return!=null&&r.return()}finally{if(o)throw u}}return a}}function st(n,e){if(n){if(typeof n=="string")return xe(n,e);var r=Object.prototype.toString.call(n).slice(8,-1);if(r==="Object"&&n.constructor&&(r=n.constructor.name),r==="Map"||r==="Set")return Array.from(n);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return xe(n,e)}}function xe(n,e){(e==null||e>n.length)&&(e=n.length);for(var r=0,a=new Array(e);r<e;r++)a[r]=n[r];return a}function it(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
2In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var k=function(e,r,a){var i=!!a,o=d.useRef(a);d.useEffect(function(){o.current=a},[a]),d.useEffect(function(){if(!i||!e)return function(){};var l=function(){o.current&&o.current.apply(o,arguments)};return e.on(r,l),function(){e.off(r,l)}},[i,r,e,o])},ae=function(e){var r=d.useRef(e);return d.useEffect(function(){r.current=e},[e]),r.current},$=function(e){return e!==null&&J(e)==="object"},ct=function(e){return $(e)&&typeof e.then=="function"},lt=function(e){return $(e)&&typeof e.elements=="function"&&typeof e.createToken=="function"&&typeof e.createPaymentMethod=="function"&&typeof e.confirmCardPayment=="function"},ge="[object Object]",ut=function n(e,r){if(!$(e)||!$(r))return e===r;var a=Array.isArray(e),i=Array.isArray(r);if(a!==i)return!1;var o=Object.prototype.toString.call(e)===ge,l=Object.prototype.toString.call(r)===ge;if(o!==l)return!1;if(!o&&!a)return e===r;var u=Object.keys(e),v=Object.keys(r);if(u.length!==v.length)return!1;for(var c={},f=0;f<u.length;f+=1)c[u[f]]=!0;for(var h=0;h<v.length;h+=1)c[v[h]]=!0;var j=Object.keys(c);if(j.length!==u.length)return!1;var p=e,E=r,O=function(P){return n(p[P],E[P])};return j.every(O)},dt=function(e,r,a){return $(e)?Object.keys(e).reduce(function(i,o){var l=!$(r)||!ut(e[o],r[o]);return a.includes(o)?(l&&console.warn("Unsupported prop change: options.".concat(o," is not a mutable property.")),i):l?fe(fe({},i||{}),{},ke({},o,e[o])):i},null):null},we="Invalid prop `stripe` supplied to `Elements`. We recommend using the `loadStripe` utility from `@stripe/stripe-js`. See https://stripe.com/docs/stripe-js/react#elements-props-stripe for details.",ye=function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:we;if(e===null||lt(e))return e;throw new Error(r)},pt=function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:we;if(ct(e))return{tag:"async",stripePromise:Promise.resolve(e).then(function(i){return ye(i,r)})};var a=ye(e,r);return a===null?{tag:"empty"}:{tag:"sync",stripe:a}},mt=function(e){!e||!e._registerWrapper||!e.registerAppInfo||(e._registerWrapper({name:"react-stripe-js",version:"6.2.0"}),e.registerAppInfo({name:"react-stripe-js",version:"6.2.0",url:"https://stripe.com/docs/stripe-js/react"}))},Ee=d.createContext(null);Ee.displayName="ElementsContext";var ht=function(e,r){if(!e)throw new Error("Could not find Elements context; You need to wrap the part of your app that ".concat(r," in an <Elements> provider."));return e};x.any,x.object;x.func.isRequired;var Pe=d.createContext(null);Pe.displayName="CheckoutContext";var ve=function(e){var r=d.useContext(Pe),a=d.useContext(Ee);if(r){if(a)throw new Error("You cannot wrap the part of your app that ".concat(e," in both a checkout provider and <Elements> provider."));return r}else return ht(a,e)},ft=["mode"],xt=function(e){return e.charAt(0).toUpperCase()+e.slice(1)},y=function(e,r,a){var i="".concat(xt(e),"Element"),o=function(c){var f=c.id,h=c.className,j=c.options,p=j===void 0?{}:j,E=c.onBlur,O=c.onFocus,N=c.onReady,P=c.onChange,I=c.onEscape,q=c.onClick,B=c.onLoadError,U=c.onLoaderStart,G=c.onNetworksChange,X=c.onConfirm,s=c.onCancel,D=c.onShippingAddressChange,m=c.onShippingRateChange,w=c.onSavedPaymentMethodRemove,W=c.onSavedPaymentMethodUpdate,F=ve("mounts <".concat(i,">")),z="elements"in F?F.elements:null,_="checkoutState"in F?F.checkoutState:null,L=(_==null?void 0:_.type)==="success"||(_==null?void 0:_.type)==="loading"?_.sdk:null,Oe=d.useState(null),le=Ne(Oe,2),S=le[0],Ae=le[1],R=d.useRef(null),Z=d.useRef(null);k(S,"blur",E),k(S,"focus",O),k(S,"escape",I),k(S,"click",q),k(S,"loaderror",B),k(S,"loaderstart",U),k(S,"networksch
2ange",G),k(S,"confirm",X),k(S,"cancel",s),k(S,"shippingaddresschange",D),k(S,"shippingratechange",m),k(S,"savedpaymentmethodremove",w),k(S,"savedpaymentmethodupdate",W),k(S,"change",P);var ee;N&&(e==="expressCheckout"?ee=N:ee=function(){N(S)}),k(S,"ready",ee),d.useLayoutEffect(function(){if(R.current===null&&Z.current!==null&&(z||L)){var b=null;if(L){var Y=L,Re=L;switch(e){case"paymentForm":b=Re.createForm(p);break;case"payment":b=Y.createPaymentElement(p);break;case"address":if("mode"in p){var de=p.mode,pe=rt(p,ft);if(de==="shipping")b=Y.createShippingAddressElement(pe);else if(de==="billing")b=Y.createBillingAddressElement(pe);else throw new Error("Invalid options.mode. mode must be 'billing' or 'shipping'.")}else throw new Error("You must supply options.mode. mode must be 'billing' or 'shipping'.");break;case"expressCheckout":b=Y.createExpressCheckoutElement(p);break;case"currencySelector":b=L.createCurrencySelectorElement();break;case"taxId":b=Y.createTaxIdElement(p);break;case"contactDetails":b=Y.createContactDetailsElement();break;default:throw new Error("<".concat(i,"> is not supported inside a checkout provider. Use an <Elements> provider instead."))}}else z&&(b=z.create(e,p));R.current=b,Ae(b),b&&b.mount(Z.current)}},[z,L,p]);var ue=ae(p);return d.useEffect(function(){if(R.current){var b=dt(p,ue,["paymentRequest"]);b&&"update"in R.current&&R.current.update(b)}},[p,ue]),d.useLayoutEffect(function(){return function(){if(R.current&&typeof R.current.destroy=="function")try{R.current.destroy(),R.current=null}catch{}}},[]),d.createElement("div",{id:f,className:h,ref:Z})},l=function(c){ve("mounts <".concat(i,">"));var f=c.id,h=c.className;return d.createElement("div",{id:f,className:h})},u=r?l:o;return u.propTypes={id:x.string,className:x.string,onChange:x.func,onBlur:x.func,onFocus:x.func,onReady:x.func,onEscape:x.func,onClick:x.func,onLoadError:x.func,onLoaderStart:x.func,onNetworksChange:x.func,onConfirm:x.func,onCancel:x.func,onShippingAddressChange:x.func,onShippingRateChange:x.func,onSavedPaymentMethodRemove:x.func,onSavedPaymentMethodUpdate:x.func,options:x.object},u.displayName=i,u.__elementType=e,u},g=typeof window>"u",ce=d.createContext(null);ce.displayName="EmbeddedCheckoutProviderContext";var Ie=function(){var e=d.useContext(ce);if(!e)throw new Error("<EmbeddedCheckout> must be used within <EmbeddedCheckoutProvider>");return e},gt="Invalid prop `stripe` supplied to `EmbeddedCheckoutProvider`. We recommend using the `loadStripe` utility from `@stripe/stripe-js`. See https://stripe.com/docs/stripe-js/react#elements-props-stripe for details.",yt=function(e){var r=e.stripe,a=e.options,i=e.children,o=d.useMemo(function(){return pt(r,gt)},[r]),l=d.useRef(null),u=d.useRef(null),v=d.useState({embeddedCheckout:null}),c=Ne(v,2),f=c[0],h=c[1];d.useEffect(function(){if(!(u.current||l.current)){var E=function(N){u.current||l.current||(u.current=N,l.current=u.current.createEmbeddedCheckoutPage(a).then(function(P){h({embeddedCheckout:P})}))};o.tag==="async"&&!u.current&&(a.clientSecret||a.fetchClientSecret)?o.stripePromise.then(function(O){O&&E(O)}):o.tag==="sync"&&!u.current&&(a.clientSecret||a.fetchClientSecret)&&E(o.stripe)}},[o,a,f,u]),d.useEffect(function(){return function(){f.embeddedCheckout?(l.current=null,f.embeddedCheckout.destroy()):l.current&&l.current.then(function(){l.current=null,f.embeddedCheckout&&f.embeddedCheckout.destroy()})}},[f.embeddedCheckout]),d.useEffect(function(){mt(u)},[u]);var j=ae(r);d.useEffect(function(){j!==null&&j!==r&&console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot change the `stripe` prop after setting it.")},[j,r]);var p=ae(a);return d.useEffect(function(){if(p!=null){if(a==null){console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot unset options after setting them.");return}a.clientSecret===void 0&&a.fetchClientSecret===void 0&&console.warn("Invalid props passed to EmbeddedCheckoutProvider: You must provide one of either `options.fetchClientSecret` or `options.clientSecret`."),p.clientSecret!=null&&a.clientSecret!==p.clientSecret&&console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot change the client secret after setting it. Unmount and create a new instance of EmbeddedCheckoutProvider instead."),p.fetchClientSecret!=null&&a.fetchClientSecret!==p.fetchClientSecret&&console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot change fetchClientSecret after setting it. Unmount and create a new instance of EmbeddedCheckoutProvider instead."),p.onComplete!=null&&a.onComplete!==p.onComplete&&console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot change the onComplete option after setting it."),p.onShippingDetailsChange!=null&&a.onShippingDetailsChange!==p.onShippingDetailsChange&&console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot change the onShippingDetailsChange option after setting it."),p.onLineItemsChange!=null&&a.onLineItemsChange!==p.onLineItemsChange&&console.warn("Unsupported prop change on EmbeddedCheckoutProvider: You cannot change the onLineItemsChange option after setting it.")}},[p,a]),d.createElement(ce.Provider,{value:f},i)},vt=function(e){var r=e.id,a=e.className,i=Ie(),o=i.embeddedCheckout,l=d.useRef(!1),u=d.useRef(null);return d.useLayoutEffect(function(){return!l.current&&o&&u.current!==null&&(o.mount(u.current),l.current=!0),function(){if(l.current&&o)try{o.unmount(),l.current=!1}catch{}}}
2,[o]),d.createElement("div",{ref:u,id:r,className:a})},bt=function(e){var r=e.id,a=e.className;return Ie(),d.createElement("div",{id:r,className:a})},Ct=g?bt:vt;y("auBankAccount",g);y("card",g);y("cardNumber",g);y("cardExpiry",g);y("cardCvc",g);y("iban",g);y("payment",g);y("expressCheckout",g);y("paymentRequestButton",g);y("linkAuthentication",g);y("contactDetails",g);y("address",g);y("shippingAddress",g);y("paymentMethodMessaging",g);y("taxId",g);y("issuingCardNumberDisplay",g);y("issuingCardCvcDisplay",g);y("issuingCardExpiryDisplay",g);y("issuingCardPinDisplay",g);y("issuingCardCopyButton",g);function jt({priceId:n,customerEmail:e,userId:r,returnUrl:a}){const i=C.useMemo(()=>{try{return{stripe:Be(),environment:be(),failed:!1}}catch{return{stripe:null,environment:null,failed:!0}}},[]);if(i.failed)return t.jsxs("div",{className:"flex items-start gap-3 rounded-lg border border-border bg-muted/50 p-4",children:[t.jsx(De,{size:18,className:"text-accent shrink-0 mt-0.5"}),t.jsxs("div",{className:"text-sm",children:[t.jsx("p",{className:"font-subheading font-semibold",children:"Checkout is unavailable right now"}),t.jsx("p",{className:"text-muted-foreground text-xs mt-1 leading-relaxed",children:"We couldn't start a secure payment session. Nothing was charged. Please try again in a few minutes — or email [email protected] and we'll set your plan up manually."})]})]});const o=async()=>{const{data:l,error:u}=await oe.functions.invoke("create-checkout",{body:{priceId:n,customerEmail:e,userId:r,returnUrl:a??`${window.location.origin}/checkout/return?session_id={CHECKOUT_SESSION_ID}`,environment:i.environment}});if(u||!(l!=null&&l.clientSecret))throw new Error((u==null?void 0:u.message)||(l==null?void 0:l.error)||"Failed to create checkout session");return l.clientSecret};return t.jsx("div",{id:"checkout",className:"w-full",children:t.jsx(yt,{stripe:i.stripe,options:{fetchClientSecret:o},children:t.jsx(Ct,{})})})}function St(){const[n,e]=C.useState(!1),[r,a]=C.useState(null),i=C.useCallback(u=>{a(u),e(!0)},[]),o=C.useCallback(()=>{e(!1),a(null)},[]),l=n&&r?t.jsx(jt,{...r}):null;return{openCheckout:i,closeCheckout:o,isOpen:n,checkoutElement:l}}function kt({open:n,onOpenChange:e,onConfirm:r,planName:a,priceDisplay:i,loading:o}){const[l,u]=C.useState(!1),v=()=>{l&&r()};return t.jsx(se,{open:n,onOpenChange:e,children:t.jsxs(ie,{className:"max-w-md",children:[t.jsxs(Q,{children:[t.jsx(V,{className:"font-heading",children:"Confirm your purchase"}),t.jsxs(ne,{className:"text-sm",children:["You're about to subscribe to ",t.jsx("strong",{children:a})," for"," ",t.jsx("strong",{children:i}),"."]})]}),t.jsxs("div",{className:"space-y-3 text-sm",children:[t.jsxs("div",{className:"flex items-start gap-2.5 rounded-lg bg-muted/50 p-3",children:[t.jsx(_e,{size:16,className:"text-accent shrink-0 mt-0.5"}),t.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:[t.jsx("strong",{className:"text-foreground",children:"Taxes."})," VAT, GST and local sales tax will be added on top of the price shown, based on the billing country you enter at checkout. Stripe, our payment processor, calculates and collects the applicable tax at checkout."]})]}),t.jsxs("div",{className:"flex items-start gap-2.5 rounded-lg bg-muted/50 p-3",children:[t.jsx(Ue,{size:16,className:"text-accent shrink-0 mt-0.5"}),t.jsxs("p",{className:"text-xs text-muted-foreground leading-relaxed",children:[t.jsx("strong",{className:"text-foreground",children:"Refunds."})," Subscriptions renew automatically. Cancel anytime — you keep access until the end of your paid period. We offer a 14-day money-back guarantee on your purchase — email [email protected] and we refund to your original payment method."]})]}),t.jsxs("label",{className:"flex items-start gap-2.5 cursor-pointer select-none pt-1",children:[t.jsx(We,{checked:l,onCheckedChange:c=>u(c===!0),className:"mt-0.5","aria-label":"Accept terms"}),t.jsxs("span",{className:"text-xs text-foreground leading-relaxed",children:["I have read and agree to the"," ",t.jsx(M,{to:"/terms",target:"_blank",className:"underline text-accent",children:"Terms of Service"}),", the"," ",t.jsx(M,{to:"/refunds",target:"_blank",className:"underline text-accent",children:"Refund Policy"})," ","and the"," ",t.jsx(M,{to:"/privacy",target:"_blank",className:"underline text-accent",children:"Privacy Notice"}),". I understand my subscription will renew automatically until I cancel."]})]})]}),t.jsxs(re,{className:"gap-2 sm:gap-2",children:[t.jsx(T,{variant:"ghost",onClick:()=>e(!1),children:"Cancel"}),t.jsx(T,{variant:"hero",onClick:v,disabled:!l||o,children:o?"Opening…":"Agree & continue"})]})]})})}function Nt({open:n,onOpenChange:e,tier:r,tierName:a,defaultEmail:i}){const[o,l]=C.useState(i??""),[u,v]=C.useState(""),[c,f]=C.useState(!1),[h,j]=C.useState(null),[p,E]=C.useState(!1);C.useEffect(()=>{n&&(l(i??""),j(null),E(!1))},[n,i]);const O=async N=>{N.preventDefault();const P=o.trim();if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(P)||P.length>320){j("Please enter a valid email address.");return}f(!0),j(null);const{error:I}=await oe.from("billing_waitlist").insert({email:P,tier:r,website:u});if(f(!1),I){j(/rate_limited/i.test(I.message??"")?"We've had a lot of sign-ups from your network. Please try again shortly, or email [email protected].":"We couldn't save that just now. Please try again, or email [email protected].");return}E(!0)};return t.jsx(se,{open:n,onOpenChange:e,children:t.jsx(ie,{className:"max-w-md",children:p?t.jsxs(t.Fragment,{children:[t.jsxs(Q,{children:[t.jsx(V,{className:"font-heading",children:"You're on the list"}),t.jsxs(ne,{className:"text-sm",children:["We'll email you the moment ",a," goes live — you'll hear from us first."]})]}),t.jsx(re,{children:t.jsx(T,{variant:"hero",onClick:()=>e(!1),children:"Done"})})]}):t.jsxs("form",{onSubmit:O,children:[t.jsxs(Q,{children:[t.jsx(V,{className:"font-heading",children:"Paid plans launch soon"}),t.jsxs(ne,{className:"text-sm",children:["Join the list and we'll tell you first when ",t.jsx("strong",{children:a})," opens up."]})]}),t.jsxs("div",{className:"space-y-3 py-4",children:[t.jsxs("div",{"aria-hidden":"true",className:"absolute left-[-9999px] top-auto h-px w-px overflow-hidden",children:[t.jsx("label",{htmlFor:"bw_website",children:"Website (leave blank)"}),t.jsx("input",{id:"bw_website",name:"website",type:"text",tabIndex:-1,autoComplete:"off",value:u,onChange:N=>v(N.target.value)})]}),t.jsxs("div",{children:[t.jsx(Fe,{htmlFor:"bw_email",children:"Your email"}),t.jsx(Le,{id:"bw_email",type:"email",autoComplete:"email",maxLength:320,value:o,onChange:N=>l(N.target.value),placeholder:"[email protected]"})]}),t.jsxs("p",{className:"text-xs text-muted-foreground flex items-start gap-2",children:[t.jsx(Ye,{size:14,className:"shrink-0 mt-0.5"}),"One email about the ",a," launch. No spam, and you can unsubscribe any time."]}),h&&t.jsx("p",{className:"text-destructive text-xs",children:h})]}),t.jsxs(re,{className:"gap-2 sm:gap-2",children:[t.jsx(T,{type:"button",variant:"ghost",onClick:()=>e(!1),children:"Not now"}
2),t.jsx(T,{type:"submit",variant:"hero",disabled:c,children:c?t.jsxs(t.Fragment,{children:[t.jsx($e,{className:"mr-2 h-4 w-4 animate-spin"})," Joining…"]}):"Join the list"})]})]})})})}const H=new Set(["starter","plus","full"]),wt=[{id:"free",name:"Free",tagline:"Perfect for getting started and exploring your options.",price:"€0",priceYearly:"€0",period:"/month",cta:{label:"Start free",to:"/signup"},features:["University Coursefinder — full search access","Points for completing your profile and for referrals","Rio (AI) — limited guidance and recommendations",`${K("free")} — full result pages you can download and share`,"Full Student Portal access"]},{id:"starter",name:"Starter",tagline:"For students ready to take the first real step.",price:"€29",priceYearly:"€290",period:"/month",popular:!1,features:["Everything in Free, plus:","Unlimited Rio (AI) chat",`${K("starter")}, fully AI-integrated`,"Better, data-driven university matches"]},{id:"plus",name:"Plus",tagline:"For students ready to take the next step in their applications.",price:"€79",priceYearly:"€790",period:"/month",popular:!0,features:["Everything in Starter, plus:",K("plus"),"AI-generated profile synthesis (who, what, where, how)"]},{id:"full",name:"Full Support",tagline:"Ambitious students who want maximum support and premium features.",price:"€199",priceYearly:"€1,990",period:"/month",popular:!1,features:["Everything in Plus, plus:",K("full"),"Detailed match-score breakdown on every recommended programme","Rio AI recommendations refreshed with every assessment update"]}],Et=[{q:"Can I change plan later?",a:"Yes — upgrade, downgrade or cancel anytime from your dashboard. Upgrades apply immediately and you only pay the difference for the remainder of the period. Downgrades and cancellations take effect at the end of the period you have already paid for, so you keep your current plan until then."},{q:"Is yearly billing cheaper?",a:"Yes. A yearly plan costs ten months for twelve, so you get two months free compared with paying monthly. You are billed once a year and can switch back to monthly at the end of the term."},{q:"What happens to my points if I cancel?",a:"You keep everything you have already used. Points included with your plan are an allowance for the period you are subscribed, so any unused plan points expire when your paid access ends. Points you earned yourself — from completing your profile or from referrals — stay in your account on the Free plan."},{q:"What are points and how do they work?",a:"Points are an entitlement quota inside the platform, used to submit applications to partner universities. They are not for sale and have no cash value. You earn them by completing your profile and through referrals, and each paid plan includes a monthly allowance."},{q:"What if I need to apply to a non-partner university?",a:"Partner universities are covered by your monthly points quota. For non-partner universities you can still research and get AI guidance on the platform, and you organise and submit the application yourself."},{q:"Do you apply to universities for me?",a:"No. Noevo is software: it helps you research, organise and track your applications. You complete and submit your own applications, and we do not guarantee admission, scholarship award or visa approval."}],Ut=()=>{const{user:n}=Me(),{tier:e,subscription:r}=He(),{openCheckout:a,closeCheckout:i,isOpen:o,checkoutElement:l}=St(),u=!1,v=qe(),[c,f]=C.useState(null),[h,j]=C.useState("month"),[p,E]=C.useState(!1),[O,N]=C.useState({}),P=Ke(),[I,q]=C.useState(null);C.useEffect(()=>{Je().then(N)},[]);const B=H.has(e),U=r==null?void 0:r.priceId,G=async s=>{if(s.id!=="free"){if(!P){q(s);return}if(!n){v("/login?next=/pricing");return}if(B&&H.has(s.id)){const D=`${s.id}_${h}`;if(s.id===e&&U&&U.startsWith(D)){te.info(`You are already on ${s.name} billed ${h==="year"?"yearly":"monthly"}.`);return}E(!0);try{const{data:m,error:w}=await oe.functions.invoke("change-subscription",{body:{tier:s.id,interval:h,environment:be()}});if(w||m!=null&&m.error)throw new Error((m==null?void 0:m.error)||(w==null?void 0:w.message)||"change_failed");const W=(m==null?void 0:m.direction)==="upgrade";te.success(W?`Upgraded to ${s.name}. Your new allowance is available now.`:`${s.name} starts at the end of your current billing period — you keep your current plan until then.`),v("/dashboard/profile")}catch(m){const w=String((m==null?void 0:m.message)??m??"");te.error(/not configured|no longer supported|STRIPE_/i.test(w)?"Plan changes are temporarily unavailable. Nothing was charged — email [email protected] and we'll switch you over.":`Couldn't change plan: ${w}. Use Manage subscription to try again.`)}finally{E(!1)}return}f(s)}},X=()=>{!c||!H.has(c.id)||(a({priceId:ze(c.id,h),customerEmail:(n==null?void 0:n.email)??void 0,userId:n==null?void 0:n.id,returnUrl:`${window.location.origin}/checkout/return?session_id={CHECKOUT_SESSION_ID}`}),f(null))};return t.jsxs("main",{className:"pt-20",children:[t.jsx(Ve,{title:"Pricing — Free, Starter, Plus & Full Support",description:"Noevo pricing for students: start free, or upgrade to Starter, Plus or Full Support for more monthly points, assessments and AI guidance. No commissions, cancel anytime.",path:"/pricing"}),t.jsx("section",{className:"grain-overlay relative py-20 md:py-28 px-4",children:t.jsxs("div",{className:"relative z-10 container mx-auto max-w-[720px] text-center",children:[t.jsx(A,{children:t.jsx("h1",{className:"text-4xl md:text-6xl font-heading font-bold tracking-tight leading-[1.1]",children:"Choose Your Path to Studying Abroad"})}),t.jsx(A,{delay:100,children:t.jsx("p",{className:"mt-6 text-lg text-muted-foreground max-w-[560px] mx-auto",children:"Whether you're just exploring or ready to apply, there's a plan for you. Start free — upgrade only when you need more."})})]})}),t.jsx("section",{className:"pb-16 md:pb-24 px-4",children:t.jsxs("div",{className:"container mx-auto max-w-[1200px]",children:[t.jsxs(A,{children:[t.jsx("span",{className:"text-xs font-subheading font-medium text-accent block text-center mb-2",children:"For Students"}),t.jsx("h2",{className:"text-2xl md:text-3xl font-heading font-bold text-center mb-6",children:"Start your journey today."})]}),t.jsx(A,{children:t.jsx("div",{className:"flex justify-center mb-10",children:t.jsx("div",{role:"group","aria-label":"Billing period",className:"inline-flex items-center gap-1 rounded-full border border-border bg-card p-1",children:["month","year"].map(s=>t.jsxs("button",{type:"button",onClick:()=>j(s),"aria-pressed":h===s,className:`rounded-full px-4 py-1.5 text-sm font-subheading font-medium transition-colors ${h===s?"bg-accent text-accent-foreground":"text-muted-foreground hover:text-foreground"}`,children:[s==="month"?"Monthly":"Yearly",s==="year"&&t.jsx("span",{className:"ml-1.5 text-xs opacity-80",children:"2 months free"})]},s))})})}),t.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-4 gap-6 max-w-[1100px] mx-auto",children:wt.map((s,D)=>t.jsx(A,{delay:D*80,children:t.jsxs("div",{className:`bg-card rounded-xl p-7 border ${s.popular?"border-accent shadow-lg":"border-border"} h-full flex flex-col relative`,children:[s.popular&&t.jsx("span",{className:"absolute -top-3 left-1/2 -translate-x-1/2 bg-accent text-accent-foreground text-xs font-subheading font-semibold px-3 py-1 rounded-full",children:"Most popular"}),t.jsx("h3",{className:"font-subheading font-bold text-lg",children:s.name}),t.jsx("p",{className:"text-xs text-muted-foreground mt-1 min-h-[32px]",children:s.tagline}),t.jsxs("div",{className:"mt-4 mb-1",children:[t.jsx("span",{className:"text-3xl font-heading font-bold",children:h==="year"?s.priceYearly:s.price}),t.jsx("span",{className:"text-sm text-muted-foreground ml-1",children:h==="year"?"/year":s.period})]}),h==="year"&&s.id!=="free"&&t.jsx("p",{className:"text-xs text-accent font-subheading font-medium mb-2",children:"Two months free vs monthly"}),"priceNote"in s&&s.priceNote&&t.jsx("p",{className:"text-xs text-accent font-subheading font-medium mb-2",children:s.priceN
2ote}),t.jsxs("ul",{className:"space-y-2.5 text-sm flex-1 mt-4",children:[(()=>{const m=Qe(O,s.id);return m?t.jsxs("li",{className:"flex items-start gap-2",children:[t.jsx(me,{size:15,className:"text-accent shrink-0 mt-0.5"}),t.jsx("span",{children:m})]}):null})(),s.features.map(m=>t.jsxs("li",{className:"flex items-start gap-2",children:[t.jsx(me,{size:15,className:"text-accent shrink-0 mt-0.5"}),t.jsx("span",{children:m})]},m))]}),t.jsx("div",{className:"mt-6",children:s.id==="free"?t.jsx(T,{asChild:!0,variant:"outline",className:"w-full",children:t.jsx(M,{to:s.cta.to,children:s.cta.label})}):(()=>{const m=s.id===e,w=m&&(!U||U.startsWith(`${s.id}_${h}`)),W=B&&H.has(s.id)&&!w,F=w?"Current plan":m?`Switch to ${h==="year"?"yearly":"monthly"} billing`:W?`Switch to ${s.name}`:`Choose ${s.name}`;return t.jsx(T,{variant:s.popular?"hero":"outline",className:"w-full",onClick:()=>G(s),disabled:p||w,children:p&&W?"Updating…":F})})()})]})},s.id))})]})}),t.jsx("section",{className:"section-divider py-20 md:py-28 px-4",children:t.jsxs("div",{className:"container mx-auto max-w-[960px] grid md:grid-cols-2 gap-6",children:[t.jsx(A,{children:t.jsxs("div",{className:"bg-card rounded-xl p-8 border border-border h-full flex flex-col",children:[t.jsx("span",{className:"text-xs font-subheading font-medium text-accent",children:"For Schools & Counselors"}),t.jsx("h3",{className:"font-heading font-bold text-2xl mt-2",children:"Are you a school?"}),t.jsx("p",{className:"text-muted-foreground text-sm mt-3 flex-1",children:"Want your students or counselors to use our tool? We offer institutional pricing and bulk access — get in touch and we'll tailor it to your school."}),t.jsx(T,{asChild:!0,variant:"hero",className:"w-full mt-6",children:t.jsx("a",{href:"mailto:[email protected]",children:"Contact us →"})})]})}),t.jsx(A,{delay:100,children:t.jsxs("div",{className:"bg-card rounded-xl p-8 border border-border h-full flex flex-col",children:[t.jsx("span",{className:"text-xs font-subheading font-medium text-accent",children:"For Universities"}),t.jsx("h3",{className:"font-heading font-bold text-2xl mt-2",children:"Free to register"}),t.jsx("p",{className:"text-muted-foreground text-sm mt-3 flex-1",children:"Registration is free — especially if you have an API we can integrate. If not, we'll help with the technical setup. Ask us about our Insight Reports and institutional dashboards."}),t.jsx(T,{asChild:!0,variant:"outline",className:"w-full mt-6",children:t.jsx(M,{to:"/universities",children:"Register your university →"})})]})})]})}),t.jsx("section",{className:"py-20 md:py-28 px-4",children:t.jsxs("div",{className:"container mx-auto max-w-[700px]",children:[t.jsx(A,{children:t.jsx("h2",{className:"text-3xl font-heading font-bold text-center mb-12",children:"Pricing FAQ"})}),t.jsx("div",{className:"space-y-4",children:Et.map((s,D)=>t.jsx(A,{delay:D*30,children:t.jsxs("details",{className:"group bg-card rounded-xl border border-border p-5",children:[t.jsxs("summary",{className:"font-subheading font-semibold text-sm cursor-pointer list-none flex items-center justify-between",children:[s.q,t.jsx("span",{className:"text-accent group-open:rotate-45 transition-transform text-lg",children:"+"})]}),t.jsx("p",{className:"mt-3 text-sm text-muted-foreground leading-relaxed",children:s.a})]})},D))}),t.jsx(A,{children:t.jsx("p",{className:"mt-10 text-xs text-muted-foreground text-center leading-relaxed max-w-[600px] mx-auto",children:"Noevo is a software platform operated by NOEVO PTE. LTD. (Singapore). We provide information, search tools and AI-assisted guidance for education choices. We are not a licensed immigration or visa consultancy and we do not guarantee admission, scholarship award, visa approval or any specific outcome."})})]})}),t.jsx(kt,{open:!!c,onOpenChange:s=>!s&&f(null),onConfirm:X,planName:(c==null?void 0:c.name)??"",priceDisplay:`${(c==null?void 0:c.price)??""}${(c==null?void 0:c.period)??""}`,loading:u}),t.jsx(Nt,{open:!!I,onOpenChange:s=>!s&&q(null),tier:(I==null?void 0:I.id)??"starter",tierName:(I==null?void 0:I.name)??"",defaultEmail:(n==null?void 0:n.email)??void 0}),t.jsx(se,{open:o,onOpenChange:s=>!s&&i(),children:t.jsxs(ie,{className:"max-w-2xl max-h-[90vh] overflow-y-auto",children:[t.jsx(Q,{children:t.jsx(V,{children:"Complete your subscription"})}),l]})})]})};export{Ut 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.