@tuwaio/nova-core 0.2.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,46 +4,39 @@
4
4
  [![License](https://img.shields.io/npm/l/@tuwaio/nova-core.svg)](./LICENSE)
5
5
  [![Build Status](https://img.shields.io/github/actions/workflow/status/TuwaIO/nova-uikit/release.yml?branch=main)](https://github.com/TuwaIO/nova-uikit/actions)
6
6
 
7
- The foundational package for the Nova UI Kit design system. Provides core styling primitives, theme variables, utility functions, and common React hooks for building consistent Web3 applications.
7
+ The foundational package for the **TUWA ecosystem**, Nova Core serves as the shared foundation that powers all other Nova packages (`@tuwaio/nova-connect`, `@tuwaio/nova-transactions`).
8
8
 
9
- -----
9
+ ---
10
10
 
11
- ## What is `@tuwaio/nova-core`?
12
-
13
- `@tuwaio/nova-core` is the **foundational engine** of the Nova UI Kit design system. It is **not** a component library—instead, it provides the low-level tools, design tokens, and utilities necessary to build consistent, high-quality user interfaces across all TUWA products.
14
-
15
- Built for the **TUWA ecosystem**, Nova Core serves as the shared foundation that powers all other Nova packages (`@tuwaio/nova-connect`, `@tuwaio/nova-transactions`) and ensures design consistency across multi-chain Web3 applications.
16
-
17
- **Why Nova Core?**
11
+ ## Why Nova Core??
18
12
 
19
13
  Building design systems requires consistent foundations: colors, spacing, typography, and utility functions. Without a shared core, different packages end up with conflicting styles, duplicated code, and inconsistent user experiences.
20
14
 
21
15
  Nova Core solves this by:
22
16
 
23
17
  1. **Offering Smart Utilities:** Battle-tested helper functions like the `cn` utility that combines `clsx` and `tailwind-merge` for conflict-free styling.
24
- 2. **Supplying Common Hooks:** A collection of reusable React hooks for common Web3 UI patterns.
18
+ 2. **Supplying Common Hooks:** A collection of reusable React hooks for common UI patterns.
25
19
  3. **Ensuring Tailwind CSS v4 Integration:** Seamless compatibility with modern Tailwind CSS workflows.
26
20
 
27
- -----
21
+ ---
28
22
 
29
23
  ## ✨ Key Features
30
24
 
31
25
  - **🎨 Complete Design Token System:** Comprehensive CSS variables for colors, spacing, typography, shadows, and animations
32
26
  - **🛠️ Smart Utility Functions:** Advanced `cn` utility that merges Tailwind classes intelligently, preventing style conflicts
33
- - **🎣 Common React Hooks:** Collection of reusable hooks for Web3 UI patterns like wallet state, transaction status, and theme management
34
27
  - **⚡ Tailwind CSS v4 Ready:** Full compatibility with modern Tailwind CSS workflows and arbitrary value usage
35
28
  - **🌓 Dark Mode Support:** Built-in dark mode theming with CSS variable-based switching
36
29
  - **♿ Accessibility First:** ARIA-compliant design tokens and utilities for building accessible interfaces
37
30
  - **📱 Responsive Design:** Mobile-first breakpoints and responsive utility functions
38
31
 
39
- -----
32
+ ---
40
33
 
41
34
  ## 💾 Installation
42
35
 
43
36
  ### Requirements
44
37
 
45
38
  - **React:** 19+
46
- - **Node.js:** 20+
39
+ - **Node.js:** 20-24
47
40
  - **TypeScript:** 5.9+ (recommended)
48
41
 
49
42
  ### Package Installation
@@ -51,14 +44,8 @@ Nova Core solves this by:
51
44
  Install the package using your preferred package manager:
52
45
 
53
46
  ```bash
54
- # Using pnpm (recommended)
47
+ # Using pnpm (recommended), but you can use npm, yarn or bun as well
55
48
  pnpm add @tuwaio/nova-core
56
-
57
- # Using npm
58
- npm install @tuwaio/nova-core
59
-
60
- # Using yarn
61
- yarn add @tuwaio/nova-core
62
49
  ```
63
50
 
64
51
  ### CSS Setup
@@ -70,7 +57,7 @@ yarn add @tuwaio/nova-core
70
57
  @import '@tuwaio/nova-core/dist/index.css';
71
58
  ```
72
59
 
73
- -----
60
+ ---
74
61
 
75
62
  ## 🚀 Usage
76
63
 
@@ -80,15 +67,15 @@ Nova Core is designed to work seamlessly with Tailwind CSS v4. You can use the C
80
67
 
81
68
  ```tsx
82
69
  // Using Nova design tokens in Tailwind classes
83
- <button className="bg-[var(--tuwa-color-primary)] text-[var(--tuwa-text-on-primary)]">
70
+ <button className="bg-[var(--tuwa-text-accent)] text-[var(--tuwa-text-on-accent)]">
84
71
  Connect Wallet
85
72
  </button>
86
73
 
87
74
  // With hover states and transitions
88
75
  <div className="
89
- p-[var(--tuwa-spacing-md)]
76
+ p-4
90
77
  bg-[var(--tuwa-bg-secondary)]
91
- hover:bg-[var(--tuwa-bg-hover)]
78
+ hover:bg-[var(--tuwa-bg-muted)]
92
79
  transition-colors
93
80
  ">
94
81
  Card Content
@@ -106,34 +93,31 @@ import { cn } from '@tuwaio/nova-core';
106
93
  const buttonClass = cn(
107
94
  'px-4 py-2 font-medium rounded-lg', // base styles
108
95
  'bg-blue-500 text-white', // default variant
109
- {'opacity-50 cursor-not-allowed': isLoading}, // conditional styles
110
- className // additional classes from props
96
+ { 'opacity-50 cursor-not-allowed': isLoading }, // conditional styles
97
+ className, // additional classes from props
111
98
  );
112
99
 
113
100
  // Tailwind class conflict resolution
114
101
  const mergedClasses = cn(
115
102
  'p-4 text-sm', // base classes
116
- 'p-6 text-lg' // these override the base classes intelligently
103
+ 'p-6 text-lg', // these override the base classes intelligently
117
104
  );
118
105
  // Result: 'p-6 text-lg' (conflicts resolved)
119
106
  ```
120
107
 
121
108
  ### Common React Hooks
122
109
 
123
- Nova Core provides several utility hooks for common Web3 UI patterns:
110
+ Nova Core provides several utility hooks for common UI patterns:
124
111
 
125
112
  ```tsx
126
- import { useCopyToClipboard } from '@tuwaio/nova-core';
113
+ import { cn, useCopyToClipboard } from '@tuwaio/nova-core';
127
114
 
128
115
  function WalletAddress({ address }: { address: string }) {
129
116
  const [copied, copy] = useCopyToClipboard();
130
117
 
131
118
  return (
132
- <div className={cn('transition-all', isCollapsed && 'w-12')}>
133
- <button
134
- onClick={() => copy(address)}
135
- className="font-mono text-sm hover:bg-[var(--tuwa-bg-hover)]"
136
- >
119
+ <div className={cn('transition-all', { 'w-12': isCollapsed })}>
120
+ <button onClick={() => copy(address)} className="font-mono text-sm hover:bg-[var(--tuwa-bg-hover)]">
137
121
  {address.slice(0, 6)}
138
122
  {copied && ' ✓'}
139
123
  </button>
@@ -142,7 +126,7 @@ function WalletAddress({ address }: { address: string }) {
142
126
  }
143
127
  ```
144
128
 
145
- -----
129
+ ---
146
130
 
147
131
  ## 🛠️ Theme Customization
148
132
 
@@ -156,19 +140,17 @@ Override design tokens in your CSS to match your brand:
156
140
 
157
141
  /* Your custom theme overrides */
158
142
  :root {
159
- /* Brand Colors */
160
- --tuwa-color-primary: #3b82f6; /* Blue-500 */
161
- --tuwa-color-primary-hover: #2563eb; /* Blue-600 */
143
+ /* Text Colors */
144
+ --tuwa-text-primary: #0f172a;
145
+ --tuwa-text-secondary: #64748b;
146
+ --tuwa-text-tertiary: #94a3b8;
147
+ --tuwa-text-accent: #3b82f6;
148
+ --tuwa-text-on-accent: #ffffff;
162
149
 
163
150
  /* Background System */
164
151
  --tuwa-bg-primary: #ffffff;
165
152
  --tuwa-bg-secondary: #f8fafc;
166
- --tuwa-bg-hover: #f1f5f9;
167
-
168
- /* Text Colors */
169
- --tuwa-text-primary: #0f172a;
170
- --tuwa-text-secondary: #64748b;
171
- --tuwa-text-muted: #94a3b8;
153
+ --tuwa-bg-muted: #f1f5f9;
172
154
 
173
155
  /* Border System */
174
156
  --tuwa-border-primary: #e2e8f0;
@@ -183,12 +165,13 @@ Nova Core includes built-in dark mode support:
183
165
  ```css
184
166
  /* Dark mode overrides */
185
167
  .dark {
186
- --tuwa-color-primary: #60a5fa; /* Blue-400 */
187
- --tuwa-bg-primary: #0f172a; /* Slate-900 */
188
- --tuwa-bg-secondary: #1e293b; /* Slate-800 */
189
- --tuwa-text-primary: #f1f5f9; /* Slate-100 */
190
- --tuwa-text-secondary: #cbd5e1; /* Slate-300 */
191
- --tuwa-border-primary: #374151; /* Gray-700 */
168
+ --tuwa-text-primary: #f1f5f9;
169
+ --tuwa-text-secondary: #9ca3af;
170
+ --tuwa-text-accent: #60a5fa;
171
+ --tuwa-bg-primary: #0f172a;
172
+ --tuwa-bg-secondary: #1e293b;
173
+ --tuwa-bg-muted: #334155;
174
+ --tuwa-border-primary: #374151;
192
175
  }
193
176
  ```
194
177
 
@@ -205,18 +188,12 @@ import { NovaTransactionsProvider } from '@tuwaio/nova-transactions';
205
188
 
206
189
  function App() {
207
190
  return (
208
- <div className={cn(
209
- 'min-h-screen',
210
- 'bg-[var(--tuwa-bg-primary)]',
211
- 'text-[var(--tuwa-text-primary)]'
212
- )}>
213
- <NovaTransactionsProvider {...params} />
214
- <header className="border-b border-[var(--tuwa-border-primary)]">
215
- <ConnectButton />
216
- </header>
217
- <main>
218
- {/* Your app content */}
219
- </main>
191
+ <div className={cn('min-h-screen', 'bg-[var(--tuwa-bg-primary)]', 'text-[var(--tuwa-text-primary)]')}>
192
+ <NovaTransactionsProvider {...params} />
193
+ <header className="border-b border-[var(--tuwa-border-primary)]">
194
+ <ConnectButton />
195
+ </header>
196
+ <main>{/* Your app content */}</main>
220
197
  </div>
221
198
  );
222
199
  }
@@ -226,16 +203,16 @@ function App() {
226
203
 
227
204
  #### Utilities
228
205
 
229
- | Function | Description | Usage |
230
- | :--- | :--- |:------------------------------------------|
206
+ | Function | Description | Usage |
207
+ | :------------------- | :------------------------------------------------------------- | :--------------------------------------------------- |
231
208
  | **`cn(...classes)`** | Merges class names intelligently, resolving Tailwind conflicts | `cn('p-4 text-sm', 'p-6', {'hidden': conditional})` |
232
209
 
233
210
  #### Hooks
234
211
 
235
- | Hook | Description | Return Type |
236
- | :--- | :--- | :--- |
212
+ | Hook | Description | Return Type |
213
+ | :------------------------- | :----------------------------------- | :---------------------------------- |
237
214
  | **`useCopyToClipboard()`** | Copy text to clipboard with feedback | `[boolean, (text: string) => void]` |
238
- | **`useMediaQuery(query)`** | Responsive media query hook | `boolean` |
215
+ | **`useMediaQuery(query)`** | Responsive media query hook | `boolean` |
239
216
 
240
217
  ## 🤝 Contributing & Support
241
218
 
@@ -247,4 +224,4 @@ If you find this library useful, please consider supporting its development. Eve
247
224
 
248
225
  ## 📄 License
249
226
 
250
- This project is licensed under the **Apache-2.0 License** - see the [LICENSE](./LICENSE) file for details.
227
+ This project is licensed under the **Apache-2.0 License** - see the [LICENSE](./LICENSE) file for details.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),metadata=require('@web3icons/common/metadata'),jsxRuntime=require('react/jsx-runtime'),l=require('react'),s=require('@radix-ui/react-dialog');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__namespace=/*#__PURE__*/_interopNamespace(l);var s__namespace=/*#__PURE__*/_interopNamespace(s);var po="novacore:cursor-pointer novacore:rounded-md novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";function i(...o){return tailwindMerge.twMerge(clsx.clsx(o))}var g=o=>o&&typeof o=="object"&&!Array.isArray(o);function z(o,e){let t={...o};return g(o)&&g(e)&&Object.keys(e).forEach(n=>{let a=o[n],r=e[n];g(a)&&g(r)?t[n]=z(a,r):t[n]=r;}),t}function w(o){if(typeof o!="string")return false;let e=o.toLowerCase();return e.includes("solana")&&(e.includes("devnet")||e.includes("testnet"))}var k="Unknown";function C(o){if(typeof o=="number")return metadata.networks.find(a=>a.chainId===o)?.name??k;let[e,t]=o.split(":"),n=metadata.networks.find(a=>a.id===e);if(!n)return k;if(t&&w(o)){let a=t.charAt(0).toUpperCase()+t.slice(1).toLowerCase();return `${n.name} ${a}`}return n.name}function D(o=1200){if(typeof window>"u")return false;let e="ontouchstart"in window,t=navigator.maxTouchPoints>0,n=false;window.matchMedia&&(n=window.matchMedia("(pointer: coarse)").matches);let a=e||t||n,r=window.innerWidth<=o;return a&&r}function Do(o,e,t){if(!o)return "";if(o.length<=e+t)return o;let n=o.slice(0,e),a=o.slice(o.length-t);return `${n}...${a}`}function Vo({className:o,strokeWidth:e,isOpen:t}){return jsxRuntime.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:e??2,stroke:"currentColor",className:i("novacore:w-4 novacore:h-4 novacore:text-[var(--tuwa-text-secondary)]",o),children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{children:t&&jsxRuntime.jsx(framerMotion.motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5",variants:{hidden:{translateY:3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:!t&&jsxRuntime.jsx(framerMotion.motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5",className:"novacore:relative",variants:{hidden:{translateY:-3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})})]})}var B=l__namespace.forwardRef(({className:o,...e},t)=>jsxRuntime.jsxs("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:i("novacore:h-5 novacore:w-5 novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors",o),...e,children:[jsxRuntime.jsx("path",{d:"M18 6 6 18"}),jsxRuntime.jsx("path",{d:"m6 6 12 12"})]}));B.displayName="CloseIcon";var O="flex items-center justify-center novacore:w-full novacore:h-full novacore:rounded-full novacore:text-[var(--tuwa-text-secondary)] novacore:bg-[var(--tuwa-bg-muted)]",d=({animate:o=false,content:e="",className:t})=>jsxRuntime.jsx("div",{className:i(O,"Nova_Web3_Icon",t,{"novacore:animate-pulse":o}),children:e});var Uo=s__namespace.Root,Qo=s__namespace.Trigger,_=s__namespace.Portal,Jo=s__namespace.Close,Y={initial:{opacity:0,scale:.9,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.9,transition:{duration:.2}}},$={initial:{opacity:0,y:"100%"},animate:{opacity:1,y:"0%"},exit:{opacity:0,y:"100%",transition:{duration:.2}}},q={initial:{opacity:0},animate:{opacity:1},exit:{opacity:0}},L=({className:o,backdropAnimation:e})=>(l__namespace.useEffect(()=>(typeof window<"u"&&window.document.body.classList.add("NovaModalOpen"),()=>{typeof window<"u"&&window.document.body.classList.remove("NovaModalOpen");}),[]),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:jsxRuntime.jsx(framerMotion.motion.div,{variants:e??q,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"novacore:relative novacore:overflow-hidden",children:jsxRuntime.jsx("div",{className:i("novacore:fixed novacore:inset-0 novacore:z-50 novacore:bg-black/55 novacore:backdrop-blur-sm novacore:backdrop-saturate-150",o)})})}));L.displayName=s__namespace.Overlay.displayName;var G=l__namespace.forwardRef(({className:o,children:e,modalAnimation:t,backdropAnimation:n,...a},r)=>{let[u,m]=l__namespace.useState(false);l__namespace.useEffect(()=>{m(D());},[]);let f=t??(u?$:Y);return jsxRuntime.jsxs(_,{children:[jsxRuntime.jsx(L,{backdropAnimation:n}),jsxRuntime.jsx(s__namespace.Content,{"aria-describedby":"tuwa:modal-content",ref:r,className:i("NovaNoScrolling novacore:fixed novacore:bottom-0 novacore:left-0 novacore:p-0 novacore:sm:bottom-auto novacore:sm:left-[50%] novacore:sm:top-[50%] novacore:sm:translate-x-[-50%] novacore:sm:translate-y-[-50%] novacore:z-50 novacore:sm:p-4 novacore:outline-none",o),...a,children:jsxRuntime.jsx(framerMotion.motion.div,{layout:true,className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",transition:{layout:{duration:.2,ease:[.1,.1,.2,1]}},children:jsxRuntime.jsx(framerMotion.AnimatePresence,{children:jsxRuntime.jsx(framerMotion.motion.div,{variants:f,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",children:jsxRuntime.jsx("div",{className:i("NovaNoScrolling NovaDialogContent__elements novacore:relative novacore:flex novacore:max-h-[98dvh] novacore:w-full novacore:flex-col novacore:gap-3 novacore:overflow-y-auto novacore:rounded-t-2xl novacore:sm:rounded-2xl novacore:shadow-2xl","novacore:border novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)]"),children:e})})})})})]})});G.displayName=s__namespace.Content.displayName;var j=({className:o,...e})=>jsxRuntime.jsx("div",{"aria-describedby":"tuwa:modal-header",className:i("novacore:sticky novacore:flex novacore:top-0 novacore:z-11 novacore:w-full novacore:flex-row novacore:items-center novacore:justify-between","novacore:border-b novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)] novacore:p-4",o),...e});j.displayName="DialogHeader";var K=({className:o,...e})=>jsxRuntime.jsx("div",{"aria-describedby":"tuwa:modal-footer",className:i("novacore:flex novacore:flex-col-reverse novacore:sm:flex-row novacore:sm:justify-end novacore:sm:space-x-2",o),...e});K.displayName="DialogFooter";var U=l__namespace.forwardRef(({className:o,...e},t)=>jsxRuntime.jsx(s__namespace.Title,{ref:t,"aria-describedby":"tuwa:modal-title",className:i("novacore:text-lg novacore:font-bold novacore:leading-none novacore:tracking-tight novacore:text-[var(--tuwa-text-primary)] novacore:m-0",o),...e}));U.displayName=s__namespace.Title.displayName;var Q=l__namespace.forwardRef(({className:o,...e},t)=>jsxRuntime.jsx(s__namespace.Description,{"aria-describedby":"tuwa:modal-description",ref:t,className:i("novacore:text-sm novacore:text-[var(--tuwa-text-secondary)]",o),...e}));Q.displayName=s__namespace.Description.displayName;var A=l.lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.NetworkIcon})));function ne({chainId:o,variant:e="background",className:t}){let n=C(o),a=typeof o=="string",r=a?o.split(":")[0].toLowerCase():o,u=a&&w(o),m=i("novacore:w-full novacore:h-full novacore:rounded-full",t,{"novacore:[&_path]:first-of-type:fill-[var(--tuwa-testnet-icons)]":u||n.toLowerCase().includes("testnet")});return jsxRuntime.jsx(l.Suspense,{fallback:jsxRuntime.jsx(d,{animate:true,className:t}),children:typeof r=="string"?jsxRuntime.jsx(A,{id:r,variant:e,className:m,fallback:jsxRuntime.jsx(d,{content:"?",className:t})}):jsxRuntime.jsx(A,{chainId:r,variant:e,className:m,fallback:jsxRuntime.jsx(d,{content:"?",className:t})})})}function ce({starsCount:o}){let[e,t]=l.useState(false);l.useEffect(()=>t(true),[]);let n=l.useMemo(()=>e?Array.from({length:o??200}).map(()=>({x:Math.random()*window.innerWidth,y:Math.random()*window.innerHeight,r:Math.random()*1+.5,isSupernova:Math.random()<.1,delay:Math.random()*10,duration:5+Math.random()*5})):[],[e]);return jsxRuntime.jsx("div",{className:"novacore:absolute novacore:inset-0 novacore:z-1 novacore:h-full novacore:w-full novacore:overflow-hidden",children:jsxRuntime.jsxs("svg",{width:"100%",height:"100%",xmlns:"http://www.w3.org/2000/svg",children:[jsxRuntime.jsx("defs",{children:jsxRuntime.jsx("style",{children:`
1
+ 'use strict';var framerMotion=require('framer-motion'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),metadata=require('@web3icons/common/metadata'),jsxRuntime=require('react/jsx-runtime'),u=require('react'),c=require('@radix-ui/react-dialog');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var c__namespace=/*#__PURE__*/_interopNamespace(c);var Vo="novacore:cursor-pointer novacore:rounded-[var(--tuwa-rounded-corners)] novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";function s(...o){return tailwindMerge.twMerge(clsx.clsx(o))}var y=o=>o&&typeof o=="object"&&!Array.isArray(o);function K(o,e){let t={...o};return y(o)&&y(e)&&Object.keys(e).forEach(a=>{let r=o[a],n=e[a];y(r)&&y(n)?t[a]=K(r,n):t[a]=n;}),t}function x(o){if(typeof o!="string")return false;let e=o.toLowerCase();return e.includes("solana")&&(e.includes("devnet")||e.includes("testnet"))}var T="Unknown";function Q(o){return o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()}function E(o){let e={name:T,id:T.toLowerCase(),filePath:T.toLowerCase(),chainId:o};if(typeof o=="number"){let i=metadata.networks.find(l=>l.chainId===o);return i?{name:i.name,id:i.id,filePath:i.filePath.split(":")[1],chainId:o}:e}let[t,a]=o.split(":"),r=metadata.networks.find(i=>i.id===t);return r?{name:a&&x(o)?`${r.name} ${Q(a)}`:r.name,id:r.id,filePath:r.filePath.split(":")[1],chainId:o}:e}function A(o=1200){if(typeof window>"u")return false;let e="ontouchstart"in window,t=navigator.maxTouchPoints>0,a=false;window.matchMedia&&(a=window.matchMedia("(pointer: coarse)").matches);let r=e||t||a,n=window.innerWidth<=o;return r&&n}function X(o){if(!o.startsWith("var("))return o;let e=o.match(/var\(\s*(--[\w-]+)/);if(!e)return o;let t=e[1];return getComputedStyle(document.documentElement).getPropertyValue(t).trim()||o}function j(o,e){let t=X(e),r=new DOMParser().parseFromString(o,"image/svg+xml");if(r.querySelector("parsererror"))return console.warn("SVG parse error, returning original"),o;let i=r.querySelector("path");return i&&i.setAttribute("fill",t),new XMLSerializer().serializeToString(r.documentElement)}function N(o,e){let t=o;return e&&(t=j(t,e)),`data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(t)))}`}var S=o=>`${o.replace(/\s+/g,"-").toLowerCase()}.svg`;function Ko(o,e,t){if(!o)return "";if(o.length<=e+t)return o;let a=o.slice(0,e),r=o.slice(o.length-t);return `${a}...${r}`}function se({className:o,strokeWidth:e,isOpen:t}){return jsxRuntime.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:e??2,stroke:"currentColor",className:s("novacore:w-4 novacore:h-4 novacore:text-[var(--tuwa-text-secondary)]",o),children:[jsxRuntime.jsx(framerMotion.AnimatePresence,{children:t&&jsxRuntime.jsx(framerMotion.motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5",variants:{hidden:{translateY:3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})}),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:!t&&jsxRuntime.jsx(framerMotion.motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5",className:"novacore:relative",variants:{hidden:{translateY:-3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})})]})}var Z=u__namespace.forwardRef(({className:o,...e},t)=>jsxRuntime.jsxs("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:s("novacore:h-5 novacore:w-5 novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors",o),...e,children:[jsxRuntime.jsx("path",{d:"M18 6 6 18"}),jsxRuntime.jsx("path",{d:"m6 6 12 12"})]}));Z.displayName="CloseIcon";var eo="novacore:flex novacore:items-center novacore:justify-center novacore:w-full novacore:h-full novacore:rounded-full novacore:text-[var(--tuwa-text-secondary)] novacore:bg-[var(--tuwa-bg-muted)]",v=({animate:o=false,content:e="",className:t})=>jsxRuntime.jsx("div",{className:s(eo,"Nova_Web3_Icon",t,{"novacore:animate-pulse":o}),children:e});function k({src:o,alt:e,...t}){return jsxRuntime.jsx("img",{...t,src:o,alt:e??"",draggable:false,onDragStart:a=>a.preventDefault(),style:{outline:"none",pointerEvents:"none"}})}var no="https://raw.githubusercontent.com/0xa3k5/web3icons/refs/heads/main/raw-svgs";function b({githubSrc:o,className:e,alt:t,firstPathFill:a,...r}){let[n,i]=u.useState(null),[l,m]=u.useState("idle");return u.useEffect(()=>{let f=true;return (async()=>{m("loading");try{let w=await fetch(`${no}/${o}`);if(!w.ok)throw new Error(`Failed to load icon: ${w.status}`);let Y=await w.text();f&&(i(N(Y,a)),m("success"));}catch{f&&m("error");}})(),()=>{f=false;}},[o,a]),l==="loading"||l==="idle"?jsxRuntime.jsx(v,{animate:true,className:e}):l==="success"&&n?jsxRuntime.jsx(k,{...r,src:n,alt:t,className:e}):jsxRuntime.jsx(v,{content:"?",className:e})}var Te=c__namespace.Root,De=c__namespace.Trigger,io=c__namespace.Portal,Re=c__namespace.Close,so={initial:{opacity:0,scale:.9,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.9,transition:{duration:.2}}},co={initial:{opacity:0,y:"100%"},animate:{opacity:1,y:"0%"},exit:{opacity:0,y:"100%",transition:{duration:.2}}},lo={initial:{opacity:0},animate:{opacity:1},exit:{opacity:0}},B=({className:o,backdropAnimation:e})=>(u__namespace.useEffect(()=>(typeof window<"u"&&window.document.body.classList.add("NovaModalOpen"),()=>{typeof window<"u"&&window.document.body.classList.remove("NovaModalOpen");}),[]),jsxRuntime.jsx(framerMotion.AnimatePresence,{children:jsxRuntime.jsx(framerMotion.motion.div,{variants:e??lo,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"novacore:relative novacore:overflow-hidden",children:jsxRuntime.jsx("div",{className:s("novacore:fixed novacore:inset-0 novacore:z-50 novacore:bg-black/55 novacore:backdrop-blur-sm novacore:backdrop-saturate-150",o)})})}));B.displayName=c__namespace.Overlay.displayName;var mo=u__namespace.forwardRef(({className:o,children:e,modalAnimation:t,backdropAnimation:a,...r},n)=>{let[i,l]=u__namespace.useState(false);u__namespace.useEffect(()=>{l(A());},[]);let m=t??(i?co:so);return jsxRuntime.jsxs(io,{children:[jsxRuntime.jsx(B,{backdropAnimation:a}),jsxRuntime.jsx(c__namespace.Content,{"aria-describedby":"tuwa:modal-content",ref:n,className:s("NovaNoScrolling novacore:fixed novacore:bottom-0 novacore:left-0 novacore:p-0 novacore:sm:bottom-auto novacore:sm:left-[50%] novacore:sm:top-[50%] novacore:sm:translate-x-[-50%] novacore:sm:translate-y-[-50%] novacore:z-50 novacore:sm:p-4 novacore:outline-none",o),...r,children:jsxRuntime.jsx(framerMotion.motion.div,{layout:true,className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",transition:{layout:{duration:.2,ease:[.1,.1,.2,1]}},children:jsxRuntime.jsx(framerMotion.AnimatePresence,{children:jsxRuntime.jsx(framerMotion.motion.div,{variants:m,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",children:jsxRuntime.jsx("div",{className:s("NovaNoScrolling NovaDialogContent__elements novacore:relative novacore:flex novacore:max-h-[98dvh] novacore:w-full novacore:flex-col novacore:gap-3 novacore:overflow-y-auto novacore:rounded-t-[var(--tuwa-rounded-corners)] novacore:sm:rounded-[var(--tuwa-rounded-corners)]","novacore:border novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)]"),children:e})})})})})]})});mo.displayName=c__namespace.Content.displayName;var uo=({className:o,...e})=>jsxRuntime.jsx("div",{"aria-describedby":"tuwa:modal-header",className:s("novacore:sticky novacore:flex novacore:top-0 novacore:z-11 novacore:w-full novacore:flex-row novacore:items-center novacore:justify-between","novacore:border-b novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)] novacore:p-4",o),...e});uo.displayName="DialogHeader";var po=({className:o,...e})=>jsxRuntime.jsx("div",{"aria-describedby":"tuwa:modal-footer",className:s("novacore:flex novacore:flex-col-reverse novacore:sm:flex-row novacore:sm:justify-end novacore:sm:space-x-2",o),...e});po.displayName="DialogFooter";var fo=u__namespace.forwardRef(({className:o,...e},t)=>jsxRuntime.jsx(c__namespace.Title,{ref:t,"aria-describedby":"tuwa:modal-title",className:s("novacore:text-lg novacore:font-bold novacore:leading-none novacore:tracking-tight novacore:text-[var(--tuwa-text-primary)] novacore:m-0",o),...e}));fo.displayName=c__namespace.Title.displayName;var vo=u__namespace.forwardRef(({className:o,...e},t)=>jsxRuntime.jsx(c__namespace.Description,{"aria-describedby":"tuwa:modal-description",ref:t,className:s("novacore:text-sm novacore:text-[var(--tuwa-text-secondary)]",o),...e}));vo.displayName=c__namespace.Description.displayName;function h({children:o,iconId:e,alt:t,firstPathFill:a,...r}){let[n,i]=u.useState(null),l=u.useCallback(m=>{if(m){let f=N(m.outerHTML,a);i({id:e,src:f});}},[e,a]);return n&&n.id===e?jsxRuntime.jsx(k,{...r,src:n.src,alt:t}):jsxRuntime.jsx(jsxRuntime.Fragment,{children:o(l)})}var H=u.lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.NetworkIcon}))),No="var(--tuwa-testnet-icons)";function Ye({chainId:o,variant:e="background",className:t}){let a=E(o),r=typeof o=="string",n=r?o.split(":")[0].toLowerCase():o,l=r&&x(o)||a.name.toLowerCase().includes("testnet")?No:void 0,m=s("novacore:w-full novacore:h-full novacore:rounded-full",t),f=typeof n=="string"?n:a.filePath,I=`networks/${e}/${S(f)}`;return jsxRuntime.jsx(u.Suspense,{fallback:jsxRuntime.jsx(v,{animate:true,className:t}),children:jsxRuntime.jsx(h,{iconId:`${o}-${e}`,className:m,firstPathFill:l,children:w=>typeof n=="string"?jsxRuntime.jsx(H,{ref:w,id:n,variant:e,fallback:jsxRuntime.jsx(b,{githubSrc:I,className:m,firstPathFill:l})}):jsxRuntime.jsx(H,{ref:w,chainId:n,variant:e,fallback:jsxRuntime.jsx(b,{githubSrc:I,className:m,firstPathFill:l})})})})}function Qe({starsCount:o}){let[e,t]=u.useState(false);u.useEffect(()=>t(true),[]);let a=u.useMemo(()=>e?Array.from({length:o??200}).map(()=>({x:Math.random()*window.innerWidth,y:Math.random()*window.innerHeight,r:Math.random()*1+.5,isSupernova:Math.random()<.1,delay:Math.random()*10,duration:5+Math.random()*5})):[],[e]);return jsxRuntime.jsx("div",{className:"novacore:absolute novacore:inset-0 novacore:z-1 novacore:h-full novacore:w-full novacore:overflow-hidden",children:jsxRuntime.jsxs("svg",{width:"100%",height:"100%",xmlns:"http://www.w3.org/2000/svg",children:[jsxRuntime.jsx("defs",{children:jsxRuntime.jsx("style",{children:`
2
2
  /* Pulse animation now includes scale for a more organic feel. */
3
3
  @keyframes pulse {
4
4
  0%, 100% {
@@ -44,5 +44,5 @@
44
44
  transform-origin: center;
45
45
  stroke-width: 2;
46
46
  }
47
- `})}),n.map((a,r)=>jsxRuntime.jsx("circle",{cx:a.x,cy:a.y,r:a.r,fill:"rgba(var(--tuwa-bg-primary), 0.7)",className:a.isSupernova?"supernova":"pulsar",style:{animationDelay:`${a.delay}s`,animationDuration:`${a.duration}s`}},r))]})})}function ve({closeToast:o,ariaLabel:e="Close toast notification",title:t="Close toast notification",className:n,iconClassName:a}){return jsxRuntime.jsx("button",{type:"button",onClick:o,"aria-label":e,title:t,className:i("novacore:absolute novacore:top-2 novacore:right-2 novacore:cursor-pointer novacore:rounded-full novacore:p-1","novacore:text-[var(--tuwa-text-tertiary)] novacore:transition-colors","novacore:hover:bg-[var(--tuwa-bg-muted)] novacore:hover:text-[var(--tuwa-text-primary)]",n),children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:i("novacore:h-5 novacore:w-5",a),children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18 18 6M6 6l12 12"})})})}var io=l.lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.WalletIcon}))),so={walletconnect:"wallet-connect"},co=({className:o})=>jsxRuntime.jsxs("svg",{className:o,fill:"none",viewBox:"0 0 32 32",xmlns:"http://www.w3.org/2000/svg",children:[jsxRuntime.jsx("path",{fill:"#fff",fillRule:"evenodd",d:"M16 0c8.84 0 16 7.16 16 16s-7.16 16-16 16S0 24.84 0 16 7.16 0 16 0",clipRule:"evenodd"}),jsxRuntime.jsx("path",{fill:"#000",fillRule:"evenodd",d:"M16.54 2.01h1.53c.5.09.99.23 1.48.42.21.25.19.48-.05.69q-.195.045-.39 0c-1.86-.65-3.55-.35-5.07.89 2.39.7 3.84 2.27 4.36 4.7.12.85.08 1.68-.12 2.51.87 0 1.74 0 2.61-.02.39-.4.7-.85.94-1.35-.45-.45-.65-.99-.59-1.63-1.15.08-1.79-.44-1.92-1.58.14-1.12.78-1.67 1.92-1.63a.7.7 0 0 0-.12-.49l-.89-.89c-.02-.45.19-.6.62-.47.24.19.46.39.66.62.71-.79 1.5-.89 2.39-.32.44.42.62.94.54 1.55 1.49.02 2.11.76 1.85 2.22-.08.17-.17.34-.27.49.53.59.87 1.28 1.01 2.07.08 4.6.1 9.19.05 13.79-.19 1.58-1 2.71-2.44 3.37-.29.1-.59.2-.89.27H7.2c-1.31-.33-2.05-1.17-2.24-2.51-.03-5.24-.03-10.47 0-15.71.3-1.62 1.28-2.46 2.93-2.54 1.26-1.77 2.98-2.64 5.17-2.61.96-1.01 2.13-1.62 3.5-1.85zm6.11 1.87c.39-.03.7.12.91.44.06.39.09.79.1 1.18.02.12.07.21.17.27.41 0 .82.04 1.23.1.49.26.63.65.42 1.16-.07.14-.18.25-.32.32-.39.06-.79.09-1.18.1-.12.02-.21.07-.27.17l-.15 1.33c-.32.46-.72.55-1.21.27a.76.76 0 0 1-.27-.37c-.06-.41-.09-.82-.1-1.23a.35.35 0 0 0-.27-.17l-1.08-.05c-.46-.24-.62-.61-.47-1.11.14-.27.36-.43.66-.47l.99-.05s.09-.04.12-.07l.15-1.28q.18-.39.57-.54m-10.49.79c2.41-.09 4.12.94 5.15 3.1.44 1.12.48 2.25.12 3.4-.84.06-1.67.07-2.51.02.56-.68.52-1.32-.1-1.92-.26-.13-.54-.19-.84-.17.02-.95 0-1.91-.07-2.86-.21-.41-.55-.58-1.01-.52-.17.03-.31.09-.44.2-.72.92-1.43 1.85-2.14 2.78-.28.45-.29.91-.05 1.38q.225.3.57.42c.34.02.69.03 1.03.02v.69c-1.3.02-2.59 0-3.89-.05-.58-2.1-.08-3.88 1.53-5.34.79-.62 1.68-1 2.66-1.16zm.83 1.82c.07 0 .13.03.17.1l.05 3.05c.04.09.1.16.17.22l.89.05c.22.08.3.24.22.47q-.27.42-.57.81c-.43.02-.85.03-1.28.02 0-.41 0-.82-.02-1.23a.46.46 0 0 0-.17-.17l-1.28-.05c-.3-.1-.37-.29-.22-.57.7-.89 1.39-1.79 2.04-2.71zm-5.81.84h.2a6.1 6.1 0 0 0-.25 3.77c-.59-.13-1.01-.49-1.26-1.06-.36-1.29.08-2.19 1.31-2.71m17.98.83c.05 0 .1 0 .15.02q.825.855.96 2.04.045 1.305 0 2.61a3.76 3.76 0 0 0-2.54-1.55c-.61-.05-1.21-.08-1.82-.1.26-.31.48-.66.64-1.03 1.31.02 1.94-.62 1.87-1.95.26.02.5 0 .74-.05zM5.7 11.22c.41.4.91.65 1.48.76l16.06.05c1.42.13 2.38.87 2.88 2.19.07.24.12.49.15.74.03 2.86.03 5.71 0 8.57-.21 1.44-1 2.38-2.39 2.83-.24.05-.49.08-.74.1-1.26.02-2.53.03-3.79.02 0-1.33 0-2.66.02-3.99l1.55-1.55c1.42-.04 2.09-.78 1.99-2.19-.24-.88-.81-1.34-1.72-1.38-1.2.12-1.81.8-1.82 2.02l-1.92 1.92c-.08.11-.14.22-.2.34-.07 1.61-.1 3.22-.07 4.83h-.44c0-2.28 0-4.56-.02-6.85a1.8 1.8 0 0 0-.15-.34l-1.13-1.13c0-1.23-.61-1.92-1.82-2.07-1.29.17-1.87.91-1.72 2.22q.465 1.395 1.95 1.35l.71.71c0 .3.04.6.1.89.25.21.48.19.69-.05.03-.39.03-.79 0-1.18-.2-.25-.43-.49-.66-.71.15-.1.29-.22.39-.37.3.27.58.55.86.84.02 2.23.03 4.47.02 6.7h-.59c0-1.38 0-2.76-.02-4.14-.15-.25-.35-.31-.62-.17a1 1 0 0 0-.12.22c-.02 1.36-.03 2.73-.02 4.09h-.44c0-.99 0-1.97-.02-2.96-.02-.09-.06-.17-.1-.25-.67-.72-1.36-1.43-2.07-2.12-.06-1.48-.82-2.13-2.29-1.95-1.02.41-1.42 1.16-1.21 2.24q.51 1.32 1.95 1.26l1.55 1.55c.02.74.03 1.48.02 2.22-1.56.02-3.12 0-4.68-.07-.9-.24-1.42-.83-1.55-1.75-.02-4.48-.03-8.96-.02-13.45zm7.79 5.66c.84.06 1.19.5 1.06 1.33-.32.62-.8.79-1.45.52-.46-.37-.56-.82-.32-1.35.18-.26.42-.42.71-.49zm7.43 1.28c.89-.03 1.29.4 1.21 1.28-.33.67-.83.85-1.5.52-.54-.49-.58-1-.1-1.55.12-.11.25-.19.39-.25M9.94 19.94c.84 0 1.22.4 1.16 1.23-.28.68-.76.89-1.45.62-.63-.54-.65-1.09-.05-1.67l.34-.17zm9.75.24c.16.13.3.27.44.42-.53.52-1.05 1.05-1.55 1.6-.02 1.43-.03 2.86-.02 4.28h-.59c0-1.51 0-3.02.02-4.53a71 71 0 0 1 1.7-1.77M11.56 22c.62.53 1.21 1.11 1.75 1.72.02.92.03 1.84.02 2.76h-.59c0-.85 0-1.71-.02-2.56l-1.48-1.48s-.03-.07 0-.1c.12-.11.22-.22.32-.34",clipRule:"evenodd"})]});function ye({walletName:o,variant:e="background",className:t}){let n=i("novacore:w-full novacore:h-full novacore:rounded-full",t),a=o.toLowerCase();if(a==="impersonatedwallet")return jsxRuntime.jsx(co,{className:n});let r=so[a]??a;return jsxRuntime.jsx(l.Suspense,{fallback:jsxRuntime.jsx(d,{animate:true,className:t}),children:jsxRuntime.jsx(io,{id:r,variant:e,className:n,fallback:jsxRuntime.jsx(d,{content:"?",className:t})})})}function Ne(o=2e3){let[e,t]=l.useState(false),[n,a]=l.useState(null),r=l.useCallback(async u=>{if(u)try{await navigator.clipboard.writeText(u),t(!0),a(null),setTimeout(()=>t(!1),o);}catch(m){let f=m instanceof Error?m:new Error("Failed to copy text.");console.error(f),a(f),setTimeout(()=>a(null),o);}},[o]);return {isCopied:e,copy:r,error:n}}function De(o){let e=a=>typeof window<"u"?window.matchMedia(a).matches:false,[t,n]=l.useState(e(o));return l.useEffect(()=>{let a=window.matchMedia(o),r=()=>n(a.matches);return r(),window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[o]),t}
48
- exports.ChevronArrowWithAnim=Vo;exports.CloseIcon=B;exports.Dialog=Uo;exports.DialogClose=Jo;exports.DialogContent=G;exports.DialogDescription=Q;exports.DialogFooter=K;exports.DialogHeader=j;exports.DialogOverlay=L;exports.DialogPortal=_;exports.DialogTitle=U;exports.DialogTrigger=Qo;exports.FallbackIcon=d;exports.NetworkIcon=ne;exports.StarsBackground=ce;exports.ToastCloseButton=ve;exports.WalletIcon=ye;exports.cn=i;exports.deepMerge=z;exports.getChainName=C;exports.isSolanaDev=w;exports.isTouchDevice=D;exports.standardButtonClasses=po;exports.textCenterEllipsis=Do;exports.useCopyToClipboard=Ne;exports.useMediaQuery=De;
47
+ `})}),a.map((r,n)=>jsxRuntime.jsx("circle",{cx:r.x,cy:r.y,r:r.r,fill:"rgba(var(--tuwa-bg-primary), 0.7)",className:r.isSupernova?"supernova":"pulsar",style:{animationDelay:`${r.delay}s`,animationDuration:`${r.duration}s`}},n))]})})}function Ze({closeToast:o,ariaLabel:e="Close toast notification",title:t="Close toast notification",className:a,iconClassName:r}){return jsxRuntime.jsx("button",{type:"button",onClick:o,"aria-label":e,title:t,className:s("novacore:absolute novacore:top-2 novacore:right-2 novacore:cursor-pointer novacore:rounded-full novacore:p-1","novacore:text-[var(--tuwa-text-tertiary)] novacore:transition-colors","novacore:hover:bg-[var(--tuwa-bg-muted)] novacore:hover:text-[var(--tuwa-text-primary)]",a),children:jsxRuntime.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:s("novacore:h-5 novacore:w-5",r),children:jsxRuntime.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18 18 6M6 6l12 12"})})})}var Do=u.lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.WalletIcon}))),Ro={walletconnect:"wallet-connect"},Mo=({className:o,ref:e})=>jsxRuntime.jsxs("svg",{ref:e,className:o,fill:"none",viewBox:"0 0 32 32",xmlns:"http://www.w3.org/2000/svg",children:[jsxRuntime.jsx("path",{fill:"#fff",fillRule:"evenodd",d:"M16 0c8.84 0 16 7.16 16 16s-7.16 16-16 16S0 24.84 0 16 7.16 0 16 0",clipRule:"evenodd"}),jsxRuntime.jsx("path",{fill:"#000",fillRule:"evenodd",d:"M16.54 2.01h1.53c.5.09.99.23 1.48.42.21.25.19.48-.05.69q-.195.045-.39 0c-1.86-.65-3.55-.35-5.07.89 2.39.7 3.84 2.27 4.36 4.7.12.85.08 1.68-.12 2.51.87 0 1.74 0 2.61-.02.39-.4.7-.85.94-1.35-.45-.45-.65-.99-.59-1.63-1.15.08-1.79-.44-1.92-1.58.14-1.12.78-1.67 1.92-1.63a.7.7 0 0 0-.12-.49l-.89-.89c-.02-.45.19-.6.62-.47.24.19.46.39.66.62.71-.79 1.5-.89 2.39-.32.44.42.62.94.54 1.55 1.49.02 2.11.76 1.85 2.22-.08.17-.17.34-.27.49.53.59.87 1.28 1.01 2.07.08 4.6.1 9.19.05 13.79-.19 1.58-1 2.71-2.44 3.37-.29.1-.59.2-.89.27H7.2c-1.31-.33-2.05-1.17-2.24-2.51-.03-5.24-.03-10.47 0-15.71.3-1.62 1.28-2.46 2.93-2.54 1.26-1.77 2.98-2.64 5.17-2.61.96-1.01 2.13-1.62 3.5-1.85zm6.11 1.87c.39-.03.7.12.91.44.06.39.09.79.1 1.18.02.12.07.21.17.27.41 0 .82.04 1.23.1.49.26.63.65.42 1.16-.07.14-.18.25-.32.32-.39.06-.79.09-1.18.1-.12.02-.21.07-.27.17l-.15 1.33c-.32.46-.72.55-1.21.27a.76.76 0 0 1-.27-.37c-.06-.41-.09-.82-.1-1.23a.35.35 0 0 0-.27-.17l-1.08-.05c-.46-.24-.62-.61-.47-1.11.14-.27.36-.43.66-.47l.99-.05s.09-.04.12-.07l.15-1.28q.18-.39.57-.54m-10.49.79c2.41-.09 4.12.94 5.15 3.1.44 1.12.48 2.25.12 3.4-.84.06-1.67.07-2.51.02.56-.68.52-1.32-.1-1.92-.26-.13-.54-.19-.84-.17.02-.95 0-1.91-.07-2.86-.21-.41-.55-.58-1.01-.52-.17.03-.31.09-.44.2-.72.92-1.43 1.85-2.14 2.78-.28.45-.29.91-.05 1.38q.225.3.57.42c.34.02.69.03 1.03.02v.69c-1.3.02-2.59 0-3.89-.05-.58-2.1-.08-3.88 1.53-5.34.79-.62 1.68-1 2.66-1.16zm.83 1.82c.07 0 .13.03.17.1l.05 3.05c.04.09.1.16.17.22l.89.05c.22.08.3.24.22.47q-.27.42-.57.81c-.43.02-.85.03-1.28.02 0-.41 0-.82-.02-1.23a.46.46 0 0 0-.17-.17l-1.28-.05c-.3-.1-.37-.29-.22-.57.7-.89 1.39-1.79 2.04-2.71zm-5.81.84h.2a6.1 6.1 0 0 0-.25 3.77c-.59-.13-1.01-.49-1.26-1.06-.36-1.29.08-2.19 1.31-2.71m17.98.83c.05 0 .1 0 .15.02q.825.855.96 2.04.045 1.305 0 2.61a3.76 3.76 0 0 0-2.54-1.55c-.61-.05-1.21-.08-1.82-.1.26-.31.48-.66.64-1.03 1.31.02 1.94-.62 1.87-1.95.26.02.5 0 .74-.05zM5.7 11.22c.41.4.91.65 1.48.76l16.06.05c1.42.13 2.38.87 2.88 2.19.07.24.12.49.15.74.03 2.86.03 5.71 0 8.57-.21 1.44-1 2.38-2.39 2.83-.24.05-.49.08-.74.1-1.26.02-2.53.03-3.79.02 0-1.33 0-2.66.02-3.99l1.55-1.55c1.42-.04 2.09-.78 1.99-2.19-.24-.88-.81-1.34-1.72-1.38-1.2.12-1.81.8-1.82 2.02l-1.92 1.92c-.08.11-.14.22-.2.34-.07 1.61-.1 3.22-.07 4.83h-.44c0-2.28 0-4.56-.02-6.85a1.8 1.8 0 0 0-.15-.34l-1.13-1.13c0-1.23-.61-1.92-1.82-2.07-1.29.17-1.87.91-1.72 2.22q.465 1.395 1.95 1.35l.71.71c0 .3.04.6.1.89.25.21.48.19.69-.05.03-.39.03-.79 0-1.18-.2-.25-.43-.49-.66-.71.15-.1.29-.22.39-.37.3.27.58.55.86.84.02 2.23.03 4.47.02 6.7h-.59c0-1.38 0-2.76-.02-4.14-.15-.25-.35-.31-.62-.17a1 1 0 0 0-.12.22c-.02 1.36-.03 2.73-.02 4.09h-.44c0-.99 0-1.97-.02-2.96-.02-.09-.06-.17-.1-.25-.67-.72-1.36-1.43-2.07-2.12-.06-1.48-.82-2.13-2.29-1.95-1.02.41-1.42 1.16-1.21 2.24q.51 1.32 1.95 1.26l1.55 1.55c.02.74.03 1.48.02 2.22-1.56.02-3.12 0-4.68-.07-.9-.24-1.42-.83-1.55-1.75-.02-4.48-.03-8.96-.02-13.45zm7.79 5.66c.84.06 1.19.5 1.06 1.33-.32.62-.8.79-1.45.52-.46-.37-.56-.82-.32-1.35.18-.26.42-.42.71-.49zm7.43 1.28c.89-.03 1.29.4 1.21 1.28-.33.67-.83.85-1.5.52-.54-.49-.58-1-.1-1.55.12-.11.25-.19.39-.25M9.94 19.94c.84 0 1.22.4 1.16 1.23-.28.68-.76.89-1.45.62-.63-.54-.65-1.09-.05-1.67l.34-.17zm9.75.24c.16.13.3.27.44.42-.53.52-1.05 1.05-1.55 1.6-.02 1.43-.03 2.86-.02 4.28h-.59c0-1.51 0-3.02.02-4.53a71 71 0 0 1 1.7-1.77M11.56 22c.62.53 1.21 1.11 1.75 1.72.02.92.03 1.84.02 2.76h-.59c0-.85 0-1.71-.02-2.56l-1.48-1.48s-.03-.07 0-.1c.12-.11.22-.22.32-.34",clipRule:"evenodd"})]});function st({walletName:o,variant:e="background",className:t}){let a=s("novacore:w-full novacore:h-full novacore:rounded-full",t),r=o.toLowerCase();if(r==="impersonatedwallet")return jsxRuntime.jsx(h,{iconId:"impersonatedwallet",className:a,children:i=>jsxRuntime.jsx(Mo,{ref:i})});let n=Ro[r]??r;return jsxRuntime.jsx(u.Suspense,{fallback:jsxRuntime.jsx(v,{animate:true,className:t}),children:jsxRuntime.jsx(h,{iconId:`${n}-${e}`,className:a,children:i=>jsxRuntime.jsx(Do,{ref:i,id:n,variant:e,fallback:jsxRuntime.jsx(b,{githubSrc:`wallets/${e}/${S(n)}`,className:a})})})})}function dt(o=2e3){let[e,t]=u.useState(false),[a,r]=u.useState(null),n=u.useCallback(async i=>{if(i)try{await navigator.clipboard.writeText(i),t(!0),r(null),setTimeout(()=>t(!1),o);}catch(l){let m=l instanceof Error?l:new Error("Failed to copy text.");console.error(m),r(m),setTimeout(()=>r(null),o);}},[o]);return {isCopied:e,copy:n,error:a}}function ft(o){let e=r=>typeof window<"u"?window.matchMedia(r).matches:false,[t,a]=u.useState(e(o));return u.useEffect(()=>{let r=window.matchMedia(o),n=()=>a(r.matches);return n(),window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[o]),t}
48
+ exports.ChevronArrowWithAnim=se;exports.CloseIcon=Z;exports.Dialog=Te;exports.DialogClose=Re;exports.DialogContent=mo;exports.DialogDescription=vo;exports.DialogFooter=po;exports.DialogHeader=uo;exports.DialogOverlay=B;exports.DialogPortal=io;exports.DialogTitle=fo;exports.DialogTrigger=De;exports.FallbackIcon=v;exports.GithubFallbackIcon=b;exports.NetworkIcon=Ye;exports.StarsBackground=Qe;exports.SvgImg=k;exports.SvgToImg=h;exports.ToastCloseButton=Ze;exports.WalletIcon=st;exports.applyFirstPathFill=j;exports.cn=s;exports.deepMerge=K;exports.formatIconNameForGithub=S;exports.getChainName=E;exports.isSolanaDev=x;exports.isTouchDevice=A;exports.resolveCssVariable=X;exports.standardButtonClasses=Vo;exports.svgToBase64=N;exports.textCenterEllipsis=Ko;exports.useCopyToClipboard=dt;exports.useMediaQuery=ft;
package/dist/index.css CHANGED
@@ -12,8 +12,6 @@
12
12
  --novacore-font-weight-semibold: 600;
13
13
  --novacore-font-weight-bold: 700;
14
14
  --novacore-tracking-tight: -0.025em;
15
- --novacore-radius-md: 0.375rem;
16
- --novacore-radius-2xl: 1rem;
17
15
  --novacore-animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
18
16
  --novacore-blur-sm: 8px;
19
17
  --novacore-default-transition-duration: 150ms;
@@ -108,6 +106,9 @@
108
106
  .novacore\:justify-between {
109
107
  justify-content: space-between;
110
108
  }
109
+ .novacore\:justify-center {
110
+ justify-content: center;
111
+ }
111
112
  .novacore\:gap-1 {
112
113
  gap: calc(var(--novacore-spacing) * 1);
113
114
  }
@@ -120,15 +121,15 @@
120
121
  .novacore\:overflow-y-auto {
121
122
  overflow-y: auto;
122
123
  }
124
+ .novacore\:rounded-\[var\(--tuwa-rounded-corners\)\] {
125
+ border-radius: var(--tuwa-rounded-corners);
126
+ }
123
127
  .novacore\:rounded-full {
124
128
  border-radius: calc(infinity * 1px);
125
129
  }
126
- .novacore\:rounded-md {
127
- border-radius: var(--novacore-radius-md);
128
- }
129
- .novacore\:rounded-t-2xl {
130
- border-top-left-radius: var(--novacore-radius-2xl);
131
- border-top-right-radius: var(--novacore-radius-2xl);
130
+ .novacore\:rounded-t-\[var\(--tuwa-rounded-corners\)\] {
131
+ border-top-left-radius: var(--tuwa-rounded-corners);
132
+ border-top-right-radius: var(--tuwa-rounded-corners);
132
133
  }
133
134
  .novacore\:border {
134
135
  border-style: var(--tw-border-style);
@@ -204,10 +205,6 @@
204
205
  .novacore\:text-\[var\(--tuwa-text-tertiary\)\] {
205
206
  color: var(--tuwa-text-tertiary);
206
207
  }
207
- .novacore\:shadow-2xl {
208
- --tw-shadow: 0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));
209
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
210
- }
211
208
  .novacore\:backdrop-blur-sm {
212
209
  --tw-backdrop-blur: blur(var(--novacore-blur-sm));
213
210
  backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
@@ -302,9 +299,9 @@
302
299
  }
303
300
  }
304
301
  }
305
- .novacore\:sm\:rounded-2xl {
302
+ .novacore\:sm\:rounded-\[var\(--tuwa-rounded-corners\)\] {
306
303
  @media (width >= 40rem) {
307
- border-radius: var(--novacore-radius-2xl);
304
+ border-radius: var(--tuwa-rounded-corners);
308
305
  }
309
306
  }
310
307
  .novacore\:sm\:p-4 {
@@ -312,13 +309,6 @@
312
309
  padding: calc(var(--novacore-spacing) * 4);
313
310
  }
314
311
  }
315
- .novacore\:\[\&_path\]\:first-of-type\:fill-\[var\(--tuwa-testnet-icons\)\] {
316
- & path {
317
- &:first-of-type {
318
- fill: var(--tuwa-testnet-icons);
319
- }
320
- }
321
- }
322
312
  }
