@silentswap/ui-kit 0.0.42 → 0.0.44

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.
Files changed (148) hide show
  1. package/dist/components/accordion.d.ts +7 -0
  2. package/dist/components/accordion.js +14 -0
  3. package/dist/components/add-button.d.ts +10 -0
  4. package/dist/components/add-button.js +20 -0
  5. package/dist/components/address-selector.d.ts +34 -0
  6. package/dist/components/address-selector.js +57 -0
  7. package/dist/components/alert-dialog.d.ts +20 -0
  8. package/dist/components/alert-dialog.js +26 -0
  9. package/dist/components/alert.d.ts +8 -0
  10. package/dist/components/alert.js +22 -0
  11. package/dist/components/avatar.d.ts +6 -0
  12. package/dist/components/avatar.js +12 -0
  13. package/dist/components/badge.d.ts +9 -0
  14. package/dist/components/badge.js +21 -0
  15. package/dist/components/button.d.ts +12 -0
  16. package/dist/components/button.js +39 -0
  17. package/dist/components/card.d.ts +8 -0
  18. package/dist/components/card.js +16 -0
  19. package/dist/components/coin.d.ts +6 -0
  20. package/dist/components/coin.js +20 -0
  21. package/dist/components/collapsible.d.ts +5 -0
  22. package/dist/components/collapsible.js +6 -0
  23. package/dist/components/context-menu.d.ts +27 -0
  24. package/dist/components/context-menu.js +33 -0
  25. package/dist/components/dialog.d.ts +19 -0
  26. package/dist/components/dialog.js +99 -0
  27. package/dist/components/disconnect-confirmation-dialog.d.ts +10 -0
  28. package/dist/components/disconnect-confirmation-dialog.js +16 -0
  29. package/dist/components/drawer copy.js +25 -0
  30. package/dist/components/drawer.d.ts +22 -0
  31. package/dist/components/drawer.js +25 -0
  32. package/dist/components/dropdown-menu.d.ts +27 -0
  33. package/dist/components/dropdown-menu.js +33 -0
  34. package/dist/components/icons.d.ts +30 -0
  35. package/dist/components/icons.js +71 -0
  36. package/dist/components/input.d.ts +3 -0
  37. package/dist/components/input.js +8 -0
  38. package/dist/components/label.d.ts +5 -0
  39. package/dist/components/label.js +10 -0
  40. package/dist/components/modal.d.ts +40 -0
  41. package/dist/components/modal.js +100 -0
  42. package/dist/components/panel-row.d.ts +11 -0
  43. package/dist/components/panel-row.js +8 -0
  44. package/dist/components/popover.d.ts +15 -0
  45. package/dist/components/popover.js +106 -0
  46. package/dist/components/popular-tokens-area.d.ts +8 -0
  47. package/dist/components/popular-tokens-area.js +34 -0
  48. package/dist/components/progress-bar.d.ts +17 -0
  49. package/dist/components/progress-bar.js +30 -0
  50. package/dist/components/responsive-container.d.ts +7 -0
  51. package/dist/components/responsive-container.js +69 -0
  52. package/dist/components/scroll-area.d.ts +5 -0
  53. package/dist/components/scroll-area.js +10 -0
  54. package/dist/components/select.d.ts +13 -0
  55. package/dist/components/select.js +26 -0
  56. package/dist/components/separator.d.ts +4 -0
  57. package/dist/components/separator.js +8 -0
  58. package/dist/components/sheet.d.ts +25 -0
  59. package/dist/components/sheet.js +37 -0
  60. package/dist/components/sidebar.d.ts +66 -0
  61. package/dist/components/sidebar.js +222 -0
  62. package/dist/components/skeleton.d.ts +3 -0
  63. package/dist/components/skeleton.js +7 -0
  64. package/dist/components/status-card.d.ts +23 -0
  65. package/dist/components/status-card.js +27 -0
  66. package/dist/components/textarea.d.ts +3 -0
  67. package/dist/components/textarea.js +8 -0
  68. package/dist/components/tooltip.d.ts +7 -0
  69. package/dist/components/tooltip.js +11 -0
  70. package/dist/components-v2/accordion.d.ts +7 -0
  71. package/dist/components-v2/accordion.js +14 -0
  72. package/dist/components-v2/add-button.d.ts +10 -0
  73. package/dist/components-v2/add-button.js +21 -0
  74. package/dist/components-v2/address-selector.d.ts +34 -0
  75. package/dist/components-v2/address-selector.js +57 -0
  76. package/dist/components-v2/alert-dialog.d.ts +20 -0
  77. package/dist/components-v2/alert-dialog.js +26 -0
  78. package/dist/components-v2/alert.d.ts +8 -0
  79. package/dist/components-v2/alert.js +22 -0
  80. package/dist/components-v2/assetTile.d.ts +10 -0
  81. package/dist/components-v2/assetTile.js +18 -0
  82. package/dist/components-v2/avatar.d.ts +6 -0
  83. package/dist/components-v2/avatar.js +12 -0
  84. package/dist/components-v2/badge.d.ts +9 -0
  85. package/dist/components-v2/badge.js +21 -0
  86. package/dist/components-v2/collapsible.d.ts +5 -0
  87. package/dist/components-v2/collapsible.js +6 -0
  88. package/dist/components-v2/context-menu.d.ts +27 -0
  89. package/dist/components-v2/context-menu.js +33 -0
  90. package/dist/components-v2/disconnect-confirmation-dialog.d.ts +10 -0
  91. package/dist/components-v2/disconnect-confirmation-dialog.js +16 -0
  92. package/dist/components-v2/drawer.d.ts +22 -0
  93. package/dist/components-v2/drawer.js +25 -0
  94. package/dist/components-v2/dropdown-menu.d.ts +27 -0
  95. package/dist/components-v2/dropdown-menu.js +33 -0
  96. package/dist/components-v2/icons.d.ts +30 -0
  97. package/dist/components-v2/icons.js +72 -0
  98. package/dist/components-v2/label.d.ts +5 -0
  99. package/dist/components-v2/label.js +10 -0
  100. package/dist/components-v2/modal.d.ts +40 -0
  101. package/dist/components-v2/modal.js +100 -0
  102. package/dist/components-v2/popular-tokens-area.d.ts +8 -0
  103. package/dist/components-v2/popular-tokens-area.js +34 -0
  104. package/dist/components-v2/progress-bar.d.ts +17 -0
  105. package/dist/components-v2/progress-bar.js +30 -0
  106. package/dist/components-v2/scroll-area.d.ts +5 -0
  107. package/dist/components-v2/scroll-area.js +10 -0
  108. package/dist/components-v2/separator.d.ts +4 -0
  109. package/dist/components-v2/separator.js +8 -0
  110. package/dist/components-v2/sheet.d.ts +25 -0
  111. package/dist/components-v2/sheet.js +37 -0
  112. package/dist/components-v2/skeleton.d.ts +3 -0
  113. package/dist/components-v2/skeleton.js +7 -0
  114. package/dist/components-v2/status-card.d.ts +23 -0
  115. package/dist/components-v2/status-card.js +27 -0
  116. package/dist/components-v2/textarea.d.ts +3 -0
  117. package/dist/components-v2/textarea.js +8 -0
  118. package/dist/components-v2/tooltip.d.ts +7 -0
  119. package/dist/components-v2/tooltip.js +11 -0
  120. package/dist/components-v2/warning.d.ts +15 -0
  121. package/dist/components-v2/warning.js +23 -0
  122. package/dist/hooks/use-mobile.d.ts +1 -0
  123. package/dist/hooks/use-mobile.js +15 -0
  124. package/dist/index.d.ts +14 -14
  125. package/dist/index.js +8 -8
  126. package/dist/lib/utils.d.ts +2 -0
  127. package/dist/lib/utils.js +5 -0
  128. package/dist/test.css +1383 -0
  129. package/dist/utils.d.ts +2 -0
  130. package/dist/utils.js +5 -0
  131. package/package.json +2 -2
  132. package/src/{components/PopularTokensArea.tsx → components-v2/popular-tokens-area.tsx} +1 -1
  133. package/src/index.ts +14 -14
  134. /package/dist/{components/Button.d.ts → components-v2/button.d.ts} +0 -0
  135. /package/dist/{components/Button.js → components-v2/button.js} +0 -0
  136. /package/dist/{components/Card.d.ts → components-v2/card.d.ts} +0 -0
  137. /package/dist/{components/Card.js → components-v2/card.js} +0 -0
  138. /package/dist/{components/Input.d.ts → components-v2/input.d.ts} +0 -0
  139. /package/dist/{components/Input.js → components-v2/input.js} +0 -0
  140. /package/dist/{components/Select.d.ts → components-v2/select.d.ts} +0 -0
  141. /package/dist/{components/Select.js → components-v2/select.js} +0 -0
  142. /package/src/{components/AssetTile.tsx → components-v2/assetTile.tsx} +0 -0
  143. /package/src/{components/Button.tsx → components-v2/button.tsx} +0 -0
  144. /package/src/{components/Card.tsx → components-v2/card.tsx} +0 -0
  145. /package/src/{components/Input.tsx → components-v2/input.tsx} +0 -0
  146. /package/src/{components/ProgressBar.tsx → components-v2/progress-bar.tsx} +0 -0
  147. /package/src/{components/Select.tsx → components-v2/select.tsx} +0 -0
  148. /package/src/{components/Warning.tsx → components-v2/warning.tsx} +0 -0
