@micro-cms/crypto-payments 1.0.19 → 1.0.21

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/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # @micro-cms/crypto-payments
2
+
3
+ A composable, drop-in React widget for accepting cryptocurrency payments in your application.
4
+
5
+ ## Features
6
+
7
+ * **Multi-Chain Support:** Built-in adapters for Solana (Phantom) and EVM (MetaMask).
8
+ * **Headless Hooks:** `usePayment` hook for custom UI implementation.
9
+ * **Secure Handshake:** Standardized backend protocol (`initiate` -> `verify`) to ensure transaction integrity.
10
+ * **Tailwind Styled:** Comes with a clean, pre-styled widget that respects your theme.
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ pnpm add @micro-cms/crypto-payments
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ### 1. Basic Widget
21
+
22
+ ```tsx
23
+ import { PaymentWidget } from '@micro-cms/crypto-payments';
24
+ import '@micro-cms/crypto-payments/dist/index.css';
25
+
26
+ function Checkout() {
27
+ return (
28
+ <PaymentWidget
29
+ orderId="ord_123"
30
+ amount={10.50}
31
+ endpoints={{
32
+ initiate: '/api/orders/initiate',
33
+ verify: '/api/orders/verify-payment'
34
+ }}
35
+ onSuccess={(receipt) => {
36
+ console.log('Payment confirmed:', receipt);
37
+ }}
38
+ />
39
+ );
40
+ }
41
+ ```
42
+
43
+ ### 2. Custom UI with `usePayment`
44
+
45
+ ```tsx
46
+ import { usePayment } from '@micro-cms/crypto-payments';
47
+
48
+ function CustomCheckout() {
49
+ const {
50
+ initiate,
51
+ status,
52
+ handleSolanaPay,
53
+ handleEVMPay
54
+ } = usePayment({ orderId: '123' });
55
+
56
+ return (
57
+ <div>
58
+ <button onClick={initiate}>Start</button>
59
+
60
+ {status === 'pending_signature' && (
61
+ <>
62
+ <button onClick={handleSolanaPay}>Pay with Solana</button>
63
+ <button onClick={handleEVMPay}>Pay with Ethereum</button>
64
+ </>
65
+ )}
66
+ </div>
67
+ );
68
+ }
69
+ ```
70
+
71
+ ## Backend Requirements
72
+
73
+ Your backend must implement two endpoints:
74
+
75
+ 1. **POST /initiate**
76
+ * Input: `{ productId, amount, currency, paymentProvider: 'crypto' }`
77
+ * Output: `{ paymentAddress, network, nonce, amount }`
78
+
79
+ 2. **POST /verify**
80
+ * Input: `{ orderId, transactionHash }`
81
+ * Output: `{ status: 'confirmed' | 'failed', order }`
82
+
83
+ ## Configuration
84
+
85
+ The widget supports custom headers for authentication:
86
+
87
+ ```tsx
88
+ <PaymentWidget
89
+ headers={{
90
+ 'Authorization': 'Bearer ...',
91
+ 'X-Tenant-ID': 'my-tenant'
92
+ }}
93
+ // ...
94
+ />
95
+ ```
package/dist/index.d.mts CHANGED
@@ -48,6 +48,9 @@ declare const useEVMWallet: () => {
48
48
 
49
49
  declare const PaymentWidget: react__default.FC<PaymentWidgetProps>;
50
50
 
51
+ declare const CSS_CONTENT = ".mcms-mx-auto{margin-left:auto;margin-right:auto}.mcms-mb-3{margin-bottom:.75rem}.mcms-mb-4{margin-bottom:1rem}.mcms-mb-6{margin-bottom:1.5rem}.mcms-mt-1{margin-top:.25rem}.mcms-flex{display:flex}.mcms-h-12{height:3rem}.mcms-h-3{height:.75rem}.mcms-h-4{height:1rem}.mcms-h-5{height:1.25rem}.mcms-h-8{height:2rem}.mcms-w-12{width:3rem}.mcms-w-3{width:.75rem}.mcms-w-4{width:1rem}.mcms-w-5{width:1.25rem}.mcms-w-8{width:2rem}.mcms-w-full{width:100%}.mcms-shrink-0{flex-shrink:0}@keyframes mcms-spin{to{transform:rotate(1turn)}}.mcms-animate-spin{animation:mcms-spin 1s linear infinite}.mcms-flex-col{flex-direction:column}.mcms-items-center{align-items:center}.mcms-justify-center{justify-content:center}.mcms-justify-between{justify-content:space-between}.mcms-gap-1{gap:.25rem}.mcms-gap-2{gap:.5rem}.mcms-gap-3{gap:.75rem}.mcms-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.mcms-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.mcms-overflow-hidden{overflow:hidden}.mcms-break-all{word-break:break-all}.mcms-rounded-2xl{border-radius:1rem}.mcms-rounded-lg{border-radius:.5rem}.mcms-rounded-xl{border-radius:.75rem}.mcms-border{border-width:1px}.mcms-border-t{border-top-width:1px}.mcms-border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.mcms-border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity,1))}.mcms-border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.mcms-border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.mcms-bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.mcms-bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.mcms-bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.mcms-bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.mcms-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.mcms-bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity,1))}.mcms-bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.mcms-bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.mcms-bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.mcms-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.mcms-p-2{padding:.5rem}.mcms-p-3{padding:.75rem}.mcms-p-4{padding:1rem}.mcms-p-6{padding:1.5rem}.mcms-px-4{padding-left:1rem;padding-right:1rem}.mcms-px-6{padding-left:1.5rem;padding-right:1.5rem}.mcms-py-3{padding-top:.75rem;padding-bottom:.75rem}.mcms-py-8{padding-top:2rem;padding-bottom:2rem}.mcms-text-center{text-align:center}.mcms-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcms-text-lg{font-size:1.125rem;line-height:1.75rem}.mcms-text-sm{font-size:.875rem;line-height:1.25rem}.mcms-text-xs{font-size:.75rem;line-height:1rem}.mcms-font-bold{font-weight:700}.mcms-font-medium{font-weight:500}.mcms-font-semibold{font-weight:600}.mcms-uppercase{text-transform:uppercase}.mcms-tracking-wider{letter-spacing:.05em}.mcms-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.mcms-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.mcms-text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.mcms-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.mcms-text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.mcms-text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.mcms-text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.mcms-text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.mcms-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.mcms-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mcms-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover:mcms-bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover:mcms-bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity,1))}.hover:mcms-bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity,1))}.hover:mcms-bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity,1))}.hover:mcms-text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}";
52
+ declare const injectStyles: () => void;
53
+
51
54
  interface PaymentWidgetProps {
52
55
  orderId: string;
53
56
  amount?: number;
@@ -76,4 +79,4 @@ declare const usePayment: (props: PaymentWidgetProps) => {
76
79
  handleEVMPay: () => Promise<void>;
77
80
  };
78
81
 
79
- export { type EthereumWindow, type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, useEVMWallet, usePayment, useSolanaWallet };
82
+ export { CSS_CONTENT, type EthereumWindow, type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, injectStyles, useEVMWallet, usePayment, useSolanaWallet };
package/dist/index.d.ts CHANGED
@@ -48,6 +48,9 @@ declare const useEVMWallet: () => {
48
48
 
49
49
  declare const PaymentWidget: react__default.FC<PaymentWidgetProps>;
50
50
 
51
+ declare const CSS_CONTENT = ".mcms-mx-auto{margin-left:auto;margin-right:auto}.mcms-mb-3{margin-bottom:.75rem}.mcms-mb-4{margin-bottom:1rem}.mcms-mb-6{margin-bottom:1.5rem}.mcms-mt-1{margin-top:.25rem}.mcms-flex{display:flex}.mcms-h-12{height:3rem}.mcms-h-3{height:.75rem}.mcms-h-4{height:1rem}.mcms-h-5{height:1.25rem}.mcms-h-8{height:2rem}.mcms-w-12{width:3rem}.mcms-w-3{width:.75rem}.mcms-w-4{width:1rem}.mcms-w-5{width:1.25rem}.mcms-w-8{width:2rem}.mcms-w-full{width:100%}.mcms-shrink-0{flex-shrink:0}@keyframes mcms-spin{to{transform:rotate(1turn)}}.mcms-animate-spin{animation:mcms-spin 1s linear infinite}.mcms-flex-col{flex-direction:column}.mcms-items-center{align-items:center}.mcms-justify-center{justify-content:center}.mcms-justify-between{justify-content:space-between}.mcms-gap-1{gap:.25rem}.mcms-gap-2{gap:.5rem}.mcms-gap-3{gap:.75rem}.mcms-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.mcms-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.mcms-overflow-hidden{overflow:hidden}.mcms-break-all{word-break:break-all}.mcms-rounded-2xl{border-radius:1rem}.mcms-rounded-lg{border-radius:.5rem}.mcms-rounded-xl{border-radius:.75rem}.mcms-border{border-width:1px}.mcms-border-t{border-top-width:1px}.mcms-border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.mcms-border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity,1))}.mcms-border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.mcms-border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.mcms-bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.mcms-bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.mcms-bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.mcms-bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.mcms-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.mcms-bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity,1))}.mcms-bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.mcms-bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.mcms-bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.mcms-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.mcms-p-2{padding:.5rem}.mcms-p-3{padding:.75rem}.mcms-p-4{padding:1rem}.mcms-p-6{padding:1.5rem}.mcms-px-4{padding-left:1rem;padding-right:1rem}.mcms-px-6{padding-left:1.5rem;padding-right:1.5rem}.mcms-py-3{padding-top:.75rem;padding-bottom:.75rem}.mcms-py-8{padding-top:2rem;padding-bottom:2rem}.mcms-text-center{text-align:center}.mcms-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcms-text-lg{font-size:1.125rem;line-height:1.75rem}.mcms-text-sm{font-size:.875rem;line-height:1.25rem}.mcms-text-xs{font-size:.75rem;line-height:1rem}.mcms-font-bold{font-weight:700}.mcms-font-medium{font-weight:500}.mcms-font-semibold{font-weight:600}.mcms-uppercase{text-transform:uppercase}.mcms-tracking-wider{letter-spacing:.05em}.mcms-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.mcms-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.mcms-text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.mcms-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.mcms-text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.mcms-text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.mcms-text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.mcms-text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.mcms-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.mcms-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mcms-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover:mcms-bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover:mcms-bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity,1))}.hover:mcms-bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity,1))}.hover:mcms-bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity,1))}.hover:mcms-text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}";
52
+ declare const injectStyles: () => void;
53
+
51
54
  interface PaymentWidgetProps {
52
55
  orderId: string;
53
56
  amount?: number;
@@ -76,4 +79,4 @@ declare const usePayment: (props: PaymentWidgetProps) => {
76
79
  handleEVMPay: () => Promise<void>;
77
80
  };
78
81
 
79
- export { type EthereumWindow, type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, useEVMWallet, usePayment, useSolanaWallet };
82
+ export { CSS_CONTENT, type EthereumWindow, type PaymentStatus, PaymentWidget, type PaymentWidgetProps, type SolanaWindow, injectStyles, useEVMWallet, usePayment, useSolanaWallet };
package/dist/index.js CHANGED
@@ -1,2 +1 @@
1
- "use strict";var x=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var _=(e,r)=>{for(var n in r)x(e,n,{get:r[n],enumerable:!0})},L=(e,r,n,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of A(r))!V.call(e,m)&&m!==n&&x(e,m,{get:()=>r[m],enumerable:!(s=j(r,m))||s.enumerable});return e};var q=e=>L(x({},"__esModule",{value:!0}),e);var F={};_(F,{PaymentWidget:()=>O,useEVMWallet:()=>P,usePayment:()=>E,useSolanaWallet:()=>b});module.exports=q(F);var w=require("react");var l=require("@solana/web3.js"),b=()=>{let e=()=>{if(typeof window<"u"&&"solana"in window){let s=window;if(s.solana?.isPhantom)return s.solana}},r=async()=>{let s=e();if(s)try{return(await s.connect()).publicKey.toString()}catch{throw new Error("User rejected the connection")}else throw new Error("Phantom wallet not found")},n=async s=>{let m=e();if(!m)throw new Error("Wallet not connected");try{let o=new l.Connection("https://api.devnet.solana.com","confirmed"),u=await m.connect({onlyIfTrusted:!0}),y=new l.PublicKey(u.publicKey.toString()),d=new l.PublicKey(s.paymentAddress),f=new l.Transaction().add(l.SystemProgram.transfer({fromPubkey:y,toPubkey:d,lamports:Number(s.amount)*l.LAMPORTS_PER_SOL})),{blockhash:h}=await o.getLatestBlockhash();f.recentBlockhash=h,f.feePayer=y;let{signature:p}=await m.signAndSendTransaction(f);return p}catch(o){throw o.message?.includes("User rejected")?new Error("Transaction rejected by user"):new Error(o.message||"Failed to send Solana transaction")}};return{isAvailable:!!e(),connect:r,sendPayment:n}};var P=()=>{let e=()=>{if(typeof window<"u"&&"ethereum"in window)return window.ethereum},r=async()=>{let s=e();if(s)try{return(await s.request({method:"eth_requestAccounts"}))[0]}catch{throw new Error("User rejected the connection")}else throw new Error("MetaMask or EVM wallet not found")},n=async s=>{let m=e();if(!m)throw new Error("Wallet not connected");let o=await m.request({method:"eth_accounts"});if(!o||o.length===0)throw new Error("No accounts found. Please connect your wallet first.");let u=s.currency.toUpperCase()==="USDC"?6:18,y="0x"+BigInt(Math.floor(Number(s.amount)*Math.pow(10,u))).toString(16);try{return await m.request({method:"eth_sendTransaction",params:[{from:o[0],to:s.paymentAddress,value:s.currency.toUpperCase()==="ETH"?y:"0x0"}]})}catch(d){throw d.code===4001?new Error("Transaction rejected by user"):new Error(d.message||"Failed to send transaction")}};return{isAvailable:!!e(),connect:r,sendPayment:n}};function N(e,{insertAt:r}={}){if(!e||typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],s=document.createElement("style");s.type="text/css",r==="top"&&n.firstChild?n.insertBefore(s,n.firstChild):n.appendChild(s),s.styleSheet?s.styleSheet.cssText=e:s.appendChild(document.createTextNode(e))}N(`@tailwind base;@tailwind components;@tailwind utilities;
2
- `);var i=require("lucide-react"),k=require("clsx"),C=require("tailwind-merge");var t=require("react/jsx-runtime");function S(...e){return(0,C.twMerge)((0,k.clsx)(e))}var O=({className:e,...r})=>{let{status:n,intent:s,error:m,initiate:o,verify:u,setStatus:y,isSolanaAvailable:d,handleSolanaPay:f,isEVMAvailable:h,handleEVMPay:p}=E(r);return n==="success"?(0,t.jsxs)("div",{className:S("mcms-p-6 mcms-text-center mcms-bg-green-50 mcms-rounded-xl mcms-border mcms-border-green-200",e),children:[(0,t.jsx)(i.CheckCircle,{className:"mcms-mx-auto mcms-w-12 mcms-h-12 mcms-text-green-500 mcms-mb-4"}),(0,t.jsx)("h3",{className:"mcms-text-lg mcms-font-semibold mcms-green-900",children:"Payment Successful"}),(0,t.jsx)("p",{className:"mcms-text-green-700 mcms-mt-1",children:"Your order has been confirmed."})]}):(0,t.jsxs)("div",{className:S("mcms-bg-white mcms-rounded-2xl mcms-border mcms-border-slate-200 mcms-shadow-sm mcms-overflow-hidden",e),children:[(0,t.jsxs)("div",{className:"mcms-p-6",children:[(0,t.jsxs)("div",{className:"mcms-flex mcms-items-center mcms-gap-3 mcms-mb-6",children:[(0,t.jsx)("div",{className:"mcms-p-2 mcms-bg-indigo-50 mcms-rounded-lg",children:(0,t.jsx)(i.Wallet,{className:"mcms-w-5 mcms-h-5 mcms-text-indigo-600"})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mcms-font-semibold mcms-text-slate-900",children:"Crypto Payment"}),(0,t.jsx)("p",{className:"mcms-text-sm mcms-text-slate-500",children:"Pay securely using your wallet"})]})]}),m&&(0,t.jsxs)("div",{className:"mcms-mb-4 mcms-p-3 mcms-bg-red-50 mcms-border mcms-border-red-100 mcms-rounded-lg mcms-flex mcms-gap-3 mcms-text-red-700 mcms-text-sm",children:[(0,t.jsx)(i.AlertCircle,{className:"mcms-w-4 mcms-h-4 mcms-shrink-0"}),(0,t.jsx)("p",{children:m})]}),n==="idle"&&(0,t.jsx)("button",{onClick:o,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-indigo-600 hover:mcms-bg-indigo-700 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Start Payment"}),(n==="connecting"||n==="initiating"||n==="verifying")&&(0,t.jsxs)("div",{className:"mcms-py-8 mcms-text-center",children:[(0,t.jsx)(i.Loader2,{className:"mcms-w-8 mcms-h-8 mcms-text-indigo-600 mcms-animate-spin mcms-mx-auto mcms-mb-3"}),(0,t.jsx)("p",{className:"mcms-text-slate-600 mcms-font-medium",children:n==="connecting"?"Connecting wallet...":n==="initiating"?"Preparing transaction...":"Verifying on-chain..."})]}),n==="pending_signature"&&s&&(0,t.jsxs)("div",{className:"mcms-space-y-4",children:[(0,t.jsxs)("div",{className:"mcms-p-4 mcms-bg-slate-50 mcms-rounded-xl mcms-space-y-2",children:[(0,t.jsxs)("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[(0,t.jsx)("span",{className:"mcms-text-slate-500",children:"Amount to pay"}),(0,t.jsxs)("span",{className:"mcms-font-mono mcms-font-medium mcms-text-slate-900",children:[s.amount," ",s.currency]})]}),(0,t.jsxs)("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[(0,t.jsx)("span",{className:"mcms-text-slate-500",children:"Order ID"}),(0,t.jsx)("span",{className:"mcms-font-mono mcms-text-slate-900",children:s.orderId})]}),(0,t.jsxs)("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[(0,t.jsx)("span",{className:"mcms-text-slate-500",children:"Network"}),(0,t.jsx)("span",{className:"mcms-text-slate-900 mcms-font-medium",children:s.network})]})]}),(0,t.jsxs)("div",{className:"mcms-space-y-2",children:[(0,t.jsx)("p",{className:"mcms-text-xs mcms-text-slate-500 mcms-uppercase mcms-font-bold mcms-tracking-wider",children:"Destination Address"}),(0,t.jsx)("div",{className:"mcms-p-3 mcms-bg-slate-100 mcms-rounded-lg mcms-font-mono mcms-text-xs mcms-break-all mcms-text-slate-600 mcms-border mcms-border-slate-200",children:s.paymentAddress})]}),(0,t.jsx)("div",{className:"mcms-flex mcms-flex-col mcms-gap-2",children:s.network?.toLowerCase().includes("solana")&&d?(0,t.jsxs)("button",{onClick:f,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-[#512da8] hover:mcms-bg-[#4527a0] mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[(0,t.jsx)(i.Cpu,{className:"mcms-w-4 mcms-h-4"}),"Pay with Phantom"]}):(s.network?.toLowerCase().includes("ethereum")||s.network?.toLowerCase().includes("evm")||s.network?.toLowerCase().includes("polygon"))&&h?(0,t.jsxs)("button",{onClick:p,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-[#f6851b] hover:mcms-bg-[#e2761b] mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[(0,t.jsx)("img",{src:"https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Mirror_Logo.svg",className:"mcms-w-4 mcms-h-4",alt:"MetaMask"}),"Pay with MetaMask"]}):(0,t.jsx)("button",{onClick:()=>{y("verifying"),setTimeout(()=>u("0x_mock_transaction_hash_generic"),2e3)},className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-slate-900 hover:mcms-bg-black mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Confirm in Wallet"})})]})]}),(0,t.jsxs)("div",{className:"mcms-bg-slate-50 mcms-px-6 mcms-py-3 mcms-border-t mcms-border-slate-100 mcms-flex mcms-justify-between mcms-items-center",children:[(0,t.jsx)("span",{className:"mcms-text-xs mcms-text-slate-400",children:"Powered by Micro-CMS Crypto"}),(0,t.jsxs)("a",{href:"#",className:"mcms-text-xs mcms-text-indigo-600 hover:mcms-text-indigo-700 mcms-font-medium mcms-flex mcms-items-center mcms-gap-1",children:["Help ",(0,t.jsx)(i.ExternalLink,{className:"mcms-w-3 mcms-h-3"})]})]})]})};var E=e=>{let[r,n]=(0,w.useState)("idle"),[s,m]=(0,w.useState)(null),[o,u]=(0,w.useState)(null),y=(0,w.useCallback)(async()=>{try{if(n("initiating"),m(null),e.provider){let g=await e.provider.initiatePayment(e.orderId,{amount:e.amount,currency:e.currency});u(g),n("pending_signature");return}let a=await fetch(e.endpoints?.initiate||"/api/orders/initiate",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({productId:e.orderId,amount:e.amount,currency:e.currency,paymentProvider:"crypto"})});if(!a.ok){let g=await a.json();throw new Error(g.error||"Failed to initiate payment intent")}let c=await a.json();u(c),n("pending_signature")}catch(a){m(a.message),n("error"),e.onError?.(a)}},[e.provider,e.endpoints?.initiate,e.orderId,e.amount,e.currency,e.onError,e.headers]),d=(0,w.useCallback)(async a=>{try{if(n("verifying"),e.provider){let v=await e.provider.verifyPayment(a,e.orderId);if(v.status==="confirmed")n("success"),e.onSuccess?.(v);else throw new Error("Payment not confirmed yet, status: "+v.status);return}let c=await fetch(e.endpoints?.verify||"/api/orders/verify-payment",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({orderId:o?.orderId||e.orderId,transactionHash:a})});if(!c.ok){let v=await c.json();throw new Error(v.error||"Payment verification failed")}let g=await c.json();if(g.status==="confirmed")n("success"),e.onSuccess?.(g);else throw new Error("Payment not confirmed yet, status: "+g.status)}catch(c){m(c.message),n("error"),e.onError?.(c)}},[e.provider,e.endpoints?.verify,e.orderId,e.onSuccess,e.onError,e.headers,o?.orderId]),{isAvailable:f,connect:h,sendPayment:p}=b(),M=async()=>{try{if(!o){m("Payment intent not established."),n("error");return}n("connecting");let a=await h();console.log("Connected to Solana with public key:",a),n("pending_signature");let c=await p(o);n("verifying"),await d(c)}catch(a){m(a.message||"Failed to connect to Phantom or sign transaction."),n("error"),e.onError?.(a instanceof Error?a:new Error(String(a)))}},{isAvailable:I,connect:T,sendPayment:W}=P();return{status:r,intent:o,error:s,initiate:y,verify:d,setStatus:n,isSolanaAvailable:f,handleSolanaPay:M,isEVMAvailable:I,handleEVMPay:async()=>{try{if(!o){m("Payment intent not established."),n("error");return}n("connecting");let a=await T();console.log("Connected to EVM with account:",a),n("pending_signature");let c=await W(o);n("verifying"),await d(c)}catch(a){m(a.message||"Failed to connect to MetaMask or sign transaction."),n("error"),e.onError?.(a instanceof Error?a:new Error(String(a)))}}}};0&&(module.exports={PaymentWidget,useEVMWallet,usePayment,useSolanaWallet});
1
+ "use strict";var v=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var q=(e,a)=>{for(var r in a)v(e,r,{get:a[r],enumerable:!0})},O=(e,a,r,m)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of V(a))!L.call(e,s)&&s!==r&&v(e,s,{get:()=>a[s],enumerable:!(m=_(a,s))||m.enumerable});return e};var F=e=>O(v({},"__esModule",{value:!0}),e);var U={};q(U,{CSS_CONTENT:()=>E,PaymentWidget:()=>R,injectStyles:()=>k,useEVMWallet:()=>P,usePayment:()=>N,useSolanaWallet:()=>x});module.exports=F(U);var b=require("react");var l=require("@solana/web3.js"),x=()=>{let e=()=>{if(typeof window<"u"&&"solana"in window){let m=window;if(m.solana?.isPhantom)return m.solana}},a=async()=>{let m=e();if(m)try{return(await m.connect()).publicKey.toString()}catch{throw new Error("User rejected the connection")}else throw new Error("Phantom wallet not found")},r=async m=>{let s=e();if(!s)throw new Error("Wallet not connected");try{let n=new l.Connection("https://api.devnet.solana.com","confirmed"),g=await s.connect({onlyIfTrusted:!0}),y=new l.PublicKey(g.publicKey.toString()),d=new l.PublicKey(m.paymentAddress),u=new l.Transaction().add(l.SystemProgram.transfer({fromPubkey:y,toPubkey:d,lamports:Number(m.amount)*l.LAMPORTS_PER_SOL})),{blockhash:p}=await n.getLatestBlockhash();u.recentBlockhash=p,u.feePayer=y;let{signature:h}=await s.signAndSendTransaction(u);return h}catch(n){throw n.message?.includes("User rejected")?new Error("Transaction rejected by user"):new Error(n.message||"Failed to send Solana transaction")}};return{isAvailable:!!e(),connect:a,sendPayment:r}};var P=()=>{let e=()=>{if(typeof window<"u"&&"ethereum"in window)return window.ethereum},a=async()=>{let m=e();if(m)try{return(await m.request({method:"eth_requestAccounts"}))[0]}catch{throw new Error("User rejected the connection")}else throw new Error("MetaMask or EVM wallet not found")},r=async m=>{let s=e();if(!s)throw new Error("Wallet not connected");let n=await s.request({method:"eth_accounts"});if(!n||n.length===0)throw new Error("No accounts found. Please connect your wallet first.");let g=m.currency.toUpperCase()==="USDC"?6:18,y="0x"+BigInt(Math.floor(Number(m.amount)*Math.pow(10,g))).toString(16);try{return await s.request({method:"eth_sendTransaction",params:[{from:n[0],to:m.paymentAddress,value:m.currency.toUpperCase()==="ETH"?y:"0x0"}]})}catch(d){throw d.code===4001?new Error("Transaction rejected by user"):new Error(d.message||"Failed to send transaction")}};return{isAvailable:!!e(),connect:a,sendPayment:r}};var C=require("react"),i=require("lucide-react"),M=require("clsx"),I=require("tailwind-merge");var E=".mcms-mx-auto{margin-left:auto;margin-right:auto}.mcms-mb-3{margin-bottom:.75rem}.mcms-mb-4{margin-bottom:1rem}.mcms-mb-6{margin-bottom:1.5rem}.mcms-mt-1{margin-top:.25rem}.mcms-flex{display:flex}.mcms-h-12{height:3rem}.mcms-h-3{height:.75rem}.mcms-h-4{height:1rem}.mcms-h-5{height:1.25rem}.mcms-h-8{height:2rem}.mcms-w-12{width:3rem}.mcms-w-3{width:.75rem}.mcms-w-4{width:1rem}.mcms-w-5{width:1.25rem}.mcms-w-8{width:2rem}.mcms-w-full{width:100%}.mcms-shrink-0{flex-shrink:0}@keyframes mcms-spin{to{transform:rotate(1turn)}}.mcms-animate-spin{animation:mcms-spin 1s linear infinite}.mcms-flex-col{flex-direction:column}.mcms-items-center{align-items:center}.mcms-justify-center{justify-content:center}.mcms-justify-between{justify-content:space-between}.mcms-gap-1{gap:.25rem}.mcms-gap-2{gap:.5rem}.mcms-gap-3{gap:.75rem}.mcms-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.mcms-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.mcms-overflow-hidden{overflow:hidden}.mcms-break-all{word-break:break-all}.mcms-rounded-2xl{border-radius:1rem}.mcms-rounded-lg{border-radius:.5rem}.mcms-rounded-xl{border-radius:.75rem}.mcms-border{border-width:1px}.mcms-border-t{border-top-width:1px}.mcms-border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.mcms-border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity,1))}.mcms-border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.mcms-border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.mcms-bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.mcms-bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.mcms-bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.mcms-bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.mcms-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.mcms-bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity,1))}.mcms-bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.mcms-bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.mcms-bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.mcms-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.mcms-p-2{padding:.5rem}.mcms-p-3{padding:.75rem}.mcms-p-4{padding:1rem}.mcms-p-6{padding:1.5rem}.mcms-px-4{padding-left:1rem;padding-right:1rem}.mcms-px-6{padding-left:1.5rem;padding-right:1.5rem}.mcms-py-3{padding-top:.75rem;padding-bottom:.75rem}.mcms-py-8{padding-top:2rem;padding-bottom:2rem}.mcms-text-center{text-align:center}.mcms-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcms-text-lg{font-size:1.125rem;line-height:1.75rem}.mcms-text-sm{font-size:.875rem;line-height:1.25rem}.mcms-text-xs{font-size:.75rem;line-height:1rem}.mcms-font-bold{font-weight:700}.mcms-font-medium{font-weight:500}.mcms-font-semibold{font-weight:600}.mcms-uppercase{text-transform:uppercase}.mcms-tracking-wider{letter-spacing:.05em}.mcms-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.mcms-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.mcms-text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.mcms-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.mcms-text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.mcms-text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.mcms-text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.mcms-text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.mcms-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.mcms-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mcms-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover:mcms-bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover:mcms-bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity,1))}.hover:mcms-bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity,1))}.hover:mcms-bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity,1))}.hover:mcms-text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}",k=()=>{if(typeof document>"u"||document.getElementById("mcms-crypto-styles"))return;let e=document.createElement("style");e.id="mcms-crypto-styles",e.textContent=E,document.head.appendChild(e)};var t=require("react/jsx-runtime");function S(...e){return(0,I.twMerge)((0,M.clsx)(e))}var R=({className:e,...a})=>{(0,C.useLayoutEffect)(()=>{k()},[]);let{status:r,intent:m,error:s,initiate:n,verify:g,setStatus:y,isSolanaAvailable:d,handleSolanaPay:u,isEVMAvailable:p,handleEVMPay:h}=N(a);return r==="success"?(0,t.jsxs)("div",{className:S("mcms-p-6 mcms-text-center mcms-bg-green-50 mcms-rounded-xl mcms-border mcms-border-green-200",e),children:[(0,t.jsx)(i.CheckCircle,{className:"mcms-mx-auto mcms-w-12 mcms-h-12 mcms-text-green-500 mcms-mb-4"}),(0,t.jsx)("h3",{className:"mcms-text-lg mcms-font-semibold mcms-green-900",children:"Payment Successful"}),(0,t.jsx)("p",{className:"mcms-text-green-700 mcms-mt-1",children:"Your order has been confirmed."})]}):(0,t.jsxs)("div",{className:S("mcms-bg-white mcms-rounded-2xl mcms-border mcms-border-slate-200 mcms-shadow-sm mcms-overflow-hidden",e),children:[(0,t.jsxs)("div",{className:"mcms-p-6",children:[(0,t.jsxs)("div",{className:"mcms-flex mcms-items-center mcms-gap-3 mcms-mb-6",children:[(0,t.jsx)("div",{className:"mcms-p-2 mcms-bg-indigo-50 mcms-rounded-lg",children:(0,t.jsx)(i.Wallet,{className:"mcms-w-5 mcms-h-5 mcms-text-indigo-600"})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"mcms-font-semibold mcms-text-slate-900",children:"Crypto Payment"}),(0,t.jsx)("p",{className:"mcms-text-sm mcms-text-slate-500",children:"Pay securely using your wallet"})]})]}),s&&(0,t.jsxs)("div",{className:"mcms-mb-4 mcms-p-3 mcms-bg-red-50 mcms-border mcms-border-red-100 mcms-rounded-lg mcms-flex mcms-gap-3 mcms-text-red-700 mcms-text-sm",children:[(0,t.jsx)(i.AlertCircle,{className:"mcms-w-4 mcms-h-4 mcms-shrink-0"}),(0,t.jsx)("p",{children:s})]}),r==="idle"&&(0,t.jsx)("button",{onClick:n,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-indigo-600 hover:mcms-bg-indigo-700 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Start Payment"}),(r==="connecting"||r==="initiating"||r==="verifying")&&(0,t.jsxs)("div",{className:"mcms-py-8 mcms-text-center",children:[(0,t.jsx)(i.Loader2,{className:"mcms-w-8 mcms-h-8 mcms-text-indigo-600 mcms-animate-spin mcms-mx-auto mcms-mb-3"}),(0,t.jsx)("p",{className:"mcms-text-slate-600 mcms-font-medium",children:r==="connecting"?"Connecting wallet...":r==="initiating"?"Preparing transaction...":"Verifying on-chain..."})]}),r==="pending_signature"&&m&&(0,t.jsxs)("div",{className:"mcms-space-y-4",children:[(0,t.jsxs)("div",{className:"mcms-p-4 mcms-bg-slate-50 mcms-rounded-xl mcms-space-y-2",children:[(0,t.jsxs)("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[(0,t.jsx)("span",{className:"mcms-text-slate-500",children:"Amount to pay"}),(0,t.jsxs)("span",{className:"mcms-font-mono mcms-font-medium mcms-text-slate-900",children:[m.amount," ",m.currency]})]}),(0,t.jsxs)("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[(0,t.jsx)("span",{className:"mcms-text-slate-500",children:"Order ID"}),(0,t.jsx)("span",{className:"mcms-font-mono mcms-text-slate-900",children:m.orderId})]}),(0,t.jsxs)("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[(0,t.jsx)("span",{className:"mcms-text-slate-500",children:"Network"}),(0,t.jsx)("span",{className:"mcms-text-slate-900 mcms-font-medium",children:m.network})]})]}),(0,t.jsxs)("div",{className:"mcms-space-y-2",children:[(0,t.jsx)("p",{className:"mcms-text-xs mcms-text-slate-500 mcms-uppercase mcms-font-bold mcms-tracking-wider",children:"Destination Address"}),(0,t.jsx)("div",{className:"mcms-p-3 mcms-bg-slate-100 mcms-rounded-lg mcms-font-mono mcms-text-xs mcms-break-all mcms-text-slate-600 mcms-border mcms-border-slate-200",children:m.paymentAddress})]}),(0,t.jsx)("div",{className:"mcms-flex mcms-flex-col mcms-gap-2",children:m.network?.toLowerCase().includes("solana")&&d?(0,t.jsxs)("button",{onClick:u,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-sky-600 hover:mcms-bg-sky-700 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[(0,t.jsx)(i.Cpu,{className:"mcms-w-4 mcms-h-4"}),"Pay with Phantom"]}):(m.network?.toLowerCase().includes("ethereum")||m.network?.toLowerCase().includes("evm")||m.network?.toLowerCase().includes("polygon"))&&p?(0,t.jsxs)("button",{onClick:h,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-orange-500 hover:mcms-bg-orange-600 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[(0,t.jsx)("img",{src:"https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Mirror_Logo.svg",className:"mcms-w-4 mcms-h-4",alt:"MetaMask"}),"Pay with MetaMask"]}):(0,t.jsx)("button",{onClick:()=>{y("verifying"),setTimeout(()=>g("0x_mock_transaction_hash_generic"),2e3)},className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-slate-900 hover:mcms-bg-black mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Confirm in Wallet"})})]})]}),(0,t.jsxs)("div",{className:"mcms-bg-slate-50 mcms-px-6 mcms-py-3 mcms-border-t mcms-border-slate-100 mcms-flex mcms-justify-between mcms-items-center",children:[(0,t.jsx)("span",{className:"mcms-text-xs mcms-text-slate-400",children:"Powered by Micro-CMS Crypto"}),(0,t.jsxs)("a",{href:"#",className:"mcms-text-xs mcms-text-indigo-600 hover:mcms-text-indigo-700 mcms-font-medium mcms-flex mcms-items-center mcms-gap-1",children:["Help ",(0,t.jsx)(i.ExternalLink,{className:"mcms-w-3 mcms-h-3"})]})]})]})};var N=e=>{let[a,r]=(0,b.useState)("idle"),[m,s]=(0,b.useState)(null),[n,g]=(0,b.useState)(null),y=(0,b.useCallback)(async()=>{try{if(r("initiating"),s(null),e.provider){let w=await e.provider.initiatePayment(e.orderId,{amount:e.amount,currency:e.currency});g(w),r("pending_signature");return}let o=await fetch(e.endpoints?.initiate||"/api/orders/initiate",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({productId:e.orderId,amount:e.amount,currency:e.currency,paymentProvider:"crypto"})});if(!o.ok){let w=await o.json();throw new Error(w.error||"Failed to initiate payment intent")}let c=await o.json();g(c),r("pending_signature")}catch(o){s(o.message),r("error"),e.onError?.(o)}},[e.provider,e.endpoints?.initiate,e.orderId,e.amount,e.currency,e.onError,e.headers]),d=(0,b.useCallback)(async o=>{try{if(r("verifying"),e.provider){let f=await e.provider.verifyPayment(o,e.orderId);if(f.status==="confirmed")r("success"),e.onSuccess?.(f);else throw new Error("Payment not confirmed yet, status: "+f.status);return}let c=await fetch(e.endpoints?.verify||"/api/orders/verify-payment",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({orderId:n?.orderId||e.orderId,transactionHash:o})});if(!c.ok){let f=await c.json();throw new Error(f.error||"Payment verification failed")}let w=await c.json();if(w.status==="confirmed")r("success"),e.onSuccess?.(w);else throw new Error("Payment not confirmed yet, status: "+w.status)}catch(c){s(c.message),r("error"),e.onError?.(c)}},[e.provider,e.endpoints?.verify,e.orderId,e.onSuccess,e.onError,e.headers,n?.orderId]),{isAvailable:u,connect:p,sendPayment:h}=x(),j=async()=>{try{if(!n){s("Payment intent not established."),r("error");return}r("connecting");let o=await p();console.log("Connected to Solana with public key:",o),r("pending_signature");let c=await h(n);r("verifying"),await d(c)}catch(o){s(o.message||"Failed to connect to Phantom or sign transaction."),r("error"),e.onError?.(o instanceof Error?o:new Error(String(o)))}},{isAvailable:W,connect:T,sendPayment:A}=P();return{status:a,intent:n,error:m,initiate:y,verify:d,setStatus:r,isSolanaAvailable:u,handleSolanaPay:j,isEVMAvailable:W,handleEVMPay:async()=>{try{if(!n){s("Payment intent not established."),r("error");return}r("connecting");let o=await T();console.log("Connected to EVM with account:",o),r("pending_signature");let c=await A(n);r("verifying"),await d(c)}catch(o){s(o.message||"Failed to connect to MetaMask or sign transaction."),r("error"),e.onError?.(o instanceof Error?o:new Error(String(o)))}}}};0&&(module.exports={CSS_CONTENT,PaymentWidget,injectStyles,useEVMWallet,usePayment,useSolanaWallet});
package/dist/index.mjs CHANGED
@@ -1,2 +1 @@
1
- import{useState as v,useCallback as S}from"react";import{Connection as T,PublicKey as x,Transaction as W,SystemProgram as j,LAMPORTS_PER_SOL as A}from"@solana/web3.js";var b=()=>{let e=()=>{if(typeof window<"u"&&"solana"in window){let n=window;if(n.solana?.isPhantom)return n.solana}},d=async()=>{let n=e();if(n)try{return(await n.connect()).publicKey.toString()}catch{throw new Error("User rejected the connection")}else throw new Error("Phantom wallet not found")},t=async n=>{let a=e();if(!a)throw new Error("Wallet not connected");try{let r=new T("https://api.devnet.solana.com","confirmed"),l=await a.connect({onlyIfTrusted:!0}),u=new x(l.publicKey.toString()),i=new x(n.paymentAddress),y=new W().add(j.transfer({fromPubkey:u,toPubkey:i,lamports:Number(n.amount)*A})),{blockhash:g}=await r.getLatestBlockhash();y.recentBlockhash=g,y.feePayer=u;let{signature:w}=await a.signAndSendTransaction(y);return w}catch(r){throw r.message?.includes("User rejected")?new Error("Transaction rejected by user"):new Error(r.message||"Failed to send Solana transaction")}};return{isAvailable:!!e(),connect:d,sendPayment:t}};var P=()=>{let e=()=>{if(typeof window<"u"&&"ethereum"in window)return window.ethereum},d=async()=>{let n=e();if(n)try{return(await n.request({method:"eth_requestAccounts"}))[0]}catch{throw new Error("User rejected the connection")}else throw new Error("MetaMask or EVM wallet not found")},t=async n=>{let a=e();if(!a)throw new Error("Wallet not connected");let r=await a.request({method:"eth_accounts"});if(!r||r.length===0)throw new Error("No accounts found. Please connect your wallet first.");let l=n.currency.toUpperCase()==="USDC"?6:18,u="0x"+BigInt(Math.floor(Number(n.amount)*Math.pow(10,l))).toString(16);try{return await a.request({method:"eth_sendTransaction",params:[{from:r[0],to:n.paymentAddress,value:n.currency.toUpperCase()==="ETH"?u:"0x0"}]})}catch(i){throw i.code===4001?new Error("Transaction rejected by user"):new Error(i.message||"Failed to send transaction")}};return{isAvailable:!!e(),connect:d,sendPayment:t}};function p(e,{insertAt:d}={}){if(!e||typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",d==="top"&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}p(`@tailwind base;@tailwind components;@tailwind utilities;
2
- `);import{Wallet as V,CheckCircle as _,Loader2 as L,AlertCircle as q,ExternalLink as O,Cpu as F}from"lucide-react";import{clsx as U}from"clsx";import{twMerge as B}from"tailwind-merge";import{jsx as s,jsxs as o}from"react/jsx-runtime";function N(...e){return B(U(e))}var $=({className:e,...d})=>{let{status:t,intent:n,error:a,initiate:r,verify:l,setStatus:u,isSolanaAvailable:i,handleSolanaPay:y,isEVMAvailable:g,handleEVMPay:w}=E(d);return t==="success"?o("div",{className:N("mcms-p-6 mcms-text-center mcms-bg-green-50 mcms-rounded-xl mcms-border mcms-border-green-200",e),children:[s(_,{className:"mcms-mx-auto mcms-w-12 mcms-h-12 mcms-text-green-500 mcms-mb-4"}),s("h3",{className:"mcms-text-lg mcms-font-semibold mcms-green-900",children:"Payment Successful"}),s("p",{className:"mcms-text-green-700 mcms-mt-1",children:"Your order has been confirmed."})]}):o("div",{className:N("mcms-bg-white mcms-rounded-2xl mcms-border mcms-border-slate-200 mcms-shadow-sm mcms-overflow-hidden",e),children:[o("div",{className:"mcms-p-6",children:[o("div",{className:"mcms-flex mcms-items-center mcms-gap-3 mcms-mb-6",children:[s("div",{className:"mcms-p-2 mcms-bg-indigo-50 mcms-rounded-lg",children:s(V,{className:"mcms-w-5 mcms-h-5 mcms-text-indigo-600"})}),o("div",{children:[s("h3",{className:"mcms-font-semibold mcms-text-slate-900",children:"Crypto Payment"}),s("p",{className:"mcms-text-sm mcms-text-slate-500",children:"Pay securely using your wallet"})]})]}),a&&o("div",{className:"mcms-mb-4 mcms-p-3 mcms-bg-red-50 mcms-border mcms-border-red-100 mcms-rounded-lg mcms-flex mcms-gap-3 mcms-text-red-700 mcms-text-sm",children:[s(q,{className:"mcms-w-4 mcms-h-4 mcms-shrink-0"}),s("p",{children:a})]}),t==="idle"&&s("button",{onClick:r,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-indigo-600 hover:mcms-bg-indigo-700 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Start Payment"}),(t==="connecting"||t==="initiating"||t==="verifying")&&o("div",{className:"mcms-py-8 mcms-text-center",children:[s(L,{className:"mcms-w-8 mcms-h-8 mcms-text-indigo-600 mcms-animate-spin mcms-mx-auto mcms-mb-3"}),s("p",{className:"mcms-text-slate-600 mcms-font-medium",children:t==="connecting"?"Connecting wallet...":t==="initiating"?"Preparing transaction...":"Verifying on-chain..."})]}),t==="pending_signature"&&n&&o("div",{className:"mcms-space-y-4",children:[o("div",{className:"mcms-p-4 mcms-bg-slate-50 mcms-rounded-xl mcms-space-y-2",children:[o("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[s("span",{className:"mcms-text-slate-500",children:"Amount to pay"}),o("span",{className:"mcms-font-mono mcms-font-medium mcms-text-slate-900",children:[n.amount," ",n.currency]})]}),o("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[s("span",{className:"mcms-text-slate-500",children:"Order ID"}),s("span",{className:"mcms-font-mono mcms-text-slate-900",children:n.orderId})]}),o("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[s("span",{className:"mcms-text-slate-500",children:"Network"}),s("span",{className:"mcms-text-slate-900 mcms-font-medium",children:n.network})]})]}),o("div",{className:"mcms-space-y-2",children:[s("p",{className:"mcms-text-xs mcms-text-slate-500 mcms-uppercase mcms-font-bold mcms-tracking-wider",children:"Destination Address"}),s("div",{className:"mcms-p-3 mcms-bg-slate-100 mcms-rounded-lg mcms-font-mono mcms-text-xs mcms-break-all mcms-text-slate-600 mcms-border mcms-border-slate-200",children:n.paymentAddress})]}),s("div",{className:"mcms-flex mcms-flex-col mcms-gap-2",children:n.network?.toLowerCase().includes("solana")&&i?o("button",{onClick:y,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-[#512da8] hover:mcms-bg-[#4527a0] mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[s(F,{className:"mcms-w-4 mcms-h-4"}),"Pay with Phantom"]}):(n.network?.toLowerCase().includes("ethereum")||n.network?.toLowerCase().includes("evm")||n.network?.toLowerCase().includes("polygon"))&&g?o("button",{onClick:w,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-[#f6851b] hover:mcms-bg-[#e2761b] mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[s("img",{src:"https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Mirror_Logo.svg",className:"mcms-w-4 mcms-h-4",alt:"MetaMask"}),"Pay with MetaMask"]}):s("button",{onClick:()=>{u("verifying"),setTimeout(()=>l("0x_mock_transaction_hash_generic"),2e3)},className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-slate-900 hover:mcms-bg-black mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Confirm in Wallet"})})]})]}),o("div",{className:"mcms-bg-slate-50 mcms-px-6 mcms-py-3 mcms-border-t mcms-border-slate-100 mcms-flex mcms-justify-between mcms-items-center",children:[s("span",{className:"mcms-text-xs mcms-text-slate-400",children:"Powered by Micro-CMS Crypto"}),o("a",{href:"#",className:"mcms-text-xs mcms-text-indigo-600 hover:mcms-text-indigo-700 mcms-font-medium mcms-flex mcms-items-center mcms-gap-1",children:["Help ",s(O,{className:"mcms-w-3 mcms-h-3"})]})]})]})};var E=e=>{let[d,t]=v("idle"),[n,a]=v(null),[r,l]=v(null),u=S(async()=>{try{if(t("initiating"),a(null),e.provider){let f=await e.provider.initiatePayment(e.orderId,{amount:e.amount,currency:e.currency});l(f),t("pending_signature");return}let m=await fetch(e.endpoints?.initiate||"/api/orders/initiate",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({productId:e.orderId,amount:e.amount,currency:e.currency,paymentProvider:"crypto"})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Failed to initiate payment intent")}let c=await m.json();l(c),t("pending_signature")}catch(m){a(m.message),t("error"),e.onError?.(m)}},[e.provider,e.endpoints?.initiate,e.orderId,e.amount,e.currency,e.onError,e.headers]),i=S(async m=>{try{if(t("verifying"),e.provider){let h=await e.provider.verifyPayment(m,e.orderId);if(h.status==="confirmed")t("success"),e.onSuccess?.(h);else throw new Error("Payment not confirmed yet, status: "+h.status);return}let c=await fetch(e.endpoints?.verify||"/api/orders/verify-payment",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({orderId:r?.orderId||e.orderId,transactionHash:m})});if(!c.ok){let h=await c.json();throw new Error(h.error||"Payment verification failed")}let f=await c.json();if(f.status==="confirmed")t("success"),e.onSuccess?.(f);else throw new Error("Payment not confirmed yet, status: "+f.status)}catch(c){a(c.message),t("error"),e.onError?.(c)}},[e.provider,e.endpoints?.verify,e.orderId,e.onSuccess,e.onError,e.headers,r?.orderId]),{isAvailable:y,connect:g,sendPayment:w}=b(),k=async()=>{try{if(!r){a("Payment intent not established."),t("error");return}t("connecting");let m=await g();console.log("Connected to Solana with public key:",m),t("pending_signature");let c=await w(r);t("verifying"),await i(c)}catch(m){a(m.message||"Failed to connect to Phantom or sign transaction."),t("error"),e.onError?.(m instanceof Error?m:new Error(String(m)))}},{isAvailable:C,connect:M,sendPayment:I}=P();return{status:d,intent:r,error:n,initiate:u,verify:i,setStatus:t,isSolanaAvailable:y,handleSolanaPay:k,isEVMAvailable:C,handleEVMPay:async()=>{try{if(!r){a("Payment intent not established."),t("error");return}t("connecting");let m=await M();console.log("Connected to EVM with account:",m),t("pending_signature");let c=await I(r);t("verifying"),await i(c)}catch(m){a(m.message||"Failed to connect to MetaMask or sign transaction."),t("error"),e.onError?.(m instanceof Error?m:new Error(String(m)))}}}};export{$ as PaymentWidget,P as useEVMWallet,E as usePayment,b as useSolanaWallet};
1
+ import{useState as h,useCallback as E}from"react";import{Connection as j,PublicKey as f,Transaction as W,SystemProgram as T,LAMPORTS_PER_SOL as A}from"@solana/web3.js";var v=()=>{let e=()=>{if(typeof window<"u"&&"solana"in window){let r=window;if(r.solana?.isPhantom)return r.solana}},g=async()=>{let r=e();if(r)try{return(await r.connect()).publicKey.toString()}catch{throw new Error("User rejected the connection")}else throw new Error("Phantom wallet not found")},t=async r=>{let o=e();if(!o)throw new Error("Wallet not connected");try{let n=new j("https://api.devnet.solana.com","confirmed"),d=await o.connect({onlyIfTrusted:!0}),l=new f(d.publicKey.toString()),i=new f(r.paymentAddress),y=new W().add(T.transfer({fromPubkey:l,toPubkey:i,lamports:Number(r.amount)*A})),{blockhash:w}=await n.getLatestBlockhash();y.recentBlockhash=w,y.feePayer=l;let{signature:b}=await o.signAndSendTransaction(y);return b}catch(n){throw n.message?.includes("User rejected")?new Error("Transaction rejected by user"):new Error(n.message||"Failed to send Solana transaction")}};return{isAvailable:!!e(),connect:g,sendPayment:t}};var x=()=>{let e=()=>{if(typeof window<"u"&&"ethereum"in window)return window.ethereum},g=async()=>{let r=e();if(r)try{return(await r.request({method:"eth_requestAccounts"}))[0]}catch{throw new Error("User rejected the connection")}else throw new Error("MetaMask or EVM wallet not found")},t=async r=>{let o=e();if(!o)throw new Error("Wallet not connected");let n=await o.request({method:"eth_accounts"});if(!n||n.length===0)throw new Error("No accounts found. Please connect your wallet first.");let d=r.currency.toUpperCase()==="USDC"?6:18,l="0x"+BigInt(Math.floor(Number(r.amount)*Math.pow(10,d))).toString(16);try{return await o.request({method:"eth_sendTransaction",params:[{from:n[0],to:r.paymentAddress,value:r.currency.toUpperCase()==="ETH"?l:"0x0"}]})}catch(i){throw i.code===4001?new Error("Transaction rejected by user"):new Error(i.message||"Failed to send transaction")}};return{isAvailable:!!e(),connect:g,sendPayment:t}};import{useLayoutEffect as V}from"react";import{Wallet as L,CheckCircle as q,Loader2 as O,AlertCircle as F,ExternalLink as R,Cpu as U}from"lucide-react";import{clsx as D}from"clsx";import{twMerge as H}from"tailwind-merge";var _=".mcms-mx-auto{margin-left:auto;margin-right:auto}.mcms-mb-3{margin-bottom:.75rem}.mcms-mb-4{margin-bottom:1rem}.mcms-mb-6{margin-bottom:1.5rem}.mcms-mt-1{margin-top:.25rem}.mcms-flex{display:flex}.mcms-h-12{height:3rem}.mcms-h-3{height:.75rem}.mcms-h-4{height:1rem}.mcms-h-5{height:1.25rem}.mcms-h-8{height:2rem}.mcms-w-12{width:3rem}.mcms-w-3{width:.75rem}.mcms-w-4{width:1rem}.mcms-w-5{width:1.25rem}.mcms-w-8{width:2rem}.mcms-w-full{width:100%}.mcms-shrink-0{flex-shrink:0}@keyframes mcms-spin{to{transform:rotate(1turn)}}.mcms-animate-spin{animation:mcms-spin 1s linear infinite}.mcms-flex-col{flex-direction:column}.mcms-items-center{align-items:center}.mcms-justify-center{justify-content:center}.mcms-justify-between{justify-content:space-between}.mcms-gap-1{gap:.25rem}.mcms-gap-2{gap:.5rem}.mcms-gap-3{gap:.75rem}.mcms-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.mcms-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.mcms-overflow-hidden{overflow:hidden}.mcms-break-all{word-break:break-all}.mcms-rounded-2xl{border-radius:1rem}.mcms-rounded-lg{border-radius:.5rem}.mcms-rounded-xl{border-radius:.75rem}.mcms-border{border-width:1px}.mcms-border-t{border-top-width:1px}.mcms-border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.mcms-border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity,1))}.mcms-border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.mcms-border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.mcms-bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.mcms-bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.mcms-bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.mcms-bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.mcms-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.mcms-bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity,1))}.mcms-bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.mcms-bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.mcms-bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.mcms-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.mcms-p-2{padding:.5rem}.mcms-p-3{padding:.75rem}.mcms-p-4{padding:1rem}.mcms-p-6{padding:1.5rem}.mcms-px-4{padding-left:1rem;padding-right:1rem}.mcms-px-6{padding-left:1.5rem;padding-right:1.5rem}.mcms-py-3{padding-top:.75rem;padding-bottom:.75rem}.mcms-py-8{padding-top:2rem;padding-bottom:2rem}.mcms-text-center{text-align:center}.mcms-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcms-text-lg{font-size:1.125rem;line-height:1.75rem}.mcms-text-sm{font-size:.875rem;line-height:1.25rem}.mcms-text-xs{font-size:.75rem;line-height:1rem}.mcms-font-bold{font-weight:700}.mcms-font-medium{font-weight:500}.mcms-font-semibold{font-weight:600}.mcms-uppercase{text-transform:uppercase}.mcms-tracking-wider{letter-spacing:.05em}.mcms-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.mcms-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.mcms-text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.mcms-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.mcms-text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.mcms-text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.mcms-text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.mcms-text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.mcms-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.mcms-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mcms-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover:mcms-bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover:mcms-bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity,1))}.hover:mcms-bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity,1))}.hover:mcms-bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity,1))}.hover:mcms-text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}",P=()=>{if(typeof document>"u"||document.getElementById("mcms-crypto-styles"))return;let e=document.createElement("style");e.id="mcms-crypto-styles",e.textContent=_,document.head.appendChild(e)};import{jsx as m,jsxs as a}from"react/jsx-runtime";function k(...e){return H(D(e))}var me=({className:e,...g})=>{V(()=>{P()},[]);let{status:t,intent:r,error:o,initiate:n,verify:d,setStatus:l,isSolanaAvailable:i,handleSolanaPay:y,isEVMAvailable:w,handleEVMPay:b}=N(g);return t==="success"?a("div",{className:k("mcms-p-6 mcms-text-center mcms-bg-green-50 mcms-rounded-xl mcms-border mcms-border-green-200",e),children:[m(q,{className:"mcms-mx-auto mcms-w-12 mcms-h-12 mcms-text-green-500 mcms-mb-4"}),m("h3",{className:"mcms-text-lg mcms-font-semibold mcms-green-900",children:"Payment Successful"}),m("p",{className:"mcms-text-green-700 mcms-mt-1",children:"Your order has been confirmed."})]}):a("div",{className:k("mcms-bg-white mcms-rounded-2xl mcms-border mcms-border-slate-200 mcms-shadow-sm mcms-overflow-hidden",e),children:[a("div",{className:"mcms-p-6",children:[a("div",{className:"mcms-flex mcms-items-center mcms-gap-3 mcms-mb-6",children:[m("div",{className:"mcms-p-2 mcms-bg-indigo-50 mcms-rounded-lg",children:m(L,{className:"mcms-w-5 mcms-h-5 mcms-text-indigo-600"})}),a("div",{children:[m("h3",{className:"mcms-font-semibold mcms-text-slate-900",children:"Crypto Payment"}),m("p",{className:"mcms-text-sm mcms-text-slate-500",children:"Pay securely using your wallet"})]})]}),o&&a("div",{className:"mcms-mb-4 mcms-p-3 mcms-bg-red-50 mcms-border mcms-border-red-100 mcms-rounded-lg mcms-flex mcms-gap-3 mcms-text-red-700 mcms-text-sm",children:[m(F,{className:"mcms-w-4 mcms-h-4 mcms-shrink-0"}),m("p",{children:o})]}),t==="idle"&&m("button",{onClick:n,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-indigo-600 hover:mcms-bg-indigo-700 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Start Payment"}),(t==="connecting"||t==="initiating"||t==="verifying")&&a("div",{className:"mcms-py-8 mcms-text-center",children:[m(O,{className:"mcms-w-8 mcms-h-8 mcms-text-indigo-600 mcms-animate-spin mcms-mx-auto mcms-mb-3"}),m("p",{className:"mcms-text-slate-600 mcms-font-medium",children:t==="connecting"?"Connecting wallet...":t==="initiating"?"Preparing transaction...":"Verifying on-chain..."})]}),t==="pending_signature"&&r&&a("div",{className:"mcms-space-y-4",children:[a("div",{className:"mcms-p-4 mcms-bg-slate-50 mcms-rounded-xl mcms-space-y-2",children:[a("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[m("span",{className:"mcms-text-slate-500",children:"Amount to pay"}),a("span",{className:"mcms-font-mono mcms-font-medium mcms-text-slate-900",children:[r.amount," ",r.currency]})]}),a("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[m("span",{className:"mcms-text-slate-500",children:"Order ID"}),m("span",{className:"mcms-font-mono mcms-text-slate-900",children:r.orderId})]}),a("div",{className:"mcms-flex mcms-justify-between mcms-text-sm",children:[m("span",{className:"mcms-text-slate-500",children:"Network"}),m("span",{className:"mcms-text-slate-900 mcms-font-medium",children:r.network})]})]}),a("div",{className:"mcms-space-y-2",children:[m("p",{className:"mcms-text-xs mcms-text-slate-500 mcms-uppercase mcms-font-bold mcms-tracking-wider",children:"Destination Address"}),m("div",{className:"mcms-p-3 mcms-bg-slate-100 mcms-rounded-lg mcms-font-mono mcms-text-xs mcms-break-all mcms-text-slate-600 mcms-border mcms-border-slate-200",children:r.paymentAddress})]}),m("div",{className:"mcms-flex mcms-flex-col mcms-gap-2",children:r.network?.toLowerCase().includes("solana")&&i?a("button",{onClick:y,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-sky-600 hover:mcms-bg-sky-700 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[m(U,{className:"mcms-w-4 mcms-h-4"}),"Pay with Phantom"]}):(r.network?.toLowerCase().includes("ethereum")||r.network?.toLowerCase().includes("evm")||r.network?.toLowerCase().includes("polygon"))&&w?a("button",{onClick:b,className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-orange-500 hover:mcms-bg-orange-600 mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:[m("img",{src:"https://upload.wikimedia.org/wikipedia/commons/3/36/MetaMask_Mirror_Logo.svg",className:"mcms-w-4 mcms-h-4",alt:"MetaMask"}),"Pay with MetaMask"]}):m("button",{onClick:()=>{l("verifying"),setTimeout(()=>d("0x_mock_transaction_hash_generic"),2e3)},className:"mcms-w-full mcms-py-3 mcms-px-4 mcms-bg-slate-900 hover:mcms-bg-black mcms-text-white mcms-font-medium mcms-rounded-xl mcms-transition-colors mcms-flex mcms-items-center mcms-justify-center mcms-gap-2",children:"Confirm in Wallet"})})]})]}),a("div",{className:"mcms-bg-slate-50 mcms-px-6 mcms-py-3 mcms-border-t mcms-border-slate-100 mcms-flex mcms-justify-between mcms-items-center",children:[m("span",{className:"mcms-text-xs mcms-text-slate-400",children:"Powered by Micro-CMS Crypto"}),a("a",{href:"#",className:"mcms-text-xs mcms-text-indigo-600 hover:mcms-text-indigo-700 mcms-font-medium mcms-flex mcms-items-center mcms-gap-1",children:["Help ",m(R,{className:"mcms-w-3 mcms-h-3"})]})]})]})};var N=e=>{let[g,t]=h("idle"),[r,o]=h(null),[n,d]=h(null),l=E(async()=>{try{if(t("initiating"),o(null),e.provider){let u=await e.provider.initiatePayment(e.orderId,{amount:e.amount,currency:e.currency});d(u),t("pending_signature");return}let s=await fetch(e.endpoints?.initiate||"/api/orders/initiate",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({productId:e.orderId,amount:e.amount,currency:e.currency,paymentProvider:"crypto"})});if(!s.ok){let u=await s.json();throw new Error(u.error||"Failed to initiate payment intent")}let c=await s.json();d(c),t("pending_signature")}catch(s){o(s.message),t("error"),e.onError?.(s)}},[e.provider,e.endpoints?.initiate,e.orderId,e.amount,e.currency,e.onError,e.headers]),i=E(async s=>{try{if(t("verifying"),e.provider){let p=await e.provider.verifyPayment(s,e.orderId);if(p.status==="confirmed")t("success"),e.onSuccess?.(p);else throw new Error("Payment not confirmed yet, status: "+p.status);return}let c=await fetch(e.endpoints?.verify||"/api/orders/verify-payment",{method:"POST",headers:{"Content-Type":"application/json",...e.headers||{}},body:JSON.stringify({orderId:n?.orderId||e.orderId,transactionHash:s})});if(!c.ok){let p=await c.json();throw new Error(p.error||"Payment verification failed")}let u=await c.json();if(u.status==="confirmed")t("success"),e.onSuccess?.(u);else throw new Error("Payment not confirmed yet, status: "+u.status)}catch(c){o(c.message),t("error"),e.onError?.(c)}},[e.provider,e.endpoints?.verify,e.orderId,e.onSuccess,e.onError,e.headers,n?.orderId]),{isAvailable:y,connect:w,sendPayment:b}=v(),S=async()=>{try{if(!n){o("Payment intent not established."),t("error");return}t("connecting");let s=await w();console.log("Connected to Solana with public key:",s),t("pending_signature");let c=await b(n);t("verifying"),await i(c)}catch(s){o(s.message||"Failed to connect to Phantom or sign transaction."),t("error"),e.onError?.(s instanceof Error?s:new Error(String(s)))}},{isAvailable:C,connect:M,sendPayment:I}=x();return{status:g,intent:n,error:r,initiate:l,verify:i,setStatus:t,isSolanaAvailable:y,handleSolanaPay:S,isEVMAvailable:C,handleEVMPay:async()=>{try{if(!n){o("Payment intent not established."),t("error");return}t("connecting");let s=await M();console.log("Connected to EVM with account:",s),t("pending_signature");let c=await I(n);t("verifying"),await i(c)}catch(s){o(s.message||"Failed to connect to MetaMask or sign transaction."),t("error"),e.onError?.(s instanceof Error?s:new Error(String(s)))}}}};export{_ as CSS_CONTENT,me as PaymentWidget,P as injectStyles,x as useEVMWallet,N as usePayment,v as useSolanaWallet};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micro-cms/crypto-payments",
3
- "version": "1.0.19",
3
+ "version": "1.0.21",
4
4
  "description": "Composable Crypto Payment Widget for Micro-CMS",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -9,7 +9,7 @@
9
9
  "dist"
10
10
  ],
11
11
  "scripts": {
12
- "build": "tsup src/index.ts --format cjs,esm --dts --minify --clean --inject-style && npx tailwindcss -i src/index.css -o dist/index.css --minify",
12
+ "build": "npx tailwindcss -i src/index.css -o dist/index.css --minify && bash ./scripts/sync-styles.sh && tsup src/index.ts --format cjs,esm --dts --minify --clean",
13
13
  "dev": "tsup src/index.ts --format cjs,esm --watch --dts",
14
14
  "lint": "eslint src/**/*.ts"
15
15
  },
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.mcms-mx-auto{margin-left:auto;margin-right:auto}.mcms-mb-3{margin-bottom:.75rem}.mcms-mb-4{margin-bottom:1rem}.mcms-mb-6{margin-bottom:1.5rem}.mcms-mt-1{margin-top:.25rem}.mcms-flex{display:flex}.mcms-h-12{height:3rem}.mcms-h-3{height:.75rem}.mcms-h-4{height:1rem}.mcms-h-5{height:1.25rem}.mcms-h-8{height:2rem}.mcms-w-12{width:3rem}.mcms-w-3{width:.75rem}.mcms-w-4{width:1rem}.mcms-w-5{width:1.25rem}.mcms-w-8{width:2rem}.mcms-w-full{width:100%}.mcms-shrink-0{flex-shrink:0}@keyframes mcms-spin{to{transform:rotate(1turn)}}.mcms-animate-spin{animation:mcms-spin 1s linear infinite}.mcms-flex-col{flex-direction:column}.mcms-items-center{align-items:center}.mcms-justify-center{justify-content:center}.mcms-justify-between{justify-content:space-between}.mcms-gap-1{gap:.25rem}.mcms-gap-2{gap:.5rem}.mcms-gap-3{gap:.75rem}.mcms-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.mcms-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.mcms-overflow-hidden{overflow:hidden}.mcms-break-all{word-break:break-all}.mcms-rounded-2xl{border-radius:1rem}.mcms-rounded-lg{border-radius:.5rem}.mcms-rounded-xl{border-radius:.75rem}.mcms-border{border-width:1px}.mcms-border-t{border-top-width:1px}.mcms-border-green-200{--tw-border-opacity:1;border-color:rgb(187 247 208/var(--tw-border-opacity,1))}.mcms-border-red-100{--tw-border-opacity:1;border-color:rgb(254 226 226/var(--tw-border-opacity,1))}.mcms-border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity,1))}.mcms-border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity,1))}.mcms-bg-\[\#512da8\]{--tw-bg-opacity:1;background-color:rgb(81 45 168/var(--tw-bg-opacity,1))}.mcms-bg-\[\#f6851b\]{--tw-bg-opacity:1;background-color:rgb(246 133 27/var(--tw-bg-opacity,1))}.mcms-bg-green-50{--tw-bg-opacity:1;background-color:rgb(240 253 244/var(--tw-bg-opacity,1))}.mcms-bg-indigo-50{--tw-bg-opacity:1;background-color:rgb(238 242 255/var(--tw-bg-opacity,1))}.mcms-bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity,1))}.mcms-bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.mcms-bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity,1))}.mcms-bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity,1))}.mcms-bg-slate-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity,1))}.mcms-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.mcms-p-2{padding:.5rem}.mcms-p-3{padding:.75rem}.mcms-p-4{padding:1rem}.mcms-p-6{padding:1.5rem}.mcms-px-4{padding-left:1rem;padding-right:1rem}.mcms-px-6{padding-left:1.5rem;padding-right:1.5rem}.mcms-py-3{padding-top:.75rem;padding-bottom:.75rem}.mcms-py-8{padding-top:2rem;padding-bottom:2rem}.mcms-text-center{text-align:center}.mcms-font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mcms-text-lg{font-size:1.125rem;line-height:1.75rem}.mcms-text-sm{font-size:.875rem;line-height:1.25rem}.mcms-text-xs{font-size:.75rem;line-height:1rem}.mcms-font-bold{font-weight:700}.mcms-font-medium{font-weight:500}.mcms-font-semibold{font-weight:600}.mcms-uppercase{text-transform:uppercase}.mcms-tracking-wider{letter-spacing:.05em}.mcms-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.mcms-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.mcms-text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.mcms-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.mcms-text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity,1))}.mcms-text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity,1))}.mcms-text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity,1))}.mcms-text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity,1))}.mcms-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.mcms-shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.mcms-transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover\:mcms-bg-\[\#4527a0\]:hover{--tw-bg-opacity:1;background-color:rgb(69 39 160/var(--tw-bg-opacity,1))}.hover\:mcms-bg-\[\#e2761b\]:hover{--tw-bg-opacity:1;background-color:rgb(226 118 27/var(--tw-bg-opacity,1))}.hover\:mcms-bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover\:mcms-bg-indigo-700:hover{--tw-bg-opacity:1;background-color:rgb(67 56 202/var(--tw-bg-opacity,1))}.hover\:mcms-text-indigo-700:hover{--tw-text-opacity:1;color:rgb(67 56 202/var(--tw-text-opacity,1))}