@liberfi.io/ui-launchpad 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var react=require('react'),ui=require('@liberfi.io/ui'),reactLaunchpad=require('@liberfi.io/react-launchpad'),i18n=require('@liberfi.io/i18n'),types=require('@liberfi.io/types'),jsxRuntime=require('react/jsx-runtime');function V(n){return {status:n,canSubmit:n!=="signing"&&n!=="submitting"&&n!=="uploading"&&n!=="succeeded"}}var W=react.createContext(null);function re({ports:n,children:d}){return react.createElement(W.Provider,{value:n},d)}function L(){let n=react.useContext(W);if(!n)throw new Error("useLaunchpadUiPorts must be used within LaunchpadUiProvider");return n}function oe(n={}){let d=reactLaunchpad.createInMemoryLaunchpadPorts({signError:n.signError,uploadError:n.uploadError});return {chain:n.chain??types.Chain.SOLANA,requireAuth:async o=>{await o();},uploadImage:async o=>{if(n.uploadError)throw n.uploadError;return "https://ipfs.io/ipfs/memory-image"},generateMeme:n.generateMeme,createRuntime:o=>reactLaunchpad.createLaunchpadCreateRuntime({...d,onChange:o})}}var j={name:"",ticker:"",image:"",description:"",website:"",twitter:"",telegram:"",supply:1e9,raised:85,sold:51,locked:0,shareFee:false};function U({platform:n,suggestedImage:d,suggestedName:o,suggestedSymbol:c,className:u,onPreviewChange:m}){let{t}=i18n.useTranslation(),l=L(),[e,p]=react.useState(j),[r,f]=react.useState({}),[b,i]=react.useState({status:"idle"}),[_,M]=react.useState(false),N=react.useRef(null),B=n===reactLaunchpad.LaunchPadPlatform.RAYDIUM,F=V(b.status);react.useEffect(()=>{p(a=>({...a,name:o||a.name,ticker:c||a.ticker,image:d||a.image}));},[d,o,c]),react.useEffect(()=>{m?.(e);},[m,e]);let z=react.useMemo(()=>!e.name.trim()||!e.ticker.trim()||!e.image.trim()||!F.canSubmit||_,[_,e.image,e.name,e.ticker,F.canSubmit]),g=(a,v)=>{p(h=>({...h,[a]:v})),f(h=>({...h,[a]:void 0}));},J=()=>{let a={};return e.name.trim()?e.name.length>24&&(a.name=t("extend.launchpad.error_name_length")):a.name=t("extend.launchpad.error_name_required"),e.ticker.trim()?e.ticker.length>10&&(a.ticker=t("extend.launchpad.error_ticker_length")):a.ticker=t("extend.launchpad.error_ticker_required"),e.image.trim()||(a.image=t("extend.launchpad.error_image_required")),B&&((Number.isNaN(e.raised)||e.raised<30)&&(a.raised=t("extend.launchpad.error_raised_min")),(e.sold<51||e.sold>80)&&(a.sold=t("extend.launchpad.error_sold_min")),(e.locked<0||e.locked>30)&&(a.locked=t("extend.launchpad.error_locked_max")),e.sold+e.locked>80&&(a.sold=t("extend.launchpad.error_locked_sum_by_sold"))),f(a),Object.keys(a).length===0};return jsxRuntime.jsxs("form",{className:ui.cn("flex flex-col gap-4",u),onSubmit:a=>{a.preventDefault(),J()&&l.requireAuth(async()=>{let h=await l.createRuntime(i).submit({chain:l.chain,name:e.name.trim(),symbol:e.ticker.trim(),platform:n,imageUri:e.image,description:e.description||void 0,website:e.website||void 0,twitter:e.twitter||void 0,telegram:e.telegram||void 0});if(h.status==="succeeded"){l.onCreated?.(h),p(j),ui.toast.success(t("extend.launchpad.mint_transaction_submitted"));return}ui.toast.error(h.error?.message??t("extend.launchpad.mint_transaction_error"));});},children:[jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.name_label"),value:e.name,isInvalid:!!r.name,errorMessage:r.name,onValueChange:a=>g("name",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.ticker_label"),value:e.ticker,isInvalid:!!r.ticker,errorMessage:r.ticker,onValueChange:a=>g("ticker",a)}),jsxRuntime.jsxs("div",{className:"space-y-1.5",children:[jsxRuntime.jsx("h3",{className:ui.cn("text-sm",r.image&&"text-danger"),children:t("extend.launchpad.image_label")}),jsxRuntime.jsx(ui.Upload,{ref:N,accept:{"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"],"image/webp":[".webp"]},maxFiles:1,maxSize:10*1024*1024,noClick:true,noKeyboard:true,onDropAccepted:a=>{let v=a[0];v&&(M(true),l.uploadImage(v).then(h=>g("image",h)).catch(h=>{ui.toast.error(h instanceof Error?h.message:t("extend.launchpad.error_image_upload"));}).finally(()=>M(false)));},children:jsxRuntime.jsx("button",{type:"button",className:"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden",onClick:()=>N.current?.open(),children:e.image?jsxRuntime.jsx(ui.Image,{src:e.image,alt:"",className:"h-full w-full object-cover"}):jsxRuntime.jsx(ui.ImageGalleryIcon,{width:24,height:24,className:"text-neutral"})})}),r.image?jsxRuntime.jsx("p",{className:"text-xs text-danger",children:r.image}):null]}),jsxRuntime.jsx(ui.Textarea,{label:t("extend.launchpad.description_label"),placeholder:t("extend.launchpad.description_placeholder"),value:e.description,onValueChange:a=>g("description",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.website_label"),value:e.website,onValueChange:a=>g("website",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.twitter_label"),value:e.twitter,onValueChange:a=>g("twitter",a)}),jsxRuntime.jsx(ui.Input,{label:t("extend.launchpad.telegram_label"),value:e.telegram,onValueChange:a=>g("telegram",a)}),B?jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.supply_label"),value:e.supply,onValueChange:a=>g("supply",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.raised_label"),value:e.raised,isInvalid:!!r.raised,errorMessage:r.raised,onValueChange:a=>g("raised",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.sold_label"),value:e.sold,isInvalid:!!r.sold,errorMessage:r.sold,onValueChange:a=>g("sold",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("extend.launchpad.locked_label"),value:e.locked,isInvalid:!!r.locked,errorMessage:r.locked,onValueChange:a=>g("locked",Number(a??0))}),jsxRuntime.jsxs("div",{className:"col-span-2 flex items-center justify-between",children:[jsxRuntime.jsx("span",{className:"text-sm",children:t("extend.launchpad.share_fee_label")}),jsxRuntime.jsx(ui.Switch,{isSelected:e.shareFee,onValueChange:a=>g("shareFee",a)})]})]}):null,jsxRuntime.jsx(ui.Button,{type:"submit",color:"primary",isDisabled:z,isLoading:!F.canSubmit,children:t("extend.launchpad.submit")})]})}var A=6,$=9,ve="1000000000000000",Le="793100000000000",ye="35000000000",Ce="20000000";function T({platform:n,supply:d=1e9,raised:o=35,soldPercent:c=79.31}){let{t:u}=i18n.useTranslation(),m=react.useMemo(()=>{let l=n===reactLaunchpad.LaunchPadPlatform.PUMPFUN,e=l?ve:String(Math.round(d*10**A)),p=l?Le:String(Math.round(d*(c/100)*10**A)),r=l?ye:String(Math.round(o*10**$));try{return reactLaunchpad.Curve.getPoolCurvePointByInit({curveType:reactLaunchpad.CurveType.CONSTANT_PRODUCT,supply:e,totalSell:p,totalLockedAmount:0,totalFundRaising:r,migrateFee:Ce,decimalA:A,decimalB:$,pointCount:24})}catch{return []}},[n,o,c,d]),t=react.useMemo(()=>{if(m.length===0)return "";let l=m.map(i=>Number(i.totalSellSupply)),e=m.map(i=>Number(i.price)),p=Math.min(...l),r=Math.max(...l)||1,f=Math.min(...e),b=Math.max(...e)||1;return m.map((i,_)=>{let M=(Number(i.totalSellSupply)-p)/(r-p||1)*320,N=120-(Number(i.price)-f)/(b-f||1)*100;return `${_===0?"M":"L"}${M.toFixed(1)},${N.toFixed(1)}`}).join(" ")},[m]);return jsxRuntime.jsxs("div",{className:"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden",children:[jsxRuntime.jsx("h2",{className:"text-sm font-medium",children:u("extend.launchpad.curve_preview")}),jsxRuntime.jsx("svg",{viewBox:"0 0 320 140",className:"w-full h-40",role:"img","aria-label":u("extend.launchpad.curve_preview"),children:jsxRuntime.jsx("path",{d:t,fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-primary"})})]})}function K({prompt:n="",onGenerate:d}){let{t:o}=i18n.useTranslation(),c=L(),[u,m]=react.useState(n),[t,l]=react.useState(false),e=u.length>300,p=u.length>0&&!e&&!!c.generateMeme&&!t;return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsxs("div",{className:"flex justify-between items-center",children:[jsxRuntime.jsx("span",{className:"font-semibold text-sm",style:{backgroundImage:"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:o("extend.launchpad.magic_launch")}),jsxRuntime.jsxs("span",{className:ui.cn("text-xs",e?"text-danger":"text-neutral"),children:[u.length,"/300"]})]}),jsxRuntime.jsx(ui.Textarea,{minRows:2,value:u,onValueChange:m,placeholder:o("extend.launchpad.magic_launch_explained")}),jsxRuntime.jsx(ui.Button,{color:"primary",isDisabled:!p,isLoading:t,onPress:()=>{c.requireAuth(async()=>{if(c.generateMeme){l(true);try{let r=await c.generateMeme(u);d?.(r);}finally{l(false);}}});},children:o("extend.launchpad.magic_launch_submit")})]})}var Ve=[{platform:reactLaunchpad.LaunchPadPlatform.PUMPFUN,name:"Pump",icon:"/images/launchpad/pumpfun.svg"},{platform:reactLaunchpad.LaunchPadPlatform.RAYDIUM,name:"Raydium",icon:"/images/launchpad/raydium.svg"}];function Ee({prompt:n,image:d}){let[o,c]=react.useState(reactLaunchpad.LaunchPadPlatform.PUMPFUN),[u,m]=react.useState(d),[t,l]=react.useState(void 0),[e,p]=react.useState(void 0),[r,f]=react.useState(null),b=react.useCallback(i=>{m(i.image),l(i.name),p(i.symbol);},[]);return jsxRuntime.jsxs("div",{className:"flex flex-col gap-4",children:[jsxRuntime.jsx(K,{prompt:n,onGenerate:b}),jsxRuntime.jsxs("div",{className:"flex-1 flex items-start justify-center gap-4",children:[jsxRuntime.jsxs("div",{className:ui.cn("h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2"),children:[jsxRuntime.jsx(ui.Tabs,{fullWidth:true,selectedKey:o,onSelectionChange:i=>c(String(i)),disableAnimation:true,children:Ve.map(i=>jsxRuntime.jsx(ui.Tab,{title:jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx(ui.Image,{src:i.icon,alt:i.name,width:20,height:20}),jsxRuntime.jsx("span",{children:i.name})]})},i.platform))}),jsxRuntime.jsx(U,{platform:reactLaunchpad.LaunchPadPlatform.PUMPFUN,className:ui.cn({hidden:o!==reactLaunchpad.LaunchPadPlatform.PUMPFUN}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f}),jsxRuntime.jsx(U,{platform:reactLaunchpad.LaunchPadPlatform.RAYDIUM,className:ui.cn({hidden:o!==reactLaunchpad.LaunchPadPlatform.RAYDIUM}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f})]}),jsxRuntime.jsx(T,{platform:o,supply:r?.supply,raised:r?.raised,soldPercent:r?.sold})]})]})}var Ae="@liberfi.io/ui-launchpad";function ga(){return Ae}
2
- exports.LaunchPadCreateForm=U;exports.LaunchPadCurvePreview=T;exports.LaunchPadHome=Ee;exports.LaunchpadCreateStatusView=V;exports.LaunchpadReadyWidget=ga;exports.LaunchpadUiProvider=re;exports.MagicLaunch=K;exports.PACKAGE_NAME=Ae;exports.createInMemoryLaunchpadUiPorts=oe;exports.useLaunchpadUiPorts=L;//# sourceMappingURL=index.js.map
1
+ 'use strict';var react=require('react'),reactLaunchpad=require('@liberfi.io/react-launchpad'),ui=require('@liberfi.io/ui'),i18n=require('@liberfi.io/i18n'),types=require('@liberfi.io/types'),jsxRuntime=require('react/jsx-runtime');function E(r){return {status:r,canSubmit:r!=="signing"&&r!=="submitting"&&r!=="uploading"&&r!=="succeeded"}}var ae=["!bg-surface-strong/30","!border","!border-border-control/50","data-[hover=true]:!bg-surface-strong/60","data-[hover=true]:!border-border-control/80","group-data-[focus=true]:!bg-surface-strong/60","group-data-[focus=true]:!border-brand-primary/60"].join(" "),d={inputWrapper:ae,label:"text-text-secondary",input:"text-text-primary placeholder:text-text-muted"},W=["w-full h-28 rounded-lg","bg-surface-strong/30 border border-border-control/50","hover:bg-surface-strong/60 hover:border-border-control/80","focus-visible:border-brand-primary/60 focus-visible:outline-none","transition-colors","flex items-center justify-center overflow-hidden"].join(" "),j={tabList:"!bg-surface-strong/30 !border !border-border-control/50 !gap-1",tab:"data-[hover-unselected=true]:!bg-surface-strong/45 data-[hover-unselected=true]:!opacity-100",cursor:"!bg-surface-strong/60 !border !border-border-control/80 !shadow-none",tabContent:"!text-text-muted group-data-[selected=true]:!text-text-primary"};var q=react.createContext(null);function le({ports:r,children:u}){return react.createElement(q.Provider,{value:r},u)}function x(){let r=react.useContext(q);if(!r)throw new Error("useLaunchpadUiPorts must be used within LaunchpadUiProvider");return r}function ue(r={}){let u=reactLaunchpad.createInMemoryLaunchpadPorts({signError:r.signError,uploadError:r.uploadError});return {chain:r.chain??types.Chain.SOLANA,requireAuth:async o=>{await o();},uploadImage:async o=>{if(r.uploadError)throw r.uploadError;return "https://ipfs.io/ipfs/memory-image"},generateMeme:r.generateMeme,createRuntime:o=>reactLaunchpad.createLaunchpadCreateRuntime({...u,onChange:o})}}var X={name:"",ticker:"",image:"",description:"",website:"",twitter:"",telegram:"",supply:1e9,raised:85,sold:51,locked:0,shareFee:false};function k({platform:r,suggestedImage:u,suggestedName:o,suggestedSymbol:m,className:c,onPreviewChange:p}){let{t}=i18n.useTranslation(),l=x(),[e,g]=react.useState(X),[n,b]=react.useState({}),[v,s]=react.useState({status:"idle"}),[N,S]=react.useState(false),M=react.useRef(null),K=r===reactLaunchpad.LaunchPadPlatform.RAYDIUM,F=E(v.status);react.useEffect(()=>{g(a=>({...a,name:o||a.name,ticker:m||a.ticker,image:u||a.image}));},[u,o,m]),react.useEffect(()=>{p?.(e);},[p,e]);let Z=react.useMemo(()=>!e.name.trim()||!e.ticker.trim()||!e.image.trim()||!F.canSubmit||N,[N,e.image,e.name,e.ticker,F.canSubmit]),h=(a,C)=>{g(f=>({...f,[a]:C})),b(f=>({...f,[a]:void 0}));},ee=()=>{let a={};return e.name.trim()?e.name.length>24&&(a.name=t("launchpad.error_name_length")):a.name=t("launchpad.error_name_required"),e.ticker.trim()?e.ticker.length>10&&(a.ticker=t("launchpad.error_ticker_length")):a.ticker=t("launchpad.error_ticker_required"),e.image.trim()||(a.image=t("launchpad.error_image_required")),K&&((Number.isNaN(e.raised)||e.raised<30)&&(a.raised=t("launchpad.error_raised_min")),(e.sold<51||e.sold>80)&&(a.sold=t("launchpad.error_sold_min")),(e.locked<0||e.locked>30)&&(a.locked=t("launchpad.error_locked_max")),e.sold+e.locked>80&&(a.sold=t("launchpad.error_locked_sum_by_sold"))),b(a),Object.keys(a).length===0};return jsxRuntime.jsxs("form",{className:ui.cn("flex flex-col gap-4",c),onSubmit:a=>{a.preventDefault(),ee()&&l.requireAuth(async()=>{let f=await l.createRuntime(s).submit({chain:l.chain,name:e.name.trim(),symbol:e.ticker.trim(),platform:r,imageUri:e.image,description:e.description||void 0,website:e.website||void 0,twitter:e.twitter||void 0,telegram:e.telegram||void 0});if(f.status==="succeeded"){l.onCreated?.(f),g(X),ui.toast.success(t("launchpad.mint_transaction_submitted"));return}ui.toast.error(f.error?.message??t("launchpad.mint_transaction_error"));});},children:[jsxRuntime.jsx(ui.Input,{label:t("launchpad.name_label"),classNames:d,value:e.name,isInvalid:!!n.name,errorMessage:n.name,onValueChange:a=>h("name",a)}),jsxRuntime.jsx(ui.Input,{label:t("launchpad.ticker_label"),classNames:d,value:e.ticker,isInvalid:!!n.ticker,errorMessage:n.ticker,onValueChange:a=>h("ticker",a)}),jsxRuntime.jsxs("div",{className:"space-y-1.5",children:[jsxRuntime.jsx("h3",{className:ui.cn("text-sm",n.image&&"text-danger"),children:t("launchpad.image_label")}),jsxRuntime.jsx(ui.Upload,{ref:M,accept:{"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"],"image/webp":[".webp"]},maxFiles:1,maxSize:10*1024*1024,noClick:true,noKeyboard:true,onDropAccepted:a=>{let C=a[0];C&&(S(true),l.uploadImage(C).then(f=>h("image",f)).catch(f=>{ui.toast.error(f instanceof Error?f.message:t("launchpad.error_image_upload"));}).finally(()=>S(false)));},children:jsxRuntime.jsx("button",{type:"button","aria-label":t("launchpad.image_label"),className:W,onClick:()=>M.current?.open(),children:e.image?jsxRuntime.jsx(ui.Image,{src:e.image,alt:"",className:"h-full w-full object-cover"}):jsxRuntime.jsx(ui.ImageGalleryIcon,{width:24,height:24,className:"text-text-muted"})})}),n.image?jsxRuntime.jsx("p",{className:"text-xs text-danger",children:n.image}):null]}),jsxRuntime.jsx(ui.Textarea,{label:t("launchpad.description_label"),classNames:d,placeholder:t("launchpad.description_placeholder"),value:e.description,onValueChange:a=>h("description",a)}),jsxRuntime.jsx(ui.Input,{label:t("launchpad.website_label"),classNames:d,value:e.website,onValueChange:a=>h("website",a)}),jsxRuntime.jsx(ui.Input,{label:t("launchpad.twitter_label"),classNames:d,value:e.twitter,onValueChange:a=>h("twitter",a)}),jsxRuntime.jsx(ui.Input,{label:t("launchpad.telegram_label"),classNames:d,value:e.telegram,onValueChange:a=>h("telegram",a)}),K?jsxRuntime.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[jsxRuntime.jsx(ui.NumberInput,{label:t("launchpad.supply_label"),classNames:d,value:e.supply,onValueChange:a=>h("supply",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("launchpad.raised_label"),classNames:d,value:e.raised,isInvalid:!!n.raised,errorMessage:n.raised,onValueChange:a=>h("raised",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("launchpad.sold_label"),classNames:d,value:e.sold,isInvalid:!!n.sold,errorMessage:n.sold,onValueChange:a=>h("sold",Number(a??0))}),jsxRuntime.jsx(ui.NumberInput,{label:t("launchpad.locked_label"),classNames:d,value:e.locked,isInvalid:!!n.locked,errorMessage:n.locked,onValueChange:a=>h("locked",Number(a??0))}),jsxRuntime.jsxs("div",{className:"col-span-2 flex items-center justify-between",children:[jsxRuntime.jsx("span",{className:"text-sm",children:t("launchpad.share_fee_label")}),jsxRuntime.jsx(ui.Switch,{isSelected:e.shareFee,onValueChange:a=>h("shareFee",a)})]})]}):null,jsxRuntime.jsx(ui.Button,{type:"submit",color:"primary",isDisabled:Z,isLoading:!F.canSubmit,children:t("launchpad.submit")})]})}var R=6,J=9,_e="1000000000000000",Ne="793100000000000",Se="35000000000",Me="20000000";function T({platform:r,supply:u=1e9,raised:o=35,soldPercent:m=79.31}){let{t:c}=i18n.useTranslation(),p=react.useMemo(()=>{let l=r===reactLaunchpad.LaunchPadPlatform.PUMPFUN,e=l?_e:String(Math.round(u*10**R)),g=l?Ne:String(Math.round(u*(m/100)*10**R)),n=l?Se:String(Math.round(o*10**J));try{return reactLaunchpad.Curve.getPoolCurvePointByInit({curveType:reactLaunchpad.CurveType.CONSTANT_PRODUCT,supply:e,totalSell:g,totalLockedAmount:0,totalFundRaising:n,migrateFee:Me,decimalA:R,decimalB:J,pointCount:24})}catch{return []}},[r,o,m,u]),t=react.useMemo(()=>{if(p.length===0)return "";let l=p.map(s=>Number(s.totalSellSupply)),e=p.map(s=>Number(s.price)),g=Math.min(...l),n=Math.max(...l)||1,b=Math.min(...e),v=Math.max(...e)||1;return p.map((s,N)=>{let S=(Number(s.totalSellSupply)-g)/(n-g||1)*320,M=120-(Number(s.price)-b)/(v-b||1)*100;return `${N===0?"M":"L"}${S.toFixed(1)},${M.toFixed(1)}`}).join(" ")},[p]);return jsxRuntime.jsxs("div",{className:"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden",children:[jsxRuntime.jsx("h2",{className:"text-sm font-medium",children:c("launchpad.curve_preview")}),jsxRuntime.jsx("svg",{viewBox:"0 0 320 140",className:"w-full h-40",role:"img","aria-label":c("launchpad.curve_preview"),children:jsxRuntime.jsx("path",{d:t,fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-primary"})})]})}function H({prompt:r="",onGenerate:u}){let{t:o}=i18n.useTranslation(),m=x(),[c,p]=react.useState(r),[t,l]=react.useState(false),e=c.length>300,g=c.length>0&&!e&&!!m.generateMeme&&!t;return jsxRuntime.jsxs("div",{className:"flex flex-col gap-2",children:[jsxRuntime.jsxs("div",{className:"flex justify-between items-center",children:[jsxRuntime.jsx("span",{className:"font-semibold text-sm",style:{backgroundImage:"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:o("launchpad.magic_launch")}),jsxRuntime.jsxs("span",{className:ui.cn("text-xs",e?"text-danger":"text-text-muted"),children:[c.length,"/300"]})]}),jsxRuntime.jsx(ui.Textarea,{minRows:2,classNames:d,value:c,onValueChange:p,placeholder:o("launchpad.magic_launch_explained")}),jsxRuntime.jsx(ui.Button,{color:"primary",isDisabled:!g,isLoading:t,onPress:()=>{m.requireAuth(async()=>{if(m.generateMeme){l(true);try{let n=await m.generateMeme(c);u?.(n);}finally{l(false);}}});},children:o("launchpad.magic_launch_submit")})]})}var De=[{platform:reactLaunchpad.LaunchPadPlatform.PUMPFUN,name:"Pump",icon:"/images/launchpad/pumpfun.svg"},{platform:reactLaunchpad.LaunchPadPlatform.RAYDIUM,name:"Raydium",icon:"/images/launchpad/raydium.svg"}];function Te({prompt:r,image:u}){let[o,m]=react.useState(reactLaunchpad.LaunchPadPlatform.PUMPFUN),[c,p]=react.useState(u),[t,l]=react.useState(void 0),[e,g]=react.useState(void 0),[n,b]=react.useState(null),v=react.useCallback(s=>{p(s.image),l(s.name),g(s.symbol);},[]);return jsxRuntime.jsxs("div",{className:"flex flex-col gap-4",children:[jsxRuntime.jsx(H,{prompt:r,onGenerate:v}),jsxRuntime.jsxs("div",{className:"flex-1 flex items-start justify-center gap-4",children:[jsxRuntime.jsxs("div",{className:ui.cn("h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2"),children:[jsxRuntime.jsx(ui.Tabs,{fullWidth:true,classNames:j,selectedKey:o,onSelectionChange:s=>m(String(s)),disableAnimation:true,children:De.map(s=>jsxRuntime.jsx(ui.Tab,{title:jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx(ui.Image,{src:s.icon,alt:s.name,width:20,height:20}),jsxRuntime.jsx("span",{children:s.name})]})},s.platform))}),jsxRuntime.jsx(k,{platform:reactLaunchpad.LaunchPadPlatform.PUMPFUN,className:ui.cn({hidden:o!==reactLaunchpad.LaunchPadPlatform.PUMPFUN}),suggestedImage:c,suggestedName:t,suggestedSymbol:e,onPreviewChange:b}),jsxRuntime.jsx(k,{platform:reactLaunchpad.LaunchPadPlatform.RAYDIUM,className:ui.cn({hidden:o!==reactLaunchpad.LaunchPadPlatform.RAYDIUM}),suggestedImage:c,suggestedName:t,suggestedSymbol:e,onPreviewChange:b})]}),jsxRuntime.jsx(T,{platform:o,supply:n?.supply,raised:n?.raised,soldPercent:n?.sold})]})]})}var Oe="@liberfi.io/ui-launchpad";function xa(){return Oe}
2
+ exports.LaunchPadCreateForm=k;exports.LaunchPadCurvePreview=T;exports.LaunchPadHome=Te;exports.LaunchpadCreateStatusView=E;exports.LaunchpadReadyWidget=xa;exports.LaunchpadUiProvider=le;exports.MagicLaunch=H;exports.PACKAGE_NAME=Oe;exports.createInMemoryLaunchpadUiPorts=ue;exports.useLaunchpadUiPorts=x;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/create-status.view.ts","../src/ports.tsx","../src/LaunchPadCreateForm.tsx","../src/LaunchPadCurvePreview.tsx","../src/MagicLaunch.tsx","../src/LaunchPadHome.tsx","../src/index.ts"],"names":["LaunchpadCreateStatusView","status","LaunchpadUiPortsContext","createContext","LaunchpadUiProvider","ports","children","createElement","useLaunchpadUiPorts","useContext","createInMemoryLaunchpadUiPorts","options","memory","createInMemoryLaunchpadPorts","Chain","action","file","onChange","createLaunchpadCreateRuntime","DEFAULT_VALUES","LaunchPadCreateForm","platform","suggestedImage","suggestedName","suggestedSymbol","className","onPreviewChange","useTranslation","values","setValues","useState","errors","setErrors","snapshot","setSnapshot","uploading","setUploading","uploaderRef","useRef","isRaydium","LaunchPadPlatform","view","useEffect","current","disabled","useMemo","setField","key","value","validate","next","jsxs","cn","event","result","toast","jsx","Input","Upload","files","url","error","Image","ImageGalleryIcon","Textarea","NumberInput","Switch","Button","NEW_TOKEN_DECIMALS","SOL_TOKEN_DECIMALS","PUMP_SUPPLY","PUMP_SOLD","PUMP_RAISED","PUMP_MIGRATE_FEE","LaunchPadCurvePreview","supply","raised","soldPercent","t","points","isPump","supplyValue","soldValue","raisedValue","Curve","CurveType","path","xs","point","ys","minX","maxX","minY","maxY","index","x","y","MagicLaunch","prompt","onGenerate","setValue","pending","setPending","tooLong","canGenerate","PLATFORMS","LaunchPadHome","image","setPlatform","setSuggestedImage","setSuggestedName","setSuggestedSymbol","preview","setPreview","useCallback","Tabs","item","Tab","PACKAGE_NAME","LaunchpadReadyWidget"],"mappings":"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","file":"index.js","sourcesContent":["import type { LaunchpadCreateStatus } from \"@liberfi.io/react-launchpad\";\n\nexport function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {\n status: LaunchpadCreateStatus;\n canSubmit: boolean;\n} {\n return {\n status,\n canSubmit:\n status !== \"signing\" &&\n status !== \"submitting\" &&\n status !== \"uploading\" &&\n status !== \"succeeded\",\n };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type PropsWithChildren,\n} from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n createInMemoryLaunchpadPorts,\n createLaunchpadCreateRuntime,\n type LaunchpadCreateRuntime,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\n\nexport type GeneratedMemeInfo = {\n symbol: string;\n name?: string;\n image?: string;\n};\n\nexport type LaunchpadUiPorts = {\n chain: Chain;\n requireAuth: (action: () => Promise<void>) => Promise<void>;\n uploadImage: (file: File) => Promise<string>;\n createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;\n generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;\n onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;\n};\n\nconst LaunchpadUiPortsContext = createContext<LaunchpadUiPorts | null>(null);\n\nexport function LaunchpadUiProvider({\n ports,\n children,\n}: PropsWithChildren<{ ports: LaunchpadUiPorts }>) {\n return createElement(LaunchpadUiPortsContext.Provider, { value: ports }, children);\n}\n\nexport function useLaunchpadUiPorts(): LaunchpadUiPorts {\n const ports = useContext(LaunchpadUiPortsContext);\n if (!ports) {\n throw new Error(\"useLaunchpadUiPorts must be used within LaunchpadUiProvider\");\n }\n return ports;\n}\n\nexport function createInMemoryLaunchpadUiPorts(\n options: {\n chain?: Chain;\n generateMeme?: LaunchpadUiPorts[\"generateMeme\"];\n signError?: Error;\n uploadError?: Error;\n } = {},\n): LaunchpadUiPorts {\n const memory = createInMemoryLaunchpadPorts({\n signError: options.signError,\n uploadError: options.uploadError,\n });\n return {\n chain: options.chain ?? Chain.SOLANA,\n requireAuth: async (action) => {\n await action();\n },\n uploadImage: async (file) => {\n void file;\n if (options.uploadError) throw options.uploadError;\n return \"https://ipfs.io/ipfs/memory-image\";\n },\n generateMeme: options.generateMeme,\n createRuntime: (onChange) =>\n createLaunchpadCreateRuntime({\n ...memory,\n onChange,\n }),\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n LaunchPadPlatform,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\nimport {\n Button,\n cn,\n Image,\n ImageGalleryIcon,\n Input,\n NumberInput,\n Switch,\n Textarea,\n toast,\n Upload,\n type UploadRef,\n} from \"@liberfi.io/ui\";\nimport { LaunchpadCreateStatusView } from \"./create-status.view\";\nimport { useLaunchpadUiPorts } from \"./ports\";\n\nexport type LaunchPadCreateFormValues = {\n name: string;\n ticker: string;\n image: string;\n description: string;\n website: string;\n twitter: string;\n telegram: string;\n supply: number;\n raised: number;\n sold: number;\n locked: number;\n shareFee: boolean;\n};\n\nconst DEFAULT_VALUES: LaunchPadCreateFormValues = {\n name: \"\",\n ticker: \"\",\n image: \"\",\n description: \"\",\n website: \"\",\n twitter: \"\",\n telegram: \"\",\n supply: 1e9,\n raised: 85,\n sold: 51,\n locked: 0,\n shareFee: false,\n};\n\nexport function LaunchPadCreateForm({\n platform,\n suggestedImage,\n suggestedName,\n suggestedSymbol,\n className,\n onPreviewChange,\n}: {\n platform: LaunchPadPlatform;\n suggestedImage?: string;\n suggestedName?: string;\n suggestedSymbol?: string;\n className?: string;\n onPreviewChange?: (values: LaunchPadCreateFormValues) => void;\n}) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [values, setValues] = useState<LaunchPadCreateFormValues>(DEFAULT_VALUES);\n const [errors, setErrors] = useState<Partial<Record<keyof LaunchPadCreateFormValues, string>>>({});\n const [snapshot, setSnapshot] = useState<LaunchpadCreateSnapshot>({ status: \"idle\" });\n const [uploading, setUploading] = useState(false);\n const uploaderRef = useRef<UploadRef>(null);\n const isRaydium = platform === LaunchPadPlatform.RAYDIUM;\n const view = LaunchpadCreateStatusView(snapshot.status);\n\n useEffect(() => {\n setValues((current) => ({\n ...current,\n name: suggestedName || current.name,\n ticker: suggestedSymbol || current.ticker,\n image: suggestedImage || current.image,\n }));\n }, [suggestedImage, suggestedName, suggestedSymbol]);\n\n useEffect(() => {\n onPreviewChange?.(values);\n }, [onPreviewChange, values]);\n\n const disabled = useMemo(\n () =>\n !values.name.trim() ||\n !values.ticker.trim() ||\n !values.image.trim() ||\n !view.canSubmit ||\n uploading,\n [uploading, values.image, values.name, values.ticker, view.canSubmit],\n );\n\n const setField = <K extends keyof LaunchPadCreateFormValues>(\n key: K,\n value: LaunchPadCreateFormValues[K],\n ) => {\n setValues((current) => ({ ...current, [key]: value }));\n setErrors((current) => ({ ...current, [key]: undefined }));\n };\n\n const validate = (): boolean => {\n const next: Partial<Record<keyof LaunchPadCreateFormValues, string>> = {};\n if (!values.name.trim()) next.name = t(\"extend.launchpad.error_name_required\");\n else if (values.name.length > 24) next.name = t(\"extend.launchpad.error_name_length\");\n if (!values.ticker.trim()) next.ticker = t(\"extend.launchpad.error_ticker_required\");\n else if (values.ticker.length > 10) next.ticker = t(\"extend.launchpad.error_ticker_length\");\n if (!values.image.trim()) next.image = t(\"extend.launchpad.error_image_required\");\n if (isRaydium) {\n if (Number.isNaN(values.raised) || values.raised < 30) {\n next.raised = t(\"extend.launchpad.error_raised_min\");\n }\n if (values.sold < 51 || values.sold > 80) next.sold = t(\"extend.launchpad.error_sold_min\");\n if (values.locked < 0 || values.locked > 30) next.locked = t(\"extend.launchpad.error_locked_max\");\n if (values.sold + values.locked > 80) next.sold = t(\"extend.launchpad.error_locked_sum_by_sold\");\n }\n setErrors(next);\n return Object.keys(next).length === 0;\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event) => {\n event.preventDefault();\n if (!validate()) return;\n void ports.requireAuth(async () => {\n const runtime = ports.createRuntime(setSnapshot);\n const result = await runtime.submit({\n chain: ports.chain,\n name: values.name.trim(),\n symbol: values.ticker.trim(),\n platform,\n imageUri: values.image,\n description: values.description || undefined,\n website: values.website || undefined,\n twitter: values.twitter || undefined,\n telegram: values.telegram || undefined,\n });\n if (result.status === \"succeeded\") {\n ports.onCreated?.(result);\n setValues(DEFAULT_VALUES);\n toast.success(t(\"extend.launchpad.mint_transaction_submitted\"));\n return;\n }\n toast.error(result.error?.message ?? t(\"extend.launchpad.mint_transaction_error\"));\n });\n }}\n >\n <Input\n label={t(\"extend.launchpad.name_label\")}\n value={values.name}\n isInvalid={!!errors.name}\n errorMessage={errors.name}\n onValueChange={(value) => setField(\"name\", value)}\n />\n <Input\n label={t(\"extend.launchpad.ticker_label\")}\n value={values.ticker}\n isInvalid={!!errors.ticker}\n errorMessage={errors.ticker}\n onValueChange={(value) => setField(\"ticker\", value)}\n />\n <div className=\"space-y-1.5\">\n <h3 className={cn(\"text-sm\", errors.image && \"text-danger\")}>\n {t(\"extend.launchpad.image_label\")}\n </h3>\n <Upload\n ref={uploaderRef}\n accept={{ \"image/jpeg\": [\".jpg\", \".jpeg\"], \"image/png\": [\".png\"], \"image/webp\": [\".webp\"] }}\n maxFiles={1}\n maxSize={10 * 1024 * 1024}\n noClick\n noKeyboard\n onDropAccepted={(files) => {\n const file = files[0];\n if (!file) return;\n setUploading(true);\n void ports\n .uploadImage(file)\n .then((url) => setField(\"image\", url))\n .catch((error: unknown) => {\n toast.error(\n error instanceof Error ? error.message : t(\"extend.launchpad.error_image_upload\"),\n );\n })\n .finally(() => setUploading(false));\n }}\n >\n <button\n type=\"button\"\n className=\"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden\"\n onClick={() => uploaderRef.current?.open()}\n >\n {values.image ? (\n <Image src={values.image} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <ImageGalleryIcon width={24} height={24} className=\"text-neutral\" />\n )}\n </button>\n </Upload>\n {errors.image ? <p className=\"text-xs text-danger\">{errors.image}</p> : null}\n </div>\n <Textarea\n label={t(\"extend.launchpad.description_label\")}\n placeholder={t(\"extend.launchpad.description_placeholder\")}\n value={values.description}\n onValueChange={(value) => setField(\"description\", value)}\n />\n <Input\n label={t(\"extend.launchpad.website_label\")}\n value={values.website}\n onValueChange={(value) => setField(\"website\", value)}\n />\n <Input\n label={t(\"extend.launchpad.twitter_label\")}\n value={values.twitter}\n onValueChange={(value) => setField(\"twitter\", value)}\n />\n <Input\n label={t(\"extend.launchpad.telegram_label\")}\n value={values.telegram}\n onValueChange={(value) => setField(\"telegram\", value)}\n />\n {isRaydium ? (\n <div className=\"grid grid-cols-2 gap-3\">\n <NumberInput\n label={t(\"extend.launchpad.supply_label\")}\n value={values.supply}\n onValueChange={(value) => setField(\"supply\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.raised_label\")}\n value={values.raised}\n isInvalid={!!errors.raised}\n errorMessage={errors.raised}\n onValueChange={(value) => setField(\"raised\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.sold_label\")}\n value={values.sold}\n isInvalid={!!errors.sold}\n errorMessage={errors.sold}\n onValueChange={(value) => setField(\"sold\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.locked_label\")}\n value={values.locked}\n isInvalid={!!errors.locked}\n errorMessage={errors.locked}\n onValueChange={(value) => setField(\"locked\", Number(value ?? 0))}\n />\n <div className=\"col-span-2 flex items-center justify-between\">\n <span className=\"text-sm\">{t(\"extend.launchpad.share_fee_label\")}</span>\n <Switch\n isSelected={values.shareFee}\n onValueChange={(value) => setField(\"shareFee\", value)}\n />\n </div>\n </div>\n ) : null}\n <Button type=\"submit\" color=\"primary\" isDisabled={disabled} isLoading={!view.canSubmit}>\n {t(\"extend.launchpad.submit\")}\n </Button>\n </form>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Curve, CurveType, LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\n\nconst NEW_TOKEN_DECIMALS = 6;\nconst SOL_TOKEN_DECIMALS = 9;\nconst PUMP_SUPPLY = \"1000000000000000\";\nconst PUMP_SOLD = \"793100000000000\";\nconst PUMP_RAISED = \"35000000000\";\nconst PUMP_MIGRATE_FEE = \"20000000\";\n\nexport function LaunchPadCurvePreview({\n platform,\n supply = 1e9,\n raised = 35,\n soldPercent = 79.31,\n}: {\n platform: LaunchPadPlatform;\n supply?: number;\n raised?: number;\n soldPercent?: number;\n}) {\n const { t } = useTranslation();\n const points = useMemo(() => {\n const isPump = platform === LaunchPadPlatform.PUMPFUN;\n const supplyValue = isPump\n ? PUMP_SUPPLY\n : String(Math.round(supply * 10 ** NEW_TOKEN_DECIMALS));\n const soldValue = isPump\n ? PUMP_SOLD\n : String(Math.round(supply * (soldPercent / 100) * 10 ** NEW_TOKEN_DECIMALS));\n const raisedValue = isPump\n ? PUMP_RAISED\n : String(Math.round(raised * 10 ** SOL_TOKEN_DECIMALS));\n try {\n return Curve.getPoolCurvePointByInit({\n curveType: CurveType.CONSTANT_PRODUCT,\n supply: supplyValue,\n totalSell: soldValue,\n totalLockedAmount: 0,\n totalFundRaising: raisedValue,\n migrateFee: PUMP_MIGRATE_FEE,\n decimalA: NEW_TOKEN_DECIMALS,\n decimalB: SOL_TOKEN_DECIMALS,\n pointCount: 24,\n });\n } catch {\n return [];\n }\n }, [platform, raised, soldPercent, supply]);\n\n const path = useMemo(() => {\n if (points.length === 0) return \"\";\n const xs = points.map((point) => Number(point.totalSellSupply));\n const ys = points.map((point) => Number(point.price));\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs) || 1;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys) || 1;\n return points\n .map((point, index) => {\n const x = ((Number(point.totalSellSupply) - minX) / (maxX - minX || 1)) * 320;\n const y = 120 - ((Number(point.price) - minY) / (maxY - minY || 1)) * 100;\n return `${index === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [points]);\n\n return (\n <div className=\"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden\">\n <h2 className=\"text-sm font-medium\">{t(\"extend.launchpad.curve_preview\")}</h2>\n <svg viewBox=\"0 0 320 140\" className=\"w-full h-40\" role=\"img\" aria-label={t(\"extend.launchpad.curve_preview\")}>\n <path d={path} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"text-primary\" />\n </svg>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Textarea } from \"@liberfi.io/ui\";\nimport { useLaunchpadUiPorts, type GeneratedMemeInfo } from \"./ports\";\n\nexport type MagicLaunchProps = {\n prompt?: string;\n onGenerate?: (result: GeneratedMemeInfo) => void;\n};\n\nexport function MagicLaunch({ prompt = \"\", onGenerate }: MagicLaunchProps) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [value, setValue] = useState(prompt);\n const [pending, setPending] = useState(false);\n const tooLong = value.length > 300;\n const canGenerate = value.length > 0 && !tooLong && !!ports.generateMeme && !pending;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center\">\n <span\n className=\"font-semibold text-sm\"\n style={{\n backgroundImage: \"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {t(\"extend.launchpad.magic_launch\")}\n </span>\n <span className={cn(\"text-xs\", tooLong ? \"text-danger\" : \"text-neutral\")}>\n {value.length}/300\n </span>\n </div>\n <Textarea\n minRows={2}\n value={value}\n onValueChange={setValue}\n placeholder={t(\"extend.launchpad.magic_launch_explained\")}\n />\n <Button\n color=\"primary\"\n isDisabled={!canGenerate}\n isLoading={pending}\n onPress={() => {\n void ports.requireAuth(async () => {\n if (!ports.generateMeme) return;\n setPending(true);\n try {\n const result = await ports.generateMeme(value);\n onGenerate?.(result);\n } finally {\n setPending(false);\n }\n });\n }}\n >\n {t(\"extend.launchpad.magic_launch_submit\")}\n </Button>\n </div>\n );\n}\n","import { useCallback, useState, type Key } from \"react\";\nimport { Image, Tab, Tabs, cn } from \"@liberfi.io/ui\";\nimport { LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\nimport { LaunchPadCreateForm, type LaunchPadCreateFormValues } from \"./LaunchPadCreateForm\";\nimport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nimport { MagicLaunch } from \"./MagicLaunch\";\nimport type { GeneratedMemeInfo } from \"./ports\";\n\nconst PLATFORMS = [\n { platform: LaunchPadPlatform.PUMPFUN, name: \"Pump\", icon: \"/images/launchpad/pumpfun.svg\" },\n { platform: LaunchPadPlatform.RAYDIUM, name: \"Raydium\", icon: \"/images/launchpad/raydium.svg\" },\n] as const;\n\nexport interface LaunchPadHomeProps {\n prompt?: string;\n image?: string;\n}\n\nexport function LaunchPadHome({ prompt, image }: LaunchPadHomeProps) {\n const [platform, setPlatform] = useState<LaunchPadPlatform>(LaunchPadPlatform.PUMPFUN);\n const [suggestedImage, setSuggestedImage] = useState<string | undefined>(image);\n const [suggestedName, setSuggestedName] = useState<string | undefined>(undefined);\n const [suggestedSymbol, setSuggestedSymbol] = useState<string | undefined>(undefined);\n const [preview, setPreview] = useState<LaunchPadCreateFormValues | null>(null);\n\n const onGenerate = useCallback((result: GeneratedMemeInfo) => {\n setSuggestedImage(result.image);\n setSuggestedName(result.name);\n setSuggestedSymbol(result.symbol);\n }, []);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <MagicLaunch prompt={prompt} onGenerate={onGenerate} />\n <div className=\"flex-1 flex items-start justify-center gap-4\">\n <div className={cn(\"h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2\")}>\n <Tabs\n fullWidth\n selectedKey={platform}\n onSelectionChange={(key: Key) => setPlatform(String(key) as LaunchPadPlatform)}\n disableAnimation\n >\n {PLATFORMS.map((item) => (\n <Tab\n key={item.platform}\n title={\n <div className=\"flex items-center gap-2\">\n <Image src={item.icon} alt={item.name} width={20} height={20} />\n <span>{item.name}</span>\n </div>\n }\n />\n ))}\n </Tabs>\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.PUMPFUN}\n className={cn({ hidden: platform !== LaunchPadPlatform.PUMPFUN })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.RAYDIUM}\n className={cn({ hidden: platform !== LaunchPadPlatform.RAYDIUM })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n </div>\n <LaunchPadCurvePreview\n platform={platform}\n supply={preview?.supply}\n raised={preview?.raised}\n soldPercent={preview?.sold}\n />\n </div>\n </div>\n );\n}\n","export const PACKAGE_NAME = \"@liberfi.io/ui-launchpad\" as const;\n\nexport function LaunchpadReadyWidget() {\n return PACKAGE_NAME;\n}\n\nexport { LaunchpadCreateStatusView } from \"./create-status.view\";\nexport { LaunchPadHome, type LaunchPadHomeProps } from \"./LaunchPadHome\";\nexport { LaunchPadCreateForm } from \"./LaunchPadCreateForm\";\nexport { MagicLaunch, type MagicLaunchProps } from \"./MagicLaunch\";\nexport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nexport {\n LaunchpadUiProvider,\n useLaunchpadUiPorts,\n createInMemoryLaunchpadUiPorts,\n type LaunchpadUiPorts,\n type GeneratedMemeInfo,\n} from \"./ports\";\n"]}
1
+ {"version":3,"sources":["../src/create-status.view.ts","../src/form-control-theme.ts","../src/ports.tsx","../src/LaunchPadCreateForm.tsx","../src/LaunchPadCurvePreview.tsx","../src/MagicLaunch.tsx","../src/LaunchPadHome.tsx","../src/index.ts"],"names":["LaunchpadCreateStatusView","status","LAUNCHPAD_FIELD_WRAPPER_CLASS","LAUNCHPAD_FIELD_CLASS_NAMES","LAUNCHPAD_UPLOAD_BUTTON_CLASS","LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES","LaunchpadUiPortsContext","createContext","LaunchpadUiProvider","ports","children","createElement","useLaunchpadUiPorts","useContext","createInMemoryLaunchpadUiPorts","options","memory","createInMemoryLaunchpadPorts","Chain","action","file","onChange","createLaunchpadCreateRuntime","DEFAULT_VALUES","LaunchPadCreateForm","platform","suggestedImage","suggestedName","suggestedSymbol","className","onPreviewChange","useTranslation","values","setValues","useState","errors","setErrors","snapshot","setSnapshot","uploading","setUploading","uploaderRef","useRef","isRaydium","LaunchPadPlatform","view","useEffect","current","disabled","useMemo","setField","key","value","validate","next","jsxs","cn","event","result","toast","jsx","Input","Upload","files","url","error","Image","ImageGalleryIcon","Textarea","NumberInput","Switch","Button","NEW_TOKEN_DECIMALS","SOL_TOKEN_DECIMALS","PUMP_SUPPLY","PUMP_SOLD","PUMP_RAISED","PUMP_MIGRATE_FEE","LaunchPadCurvePreview","supply","raised","soldPercent","t","points","isPump","supplyValue","soldValue","raisedValue","Curve","CurveType","path","xs","point","ys","minX","maxX","minY","maxY","index","x","y","MagicLaunch","prompt","onGenerate","setValue","pending","setPending","tooLong","canGenerate","PLATFORMS","LaunchPadHome","image","setPlatform","setSuggestedImage","setSuggestedName","setSuggestedSymbol","preview","setPreview","useCallback","Tabs","item","Tab","PACKAGE_NAME","LaunchpadReadyWidget"],"mappings":"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","file":"index.js","sourcesContent":["import type { LaunchpadCreateStatus } from \"@liberfi.io/react-launchpad\";\n\nexport function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {\n status: LaunchpadCreateStatus;\n canSubmit: boolean;\n} {\n return {\n status,\n canSubmit:\n status !== \"signing\" &&\n status !== \"submitting\" &&\n status !== \"uploading\" &&\n status !== \"succeeded\",\n };\n}\n","const LAUNCHPAD_FIELD_WRAPPER_CLASS = [\n \"!bg-surface-strong/30\",\n \"!border\",\n \"!border-border-control/50\",\n \"data-[hover=true]:!bg-surface-strong/60\",\n \"data-[hover=true]:!border-border-control/80\",\n \"group-data-[focus=true]:!bg-surface-strong/60\",\n \"group-data-[focus=true]:!border-brand-primary/60\",\n].join(\" \");\n\nexport const LAUNCHPAD_FIELD_CLASS_NAMES = {\n inputWrapper: LAUNCHPAD_FIELD_WRAPPER_CLASS,\n label: \"text-text-secondary\",\n input: \"text-text-primary placeholder:text-text-muted\",\n} as const;\n\nexport const LAUNCHPAD_UPLOAD_BUTTON_CLASS = [\n \"w-full h-28 rounded-lg\",\n \"bg-surface-strong/30 border border-border-control/50\",\n \"hover:bg-surface-strong/60 hover:border-border-control/80\",\n \"focus-visible:border-brand-primary/60 focus-visible:outline-none\",\n \"transition-colors\",\n \"flex items-center justify-center overflow-hidden\",\n].join(\" \");\n\nexport const LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES = {\n tabList: \"!bg-surface-strong/30 !border !border-border-control/50 !gap-1\",\n tab: \"data-[hover-unselected=true]:!bg-surface-strong/45 data-[hover-unselected=true]:!opacity-100\",\n cursor:\n \"!bg-surface-strong/60 !border !border-border-control/80 !shadow-none\",\n tabContent: \"!text-text-muted group-data-[selected=true]:!text-text-primary\",\n} as const;\n","import {\n createContext,\n createElement,\n useContext,\n type PropsWithChildren,\n} from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n createInMemoryLaunchpadPorts,\n createLaunchpadCreateRuntime,\n type LaunchpadCreateRuntime,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\n\nexport type GeneratedMemeInfo = {\n symbol: string;\n name?: string;\n image?: string;\n};\n\nexport type LaunchpadUiPorts = {\n chain: Chain;\n requireAuth: (action: () => Promise<void>) => Promise<void>;\n uploadImage: (file: File) => Promise<string>;\n createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;\n generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;\n onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;\n};\n\nconst LaunchpadUiPortsContext = createContext<LaunchpadUiPorts | null>(null);\n\nexport function LaunchpadUiProvider({\n ports,\n children,\n}: PropsWithChildren<{ ports: LaunchpadUiPorts }>) {\n return createElement(LaunchpadUiPortsContext.Provider, { value: ports }, children);\n}\n\nexport function useLaunchpadUiPorts(): LaunchpadUiPorts {\n const ports = useContext(LaunchpadUiPortsContext);\n if (!ports) {\n throw new Error(\"useLaunchpadUiPorts must be used within LaunchpadUiProvider\");\n }\n return ports;\n}\n\nexport function createInMemoryLaunchpadUiPorts(\n options: {\n chain?: Chain;\n generateMeme?: LaunchpadUiPorts[\"generateMeme\"];\n signError?: Error;\n uploadError?: Error;\n } = {},\n): LaunchpadUiPorts {\n const memory = createInMemoryLaunchpadPorts({\n signError: options.signError,\n uploadError: options.uploadError,\n });\n return {\n chain: options.chain ?? Chain.SOLANA,\n requireAuth: async (action) => {\n await action();\n },\n uploadImage: async (file) => {\n void file;\n if (options.uploadError) throw options.uploadError;\n return \"https://ipfs.io/ipfs/memory-image\";\n },\n generateMeme: options.generateMeme,\n createRuntime: (onChange) =>\n createLaunchpadCreateRuntime({\n ...memory,\n onChange,\n }),\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n LaunchPadPlatform,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\nimport {\n Button,\n cn,\n Image,\n ImageGalleryIcon,\n Input,\n NumberInput,\n Switch,\n Textarea,\n toast,\n Upload,\n type UploadRef,\n} from \"@liberfi.io/ui\";\nimport { LaunchpadCreateStatusView } from \"./create-status.view\";\nimport {\n LAUNCHPAD_FIELD_CLASS_NAMES,\n LAUNCHPAD_UPLOAD_BUTTON_CLASS,\n} from \"./form-control-theme\";\nimport { useLaunchpadUiPorts } from \"./ports\";\n\nexport type LaunchPadCreateFormValues = {\n name: string;\n ticker: string;\n image: string;\n description: string;\n website: string;\n twitter: string;\n telegram: string;\n supply: number;\n raised: number;\n sold: number;\n locked: number;\n shareFee: boolean;\n};\n\nconst DEFAULT_VALUES: LaunchPadCreateFormValues = {\n name: \"\",\n ticker: \"\",\n image: \"\",\n description: \"\",\n website: \"\",\n twitter: \"\",\n telegram: \"\",\n supply: 1e9,\n raised: 85,\n sold: 51,\n locked: 0,\n shareFee: false,\n};\n\nexport function LaunchPadCreateForm({\n platform,\n suggestedImage,\n suggestedName,\n suggestedSymbol,\n className,\n onPreviewChange,\n}: {\n platform: LaunchPadPlatform;\n suggestedImage?: string;\n suggestedName?: string;\n suggestedSymbol?: string;\n className?: string;\n onPreviewChange?: (values: LaunchPadCreateFormValues) => void;\n}) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [values, setValues] =\n useState<LaunchPadCreateFormValues>(DEFAULT_VALUES);\n const [errors, setErrors] = useState<\n Partial<Record<keyof LaunchPadCreateFormValues, string>>\n >({});\n const [snapshot, setSnapshot] = useState<LaunchpadCreateSnapshot>({\n status: \"idle\",\n });\n const [uploading, setUploading] = useState(false);\n const uploaderRef = useRef<UploadRef>(null);\n const isRaydium = platform === LaunchPadPlatform.RAYDIUM;\n const view = LaunchpadCreateStatusView(snapshot.status);\n\n useEffect(() => {\n setValues((current) => ({\n ...current,\n name: suggestedName || current.name,\n ticker: suggestedSymbol || current.ticker,\n image: suggestedImage || current.image,\n }));\n }, [suggestedImage, suggestedName, suggestedSymbol]);\n\n useEffect(() => {\n onPreviewChange?.(values);\n }, [onPreviewChange, values]);\n\n const disabled = useMemo(\n () =>\n !values.name.trim() ||\n !values.ticker.trim() ||\n !values.image.trim() ||\n !view.canSubmit ||\n uploading,\n [uploading, values.image, values.name, values.ticker, view.canSubmit],\n );\n\n const setField = <K extends keyof LaunchPadCreateFormValues>(\n key: K,\n value: LaunchPadCreateFormValues[K],\n ) => {\n setValues((current) => ({ ...current, [key]: value }));\n setErrors((current) => ({ ...current, [key]: undefined }));\n };\n\n const validate = (): boolean => {\n const next: Partial<Record<keyof LaunchPadCreateFormValues, string>> = {};\n if (!values.name.trim()) next.name = t(\"launchpad.error_name_required\");\n else if (values.name.length > 24)\n next.name = t(\"launchpad.error_name_length\");\n if (!values.ticker.trim())\n next.ticker = t(\"launchpad.error_ticker_required\");\n else if (values.ticker.length > 10)\n next.ticker = t(\"launchpad.error_ticker_length\");\n if (!values.image.trim()) next.image = t(\"launchpad.error_image_required\");\n if (isRaydium) {\n if (Number.isNaN(values.raised) || values.raised < 30) {\n next.raised = t(\"launchpad.error_raised_min\");\n }\n if (values.sold < 51 || values.sold > 80)\n next.sold = t(\"launchpad.error_sold_min\");\n if (values.locked < 0 || values.locked > 30)\n next.locked = t(\"launchpad.error_locked_max\");\n if (values.sold + values.locked > 80)\n next.sold = t(\"launchpad.error_locked_sum_by_sold\");\n }\n setErrors(next);\n return Object.keys(next).length === 0;\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event) => {\n event.preventDefault();\n if (!validate()) return;\n void ports.requireAuth(async () => {\n const runtime = ports.createRuntime(setSnapshot);\n const result = await runtime.submit({\n chain: ports.chain,\n name: values.name.trim(),\n symbol: values.ticker.trim(),\n platform,\n imageUri: values.image,\n description: values.description || undefined,\n website: values.website || undefined,\n twitter: values.twitter || undefined,\n telegram: values.telegram || undefined,\n });\n if (result.status === \"succeeded\") {\n ports.onCreated?.(result);\n setValues(DEFAULT_VALUES);\n toast.success(t(\"launchpad.mint_transaction_submitted\"));\n return;\n }\n toast.error(\n result.error?.message ?? t(\"launchpad.mint_transaction_error\"),\n );\n });\n }}\n >\n <Input\n label={t(\"launchpad.name_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.name}\n isInvalid={!!errors.name}\n errorMessage={errors.name}\n onValueChange={(value) => setField(\"name\", value)}\n />\n <Input\n label={t(\"launchpad.ticker_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.ticker}\n isInvalid={!!errors.ticker}\n errorMessage={errors.ticker}\n onValueChange={(value) => setField(\"ticker\", value)}\n />\n <div className=\"space-y-1.5\">\n <h3 className={cn(\"text-sm\", errors.image && \"text-danger\")}>\n {t(\"launchpad.image_label\")}\n </h3>\n <Upload\n ref={uploaderRef}\n accept={{\n \"image/jpeg\": [\".jpg\", \".jpeg\"],\n \"image/png\": [\".png\"],\n \"image/webp\": [\".webp\"],\n }}\n maxFiles={1}\n maxSize={10 * 1024 * 1024}\n noClick\n noKeyboard\n onDropAccepted={(files) => {\n const file = files[0];\n if (!file) return;\n setUploading(true);\n void ports\n .uploadImage(file)\n .then((url) => setField(\"image\", url))\n .catch((error: unknown) => {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"launchpad.error_image_upload\"),\n );\n })\n .finally(() => setUploading(false));\n }}\n >\n <button\n type=\"button\"\n aria-label={t(\"launchpad.image_label\")}\n className={LAUNCHPAD_UPLOAD_BUTTON_CLASS}\n onClick={() => uploaderRef.current?.open()}\n >\n {values.image ? (\n <Image\n src={values.image}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <ImageGalleryIcon\n width={24}\n height={24}\n className=\"text-text-muted\"\n />\n )}\n </button>\n </Upload>\n {errors.image ? (\n <p className=\"text-xs text-danger\">{errors.image}</p>\n ) : null}\n </div>\n <Textarea\n label={t(\"launchpad.description_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n placeholder={t(\"launchpad.description_placeholder\")}\n value={values.description}\n onValueChange={(value) => setField(\"description\", value)}\n />\n <Input\n label={t(\"launchpad.website_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.website}\n onValueChange={(value) => setField(\"website\", value)}\n />\n <Input\n label={t(\"launchpad.twitter_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.twitter}\n onValueChange={(value) => setField(\"twitter\", value)}\n />\n <Input\n label={t(\"launchpad.telegram_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.telegram}\n onValueChange={(value) => setField(\"telegram\", value)}\n />\n {isRaydium ? (\n <div className=\"grid grid-cols-2 gap-3\">\n <NumberInput\n label={t(\"launchpad.supply_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.supply}\n onValueChange={(value) => setField(\"supply\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"launchpad.raised_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.raised}\n isInvalid={!!errors.raised}\n errorMessage={errors.raised}\n onValueChange={(value) => setField(\"raised\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"launchpad.sold_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.sold}\n isInvalid={!!errors.sold}\n errorMessage={errors.sold}\n onValueChange={(value) => setField(\"sold\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"launchpad.locked_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.locked}\n isInvalid={!!errors.locked}\n errorMessage={errors.locked}\n onValueChange={(value) => setField(\"locked\", Number(value ?? 0))}\n />\n <div className=\"col-span-2 flex items-center justify-between\">\n <span className=\"text-sm\">{t(\"launchpad.share_fee_label\")}</span>\n <Switch\n isSelected={values.shareFee}\n onValueChange={(value) => setField(\"shareFee\", value)}\n />\n </div>\n </div>\n ) : null}\n <Button\n type=\"submit\"\n color=\"primary\"\n isDisabled={disabled}\n isLoading={!view.canSubmit}\n >\n {t(\"launchpad.submit\")}\n </Button>\n </form>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Curve,\n CurveType,\n LaunchPadPlatform,\n} from \"@liberfi.io/react-launchpad\";\n\nconst NEW_TOKEN_DECIMALS = 6;\nconst SOL_TOKEN_DECIMALS = 9;\nconst PUMP_SUPPLY = \"1000000000000000\";\nconst PUMP_SOLD = \"793100000000000\";\nconst PUMP_RAISED = \"35000000000\";\nconst PUMP_MIGRATE_FEE = \"20000000\";\n\nexport function LaunchPadCurvePreview({\n platform,\n supply = 1e9,\n raised = 35,\n soldPercent = 79.31,\n}: {\n platform: LaunchPadPlatform;\n supply?: number;\n raised?: number;\n soldPercent?: number;\n}) {\n const { t } = useTranslation();\n const points = useMemo(() => {\n const isPump = platform === LaunchPadPlatform.PUMPFUN;\n const supplyValue = isPump\n ? PUMP_SUPPLY\n : String(Math.round(supply * 10 ** NEW_TOKEN_DECIMALS));\n const soldValue = isPump\n ? PUMP_SOLD\n : String(\n Math.round(supply * (soldPercent / 100) * 10 ** NEW_TOKEN_DECIMALS),\n );\n const raisedValue = isPump\n ? PUMP_RAISED\n : String(Math.round(raised * 10 ** SOL_TOKEN_DECIMALS));\n try {\n return Curve.getPoolCurvePointByInit({\n curveType: CurveType.CONSTANT_PRODUCT,\n supply: supplyValue,\n totalSell: soldValue,\n totalLockedAmount: 0,\n totalFundRaising: raisedValue,\n migrateFee: PUMP_MIGRATE_FEE,\n decimalA: NEW_TOKEN_DECIMALS,\n decimalB: SOL_TOKEN_DECIMALS,\n pointCount: 24,\n });\n } catch {\n return [];\n }\n }, [platform, raised, soldPercent, supply]);\n\n const path = useMemo(() => {\n if (points.length === 0) return \"\";\n const xs = points.map((point) => Number(point.totalSellSupply));\n const ys = points.map((point) => Number(point.price));\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs) || 1;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys) || 1;\n return points\n .map((point, index) => {\n const x =\n ((Number(point.totalSellSupply) - minX) / (maxX - minX || 1)) * 320;\n const y =\n 120 - ((Number(point.price) - minY) / (maxY - minY || 1)) * 100;\n return `${index === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [points]);\n\n return (\n <div className=\"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden\">\n <h2 className=\"text-sm font-medium\">{t(\"launchpad.curve_preview\")}</h2>\n <svg\n viewBox=\"0 0 320 140\"\n className=\"w-full h-40\"\n role=\"img\"\n aria-label={t(\"launchpad.curve_preview\")}\n >\n <path\n d={path}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"text-primary\"\n />\n </svg>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Textarea } from \"@liberfi.io/ui\";\nimport { LAUNCHPAD_FIELD_CLASS_NAMES } from \"./form-control-theme\";\nimport { useLaunchpadUiPorts, type GeneratedMemeInfo } from \"./ports\";\n\nexport type MagicLaunchProps = {\n prompt?: string;\n onGenerate?: (result: GeneratedMemeInfo) => void;\n};\n\nexport function MagicLaunch({ prompt = \"\", onGenerate }: MagicLaunchProps) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [value, setValue] = useState(prompt);\n const [pending, setPending] = useState(false);\n const tooLong = value.length > 300;\n const canGenerate =\n value.length > 0 && !tooLong && !!ports.generateMeme && !pending;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center\">\n <span\n className=\"font-semibold text-sm\"\n style={{\n backgroundImage:\n \"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {t(\"launchpad.magic_launch\")}\n </span>\n <span\n className={cn(\"text-xs\", tooLong ? \"text-danger\" : \"text-text-muted\")}\n >\n {value.length}/300\n </span>\n </div>\n <Textarea\n minRows={2}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={value}\n onValueChange={setValue}\n placeholder={t(\"launchpad.magic_launch_explained\")}\n />\n <Button\n color=\"primary\"\n isDisabled={!canGenerate}\n isLoading={pending}\n onPress={() => {\n void ports.requireAuth(async () => {\n if (!ports.generateMeme) return;\n setPending(true);\n try {\n const result = await ports.generateMeme(value);\n onGenerate?.(result);\n } finally {\n setPending(false);\n }\n });\n }}\n >\n {t(\"launchpad.magic_launch_submit\")}\n </Button>\n </div>\n );\n}\n","import { useCallback, useState, type Key } from \"react\";\nimport { LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\nimport { Image, Tab, Tabs, cn } from \"@liberfi.io/ui\";\nimport {\n LaunchPadCreateForm,\n type LaunchPadCreateFormValues,\n} from \"./LaunchPadCreateForm\";\nimport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nimport { MagicLaunch } from \"./MagicLaunch\";\nimport { LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES } from \"./form-control-theme\";\nimport type { GeneratedMemeInfo } from \"./ports\";\n\nconst PLATFORMS = [\n {\n platform: LaunchPadPlatform.PUMPFUN,\n name: \"Pump\",\n icon: \"/images/launchpad/pumpfun.svg\",\n },\n {\n platform: LaunchPadPlatform.RAYDIUM,\n name: \"Raydium\",\n icon: \"/images/launchpad/raydium.svg\",\n },\n] as const;\n\nexport interface LaunchPadHomeProps {\n prompt?: string;\n image?: string;\n}\n\nexport function LaunchPadHome({ prompt, image }: LaunchPadHomeProps) {\n const [platform, setPlatform] = useState<LaunchPadPlatform>(\n LaunchPadPlatform.PUMPFUN,\n );\n const [suggestedImage, setSuggestedImage] = useState<string | undefined>(\n image,\n );\n const [suggestedName, setSuggestedName] = useState<string | undefined>(\n undefined,\n );\n const [suggestedSymbol, setSuggestedSymbol] = useState<string | undefined>(\n undefined,\n );\n const [preview, setPreview] = useState<LaunchPadCreateFormValues | null>(\n null,\n );\n\n const onGenerate = useCallback((result: GeneratedMemeInfo) => {\n setSuggestedImage(result.image);\n setSuggestedName(result.name);\n setSuggestedSymbol(result.symbol);\n }, []);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <MagicLaunch prompt={prompt} onGenerate={onGenerate} />\n <div className=\"flex-1 flex items-start justify-center gap-4\">\n <div\n className={cn(\n \"h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2\",\n )}\n >\n <Tabs\n fullWidth\n classNames={LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES}\n selectedKey={platform}\n onSelectionChange={(key: Key) =>\n setPlatform(String(key) as LaunchPadPlatform)\n }\n disableAnimation\n >\n {PLATFORMS.map((item) => (\n <Tab\n key={item.platform}\n title={\n <div className=\"flex items-center gap-2\">\n <Image\n src={item.icon}\n alt={item.name}\n width={20}\n height={20}\n />\n <span>{item.name}</span>\n </div>\n }\n />\n ))}\n </Tabs>\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.PUMPFUN}\n className={cn({ hidden: platform !== LaunchPadPlatform.PUMPFUN })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.RAYDIUM}\n className={cn({ hidden: platform !== LaunchPadPlatform.RAYDIUM })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n </div>\n <LaunchPadCurvePreview\n platform={platform}\n supply={preview?.supply}\n raised={preview?.raised}\n soldPercent={preview?.sold}\n />\n </div>\n </div>\n );\n}\n","export const PACKAGE_NAME = \"@liberfi.io/ui-launchpad\" as const;\n\nexport function LaunchpadReadyWidget() {\n return PACKAGE_NAME;\n}\n\nexport { LaunchpadCreateStatusView } from \"./create-status.view\";\nexport { LaunchPadHome, type LaunchPadHomeProps } from \"./LaunchPadHome\";\nexport { LaunchPadCreateForm } from \"./LaunchPadCreateForm\";\nexport { MagicLaunch, type MagicLaunchProps } from \"./MagicLaunch\";\nexport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nexport {\n LaunchpadUiProvider,\n useLaunchpadUiPorts,\n createInMemoryLaunchpadUiPorts,\n type LaunchpadUiPorts,\n type GeneratedMemeInfo,\n} from \"./ports\";\n"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import {createContext,createElement,useContext,useState,useRef,useEffect,useMemo,useCallback}from'react';import {cn,Input,Upload,Image,ImageGalleryIcon,toast,Textarea,NumberInput,Switch,Button,Tabs,Tab}from'@liberfi.io/ui';import {LaunchPadPlatform,createInMemoryLaunchpadPorts,createLaunchpadCreateRuntime,Curve,CurveType}from'@liberfi.io/react-launchpad';import {useTranslation}from'@liberfi.io/i18n';import {Chain}from'@liberfi.io/types';import {jsxs,jsx}from'react/jsx-runtime';function V(n){return {status:n,canSubmit:n!=="signing"&&n!=="submitting"&&n!=="uploading"&&n!=="succeeded"}}var W=createContext(null);function re({ports:n,children:d}){return createElement(W.Provider,{value:n},d)}function L(){let n=useContext(W);if(!n)throw new Error("useLaunchpadUiPorts must be used within LaunchpadUiProvider");return n}function oe(n={}){let d=createInMemoryLaunchpadPorts({signError:n.signError,uploadError:n.uploadError});return {chain:n.chain??Chain.SOLANA,requireAuth:async o=>{await o();},uploadImage:async o=>{if(n.uploadError)throw n.uploadError;return "https://ipfs.io/ipfs/memory-image"},generateMeme:n.generateMeme,createRuntime:o=>createLaunchpadCreateRuntime({...d,onChange:o})}}var j={name:"",ticker:"",image:"",description:"",website:"",twitter:"",telegram:"",supply:1e9,raised:85,sold:51,locked:0,shareFee:false};function U({platform:n,suggestedImage:d,suggestedName:o,suggestedSymbol:c,className:u,onPreviewChange:m}){let{t}=useTranslation(),l=L(),[e,p]=useState(j),[r,f]=useState({}),[b,i]=useState({status:"idle"}),[_,M]=useState(false),N=useRef(null),B=n===LaunchPadPlatform.RAYDIUM,F=V(b.status);useEffect(()=>{p(a=>({...a,name:o||a.name,ticker:c||a.ticker,image:d||a.image}));},[d,o,c]),useEffect(()=>{m?.(e);},[m,e]);let z=useMemo(()=>!e.name.trim()||!e.ticker.trim()||!e.image.trim()||!F.canSubmit||_,[_,e.image,e.name,e.ticker,F.canSubmit]),g=(a,v)=>{p(h=>({...h,[a]:v})),f(h=>({...h,[a]:void 0}));},J=()=>{let a={};return e.name.trim()?e.name.length>24&&(a.name=t("extend.launchpad.error_name_length")):a.name=t("extend.launchpad.error_name_required"),e.ticker.trim()?e.ticker.length>10&&(a.ticker=t("extend.launchpad.error_ticker_length")):a.ticker=t("extend.launchpad.error_ticker_required"),e.image.trim()||(a.image=t("extend.launchpad.error_image_required")),B&&((Number.isNaN(e.raised)||e.raised<30)&&(a.raised=t("extend.launchpad.error_raised_min")),(e.sold<51||e.sold>80)&&(a.sold=t("extend.launchpad.error_sold_min")),(e.locked<0||e.locked>30)&&(a.locked=t("extend.launchpad.error_locked_max")),e.sold+e.locked>80&&(a.sold=t("extend.launchpad.error_locked_sum_by_sold"))),f(a),Object.keys(a).length===0};return jsxs("form",{className:cn("flex flex-col gap-4",u),onSubmit:a=>{a.preventDefault(),J()&&l.requireAuth(async()=>{let h=await l.createRuntime(i).submit({chain:l.chain,name:e.name.trim(),symbol:e.ticker.trim(),platform:n,imageUri:e.image,description:e.description||void 0,website:e.website||void 0,twitter:e.twitter||void 0,telegram:e.telegram||void 0});if(h.status==="succeeded"){l.onCreated?.(h),p(j),toast.success(t("extend.launchpad.mint_transaction_submitted"));return}toast.error(h.error?.message??t("extend.launchpad.mint_transaction_error"));});},children:[jsx(Input,{label:t("extend.launchpad.name_label"),value:e.name,isInvalid:!!r.name,errorMessage:r.name,onValueChange:a=>g("name",a)}),jsx(Input,{label:t("extend.launchpad.ticker_label"),value:e.ticker,isInvalid:!!r.ticker,errorMessage:r.ticker,onValueChange:a=>g("ticker",a)}),jsxs("div",{className:"space-y-1.5",children:[jsx("h3",{className:cn("text-sm",r.image&&"text-danger"),children:t("extend.launchpad.image_label")}),jsx(Upload,{ref:N,accept:{"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"],"image/webp":[".webp"]},maxFiles:1,maxSize:10*1024*1024,noClick:true,noKeyboard:true,onDropAccepted:a=>{let v=a[0];v&&(M(true),l.uploadImage(v).then(h=>g("image",h)).catch(h=>{toast.error(h instanceof Error?h.message:t("extend.launchpad.error_image_upload"));}).finally(()=>M(false)));},children:jsx("button",{type:"button",className:"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden",onClick:()=>N.current?.open(),children:e.image?jsx(Image,{src:e.image,alt:"",className:"h-full w-full object-cover"}):jsx(ImageGalleryIcon,{width:24,height:24,className:"text-neutral"})})}),r.image?jsx("p",{className:"text-xs text-danger",children:r.image}):null]}),jsx(Textarea,{label:t("extend.launchpad.description_label"),placeholder:t("extend.launchpad.description_placeholder"),value:e.description,onValueChange:a=>g("description",a)}),jsx(Input,{label:t("extend.launchpad.website_label"),value:e.website,onValueChange:a=>g("website",a)}),jsx(Input,{label:t("extend.launchpad.twitter_label"),value:e.twitter,onValueChange:a=>g("twitter",a)}),jsx(Input,{label:t("extend.launchpad.telegram_label"),value:e.telegram,onValueChange:a=>g("telegram",a)}),B?jsxs("div",{className:"grid grid-cols-2 gap-3",children:[jsx(NumberInput,{label:t("extend.launchpad.supply_label"),value:e.supply,onValueChange:a=>g("supply",Number(a??0))}),jsx(NumberInput,{label:t("extend.launchpad.raised_label"),value:e.raised,isInvalid:!!r.raised,errorMessage:r.raised,onValueChange:a=>g("raised",Number(a??0))}),jsx(NumberInput,{label:t("extend.launchpad.sold_label"),value:e.sold,isInvalid:!!r.sold,errorMessage:r.sold,onValueChange:a=>g("sold",Number(a??0))}),jsx(NumberInput,{label:t("extend.launchpad.locked_label"),value:e.locked,isInvalid:!!r.locked,errorMessage:r.locked,onValueChange:a=>g("locked",Number(a??0))}),jsxs("div",{className:"col-span-2 flex items-center justify-between",children:[jsx("span",{className:"text-sm",children:t("extend.launchpad.share_fee_label")}),jsx(Switch,{isSelected:e.shareFee,onValueChange:a=>g("shareFee",a)})]})]}):null,jsx(Button,{type:"submit",color:"primary",isDisabled:z,isLoading:!F.canSubmit,children:t("extend.launchpad.submit")})]})}var A=6,$=9,ve="1000000000000000",Le="793100000000000",ye="35000000000",Ce="20000000";function T({platform:n,supply:d=1e9,raised:o=35,soldPercent:c=79.31}){let{t:u}=useTranslation(),m=useMemo(()=>{let l=n===LaunchPadPlatform.PUMPFUN,e=l?ve:String(Math.round(d*10**A)),p=l?Le:String(Math.round(d*(c/100)*10**A)),r=l?ye:String(Math.round(o*10**$));try{return Curve.getPoolCurvePointByInit({curveType:CurveType.CONSTANT_PRODUCT,supply:e,totalSell:p,totalLockedAmount:0,totalFundRaising:r,migrateFee:Ce,decimalA:A,decimalB:$,pointCount:24})}catch{return []}},[n,o,c,d]),t=useMemo(()=>{if(m.length===0)return "";let l=m.map(i=>Number(i.totalSellSupply)),e=m.map(i=>Number(i.price)),p=Math.min(...l),r=Math.max(...l)||1,f=Math.min(...e),b=Math.max(...e)||1;return m.map((i,_)=>{let M=(Number(i.totalSellSupply)-p)/(r-p||1)*320,N=120-(Number(i.price)-f)/(b-f||1)*100;return `${_===0?"M":"L"}${M.toFixed(1)},${N.toFixed(1)}`}).join(" ")},[m]);return jsxs("div",{className:"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden",children:[jsx("h2",{className:"text-sm font-medium",children:u("extend.launchpad.curve_preview")}),jsx("svg",{viewBox:"0 0 320 140",className:"w-full h-40",role:"img","aria-label":u("extend.launchpad.curve_preview"),children:jsx("path",{d:t,fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-primary"})})]})}function K({prompt:n="",onGenerate:d}){let{t:o}=useTranslation(),c=L(),[u,m]=useState(n),[t,l]=useState(false),e=u.length>300,p=u.length>0&&!e&&!!c.generateMeme&&!t;return jsxs("div",{className:"flex flex-col gap-2",children:[jsxs("div",{className:"flex justify-between items-center",children:[jsx("span",{className:"font-semibold text-sm",style:{backgroundImage:"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:o("extend.launchpad.magic_launch")}),jsxs("span",{className:cn("text-xs",e?"text-danger":"text-neutral"),children:[u.length,"/300"]})]}),jsx(Textarea,{minRows:2,value:u,onValueChange:m,placeholder:o("extend.launchpad.magic_launch_explained")}),jsx(Button,{color:"primary",isDisabled:!p,isLoading:t,onPress:()=>{c.requireAuth(async()=>{if(c.generateMeme){l(true);try{let r=await c.generateMeme(u);d?.(r);}finally{l(false);}}});},children:o("extend.launchpad.magic_launch_submit")})]})}var Ve=[{platform:LaunchPadPlatform.PUMPFUN,name:"Pump",icon:"/images/launchpad/pumpfun.svg"},{platform:LaunchPadPlatform.RAYDIUM,name:"Raydium",icon:"/images/launchpad/raydium.svg"}];function Ee({prompt:n,image:d}){let[o,c]=useState(LaunchPadPlatform.PUMPFUN),[u,m]=useState(d),[t,l]=useState(void 0),[e,p]=useState(void 0),[r,f]=useState(null),b=useCallback(i=>{m(i.image),l(i.name),p(i.symbol);},[]);return jsxs("div",{className:"flex flex-col gap-4",children:[jsx(K,{prompt:n,onGenerate:b}),jsxs("div",{className:"flex-1 flex items-start justify-center gap-4",children:[jsxs("div",{className:cn("h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2"),children:[jsx(Tabs,{fullWidth:true,selectedKey:o,onSelectionChange:i=>c(String(i)),disableAnimation:true,children:Ve.map(i=>jsx(Tab,{title:jsxs("div",{className:"flex items-center gap-2",children:[jsx(Image,{src:i.icon,alt:i.name,width:20,height:20}),jsx("span",{children:i.name})]})},i.platform))}),jsx(U,{platform:LaunchPadPlatform.PUMPFUN,className:cn({hidden:o!==LaunchPadPlatform.PUMPFUN}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f}),jsx(U,{platform:LaunchPadPlatform.RAYDIUM,className:cn({hidden:o!==LaunchPadPlatform.RAYDIUM}),suggestedImage:u,suggestedName:t,suggestedSymbol:e,onPreviewChange:f})]}),jsx(T,{platform:o,supply:r?.supply,raised:r?.raised,soldPercent:r?.sold})]})]})}var Ae="@liberfi.io/ui-launchpad";function ga(){return Ae}
2
- export{U as LaunchPadCreateForm,T as LaunchPadCurvePreview,Ee as LaunchPadHome,V as LaunchpadCreateStatusView,ga as LaunchpadReadyWidget,re as LaunchpadUiProvider,K as MagicLaunch,Ae as PACKAGE_NAME,oe as createInMemoryLaunchpadUiPorts,L as useLaunchpadUiPorts};//# sourceMappingURL=index.mjs.map
1
+ import {createContext,createElement,useContext,useState,useRef,useEffect,useMemo,useCallback}from'react';import {LaunchPadPlatform,createInMemoryLaunchpadPorts,createLaunchpadCreateRuntime,Curve,CurveType}from'@liberfi.io/react-launchpad';import {cn,Input,Upload,Image,ImageGalleryIcon,toast,Textarea,NumberInput,Switch,Button,Tabs,Tab}from'@liberfi.io/ui';import {useTranslation}from'@liberfi.io/i18n';import {Chain}from'@liberfi.io/types';import {jsxs,jsx}from'react/jsx-runtime';function E(r){return {status:r,canSubmit:r!=="signing"&&r!=="submitting"&&r!=="uploading"&&r!=="succeeded"}}var ae=["!bg-surface-strong/30","!border","!border-border-control/50","data-[hover=true]:!bg-surface-strong/60","data-[hover=true]:!border-border-control/80","group-data-[focus=true]:!bg-surface-strong/60","group-data-[focus=true]:!border-brand-primary/60"].join(" "),d={inputWrapper:ae,label:"text-text-secondary",input:"text-text-primary placeholder:text-text-muted"},W=["w-full h-28 rounded-lg","bg-surface-strong/30 border border-border-control/50","hover:bg-surface-strong/60 hover:border-border-control/80","focus-visible:border-brand-primary/60 focus-visible:outline-none","transition-colors","flex items-center justify-center overflow-hidden"].join(" "),j={tabList:"!bg-surface-strong/30 !border !border-border-control/50 !gap-1",tab:"data-[hover-unselected=true]:!bg-surface-strong/45 data-[hover-unselected=true]:!opacity-100",cursor:"!bg-surface-strong/60 !border !border-border-control/80 !shadow-none",tabContent:"!text-text-muted group-data-[selected=true]:!text-text-primary"};var q=createContext(null);function le({ports:r,children:u}){return createElement(q.Provider,{value:r},u)}function x(){let r=useContext(q);if(!r)throw new Error("useLaunchpadUiPorts must be used within LaunchpadUiProvider");return r}function ue(r={}){let u=createInMemoryLaunchpadPorts({signError:r.signError,uploadError:r.uploadError});return {chain:r.chain??Chain.SOLANA,requireAuth:async o=>{await o();},uploadImage:async o=>{if(r.uploadError)throw r.uploadError;return "https://ipfs.io/ipfs/memory-image"},generateMeme:r.generateMeme,createRuntime:o=>createLaunchpadCreateRuntime({...u,onChange:o})}}var X={name:"",ticker:"",image:"",description:"",website:"",twitter:"",telegram:"",supply:1e9,raised:85,sold:51,locked:0,shareFee:false};function k({platform:r,suggestedImage:u,suggestedName:o,suggestedSymbol:m,className:c,onPreviewChange:p}){let{t}=useTranslation(),l=x(),[e,g]=useState(X),[n,b]=useState({}),[v,s]=useState({status:"idle"}),[N,S]=useState(false),M=useRef(null),K=r===LaunchPadPlatform.RAYDIUM,F=E(v.status);useEffect(()=>{g(a=>({...a,name:o||a.name,ticker:m||a.ticker,image:u||a.image}));},[u,o,m]),useEffect(()=>{p?.(e);},[p,e]);let Z=useMemo(()=>!e.name.trim()||!e.ticker.trim()||!e.image.trim()||!F.canSubmit||N,[N,e.image,e.name,e.ticker,F.canSubmit]),h=(a,C)=>{g(f=>({...f,[a]:C})),b(f=>({...f,[a]:void 0}));},ee=()=>{let a={};return e.name.trim()?e.name.length>24&&(a.name=t("launchpad.error_name_length")):a.name=t("launchpad.error_name_required"),e.ticker.trim()?e.ticker.length>10&&(a.ticker=t("launchpad.error_ticker_length")):a.ticker=t("launchpad.error_ticker_required"),e.image.trim()||(a.image=t("launchpad.error_image_required")),K&&((Number.isNaN(e.raised)||e.raised<30)&&(a.raised=t("launchpad.error_raised_min")),(e.sold<51||e.sold>80)&&(a.sold=t("launchpad.error_sold_min")),(e.locked<0||e.locked>30)&&(a.locked=t("launchpad.error_locked_max")),e.sold+e.locked>80&&(a.sold=t("launchpad.error_locked_sum_by_sold"))),b(a),Object.keys(a).length===0};return jsxs("form",{className:cn("flex flex-col gap-4",c),onSubmit:a=>{a.preventDefault(),ee()&&l.requireAuth(async()=>{let f=await l.createRuntime(s).submit({chain:l.chain,name:e.name.trim(),symbol:e.ticker.trim(),platform:r,imageUri:e.image,description:e.description||void 0,website:e.website||void 0,twitter:e.twitter||void 0,telegram:e.telegram||void 0});if(f.status==="succeeded"){l.onCreated?.(f),g(X),toast.success(t("launchpad.mint_transaction_submitted"));return}toast.error(f.error?.message??t("launchpad.mint_transaction_error"));});},children:[jsx(Input,{label:t("launchpad.name_label"),classNames:d,value:e.name,isInvalid:!!n.name,errorMessage:n.name,onValueChange:a=>h("name",a)}),jsx(Input,{label:t("launchpad.ticker_label"),classNames:d,value:e.ticker,isInvalid:!!n.ticker,errorMessage:n.ticker,onValueChange:a=>h("ticker",a)}),jsxs("div",{className:"space-y-1.5",children:[jsx("h3",{className:cn("text-sm",n.image&&"text-danger"),children:t("launchpad.image_label")}),jsx(Upload,{ref:M,accept:{"image/jpeg":[".jpg",".jpeg"],"image/png":[".png"],"image/webp":[".webp"]},maxFiles:1,maxSize:10*1024*1024,noClick:true,noKeyboard:true,onDropAccepted:a=>{let C=a[0];C&&(S(true),l.uploadImage(C).then(f=>h("image",f)).catch(f=>{toast.error(f instanceof Error?f.message:t("launchpad.error_image_upload"));}).finally(()=>S(false)));},children:jsx("button",{type:"button","aria-label":t("launchpad.image_label"),className:W,onClick:()=>M.current?.open(),children:e.image?jsx(Image,{src:e.image,alt:"",className:"h-full w-full object-cover"}):jsx(ImageGalleryIcon,{width:24,height:24,className:"text-text-muted"})})}),n.image?jsx("p",{className:"text-xs text-danger",children:n.image}):null]}),jsx(Textarea,{label:t("launchpad.description_label"),classNames:d,placeholder:t("launchpad.description_placeholder"),value:e.description,onValueChange:a=>h("description",a)}),jsx(Input,{label:t("launchpad.website_label"),classNames:d,value:e.website,onValueChange:a=>h("website",a)}),jsx(Input,{label:t("launchpad.twitter_label"),classNames:d,value:e.twitter,onValueChange:a=>h("twitter",a)}),jsx(Input,{label:t("launchpad.telegram_label"),classNames:d,value:e.telegram,onValueChange:a=>h("telegram",a)}),K?jsxs("div",{className:"grid grid-cols-2 gap-3",children:[jsx(NumberInput,{label:t("launchpad.supply_label"),classNames:d,value:e.supply,onValueChange:a=>h("supply",Number(a??0))}),jsx(NumberInput,{label:t("launchpad.raised_label"),classNames:d,value:e.raised,isInvalid:!!n.raised,errorMessage:n.raised,onValueChange:a=>h("raised",Number(a??0))}),jsx(NumberInput,{label:t("launchpad.sold_label"),classNames:d,value:e.sold,isInvalid:!!n.sold,errorMessage:n.sold,onValueChange:a=>h("sold",Number(a??0))}),jsx(NumberInput,{label:t("launchpad.locked_label"),classNames:d,value:e.locked,isInvalid:!!n.locked,errorMessage:n.locked,onValueChange:a=>h("locked",Number(a??0))}),jsxs("div",{className:"col-span-2 flex items-center justify-between",children:[jsx("span",{className:"text-sm",children:t("launchpad.share_fee_label")}),jsx(Switch,{isSelected:e.shareFee,onValueChange:a=>h("shareFee",a)})]})]}):null,jsx(Button,{type:"submit",color:"primary",isDisabled:Z,isLoading:!F.canSubmit,children:t("launchpad.submit")})]})}var R=6,J=9,_e="1000000000000000",Ne="793100000000000",Se="35000000000",Me="20000000";function T({platform:r,supply:u=1e9,raised:o=35,soldPercent:m=79.31}){let{t:c}=useTranslation(),p=useMemo(()=>{let l=r===LaunchPadPlatform.PUMPFUN,e=l?_e:String(Math.round(u*10**R)),g=l?Ne:String(Math.round(u*(m/100)*10**R)),n=l?Se:String(Math.round(o*10**J));try{return Curve.getPoolCurvePointByInit({curveType:CurveType.CONSTANT_PRODUCT,supply:e,totalSell:g,totalLockedAmount:0,totalFundRaising:n,migrateFee:Me,decimalA:R,decimalB:J,pointCount:24})}catch{return []}},[r,o,m,u]),t=useMemo(()=>{if(p.length===0)return "";let l=p.map(s=>Number(s.totalSellSupply)),e=p.map(s=>Number(s.price)),g=Math.min(...l),n=Math.max(...l)||1,b=Math.min(...e),v=Math.max(...e)||1;return p.map((s,N)=>{let S=(Number(s.totalSellSupply)-g)/(n-g||1)*320,M=120-(Number(s.price)-b)/(v-b||1)*100;return `${N===0?"M":"L"}${S.toFixed(1)},${M.toFixed(1)}`}).join(" ")},[p]);return jsxs("div",{className:"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden",children:[jsx("h2",{className:"text-sm font-medium",children:c("launchpad.curve_preview")}),jsx("svg",{viewBox:"0 0 320 140",className:"w-full h-40",role:"img","aria-label":c("launchpad.curve_preview"),children:jsx("path",{d:t,fill:"none",stroke:"currentColor",strokeWidth:"2",className:"text-primary"})})]})}function H({prompt:r="",onGenerate:u}){let{t:o}=useTranslation(),m=x(),[c,p]=useState(r),[t,l]=useState(false),e=c.length>300,g=c.length>0&&!e&&!!m.generateMeme&&!t;return jsxs("div",{className:"flex flex-col gap-2",children:[jsxs("div",{className:"flex justify-between items-center",children:[jsx("span",{className:"font-semibold text-sm",style:{backgroundImage:"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},children:o("launchpad.magic_launch")}),jsxs("span",{className:cn("text-xs",e?"text-danger":"text-text-muted"),children:[c.length,"/300"]})]}),jsx(Textarea,{minRows:2,classNames:d,value:c,onValueChange:p,placeholder:o("launchpad.magic_launch_explained")}),jsx(Button,{color:"primary",isDisabled:!g,isLoading:t,onPress:()=>{m.requireAuth(async()=>{if(m.generateMeme){l(true);try{let n=await m.generateMeme(c);u?.(n);}finally{l(false);}}});},children:o("launchpad.magic_launch_submit")})]})}var De=[{platform:LaunchPadPlatform.PUMPFUN,name:"Pump",icon:"/images/launchpad/pumpfun.svg"},{platform:LaunchPadPlatform.RAYDIUM,name:"Raydium",icon:"/images/launchpad/raydium.svg"}];function Te({prompt:r,image:u}){let[o,m]=useState(LaunchPadPlatform.PUMPFUN),[c,p]=useState(u),[t,l]=useState(void 0),[e,g]=useState(void 0),[n,b]=useState(null),v=useCallback(s=>{p(s.image),l(s.name),g(s.symbol);},[]);return jsxs("div",{className:"flex flex-col gap-4",children:[jsx(H,{prompt:r,onGenerate:v}),jsxs("div",{className:"flex-1 flex items-start justify-center gap-4",children:[jsxs("div",{className:cn("h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2"),children:[jsx(Tabs,{fullWidth:true,classNames:j,selectedKey:o,onSelectionChange:s=>m(String(s)),disableAnimation:true,children:De.map(s=>jsx(Tab,{title:jsxs("div",{className:"flex items-center gap-2",children:[jsx(Image,{src:s.icon,alt:s.name,width:20,height:20}),jsx("span",{children:s.name})]})},s.platform))}),jsx(k,{platform:LaunchPadPlatform.PUMPFUN,className:cn({hidden:o!==LaunchPadPlatform.PUMPFUN}),suggestedImage:c,suggestedName:t,suggestedSymbol:e,onPreviewChange:b}),jsx(k,{platform:LaunchPadPlatform.RAYDIUM,className:cn({hidden:o!==LaunchPadPlatform.RAYDIUM}),suggestedImage:c,suggestedName:t,suggestedSymbol:e,onPreviewChange:b})]}),jsx(T,{platform:o,supply:n?.supply,raised:n?.raised,soldPercent:n?.sold})]})]})}var Oe="@liberfi.io/ui-launchpad";function xa(){return Oe}
2
+ export{k as LaunchPadCreateForm,T as LaunchPadCurvePreview,Te as LaunchPadHome,E as LaunchpadCreateStatusView,xa as LaunchpadReadyWidget,le as LaunchpadUiProvider,H as MagicLaunch,Oe as PACKAGE_NAME,ue as createInMemoryLaunchpadUiPorts,x as useLaunchpadUiPorts};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/create-status.view.ts","../src/ports.tsx","../src/LaunchPadCreateForm.tsx","../src/LaunchPadCurvePreview.tsx","../src/MagicLaunch.tsx","../src/LaunchPadHome.tsx","../src/index.ts"],"names":["LaunchpadCreateStatusView","status","LaunchpadUiPortsContext","createContext","LaunchpadUiProvider","ports","children","createElement","useLaunchpadUiPorts","useContext","createInMemoryLaunchpadUiPorts","options","memory","createInMemoryLaunchpadPorts","Chain","action","file","onChange","createLaunchpadCreateRuntime","DEFAULT_VALUES","LaunchPadCreateForm","platform","suggestedImage","suggestedName","suggestedSymbol","className","onPreviewChange","useTranslation","values","setValues","useState","errors","setErrors","snapshot","setSnapshot","uploading","setUploading","uploaderRef","useRef","isRaydium","LaunchPadPlatform","view","useEffect","current","disabled","useMemo","setField","key","value","validate","next","jsxs","cn","event","result","toast","jsx","Input","Upload","files","url","error","Image","ImageGalleryIcon","Textarea","NumberInput","Switch","Button","NEW_TOKEN_DECIMALS","SOL_TOKEN_DECIMALS","PUMP_SUPPLY","PUMP_SOLD","PUMP_RAISED","PUMP_MIGRATE_FEE","LaunchPadCurvePreview","supply","raised","soldPercent","t","points","isPump","supplyValue","soldValue","raisedValue","Curve","CurveType","path","xs","point","ys","minX","maxX","minY","maxY","index","x","y","MagicLaunch","prompt","onGenerate","setValue","pending","setPending","tooLong","canGenerate","PLATFORMS","LaunchPadHome","image","setPlatform","setSuggestedImage","setSuggestedName","setSuggestedSymbol","preview","setPreview","useCallback","Tabs","item","Tab","PACKAGE_NAME","LaunchpadReadyWidget"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { LaunchpadCreateStatus } from \"@liberfi.io/react-launchpad\";\n\nexport function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {\n status: LaunchpadCreateStatus;\n canSubmit: boolean;\n} {\n return {\n status,\n canSubmit:\n status !== \"signing\" &&\n status !== \"submitting\" &&\n status !== \"uploading\" &&\n status !== \"succeeded\",\n };\n}\n","import {\n createContext,\n createElement,\n useContext,\n type PropsWithChildren,\n} from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n createInMemoryLaunchpadPorts,\n createLaunchpadCreateRuntime,\n type LaunchpadCreateRuntime,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\n\nexport type GeneratedMemeInfo = {\n symbol: string;\n name?: string;\n image?: string;\n};\n\nexport type LaunchpadUiPorts = {\n chain: Chain;\n requireAuth: (action: () => Promise<void>) => Promise<void>;\n uploadImage: (file: File) => Promise<string>;\n createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;\n generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;\n onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;\n};\n\nconst LaunchpadUiPortsContext = createContext<LaunchpadUiPorts | null>(null);\n\nexport function LaunchpadUiProvider({\n ports,\n children,\n}: PropsWithChildren<{ ports: LaunchpadUiPorts }>) {\n return createElement(LaunchpadUiPortsContext.Provider, { value: ports }, children);\n}\n\nexport function useLaunchpadUiPorts(): LaunchpadUiPorts {\n const ports = useContext(LaunchpadUiPortsContext);\n if (!ports) {\n throw new Error(\"useLaunchpadUiPorts must be used within LaunchpadUiProvider\");\n }\n return ports;\n}\n\nexport function createInMemoryLaunchpadUiPorts(\n options: {\n chain?: Chain;\n generateMeme?: LaunchpadUiPorts[\"generateMeme\"];\n signError?: Error;\n uploadError?: Error;\n } = {},\n): LaunchpadUiPorts {\n const memory = createInMemoryLaunchpadPorts({\n signError: options.signError,\n uploadError: options.uploadError,\n });\n return {\n chain: options.chain ?? Chain.SOLANA,\n requireAuth: async (action) => {\n await action();\n },\n uploadImage: async (file) => {\n void file;\n if (options.uploadError) throw options.uploadError;\n return \"https://ipfs.io/ipfs/memory-image\";\n },\n generateMeme: options.generateMeme,\n createRuntime: (onChange) =>\n createLaunchpadCreateRuntime({\n ...memory,\n onChange,\n }),\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n LaunchPadPlatform,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\nimport {\n Button,\n cn,\n Image,\n ImageGalleryIcon,\n Input,\n NumberInput,\n Switch,\n Textarea,\n toast,\n Upload,\n type UploadRef,\n} from \"@liberfi.io/ui\";\nimport { LaunchpadCreateStatusView } from \"./create-status.view\";\nimport { useLaunchpadUiPorts } from \"./ports\";\n\nexport type LaunchPadCreateFormValues = {\n name: string;\n ticker: string;\n image: string;\n description: string;\n website: string;\n twitter: string;\n telegram: string;\n supply: number;\n raised: number;\n sold: number;\n locked: number;\n shareFee: boolean;\n};\n\nconst DEFAULT_VALUES: LaunchPadCreateFormValues = {\n name: \"\",\n ticker: \"\",\n image: \"\",\n description: \"\",\n website: \"\",\n twitter: \"\",\n telegram: \"\",\n supply: 1e9,\n raised: 85,\n sold: 51,\n locked: 0,\n shareFee: false,\n};\n\nexport function LaunchPadCreateForm({\n platform,\n suggestedImage,\n suggestedName,\n suggestedSymbol,\n className,\n onPreviewChange,\n}: {\n platform: LaunchPadPlatform;\n suggestedImage?: string;\n suggestedName?: string;\n suggestedSymbol?: string;\n className?: string;\n onPreviewChange?: (values: LaunchPadCreateFormValues) => void;\n}) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [values, setValues] = useState<LaunchPadCreateFormValues>(DEFAULT_VALUES);\n const [errors, setErrors] = useState<Partial<Record<keyof LaunchPadCreateFormValues, string>>>({});\n const [snapshot, setSnapshot] = useState<LaunchpadCreateSnapshot>({ status: \"idle\" });\n const [uploading, setUploading] = useState(false);\n const uploaderRef = useRef<UploadRef>(null);\n const isRaydium = platform === LaunchPadPlatform.RAYDIUM;\n const view = LaunchpadCreateStatusView(snapshot.status);\n\n useEffect(() => {\n setValues((current) => ({\n ...current,\n name: suggestedName || current.name,\n ticker: suggestedSymbol || current.ticker,\n image: suggestedImage || current.image,\n }));\n }, [suggestedImage, suggestedName, suggestedSymbol]);\n\n useEffect(() => {\n onPreviewChange?.(values);\n }, [onPreviewChange, values]);\n\n const disabled = useMemo(\n () =>\n !values.name.trim() ||\n !values.ticker.trim() ||\n !values.image.trim() ||\n !view.canSubmit ||\n uploading,\n [uploading, values.image, values.name, values.ticker, view.canSubmit],\n );\n\n const setField = <K extends keyof LaunchPadCreateFormValues>(\n key: K,\n value: LaunchPadCreateFormValues[K],\n ) => {\n setValues((current) => ({ ...current, [key]: value }));\n setErrors((current) => ({ ...current, [key]: undefined }));\n };\n\n const validate = (): boolean => {\n const next: Partial<Record<keyof LaunchPadCreateFormValues, string>> = {};\n if (!values.name.trim()) next.name = t(\"extend.launchpad.error_name_required\");\n else if (values.name.length > 24) next.name = t(\"extend.launchpad.error_name_length\");\n if (!values.ticker.trim()) next.ticker = t(\"extend.launchpad.error_ticker_required\");\n else if (values.ticker.length > 10) next.ticker = t(\"extend.launchpad.error_ticker_length\");\n if (!values.image.trim()) next.image = t(\"extend.launchpad.error_image_required\");\n if (isRaydium) {\n if (Number.isNaN(values.raised) || values.raised < 30) {\n next.raised = t(\"extend.launchpad.error_raised_min\");\n }\n if (values.sold < 51 || values.sold > 80) next.sold = t(\"extend.launchpad.error_sold_min\");\n if (values.locked < 0 || values.locked > 30) next.locked = t(\"extend.launchpad.error_locked_max\");\n if (values.sold + values.locked > 80) next.sold = t(\"extend.launchpad.error_locked_sum_by_sold\");\n }\n setErrors(next);\n return Object.keys(next).length === 0;\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event) => {\n event.preventDefault();\n if (!validate()) return;\n void ports.requireAuth(async () => {\n const runtime = ports.createRuntime(setSnapshot);\n const result = await runtime.submit({\n chain: ports.chain,\n name: values.name.trim(),\n symbol: values.ticker.trim(),\n platform,\n imageUri: values.image,\n description: values.description || undefined,\n website: values.website || undefined,\n twitter: values.twitter || undefined,\n telegram: values.telegram || undefined,\n });\n if (result.status === \"succeeded\") {\n ports.onCreated?.(result);\n setValues(DEFAULT_VALUES);\n toast.success(t(\"extend.launchpad.mint_transaction_submitted\"));\n return;\n }\n toast.error(result.error?.message ?? t(\"extend.launchpad.mint_transaction_error\"));\n });\n }}\n >\n <Input\n label={t(\"extend.launchpad.name_label\")}\n value={values.name}\n isInvalid={!!errors.name}\n errorMessage={errors.name}\n onValueChange={(value) => setField(\"name\", value)}\n />\n <Input\n label={t(\"extend.launchpad.ticker_label\")}\n value={values.ticker}\n isInvalid={!!errors.ticker}\n errorMessage={errors.ticker}\n onValueChange={(value) => setField(\"ticker\", value)}\n />\n <div className=\"space-y-1.5\">\n <h3 className={cn(\"text-sm\", errors.image && \"text-danger\")}>\n {t(\"extend.launchpad.image_label\")}\n </h3>\n <Upload\n ref={uploaderRef}\n accept={{ \"image/jpeg\": [\".jpg\", \".jpeg\"], \"image/png\": [\".png\"], \"image/webp\": [\".webp\"] }}\n maxFiles={1}\n maxSize={10 * 1024 * 1024}\n noClick\n noKeyboard\n onDropAccepted={(files) => {\n const file = files[0];\n if (!file) return;\n setUploading(true);\n void ports\n .uploadImage(file)\n .then((url) => setField(\"image\", url))\n .catch((error: unknown) => {\n toast.error(\n error instanceof Error ? error.message : t(\"extend.launchpad.error_image_upload\"),\n );\n })\n .finally(() => setUploading(false));\n }}\n >\n <button\n type=\"button\"\n className=\"w-full h-28 rounded-lg bg-content2 flex items-center justify-center overflow-hidden\"\n onClick={() => uploaderRef.current?.open()}\n >\n {values.image ? (\n <Image src={values.image} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n <ImageGalleryIcon width={24} height={24} className=\"text-neutral\" />\n )}\n </button>\n </Upload>\n {errors.image ? <p className=\"text-xs text-danger\">{errors.image}</p> : null}\n </div>\n <Textarea\n label={t(\"extend.launchpad.description_label\")}\n placeholder={t(\"extend.launchpad.description_placeholder\")}\n value={values.description}\n onValueChange={(value) => setField(\"description\", value)}\n />\n <Input\n label={t(\"extend.launchpad.website_label\")}\n value={values.website}\n onValueChange={(value) => setField(\"website\", value)}\n />\n <Input\n label={t(\"extend.launchpad.twitter_label\")}\n value={values.twitter}\n onValueChange={(value) => setField(\"twitter\", value)}\n />\n <Input\n label={t(\"extend.launchpad.telegram_label\")}\n value={values.telegram}\n onValueChange={(value) => setField(\"telegram\", value)}\n />\n {isRaydium ? (\n <div className=\"grid grid-cols-2 gap-3\">\n <NumberInput\n label={t(\"extend.launchpad.supply_label\")}\n value={values.supply}\n onValueChange={(value) => setField(\"supply\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.raised_label\")}\n value={values.raised}\n isInvalid={!!errors.raised}\n errorMessage={errors.raised}\n onValueChange={(value) => setField(\"raised\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.sold_label\")}\n value={values.sold}\n isInvalid={!!errors.sold}\n errorMessage={errors.sold}\n onValueChange={(value) => setField(\"sold\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"extend.launchpad.locked_label\")}\n value={values.locked}\n isInvalid={!!errors.locked}\n errorMessage={errors.locked}\n onValueChange={(value) => setField(\"locked\", Number(value ?? 0))}\n />\n <div className=\"col-span-2 flex items-center justify-between\">\n <span className=\"text-sm\">{t(\"extend.launchpad.share_fee_label\")}</span>\n <Switch\n isSelected={values.shareFee}\n onValueChange={(value) => setField(\"shareFee\", value)}\n />\n </div>\n </div>\n ) : null}\n <Button type=\"submit\" color=\"primary\" isDisabled={disabled} isLoading={!view.canSubmit}>\n {t(\"extend.launchpad.submit\")}\n </Button>\n </form>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Curve, CurveType, LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\n\nconst NEW_TOKEN_DECIMALS = 6;\nconst SOL_TOKEN_DECIMALS = 9;\nconst PUMP_SUPPLY = \"1000000000000000\";\nconst PUMP_SOLD = \"793100000000000\";\nconst PUMP_RAISED = \"35000000000\";\nconst PUMP_MIGRATE_FEE = \"20000000\";\n\nexport function LaunchPadCurvePreview({\n platform,\n supply = 1e9,\n raised = 35,\n soldPercent = 79.31,\n}: {\n platform: LaunchPadPlatform;\n supply?: number;\n raised?: number;\n soldPercent?: number;\n}) {\n const { t } = useTranslation();\n const points = useMemo(() => {\n const isPump = platform === LaunchPadPlatform.PUMPFUN;\n const supplyValue = isPump\n ? PUMP_SUPPLY\n : String(Math.round(supply * 10 ** NEW_TOKEN_DECIMALS));\n const soldValue = isPump\n ? PUMP_SOLD\n : String(Math.round(supply * (soldPercent / 100) * 10 ** NEW_TOKEN_DECIMALS));\n const raisedValue = isPump\n ? PUMP_RAISED\n : String(Math.round(raised * 10 ** SOL_TOKEN_DECIMALS));\n try {\n return Curve.getPoolCurvePointByInit({\n curveType: CurveType.CONSTANT_PRODUCT,\n supply: supplyValue,\n totalSell: soldValue,\n totalLockedAmount: 0,\n totalFundRaising: raisedValue,\n migrateFee: PUMP_MIGRATE_FEE,\n decimalA: NEW_TOKEN_DECIMALS,\n decimalB: SOL_TOKEN_DECIMALS,\n pointCount: 24,\n });\n } catch {\n return [];\n }\n }, [platform, raised, soldPercent, supply]);\n\n const path = useMemo(() => {\n if (points.length === 0) return \"\";\n const xs = points.map((point) => Number(point.totalSellSupply));\n const ys = points.map((point) => Number(point.price));\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs) || 1;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys) || 1;\n return points\n .map((point, index) => {\n const x = ((Number(point.totalSellSupply) - minX) / (maxX - minX || 1)) * 320;\n const y = 120 - ((Number(point.price) - minY) / (maxY - minY || 1)) * 100;\n return `${index === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [points]);\n\n return (\n <div className=\"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden\">\n <h2 className=\"text-sm font-medium\">{t(\"extend.launchpad.curve_preview\")}</h2>\n <svg viewBox=\"0 0 320 140\" className=\"w-full h-40\" role=\"img\" aria-label={t(\"extend.launchpad.curve_preview\")}>\n <path d={path} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"text-primary\" />\n </svg>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Textarea } from \"@liberfi.io/ui\";\nimport { useLaunchpadUiPorts, type GeneratedMemeInfo } from \"./ports\";\n\nexport type MagicLaunchProps = {\n prompt?: string;\n onGenerate?: (result: GeneratedMemeInfo) => void;\n};\n\nexport function MagicLaunch({ prompt = \"\", onGenerate }: MagicLaunchProps) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [value, setValue] = useState(prompt);\n const [pending, setPending] = useState(false);\n const tooLong = value.length > 300;\n const canGenerate = value.length > 0 && !tooLong && !!ports.generateMeme && !pending;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center\">\n <span\n className=\"font-semibold text-sm\"\n style={{\n backgroundImage: \"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {t(\"extend.launchpad.magic_launch\")}\n </span>\n <span className={cn(\"text-xs\", tooLong ? \"text-danger\" : \"text-neutral\")}>\n {value.length}/300\n </span>\n </div>\n <Textarea\n minRows={2}\n value={value}\n onValueChange={setValue}\n placeholder={t(\"extend.launchpad.magic_launch_explained\")}\n />\n <Button\n color=\"primary\"\n isDisabled={!canGenerate}\n isLoading={pending}\n onPress={() => {\n void ports.requireAuth(async () => {\n if (!ports.generateMeme) return;\n setPending(true);\n try {\n const result = await ports.generateMeme(value);\n onGenerate?.(result);\n } finally {\n setPending(false);\n }\n });\n }}\n >\n {t(\"extend.launchpad.magic_launch_submit\")}\n </Button>\n </div>\n );\n}\n","import { useCallback, useState, type Key } from \"react\";\nimport { Image, Tab, Tabs, cn } from \"@liberfi.io/ui\";\nimport { LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\nimport { LaunchPadCreateForm, type LaunchPadCreateFormValues } from \"./LaunchPadCreateForm\";\nimport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nimport { MagicLaunch } from \"./MagicLaunch\";\nimport type { GeneratedMemeInfo } from \"./ports\";\n\nconst PLATFORMS = [\n { platform: LaunchPadPlatform.PUMPFUN, name: \"Pump\", icon: \"/images/launchpad/pumpfun.svg\" },\n { platform: LaunchPadPlatform.RAYDIUM, name: \"Raydium\", icon: \"/images/launchpad/raydium.svg\" },\n] as const;\n\nexport interface LaunchPadHomeProps {\n prompt?: string;\n image?: string;\n}\n\nexport function LaunchPadHome({ prompt, image }: LaunchPadHomeProps) {\n const [platform, setPlatform] = useState<LaunchPadPlatform>(LaunchPadPlatform.PUMPFUN);\n const [suggestedImage, setSuggestedImage] = useState<string | undefined>(image);\n const [suggestedName, setSuggestedName] = useState<string | undefined>(undefined);\n const [suggestedSymbol, setSuggestedSymbol] = useState<string | undefined>(undefined);\n const [preview, setPreview] = useState<LaunchPadCreateFormValues | null>(null);\n\n const onGenerate = useCallback((result: GeneratedMemeInfo) => {\n setSuggestedImage(result.image);\n setSuggestedName(result.name);\n setSuggestedSymbol(result.symbol);\n }, []);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <MagicLaunch prompt={prompt} onGenerate={onGenerate} />\n <div className=\"flex-1 flex items-start justify-center gap-4\">\n <div className={cn(\"h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2\")}>\n <Tabs\n fullWidth\n selectedKey={platform}\n onSelectionChange={(key: Key) => setPlatform(String(key) as LaunchPadPlatform)}\n disableAnimation\n >\n {PLATFORMS.map((item) => (\n <Tab\n key={item.platform}\n title={\n <div className=\"flex items-center gap-2\">\n <Image src={item.icon} alt={item.name} width={20} height={20} />\n <span>{item.name}</span>\n </div>\n }\n />\n ))}\n </Tabs>\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.PUMPFUN}\n className={cn({ hidden: platform !== LaunchPadPlatform.PUMPFUN })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.RAYDIUM}\n className={cn({ hidden: platform !== LaunchPadPlatform.RAYDIUM })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n </div>\n <LaunchPadCurvePreview\n platform={platform}\n supply={preview?.supply}\n raised={preview?.raised}\n soldPercent={preview?.sold}\n />\n </div>\n </div>\n );\n}\n","export const PACKAGE_NAME = \"@liberfi.io/ui-launchpad\" as const;\n\nexport function LaunchpadReadyWidget() {\n return PACKAGE_NAME;\n}\n\nexport { LaunchpadCreateStatusView } from \"./create-status.view\";\nexport { LaunchPadHome, type LaunchPadHomeProps } from \"./LaunchPadHome\";\nexport { LaunchPadCreateForm } from \"./LaunchPadCreateForm\";\nexport { MagicLaunch, type MagicLaunchProps } from \"./MagicLaunch\";\nexport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nexport {\n LaunchpadUiProvider,\n useLaunchpadUiPorts,\n createInMemoryLaunchpadUiPorts,\n type LaunchpadUiPorts,\n type GeneratedMemeInfo,\n} from \"./ports\";\n"]}
1
+ {"version":3,"sources":["../src/create-status.view.ts","../src/form-control-theme.ts","../src/ports.tsx","../src/LaunchPadCreateForm.tsx","../src/LaunchPadCurvePreview.tsx","../src/MagicLaunch.tsx","../src/LaunchPadHome.tsx","../src/index.ts"],"names":["LaunchpadCreateStatusView","status","LAUNCHPAD_FIELD_WRAPPER_CLASS","LAUNCHPAD_FIELD_CLASS_NAMES","LAUNCHPAD_UPLOAD_BUTTON_CLASS","LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES","LaunchpadUiPortsContext","createContext","LaunchpadUiProvider","ports","children","createElement","useLaunchpadUiPorts","useContext","createInMemoryLaunchpadUiPorts","options","memory","createInMemoryLaunchpadPorts","Chain","action","file","onChange","createLaunchpadCreateRuntime","DEFAULT_VALUES","LaunchPadCreateForm","platform","suggestedImage","suggestedName","suggestedSymbol","className","onPreviewChange","useTranslation","values","setValues","useState","errors","setErrors","snapshot","setSnapshot","uploading","setUploading","uploaderRef","useRef","isRaydium","LaunchPadPlatform","view","useEffect","current","disabled","useMemo","setField","key","value","validate","next","jsxs","cn","event","result","toast","jsx","Input","Upload","files","url","error","Image","ImageGalleryIcon","Textarea","NumberInput","Switch","Button","NEW_TOKEN_DECIMALS","SOL_TOKEN_DECIMALS","PUMP_SUPPLY","PUMP_SOLD","PUMP_RAISED","PUMP_MIGRATE_FEE","LaunchPadCurvePreview","supply","raised","soldPercent","t","points","isPump","supplyValue","soldValue","raisedValue","Curve","CurveType","path","xs","point","ys","minX","maxX","minY","maxY","index","x","y","MagicLaunch","prompt","onGenerate","setValue","pending","setPending","tooLong","canGenerate","PLATFORMS","LaunchPadHome","image","setPlatform","setSuggestedImage","setSuggestedName","setSuggestedSymbol","preview","setPreview","useCallback","Tabs","item","Tab","PACKAGE_NAME","LaunchpadReadyWidget"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { LaunchpadCreateStatus } from \"@liberfi.io/react-launchpad\";\n\nexport function LaunchpadCreateStatusView(status: LaunchpadCreateStatus): {\n status: LaunchpadCreateStatus;\n canSubmit: boolean;\n} {\n return {\n status,\n canSubmit:\n status !== \"signing\" &&\n status !== \"submitting\" &&\n status !== \"uploading\" &&\n status !== \"succeeded\",\n };\n}\n","const LAUNCHPAD_FIELD_WRAPPER_CLASS = [\n \"!bg-surface-strong/30\",\n \"!border\",\n \"!border-border-control/50\",\n \"data-[hover=true]:!bg-surface-strong/60\",\n \"data-[hover=true]:!border-border-control/80\",\n \"group-data-[focus=true]:!bg-surface-strong/60\",\n \"group-data-[focus=true]:!border-brand-primary/60\",\n].join(\" \");\n\nexport const LAUNCHPAD_FIELD_CLASS_NAMES = {\n inputWrapper: LAUNCHPAD_FIELD_WRAPPER_CLASS,\n label: \"text-text-secondary\",\n input: \"text-text-primary placeholder:text-text-muted\",\n} as const;\n\nexport const LAUNCHPAD_UPLOAD_BUTTON_CLASS = [\n \"w-full h-28 rounded-lg\",\n \"bg-surface-strong/30 border border-border-control/50\",\n \"hover:bg-surface-strong/60 hover:border-border-control/80\",\n \"focus-visible:border-brand-primary/60 focus-visible:outline-none\",\n \"transition-colors\",\n \"flex items-center justify-center overflow-hidden\",\n].join(\" \");\n\nexport const LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES = {\n tabList: \"!bg-surface-strong/30 !border !border-border-control/50 !gap-1\",\n tab: \"data-[hover-unselected=true]:!bg-surface-strong/45 data-[hover-unselected=true]:!opacity-100\",\n cursor:\n \"!bg-surface-strong/60 !border !border-border-control/80 !shadow-none\",\n tabContent: \"!text-text-muted group-data-[selected=true]:!text-text-primary\",\n} as const;\n","import {\n createContext,\n createElement,\n useContext,\n type PropsWithChildren,\n} from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n createInMemoryLaunchpadPorts,\n createLaunchpadCreateRuntime,\n type LaunchpadCreateRuntime,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\n\nexport type GeneratedMemeInfo = {\n symbol: string;\n name?: string;\n image?: string;\n};\n\nexport type LaunchpadUiPorts = {\n chain: Chain;\n requireAuth: (action: () => Promise<void>) => Promise<void>;\n uploadImage: (file: File) => Promise<string>;\n createRuntime: (onChange?: (snapshot: LaunchpadCreateSnapshot) => void) => LaunchpadCreateRuntime;\n generateMeme?: (prompt: string) => Promise<GeneratedMemeInfo>;\n onCreated?: (snapshot: LaunchpadCreateSnapshot) => void;\n};\n\nconst LaunchpadUiPortsContext = createContext<LaunchpadUiPorts | null>(null);\n\nexport function LaunchpadUiProvider({\n ports,\n children,\n}: PropsWithChildren<{ ports: LaunchpadUiPorts }>) {\n return createElement(LaunchpadUiPortsContext.Provider, { value: ports }, children);\n}\n\nexport function useLaunchpadUiPorts(): LaunchpadUiPorts {\n const ports = useContext(LaunchpadUiPortsContext);\n if (!ports) {\n throw new Error(\"useLaunchpadUiPorts must be used within LaunchpadUiProvider\");\n }\n return ports;\n}\n\nexport function createInMemoryLaunchpadUiPorts(\n options: {\n chain?: Chain;\n generateMeme?: LaunchpadUiPorts[\"generateMeme\"];\n signError?: Error;\n uploadError?: Error;\n } = {},\n): LaunchpadUiPorts {\n const memory = createInMemoryLaunchpadPorts({\n signError: options.signError,\n uploadError: options.uploadError,\n });\n return {\n chain: options.chain ?? Chain.SOLANA,\n requireAuth: async (action) => {\n await action();\n },\n uploadImage: async (file) => {\n void file;\n if (options.uploadError) throw options.uploadError;\n return \"https://ipfs.io/ipfs/memory-image\";\n },\n generateMeme: options.generateMeme,\n createRuntime: (onChange) =>\n createLaunchpadCreateRuntime({\n ...memory,\n onChange,\n }),\n };\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n LaunchPadPlatform,\n type LaunchpadCreateSnapshot,\n} from \"@liberfi.io/react-launchpad\";\nimport {\n Button,\n cn,\n Image,\n ImageGalleryIcon,\n Input,\n NumberInput,\n Switch,\n Textarea,\n toast,\n Upload,\n type UploadRef,\n} from \"@liberfi.io/ui\";\nimport { LaunchpadCreateStatusView } from \"./create-status.view\";\nimport {\n LAUNCHPAD_FIELD_CLASS_NAMES,\n LAUNCHPAD_UPLOAD_BUTTON_CLASS,\n} from \"./form-control-theme\";\nimport { useLaunchpadUiPorts } from \"./ports\";\n\nexport type LaunchPadCreateFormValues = {\n name: string;\n ticker: string;\n image: string;\n description: string;\n website: string;\n twitter: string;\n telegram: string;\n supply: number;\n raised: number;\n sold: number;\n locked: number;\n shareFee: boolean;\n};\n\nconst DEFAULT_VALUES: LaunchPadCreateFormValues = {\n name: \"\",\n ticker: \"\",\n image: \"\",\n description: \"\",\n website: \"\",\n twitter: \"\",\n telegram: \"\",\n supply: 1e9,\n raised: 85,\n sold: 51,\n locked: 0,\n shareFee: false,\n};\n\nexport function LaunchPadCreateForm({\n platform,\n suggestedImage,\n suggestedName,\n suggestedSymbol,\n className,\n onPreviewChange,\n}: {\n platform: LaunchPadPlatform;\n suggestedImage?: string;\n suggestedName?: string;\n suggestedSymbol?: string;\n className?: string;\n onPreviewChange?: (values: LaunchPadCreateFormValues) => void;\n}) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [values, setValues] =\n useState<LaunchPadCreateFormValues>(DEFAULT_VALUES);\n const [errors, setErrors] = useState<\n Partial<Record<keyof LaunchPadCreateFormValues, string>>\n >({});\n const [snapshot, setSnapshot] = useState<LaunchpadCreateSnapshot>({\n status: \"idle\",\n });\n const [uploading, setUploading] = useState(false);\n const uploaderRef = useRef<UploadRef>(null);\n const isRaydium = platform === LaunchPadPlatform.RAYDIUM;\n const view = LaunchpadCreateStatusView(snapshot.status);\n\n useEffect(() => {\n setValues((current) => ({\n ...current,\n name: suggestedName || current.name,\n ticker: suggestedSymbol || current.ticker,\n image: suggestedImage || current.image,\n }));\n }, [suggestedImage, suggestedName, suggestedSymbol]);\n\n useEffect(() => {\n onPreviewChange?.(values);\n }, [onPreviewChange, values]);\n\n const disabled = useMemo(\n () =>\n !values.name.trim() ||\n !values.ticker.trim() ||\n !values.image.trim() ||\n !view.canSubmit ||\n uploading,\n [uploading, values.image, values.name, values.ticker, view.canSubmit],\n );\n\n const setField = <K extends keyof LaunchPadCreateFormValues>(\n key: K,\n value: LaunchPadCreateFormValues[K],\n ) => {\n setValues((current) => ({ ...current, [key]: value }));\n setErrors((current) => ({ ...current, [key]: undefined }));\n };\n\n const validate = (): boolean => {\n const next: Partial<Record<keyof LaunchPadCreateFormValues, string>> = {};\n if (!values.name.trim()) next.name = t(\"launchpad.error_name_required\");\n else if (values.name.length > 24)\n next.name = t(\"launchpad.error_name_length\");\n if (!values.ticker.trim())\n next.ticker = t(\"launchpad.error_ticker_required\");\n else if (values.ticker.length > 10)\n next.ticker = t(\"launchpad.error_ticker_length\");\n if (!values.image.trim()) next.image = t(\"launchpad.error_image_required\");\n if (isRaydium) {\n if (Number.isNaN(values.raised) || values.raised < 30) {\n next.raised = t(\"launchpad.error_raised_min\");\n }\n if (values.sold < 51 || values.sold > 80)\n next.sold = t(\"launchpad.error_sold_min\");\n if (values.locked < 0 || values.locked > 30)\n next.locked = t(\"launchpad.error_locked_max\");\n if (values.sold + values.locked > 80)\n next.sold = t(\"launchpad.error_locked_sum_by_sold\");\n }\n setErrors(next);\n return Object.keys(next).length === 0;\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-4\", className)}\n onSubmit={(event) => {\n event.preventDefault();\n if (!validate()) return;\n void ports.requireAuth(async () => {\n const runtime = ports.createRuntime(setSnapshot);\n const result = await runtime.submit({\n chain: ports.chain,\n name: values.name.trim(),\n symbol: values.ticker.trim(),\n platform,\n imageUri: values.image,\n description: values.description || undefined,\n website: values.website || undefined,\n twitter: values.twitter || undefined,\n telegram: values.telegram || undefined,\n });\n if (result.status === \"succeeded\") {\n ports.onCreated?.(result);\n setValues(DEFAULT_VALUES);\n toast.success(t(\"launchpad.mint_transaction_submitted\"));\n return;\n }\n toast.error(\n result.error?.message ?? t(\"launchpad.mint_transaction_error\"),\n );\n });\n }}\n >\n <Input\n label={t(\"launchpad.name_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.name}\n isInvalid={!!errors.name}\n errorMessage={errors.name}\n onValueChange={(value) => setField(\"name\", value)}\n />\n <Input\n label={t(\"launchpad.ticker_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.ticker}\n isInvalid={!!errors.ticker}\n errorMessage={errors.ticker}\n onValueChange={(value) => setField(\"ticker\", value)}\n />\n <div className=\"space-y-1.5\">\n <h3 className={cn(\"text-sm\", errors.image && \"text-danger\")}>\n {t(\"launchpad.image_label\")}\n </h3>\n <Upload\n ref={uploaderRef}\n accept={{\n \"image/jpeg\": [\".jpg\", \".jpeg\"],\n \"image/png\": [\".png\"],\n \"image/webp\": [\".webp\"],\n }}\n maxFiles={1}\n maxSize={10 * 1024 * 1024}\n noClick\n noKeyboard\n onDropAccepted={(files) => {\n const file = files[0];\n if (!file) return;\n setUploading(true);\n void ports\n .uploadImage(file)\n .then((url) => setField(\"image\", url))\n .catch((error: unknown) => {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"launchpad.error_image_upload\"),\n );\n })\n .finally(() => setUploading(false));\n }}\n >\n <button\n type=\"button\"\n aria-label={t(\"launchpad.image_label\")}\n className={LAUNCHPAD_UPLOAD_BUTTON_CLASS}\n onClick={() => uploaderRef.current?.open()}\n >\n {values.image ? (\n <Image\n src={values.image}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <ImageGalleryIcon\n width={24}\n height={24}\n className=\"text-text-muted\"\n />\n )}\n </button>\n </Upload>\n {errors.image ? (\n <p className=\"text-xs text-danger\">{errors.image}</p>\n ) : null}\n </div>\n <Textarea\n label={t(\"launchpad.description_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n placeholder={t(\"launchpad.description_placeholder\")}\n value={values.description}\n onValueChange={(value) => setField(\"description\", value)}\n />\n <Input\n label={t(\"launchpad.website_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.website}\n onValueChange={(value) => setField(\"website\", value)}\n />\n <Input\n label={t(\"launchpad.twitter_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.twitter}\n onValueChange={(value) => setField(\"twitter\", value)}\n />\n <Input\n label={t(\"launchpad.telegram_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.telegram}\n onValueChange={(value) => setField(\"telegram\", value)}\n />\n {isRaydium ? (\n <div className=\"grid grid-cols-2 gap-3\">\n <NumberInput\n label={t(\"launchpad.supply_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.supply}\n onValueChange={(value) => setField(\"supply\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"launchpad.raised_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.raised}\n isInvalid={!!errors.raised}\n errorMessage={errors.raised}\n onValueChange={(value) => setField(\"raised\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"launchpad.sold_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.sold}\n isInvalid={!!errors.sold}\n errorMessage={errors.sold}\n onValueChange={(value) => setField(\"sold\", Number(value ?? 0))}\n />\n <NumberInput\n label={t(\"launchpad.locked_label\")}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={values.locked}\n isInvalid={!!errors.locked}\n errorMessage={errors.locked}\n onValueChange={(value) => setField(\"locked\", Number(value ?? 0))}\n />\n <div className=\"col-span-2 flex items-center justify-between\">\n <span className=\"text-sm\">{t(\"launchpad.share_fee_label\")}</span>\n <Switch\n isSelected={values.shareFee}\n onValueChange={(value) => setField(\"shareFee\", value)}\n />\n </div>\n </div>\n ) : null}\n <Button\n type=\"submit\"\n color=\"primary\"\n isDisabled={disabled}\n isLoading={!view.canSubmit}\n >\n {t(\"launchpad.submit\")}\n </Button>\n </form>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Curve,\n CurveType,\n LaunchPadPlatform,\n} from \"@liberfi.io/react-launchpad\";\n\nconst NEW_TOKEN_DECIMALS = 6;\nconst SOL_TOKEN_DECIMALS = 9;\nconst PUMP_SUPPLY = \"1000000000000000\";\nconst PUMP_SOLD = \"793100000000000\";\nconst PUMP_RAISED = \"35000000000\";\nconst PUMP_MIGRATE_FEE = \"20000000\";\n\nexport function LaunchPadCurvePreview({\n platform,\n supply = 1e9,\n raised = 35,\n soldPercent = 79.31,\n}: {\n platform: LaunchPadPlatform;\n supply?: number;\n raised?: number;\n soldPercent?: number;\n}) {\n const { t } = useTranslation();\n const points = useMemo(() => {\n const isPump = platform === LaunchPadPlatform.PUMPFUN;\n const supplyValue = isPump\n ? PUMP_SUPPLY\n : String(Math.round(supply * 10 ** NEW_TOKEN_DECIMALS));\n const soldValue = isPump\n ? PUMP_SOLD\n : String(\n Math.round(supply * (soldPercent / 100) * 10 ** NEW_TOKEN_DECIMALS),\n );\n const raisedValue = isPump\n ? PUMP_RAISED\n : String(Math.round(raised * 10 ** SOL_TOKEN_DECIMALS));\n try {\n return Curve.getPoolCurvePointByInit({\n curveType: CurveType.CONSTANT_PRODUCT,\n supply: supplyValue,\n totalSell: soldValue,\n totalLockedAmount: 0,\n totalFundRaising: raisedValue,\n migrateFee: PUMP_MIGRATE_FEE,\n decimalA: NEW_TOKEN_DECIMALS,\n decimalB: SOL_TOKEN_DECIMALS,\n pointCount: 24,\n });\n } catch {\n return [];\n }\n }, [platform, raised, soldPercent, supply]);\n\n const path = useMemo(() => {\n if (points.length === 0) return \"\";\n const xs = points.map((point) => Number(point.totalSellSupply));\n const ys = points.map((point) => Number(point.price));\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs) || 1;\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys) || 1;\n return points\n .map((point, index) => {\n const x =\n ((Number(point.totalSellSupply) - minX) / (maxX - minX || 1)) * 320;\n const y =\n 120 - ((Number(point.price) - minY) / (maxY - minY || 1)) * 100;\n return `${index === 0 ? \"M\" : \"L\"}${x.toFixed(1)},${y.toFixed(1)}`;\n })\n .join(\" \");\n }, [points]);\n\n return (\n <div className=\"px-4 py-6 space-y-4 bg-content2 rounded-lg overflow-hidden lg:flex-1 lg:basis-1/2 lg:sticky lg:top-0 max-lg:hidden\">\n <h2 className=\"text-sm font-medium\">{t(\"launchpad.curve_preview\")}</h2>\n <svg\n viewBox=\"0 0 320 140\"\n className=\"w-full h-40\"\n role=\"img\"\n aria-label={t(\"launchpad.curve_preview\")}\n >\n <path\n d={path}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"text-primary\"\n />\n </svg>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { Button, cn, Textarea } from \"@liberfi.io/ui\";\nimport { LAUNCHPAD_FIELD_CLASS_NAMES } from \"./form-control-theme\";\nimport { useLaunchpadUiPorts, type GeneratedMemeInfo } from \"./ports\";\n\nexport type MagicLaunchProps = {\n prompt?: string;\n onGenerate?: (result: GeneratedMemeInfo) => void;\n};\n\nexport function MagicLaunch({ prompt = \"\", onGenerate }: MagicLaunchProps) {\n const { t } = useTranslation();\n const ports = useLaunchpadUiPorts();\n const [value, setValue] = useState(prompt);\n const [pending, setPending] = useState(false);\n const tooLong = value.length > 300;\n const canGenerate =\n value.length > 0 && !tooLong && !!ports.generateMeme && !pending;\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center\">\n <span\n className=\"font-semibold text-sm\"\n style={{\n backgroundImage:\n \"linear-gradient(90deg, rgb(199, 255, 46) 0%, rgb(247, 104, 22) 100%)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n }}\n >\n {t(\"launchpad.magic_launch\")}\n </span>\n <span\n className={cn(\"text-xs\", tooLong ? \"text-danger\" : \"text-text-muted\")}\n >\n {value.length}/300\n </span>\n </div>\n <Textarea\n minRows={2}\n classNames={LAUNCHPAD_FIELD_CLASS_NAMES}\n value={value}\n onValueChange={setValue}\n placeholder={t(\"launchpad.magic_launch_explained\")}\n />\n <Button\n color=\"primary\"\n isDisabled={!canGenerate}\n isLoading={pending}\n onPress={() => {\n void ports.requireAuth(async () => {\n if (!ports.generateMeme) return;\n setPending(true);\n try {\n const result = await ports.generateMeme(value);\n onGenerate?.(result);\n } finally {\n setPending(false);\n }\n });\n }}\n >\n {t(\"launchpad.magic_launch_submit\")}\n </Button>\n </div>\n );\n}\n","import { useCallback, useState, type Key } from \"react\";\nimport { LaunchPadPlatform } from \"@liberfi.io/react-launchpad\";\nimport { Image, Tab, Tabs, cn } from \"@liberfi.io/ui\";\nimport {\n LaunchPadCreateForm,\n type LaunchPadCreateFormValues,\n} from \"./LaunchPadCreateForm\";\nimport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nimport { MagicLaunch } from \"./MagicLaunch\";\nimport { LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES } from \"./form-control-theme\";\nimport type { GeneratedMemeInfo } from \"./ports\";\n\nconst PLATFORMS = [\n {\n platform: LaunchPadPlatform.PUMPFUN,\n name: \"Pump\",\n icon: \"/images/launchpad/pumpfun.svg\",\n },\n {\n platform: LaunchPadPlatform.RAYDIUM,\n name: \"Raydium\",\n icon: \"/images/launchpad/raydium.svg\",\n },\n] as const;\n\nexport interface LaunchPadHomeProps {\n prompt?: string;\n image?: string;\n}\n\nexport function LaunchPadHome({ prompt, image }: LaunchPadHomeProps) {\n const [platform, setPlatform] = useState<LaunchPadPlatform>(\n LaunchPadPlatform.PUMPFUN,\n );\n const [suggestedImage, setSuggestedImage] = useState<string | undefined>(\n image,\n );\n const [suggestedName, setSuggestedName] = useState<string | undefined>(\n undefined,\n );\n const [suggestedSymbol, setSuggestedSymbol] = useState<string | undefined>(\n undefined,\n );\n const [preview, setPreview] = useState<LaunchPadCreateFormValues | null>(\n null,\n );\n\n const onGenerate = useCallback((result: GeneratedMemeInfo) => {\n setSuggestedImage(result.image);\n setSuggestedName(result.name);\n setSuggestedSymbol(result.symbol);\n }, []);\n\n return (\n <div className=\"flex flex-col gap-4\">\n <MagicLaunch prompt={prompt} onGenerate={onGenerate} />\n <div className=\"flex-1 flex items-start justify-center gap-4\">\n <div\n className={cn(\n \"h-full flex flex-col gap-4 max-lg:w-full lg:flex-1 lg:basis-1/2\",\n )}\n >\n <Tabs\n fullWidth\n classNames={LAUNCHPAD_PLATFORM_TABS_CLASS_NAMES}\n selectedKey={platform}\n onSelectionChange={(key: Key) =>\n setPlatform(String(key) as LaunchPadPlatform)\n }\n disableAnimation\n >\n {PLATFORMS.map((item) => (\n <Tab\n key={item.platform}\n title={\n <div className=\"flex items-center gap-2\">\n <Image\n src={item.icon}\n alt={item.name}\n width={20}\n height={20}\n />\n <span>{item.name}</span>\n </div>\n }\n />\n ))}\n </Tabs>\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.PUMPFUN}\n className={cn({ hidden: platform !== LaunchPadPlatform.PUMPFUN })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n <LaunchPadCreateForm\n platform={LaunchPadPlatform.RAYDIUM}\n className={cn({ hidden: platform !== LaunchPadPlatform.RAYDIUM })}\n suggestedImage={suggestedImage}\n suggestedName={suggestedName}\n suggestedSymbol={suggestedSymbol}\n onPreviewChange={setPreview}\n />\n </div>\n <LaunchPadCurvePreview\n platform={platform}\n supply={preview?.supply}\n raised={preview?.raised}\n soldPercent={preview?.sold}\n />\n </div>\n </div>\n );\n}\n","export const PACKAGE_NAME = \"@liberfi.io/ui-launchpad\" as const;\n\nexport function LaunchpadReadyWidget() {\n return PACKAGE_NAME;\n}\n\nexport { LaunchpadCreateStatusView } from \"./create-status.view\";\nexport { LaunchPadHome, type LaunchPadHomeProps } from \"./LaunchPadHome\";\nexport { LaunchPadCreateForm } from \"./LaunchPadCreateForm\";\nexport { MagicLaunch, type MagicLaunchProps } from \"./MagicLaunch\";\nexport { LaunchPadCurvePreview } from \"./LaunchPadCurvePreview\";\nexport {\n LaunchpadUiProvider,\n useLaunchpadUiPorts,\n createInMemoryLaunchpadUiPorts,\n type LaunchpadUiPorts,\n type GeneratedMemeInfo,\n} from \"./ports\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/ui-launchpad",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Launchpad widgets for Liberfi React SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -25,9 +25,9 @@
25
25
  "access": "public"
26
26
  },
27
27
  "dependencies": {
28
- "@liberfi.io/hooks": "0.1.266",
29
- "@liberfi.io/types": "0.4.74",
30
- "@liberfi.io/utils": "0.2.73"
28
+ "@liberfi.io/hooks": "0.1.268",
29
+ "@liberfi.io/types": "0.4.76",
30
+ "@liberfi.io/utils": "0.2.75"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@tanstack/react-query": "^5.90.2",
@@ -43,17 +43,17 @@
43
43
  "ts-jest": "^29.4.5",
44
44
  "tsup": "^8.5.0",
45
45
  "typescript": "^5.9.2",
46
- "@liberfi.io/i18n": "0.1.271",
47
- "@liberfi.io/react-launchpad": "0.1.1",
48
- "@liberfi.io/ui": "0.3.74",
49
- "tsconfig": "0.1.257"
46
+ "@liberfi.io/i18n": "0.1.273",
47
+ "@liberfi.io/react-launchpad": "0.1.3",
48
+ "@liberfi.io/ui": "0.3.76",
49
+ "tsconfig": "0.1.259"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "react": ">=18",
53
53
  "react-dom": ">=18",
54
- "@liberfi.io/i18n": "0.1.271",
55
- "@liberfi.io/react-launchpad": "0.1.1",
56
- "@liberfi.io/ui": "0.3.74"
54
+ "@liberfi.io/i18n": "0.1.273",
55
+ "@liberfi.io/react-launchpad": "0.1.3",
56
+ "@liberfi.io/ui": "0.3.76"
57
57
  },
58
58
  "scripts": {
59
59
  "dev": "tsup --watch",