323
313
  :root {
324
314
  --tuwa-success-bg: oklch(96.2% 0.044 156.743);
@@ -349,7 +339,9 @@
349
339
  --tuwa-button-gradient-to-hover: oklch(49.6% 0.265 301.924);
350
340
  --tuwa-standart-button-bg: oklch(96.7% 0.003 264.542);
351
341
  --tuwa-standart-button-hover: oklch(92.8% 0.006 264.531);
352
- --tuwa-testnet-icons: #C4BFB8;
342
+ --tuwa-testnet-icons: #c4bfb8;
343
+ --tuwa-rounded-corners: 4px;
344
+ --tuwa-ring-width: 2px;
353
345
  }
354
346
  .dark {
355
347
  --tuwa-success-bg: oklch(39.3% 0.095 152.535);
@@ -380,7 +372,7 @@
380
372
  --tuwa-button-gradient-to-hover: oklch(55.8% 0.288 302.321);
381
373
  --tuwa-standart-button-bg: oklch(37.3% 0.034 259.733);
382
374
  --tuwa-standart-button-hover: oklch(27.8% 0.033 256.848);
383
- --tuwa-testnet-icons: #C4BFB8;
375
+ --tuwa-testnet-icons: #c4bfb8;
384
376
  }
385
377
  .Toastify {
386
378
  pointer-events: auto;
@@ -410,7 +402,8 @@
410
402
  background-color: var(--tuwa-text-primary);
411
403
  }
