@orkid-labs/widget 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["#style-inject:#style-inject","../src/styles.css","../src/OrkidSwapProvider.tsx","../src/context.tsx","../src/theme.ts","../src/OrkidSwapWidget.tsx","../src/TokenSelect.tsx","../src/ChainSelect.tsx","../src/IframeWidget.tsx","../src/embed.ts"],"sourcesContent":["\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".orkid-widget {\\n font-family: var(--orkid-widget-font-family);\\n color: var(--orkid-widget-text);\\n background: var(--orkid-widget-bg);\\n border-radius: var(--orkid-widget-radius);\\n border: 1px solid var(--orkid-widget-border);\\n padding: 1rem;\\n width: 100%;\\n max-width: 28rem;\\n box-sizing: border-box;\\n}\\n.orkid-widget *,\\n.orkid-widget *::before,\\n.orkid-widget *::after {\\n box-sizing: border-box;\\n}\\n.orkid-widget-card {\\n background: var(--orkid-widget-card);\\n color: var(--orkid-widget-card-foreground);\\n border-radius: var(--orkid-widget-radius);\\n border: 1px solid var(--orkid-widget-border);\\n}\\n.orkid-widget-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 0.75rem;\\n margin-bottom: 1rem;\\n}\\n.orkid-widget-title {\\n font-size: 1rem;\\n font-weight: 600;\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n}\\n.orkid-widget-label {\\n font-size: 0.875rem;\\n color: var(--orkid-widget-muted-foreground);\\n margin-bottom: 0.25rem;\\n}\\n.orkid-widget-row {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n}\\n.orkid-widget-input,\\n.orkid-widget-select-trigger,\\n.orkid-widget-button {\\n font-family: inherit;\\n font-size: 0.875rem;\\n border-radius: var(--orkid-widget-radius);\\n border: 1px solid var(--orkid-widget-input);\\n background: var(--orkid-widget-card);\\n color: var(--orkid-widget-card-foreground);\\n padding: 0.5rem 0.75rem;\\n min-height: 2.5rem;\\n}\\n.orkid-widget-input {\\n flex: 1;\\n outline: none;\\n}\\n.orkid-widget-input:focus,\\n.orkid-widget-select-trigger:focus,\\n.orkid-widget-button:focus {\\n outline: 2px solid var(--orkid-widget-ring);\\n outline-offset: -1px;\\n}\\n.orkid-widget-button {\\n cursor: pointer;\\n background: var(--orkid-widget-primary);\\n color: var(--orkid-widget-primary-foreground);\\n border-color: var(--orkid-widget-primary);\\n width: 100%;\\n font-weight: 600;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 0.5rem;\\n}\\n.orkid-widget-button:disabled {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n.orkid-widget-button-secondary {\\n background: var(--orkid-widget-muted);\\n color: var(--orkid-widget-muted-foreground);\\n border-color: var(--orkid-widget-border);\\n}\\n.orkid-widget-select-trigger {\\n display: inline-flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 0.5rem;\\n cursor: pointer;\\n min-width: 7rem;\\n}\\n.orkid-widget-dropdown {\\n position: absolute;\\n z-index: 50;\\n top: 100%;\\n left: 0;\\n margin-top: 0.25rem;\\n width: 18rem;\\n background: var(--orkid-widget-popover);\\n color: var(--orkid-widget-popover-foreground);\\n border: 1px solid var(--orkid-widget-border);\\n border-radius: var(--orkid-widget-radius);\\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\\n}\\n.orkid-widget-dropdown-item {\\n width: 100%;\\n text-align: left;\\n padding: 0.5rem 0.75rem;\\n background: transparent;\\n border: none;\\n color: inherit;\\n cursor: pointer;\\n font-size: 0.875rem;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n}\\n.orkid-widget-dropdown-item:hover {\\n background: var(--orkid-widget-accent);\\n color: var(--orkid-widget-accent-foreground);\\n}\\n.orkid-widget-dropdown-item:disabled {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n.orkid-widget-search {\\n width: 100%;\\n border: none;\\n background: transparent;\\n color: inherit;\\n padding: 0.5rem 0.75rem;\\n outline: none;\\n}\\n.orkid-widget-success {\\n color: var(--orkid-widget-success);\\n background: color-mix(in srgb, var(--orkid-widget-success) 10%, transparent);\\n border: 1px solid color-mix(in srgb, var(--orkid-widget-success) 30%, transparent);\\n border-radius: var(--orkid-widget-radius);\\n padding: 0.75rem;\\n font-size: 0.875rem;\\n}\\n.orkid-widget-error {\\n color: var(--orkid-widget-danger);\\n background: color-mix(in srgb, var(--orkid-widget-danger) 10%, transparent);\\n border: 1px solid color-mix(in srgb, var(--orkid-widget-danger) 30%, transparent);\\n border-radius: var(--orkid-widget-radius);\\n padding: 0.75rem;\\n font-size: 0.875rem;\\n}\\n.orkid-widget-warning {\\n color: var(--orkid-widget-warning);\\n background: color-mix(in srgb, var(--orkid-widget-warning) 10%, transparent);\\n border: 1px solid color-mix(in srgb, var(--orkid-widget-warning) 30%, transparent);\\n border-radius: var(--orkid-widget-radius);\\n padding: 0.75rem;\\n font-size: 0.875rem;\\n}\\n.orkid-widget-info {\\n color: var(--orkid-widget-muted-foreground);\\n background: color-mix(in srgb, var(--orkid-widget-primary) 5%, transparent);\\n border: 1px solid color-mix(in srgb, var(--orkid-widget-primary) 20%, transparent);\\n border-radius: var(--orkid-widget-radius);\\n padding: 0.75rem;\\n font-size: 0.75rem;\\n}\\n.orkid-widget-footer {\\n font-size: 0.75rem;\\n color: var(--orkid-widget-muted-foreground);\\n text-align: center;\\n margin-top: 0.75rem;\\n}\\n.orkid-widget-spin {\\n animation: orkid-spin 1s linear infinite;\\n}\\n@keyframes orkid-spin {\\n from {\\n transform: rotate(0deg);\\n }\\n to {\\n transform: rotate(360deg);\\n }\\n}\\n\")","import { useMemo } from 'react'\nimport { WagmiProvider, createConfig, http, type Config } from 'wagmi'\nimport { base, mainnet, arbitrum, polygon } from 'wagmi/chains'\nimport type { Chain } from 'viem'\nimport { injected, walletConnect } from 'wagmi/connectors'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { OrkidClient } from '@orkid/sdk'\nimport { OrkidSwapContext, type OrkidSwapContextValue } from './context'\nimport { resolveTheme } from './theme'\nimport type { OrkidSwapProviderProps } from './types'\n\nconst DEFAULT_API_BASE_URL = 'https://orkidlabs.xyz'\n\nconst queryClient = new QueryClient()\n\nexport function OrkidSwapProvider({\n apiKey = '',\n apiBaseUrl = DEFAULT_API_BASE_URL,\n partnerId,\n walletMode = 'built-in',\n walletConnectProjectId,\n wagmiConfig,\n theme,\n logoUrl,\n brandName,\n showPoweredBy = true,\n supportedChains = [8453, 1, 42161, 137],\n defaultFromToken,\n defaultToToken,\n defaultAmount,\n defaultSlippageBps = 50,\n tokenList,\n gasless = true,\n onQuote,\n onSolve,\n onError,\n children,\n}: OrkidSwapProviderProps) {\n const client = useMemo(\n () => new OrkidClient({ apiKey, baseUrl: apiBaseUrl }),\n [apiKey, apiBaseUrl]\n )\n\n const resolvedTheme = useMemo(() => resolveTheme(theme), [theme])\n\n const resolvedWagmiConfig = useMemo((): Config | undefined => {\n if (walletMode === 'external') return wagmiConfig\n if (walletMode !== 'built-in') return undefined\n\n const chainsToUse: Chain[] = [base]\n if (supportedChains.includes(1)) chainsToUse.push(mainnet)\n if (supportedChains.includes(42161)) chainsToUse.push(arbitrum)\n if (supportedChains.includes(137)) chainsToUse.push(polygon)\n\n const connectors: any[] = [injected({ shimDisconnect: true })]\n if (walletConnectProjectId) {\n connectors.push(\n walletConnect({\n projectId: walletConnectProjectId,\n metadata: {\n name: brandName || 'Orkid Swap',\n description: 'Gasless token swaps — competitive, no gas',\n url: 'https://orkidlabs.xyz',\n icons: logoUrl ? [logoUrl] : [],\n },\n })\n )\n }\n\n return createConfig({\n chains: chainsToUse as [Chain, ...Chain[]],\n connectors,\n transports: {\n [base.id]: http('https://rpc.orkidlabs.com/rpc/base'),\n [mainnet.id]: http('https://rpc.orkidlabs.com/rpc/ethereum'),\n [arbitrum.id]: http('https://rpc.orkidlabs.com/rpc/arbitrum'),\n [polygon.id]: http('https://rpc.orkidlabs.com/rpc/polygon'),\n },\n })\n }, [walletMode, wagmiConfig, supportedChains, walletConnectProjectId, brandName, logoUrl])\n\n const value: OrkidSwapContextValue = {\n client,\n wagmiConfig: resolvedWagmiConfig,\n walletMode,\n theme: resolvedTheme,\n logoUrl,\n brandName,\n showPoweredBy,\n supportedChains,\n defaultFromToken,\n defaultToToken,\n defaultAmount,\n defaultSlippageBps,\n tokenList,\n gasless,\n partnerId,\n onQuote,\n onSolve,\n onError,\n }\n\n const content = (\n <OrkidSwapContext.Provider value={value}>{children}</OrkidSwapContext.Provider>\n )\n\n if (walletMode === 'built-in' && resolvedWagmiConfig) {\n return (\n <WagmiProvider config={resolvedWagmiConfig}>\n <QueryClientProvider client={queryClient}>{content}</QueryClientProvider>\n </WagmiProvider>\n )\n }\n\n return content\n}\n","import { createContext, useContext } from 'react'\nimport type { OrkidClient, OrkidResponse } from '@orkid/sdk'\nimport type { Config as WagmiConfig } from 'wagmi'\nimport type { OrkidWidgetTheme, OrkidWidgetToken, OrkidWalletMode } from './types'\n\nexport interface OrkidSwapContextValue {\n client: OrkidClient\n wagmiConfig?: WagmiConfig\n walletMode: OrkidWalletMode\n theme: Required<OrkidWidgetTheme>\n logoUrl?: string\n brandName?: string\n showPoweredBy: boolean\n supportedChains: number[]\n defaultFromToken?: OrkidWidgetToken\n defaultToToken?: OrkidWidgetToken\n defaultAmount?: string\n defaultSlippageBps: number\n tokenList?: OrkidWidgetToken[]\n gasless: boolean\n partnerId?: string\n onQuote?: (res: OrkidResponse) => void\n onSolve?: (res: OrkidResponse) => void\n onError?: (error: string) => void\n}\n\nexport const OrkidSwapContext = createContext<OrkidSwapContextValue | undefined>(undefined)\n\nexport function useOrkidSwapContext(): OrkidSwapContextValue {\n const ctx = useContext(OrkidSwapContext)\n if (!ctx) throw new Error('useOrkidSwapContext must be used within OrkidSwapProvider')\n return ctx\n}\n","import type { OrkidWidgetTheme } from './types'\n\nexport const defaultLightTheme: Required<OrkidWidgetTheme> = {\n background: '#ffffff',\n card: '#ffffff',\n cardForeground: '#0f172a',\n primary: '#0052ff',\n primaryForeground: '#ffffff',\n text: '#0f172a',\n muted: '#f1f5f9',\n mutedForeground: '#64748b',\n border: '#e2e8f0',\n success: '#22c55e',\n warning: '#f59e0b',\n danger: '#ef4444',\n radius: '0.625rem',\n fontFamily: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n accent: '#f1f5f9',\n accentForeground: '#0f172a',\n popover: '#ffffff',\n popoverForeground: '#0f172a',\n input: '#e2e8f0',\n ring: '#0052ff',\n}\n\nexport const defaultDarkTheme: Required<OrkidWidgetTheme> = {\n background: '#0f172a',\n card: '#1e293b',\n cardForeground: '#f8fafc',\n primary: '#3b82f6',\n primaryForeground: '#ffffff',\n text: '#f8fafc',\n muted: '#334155',\n mutedForeground: '#94a3b8',\n border: '#334155',\n success: '#4ade80',\n warning: '#fbbf24',\n danger: '#f87171',\n radius: '0.625rem',\n fontFamily: 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n accent: '#334155',\n accentForeground: '#f8fafc',\n popover: '#1e293b',\n popoverForeground: '#f8fafc',\n input: '#334155',\n ring: '#3b82f6',\n}\n\nexport function resolveTheme(partial: OrkidWidgetTheme = {}): Required<OrkidWidgetTheme> {\n return { ...defaultLightTheme, ...partial }\n}\n\nexport function themeToCssVariables(theme: Required<OrkidWidgetTheme>): Record<string, string> {\n return {\n '--orkid-widget-bg': theme.background,\n '--orkid-widget-card': theme.card,\n '--orkid-widget-card-foreground': theme.cardForeground,\n '--orkid-widget-primary': theme.primary,\n '--orkid-widget-primary-foreground': theme.primaryForeground,\n '--orkid-widget-text': theme.text,\n '--orkid-widget-muted': theme.muted,\n '--orkid-widget-muted-foreground': theme.mutedForeground,\n '--orkid-widget-border': theme.border,\n '--orkid-widget-success': theme.success,\n '--orkid-widget-warning': theme.warning,\n '--orkid-widget-danger': theme.danger,\n '--orkid-widget-radius': theme.radius,\n '--orkid-widget-font-family': theme.fontFamily,\n '--orkid-widget-accent': theme.accent,\n '--orkid-widget-accent-foreground': theme.accentForeground,\n '--orkid-widget-popover': theme.popover,\n '--orkid-widget-popover-foreground': theme.popoverForeground,\n '--orkid-widget-input': theme.input,\n '--orkid-widget-ring': theme.ring,\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport {\n useAccount,\n useChainId,\n useConnect,\n useDisconnect,\n usePublicClient,\n useReadContract,\n useSendTransaction,\n useSignTypedData,\n useSwitchChain,\n useWaitForTransactionReceipt,\n useWriteContract,\n} from 'wagmi'\nimport { parseAbi, maxUint256, type Hex } from 'viem'\nimport {\n OrkidClient,\n buildPermit2Domain,\n buildPermitMessage,\n chainConfigFromName,\n PERMIT2,\n} from '@orkid/sdk'\nimport { useOrkidSwapContext } from './context'\nimport { themeToCssVariables } from './theme'\nimport { TokenSelect } from './TokenSelect'\nimport { ChainSelect } from './ChainSelect'\nimport type { OrkidWidgetToken } from './types'\n\nconst erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n 'function balanceOf(address account) view returns (uint256)',\n])\n\nconst permit2Abi = parseAbi([\n 'function nonceBitmap(address owner, uint256 wordPos) view returns (uint256)',\n])\n\nconst PERMIT_TRANSFER_FROM_TYPES = {\n PermitTransferFrom: [\n { name: 'permitted', type: 'TokenPermissions' },\n { name: 'spender', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n TokenPermissions: [\n { name: 'token', type: 'address' },\n { name: 'amount', type: 'uint256' },\n ],\n} as const\n\nconst CHAIN_NAME: Record<number, string> = {\n 8453: 'base',\n 1: 'ethereum',\n 42161: 'arbitrum',\n 137: 'polygon',\n}\n\nconst CHAIN_LIVE: Record<number, boolean> = {\n 8453: true,\n 1: true,\n 42161: true,\n 137: true,\n}\n\nexport function OrkidSwapWidget({ className }: { className?: string }) {\n const ctx = useOrkidSwapContext()\n const client = ctx.client as OrkidClient\n\n const [selectedChainId, setSelectedChainId] = useState<number>(ctx.supportedChains[0] ?? 8453)\n const [fromToken, setFromToken] = useState<OrkidWidgetToken | undefined>(ctx.defaultFromToken)\n const [toToken, setToToken] = useState<OrkidWidgetToken | undefined>(ctx.defaultToToken)\n const [amount, setAmount] = useState<string>(ctx.defaultAmount ?? '')\n const [slippageBps, setSlippageBps] = useState<number>(ctx.defaultSlippageBps)\n const [showSlippage, setShowSlippage] = useState(false)\n const [quote, setQuote] = useState<any | null>(null)\n const [loading, setLoading] = useState<null | 'quote' | 'approve' | 'sign' | 'solve'>(null)\n const [error, setError] = useState<string | null>(null)\n const [txHash, setTxHash] = useState<string | null>(null)\n const [execMode, setExecMode] = useState<'gasless' | 'user-pays' | null>(null)\n\n const { address, isConnected } = useAccount()\n const walletChainId = useChainId()\n const { connect, connectors, isPending: isConnecting } = useConnect()\n const { disconnect } = useDisconnect()\n const { switchChain } = useSwitchChain()\n const publicClient = usePublicClient({ chainId: selectedChainId })\n const { signTypedDataAsync } = useSignTypedData()\n const { writeContract: approveWrite, data: approveTxHash, isPending: isApproving } = useWriteContract()\n const { isSuccess: approvalConfirmed } = useWaitForTransactionReceipt({ hash: approveTxHash })\n const { sendTransactionAsync, data: fallbackTxHash, isPending: isSendingFallback } = useSendTransaction()\n const { isSuccess: fallbackConfirmed } = useWaitForTransactionReceipt({ hash: fallbackTxHash })\n // Track the submitted swap tx (gasless solve hash or user-pays fallback hash)\n const { isSuccess: swapConfirmed } = useWaitForTransactionReceipt({\n hash: txHash as `0x${string}` | undefined,\n chainId: selectedChainId,\n })\n\n const isOnCorrectChain = walletChainId === selectedChainId\n const chainName = CHAIN_NAME[selectedChainId] ?? 'base'\n const chainLive = CHAIN_LIVE[selectedChainId] ?? false\n\n const { data: fromTokenBalance } = useReadContract({\n address: fromToken?.address as `0x${string}` | undefined,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address && fromToken ? [address] : undefined,\n chainId: selectedChainId,\n query: { enabled: !!address && !!fromToken && chainLive },\n })\n\n const { data: erc20Allowance, refetch: refetchAllowance } = useReadContract({\n address: fromToken?.address as `0x${string}` | undefined,\n abi: erc20Abi,\n functionName: 'allowance',\n args: address && fromToken ? [address, PERMIT2] : undefined,\n chainId: selectedChainId,\n query: { enabled: !!address && !!fromToken && chainLive },\n })\n\n useEffect(() => {\n if (approvalConfirmed) {\n refetchAllowance()\n setLoading(null)\n }\n }, [approvalConfirmed, refetchAllowance])\n\n useEffect(() => {\n if (fallbackConfirmed && fallbackTxHash) {\n setTxHash(fallbackTxHash)\n setLoading(null)\n setAmount('')\n setQuote(null)\n // Register the user-paid swap so the volume counts for the partner account.\n client.confirmTransaction?.(fallbackTxHash, chainName).catch(() => {})\n ctx.onSolve?.({ ok: true, transaction: { txHash: fallbackTxHash, to: '', data: '', value: '0', chain: chainName }, computeMs: 0 } as any)\n }\n }, [fallbackConfirmed, fallbackTxHash, chainName, ctx, client])\n\n const chainConfig = useMemo(() => {\n try {\n return chainConfigFromName(chainName)\n } catch {\n return undefined\n }\n }, [chainName])\n\n const fetchQuote = useCallback(async () => {\n if (!amount || Number.parseFloat(amount) <= 0 || !fromToken || !toToken || !chainLive) {\n setQuote(null)\n return\n }\n setLoading('quote')\n setError(null)\n try {\n const res = await client.getQuote({\n from: fromToken.symbol,\n to: toToken.symbol,\n amount,\n chain: chainName,\n fromAddress: fromToken.address,\n toAddress: toToken.address,\n fromDecimals: fromToken.decimals,\n toDecimals: toToken.decimals,\n })\n setQuote(res)\n ctx.onQuote?.(res)\n if (!res.ok) setError(res.error || 'Quote failed')\n } catch (e: any) {\n setError(e.message || 'Quote failed')\n setQuote(null)\n ctx.onError?.(e.message || 'Quote failed')\n } finally {\n setLoading(null)\n }\n }, [amount, fromToken, toToken, chainName, chainLive, client, ctx])\n\n useEffect(() => {\n const t = setTimeout(fetchQuote, 400)\n return () => clearTimeout(t)\n }, [fetchQuote])\n\n useEffect(() => {\n setFromToken(ctx.defaultFromToken)\n setToToken(ctx.defaultToToken)\n setAmount(ctx.defaultAmount ?? '')\n setQuote(null)\n setError(null)\n setTxHash(null)\n }, [selectedChainId, ctx.defaultFromToken, ctx.defaultToToken, ctx.defaultAmount])\n\n async function findUnusedNonce(owner: `0x${string}`): Promise<bigint> {\n if (!publicClient) throw new Error('No public client')\n const arr = new Uint32Array(1)\n crypto.getRandomValues(arr)\n const startWord = BigInt(arr[0] >> 8)\n const MAX_OFFSET = BigInt(1000)\n const MODULUS = BigInt(1000000)\n const EIGHT = BigInt(8)\n const ONE = BigInt(1)\n const ZERO = BigInt(0)\n for (let offset = BigInt(0); offset < MAX_OFFSET; offset++) {\n const wordPos = (startWord + offset) % MODULUS\n const bitmap = (await publicClient.readContract({\n address: PERMIT2,\n abi: permit2Abi,\n functionName: 'nonceBitmap',\n args: [owner, wordPos],\n })) as bigint\n if (bitmap === maxUint256) continue\n for (let bitPos = 0; bitPos < 256; bitPos++) {\n const bit = ONE << BigInt(bitPos)\n if ((bitmap & bit) === ZERO) {\n return (wordPos << EIGHT) | BigInt(bitPos)\n }\n }\n }\n throw new Error('No unused Permit2 nonce found')\n }\n\n function parseAmount(value: string, decimals: number): bigint {\n const normalized = value.trim()\n if (!/^\\d+(\\.\\d+)?$/.test(normalized)) throw new Error('Invalid amount')\n const [whole, fraction = ''] = normalized.split('.')\n if (fraction.length > decimals) throw new Error(`Amount supports at most ${decimals} decimals`)\n const scale = BigInt('1' + '0'.repeat(decimals))\n return BigInt(whole) * scale + BigInt(fraction.padEnd(decimals, '0') || '0')\n }\n\n async function handleSwap() {\n if (!isConnected || !address || !fromToken || !toToken || !quote?.ok) {\n setError('Connect a wallet and get a valid quote')\n return\n }\n if (!isOnCorrectChain || !chainLive) {\n setError(`Please switch to ${chainConfig?.shortName || 'Base'}`)\n return\n }\n\n setError(null)\n setTxHash(null)\n\n try {\n const amountRaw = parseAmount(amount, fromToken.decimals)\n if (fromTokenBalance !== undefined && fromTokenBalance < amountRaw) {\n const balHuman = Number(fromTokenBalance) / 10 ** fromToken.decimals\n setError(`Insufficient ${fromToken.symbol} balance. You have ${balHuman.toFixed(6)} ${fromToken.symbol} but tried ${amount}.`)\n return\n }\n\n const needsApproval = erc20Allowance === undefined || erc20Allowance === BigInt(0)\n if (needsApproval) {\n setLoading('approve')\n approveWrite({\n address: fromToken.address as `0x${string}`,\n abi: erc20Abi,\n functionName: 'approve',\n args: [PERMIT2, maxUint256],\n chainId: selectedChainId,\n })\n return\n }\n\n const nonce = await findUnusedNonce(address as `0x${string}`)\n const deadline = BigInt(Math.floor(Date.now() / 1000) + 3600)\n\n const spender = chainConfig?.tvmExecutor as `0x${string}`\n if (!spender) throw new Error('No TVMExecutor configured for this chain')\n\n setLoading('sign')\n const signature = await signTypedDataAsync({\n domain: buildPermit2Domain(Number(walletChainId)),\n types: PERMIT_TRANSFER_FROM_TYPES,\n primaryType: 'PermitTransferFrom',\n message: {\n permitted: { token: fromToken.address as `0x${string}`, amount: amountRaw },\n spender,\n nonce,\n deadline,\n },\n })\n\n if (!signature || signature.length < 10) {\n setError('Signature not provided')\n setLoading(null)\n return\n }\n\n // Below the solver's gasless notional floor, the API still encodes the\n // swap but the user submits it and pays gas — skip the live-solve call.\n const belowMin = quote?.gaslessEligible === false\n const wantsGasless = ctx.gasless && !belowMin\n\n setLoading('solve')\n setExecMode(wantsGasless ? 'gasless' : 'user-pays')\n\n const permit = {\n permitted: { token: fromToken.address, amount: amountRaw.toString() },\n nonce: nonce.toString(),\n deadline: deadline.toString(),\n }\n\n const solveRes = await client.solve({\n from: fromToken.symbol,\n to: toToken.symbol,\n amount,\n chain: chainName,\n user: address,\n fromAddress: fromToken.address,\n toAddress: toToken.address,\n fromDecimals: fromToken.decimals,\n toDecimals: toToken.decimals,\n permit,\n signature,\n slippageBps,\n dryRun: !wantsGasless,\n })\n\n if (solveRes.ok && solveRes.transaction?.txHash) {\n setTxHash(solveRes.transaction.txHash)\n setAmount('')\n setQuote(null)\n ctx.onSolve?.(solveRes)\n return\n }\n\n if (solveRes.error?.includes('Gas estimation failed')) {\n setError(`Solver rejected the swap: ${solveRes.error}`)\n setLoading(null)\n return\n }\n\n if (!wantsGasless) {\n if (!solveRes.ok || !solveRes.transaction) {\n setError(solveRes.error || 'Failed to encode swap')\n setLoading(null)\n return\n }\n setExecMode('user-pays')\n await sendTransactionAsync({\n to: solveRes.transaction.to as `0x${string}`,\n data: solveRes.transaction.data as `0x${string}`,\n value: BigInt(solveRes.transaction.value || '0'),\n chainId: selectedChainId,\n })\n return\n }\n\n // Gasless infra failed; fall back to user-pays.\n const dryRes = await client.dryRun({\n from: fromToken.symbol,\n to: toToken.symbol,\n amount,\n chain: chainName,\n user: address,\n fromAddress: fromToken.address,\n toAddress: toToken.address,\n fromDecimals: fromToken.decimals,\n toDecimals: toToken.decimals,\n permit,\n signature,\n slippageBps,\n })\n\n if (!dryRes.ok || !dryRes.transaction) {\n setError(dryRes.error || solveRes.error || 'Solver failed to encode swap')\n setLoading(null)\n return\n }\n\n setExecMode('user-pays')\n await sendTransactionAsync({\n to: dryRes.transaction.to as `0x${string}`,\n data: dryRes.transaction.data as `0x${string}`,\n value: BigInt(dryRes.transaction.value || '0'),\n chainId: selectedChainId,\n })\n } catch (e: any) {\n if (e.code === 4001 || e.message?.includes('rejected')) {\n setError('Signature or transaction rejected')\n } else {\n setError(`[${e.code || '?'}] ${e.message || 'Swap failed'}`)\n }\n setLoading(null)\n ctx.onError?.(e.message || 'Swap failed')\n }\n }\n\n function handleConnect() {\n const connector = connectors[0]\n if (connector) {\n connect({ connector })\n } else {\n setError('No wallet connector found')\n }\n }\n\n function handleChainChange(id: number) {\n if (!CHAIN_LIVE[id]) return\n setSelectedChainId(id)\n switchChain({ chainId: id as any })\n }\n\n const isBusy = loading !== null || isConnecting || isApproving || isSendingFallback\n const highImpact = quote?.ok && quote.quote?.priceImpactBps != null && quote.quote.priceImpactBps >= 300\n const canSwap = isConnected && isOnCorrectChain && chainLive && !!amount && !!fromToken && !!toToken && quote?.ok && !isBusy && !highImpact\n\n const buttonLabel = () => {\n if (!isConnected) return 'Connect Wallet'\n if (!isOnCorrectChain || !chainLive) return `Switch to ${chainConfig?.shortName || 'Base'}`\n if (loading === 'quote') return 'Fetching quote...'\n if (loading === 'approve' || isApproving) return 'Approve Permit2...'\n if (loading === 'sign') return 'Sign in wallet...'\n if (loading === 'solve' && execMode === 'gasless') return 'Executing gasless swap...'\n if (loading === 'solve' && execMode === 'user-pays') return 'Preparing fallback...'\n if (isSendingFallback) return 'Confirm in wallet...'\n return 'Swap'\n }\n\n const handleButtonClick = () => {\n if (!isConnected) return handleConnect()\n if (!isOnCorrectChain || !chainLive) {\n if (chainLive) switchChain({ chainId: selectedChainId as any })\n return\n }\n handleSwap()\n }\n\n const explorer = chainConfig?.explorer || 'https://basescan.org'\n const style = useMemo(() => themeToCssVariables(ctx.theme), [ctx.theme])\n\n return (\n <div className={`orkid-widget ${className ?? ''}`} style={style}>\n <div className=\"orkid-widget-header\">\n <div className=\"orkid-widget-title\">\n {ctx.logoUrl && <img src={ctx.logoUrl} alt=\"\" className=\"w-6 h-6 object-contain\" />}\n <span>{ctx.brandName || 'Swap'}</span>\n </div>\n <ChainSelect selected={selectedChainId} onSelect={handleChainChange} supported={ctx.supportedChains} />\n </div>\n\n <div className=\"space-y-4\">\n {isConnected && address ? (\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between' }}>\n <span className=\"orkid-widget-muted-text\" style={{ fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {address.slice(0, 6)}...{address.slice(-4)}\n </span>\n <button className=\"orkid-widget-button-secondary\" style={{ width: 'auto' }} onClick={() => disconnect()}>\n Disconnect\n </button>\n </div>\n ) : (\n <button className=\"orkid-widget-button\" onClick={handleConnect} disabled={isConnecting}>\n {isConnecting ? 'Connecting...' : 'Connect Wallet'}\n </button>\n )}\n\n <div>\n <div className=\"orkid-widget-label\">From</div>\n <div className=\"orkid-widget-row\">\n <TokenSelect value={fromToken} onChange={setFromToken} chainId={selectedChainId} chainName={chainName} tokenList={ctx.tokenList} client={client} />\n <input\n type=\"number\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n placeholder=\"0.0\"\n className=\"orkid-widget-input\"\n disabled={!chainLive}\n />\n </div>\n </div>\n\n <div>\n <div className=\"orkid-widget-label\">To</div>\n <div className=\"orkid-widget-row\">\n <TokenSelect value={toToken} onChange={setToToken} chainId={selectedChainId} chainName={chainName} tokenList={ctx.tokenList} client={client} />\n <div className=\"orkid-widget-input\" style={{ display: 'flex', alignItems: 'center', fontFamily: 'monospace', fontSize: '0.875rem' }}>\n {loading === 'quote' ? (\n <span className=\"orkid-widget-spin\">↻</span>\n ) : quote?.ok ? (\n quote.quote?.amountOut || '--'\n ) : (\n '--'\n )}\n </div>\n </div>\n </div>\n\n {quote?.ok && quote.savings && (\n <div className=\"orkid-widget-card\" style={{ padding: '0.75rem' }}>\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between', fontSize: '0.875rem' }}>\n <span style={{ color: 'var(--orkid-widget-muted-foreground)' }}>Orkid Fee</span>\n <span style={{ color: 'var(--orkid-widget-primary)', fontWeight: 600 }}>{quote.savings.orkidBps} bps</span>\n </div>\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between', fontSize: '0.875rem' }}>\n <span style={{ color: 'var(--orkid-widget-muted-foreground)' }}>MetaMask Avg</span>\n <span style={{ textDecoration: 'line-through' }}>{quote.savings.metamaskBps} bps</span>\n </div>\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between', fontSize: '0.875rem', borderTop: '1px solid var(--orkid-widget-border)', paddingTop: '0.5rem', marginTop: '0.5rem' }}>\n <span style={{ color: 'var(--orkid-widget-primary)' }}>You Save</span>\n <span style={{ fontWeight: 700, color: 'var(--orkid-widget-primary)' }}>{quote.savings.savingsMultiplier} lower fees</span>\n </div>\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between', fontSize: '0.75rem' }}>\n <span style={{ color: 'var(--orkid-widget-muted-foreground)' }}>Gas</span>\n <span style={{ color: 'var(--orkid-widget-success)' }}>\n {quote?.gaslessEligible === false ? 'You pay (below $20 gasless min)' : execMode === 'user-pays' ? 'User pays' : 'Gasless'}\n </span>\n </div>\n </div>\n )}\n\n {quote?.ok && quote.quote?.amountOut && (\n <div>\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between', fontSize: '0.875rem' }}>\n <span style={{ color: 'var(--orkid-widget-muted-foreground)' }}>Minimum receive</span>\n <span style={{ fontFamily: 'monospace' }}>\n {(Number(quote.quote.amountOut) * (1 - slippageBps / 10000)).toFixed(6)} {toToken?.symbol}\n </span>\n </div>\n <div className=\"orkid-widget-row\" style={{ justifyContent: 'space-between', fontSize: '0.75rem' }}>\n <button onClick={() => setShowSlippage(!showSlippage)} style={{ color: 'var(--orkid-widget-muted-foreground)', background: 'none', border: 'none', cursor: 'pointer' }}>\n Slippage: {(slippageBps / 100).toFixed(1)}% {showSlippage ? '▲' : '▼'}\n </button>\n {showSlippage && (\n <div className=\"orkid-widget-row\">\n {[10, 50, 100, 200].map((bps) => (\n <button\n key={bps}\n onClick={() => setSlippageBps(bps)}\n className={slippageBps === bps ? 'orkid-widget-button' : 'orkid-widget-button-secondary'}\n style={{ width: 'auto', padding: '0.25rem 0.5rem', fontSize: '0.75rem' }}\n >\n {bps / 100}%\n </button>\n ))}\n <input\n type=\"number\"\n min={1}\n max={500}\n step={1}\n placeholder=\"custom bps\"\n className=\"orkid-widget-input\"\n style={{ width: '6.5rem', padding: '0.25rem 0.5rem', fontSize: '0.75rem' }}\n onChange={(e) => {\n const v = Number(e.target.value)\n if (v > 0 && v <= 500) setSlippageBps(v)\n }}\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {quote?.ok && quote.quote?.priceImpactBps != null && quote.quote.priceImpactBps > 100 && (\n quote.quote.priceImpactBps >= 300 ? (\n <div className=\"orkid-widget-warning\">\n <div style={{ fontWeight: 600 }}>High Price Impact: {(quote.quote.priceImpactBps / 100).toFixed(1)}%</div>\n <p style={{ fontSize: '0.875rem', margin: '0.25rem 0 0' }}>This size exceeds available pool liquidity. Contact Orkid for OTC/API access.</p>\n </div>\n ) : (\n <div style={{ color: 'var(--orkid-widget-warning)', fontSize: '0.75rem' }}>\n Price impact: {(quote.quote.priceImpactBps / 100).toFixed(2)}%\n </div>\n )\n )}\n\n {txHash && (\n <div className=\"orkid-widget-success\">\n {swapConfirmed ? (\n <>Swap confirmed{execMode === 'user-pays' ? ' (you paid gas)' : ' (gasless)'}</>\n ) : (\n <>\n <span className=\"orkid-widget-spin\" style={{ marginRight: '0.5rem' }}>↻</span>\n Swap submitted{execMode === 'user-pays' ? ' (you paid gas)' : ' (gasless)'} — confirming…\n </>\n )}{' '}\n <a href={`${explorer}/tx/${txHash}`} target=\"_blank\" rel=\"noopener noreferrer\" style={{ textDecoration: 'underline' }}>\n View\n </a>\n {swapConfirmed && (\n <button\n className=\"orkid-widget-button-secondary\"\n style={{ width: 'auto', padding: '0.25rem 0.75rem', fontSize: '0.75rem', marginLeft: '0.5rem' }}\n onClick={() => { setTxHash(null); setExecMode(null); setQuote(null); setAmount('') }}\n >\n Swap again\n </button>\n )}\n </div>\n )}\n\n {quote?.ok && quote.gaslessEligible === false && !txHash && !error && (\n <div style={{ color: 'var(--orkid-widget-muted-foreground)', fontSize: '0.75rem' }}>\n Below the gasless minimum — you will submit this swap and pay gas yourself.\n </div>\n )}\n\n {isConnected && canSwap && !txHash && !error && (\n <div className=\"orkid-widget-info\">\n <p style={{ fontWeight: 600 }}>How this works:</p>\n <p>1. Sign a permit off-chain (no gas) to authorize the solver.</p>\n <p>2. The solver sends the transaction and pays the gas.</p>\n </div>\n )}\n\n <button className=\"orkid-widget-button\" onClick={handleButtonClick} disabled={isConnected && !canSwap}>\n {(isBusy) && <span className=\"orkid-widget-spin\" style={{ marginRight: '0.5rem' }}>↻</span>}\n {buttonLabel()}\n </button>\n\n {error && <div className=\"orkid-widget-error\">{error}</div>}\n\n {ctx.showPoweredBy && (\n <div className=\"orkid-widget-footer\">\n Powered by Orkid · Competitive fee · Gasless\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { OrkidClient } from '@orkid/sdk'\nimport type { OrkidWidgetToken } from './types'\n\nexport function TokenSelect({\n value,\n onChange,\n chainId,\n chainName,\n tokenList,\n client,\n label,\n}: {\n value?: OrkidWidgetToken\n onChange: (token: OrkidWidgetToken) => void\n chainId: number\n chainName: string\n tokenList?: OrkidWidgetToken[]\n client: OrkidClient\n label?: string\n}) {\n const [open, setOpen] = useState(false)\n const [search, setSearch] = useState('')\n const [tokens, setTokens] = useState<OrkidWidgetToken[]>(tokenList || [])\n const [loading, setLoading] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (tokenList) {\n setTokens(tokenList.filter((t) => t.chain === chainName))\n return\n }\n if (!open) return\n setLoading(true)\n const t = setTimeout(async () => {\n try {\n const res = await client.listTokens({ search, limit: 50, chain: chainName })\n if (res.ok && res.tokens) {\n setTokens(res.tokens.filter((t: OrkidWidgetToken) => t.address !== '0x0000000000000000000000000000000000000000'))\n }\n } catch (err: any) {\n console.error('TokenSelect fetch failed:', err)\n } finally {\n setLoading(false)\n }\n }, 200)\n return () => clearTimeout(t)\n }, [open, search, chainName, tokenList, client])\n\n useEffect(() => {\n if (open && searchRef.current) searchRef.current.focus()\n }, [open])\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n if (open) document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n useEffect(() => {\n setSearch('')\n if (!tokenList) setTokens([])\n }, [chainName, tokenList])\n\n return (\n <div ref={ref} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"orkid-widget-select-trigger\"\n >\n <span>{value ? value.symbol : 'Select'}</span>\n <span>▼</span>\n </button>\n {open && (\n <div className=\"orkid-widget-dropdown\">\n <div style={{ borderBottom: '1px solid var(--orkid-widget-border)', padding: '0.5rem' }}>\n <input\n ref={searchRef}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search token...\"\n className=\"orkid-widget-search\"\n />\n </div>\n <div style={{ maxHeight: '16rem', overflowY: 'auto' }}>\n {loading ? (\n <div style={{ padding: '0.75rem', textAlign: 'center', color: 'var(--orkid-widget-muted-foreground)' }}>Loading...</div>\n ) : tokens.length === 0 ? (\n <div style={{ padding: '0.75rem', textAlign: 'center', color: 'var(--orkid-widget-muted-foreground)' }}>No tokens found</div>\n ) : (\n tokens.map((t) => (\n <button\n key={t.address}\n type=\"button\"\n className=\"orkid-widget-dropdown-item\"\n onClick={() => {\n onChange(t)\n setOpen(false)\n setSearch('')\n }}\n >\n <span style={{ fontWeight: 500 }}>{t.symbol}</span>\n <span style={{ fontSize: '0.75rem', fontFamily: 'monospace', color: 'var(--orkid-widget-muted-foreground)' }}>\n {t.address.slice(0, 6)}...{t.address.slice(-4)}\n </span>\n </button>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","import { useEffect, useRef, useState } from 'react'\nimport { ORKID_CHAIN_CONFIG } from '@orkid/sdk'\n\nconst CHAIN_NAME: Record<number, string> = {\n 8453: 'base',\n 1: 'ethereum',\n 42161: 'arbitrum',\n 137: 'polygon',\n}\n\nconst CHAIN_LIVE: Record<number, boolean> = {\n 8453: true,\n 1: true,\n 42161: true,\n 137: true,\n}\n\nexport function ChainSelect({\n selected,\n onSelect,\n supported,\n}: {\n selected: number\n onSelect: (id: number) => void\n supported: number[]\n}) {\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n if (open) document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n const currentConfig = ORKID_CHAIN_CONFIG[selected]\n\n return (\n <div ref={ref} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"orkid-widget-select-trigger\"\n style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}\n >\n <span\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n background: currentConfig?.color || 'var(--orkid-widget-primary)',\n }}\n />\n <span>{currentConfig?.shortName || 'BASE'}</span>\n <span>▼</span>\n </button>\n {open && (\n <div className=\"orkid-widget-dropdown\" style={{ right: 0, left: 'auto', width: '12rem' }}>\n {supported.map((id) => {\n const config = ORKID_CHAIN_CONFIG[id]\n const live = CHAIN_LIVE[id]\n return (\n <button\n key={id}\n type=\"button\"\n className=\"orkid-widget-dropdown-item\"\n onClick={() => {\n if (live) onSelect(id)\n setOpen(false)\n }}\n disabled={!live}\n title={live ? undefined : 'Contact Orkid to enable this chain'}\n >\n <span className=\"orkid-widget-row\" style={{ gap: '0.5rem' }}>\n <span\n style={{\n width: '0.5rem',\n height: '0.5rem',\n borderRadius: '50%',\n background: config?.color || 'var(--orkid-widget-primary)',\n }}\n />\n <span>{config?.name || CHAIN_NAME[id]}</span>\n </span>\n {id === selected && <span style={{ color: 'var(--orkid-widget-primary)' }}>✓</span>}\n {!live && <span style={{ fontSize: '0.7rem', color: 'var(--orkid-widget-muted-foreground)' }}>soon</span>}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { OrkidWidgetTheme } from './types'\n\nexport interface OrkidSwapIframeProps {\n /** Base URL of the hosted widget page, e.g. https://widget.orkidlabs.xyz */\n src?: string\n /** Partner identifier */\n partner?: string\n /** Brand name to show */\n brandName?: string\n /** Logo URL */\n logoUrl?: string\n /** Theme overrides */\n theme?: OrkidWidgetTheme\n /** Default input token */\n fromToken?: string\n /** Default output token */\n toToken?: string\n /** Default amount */\n amount?: string\n /** Whether to show \"Powered by Orkid\" */\n showPoweredBy?: boolean\n /** Allow iframe to go fullscreen */\n allowFullScreen?: boolean\n /** Additional class name */\n className?: string\n /** Additional style */\n style?: CSSProperties\n}\n\nexport function OrkidSwapIframe({\n src = 'https://widget.orkidlabs.xyz',\n partner,\n brandName,\n logoUrl,\n theme,\n fromToken,\n toToken,\n amount,\n showPoweredBy,\n allowFullScreen,\n className,\n style,\n}: OrkidSwapIframeProps) {\n const url = useMemo(() => {\n const u = new URL(src)\n if (partner) u.searchParams.set('partner', partner)\n if (brandName) u.searchParams.set('brand', brandName)\n if (logoUrl) u.searchParams.set('logo', logoUrl)\n if (theme) u.searchParams.set('theme', encodeURIComponent(JSON.stringify(theme)))\n if (fromToken) u.searchParams.set('from', fromToken)\n if (toToken) u.searchParams.set('to', toToken)\n if (amount) u.searchParams.set('amount', amount)\n if (showPoweredBy !== undefined) u.searchParams.set('poweredBy', String(showPoweredBy))\n return u.toString()\n }, [src, partner, brandName, logoUrl, theme, fromToken, toToken, amount, showPoweredBy])\n\n return (\n <iframe\n src={url}\n className={className}\n style={{ width: '100%', height: '100%', minHeight: '560px', border: 'none', ...style }}\n allowFullScreen={allowFullScreen}\n title=\"Orkid Swap\"\n />\n )\n}\n","import { createElement } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { OrkidSwapProvider } from './OrkidSwapProvider'\nimport { OrkidSwapWidget } from './OrkidSwapWidget'\nimport type { OrkidSwapProviderProps } from './types'\n\nexport interface OrkidSwapEmbedOptions extends OrkidSwapProviderProps {\n /** The DOM element or selector to mount the widget into. */\n target: HTMLElement | string\n}\n\n/**\n * Mounts the Orkid swap widget into a DOM element.\n * Useful for script embeds or non-React hosts.\n */\nexport function mountOrkidSwap(options: OrkidSwapEmbedOptions): () => void {\n const { target, ...props } = options\n const el = typeof target === 'string' ? document.querySelector(target) : target\n if (!el) throw new Error(`OrkidSwap: target element not found: ${target}`)\n\n const root = createRoot(el)\n root.render(\n createElement(OrkidSwapProvider, props, createElement(OrkidSwapWidget))\n )\n\n return () => root.unmount()\n}\n"],"mappings":"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","names":["useEffect","useMemo","useState","jsx","t","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","CHAIN_NAME","CHAIN_LIVE","useState","useEffect","useMemo","useMemo","jsx"]}
@@ -0,0 +1,207 @@
1
+ .orkid-widget {
2
+ font-family: var(--orkid-widget-font-family);
3
+ color: var(--orkid-widget-text);
4
+ background: var(--orkid-widget-bg);
5
+ border-radius: var(--orkid-widget-radius);
6
+ border: 1px solid var(--orkid-widget-border);
7
+ padding: 1rem;
8
+ width: 100%;
9
+ max-width: 28rem;
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ .orkid-widget *, .orkid-widget *::before, .orkid-widget *::after {
14
+ box-sizing: border-box;
15
+ }
16
+
17
+ .orkid-widget-card {
18
+ background: var(--orkid-widget-card);
19
+ color: var(--orkid-widget-card-foreground);
20
+ border-radius: var(--orkid-widget-radius);
21
+ border: 1px solid var(--orkid-widget-border);
22
+ }
23
+
24
+ .orkid-widget-header {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: space-between;
28
+ gap: 0.75rem;
29
+ margin-bottom: 1rem;
30
+ }
31
+
32
+ .orkid-widget-title {
33
+ font-size: 1rem;
34
+ font-weight: 600;
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 0.5rem;
38
+ }
39
+
40
+ .orkid-widget-label {
41
+ font-size: 0.875rem;
42
+ color: var(--orkid-widget-muted-foreground);
43
+ margin-bottom: 0.25rem;
44
+ }
45
+
46
+ .orkid-widget-row {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 0.5rem;
50
+ }
51
+
52
+ .orkid-widget-input,
53
+ .orkid-widget-select-trigger,
54
+ .orkid-widget-button {
55
+ font-family: inherit;
56
+ font-size: 0.875rem;
57
+ border-radius: var(--orkid-widget-radius);
58
+ border: 1px solid var(--orkid-widget-input);
59
+ background: var(--orkid-widget-card);
60
+ color: var(--orkid-widget-card-foreground);
61
+ padding: 0.5rem 0.75rem;
62
+ min-height: 2.5rem;
63
+ }
64
+
65
+ .orkid-widget-input {
66
+ flex: 1;
67
+ outline: none;
68
+ }
69
+
70
+ .orkid-widget-input:focus,
71
+ .orkid-widget-select-trigger:focus,
72
+ .orkid-widget-button:focus {
73
+ outline: 2px solid var(--orkid-widget-ring);
74
+ outline-offset: -1px;
75
+ }
76
+
77
+ .orkid-widget-button {
78
+ cursor: pointer;
79
+ background: var(--orkid-widget-primary);
80
+ color: var(--orkid-widget-primary-foreground);
81
+ border-color: var(--orkid-widget-primary);
82
+ width: 100%;
83
+ font-weight: 600;
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ gap: 0.5rem;
88
+ }
89
+
90
+ .orkid-widget-button:disabled {
91
+ opacity: 0.5;
92
+ cursor: not-allowed;
93
+ }
94
+
95
+ .orkid-widget-button-secondary {
96
+ background: var(--orkid-widget-muted);
97
+ color: var(--orkid-widget-muted-foreground);
98
+ border-color: var(--orkid-widget-border);
99
+ }
100
+
101
+ .orkid-widget-select-trigger {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ justify-content: space-between;
105
+ gap: 0.5rem;
106
+ cursor: pointer;
107
+ min-width: 7rem;
108
+ }
109
+
110
+ .orkid-widget-dropdown {
111
+ position: absolute;
112
+ z-index: 50;
113
+ top: 100%;
114
+ left: 0;
115
+ margin-top: 0.25rem;
116
+ width: 18rem;
117
+ background: var(--orkid-widget-popover);
118
+ color: var(--orkid-widget-popover-foreground);
119
+ border: 1px solid var(--orkid-widget-border);
120
+ border-radius: var(--orkid-widget-radius);
121
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
122
+ }
123
+
124
+ .orkid-widget-dropdown-item {
125
+ width: 100%;
126
+ text-align: left;
127
+ padding: 0.5rem 0.75rem;
128
+ background: transparent;
129
+ border: none;
130
+ color: inherit;
131
+ cursor: pointer;
132
+ font-size: 0.875rem;
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: space-between;
136
+ }
137
+
138
+ .orkid-widget-dropdown-item:hover {
139
+ background: var(--orkid-widget-accent);
140
+ color: var(--orkid-widget-accent-foreground);
141
+ }
142
+
143
+ .orkid-widget-dropdown-item:disabled {
144
+ opacity: 0.5;
145
+ cursor: not-allowed;
146
+ }
147
+
148
+ .orkid-widget-search {
149
+ width: 100%;
150
+ border: none;
151
+ background: transparent;
152
+ color: inherit;
153
+ padding: 0.5rem 0.75rem;
154
+ outline: none;
155
+ }
156
+
157
+ .orkid-widget-success {
158
+ color: var(--orkid-widget-success);
159
+ background: color-mix(in srgb, var(--orkid-widget-success) 10%, transparent);
160
+ border: 1px solid color-mix(in srgb, var(--orkid-widget-success) 30%, transparent);
161
+ border-radius: var(--orkid-widget-radius);
162
+ padding: 0.75rem;
163
+ font-size: 0.875rem;
164
+ }
165
+
166
+ .orkid-widget-error {
167
+ color: var(--orkid-widget-danger);
168
+ background: color-mix(in srgb, var(--orkid-widget-danger) 10%, transparent);
169
+ border: 1px solid color-mix(in srgb, var(--orkid-widget-danger) 30%, transparent);
170
+ border-radius: var(--orkid-widget-radius);
171
+ padding: 0.75rem;
172
+ font-size: 0.875rem;
173
+ }
174
+
175
+ .orkid-widget-warning {
176
+ color: var(--orkid-widget-warning);
177
+ background: color-mix(in srgb, var(--orkid-widget-warning) 10%, transparent);
178
+ border: 1px solid color-mix(in srgb, var(--orkid-widget-warning) 30%, transparent);
179
+ border-radius: var(--orkid-widget-radius);
180
+ padding: 0.75rem;
181
+ font-size: 0.875rem;
182
+ }
183
+
184
+ .orkid-widget-info {
185
+ color: var(--orkid-widget-muted-foreground);
186
+ background: color-mix(in srgb, var(--orkid-widget-primary) 5%, transparent);
187
+ border: 1px solid color-mix(in srgb, var(--orkid-widget-primary) 20%, transparent);
188
+ border-radius: var(--orkid-widget-radius);
189
+ padding: 0.75rem;
190
+ font-size: 0.75rem;
191
+ }
192
+
193
+ .orkid-widget-footer {
194
+ font-size: 0.75rem;
195
+ color: var(--orkid-widget-muted-foreground);
196
+ text-align: center;
197
+ margin-top: 0.75rem;
198
+ }
199
+
200
+ .orkid-widget-spin {
201
+ animation: orkid-spin 1s linear infinite;
202
+ }
203
+
204
+ @keyframes orkid-spin {
205
+ from { transform: rotate(0deg); }
206
+ to { transform: rotate(360deg); }
207
+ }
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@orkid-labs/widget",
3
+ "version": "0.1.0",
4
+ "description": "White-label React swap widget for the Orkid gasless swap API",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.mjs",
8
+ "types": "dist/index.d.ts",
9
+ "style": "dist/styles.css",
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsup",
16
+ "typecheck": "tsc --noEmit",
17
+ "lint": "tsc --noEmit",
18
+ "build:css": "cat src/styles.css > dist/styles.css",
19
+ "prepare": "npm run build && npm run build:css"
20
+ },
21
+ "keywords": [
22
+ "orkid",
23
+ "swap",
24
+ "widget",
25
+ "gasless",
26
+ "permit2",
27
+ "react",
28
+ "base",
29
+ "ethereum",
30
+ "arbitrum",
31
+ "polygon",
32
+ "defi"
33
+ ],
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/orkidlabs/orkid.git",
37
+ "directory": "orkid-widget"
38
+ },
39
+ "homepage": "https://docs.orkidlabs.xyz",
40
+ "bugs": {
41
+ "url": "https://github.com/orkidlabs/orkid/issues"
42
+ },
43
+ "peerDependencies": {
44
+ "@orkid-labs/sdk": "^0.1.0",
45
+ "@tanstack/react-query": "^5.0.0",
46
+ "react": "^19.0.0",
47
+ "react-dom": "^19.0.0",
48
+ "viem": "^2.0.0",
49
+ "wagmi": "^2.0.0"
50
+ },
51
+ "devDependencies": {
52
+ "@orkid-labs/sdk": "file:../orkid-sdk",
53
+ "@tanstack/react-query": "^5.0.0",
54
+ "@types/react": "^19.0.0",
55
+ "@types/react-dom": "^19.0.0",
56
+ "react": "^19.0.0",
57
+ "react-dom": "^19.0.0",
58
+ "tsup": "^8.0.0",
59
+ "typescript": "^5.3.0",
60
+ "viem": "^2.41.0",
61
+ "wagmi": "^2.19.0"
62
+ }
63
+ }