@flapsdk/vault-runtime 0.1.5 → 0.1.7
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/package.json +1 -1
- package/runtime-contract.json +1 -1
- package/ui.d.mts +10 -1
- package/ui.js +26 -1
- package/ui.js.map +1 -1
package/package.json
CHANGED
package/runtime-contract.json
CHANGED
package/ui.d.mts
CHANGED
|
@@ -72,6 +72,15 @@ interface MetricProps {
|
|
|
72
72
|
}
|
|
73
73
|
declare function Metric({ label, value, hint, tone, className }: MetricProps): React.JSX.Element;
|
|
74
74
|
|
|
75
|
+
type ReviewedFrameProvider = "tradingview" | "dexscreener" | "coingecko-terminal";
|
|
76
|
+
interface ReviewedFrameProps extends Omit<React.IframeHTMLAttributes<HTMLIFrameElement>, "allow" | "referrerPolicy" | "sandbox" | "src" | "srcDoc" | "title"> {
|
|
77
|
+
frameId: string;
|
|
78
|
+
provider: ReviewedFrameProvider;
|
|
79
|
+
src: string;
|
|
80
|
+
title: string;
|
|
81
|
+
}
|
|
82
|
+
declare function ReviewedFrame({ className, frameId, provider, src, title, ...props }: ReviewedFrameProps): React.JSX.Element;
|
|
83
|
+
|
|
75
84
|
type StatusTone = "neutral" | "success" | "warning" | "danger";
|
|
76
85
|
declare function StatusBadge({ children, tone }: {
|
|
77
86
|
children: ReactNode;
|
|
@@ -96,4 +105,4 @@ interface VaultBannerProps {
|
|
|
96
105
|
}
|
|
97
106
|
declare function VaultBanner({ title, description, badges, meta, action, icon, className }: VaultBannerProps): React.JSX.Element;
|
|
98
107
|
|
|
99
|
-
export { AddressLink, Alert, Button, type ButtonProps, Card, CardContent, CardDescription, CardHeader, CardTitle, Countdown, DataRow, DetailTile, Input, type InputProps, Metric, StatusBadge, type StatusTone, TxButton, type TxButtonState, VaultBanner, buttonVariants };
|
|
108
|
+
export { AddressLink, Alert, Button, type ButtonProps, Card, CardContent, CardDescription, CardHeader, CardTitle, Countdown, DataRow, DetailTile, Input, type InputProps, Metric, ReviewedFrame, type ReviewedFrameProps, type ReviewedFrameProvider, StatusBadge, type StatusTone, TxButton, type TxButtonState, VaultBanner, buttonVariants };
|
package/ui.js
CHANGED
|
@@ -186,6 +186,31 @@ var valueToneClass = {
|
|
|
186
186
|
function Metric({ label, value, hint, tone = "default", className }) {
|
|
187
187
|
return /* @__PURE__ */ React.createElement("div", { className: cn("rounded-md border p-3", toneClass3[tone], className) }, /* @__PURE__ */ React.createElement("div", { className: "text-xs font-medium text-[#a9b6c8]" }, label), /* @__PURE__ */ React.createElement("div", { className: cn("mt-2 break-words text-xl font-semibold tracking-normal", valueToneClass[tone]) }, value), hint ? /* @__PURE__ */ React.createElement("div", { className: "mt-1 text-xs text-[#d8e2ef]" }, hint) : null);
|
|
188
188
|
}
|
|
189
|
+
function ReviewedFrame({ className, frameId, provider, src, title, ...props }) {
|
|
190
|
+
const {
|
|
191
|
+
allow: _allow,
|
|
192
|
+
referrerPolicy: _referrerPolicy,
|
|
193
|
+
sandbox: _sandbox,
|
|
194
|
+
src: _src,
|
|
195
|
+
srcDoc: _srcDoc,
|
|
196
|
+
title: _title,
|
|
197
|
+
...safeProps
|
|
198
|
+
} = props;
|
|
199
|
+
return /* @__PURE__ */ React3.createElement(
|
|
200
|
+
"iframe",
|
|
201
|
+
{
|
|
202
|
+
...safeProps,
|
|
203
|
+
"data-frame-id": frameId,
|
|
204
|
+
"data-frame-provider": provider,
|
|
205
|
+
src,
|
|
206
|
+
title,
|
|
207
|
+
loading: "lazy",
|
|
208
|
+
referrerPolicy: "no-referrer",
|
|
209
|
+
sandbox: "allow-scripts allow-same-origin",
|
|
210
|
+
className: cn("min-h-[360px] w-full rounded-lg border border-[#3a4d66] bg-[#0b111a]", className)
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
}
|
|
189
214
|
|
|
190
215
|
// src/ui/StatusBadge.tsx
|
|
191
216
|
var toneClass4 = {
|
|
@@ -227,6 +252,6 @@ function VaultBanner({ title, description, badges, meta, action, icon, className
|
|
|
227
252
|
);
|
|
228
253
|
}
|
|
229
254
|
|
|
230
|
-
export { AddressLink, Alert, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Countdown, DataRow, DetailTile, Input, Metric, StatusBadge, TxButton, VaultBanner, buttonVariants };
|
|
255
|
+
export { AddressLink, Alert, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Countdown, DataRow, DetailTile, Input, Metric, ReviewedFrame, StatusBadge, TxButton, VaultBanner, buttonVariants };
|
|
231
256
|
//# sourceMappingURL=ui.js.map
|
|
232
257
|
//# sourceMappingURL=ui.js.map
|
package/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sdk/format.ts","../../src/ui/AddressLink.tsx","../../src/ui/utils.ts","../../src/ui/Alert.tsx","../../src/ui/Button.tsx","../../src/ui/Card.tsx","../../src/ui/Countdown.tsx","../../src/ui/DataRow.tsx","../../src/ui/DetailTile.tsx","../../src/ui/Input.tsx","../../src/ui/Metric.tsx","../../src/ui/StatusBadge.tsx","../../src/ui/TxButton.tsx","../../src/ui/VaultBanner.tsx"],"names":["React2","toneClass","React4"],"mappings":"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","file":"ui.js","sourcesContent":["import Decimal from \"decimal.js\";\nimport { formatUnits, parseUnits } from \"viem\";\n\nexport function shortenAddress(raw?: string, start = 6, end = 4) {\n if (!raw) return \"\";\n if (raw.length <= start + end) return raw;\n return `${raw.slice(0, start)}...${raw.slice(-end)}`;\n}\n\nexport function formatTokenAmount(value?: bigint | string | number | null, decimals = 18, precision = 4) {\n if (value === undefined || value === null) return \"-\";\n const raw = typeof value === \"bigint\" ? formatUnits(value, decimals) : String(value);\n return new Decimal(raw).toDecimalPlaces(precision, Decimal.ROUND_DOWN).toString();\n}\n\nexport function parseTokenAmount(value: string, decimals = 18) {\n if (!/^\\d*(\\.\\d*)?$/.test(value.trim())) {\n throw new Error(\"Invalid decimal amount.\");\n }\n return parseUnits(value || \"0\", decimals);\n}\n\nexport function formatPercentBps(value?: bigint | number | null, precision = 2) {\n if (value === undefined || value === null) return \"-\";\n return `${new Decimal(String(value)).div(100).toDecimalPlaces(precision).toString()}%`;\n}\n\nexport function formatCountdown(targetTimeMs?: number) {\n if (!targetTimeMs) return \"-\";\n const diff = Math.max(0, targetTimeMs - Date.now());\n const totalSeconds = Math.floor(diff / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import { ExternalLink } from \"lucide-react\";\nimport { shortenAddress } from \"@/src/sdk/format\";\n\ninterface AddressLinkProps {\n address?: string;\n explorerBaseUrl?: string;\n label?: string;\n}\n\nexport function AddressLink({ address, explorerBaseUrl, label }: AddressLinkProps) {\n if (!address) return <span>-</span>;\n const href = explorerBaseUrl ? `${explorerBaseUrl.replace(/\\/$/, \"\")}/address/${address}` : undefined;\n const content = (\n <span className=\"inline-flex min-w-0 items-center gap-1 text-primary\">\n <span className=\"truncate\">{label || shortenAddress(address)}</span>\n {href ? <ExternalLink className=\"h-3.5 w-3.5 shrink-0\" /> : null}\n </span>\n );\n return href ? (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n {content}\n </a>\n ) : (\n content\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AlertTriangle, CheckCircle2, Info } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst toneClass: Record<AlertTone, string> = {\n info: \"border-[#3f5f8f] bg-[#17243a] text-[#d8e2ef]\",\n success: \"border-[#35d39d]/35 bg-[#173c39] text-[#8ff4c8]\",\n warning: \"border-[#f2c94c]/35 bg-[#42381f] text-[#fff0b8]\",\n danger: \"border-[#ff6b6b]/35 bg-[#4a1f27] text-[#ffc4c4]\",\n};\n\nconst iconMap = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertTriangle,\n};\n\nexport function Alert({ children, tone = \"info\", className }: { children: ReactNode; tone?: AlertTone; className?: string }) {\n const Icon = iconMap[tone];\n return (\n <div className={cn(\"flex gap-3 rounded-md border p-3 text-sm font-medium leading-6\", toneClass[tone], className)}>\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0 opacity-90\" />\n <div className=\"min-w-0 break-words\">{children}</div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"./utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#4a90ff]/60 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"border border-[#4a90ff]/60 bg-[#315fb5] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.16)] hover:bg-[#3b70d6]\",\n secondary: \"border border-[#3a4d66] bg-[#304057] text-white hover:bg-[#3a4c65]\",\n outline: \"border border-[#3d6ba8] bg-[#17243a] text-[#d8e8ff] hover:border-[#559cff] hover:bg-[#1d3150]\",\n ghost: \"text-[#a8b5c7] hover:bg-[#304057] hover:text-white\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n },\n size: {\n default: \"h-10 px-4\",\n sm: \"h-8 px-3 text-xs\",\n lg: \"h-12 px-5\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, disabled, children, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n if (asChild) {\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props}>\n {children}\n </Comp>\n );\n }\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {children}\n </Comp>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-[#3a4d66] bg-[#1d2938] text-white shadow-panel shadow-black/30 backdrop-blur\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col gap-1.5 p-5\", className)} {...props} />\n ),\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn(\"text-lg font-semibold leading-tight tracking-normal text-white\", className)} {...props} />\n ),\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm leading-6 text-[#a8b5c7]\", className)} {...props} />\n ),\n);\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => <div ref={ref} className={cn(\"p-5 pt-0\", className)} {...props} />,\n);\nCardContent.displayName = \"CardContent\";\n\nexport { Card, CardContent, CardDescription, CardHeader, CardTitle };\n","import { useEffect, useMemo, useState } from \"react\";\n\nfunction formatMs(ms: number) {\n const safe = Math.max(0, ms);\n const totalSeconds = Math.floor(safe / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n\nexport function Countdown({ targetTimeMs, fallback = \"-\" }: { targetTimeMs?: number; fallback?: string }) {\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n const timer = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(timer);\n }, []);\n\n const text = useMemo(() => {\n if (!targetTimeMs) return fallback;\n return formatMs(targetTimeMs - now);\n }, [fallback, now, targetTimeMs]);\n\n return <span>{text}</span>;\n}\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ninterface DataRowProps {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n className?: string;\n}\n\nexport function DataRow({ label, value, detail, className }: DataRowProps) {\n return (\n <div className={cn(\"flex items-start justify-between gap-4 border-b border-white/8 py-3 last:border-0\", className)}>\n <div className=\"min-w-0 text-sm text-white/54\">{label}</div>\n <div className=\"min-w-0 text-right\">\n <div className=\"break-words text-sm font-semibold text-white\">{value}</div>\n {detail ? <div className=\"mt-1 text-xs text-white/42\">{detail}</div> : null}\n </div>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype DetailTileTone = \"default\" | \"primary\" | \"success\" | \"warning\" | \"muted\";\n\nconst toneClass: Record<DetailTileTone, string> = {\n default: \"border-[#40536c] bg-[#304057]\",\n primary: \"border-[#3b82f6]/60 bg-[#17325a]\",\n success: \"border-[#35d39d]/40 bg-[#173c39]\",\n warning: \"border-[#f2c94c]/40 bg-[#42381f]\",\n muted: \"border-[#33445b] bg-[#172131]\",\n};\n\ninterface DetailTileProps {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n icon?: ReactNode;\n tone?: DetailTileTone;\n className?: string;\n valueClassName?: string;\n}\n\nexport function DetailTile({ label, value, detail, icon, tone = \"default\", className, valueClassName }: DetailTileProps) {\n return (\n <div className={cn(\"min-w-0 rounded-md border p-3\", toneClass[tone], className)}>\n <div className=\"flex min-w-0 items-center gap-2 text-xs font-medium text-[#a9b6c8]\">\n {icon ? <span className=\"shrink-0 text-[#8fb7ff]\">{icon}</span> : null}\n <span className=\"min-w-0 truncate\">{label}</span>\n </div>\n <div className={cn(\"mt-2 min-w-0 break-words text-base font-semibold leading-snug text-white\", valueClassName)}>\n {value}\n </div>\n {detail ? <div className=\"mt-1 min-w-0 break-words text-xs leading-5 text-[#8d9caf]\">{detail}</div> : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md border border-[#aebdd0] bg-[#101827] px-3 py-2 text-sm font-semibold text-white caret-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] outline-none transition-colors selection:bg-[#4a90ff]/45 selection:text-white placeholder:text-[#7f8ca0] focus:border-[#64a7ff] focus:bg-[#132033] focus:ring-2 focus:ring-[#4a90ff]/30 disabled:cursor-not-allowed disabled:border-[#40536c] disabled:bg-[#1d2938] disabled:text-[#8d9caf] disabled:opacity-80\",\n className,\n )}\n {...props}\n />\n));\nInput.displayName = \"Input\";\n\nexport { Input };\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype MetricTone = \"default\" | \"primary\" | \"success\" | \"warning\" | \"muted\";\n\nconst toneClass: Record<MetricTone, string> = {\n default: \"border-[#40536c] bg-[#304057]\",\n primary: \"border-[#3b82f6]/55 bg-[#17325a]\",\n success: \"border-[#35d39d]/40 bg-[#173c39]\",\n warning: \"border-[#f2c94c]/40 bg-[#42381f]\",\n muted: \"border-[#33445b] bg-[#172131]\",\n};\n\nconst valueToneClass: Record<MetricTone, string> = {\n default: \"text-white\",\n primary: \"text-[#8fb7ff]\",\n success: \"text-[#6ff0bc]\",\n warning: \"text-[#ffe08a]\",\n muted: \"text-white\",\n};\n\ninterface MetricProps {\n label: ReactNode;\n value: ReactNode;\n hint?: ReactNode;\n tone?: MetricTone;\n className?: string;\n}\n\nexport function Metric({ label, value, hint, tone = \"default\", className }: MetricProps) {\n return (\n <div className={cn(\"rounded-md border p-3\", toneClass[tone], className)}>\n <div className=\"text-xs font-medium text-[#a9b6c8]\">{label}</div>\n <div className={cn(\"mt-2 break-words text-xl font-semibold tracking-normal\", valueToneClass[tone])}>{value}</div>\n {hint ? <div className=\"mt-1 text-xs text-[#d8e2ef]\">{hint}</div> : null}\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\nexport type StatusTone = \"neutral\" | \"success\" | \"warning\" | \"danger\";\n\nconst toneClass: Record<StatusTone, string> = {\n neutral: \"border-[#5d6f86] bg-[#2d3b50] text-[#d8e2ef]\",\n success: \"border-[#35d39d]/45 bg-[#176755]/55 text-[#78f2bf]\",\n warning: \"border-[#f2c94c]/45 bg-[#59451f]/55 text-[#ffe08a]\",\n danger: \"border-[#ff6b6b]/45 bg-[#5f2027]/55 text-[#ffb2b2]\",\n};\n\nexport function StatusBadge({ children, tone = \"neutral\" }: { children: ReactNode; tone?: StatusTone }) {\n return (\n <span className={cn(\"inline-flex items-center rounded-full border px-3 py-1 text-xs font-semibold leading-none\", toneClass[tone])}>\n {children}\n </span>\n );\n}\n","import { Button, type ButtonProps } from \"./Button\";\n\nexport type TxButtonState = \"idle\" | \"validating\" | \"approving\" | \"approval_confirming\" | \"simulating\" | \"writing\" | \"confirming\" | \"success\" | \"failed\";\n\nconst labels: Record<TxButtonState, string> = {\n idle: \"\",\n validating: \"Validating\",\n approving: \"Approving\",\n approval_confirming: \"Confirming approval\",\n simulating: \"Simulating\",\n writing: \"Sending\",\n confirming: \"Confirming\",\n success: \"Done\",\n failed: \"Retry\",\n};\n\ninterface TxButtonProps extends ButtonProps {\n state?: TxButtonState;\n idleLabel: string;\n}\n\nexport function TxButton({ state = \"idle\", idleLabel, children, ...props }: TxButtonProps) {\n const loading = [\"validating\", \"approving\", \"approval_confirming\", \"simulating\", \"writing\", \"confirming\"].includes(state);\n return (\n <Button loading={loading} {...props}>\n {children || labels[state] || idleLabel}\n </Button>\n );\n}\n","import { ShieldCheck } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ninterface VaultBannerProps {\n title: ReactNode;\n description: ReactNode;\n badges?: ReactNode;\n meta?: ReactNode;\n action?: ReactNode;\n icon?: ReactNode;\n className?: string;\n}\n\nexport function VaultBanner({ title, description, badges, meta, action, icon, className }: VaultBannerProps) {\n return (\n <section\n className={cn(\n \"rounded-lg border border-[#3b82f6] bg-[#172a5a] p-4 shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]\",\n className,\n )}\n >\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-[#8fc8ff]\">\n {icon ?? <ShieldCheck className=\"h-4 w-4\" />}\n </span>\n <h3 className=\"min-w-0 text-base font-semibold leading-tight text-white\">{title}</h3>\n {badges}\n </div>\n <p className=\"mt-3 max-w-3xl text-sm font-medium leading-6 text-[#d8e2ef]\">{description}</p>\n {meta ? <div className=\"mt-2 text-xs font-medium leading-5 text-[#92a4bd]\">{meta}</div> : null}\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n </section>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/sdk/format.ts","../../src/ui/AddressLink.tsx","../../src/ui/utils.ts","../../src/ui/Alert.tsx","../../src/ui/Button.tsx","../../src/ui/Card.tsx","../../src/ui/Countdown.tsx","../../src/ui/DataRow.tsx","../../src/ui/DetailTile.tsx","../../src/ui/Input.tsx","../../src/ui/Metric.tsx","../../src/ui/ReviewedFrame.tsx","../../src/ui/StatusBadge.tsx","../../src/ui/TxButton.tsx","../../src/ui/VaultBanner.tsx"],"names":["React2","toneClass","React4","React5"],"mappings":"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","file":"ui.js","sourcesContent":["import Decimal from \"decimal.js\";\nimport { formatUnits, parseUnits } from \"viem\";\n\nexport function shortenAddress(raw?: string, start = 6, end = 4) {\n if (!raw) return \"\";\n if (raw.length <= start + end) return raw;\n return `${raw.slice(0, start)}...${raw.slice(-end)}`;\n}\n\nexport function formatTokenAmount(value?: bigint | string | number | null, decimals = 18, precision = 4) {\n if (value === undefined || value === null) return \"-\";\n const raw = typeof value === \"bigint\" ? formatUnits(value, decimals) : String(value);\n return new Decimal(raw).toDecimalPlaces(precision, Decimal.ROUND_DOWN).toString();\n}\n\nexport function parseTokenAmount(value: string, decimals = 18) {\n if (!/^\\d*(\\.\\d*)?$/.test(value.trim())) {\n throw new Error(\"Invalid decimal amount.\");\n }\n return parseUnits(value || \"0\", decimals);\n}\n\nexport function formatPercentBps(value?: bigint | number | null, precision = 2) {\n if (value === undefined || value === null) return \"-\";\n return `${new Decimal(String(value)).div(100).toDecimalPlaces(precision).toString()}%`;\n}\n\nexport function formatCountdown(targetTimeMs?: number) {\n if (!targetTimeMs) return \"-\";\n const diff = Math.max(0, targetTimeMs - Date.now());\n const totalSeconds = Math.floor(diff / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n","import { ExternalLink } from \"lucide-react\";\nimport { shortenAddress } from \"@/src/sdk/format\";\n\ninterface AddressLinkProps {\n address?: string;\n explorerBaseUrl?: string;\n label?: string;\n}\n\nexport function AddressLink({ address, explorerBaseUrl, label }: AddressLinkProps) {\n if (!address) return <span>-</span>;\n const href = explorerBaseUrl ? `${explorerBaseUrl.replace(/\\/$/, \"\")}/address/${address}` : undefined;\n const content = (\n <span className=\"inline-flex min-w-0 items-center gap-1 text-primary\">\n <span className=\"truncate\">{label || shortenAddress(address)}</span>\n {href ? <ExternalLink className=\"h-3.5 w-3.5 shrink-0\" /> : null}\n </span>\n );\n return href ? (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n {content}\n </a>\n ) : (\n content\n );\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { AlertTriangle, CheckCircle2, Info } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst toneClass: Record<AlertTone, string> = {\n info: \"border-[#3f5f8f] bg-[#17243a] text-[#d8e2ef]\",\n success: \"border-[#35d39d]/35 bg-[#173c39] text-[#8ff4c8]\",\n warning: \"border-[#f2c94c]/35 bg-[#42381f] text-[#fff0b8]\",\n danger: \"border-[#ff6b6b]/35 bg-[#4a1f27] text-[#ffc4c4]\",\n};\n\nconst iconMap = {\n info: Info,\n success: CheckCircle2,\n warning: AlertTriangle,\n danger: AlertTriangle,\n};\n\nexport function Alert({ children, tone = \"info\", className }: { children: ReactNode; tone?: AlertTone; className?: string }) {\n const Icon = iconMap[tone];\n return (\n <div className={cn(\"flex gap-3 rounded-md border p-3 text-sm font-medium leading-6\", toneClass[tone], className)}>\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0 opacity-90\" />\n <div className=\"min-w-0 break-words\">{children}</div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"./utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#4a90ff]/60 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"border border-[#4a90ff]/60 bg-[#315fb5] text-white shadow-[inset_0_1px_0_rgba(255,255,255,0.16)] hover:bg-[#3b70d6]\",\n secondary: \"border border-[#3a4d66] bg-[#304057] text-white hover:bg-[#3a4c65]\",\n outline: \"border border-[#3d6ba8] bg-[#17243a] text-[#d8e8ff] hover:border-[#559cff] hover:bg-[#1d3150]\",\n ghost: \"text-[#a8b5c7] hover:bg-[#304057] hover:text-white\",\n destructive: \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n },\n size: {\n default: \"h-10 px-4\",\n sm: \"h-8 px-3 text-xs\",\n lg: \"h-12 px-5\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, loading = false, disabled, children, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n if (asChild) {\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props}>\n {children}\n </Comp>\n );\n }\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : null}\n {children}\n </Comp>\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nconst Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border border-[#3a4d66] bg-[#1d2938] text-white shadow-panel shadow-black/30 backdrop-blur\",\n className,\n )}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex flex-col gap-1.5 p-5\", className)} {...props} />\n ),\n);\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3 ref={ref} className={cn(\"text-lg font-semibold leading-tight tracking-normal text-white\", className)} {...props} />\n ),\n);\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"text-sm leading-6 text-[#a8b5c7]\", className)} {...props} />\n ),\n);\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => <div ref={ref} className={cn(\"p-5 pt-0\", className)} {...props} />,\n);\nCardContent.displayName = \"CardContent\";\n\nexport { Card, CardContent, CardDescription, CardHeader, CardTitle };\n","import { useEffect, useMemo, useState } from \"react\";\n\nfunction formatMs(ms: number) {\n const safe = Math.max(0, ms);\n const totalSeconds = Math.floor(safe / 1000);\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (days > 0) return `${days}d ${hours}h ${minutes}m`;\n if (hours > 0) return `${hours}h ${minutes}m ${seconds}s`;\n return `${minutes}m ${seconds}s`;\n}\n\nexport function Countdown({ targetTimeMs, fallback = \"-\" }: { targetTimeMs?: number; fallback?: string }) {\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n const timer = window.setInterval(() => setNow(Date.now()), 1000);\n return () => window.clearInterval(timer);\n }, []);\n\n const text = useMemo(() => {\n if (!targetTimeMs) return fallback;\n return formatMs(targetTimeMs - now);\n }, [fallback, now, targetTimeMs]);\n\n return <span>{text}</span>;\n}\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ninterface DataRowProps {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n className?: string;\n}\n\nexport function DataRow({ label, value, detail, className }: DataRowProps) {\n return (\n <div className={cn(\"flex items-start justify-between gap-4 border-b border-white/8 py-3 last:border-0\", className)}>\n <div className=\"min-w-0 text-sm text-white/54\">{label}</div>\n <div className=\"min-w-0 text-right\">\n <div className=\"break-words text-sm font-semibold text-white\">{value}</div>\n {detail ? <div className=\"mt-1 text-xs text-white/42\">{detail}</div> : null}\n </div>\n </div>\n );\n}\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype DetailTileTone = \"default\" | \"primary\" | \"success\" | \"warning\" | \"muted\";\n\nconst toneClass: Record<DetailTileTone, string> = {\n default: \"border-[#40536c] bg-[#304057]\",\n primary: \"border-[#3b82f6]/60 bg-[#17325a]\",\n success: \"border-[#35d39d]/40 bg-[#173c39]\",\n warning: \"border-[#f2c94c]/40 bg-[#42381f]\",\n muted: \"border-[#33445b] bg-[#172131]\",\n};\n\ninterface DetailTileProps {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n icon?: ReactNode;\n tone?: DetailTileTone;\n className?: string;\n valueClassName?: string;\n}\n\nexport function DetailTile({ label, value, detail, icon, tone = \"default\", className, valueClassName }: DetailTileProps) {\n return (\n <div className={cn(\"min-w-0 rounded-md border p-3\", toneClass[tone], className)}>\n <div className=\"flex min-w-0 items-center gap-2 text-xs font-medium text-[#a9b6c8]\">\n {icon ? <span className=\"shrink-0 text-[#8fb7ff]\">{icon}</span> : null}\n <span className=\"min-w-0 truncate\">{label}</span>\n </div>\n <div className={cn(\"mt-2 min-w-0 break-words text-base font-semibold leading-snug text-white\", valueClassName)}>\n {value}\n </div>\n {detail ? <div className=\"mt-1 min-w-0 break-words text-xs leading-5 text-[#8d9caf]\">{detail}</div> : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, ...props }, ref) => (\n <input\n ref={ref}\n className={cn(\n \"flex h-11 w-full rounded-md border border-[#aebdd0] bg-[#101827] px-3 py-2 text-sm font-semibold text-white caret-white shadow-[inset_0_1px_0_rgba(255,255,255,0.05)] outline-none transition-colors selection:bg-[#4a90ff]/45 selection:text-white placeholder:text-[#7f8ca0] focus:border-[#64a7ff] focus:bg-[#132033] focus:ring-2 focus:ring-[#4a90ff]/30 disabled:cursor-not-allowed disabled:border-[#40536c] disabled:bg-[#1d2938] disabled:text-[#8d9caf] disabled:opacity-80\",\n className,\n )}\n {...props}\n />\n));\nInput.displayName = \"Input\";\n\nexport { Input };\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ntype MetricTone = \"default\" | \"primary\" | \"success\" | \"warning\" | \"muted\";\n\nconst toneClass: Record<MetricTone, string> = {\n default: \"border-[#40536c] bg-[#304057]\",\n primary: \"border-[#3b82f6]/55 bg-[#17325a]\",\n success: \"border-[#35d39d]/40 bg-[#173c39]\",\n warning: \"border-[#f2c94c]/40 bg-[#42381f]\",\n muted: \"border-[#33445b] bg-[#172131]\",\n};\n\nconst valueToneClass: Record<MetricTone, string> = {\n default: \"text-white\",\n primary: \"text-[#8fb7ff]\",\n success: \"text-[#6ff0bc]\",\n warning: \"text-[#ffe08a]\",\n muted: \"text-white\",\n};\n\ninterface MetricProps {\n label: ReactNode;\n value: ReactNode;\n hint?: ReactNode;\n tone?: MetricTone;\n className?: string;\n}\n\nexport function Metric({ label, value, hint, tone = \"default\", className }: MetricProps) {\n return (\n <div className={cn(\"rounded-md border p-3\", toneClass[tone], className)}>\n <div className=\"text-xs font-medium text-[#a9b6c8]\">{label}</div>\n <div className={cn(\"mt-2 break-words text-xl font-semibold tracking-normal\", valueToneClass[tone])}>{value}</div>\n {hint ? <div className=\"mt-1 text-xs text-[#d8e2ef]\">{hint}</div> : null}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"./utils\";\n\nexport type ReviewedFrameProvider = \"tradingview\" | \"dexscreener\" | \"coingecko-terminal\";\n\nexport interface ReviewedFrameProps\n extends Omit<React.IframeHTMLAttributes<HTMLIFrameElement>, \"allow\" | \"referrerPolicy\" | \"sandbox\" | \"src\" | \"srcDoc\" | \"title\"> {\n frameId: string;\n provider: ReviewedFrameProvider;\n src: string;\n title: string;\n}\n\nexport function ReviewedFrame({ className, frameId, provider, src, title, ...props }: ReviewedFrameProps) {\n const {\n allow: _allow,\n referrerPolicy: _referrerPolicy,\n sandbox: _sandbox,\n src: _src,\n srcDoc: _srcDoc,\n title: _title,\n ...safeProps\n } = props as React.IframeHTMLAttributes<HTMLIFrameElement>;\n\n return (\n <iframe\n {...safeProps}\n data-frame-id={frameId}\n data-frame-provider={provider}\n src={src}\n title={title}\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n sandbox=\"allow-scripts allow-same-origin\"\n className={cn(\"min-h-[360px] w-full rounded-lg border border-[#3a4d66] bg-[#0b111a]\", className)}\n />\n );\n}\n","import { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\nexport type StatusTone = \"neutral\" | \"success\" | \"warning\" | \"danger\";\n\nconst toneClass: Record<StatusTone, string> = {\n neutral: \"border-[#5d6f86] bg-[#2d3b50] text-[#d8e2ef]\",\n success: \"border-[#35d39d]/45 bg-[#176755]/55 text-[#78f2bf]\",\n warning: \"border-[#f2c94c]/45 bg-[#59451f]/55 text-[#ffe08a]\",\n danger: \"border-[#ff6b6b]/45 bg-[#5f2027]/55 text-[#ffb2b2]\",\n};\n\nexport function StatusBadge({ children, tone = \"neutral\" }: { children: ReactNode; tone?: StatusTone }) {\n return (\n <span className={cn(\"inline-flex items-center rounded-full border px-3 py-1 text-xs font-semibold leading-none\", toneClass[tone])}>\n {children}\n </span>\n );\n}\n","import { Button, type ButtonProps } from \"./Button\";\n\nexport type TxButtonState = \"idle\" | \"validating\" | \"approving\" | \"approval_confirming\" | \"simulating\" | \"writing\" | \"confirming\" | \"success\" | \"failed\";\n\nconst labels: Record<TxButtonState, string> = {\n idle: \"\",\n validating: \"Validating\",\n approving: \"Approving\",\n approval_confirming: \"Confirming approval\",\n simulating: \"Simulating\",\n writing: \"Sending\",\n confirming: \"Confirming\",\n success: \"Done\",\n failed: \"Retry\",\n};\n\ninterface TxButtonProps extends ButtonProps {\n state?: TxButtonState;\n idleLabel: string;\n}\n\nexport function TxButton({ state = \"idle\", idleLabel, children, ...props }: TxButtonProps) {\n const loading = [\"validating\", \"approving\", \"approval_confirming\", \"simulating\", \"writing\", \"confirming\"].includes(state);\n return (\n <Button loading={loading} {...props}>\n {children || labels[state] || idleLabel}\n </Button>\n );\n}\n","import { ShieldCheck } from \"lucide-react\";\nimport { ReactNode } from \"react\";\nimport { cn } from \"./utils\";\n\ninterface VaultBannerProps {\n title: ReactNode;\n description: ReactNode;\n badges?: ReactNode;\n meta?: ReactNode;\n action?: ReactNode;\n icon?: ReactNode;\n className?: string;\n}\n\nexport function VaultBanner({ title, description, badges, meta, action, icon, className }: VaultBannerProps) {\n return (\n <section\n className={cn(\n \"rounded-lg border border-[#3b82f6] bg-[#172a5a] p-4 shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]\",\n className,\n )}\n >\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-[#8fc8ff]\">\n {icon ?? <ShieldCheck className=\"h-4 w-4\" />}\n </span>\n <h3 className=\"min-w-0 text-base font-semibold leading-tight text-white\">{title}</h3>\n {badges}\n </div>\n <p className=\"mt-3 max-w-3xl text-sm font-medium leading-6 text-[#d8e2ef]\">{description}</p>\n {meta ? <div className=\"mt-2 text-xs font-medium leading-5 text-[#92a4bd]\">{meta}</div> : null}\n </div>\n {action ? <div className=\"shrink-0\">{action}</div> : null}\n </div>\n </section>\n );\n}\n"]}
|