412
404
  @keyframes scrolling {
413
- 0%,to {
405
+ 0%,
406
+ to {
414
407
  padding-right: 2px;
415
408
  }
416
409
  }
@@ -447,71 +440,6 @@
447
440
  syntax: "*";
448
441
  inherits: false;
449
442
  }
450
- @property --tw-shadow {
451
- syntax: "*";
452
- inherits: false;
453
- initial-value: 0 0 #0000;
454
- }
455
- @property --tw-shadow-color {
456
- syntax: "*";
457
- inherits: false;
458
- }
459
- @property --tw-shadow-alpha {
460
- syntax: "<percentage>";
461
- inherits: false;
462
- initial-value: 100%;
463
- }
464
- @property --tw-inset-shadow {
465
- syntax: "*";
466
- inherits: false;
467
- initial-value: 0 0 #0000;
468
- }
469
- @property --tw-inset-shadow-color {
470
- syntax: "*";
471
- inherits: false;
472
- }
473
- @property --tw-inset-shadow-alpha {
474
- syntax: "<percentage>";
475
- inherits: false;
476
- initial-value: 100%;
477
- }
478
- @property --tw-ring-color {
479
- syntax: "*";
480
- inherits: false;
481
- }
482
- @property --tw-ring-shadow {
483
- syntax: "*";
484
- inherits: false;
485
- initial-value: 0 0 #0000;
486
- }
487
- @property --tw-inset-ring-color {
488
- syntax: "*";
489
- inherits: false;
490
- }
491
- @property --tw-inset-ring-shadow {
492
- syntax: "*";
493
- inherits: false;
494
- initial-value: 0 0 #0000;
495
- }
496
- @property --tw-ring-inset {
497
- syntax: "*";
498
- inherits: false;
499
- }
500
- @property --tw-ring-offset-width {
501
- syntax: "<length>";
502
- inherits: false;
503
- initial-value: 0px;
504
- }
505
- @property --tw-ring-offset-color {
506
- syntax: "*";
507
- inherits: false;
508
- initial-value: #fff;
509
- }
510
- @property --tw-ring-offset-shadow {
511
- syntax: "*";
512
- inherits: false;
513
- initial-value: 0 0 #0000;
514
- }
515
443
  @property --tw-backdrop-blur {
516
444
  syntax: "*";
517
445
  inherits: false;
@@ -580,20 +508,6 @@
580
508
  --tw-leading: initial;
581
509
  --tw-font-weight: initial;
582
510
  --tw-tracking: initial;
583
- --tw-shadow: 0 0 #0000;
584
- --tw-shadow-color: initial;
585
- --tw-shadow-alpha: 100%;
586
- --tw-inset-shadow: 0 0 #0000;
587
- --tw-inset-shadow-color: initial;
588
- --tw-inset-shadow-alpha: 100%;
589
- --tw-ring-color: initial;
590
- --tw-ring-shadow: 0 0 #0000;
591
- --tw-inset-ring-color: initial;
592
- --tw-inset-ring-shadow: 0 0 #0000;
593
- --tw-ring-inset: initial;
594
- --tw-ring-offset-width: 0px;
595
- --tw-ring-offset-color: #fff;
596
- --tw-ring-offset-shadow: 0 0 #0000;
597
511
  --tw-backdrop-blur: initial;
598
512
  --tw-backdrop-brightness: initial;
599
513
  --tw-backdrop-contrast: initial;
@@ -609,4 +523,4 @@
609
523
  --tw-space-x-reverse: 0;
610
524
  }