@@ -0,0 +1,222 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Slot } from '@radix-ui/react-slot';
5
+ import { cva } from 'class-variance-authority';
6
+ import { PanelLeft } from 'lucide-react';
7
+ import { cn } from '../utils';
8
+ import { useIsMobile } from '../hooks/use-mobile';
9
+ import { Button } from './button';
10
+ import { Input } from './input';
11
+ import { Separator } from './separator';
12
+ import { Sheet, SheetContent } from './sheet';
13
+ import { Skeleton } from './skeleton';
14
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip';
15
+ const SIDEBAR_COOKIE_NAME = 'sidebar:state';
16
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
17
+ const SIDEBAR_WIDTH = '16rem';
18
+ const SIDEBAR_WIDTH_MOBILE = '18rem';
19
+ const SIDEBAR_WIDTH_ICON = '3rem';
20
+ const SIDEBAR_KEYBOARD_SHORTCUT = 'b';
21
+ const SidebarContext = React.createContext(null);
22
+ function useSidebar() {
23
+ const context = React.useContext(SidebarContext);
24
+ if (!context) {
25
+ throw new Error('useSidebar must be used within a SidebarProvider.');
26
+ }
27
+ return context;
28
+ }
29
+ const SidebarProvider = React.forwardRef(({ defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }, ref) => {
30
+ const isMobile = useIsMobile();
31
+ const [openMobile, setOpenMobile] = React.useState(false);
32
+ // This is the internal state of the sidebar.
33
+ // We use openProp and setOpenProp for control from outside the component.
34
+ const [_open, _setOpen] = React.useState(defaultOpen);
35
+ const open = openProp ?? _open;
36
+ const setOpen = React.useCallback((value) => {
37
+ const openState = typeof value === 'function' ? value(open) : value;
38
+ if (setOpenProp) {
39
+ setOpenProp(openState);
40
+ }
41
+ else {
42
+ _setOpen(openState);
43
+ }
44
+ // This sets the cookie to keep the sidebar state.
45
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
46
+ }, [setOpenProp, open]);
47
+ // Helper to toggle the sidebar.
48
+ const toggleSidebar = React.useCallback(() => {
49
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
50
+ }, [isMobile, setOpen, setOpenMobile]);
51
+ // Adds a keyboard shortcut to toggle the sidebar.
52
+ React.useEffect(() => {
53
+ const handleKeyDown = (event) => {
54
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
55
+ event.preventDefault();
56
+ toggleSidebar();
57
+ }
58
+ };
59
+ window.addEventListener('keydown', handleKeyDown);
60
+ return () => window.removeEventListener('keydown', handleKeyDown);
61
+ }, [toggleSidebar]);
62
+ // We add a state so that we can do data-state="expanded" or "collapsed".
63
+ // This makes it easier to style the sidebar with Tailwind classes.
64
+ const state = open ? 'expanded' : 'collapsed';
65
+ const contextValue = React.useMemo(() => ({
66
+ state,
67
+ open,
68
+ setOpen,
69
+ isMobile,
70
+ openMobile,
71
+ setOpenMobile,
72
+ toggleSidebar,
73
+ }), [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]);
74
+ return (_jsx(SidebarContext.Provider, { value: contextValue, children: _jsx(TooltipProvider, { delayDuration: 0, children: _jsx("div", { style: {
75
+ '--sidebar-width': SIDEBAR_WIDTH,
76
+ '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
77
+ ...style,
78
+ }, className: cn('group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar', state === 'expanded' ? 'z-200' : '', className), ref: ref, ...props, children: children }) }) }));
79
+ });
80
+ SidebarProvider.displayName = 'SidebarProvider';
81
+ const Sidebar = React.forwardRef(({ side = 'left', variant = 'sidebar', collapsible = 'offcanvas', className, children, ...props }, ref) => {
82
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
83
+ if (collapsible === 'none') {
84
+ return (_jsx("div", { className: cn('flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground', className), ref: ref, ...props, children: children }));
85
+ }
86
+ if (isMobile) {
87
+ return (_jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: _jsx(SheetContent, { "data-sidebar": "sidebar", "data-mobile": "true", className: "w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden", style: {
88
+ '--sidebar-width': SIDEBAR_WIDTH_MOBILE,
89
+ }, side: side, children: _jsx("div", { className: "flex h-full w-full flex-col", children: children }) }) }));
90
+ }
91
+ return (_jsxs("div", { ref: ref, className: "group peer hidden text-sidebar-foreground md:block", "data-state": state, "data-collapsible": state === 'collapsed' ? collapsible : '', "data-variant": variant, "data-side": side, children: [_jsx("div", { className: cn('relative h-svh w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear', 'group-data-[collapsible=offcanvas]:w-0', 'group-data-[side=right]:rotate-180', variant === 'floating' || variant === 'inset'
92
+ ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]'
93
+ : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon]') }), _jsx("div", { className: cn('fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex', side === 'left'
94
+ ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'
95
+ : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',
96
+ // Adjust the padding for floating and inset variants.
97
+ variant === 'floating' || variant === 'inset'
98
+ ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]'
99
+ : 'group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l border-white/20', className), ...props, children: _jsx("div", { "data-sidebar": "sidebar", className: "flex h-full modal-bg w-full flex-col group-data-[variant=floating]:rounded-2xl group-data-[variant=floating]:border group-data-[variant=floating]:border-base-stroke group-data-[variant=floating]:shadow", children: children }) })] }));
100
+ });
101
+ Sidebar.displayName = 'Sidebar';
102
+ const SidebarTrigger = React.forwardRef(({ className, onClick, ...props }, ref) => {
103
+ const { toggleSidebar } = useSidebar();
104
+ return (_jsxs(Button, { ref: ref, "data-sidebar": "trigger", variant: "ghost", size: "icon", className: cn('h-7 w-7', className), onClick: (event) => {
105
+ onClick?.(event);
106
+ toggleSidebar();
107
+ }, ...props, children: [_jsx(PanelLeft, {}), _jsx("span", { className: "sr-only", children: "Toggle Sidebar" })] }));
108
+ });
109
+ SidebarTrigger.displayName = 'SidebarTrigger';
110
+ const SidebarRail = React.forwardRef(({ className, ...props }, ref) => {
111
+ const { toggleSidebar } = useSidebar();
112
+ return (_jsx("button", { ref: ref, "data-sidebar": "rail", "aria-label": "Toggle Sidebar", tabIndex: -1, onClick: toggleSidebar, title: "Toggle Sidebar", className: cn('absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex', '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize', '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize', 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar', '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2', '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2', className), ...props }));
113
+ });
114
+ SidebarRail.displayName = 'SidebarRail';
115
+ const SidebarInset = React.forwardRef(({ className, ...props }, ref) => {
116
+ return (_jsx("main", { ref: ref, className: cn('relative flex min-h-svh flex-1 flex-col bg-background', 'peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow', className), ...props }));
117
+ });
118
+ SidebarInset.displayName = 'SidebarInset';
119
+ const SidebarInput = React.forwardRef(({ className, ...props }, ref) => {
120
+ return (_jsx(Input, { ref: ref, "data-sidebar": "input", className: cn('h-8 w-full bg-background shadow-none', className), ...props }));
121
+ });
122
+ SidebarInput.displayName = 'SidebarInput';
123
+ const SidebarHeader = React.forwardRef(({ className, ...props }, ref) => {
124
+ return _jsx("div", { ref: ref, "data-sidebar": "header", className: cn('flex flex-col gap-2 p-2', className), ...props });
125
+ });
126
+ SidebarHeader.displayName = 'SidebarHeader';
127
+ const SidebarFooter = React.forwardRef(({ className, ...props }, ref) => {
128
+ return _jsx("div", { ref: ref, "data-sidebar": "footer", className: cn('flex flex-col gap-2 p-2', className), ...props });
129
+ });
130
+ SidebarFooter.displayName = 'SidebarFooter';
131
+ const SidebarSeparator = React.forwardRef(({ className, ...props }, ref) => {
132
+ return (_jsx(Separator, { ref: ref, "data-sidebar": "separator", className: cn('mx-2 w-auto bg-sidebar-border', className), ...props }));
133
+ });
134
+ SidebarSeparator.displayName = 'SidebarSeparator';
135
+ const SidebarContent = React.forwardRef(({ className, ...props }, ref) => {
136
+ return (_jsx("div", { ref: ref, "data-sidebar": "content", className: cn('flex h-full flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden', className), ...props }));
137
+ });
138
+ SidebarContent.displayName = 'SidebarContent';
139
+ const SidebarGroup = React.forwardRef(({ className, ...props }, ref) => {
140
+ return (_jsx("div", { ref: ref, "data-sidebar": "group", className: cn('relative flex w-full min-w-0 flex-col p-2', className), ...props }));
141
+ });
142
+ SidebarGroup.displayName = 'SidebarGroup';
143
+ const SidebarGroupLabel = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
144
+ const Comp = asChild ? Slot : 'div';
145
+ return (_jsx(Comp, { ref: ref, "data-sidebar": "group-label", className: cn('flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] duration-200 ease-linear focus-visible:ring-0 [&>svg]:size-4 [&>svg]:shrink-0', 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0', className), ...props }));
146
+ });
147
+ SidebarGroupLabel.displayName = 'SidebarGroupLabel';
148
+ const SidebarGroupAction = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
149
+ const Comp = asChild ? Slot : 'button';
150
+ return (_jsx(Comp, { ref: ref, "data-sidebar": "group-action", className: cn('absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-0 [&>svg]:size-4 [&>svg]:shrink-0',
151
+ // Increases the hit area of the button on mobile.
152
+ 'after:absolute after:-inset-2 after:md:hidden', 'group-data-[collapsible=icon]:hidden', className), ...props }));
153
+ });
154
+ SidebarGroupAction.displayName = 'SidebarGroupAction';
155
+ const SidebarGroupContent = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, "data-sidebar": "group-content", className: cn('w-full text-sm', className), ...props })));
156
+ SidebarGroupContent.displayName = 'SidebarGroupContent';
157
+ const SidebarMenu = React.forwardRef(({ className, ...props }, ref) => (_jsx("ul", { ref: ref, "data-sidebar": "menu", className: cn('flex w-full min-w-0 flex-col gap-1', className), ...props })));
158
+ SidebarMenu.displayName = 'SidebarMenu';
159
+ const SidebarMenuItem = React.forwardRef(({ className, ...props }, ref) => (_jsx("li", { ref: ref, "data-sidebar": "menu-item", className: cn('group/menu-item relative', className), ...props })));
160
+ SidebarMenuItem.displayName = 'SidebarMenuItem';
161
+ const sidebarMenuButtonVariants = cva('peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-0 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0', {
162
+ variants: {
163
+ variant: {
164
+ default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
165
+ outline: 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',
166
+ },
167
+ size: {
168
+ default: 'h-8 text-sm',
169
+ sm: 'h-7 text-xs',
170
+ lg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',
171
+ },
172
+ },
173
+ defaultVariants: {
174
+ variant: 'default',
175
+ size: 'default',
176
+ },
177
+ });
178
+ const SidebarMenuButton = React.forwardRef(({ asChild = false, isActive = false, variant = 'default', size = 'default', tooltip, className, ...props }, ref) => {
179
+ const Comp = asChild ? Slot : 'button';
180
+ const { isMobile, state } = useSidebar();
181
+ const button = (_jsx(Comp, { ref: ref, "data-sidebar": "menu-button", "data-size": size, "data-active": isActive, className: cn(sidebarMenuButtonVariants({ variant, size }), className), ...props }));
182
+ if (!tooltip) {
183
+ return button;
184
+ }
185
+ if (typeof tooltip === 'string') {
186
+ tooltip = {
187
+ children: tooltip,
188
+ };
189
+ }
190
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { side: "right", align: "center", hidden: state !== 'collapsed' || isMobile, ...tooltip })] }));
191
+ });
192
+ SidebarMenuButton.displayName = 'SidebarMenuButton';
193
+ const SidebarMenuAction = React.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
194
+ const Comp = asChild ? Slot : 'button';
195
+ return (_jsx(Comp, { ref: ref, "data-sidebar": "menu-action", className: cn('absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-0 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0',
196
+ // Increases the hit area of the button on mobile.
197
+ 'after:absolute after:-inset-2 after:md:hidden', 'peer-data-[size=sm]/menu-button:top-1', 'peer-data-[size=default]/menu-button:top-1.5', 'peer-data-[size=lg]/menu-button:top-2.5', 'group-data-[collapsible=icon]:hidden', showOnHover &&
198
+ 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0', className), ...props }));
199
+ });
200
+ SidebarMenuAction.displayName = 'SidebarMenuAction';
201
+ const SidebarMenuBadge = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, "data-sidebar": "menu-badge", className: cn('pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground', 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground', 'peer-data-[size=sm]/menu-button:top-1', 'peer-data-[size=default]/menu-button:top-1.5', 'peer-data-[size=lg]/menu-button:top-2.5', 'group-data-[collapsible=icon]:hidden', className), ...props })));
202
+ SidebarMenuBadge.displayName = 'SidebarMenuBadge';
203
+ const SidebarMenuSkeleton = React.forwardRef(({ className, showIcon = false, ...props }, ref) => {
204
+ // Random width between 50 to 90%.
205
+ const width = React.useMemo(() => {
206
+ return `${Math.floor(Math.random() * 40) + 50}%`;
207
+ }, []);
208
+ return (_jsxs("div", { ref: ref, "data-sidebar": "menu-skeleton", className: cn('flex h-8 items-center gap-2 rounded-md px-2', className), ...props, children: [showIcon && _jsx(Skeleton, { className: "size-4 rounded-md", "data-sidebar": "menu-skeleton-icon" }), _jsx(Skeleton, { className: "h-4 max-w-[--skeleton-width] flex-1", "data-sidebar": "menu-skeleton-text", style: {
209
+ '--skeleton-width': width,
210
+ } })] }));
211
+ });
212
+ SidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton';
213
+ const SidebarMenuSub = React.forwardRef(({ className, ...props }, ref) => (_jsx("ul", { ref: ref, "data-sidebar": "menu-sub", className: cn('mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5', 'group-data-[collapsible=icon]:hidden', className), ...props })));
214
+ SidebarMenuSub.displayName = 'SidebarMenuSub';
215
+ const SidebarMenuSubItem = React.forwardRef(({ ...props }, ref) => (_jsx("li", { ref: ref, ...props })));
216
+ SidebarMenuSubItem.displayName = 'SidebarMenuSubItem';
217
+ const SidebarMenuSubButton = React.forwardRef(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {
218
+ const Comp = asChild ? Slot : 'a';
219
+ return (_jsx(Comp, { ref: ref, "data-sidebar": "menu-sub-button", "data-size": size, "data-active": isActive, className: cn('flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-0 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground', 'data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground', size === 'sm' && 'text-xs', size === 'md' && 'text-sm', 'group-data-[collapsible=icon]:hidden', className), ...props }));
220
+ });
221
+ SidebarMenuSubButton.displayName = 'SidebarMenuSubButton';
222
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
3
+ export { Skeleton };
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { cn } from '../utils';
4
+ function Skeleton({ className, ...props }) {
5
+ return _jsx("div", { className: cn('animate-pulse rounded-md', className), ...props });
6
+ }
7
+ export { Skeleton };
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ interface StatusCardProps {
3
+ variant?: 'info' | 'warning' | 'error' | 'success';
4
+ title?: string;
5
+ message: string;
6
+ action?: {
7
+ label: string;
8
+ onClick: () => void;
9
+ loading?: boolean;
10
+ disabled?: boolean;
11
+ };
12
+ className?: string;
13
+ }
14
+ export declare const StatusCard: React.FC<StatusCardProps>;
15
+ interface ErrorCardProps {
16
+ errors: Array<{
17
+ type: string;
18
+ message: string;
19
+ }>;
20
+ className?: string;
21
+ }
22
+ export declare const ErrorCard: React.FC<ErrorCardProps>;
23
+ export {};
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { Card } from './card';
5
+ import { Button } from './button';
6
+ import { AlertCircle, Loader2 } from 'lucide-react';
7
+ import { cn } from '../utils';
8
+ export const StatusCard = ({ variant = 'info', title, message, action, className }) => {
9
+ const variantStyles = {
10
+ info: 'border-border-bright/20 bg-dim-med',
11
+ warning: 'border-yellow/50 bg-yellow/10',
12
+ error: 'border-red-500/50 bg-red-500/10',
13
+ success: 'border-green-500/50 bg-green-500/10',
14
+ };
15
+ const textStyles = {
16
+ info: 'text-text-dim',
17
+ warning: 'text-yellow',
18
+ error: 'text-red-500',
19
+ success: 'text-green-500',
20
+ };
21
+ return (_jsxs(Card, { className: cn('text-center p-4 mb-4', variantStyles[variant], className), children: [title && (_jsxs("div", { className: cn('mb-2 text-sm font-medium', textStyles[variant]), children: [variant === 'error' && (_jsx(AlertCircle, { className: "w-4 h-4 inline mr-1" })), title] })), _jsx("p", { className: cn('text-sm', textStyles[variant]), children: message }), action && (_jsxs(Button, { variant: variant === 'error' ? 'destructive' : 'default', onClick: action.onClick, disabled: action.disabled || action.loading, className: "mt-4", children: [action.loading && (_jsx(_Fragment, { children: _jsx(Loader2, { className: "w-4 h-4 mr-2 animate-spin" }) })), action.label] }))] }));
22
+ };
23
+ export const ErrorCard = ({ errors, className }) => {
24
+ if (errors.length === 0)
25
+ return null;
26
+ return (_jsx(Card, { className: cn('border-red-500 bg-red-500/10 p-4 mb-4', className), children: errors.map((error, index) => (_jsxs("div", { className: "mb-2 last:mb-0 text-sm text-red-500", children: [_jsxs("strong", { children: [error.type, ":"] }), " ", error.message] }, index))) }));
27
+ };
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & React.RefAttributes<HTMLTextAreaElement>>;
3
+ export { Textarea };
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cn } from '../utils';
4
+ const Textarea = React.forwardRef(({ className, ...props }, ref) => {
5
+ return (_jsx("textarea", { className: cn('flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', className), ref: ref, ...props }));
6
+ });
7
+ Textarea.displayName = 'Textarea';
8
+ export { Textarea };
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
3
+ declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
4
+ declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
5
+ declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
5
+ import { cn } from '../utils';
6
+ const TooltipProvider = TooltipPrimitive.Provider;
7
+ const Tooltip = TooltipPrimitive.Root;
8
+ const TooltipTrigger = TooltipPrimitive.Trigger;
9
+ const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn('z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', className), ...props }) })));
10
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
11
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
@@ -0,0 +1,7 @@
1
+ import * as React from 'react';
2
+ import * as AccordionPrimitive from '@radix-ui/react-accordion';
3
+ declare const Accordion: React.ForwardRefExoticComponent<(AccordionPrimitive.AccordionSingleProps | AccordionPrimitive.AccordionMultipleProps) & React.RefAttributes<HTMLDivElement>>;
4
+ declare const AccordionItem: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
5
+ declare const AccordionTrigger: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
6
+ declare const AccordionContent: React.ForwardRefExoticComponent<Omit<AccordionPrimitive.AccordionContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
+ import { ChevronDown } from 'lucide-react';
6
+ import { cn } from '../utils';
7
+ const Accordion = AccordionPrimitive.Root;
8
+ const AccordionItem = React.forwardRef(({ className, ...props }, ref) => (_jsx(AccordionPrimitive.Item, { ref: ref, className: cn('border-b', className), ...props })));
9
+ AccordionItem.displayName = 'AccordionItem';
10
+ const AccordionTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, { ref: ref, className: cn('flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180', className), ...props, children: [children, _jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" })] }) })));
11
+ AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
12
+ const AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => (_jsx(AccordionPrimitive.Content, { ref: ref, className: "overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", ...props, children: _jsx("div", { className: cn('pb-4 pt-0', className), children: children }) })));
13
+ AccordionContent.displayName = AccordionPrimitive.Content.displayName;
14
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface AddButtonProps {
3
+ onClick: () => void;
4
+ label: string;
5
+ disabled?: boolean;
6
+ disabledLabel?: string;
7
+ className?: string;
8
+ }
9
+ export declare const AddButton: React.FC<AddButtonProps>;
10
+ export {};
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ import { cn } from '../utils';
5
+ import { AddIcon } from './icons';
6
+ export const AddButton = ({ onClick, label, disabled = false, disabledLabel, className }) => {
7
+ return (_jsxs("div", { className: cn(
8
+ // Layout - matching Figma design
9
+ 'flex items-center justify-center gap-[10px]', 'w-[90vw] max-w-[640px] mx-auto', 'px-[20px] py-[12px] box-border', 'min-h-[42px]',
10
+ // Background - matching Figma: bg-secondary (#211f12)
11
+ 'rounded-[12px]',
12
+ // Typography - matching Figma: Manrope Medium, 14px, line-height 1.5, yellow
13
+ 'font-medium text-[14px] leading-[1.5]',
14
+ // Interaction
15
+ 'transition-all duration-300 z-[2]', disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer hover:opacity-80', 'bg-secondary', 'text-yellow', 'font-manrope', className), onClick: disabled ? undefined : onClick, role: "button", tabIndex: disabled ? -1 : 0, onKeyDown: (e) => {
16
+ if (!disabled && (e.key === 'Enter' || e.key === ' ')) {
17
+ e.preventDefault();
18
+ onClick();
19
+ }
20
+ }, children: [_jsx("div", { className: "flex flex-col justify-end leading-[0] shrink-0 pb-[2px]", children: _jsx("p", { className: "leading-[1.5] whitespace-nowrap", children: disabled ? disabledLabel || label : label }) }), !disabled && (_jsx("div", { className: "relative shrink-0 size-[10px]", children: _jsx(AddIcon, {}) }))] }));
21
+ };
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import type { ContactSource as SDKContactSource } from '@silentswap/sdk';
3
+ export interface Contact {
4
+ id: string;
5
+ label: string;
6
+ address: string | (() => Promise<string>);
7
+ source?: ContactSource;
8
+ ens?: string;
9
+ rawAddress?: () => string | undefined;
10
+ isEvm?: () => boolean;
11
+ isSolana?: () => boolean;
12
+ isBip122?: () => boolean;
13
+ isCosmos?: () => boolean;
14
+ }
15
+ export type ContactSource = SDKContactSource | 'wallet' | 'saved' | 'ens' | 'unknown';
16
+ interface AddressSelectorProps {
17
+ isOpen: boolean;
18
+ onClose: () => void;
19
+ onSelect: (address: string, label?: string) => void;
20
+ onSaveContact?: (contactInfo: {
21
+ id: string;
22
+ label: string;
23
+ source: ContactSource;
24
+ }) => void;
25
+ connectedAddress?: string;
26
+ title?: string;
27
+ mode?: 'sender' | 'recipient';
28
+ contacts?: Contact[];
29
+ targetAsset?: string;
30
+ connectedAccounts?: Record<string, Contact>;
31
+ activeSenderId?: string;
32
+ }
33
+ export declare const AddressSelector: React.FC<AddressSelectorProps>;
34
+ export {};
@@ -0,0 +1,57 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React, { useState, useCallback, useEffect } from 'react';
4
+ import { Dialog, DialogContent, DialogTitle } from './dialog';
5
+ import { formatAddress } from '@silentswap/sdk';
6
+ // Hooks
7
+ import { useEnsResolution } from '../../hooks/useEnsResolution';
8
+ import { useAddressSearch } from '../../hooks/useAddressSearch';
9
+ import { useContactSearch } from '../../hooks/useContactSearch';
10
+ // Components
11
+ import { PanelRow } from './PanelRow';
12
+ import { UserTile } from './UserTile';
13
+ import { ContactRow } from './ContactRow';
14
+ import { ContactSourceBadge } from './ContactSourceBadge';
15
+ import { ManualAddressEntry } from './ManualAddressEntry';
16
+ import { EnsResult } from './EnsResult';
17
+ import { BinocularsIcon } from './icons';
18
+ // ============================================================================
19
+ // Main Component
20
+ // ============================================================================
21
+ export const AddressSelector = ({ isOpen, onClose, onSelect, onSaveContact, connectedAddress, title, mode = 'recipient', contacts = [], targetAsset, connectedAccounts = {}, activeSenderId, }) => {
22
+ // Search state
23
+ const [search, setSearch] = useState('');
24
+ const [newLabel, setNewLabel] = useState('');
25
+ // Hooks
26
+ const ensState = useEnsResolution(search, mode === 'recipient');
27
+ const manualAddress = useAddressSearch(search);
28
+ const filteredContacts = useContactSearch(contacts, search, targetAsset, connectedAccounts);
29
+ // Dynamic title and placeholder
30
+ const displayTitle = title || `Select ${mode === 'sender' ? 'Sender' : 'Recipient'} Address`;
31
+ const placeholder = mode === 'recipient' ? 'Address, ENS, or nickname' : 'Filter by address';
32
+ // Reset and select handler
33
+ const resetAndSelect = useCallback((address, label) => {
34
+ setSearch('');
35
+ setNewLabel('');
36
+ onSelect(address, label);
37
+ onClose();
38
+ }, [onSelect, onClose]);
39
+ // Reset state when closing
40
+ useEffect(() => {
41
+ if (!isOpen) {
42
+ setSearch('');
43
+ setNewLabel('');
44
+ }
45
+ }, [isOpen]);
46
+ // Handle dialog open change
47
+ const handleOpenChange = useCallback((open) => {
48
+ if (!open) {
49
+ onClose();
50
+ }
51
+ }, [onClose]);
52
+ return (_jsx(Dialog, { open: isOpen, onOpenChange: handleOpenChange, children: _jsxs(DialogContent, { className: "text-white rounded-2xl border-[#333] bg-[#141414] w-[95vw] max-w-[580px] max-h-[85vh] p-0 flex flex-col", children: [_jsx(DialogTitle, { asChild: true, children: _jsx("div", { className: "p-4 border-b border-[#333] shrink-0", children: _jsx("div", { className: "flex items-center justify-between text-lg cursor-default", children: _jsx("div", { className: "font-semibold text-white", children: displayTitle }) }) }) }), _jsx("div", { className: "p-4 border-b border-[#333] shrink-0 mt-3", children: _jsx("input", { type: "text", className: "w-full bg-[#1a1a1a] border border-[#333] outline-none rounded-lg px-4 py-3 h-[52px] text-white text-sm box-border focus:ring-1 focus:ring-yellow focus:border-yellow", placeholder: placeholder, value: search, onChange: (e) => setSearch(e.target.value), autoFocus: true }) }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsxs("div", { className: "p-4", children: [manualAddress && (_jsx(ManualAddressEntry, { manualAddress: manualAddress, newLabel: newLabel, onLabelChange: setNewLabel, onSave: resetAndSelect, onSaveContact: onSaveContact })), ensState.searching && (_jsx(PanelRow, { left: _jsxs("span", { className: "text-[#888] text-sm", children: ["Searching ENS for ", ensState.searching, "..."] }) })), ensState.resolved && (_jsx(EnsResult, { name: ensState.resolved.name, address: ensState.resolved.address, onSelect: resetAndSelect, onSaveContact: onSaveContact })), connectedAddress && mode === 'recipient' && !manualAddress && (_jsx("div", { className: "mb-4 pb-4 border-b border-[#333]", children: _jsx(PanelRow, { onClick: () => resetAndSelect(connectedAddress), left: _jsxs(_Fragment, { children: [_jsx("div", { style: { zoom: 0.75 }, children: _jsx(UserTile, { address: connectedAddress }) }), _jsxs("div", { className: "flex flex-col", children: [_jsx("span", { className: "text-[14px] font-mono text-white", children: "Connected Wallet" }), _jsx("span", { className: "text-[12px] font-mono text-[#888]", children: formatAddress(connectedAddress, 6) })] })] }), right: _jsx(ContactSourceBadge, { source: "wallet", isActive: true }) }) })), !manualAddress && filteredContacts.length > 0 && (_jsx("div", { className: "flex flex-col", children: filteredContacts.map((contact) => {
53
+ const isActive = activeSenderId === contact.id;
54
+ const isWallet = connectedAccounts[contact.id] !== undefined;
55
+ return (_jsx(ContactRow, { contact: contact, onSelect: resetAndSelect, isActive: isActive, isWallet: isWallet, connectedAccounts: connectedAccounts }, contact.id));
56
+ }) })), !manualAddress && !ensState.searching && filteredContacts.length === 0 && search.trim() && (_jsxs("div", { className: "flex flex-col items-center justify-center py-10 px-4 text-center", children: [_jsx("div", { className: "mb-4", children: _jsx(BinocularsIcon, { width: 40, height: 40, className: "text-[#868686]" }) }), _jsx("div", { className: "text-white font-medium text-base mb-1", children: "No results found" }), _jsxs("div", { className: "text-[#868686] text-sm max-w-[240px]", children: ["We couldn't find any contacts or addresses matching \"", search.trim(), "\""] })] })), !manualAddress && !ensState.searching && contacts.length === 0 && !search.trim() && !connectedAddress && (_jsxs("div", { className: "flex flex-col items-center justify-center py-10 px-4 text-center", children: [_jsx("div", { className: "mb-4", children: _jsx(BinocularsIcon, { width: 40, height: 40, className: "text-[#868686]" }) }), _jsx("div", { className: "text-white font-medium text-base mb-1", children: "No contacts yet" }), _jsx("div", { className: "text-[#868686] text-sm", children: "Enter an address or ENS name above" })] }))] }) }), _jsx("div", { className: "p-4 border-t border-[#333] shrink-0", children: _jsx("button", { className: "w-full px-6 py-3 rounded-lg text-base font-medium bg-[#333] text-white hover:bg-[#444] transition-colors border-none", onClick: onClose, children: "Cancel" }) })] }) }));
57
+ };
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
3
+ declare const AlertDialog: React.FC<AlertDialogPrimitive.AlertDialogProps>;
4
+ declare const AlertDialogTrigger: React.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
5
+ declare const AlertDialogPortal: React.FC<AlertDialogPrimitive.AlertDialogPortalProps>;
6
+ declare const AlertDialogOverlay: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
7
+ declare const AlertDialogContent: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
8
+ declare const AlertDialogHeader: {
9
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
10
+ displayName: string;
11
+ };
12
+ declare const AlertDialogFooter: {
13
+ ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
14
+ displayName: string;
15
+ };
16
+ declare const AlertDialogTitle: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
17
+ declare const AlertDialogDescription: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
18
+ declare const AlertDialogAction: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
19
+ declare const AlertDialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialogPrimitive.AlertDialogCancelProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
20
+ export { AlertDialog, AlertDialogPortal, AlertDialogOverlay, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogDescription, AlertDialogAction, AlertDialogCancel, };
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
5
+ import { cn } from '../utils';
6
+ import { buttonVariants } from './button';
7
+ const AlertDialog = AlertDialogPrimitive.Root;
8
+ const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
9
+ const AlertDialogPortal = AlertDialogPrimitive.Portal;
10
+ const AlertDialogOverlay = React.forwardRef(({ className, ...props }, ref) => (_jsx(AlertDialogPrimitive.Overlay, { className: cn('fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0', className), ...props, ref: ref })));
11
+ AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
12
+ const AlertDialogContent = React.forwardRef(({ className, ...props }, ref) => (_jsxs(AlertDialogPortal, { children: [_jsx(AlertDialogOverlay, {}), _jsx(AlertDialogPrimitive.Content, { ref: ref, className: cn('fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg', className), ...props })] })));
13
+ AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
14
+ const AlertDialogHeader = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col space-y-2 text-center sm:text-left', className), ...props }));
15
+ AlertDialogHeader.displayName = 'AlertDialogHeader';
16
+ const AlertDialogFooter = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className), ...props }));
17
+ AlertDialogFooter.displayName = 'AlertDialogFooter';
18
+ const AlertDialogTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx(AlertDialogPrimitive.Title, { ref: ref, className: cn('text-lg font-semibold', className), ...props })));
19
+ AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
20
+ const AlertDialogDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx(AlertDialogPrimitive.Description, { ref: ref, className: cn('text-sm text-muted-foreground', className), ...props })));
21
+ AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
22
+ const AlertDialogAction = React.forwardRef(({ className, ...props }, ref) => (_jsx(AlertDialogPrimitive.Action, { ref: ref, className: cn(buttonVariants(), className), ...props })));
23
+ AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
24
+ const AlertDialogCancel = React.forwardRef(({ className, ...props }, ref) => (_jsx(AlertDialogPrimitive.Cancel, { ref: ref, className: cn(buttonVariants({ variant: 'outline' }), 'mt-2 sm:mt-0', className), ...props })));
25
+ AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
26
+ export { AlertDialog, AlertDialogPortal, AlertDialogOverlay, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogDescription, AlertDialogAction, AlertDialogCancel, };
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const Alert: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
4
+ variant?: "default" | "destructive" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
6
+ declare const AlertTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
7
+ declare const AlertDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
8
+ export { Alert, AlertTitle, AlertDescription };
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from '../utils';
5
+ const alertVariants = cva('relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7', {
6
+ variants: {
7
+ variant: {
8
+ default: 'bg-background text-foreground',
9
+ destructive: 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',
10
+ },
11
+ },
12
+ defaultVariants: {
13
+ variant: 'default',
14
+ },
15
+ });
16
+ const Alert = React.forwardRef(({ className, variant, ...props }, ref) => (_jsx("div", { ref: ref, role: "alert", className: cn(alertVariants({ variant }), className), ...props })));
17
+ Alert.displayName = 'Alert';
18
+ const AlertTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx("h5", { ref: ref, className: cn('mb-1 font-medium leading-none tracking-tight', className), ...props })));
19
+ AlertTitle.displayName = 'AlertTitle';
20
+ const AlertDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: cn('text-sm [&_p]:leading-relaxed', className), ...props })));
21
+ AlertDescription.displayName = 'AlertDescription';
22
+ export { Alert, AlertTitle, AlertDescription };
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { ReactNode } from 'react';
3
+ export interface AssetTileProps {
4
+ caip19: string;
5
+ onClick?: () => void;
6
+ className?: string;
7
+ children?: ReactNode;
8
+ size?: 'small' | 'medium' | 'large';
9
+ }
10
+ export declare const AssetTile: React.FC<AssetTileProps>;
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { asset_get, chain_get } from '../data';
4
+ export const AssetTile = ({ caip19, onClick, className = '', children, size = 'medium' }) => {
5
+ const asset = asset_get(caip19);
6
+ const chain = asset?.caip2 ? chain_get(asset.caip2) : undefined;
7
+ const sizeClasses = {
8
+ small: 'w-8 h-8',
9
+ medium: 'w-12 h-12',
10
+ large: 'w-16 h-16'
11
+ };
12
+ if (!asset) {
13
+ return (_jsx("div", { className: `flex items-center justify-center bg-gray-600 rounded-full ${sizeClasses[size]} ${className}`, children: _jsx("span", { className: "text-white text-xs", children: "?" }) }));
14
+ }
15
+ return (_jsxs("div", { className: `relative cursor-pointer ${className}`, onClick: onClick, children: [_jsx("div", { className: `flex items-center justify-center rounded-full ${sizeClasses[size]}`, style: {
16
+ background: asset.gradient ? `linear-gradient(135deg, ${asset.gradient.map((g) => `#${g}`).join(', ')})` : 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'
17
+ }, children: _jsx("img", { src: `/images/tokens/${asset.coingeckoId}.${asset.ext || 'svg'}`, alt: asset.symbol, className: "w-3/4 h-3/4 object-contain", style: asset.style ? JSON.parse(asset.style) : {} }) }), chain && (_jsx("div", { className: "absolute -bottom-1 -right-1 w-4 h-4 bg-black rounded-full flex items-center justify-center", children: _jsx("img", { src: `/images/chains/${chain.coingeckoPlatformId}.${chain.ext || 'svg'}`, alt: chain.name, className: "w-3 h-3 rounded-full object-cover" }) })), children] }));
18
+ };