611
525
  }
612
- }
526
+ }
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React$1 from 'react';
3
+ import { ComponentProps, ReactNode } from 'react';
3
4
  import * as DialogPrimitive from '@radix-ui/react-dialog';
4
5
  import { Variants } from 'framer-motion';
5
6
  import { ClassValue } from 'clsx';
@@ -43,6 +44,32 @@ interface FallbackIconProps {
43
44
  */
44
45
  declare const FallbackIcon: ({ animate, content, className }: FallbackIconProps) => react_jsx_runtime.JSX.Element;
45
46
 
47
+ /**
48
+ * Props for the GithubFallbackIcon component.
49
+ */
50
+ interface GithubFallbackIconProps extends Omit<ComponentProps<'img'>, 'src'> {
51
+ /**
52
+ * Path to the SVG file within the web3icons repository.
53
+ * @example "networks/background/ethereum.svg"
54
+ */
55
+ githubSrc: string;
56
+ /**
57
+ * Optional fill color to apply to the first `<path>` element.
58
+ * Used for testnet/devnet visual differentiation.
59
+ */
60
+ firstPathFill?: string;
61
+ }
62
+ /**
63
+ * Fetches and displays an SVG icon from the web3icons GitHub repository.
64
+ *
65
+ * Used as a fallback when the bundled `@web3icons/react` library
66
+ * doesn't have a specific icon available.
67
+ *
68
+ * @param props - {@link GithubFallbackIconProps}
69
+ * @returns Loading indicator, the fetched icon, or an error fallback
70
+ */
71
+ declare function GithubFallbackIcon({ githubSrc, className, alt, firstPathFill, ...props }: GithubFallbackIconProps): react_jsx_runtime.JSX.Element;
72
+
46
73
  declare const Dialog: React$1.FC<DialogPrimitive.DialogProps>;
47
74
  declare const DialogTrigger: React$1.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
48
75
  declare const DialogPortal: React$1.FC<DialogPrimitive.DialogPortalProps>;
@@ -69,40 +96,71 @@ declare const DialogFooter: {
69
96
  declare const DialogTitle: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
70
97
  declare const DialogDescription: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
71
98
 
99
+ interface NetworkIconProps {
100
+ chainId: number | string;
101
+ variant?: 'background' | 'branded' | 'mono';
102
+ className?: string;
103
+ }
104
+ declare function NetworkIcon({ chainId, variant, className }: NetworkIconProps): react_jsx_runtime.JSX.Element;
105
+
106
+ declare function StarsBackground({ starsCount }: {
107
+ starsCount?: number;
108
+ }): react_jsx_runtime.JSX.Element;
109
+
72
110
  /**
73
- * Props for the NetworkIcon component.
111
+ * Props for the SvgImg component.
74
112
  */
75
- interface NetworkIconProps {
113
+ interface SvgImgProps extends Omit<ComponentProps<'img'>, 'src' | 'draggable'> {
114
+ /** Base64-encoded SVG data URL */
115
+ src: string;
116
+ }
117
+ /**
118
+ * Renders an SVG as an isolated `<img>` element.
119
+ *
120
+ * Prevents SVG ID conflicts and disables drag/selection behavior.
121
+ *
122
+ * @param props - {@link SvgImgProps}
123
+ */
124
+ declare function SvgImg({ src, alt, ...props }: SvgImgProps): react_jsx_runtime.JSX.Element;
125
+
126
+ /**
127
+ * Props for the SvgToImg component.
128
+ */
129
+ interface SvgToImgProps extends Omit<ComponentProps<'img'>, 'ref' | 'src' | 'children'> {
130
+ /** Child SVG element to render while converting */
131
+ children: (ref: (node: SVGSVGElement | null) => void) => ReactNode;
76
132
  /**
77
- * Chain identifier.
78
- * - `number`: For EVM networks (e.g., 1, 137).
79
- * - `string`: For non-EVM networks (e.g., "solana:mainnet", "solana:devnet").
133
+ * Unique identifier for the icon. When this changes, the cached image is reset.
134
+ * Prevents showing stale icons when content changes dynamically.
80
135
  */
81
- chainId: number | string;
136
+ iconId: string | number;
82
137
  /**
83
- * Visual style variant for the icon.
84
- * @default 'background'
138
+ * Optional fill color to apply to the first `<path>` element.
139
+ * Used for testnet/devnet visual differentiation.
140
+ * @example "var(--tuwa-testnet-icons)"
85
141
  */
86
- variant?: 'background' | 'branded' | 'mono';
87
- /** Additional CSS class names. */
88
- className?: string;
142
+ firstPathFill?: string;
89
143
  }
90
144
  /**
91
- * Renders a network icon based on the chain ID.
145
+ * Converts an SVG element to an `<img>` tag with a base64-encoded data URL.
92
146
  *
93
- * It handles logic for:
94
- * 1. Lazy loading the heavy icon library.
95
- * 2. Normalizing string IDs (e.g., converts "solana:devnet" -> "solana").
96
- * 3. Applying specific styling for Testnets/Devnets (e.g., muted colors for Solana Devnet).
147
+ * This component solves the problem of duplicate SVG `id` attributes
148
+ * when rendering multiple identical icons on the same page.
149
+ *
150
+ * Uses a render prop pattern to inject a callback ref that captures
151
+ * the SVG immediately when it mounts.
97
152
  *
98
- * @param props - {@link NetworkIconProps}
99
- * @returns The network icon or a fallback UI.
153
+ * @param props - {@link SvgToImgProps}
154
+ * @returns The converted image or the original children while loading
155
+ *
156
+ * @example
157
+ * ```tsx
158
+ * <SvgToImg iconId={chainId} firstPathFill={TESTNET_FILL}>
159
+ * {(ref) => <NetworkIconLazy ref={ref} chainId={chainId} />}
160
+ * </SvgToImg>
161
+ * ```
100
162
  */
101
- declare function NetworkIcon({ chainId, variant, className }: NetworkIconProps): react_jsx_runtime.JSX.Element;
102
-
103
- declare function StarsBackground({ starsCount }: {
104
- starsCount?: number;
105
- }): react_jsx_runtime.JSX.Element;
163
+ declare function SvgToImg({ children, iconId, alt, firstPathFill, ...props }: SvgToImgProps): react_jsx_runtime.JSX.Element;
106
164
 
107
165
  /**
108
166
  * @file This file contains a reusable close button component, designed primarily for toast notifications.
@@ -209,7 +267,7 @@ declare function useCopyToClipboard(timeout?: number): {
209
267
  */
210
268
  declare function useMediaQuery(query: string): boolean;
211
269
 
212
- declare const standardButtonClasses = "novacore:cursor-pointer novacore:rounded-md novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";
270
+ declare const standardButtonClasses = "novacore:cursor-pointer novacore:rounded-[var(--tuwa-rounded-corners)] novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";
213
271
 
214
272
  /**
215
273
  * @file This file contains a utility function for conditionally merging Tailwind CSS classes.
@@ -255,19 +313,47 @@ declare function cn(...inputs: ClassValue[]): string;
255
313
  declare function deepMerge<T extends object>(target: T, source: Partial<T>): T;
256
314
 
257
315
  /**
258
- * Retrieves the human-readable name of a blockchain network based on its Chain ID.
316
+ * Result of chain name resolution.
317
+ */
318
+ interface ChainInfo {
319
+ /** Human-readable network name (e.g., "Ethereum", "Solana Devnet") */
320
+ name: string;
321
+ /** Normalized network identifier for icon libraries (e.g., "ethereum", "solana") */
322
+ id: string;
323
+ /** Original chain ID as provided */
324
+ chainId: number | string;
325
+ /** File path for icon resolution */
326
+ filePath: string;
327
+ }
328
+ /**
329
+ * Retrieves blockchain network information based on its chain ID.
259
330
  *
260
- * Supports both:
261
- * - Numeric IDs (EVM): e.g., `1` -> "Ethereum"
262
- * - String IDs (Non-EVM): e.g., `"solana:devnet"` -> "Solana Devnet"
331
+ * Supports both EVM and non-EVM chain identifiers:
332
+ * - **Numeric IDs (EVM):** e.g., `1` "Ethereum", `137` → "Polygon"
333
+ * - **String IDs (Non-EVM):** e.g., `"solana:devnet"` "Solana Devnet"
334
+ *
335
+ * For string IDs with environment suffixes (like "solana:devnet"),
336
+ * the suffix is appended to the name if it's a known dev/test environment.
337
+ *
338
+ * @param chainId - Chain identifier (number for EVM, string for non-EVM)
339
+ * @returns Chain information object with name, id, and original chainId
340
+ *
341
+ * @example
342
+ * ```ts
343
+ * // EVM network
344
+ * getChainName(1)
345
+ * // → { name: "Ethereum", id: "ethereum", chainId: 1 }
263
346
  *
264
- * For formatted string IDs (like "solana:devnet"), it capitalizes the suffix
265
- * if the network is identified as a development environment.
347
+ * // Solana devnet
348
+ * getChainName("solana:devnet")
349
+ * // → { name: "Solana Devnet", id: "solana", chainId: "solana:devnet" }
266
350
  *
267
- * @param chainId - The unique identifier of the chain (number for EVM, string for others).
268
- * @returns The formatted network name or 'Unknown'.
351
+ * // Unknown network
352
+ * getChainName(999999)
353
+ * // → { name: "Unknown", id: "unknown", chainId: 999999 }
354
+ * ```
269
355
  */
270
- declare function getChainName(chainId: number | string): string;
356
+ declare function getChainName(chainId: number | string): ChainInfo;
271
357
 
272
358
  /**
273
359
  * Determines if the current chain is a Solana development or test network.
@@ -299,6 +385,55 @@ declare function isSolanaDev(chainId: number | string): boolean;
299
385
  */
300
386
  declare function isTouchDevice(maxWidth?: number): boolean;
301
387
 
388
+ /**
389
+ * Resolves a CSS variable to its computed value.
390
+ * Returns the original value if it's not a CSS variable.
391
+ *
392
+ * @param value - Color value, potentially a CSS variable like `var(--my-color)`
393
+ * @returns Resolved color value (e.g., `#ff0000`) or original if not a variable
394
+ */
395
+ declare function resolveCssVariable(value: string): string;
396
+ /**
397
+ * Modifies the fill attribute of the first `<path>` element in an SVG string.
398
+ * Uses DOMParser for safe XML manipulation.
399
+ * Automatically resolves CSS variables (e.g., `var(--color)`) to their computed values.
400
+ *
401
+ * @param svgString - The original SVG markup
402
+ * @param fillColor - The color to apply (supports CSS variables)
403
+ * @returns Modified SVG string
404
+ */
405
+ declare function applyFirstPathFill(svgString: string, fillColor: string): string;
406
+ /**
407
+ * Encodes an SVG string to a base64 data URL.
408
+ *
409
+ * @param svgString - The SVG markup
410
+ * @param firstPathFill - Optional fill color to apply to the first path
411
+ * @returns Base64-encoded data URL
412
+ */
413
+ declare function svgToBase64(svgString: string, firstPathFill?: string): string;
414
+ /**
415
+ * Formats a name string into a GitHub-compatible SVG filename.
416
+ *
417
+ * Converts spaces to hyphens and lowercases the string,
418
+ * then appends the `.svg` extension.
419
+ *
420
+ * @param name - The name to format (e.g., "Wallet Connect", "MetaMask")
421
+ * @returns Formatted filename (e.g., "wallet-connect.svg", "metamask.svg")
422
+ *
423
+ * @example
424
+ * ```ts
425
+ * formatIconNameForGithub("Wallet Connect")
426
+ * // → "wallet-connect.svg"
427
+ *
428
+ * formatIconNameForGithub("MetaMask")
429
+ * // → "metamask.svg"
430
+ *
431
+ * formatIconNameForGithub("coinbase")
432
+ * // → "coinbase.svg"
433
+ * ```
434
+ */
435
+ declare const formatIconNameForGithub: (name: string) => string;
436
+
302
437
  /**
303
438
  * @file This file contains a utility function for truncating a string with a center ellipsis.
304
439
  */
@@ -319,4 +454,4 @@ declare function isTouchDevice(maxWidth?: number): boolean;
319
454
  */
320
455
  declare function textCenterEllipsis(str: string | undefined | null, from: number, to: number): string;
321
456
 
322
- export { ChevronArrowWithAnim, CloseIcon, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, FallbackIcon, type FallbackIconProps, NetworkIcon, StarsBackground, ToastCloseButton, type ToastCloseButtonProps, WalletIcon, cn, deepMerge, getChainName, isSolanaDev, isTouchDevice, standardButtonClasses, textCenterEllipsis, useCopyToClipboard, useMediaQuery };
457
+ export { type ChainInfo, ChevronArrowWithAnim, CloseIcon, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, FallbackIcon, type FallbackIconProps, GithubFallbackIcon, NetworkIcon, StarsBackground, SvgImg, type SvgImgProps, SvgToImg, ToastCloseButton, type ToastCloseButtonProps, WalletIcon, applyFirstPathFill, cn, deepMerge, formatIconNameForGithub, getChainName, isSolanaDev, isTouchDevice, resolveCssVariable, standardButtonClasses, svgToBase64, textCenterEllipsis, useCopyToClipboard, useMediaQuery };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React$1 from 'react';
3
+ import { ComponentProps, ReactNode } from 'react';
3
4
  import * as DialogPrimitive from '@radix-ui/react-dialog';
4
5
  import { Variants } from 'framer-motion';
5
6
  import { ClassValue } from 'clsx';
@@ -43,6 +44,32 @@ interface FallbackIconProps {
43
44
  */
44
45
  declare const FallbackIcon: ({ animate, content, className }: FallbackIconProps) => react_jsx_runtime.JSX.Element;
45
46
 
47
+ /**
48
+ * Props for the GithubFallbackIcon component.
49
+ */
50
+ interface GithubFallbackIconProps extends Omit<ComponentProps<'img'>, 'src'> {
51
+ /**
52
+ * Path to the SVG file within the web3icons repository.
53
+ * @example "networks/background/ethereum.svg"
54
+ */
55
+ githubSrc: string;
56
+ /**
57
+ * Optional fill color to apply to the first `<path>` element.
58
+ * Used for testnet/devnet visual differentiation.
59
+ */
60
+ firstPathFill?: string;
61
+ }
62
+ /**
63
+ * Fetches and displays an SVG icon from the web3icons GitHub repository.
64
+ *
65
+ * Used as a fallback when the bundled `@web3icons/react` library
66
+ * doesn't have a specific icon available.
67
+ *
68
+ * @param props - {@link GithubFallbackIconProps}
69
+ * @returns Loading indicator, the fetched icon, or an error fallback
70
+ */
71
+ declare function GithubFallbackIcon({ githubSrc, className, alt, firstPathFill, ...props }: GithubFallbackIconProps): react_jsx_runtime.JSX.Element;
72
+
46
73
  declare const Dialog: React$1.FC<DialogPrimitive.DialogProps>;
47
74
  declare const DialogTrigger: React$1.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
48
75
  declare const DialogPortal: React$1.FC<DialogPrimitive.DialogPortalProps>;
@@ -69,40 +96,71 @@ declare const DialogFooter: {
69
96
  declare const DialogTitle: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
70
97
  declare const DialogDescription: React$1.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
71
98
 
99
+ interface NetworkIconProps {
100
+ chainId: number | string;
101
+ variant?: 'background' | 'branded' | 'mono';
102
+ className?: string;
103
+ }
104
+ declare function NetworkIcon({ chainId, variant, className }: NetworkIconProps): react_jsx_runtime.JSX.Element;
105
+
106
+ declare function StarsBackground({ starsCount }: {
107
+ starsCount?: number;
108
+ }): react_jsx_runtime.JSX.Element;
109
+
72
110
  /**
73
- * Props for the NetworkIcon component.
111
+ * Props for the SvgImg component.
74
112
  */
75
- interface NetworkIconProps {
113
+ interface SvgImgProps extends Omit<ComponentProps<'img'>, 'src' | 'draggable'> {
114
+ /** Base64-encoded SVG data URL */
115
+ src: string;
116
+ }
117
+ /**
118
+ * Renders an SVG as an isolated `<img>` element.
119
+ *
120
+ * Prevents SVG ID conflicts and disables drag/selection behavior.
121
+ *
122
+ * @param props - {@link SvgImgProps}
123
+ */
124
+ declare function SvgImg({ src, alt, ...props }: SvgImgProps): react_jsx_runtime.JSX.Element;
125
+
126
+ /**
127
+ * Props for the SvgToImg component.
128
+ */
129
+ interface SvgToImgProps extends Omit<ComponentProps<'img'>, 'ref' | 'src' | 'children'> {
130
+ /** Child SVG element to render while converting */
131
+ children: (ref: (node: SVGSVGElement | null) => void) => ReactNode;
76
132
  /**
77
- * Chain identifier.
78
- * - `number`: For EVM networks (e.g., 1, 137).
79
- * - `string`: For non-EVM networks (e.g., "solana:mainnet", "solana:devnet").
133
+ * Unique identifier for the icon. When this changes, the cached image is reset.
134
+ * Prevents showing stale icons when content changes dynamically.
80
135
  */
81
- chainId: number | string;
136
+ iconId: string | number;
82
137
  /**
83
- * Visual style variant for the icon.
84
- * @default 'background'
138
+ * Optional fill color to apply to the first `<path>` element.
139
+ * Used for testnet/devnet visual differentiation.
140
+ * @example "var(--tuwa-testnet-icons)"
85
141
  */
86
- variant?: 'background' | 'branded' | 'mono';
87
- /** Additional CSS class names. */
88
- className?: string;
142
+ firstPathFill?: string;
89
143
  }
90
144
  /**
91
- * Renders a network icon based on the chain ID.
145
+ * Converts an SVG element to an `<img>` tag with a base64-encoded data URL.
92
146
  *
93
- * It handles logic for:
94
- * 1. Lazy loading the heavy icon library.
95
- * 2. Normalizing string IDs (e.g., converts "solana:devnet" -> "solana").
96
- * 3. Applying specific styling for Testnets/Devnets (e.g., muted colors for Solana Devnet).
147
+ * This component solves the problem of duplicate SVG `id` attributes
148
+ * when rendering multiple identical icons on the same page.
149
+ *
150
+ * Uses a render prop pattern to inject a callback ref that captures
151
+ * the SVG immediately when it mounts.
97
152
  *
98
- * @param props - {@link NetworkIconProps}
99
- * @returns The network icon or a fallback UI.
153
+ * @param props - {@link SvgToImgProps}
154
+ * @returns The converted image or the original children while loading
155
+ *
156
+ * @example
157
+ * ```tsx
158
+ * <SvgToImg iconId={chainId} firstPathFill={TESTNET_FILL}>
159
+ * {(ref) => <NetworkIconLazy ref={ref} chainId={chainId} />}
160
+ * </SvgToImg>
161
+ * ```
100
162
  */
101
- declare function NetworkIcon({ chainId, variant, className }: NetworkIconProps): react_jsx_runtime.JSX.Element;
102
-
103
- declare function StarsBackground({ starsCount }: {
104
- starsCount?: number;
105
- }): react_jsx_runtime.JSX.Element;
163
+ declare function SvgToImg({ children, iconId, alt, firstPathFill, ...props }: SvgToImgProps): react_jsx_runtime.JSX.Element;
106
164
 
107
165
  /**
108
166
  * @file This file contains a reusable close button component, designed primarily for toast notifications.
@@ -209,7 +267,7 @@ declare function useCopyToClipboard(timeout?: number): {
209
267
  */
210
268
  declare function useMediaQuery(query: string): boolean;
211
269
 
212
- declare const standardButtonClasses = "novacore:cursor-pointer novacore:rounded-md novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";
270
+ declare const standardButtonClasses = "novacore:cursor-pointer novacore:rounded-[var(--tuwa-rounded-corners)] novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";
213
271
 
214
272
  /**
215
273
  * @file This file contains a utility function for conditionally merging Tailwind CSS classes.
@@ -255,19 +313,47 @@ declare function cn(...inputs: ClassValue[]): string;
255
313
  declare function deepMerge<T extends object>(target: T, source: Partial<T>): T;
256
314
 
257
315
  /**
258
- * Retrieves the human-readable name of a blockchain network based on its Chain ID.
316
+ * Result of chain name resolution.
317
+ */
318
+ interface ChainInfo {
319
+ /** Human-readable network name (e.g., "Ethereum", "Solana Devnet") */
320
+ name: string;
321
+ /** Normalized network identifier for icon libraries (e.g., "ethereum", "solana") */
322
+ id: string;
323
+ /** Original chain ID as provided */
324
+ chainId: number | string;
325
+ /** File path for icon resolution */
326
+ filePath: string;
327
+ }
328
+ /**
329
+ * Retrieves blockchain network information based on its chain ID.
259
330
  *
260
- * Supports both:
261
- * - Numeric IDs (EVM): e.g., `1` -> "Ethereum"
262
- * - String IDs (Non-EVM): e.g., `"solana:devnet"` -> "Solana Devnet"
331
+ * Supports both EVM and non-EVM chain identifiers:
332
+ * - **Numeric IDs (EVM):** e.g., `1` "Ethereum", `137` → "Polygon"
333
+ * - **String IDs (Non-EVM):** e.g., `"solana:devnet"` "Solana Devnet"
334
+ *
335
+ * For string IDs with environment suffixes (like "solana:devnet"),
336
+ * the suffix is appended to the name if it's a known dev/test environment.
337
+ *
338
+ * @param chainId - Chain identifier (number for EVM, string for non-EVM)
339
+ * @returns Chain information object with name, id, and original chainId
340
+ *
341
+ * @example
342
+ * ```ts
343
+ * // EVM network
344
+ * getChainName(1)
345
+ * // → { name: "Ethereum", id: "ethereum", chainId: 1 }
263
346
  *
264
- * For formatted string IDs (like "solana:devnet"), it capitalizes the suffix
265
- * if the network is identified as a development environment.
347
+ * // Solana devnet
348
+ * getChainName("solana:devnet")
349
+ * // → { name: "Solana Devnet", id: "solana", chainId: "solana:devnet" }
266
350
  *
267
- * @param chainId - The unique identifier of the chain (number for EVM, string for others).
268
- * @returns The formatted network name or 'Unknown'.
351
+ * // Unknown network
352
+ * getChainName(999999)
353
+ * // → { name: "Unknown", id: "unknown", chainId: 999999 }
354
+ * ```
269
355
  */
270
- declare function getChainName(chainId: number | string): string;
356
+ declare function getChainName(chainId: number | string): ChainInfo;
271
357
 
272
358
  /**
273
359
  * Determines if the current chain is a Solana development or test network.
@@ -299,6 +385,55 @@ declare function isSolanaDev(chainId: number | string): boolean;
299
385
  */
300
386
  declare function isTouchDevice(maxWidth?: number): boolean;
301
387
 
388
+ /**
389
+ * Resolves a CSS variable to its computed value.
390
+ * Returns the original value if it's not a CSS variable.
391
+ *
392
+ * @param value - Color value, potentially a CSS variable like `var(--my-color)`
393
+ * @returns Resolved color value (e.g., `#ff0000`) or original if not a variable
394
+ */
395
+ declare function resolveCssVariable(value: string): string;
396
+ /**
397
+ * Modifies the fill attribute of the first `<path>` element in an SVG string.
398
+ * Uses DOMParser for safe XML manipulation.
399
+ * Automatically resolves CSS variables (e.g., `var(--color)`) to their computed values.
400
+ *
401
+ * @param svgString - The original SVG markup
402
+ * @param fillColor - The color to apply (supports CSS variables)
403
+ * @returns Modified SVG string
404
+ */
405
+ declare function applyFirstPathFill(svgString: string, fillColor: string): string;
406
+ /**
407
+ * Encodes an SVG string to a base64 data URL.
408
+ *
409
+ * @param svgString - The SVG markup
410
+ * @param firstPathFill - Optional fill color to apply to the first path
411
+ * @returns Base64-encoded data URL
412
+ */
413
+ declare function svgToBase64(svgString: string, firstPathFill?: string): string;
414
+ /**
415
+ * Formats a name string into a GitHub-compatible SVG filename.
416
+ *
417
+ * Converts spaces to hyphens and lowercases the string,
418
+ * then appends the `.svg` extension.
419
+ *
420
+ * @param name - The name to format (e.g., "Wallet Connect", "MetaMask")
421
+ * @returns Formatted filename (e.g., "wallet-connect.svg", "metamask.svg")
422
+ *
423
+ * @example
424
+ * ```ts
425
+ * formatIconNameForGithub("Wallet Connect")
426
+ * // → "wallet-connect.svg"
427
+ *
428
+ * formatIconNameForGithub("MetaMask")
429
+ * // → "metamask.svg"
430
+ *
431
+ * formatIconNameForGithub("coinbase")
432
+ * // → "coinbase.svg"
433
+ * ```
434
+ */
435
+ declare const formatIconNameForGithub: (name: string) => string;
436
+
302
437
  /**
303
438
  * @file This file contains a utility function for truncating a string with a center ellipsis.
304
439
  */
@@ -319,4 +454,4 @@ declare function isTouchDevice(maxWidth?: number): boolean;
319
454
  */
320
455
  declare function textCenterEllipsis(str: string | undefined | null, from: number, to: number): string;
321
456
 
322
- export { ChevronArrowWithAnim, CloseIcon, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, FallbackIcon, type FallbackIconProps, NetworkIcon, StarsBackground, ToastCloseButton, type ToastCloseButtonProps, WalletIcon, cn, deepMerge, getChainName, isSolanaDev, isTouchDevice, standardButtonClasses, textCenterEllipsis, useCopyToClipboard, useMediaQuery };
457
+ export { type ChainInfo, ChevronArrowWithAnim, CloseIcon, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, FallbackIcon, type FallbackIconProps, GithubFallbackIcon, NetworkIcon, StarsBackground, SvgImg, type SvgImgProps, SvgToImg, ToastCloseButton, type ToastCloseButtonProps, WalletIcon, applyFirstPathFill, cn, deepMerge, formatIconNameForGithub, getChainName, isSolanaDev, isTouchDevice, resolveCssVariable, standardButtonClasses, svgToBase64, textCenterEllipsis, useCopyToClipboard, useMediaQuery };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import {motion,AnimatePresence}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {networks}from'@web3icons/common/metadata';import {jsxs,jsx}from'react/jsx-runtime';import*as l from'react';import {lazy,Suspense,useState,useEffect,useMemo,useCallback}from'react';import*as s from'@radix-ui/react-dialog';var po="novacore:cursor-pointer novacore:rounded-md novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";function i(...o){return twMerge(clsx(o))}var g=o=>o&&typeof o=="object"&&!Array.isArray(o);function z(o,e){let t={...o};return g(o)&&g(e)&&Object.keys(e).forEach(n=>{let a=o[n],r=e[n];g(a)&&g(r)?t[n]=z(a,r):t[n]=r;}),t}function w(o){if(typeof o!="string")return false;let e=o.toLowerCase();return e.includes("solana")&&(e.includes("devnet")||e.includes("testnet"))}var k="Unknown";function C(o){if(typeof o=="number")return networks.find(a=>a.chainId===o)?.name??k;let[e,t]=o.split(":"),n=networks.find(a=>a.id===e);if(!n)return k;if(t&&w(o)){let a=t.charAt(0).toUpperCase()+t.slice(1).toLowerCase();return `${n.name} ${a}`}return n.name}function D(o=1200){if(typeof window>"u")return false;let e="ontouchstart"in window,t=navigator.maxTouchPoints>0,n=false;window.matchMedia&&(n=window.matchMedia("(pointer: coarse)").matches);let a=e||t||n,r=window.innerWidth<=o;return a&&r}function Do(o,e,t){if(!o)return "";if(o.length<=e+t)return o;let n=o.slice(0,e),a=o.slice(o.length-t);return `${n}...${a}`}function Vo({className:o,strokeWidth:e,isOpen:t}){return jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:e??2,stroke:"currentColor",className:i("novacore:w-4 novacore:h-4 novacore:text-[var(--tuwa-text-secondary)]",o),children:[jsx(AnimatePresence,{children:t&&jsx(motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5",variants:{hidden:{translateY:3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})}),jsx(AnimatePresence,{children:!t&&jsx(motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5",className:"novacore:relative",variants:{hidden:{translateY:-3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})})]})}var B=l.forwardRef(({className:o,...e},t)=>jsxs("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:i("novacore:h-5 novacore:w-5 novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors",o),...e,children:[jsx("path",{d:"M18 6 6 18"}),jsx("path",{d:"m6 6 12 12"})]}));B.displayName="CloseIcon";var O="flex items-center justify-center novacore:w-full novacore:h-full novacore:rounded-full novacore:text-[var(--tuwa-text-secondary)] novacore:bg-[var(--tuwa-bg-muted)]",d=({animate:o=false,content:e="",className:t})=>jsx("div",{className:i(O,"Nova_Web3_Icon",t,{"novacore:animate-pulse":o}),children:e});var Uo=s.Root,Qo=s.Trigger,_=s.Portal,Jo=s.Close,Y={initial:{opacity:0,scale:.9,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.9,transition:{duration:.2}}},$={initial:{opacity:0,y:"100%"},animate:{opacity:1,y:"0%"},exit:{opacity:0,y:"100%",transition:{duration:.2}}},q={initial:{opacity:0},animate:{opacity:1},exit:{opacity:0}},L=({className:o,backdropAnimation:e})=>(l.useEffect(()=>(typeof window<"u"&&window.document.body.classList.add("NovaModalOpen"),()=>{typeof window<"u"&&window.document.body.classList.remove("NovaModalOpen");}),[]),jsx(AnimatePresence,{children:jsx(motion.div,{variants:e??q,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"novacore:relative novacore:overflow-hidden",children:jsx("div",{className:i("novacore:fixed novacore:inset-0 novacore:z-50 novacore:bg-black/55 novacore:backdrop-blur-sm novacore:backdrop-saturate-150",o)})})}));L.displayName=s.Overlay.displayName;var G=l.forwardRef(({className:o,children:e,modalAnimation:t,backdropAnimation:n,...a},r)=>{let[u,m]=l.useState(false);l.useEffect(()=>{m(D());},[]);let f=t??(u?$:Y);return jsxs(_,{children:[jsx(L,{backdropAnimation:n}),jsx(s.Content,{"aria-describedby":"tuwa:modal-content",ref:r,className:i("NovaNoScrolling novacore:fixed novacore:bottom-0 novacore:left-0 novacore:p-0 novacore:sm:bottom-auto novacore:sm:left-[50%] novacore:sm:top-[50%] novacore:sm:translate-x-[-50%] novacore:sm:translate-y-[-50%] novacore:z-50 novacore:sm:p-4 novacore:outline-none",o),...a,children:jsx(motion.div,{layout:true,className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",transition:{layout:{duration:.2,ease:[.1,.1,.2,1]}},children:jsx(AnimatePresence,{children:jsx(motion.div,{variants:f,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",children:jsx("div",{className:i("NovaNoScrolling NovaDialogContent__elements novacore:relative novacore:flex novacore:max-h-[98dvh] novacore:w-full novacore:flex-col novacore:gap-3 novacore:overflow-y-auto novacore:rounded-t-2xl novacore:sm:rounded-2xl novacore:shadow-2xl","novacore:border novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)]"),children:e})})})})})]})});G.displayName=s.Content.displayName;var j=({className:o,...e})=>jsx("div",{"aria-describedby":"tuwa:modal-header",className:i("novacore:sticky novacore:flex novacore:top-0 novacore:z-11 novacore:w-full novacore:flex-row novacore:items-center novacore:justify-between","novacore:border-b novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)] novacore:p-4",o),...e});j.displayName="DialogHeader";var K=({className:o,...e})=>jsx("div",{"aria-describedby":"tuwa:modal-footer",className:i("novacore:flex novacore:flex-col-reverse novacore:sm:flex-row novacore:sm:justify-end novacore:sm:space-x-2",o),...e});K.displayName="DialogFooter";var U=l.forwardRef(({className:o,...e},t)=>jsx(s.Title,{ref:t,"aria-describedby":"tuwa:modal-title",className:i("novacore:text-lg novacore:font-bold novacore:leading-none novacore:tracking-tight novacore:text-[var(--tuwa-text-primary)] novacore:m-0",o),...e}));U.displayName=s.Title.displayName;var Q=l.forwardRef(({className:o,...e},t)=>jsx(s.Description,{"aria-describedby":"tuwa:modal-description",ref:t,className:i("novacore:text-sm novacore:text-[var(--tuwa-text-secondary)]",o),...e}));Q.displayName=s.Description.displayName;var A=lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.NetworkIcon})));function ne({chainId:o,variant:e="background",className:t}){let n=C(o),a=typeof o=="string",r=a?o.split(":")[0].toLowerCase():o,u=a&&w(o),m=i("novacore:w-full novacore:h-full novacore:rounded-full",t,{"novacore:[&_path]:first-of-type:fill-[var(--tuwa-testnet-icons)]":u||n.toLowerCase().includes("testnet")});return jsx(Suspense,{fallback:jsx(d,{animate:true,className:t}),children:typeof r=="string"?jsx(A,{id:r,variant:e,className:m,fallback:jsx(d,{content:"?",className:t})}):jsx(A,{chainId:r,variant:e,className:m,fallback:jsx(d,{content:"?",className:t})})})}function ce({starsCount:o}){let[e,t]=useState(false);useEffect(()=>t(true),[]);let n=useMemo(()=>e?Array.from({length:o??200}).map(()=>({x:Math.random()*window.innerWidth,y:Math.random()*window.innerHeight,r:Math.random()*1+.5,isSupernova:Math.random()<.1,delay:Math.random()*10,duration:5+Math.random()*5})):[],[e]);return jsx("div",{className:"novacore:absolute novacore:inset-0 novacore:z-1 novacore:h-full novacore:w-full novacore:overflow-hidden",children:jsxs("svg",{width:"100%",height:"100%",xmlns:"http://www.w3.org/2000/svg",children:[jsx("defs",{children:jsx("style",{children:`
1
+ import {motion,AnimatePresence}from'framer-motion';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {networks}from'@web3icons/common/metadata';import {jsxs,jsx,Fragment}from'react/jsx-runtime';import*as u from'react';import {lazy,useState,useEffect,useCallback,Suspense,useMemo}from'react';import*as c from'@radix-ui/react-dialog';var Vo="novacore:cursor-pointer novacore:rounded-[var(--tuwa-rounded-corners)] novacore:bg-[var(--tuwa-standart-button-bg)] novacore:px-3 novacore:py-2 novacore:flex novacore:items-center novacore:gap-1 novacore:text-sm novacore:font-semibold novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors novacore:hover:bg-[var(--tuwa-standart-button-hover)] novacore:disabled:cursor-not-allowed novacore:disabled:opacity-50";function s(...o){return twMerge(clsx(o))}var y=o=>o&&typeof o=="object"&&!Array.isArray(o);function K(o,e){let t={...o};return y(o)&&y(e)&&Object.keys(e).forEach(a=>{let r=o[a],n=e[a];y(r)&&y(n)?t[a]=K(r,n):t[a]=n;}),t}function x(o){if(typeof o!="string")return false;let e=o.toLowerCase();return e.includes("solana")&&(e.includes("devnet")||e.includes("testnet"))}var T="Unknown";function Q(o){return o.charAt(0).toUpperCase()+o.slice(1).toLowerCase()}function E(o){let e={name:T,id:T.toLowerCase(),filePath:T.toLowerCase(),chainId:o};if(typeof o=="number"){let i=networks.find(l=>l.chainId===o);return i?{name:i.name,id:i.id,filePath:i.filePath.split(":")[1],chainId:o}:e}let[t,a]=o.split(":"),r=networks.find(i=>i.id===t);return r?{name:a&&x(o)?`${r.name} ${Q(a)}`:r.name,id:r.id,filePath:r.filePath.split(":")[1],chainId:o}:e}function A(o=1200){if(typeof window>"u")return false;let e="ontouchstart"in window,t=navigator.maxTouchPoints>0,a=false;window.matchMedia&&(a=window.matchMedia("(pointer: coarse)").matches);let r=e||t||a,n=window.innerWidth<=o;return r&&n}function X(o){if(!o.startsWith("var("))return o;let e=o.match(/var\(\s*(--[\w-]+)/);if(!e)return o;let t=e[1];return getComputedStyle(document.documentElement).getPropertyValue(t).trim()||o}function j(o,e){let t=X(e),r=new DOMParser().parseFromString(o,"image/svg+xml");if(r.querySelector("parsererror"))return console.warn("SVG parse error, returning original"),o;let i=r.querySelector("path");return i&&i.setAttribute("fill",t),new XMLSerializer().serializeToString(r.documentElement)}function N(o,e){let t=o;return e&&(t=j(t,e)),`data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(t)))}`}var S=o=>`${o.replace(/\s+/g,"-").toLowerCase()}.svg`;function Ko(o,e,t){if(!o)return "";if(o.length<=e+t)return o;let a=o.slice(0,e),r=o.slice(o.length-t);return `${a}...${r}`}function se({className:o,strokeWidth:e,isOpen:t}){return jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:e??2,stroke:"currentColor",className:s("novacore:w-4 novacore:h-4 novacore:text-[var(--tuwa-text-secondary)]",o),children:[jsx(AnimatePresence,{children:t&&jsx(motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m4.5 15.75 7.5-7.5 7.5 7.5",variants:{hidden:{translateY:3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})}),jsx(AnimatePresence,{children:!t&&jsx(motion.path,{strokeLinecap:"round",strokeLinejoin:"round",d:"m19.5 8.25-7.5 7.5-7.5-7.5",className:"novacore:relative",variants:{hidden:{translateY:-3,scaleY:.8,opacity:0},visible:{translateY:0,scaleY:1,opacity:1}},initial:"hidden",animate:"visible",transition:{duration:.4}})})]})}var Z=u.forwardRef(({className:o,...e},t)=>jsxs("svg",{ref:t,xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",className:s("novacore:h-5 novacore:w-5 novacore:text-[var(--tuwa-text-primary)] novacore:transition-colors",o),...e,children:[jsx("path",{d:"M18 6 6 18"}),jsx("path",{d:"m6 6 12 12"})]}));Z.displayName="CloseIcon";var eo="novacore:flex novacore:items-center novacore:justify-center novacore:w-full novacore:h-full novacore:rounded-full novacore:text-[var(--tuwa-text-secondary)] novacore:bg-[var(--tuwa-bg-muted)]",v=({animate:o=false,content:e="",className:t})=>jsx("div",{className:s(eo,"Nova_Web3_Icon",t,{"novacore:animate-pulse":o}),children:e});function k({src:o,alt:e,...t}){return jsx("img",{...t,src:o,alt:e??"",draggable:false,onDragStart:a=>a.preventDefault(),style:{outline:"none",pointerEvents:"none"}})}var no="https://raw.githubusercontent.com/0xa3k5/web3icons/refs/heads/main/raw-svgs";function b({githubSrc:o,className:e,alt:t,firstPathFill:a,...r}){let[n,i]=useState(null),[l,m]=useState("idle");return useEffect(()=>{let f=true;return (async()=>{m("loading");try{let w=await fetch(`${no}/${o}`);if(!w.ok)throw new Error(`Failed to load icon: ${w.status}`);let Y=await w.text();f&&(i(N(Y,a)),m("success"));}catch{f&&m("error");}})(),()=>{f=false;}},[o,a]),l==="loading"||l==="idle"?jsx(v,{animate:true,className:e}):l==="success"&&n?jsx(k,{...r,src:n,alt:t,className:e}):jsx(v,{content:"?",className:e})}var Te=c.Root,De=c.Trigger,io=c.Portal,Re=c.Close,so={initial:{opacity:0,scale:.9,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.9,transition:{duration:.2}}},co={initial:{opacity:0,y:"100%"},animate:{opacity:1,y:"0%"},exit:{opacity:0,y:"100%",transition:{duration:.2}}},lo={initial:{opacity:0},animate:{opacity:1},exit:{opacity:0}},B=({className:o,backdropAnimation:e})=>(u.useEffect(()=>(typeof window<"u"&&window.document.body.classList.add("NovaModalOpen"),()=>{typeof window<"u"&&window.document.body.classList.remove("NovaModalOpen");}),[]),jsx(AnimatePresence,{children:jsx(motion.div,{variants:e??lo,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"novacore:relative novacore:overflow-hidden",children:jsx("div",{className:s("novacore:fixed novacore:inset-0 novacore:z-50 novacore:bg-black/55 novacore:backdrop-blur-sm novacore:backdrop-saturate-150",o)})})}));B.displayName=c.Overlay.displayName;var mo=u.forwardRef(({className:o,children:e,modalAnimation:t,backdropAnimation:a,...r},n)=>{let[i,l]=u.useState(false);u.useEffect(()=>{l(A());},[]);let m=t??(i?co:so);return jsxs(io,{children:[jsx(B,{backdropAnimation:a}),jsx(c.Content,{"aria-describedby":"tuwa:modal-content",ref:n,className:s("NovaNoScrolling novacore:fixed novacore:bottom-0 novacore:left-0 novacore:p-0 novacore:sm:bottom-auto novacore:sm:left-[50%] novacore:sm:top-[50%] novacore:sm:translate-x-[-50%] novacore:sm:translate-y-[-50%] novacore:z-50 novacore:sm:p-4 novacore:outline-none",o),...r,children:jsx(motion.div,{layout:true,className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",transition:{layout:{duration:.2,ease:[.1,.1,.2,1]}},children:jsx(AnimatePresence,{children:jsx(motion.div,{variants:m,transition:{duration:.2,ease:"easeInOut"},animate:"animate",initial:"initial",exit:"exit",className:"NovaNoScrolling novacore:relative novacore:overflow-hidden",children:jsx("div",{className:s("NovaNoScrolling NovaDialogContent__elements novacore:relative novacore:flex novacore:max-h-[98dvh] novacore:w-full novacore:flex-col novacore:gap-3 novacore:overflow-y-auto novacore:rounded-t-[var(--tuwa-rounded-corners)] novacore:sm:rounded-[var(--tuwa-rounded-corners)]","novacore:border novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)]"),children:e})})})})})]})});mo.displayName=c.Content.displayName;var uo=({className:o,...e})=>jsx("div",{"aria-describedby":"tuwa:modal-header",className:s("novacore:sticky novacore:flex novacore:top-0 novacore:z-11 novacore:w-full novacore:flex-row novacore:items-center novacore:justify-between","novacore:border-b novacore:border-[var(--tuwa-border-primary)] novacore:bg-[var(--tuwa-bg-primary)] novacore:p-4",o),...e});uo.displayName="DialogHeader";var po=({className:o,...e})=>jsx("div",{"aria-describedby":"tuwa:modal-footer",className:s("novacore:flex novacore:flex-col-reverse novacore:sm:flex-row novacore:sm:justify-end novacore:sm:space-x-2",o),...e});po.displayName="DialogFooter";var fo=u.forwardRef(({className:o,...e},t)=>jsx(c.Title,{ref:t,"aria-describedby":"tuwa:modal-title",className:s("novacore:text-lg novacore:font-bold novacore:leading-none novacore:tracking-tight novacore:text-[var(--tuwa-text-primary)] novacore:m-0",o),...e}));fo.displayName=c.Title.displayName;var vo=u.forwardRef(({className:o,...e},t)=>jsx(c.Description,{"aria-describedby":"tuwa:modal-description",ref:t,className:s("novacore:text-sm novacore:text-[var(--tuwa-text-secondary)]",o),...e}));vo.displayName=c.Description.displayName;function h({children:o,iconId:e,alt:t,firstPathFill:a,...r}){let[n,i]=useState(null),l=useCallback(m=>{if(m){let f=N(m.outerHTML,a);i({id:e,src:f});}},[e,a]);return n&&n.id===e?jsx(k,{...r,src:n.src,alt:t}):jsx(Fragment,{children:o(l)})}var H=lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.NetworkIcon}))),No="var(--tuwa-testnet-icons)";function Ye({chainId:o,variant:e="background",className:t}){let a=E(o),r=typeof o=="string",n=r?o.split(":")[0].toLowerCase():o,l=r&&x(o)||a.name.toLowerCase().includes("testnet")?No:void 0,m=s("novacore:w-full novacore:h-full novacore:rounded-full",t),f=typeof n=="string"?n:a.filePath,I=`networks/${e}/${S(f)}`;return jsx(Suspense,{fallback:jsx(v,{animate:true,className:t}),children:jsx(h,{iconId:`${o}-${e}`,className:m,firstPathFill:l,children:w=>typeof n=="string"?jsx(H,{ref:w,id:n,variant:e,fallback:jsx(b,{githubSrc:I,className:m,firstPathFill:l})}):jsx(H,{ref:w,chainId:n,variant:e,fallback:jsx(b,{githubSrc:I,className:m,firstPathFill:l})})})})}function Qe({starsCount:o}){let[e,t]=useState(false);useEffect(()=>t(true),[]);let a=useMemo(()=>e?Array.from({length:o??200}).map(()=>({x:Math.random()*window.innerWidth,y:Math.random()*window.innerHeight,r:Math.random()*1+.5,isSupernova:Math.random()<.1,delay:Math.random()*10,duration:5+Math.random()*5})):[],[e]);return jsx("div",{className:"novacore:absolute novacore:inset-0 novacore:z-1 novacore:h-full novacore:w-full novacore:overflow-hidden",children:jsxs("svg",{width:"100%",height:"100%",xmlns:"http://www.w3.org/2000/svg",children:[jsx("defs",{children:jsx("style",{children:`
2
2
  /* Pulse animation now includes scale for a more organic feel. */
3
3
  @keyframes pulse {
4
4
  0%, 100% {
@@ -44,5 +44,5 @@ import {motion,AnimatePresence}from'framer-motion';import {clsx}from'clsx';impor
44
44
  transform-origin: center;
45
45
  stroke-width: 2;
46
46
  }
47
- `})}),n.map((a,r)=>jsx("circle",{cx:a.x,cy:a.y,r:a.r,fill:"rgba(var(--tuwa-bg-primary), 0.7)",className:a.isSupernova?"supernova":"pulsar",style:{animationDelay:`${a.delay}s`,animationDuration:`${a.duration}s`}},r))]})})}function ve({closeToast:o,ariaLabel:e="Close toast notification",title:t="Close toast notification",className:n,iconClassName:a}){return jsx("button",{type:"button",onClick:o,"aria-label":e,title:t,className:i("novacore:absolute novacore:top-2 novacore:right-2 novacore:cursor-pointer novacore:rounded-full novacore:p-1","novacore:text-[var(--tuwa-text-tertiary)] novacore:transition-colors","novacore:hover:bg-[var(--tuwa-bg-muted)] novacore:hover:text-[var(--tuwa-text-primary)]",n),children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:i("novacore:h-5 novacore:w-5",a),children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18 18 6M6 6l12 12"})})})}var io=lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.WalletIcon}))),so={walletconnect:"wallet-connect"},co=({className:o})=>jsxs("svg",{className:o,fill:"none",viewBox:"0 0 32 32",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{fill:"#fff",fillRule:"evenodd",d:"M16 0c8.84 0 16 7.16 16 16s-7.16 16-16 16S0 24.84 0 16 7.16 0 16 0",clipRule:"evenodd"}),jsx("path",{fill:"#000",fillRule:"evenodd",d:"M16.54 2.01h1.53c.5.09.99.23 1.48.42.21.25.19.48-.05.69q-.195.045-.39 0c-1.86-.65-3.55-.35-5.07.89 2.39.7 3.84 2.27 4.36 4.7.12.85.08 1.68-.12 2.51.87 0 1.74 0 2.61-.02.39-.4.7-.85.94-1.35-.45-.45-.65-.99-.59-1.63-1.15.08-1.79-.44-1.92-1.58.14-1.12.78-1.67 1.92-1.63a.7.7 0 0 0-.12-.49l-.89-.89c-.02-.45.19-.6.62-.47.24.19.46.39.66.62.71-.79 1.5-.89 2.39-.32.44.42.62.94.54 1.55 1.49.02 2.11.76 1.85 2.22-.08.17-.17.34-.27.49.53.59.87 1.28 1.01 2.07.08 4.6.1 9.19.05 13.79-.19 1.58-1 2.71-2.44 3.37-.29.1-.59.2-.89.27H7.2c-1.31-.33-2.05-1.17-2.24-2.51-.03-5.24-.03-10.47 0-15.71.3-1.62 1.28-2.46 2.93-2.54 1.26-1.77 2.98-2.64 5.17-2.61.96-1.01 2.13-1.62 3.5-1.85zm6.11 1.87c.39-.03.7.12.91.44.06.39.09.79.1 1.18.02.12.07.21.17.27.41 0 .82.04 1.23.1.49.26.63.65.42 1.16-.07.14-.18.25-.32.32-.39.06-.79.09-1.18.1-.12.02-.21.07-.27.17l-.15 1.33c-.32.46-.72.55-1.21.27a.76.76 0 0 1-.27-.37c-.06-.41-.09-.82-.1-1.23a.35.35 0 0 0-.27-.17l-1.08-.05c-.46-.24-.62-.61-.47-1.11.14-.27.36-.43.66-.47l.99-.05s.09-.04.12-.07l.15-1.28q.18-.39.57-.54m-10.49.79c2.41-.09 4.12.94 5.15 3.1.44 1.12.48 2.25.12 3.4-.84.06-1.67.07-2.51.02.56-.68.52-1.32-.1-1.92-.26-.13-.54-.19-.84-.17.02-.95 0-1.91-.07-2.86-.21-.41-.55-.58-1.01-.52-.17.03-.31.09-.44.2-.72.92-1.43 1.85-2.14 2.78-.28.45-.29.91-.05 1.38q.225.3.57.42c.34.02.69.03 1.03.02v.69c-1.3.02-2.59 0-3.89-.05-.58-2.1-.08-3.88 1.53-5.34.79-.62 1.68-1 2.66-1.16zm.83 1.82c.07 0 .13.03.17.1l.05 3.05c.04.09.1.16.17.22l.89.05c.22.08.3.24.22.47q-.27.42-.57.81c-.43.02-.85.03-1.28.02 0-.41 0-.82-.02-1.23a.46.46 0 0 0-.17-.17l-1.28-.05c-.3-.1-.37-.29-.22-.57.7-.89 1.39-1.79 2.04-2.71zm-5.81.84h.2a6.1 6.1 0 0 0-.25 3.77c-.59-.13-1.01-.49-1.26-1.06-.36-1.29.08-2.19 1.31-2.71m17.98.83c.05 0 .1 0 .15.02q.825.855.96 2.04.045 1.305 0 2.61a3.76 3.76 0 0 0-2.54-1.55c-.61-.05-1.21-.08-1.82-.1.26-.31.48-.66.64-1.03 1.31.02 1.94-.62 1.87-1.95.26.02.5 0 .74-.05zM5.7 11.22c.41.4.91.65 1.48.76l16.06.05c1.42.13 2.38.87 2.88 2.19.07.24.12.49.15.74.03 2.86.03 5.71 0 8.57-.21 1.44-1 2.38-2.39 2.83-.24.05-.49.08-.74.1-1.26.02-2.53.03-3.79.02 0-1.33 0-2.66.02-3.99l1.55-1.55c1.42-.04 2.09-.78 1.99-2.19-.24-.88-.81-1.34-1.72-1.38-1.2.12-1.81.8-1.82 2.02l-1.92 1.92c-.08.11-.14.22-.2.34-.07 1.61-.1 3.22-.07 4.83h-.44c0-2.28 0-4.56-.02-6.85a1.8 1.8 0 0 0-.15-.34l-1.13-1.13c0-1.23-.61-1.92-1.82-2.07-1.29.17-1.87.91-1.72 2.22q.465 1.395 1.95 1.35l.71.71c0 .3.04.6.1.89.25.21.48.19.69-.05.03-.39.03-.79 0-1.18-.2-.25-.43-.49-.66-.71.15-.1.29-.22.39-.37.3.27.58.55.86.84.02 2.23.03 4.47.02 6.7h-.59c0-1.38 0-2.76-.02-4.14-.15-.25-.35-.31-.62-.17a1 1 0 0 0-.12.22c-.02 1.36-.03 2.73-.02 4.09h-.44c0-.99 0-1.97-.02-2.96-.02-.09-.06-.17-.1-.25-.67-.72-1.36-1.43-2.07-2.12-.06-1.48-.82-2.13-2.29-1.95-1.02.41-1.42 1.16-1.21 2.24q.51 1.32 1.95 1.26l1.55 1.55c.02.74.03 1.48.02 2.22-1.56.02-3.12 0-4.68-.07-.9-.24-1.42-.83-1.55-1.75-.02-4.48-.03-8.96-.02-13.45zm7.79 5.66c.84.06 1.19.5 1.06 1.33-.32.62-.8.79-1.45.52-.46-.37-.56-.82-.32-1.35.18-.26.42-.42.71-.49zm7.43 1.28c.89-.03 1.29.4 1.21 1.28-.33.67-.83.85-1.5.52-.54-.49-.58-1-.1-1.55.12-.11.25-.19.39-.25M9.94 19.94c.84 0 1.22.4 1.16 1.23-.28.68-.76.89-1.45.62-.63-.54-.65-1.09-.05-1.67l.34-.17zm9.75.24c.16.13.3.27.44.42-.53.52-1.05 1.05-1.55 1.6-.02 1.43-.03 2.86-.02 4.28h-.59c0-1.51 0-3.02.02-4.53a71 71 0 0 1 1.7-1.77M11.56 22c.62.53 1.21 1.11 1.75 1.72.02.92.03 1.84.02 2.76h-.59c0-.85 0-1.71-.02-2.56l-1.48-1.48s-.03-.07 0-.1c.12-.11.22-.22.32-.34",clipRule:"evenodd"})]});function ye({walletName:o,variant:e="background",className:t}){let n=i("novacore:w-full novacore:h-full novacore:rounded-full",t),a=o.toLowerCase();if(a==="impersonatedwallet")return jsx(co,{className:n});let r=so[a]??a;return jsx(Suspense,{fallback:jsx(d,{animate:true,className:t}),children:jsx(io,{id:r,variant:e,className:n,fallback:jsx(d,{content:"?",className:t})})})}function Ne(o=2e3){let[e,t]=useState(false),[n,a]=useState(null),r=useCallback(async u=>{if(u)try{await navigator.clipboard.writeText(u),t(!0),a(null),setTimeout(()=>t(!1),o);}catch(m){let f=m instanceof Error?m:new Error("Failed to copy text.");console.error(f),a(f),setTimeout(()=>a(null),o);}},[o]);return {isCopied:e,copy:r,error:n}}function De(o){let e=a=>typeof window<"u"?window.matchMedia(a).matches:false,[t,n]=useState(e(o));return useEffect(()=>{let a=window.matchMedia(o),r=()=>n(a.matches);return r(),window.addEventListener("resize",r),()=>window.removeEventListener("resize",r)},[o]),t}
48
- export{Vo as ChevronArrowWithAnim,B as CloseIcon,Uo as Dialog,Jo as DialogClose,G as DialogContent,Q as DialogDescription,K as DialogFooter,j as DialogHeader,L as DialogOverlay,_ as DialogPortal,U as DialogTitle,Qo as DialogTrigger,d as FallbackIcon,ne as NetworkIcon,ce as StarsBackground,ve as ToastCloseButton,ye as WalletIcon,i as cn,z as deepMerge,C as getChainName,w as isSolanaDev,D as isTouchDevice,po as standardButtonClasses,Do as textCenterEllipsis,Ne as useCopyToClipboard,De as useMediaQuery};
47
+ `})}),a.map((r,n)=>jsx("circle",{cx:r.x,cy:r.y,r:r.r,fill:"rgba(var(--tuwa-bg-primary), 0.7)",className:r.isSupernova?"supernova":"pulsar",style:{animationDelay:`${r.delay}s`,animationDuration:`${r.duration}s`}},n))]})})}function Ze({closeToast:o,ariaLabel:e="Close toast notification",title:t="Close toast notification",className:a,iconClassName:r}){return jsx("button",{type:"button",onClick:o,"aria-label":e,title:t,className:s("novacore:absolute novacore:top-2 novacore:right-2 novacore:cursor-pointer novacore:rounded-full novacore:p-1","novacore:text-[var(--tuwa-text-tertiary)] novacore:transition-colors","novacore:hover:bg-[var(--tuwa-bg-muted)] novacore:hover:text-[var(--tuwa-text-primary)]",a),children:jsx("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:s("novacore:h-5 novacore:w-5",r),children:jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18 18 6M6 6l12 12"})})})}var Do=lazy(()=>import('@web3icons/react/dynamic').then(o=>({default:o.WalletIcon}))),Ro={walletconnect:"wallet-connect"},Mo=({className:o,ref:e})=>jsxs("svg",{ref:e,className:o,fill:"none",viewBox:"0 0 32 32",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{fill:"#fff",fillRule:"evenodd",d:"M16 0c8.84 0 16 7.16 16 16s-7.16 16-16 16S0 24.84 0 16 7.16 0 16 0",clipRule:"evenodd"}),jsx("path",{fill:"#000",fillRule:"evenodd",d:"M16.54 2.01h1.53c.5.09.99.23 1.48.42.21.25.19.48-.05.69q-.195.045-.39 0c-1.86-.65-3.55-.35-5.07.89 2.39.7 3.84 2.27 4.36 4.7.12.85.08 1.68-.12 2.51.87 0 1.74 0 2.61-.02.39-.4.7-.85.94-1.35-.45-.45-.65-.99-.59-1.63-1.15.08-1.79-.44-1.92-1.58.14-1.12.78-1.67 1.92-1.63a.7.7 0 0 0-.12-.49l-.89-.89c-.02-.45.19-.6.62-.47.24.19.46.39.66.62.71-.79 1.5-.89 2.39-.32.44.42.62.94.54 1.55 1.49.02 2.11.76 1.85 2.22-.08.17-.17.34-.27.49.53.59.87 1.28 1.01 2.07.08 4.6.1 9.19.05 13.79-.19 1.58-1 2.71-2.44 3.37-.29.1-.59.2-.89.27H7.2c-1.31-.33-2.05-1.17-2.24-2.51-.03-5.24-.03-10.47 0-15.71.3-1.62 1.28-2.46 2.93-2.54 1.26-1.77 2.98-2.64 5.17-2.61.96-1.01 2.13-1.62 3.5-1.85zm6.11 1.87c.39-.03.7.12.91.44.06.39.09.79.1 1.18.02.12.07.21.17.27.41 0 .82.04 1.23.1.49.26.63.65.42 1.16-.07.14-.18.25-.32.32-.39.06-.79.09-1.18.1-.12.02-.21.07-.27.17l-.15 1.33c-.32.46-.72.55-1.21.27a.76.76 0 0 1-.27-.37c-.06-.41-.09-.82-.1-1.23a.35.35 0 0 0-.27-.17l-1.08-.05c-.46-.24-.62-.61-.47-1.11.14-.27.36-.43.66-.47l.99-.05s.09-.04.12-.07l.15-1.28q.18-.39.57-.54m-10.49.79c2.41-.09 4.12.94 5.15 3.1.44 1.12.48 2.25.12 3.4-.84.06-1.67.07-2.51.02.56-.68.52-1.32-.1-1.92-.26-.13-.54-.19-.84-.17.02-.95 0-1.91-.07-2.86-.21-.41-.55-.58-1.01-.52-.17.03-.31.09-.44.2-.72.92-1.43 1.85-2.14 2.78-.28.45-.29.91-.05 1.38q.225.3.57.42c.34.02.69.03 1.03.02v.69c-1.3.02-2.59 0-3.89-.05-.58-2.1-.08-3.88 1.53-5.34.79-.62 1.68-1 2.66-1.16zm.83 1.82c.07 0 .13.03.17.1l.05 3.05c.04.09.1.16.17.22l.89.05c.22.08.3.24.22.47q-.27.42-.57.81c-.43.02-.85.03-1.28.02 0-.41 0-.82-.02-1.23a.46.46 0 0 0-.17-.17l-1.28-.05c-.3-.1-.37-.29-.22-.57.7-.89 1.39-1.79 2.04-2.71zm-5.81.84h.2a6.1 6.1 0 0 0-.25 3.77c-.59-.13-1.01-.49-1.26-1.06-.36-1.29.08-2.19 1.31-2.71m17.98.83c.05 0 .1 0 .15.02q.825.855.96 2.04.045 1.305 0 2.61a3.76 3.76 0 0 0-2.54-1.55c-.61-.05-1.21-.08-1.82-.1.26-.31.48-.66.64-1.03 1.31.02 1.94-.62 1.87-1.95.26.02.5 0 .74-.05zM5.7 11.22c.41.4.91.65 1.48.76l16.06.05c1.42.13 2.38.87 2.88 2.19.07.24.12.49.15.74.03 2.86.03 5.71 0 8.57-.21 1.44-1 2.38-2.39 2.83-.24.05-.49.08-.74.1-1.26.02-2.53.03-3.79.02 0-1.33 0-2.66.02-3.99l1.55-1.55c1.42-.04 2.09-.78 1.99-2.19-.24-.88-.81-1.34-1.72-1.38-1.2.12-1.81.8-1.82 2.02l-1.92 1.92c-.08.11-.14.22-.2.34-.07 1.61-.1 3.22-.07 4.83h-.44c0-2.28 0-4.56-.02-6.85a1.8 1.8 0 0 0-.15-.34l-1.13-1.13c0-1.23-.61-1.92-1.82-2.07-1.29.17-1.87.91-1.72 2.22q.465 1.395 1.95 1.35l.71.71c0 .3.04.6.1.89.25.21.48.19.69-.05.03-.39.03-.79 0-1.18-.2-.25-.43-.49-.66-.71.15-.1.29-.22.39-.37.3.27.58.55.86.84.02 2.23.03 4.47.02 6.7h-.59c0-1.38 0-2.76-.02-4.14-.15-.25-.35-.31-.62-.17a1 1 0 0 0-.12.22c-.02 1.36-.03 2.73-.02 4.09h-.44c0-.99 0-1.97-.02-2.96-.02-.09-.06-.17-.1-.25-.67-.72-1.36-1.43-2.07-2.12-.06-1.48-.82-2.13-2.29-1.95-1.02.41-1.42 1.16-1.21 2.24q.51 1.32 1.95 1.26l1.55 1.55c.02.74.03 1.48.02 2.22-1.56.02-3.12 0-4.68-.07-.9-.24-1.42-.83-1.55-1.75-.02-4.48-.03-8.96-.02-13.45zm7.79 5.66c.84.06 1.19.5 1.06 1.33-.32.62-.8.79-1.45.52-.46-.37-.56-.82-.32-1.35.18-.26.42-.42.71-.49zm7.43 1.28c.89-.03 1.29.4 1.21 1.28-.33.67-.83.85-1.5.52-.54-.49-.58-1-.1-1.55.12-.11.25-.19.39-.25M9.94 19.94c.84 0 1.22.4 1.16 1.23-.28.68-.76.89-1.45.62-.63-.54-.65-1.09-.05-1.67l.34-.17zm9.75.24c.16.13.3.27.44.42-.53.52-1.05 1.05-1.55 1.6-.02 1.43-.03 2.86-.02 4.28h-.59c0-1.51 0-3.02.02-4.53a71 71 0 0 1 1.7-1.77M11.56 22c.62.53 1.21 1.11 1.75 1.72.02.92.03 1.84.02 2.76h-.59c0-.85 0-1.71-.02-2.56l-1.48-1.48s-.03-.07 0-.1c.12-.11.22-.22.32-.34",clipRule:"evenodd"})]});function st({walletName:o,variant:e="background",className:t}){let a=s("novacore:w-full novacore:h-full novacore:rounded-full",t),r=o.toLowerCase();if(r==="impersonatedwallet")return jsx(h,{iconId:"impersonatedwallet",className:a,children:i=>jsx(Mo,{ref:i})});let n=Ro[r]??r;return jsx(Suspense,{fallback:jsx(v,{animate:true,className:t}),children:jsx(h,{iconId:`${n}-${e}`,className:a,children:i=>jsx(Do,{ref:i,id:n,variant:e,fallback:jsx(b,{githubSrc:`wallets/${e}/${S(n)}`,className:a})})})})}function dt(o=2e3){let[e,t]=useState(false),[a,r]=useState(null),n=useCallback(async i=>{if(i)try{await navigator.clipboard.writeText(i),t(!0),r(null),setTimeout(()=>t(!1),o);}catch(l){let m=l instanceof Error?l:new Error("Failed to copy text.");console.error(m),r(m),setTimeout(()=>r(null),o);}},[o]);return {isCopied:e,copy:n,error:a}}function ft(o){let e=r=>typeof window<"u"?window.matchMedia(r).matches:false,[t,a]=useState(e(o));return useEffect(()=>{let r=window.matchMedia(o),n=()=>a(r.matches);return n(),window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[o]),t}
48
+ export{se as ChevronArrowWithAnim,Z as CloseIcon,Te as Dialog,Re as DialogClose,mo as DialogContent,vo as DialogDescription,po as DialogFooter,uo as DialogHeader,B as DialogOverlay,io as DialogPortal,fo as DialogTitle,De as DialogTrigger,v as FallbackIcon,b as GithubFallbackIcon,Ye as NetworkIcon,Qe as StarsBackground,k as SvgImg,h as SvgToImg,Ze as ToastCloseButton,st as WalletIcon,j as applyFirstPathFill,s as cn,K as deepMerge,S as formatIconNameForGithub,E as getChainName,x as isSolanaDev,A as isTouchDevice,X as resolveCssVariable,Vo as standardButtonClasses,N as svgToBase64,Ko as textCenterEllipsis,dt as useCopyToClipboard,ft as useMediaQuery};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuwaio/nova-core",
3
- "version": "0.2.5",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
@@ -50,6 +50,7 @@
50
50
  "peerDependencies": {
51
51
  "@radix-ui/react-dialog": "1.x.x",
52
52
  "@web3icons/react": ">=4",
53
+ "@web3icons/common": ">=0.11",
53
54
  "clsx": "2.x.x",
54
55
  "framer-motion": "12.x.x",
55
56
  "react": ">=19.2.3",
@@ -58,16 +59,16 @@
58
59
  "devDependencies": {
59
60
  "@tailwindcss/postcss": "^4.1.18",
60
61
  "@tailwindcss/vite": "^4.1.18",
61
- "@types/react": "^19.2.8",
62
+ "@types/react": "^19.2.10",
62
63
  "@radix-ui/react-dialog": "^1.1.15",
63
- "@web3icons/react": "^4.1.13",
64
- "@web3icons/common": "^0.11.42",
65
- "autoprefixer": "^10.4.23",
64
+ "@web3icons/react": "^4.1.16",
65
+ "@web3icons/common": "^0.11.45",
66
+ "autoprefixer": "^10.4.24",
66
67
  "clsx": "^2.1.1",
67
- "framer-motion": "^12.26.2",
68
+ "framer-motion": "^12.29.2",
68
69
  "postcss": "^8.5.6",
69
70
  "postcss-cli": "^11.0.1",
70
- "react": "^19.2.3",
71
+ "react": "^19.2.4",
71
72
  "tailwindcss": "^4.1.18",
72
73
  "tailwind-merge": "^3.4.0",
73
74
  "tsup": "^8.5.1",