shogun-button-react 1.3.8 → 1.3.41

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
@@ -8,8 +8,7 @@ A React component library for seamless integration of Shogun authentication into
8
8
  - 🎨 Customizable UI components
9
9
  - 🔒 Secure authentication flow
10
10
  - 🌓 Dark mode support
11
- - 🔌 Multiple authentication methods (Username/Password, MetaMask, WebAuthn, Nostr, OAuth)
12
- - 🔑 Account backup and recovery (Gun pair export/import)
11
+ - 🔌 Multiple authentication methods (Username/Password, MetaMask, WebAuthn)
13
12
  - 📱 Responsive design
14
13
  - 🌍 TypeScript support
15
14
 
@@ -21,8 +20,8 @@ import {
21
20
  ShogunButton,
22
21
  ShogunButtonProvider,
23
22
  shogunConnector,
24
- } from "shogun-button-react";
25
- import "shogun-button-react/styles.css";
23
+ } from "@shogun/shogun-button-react";
24
+ import "@shogun/shogun-button-react/styles.css";
26
25
 
27
26
  function App() {
28
27
  const { sdk, options, setProvider } = shogunConnector({
@@ -67,113 +66,62 @@ The provider component that supplies Shogun context to your application.
67
66
 
68
67
  | Name | Type | Description |
69
68
  | --------------- | ------------------------ | ---------------------------------------------- |
70
- | sdk | ShogunCore | Shogun SDK instance created by shogunConnector |
69
+ | sdk | ShogunSDK | Shogun SDK instance created by shogunConnector |
71
70
  | options | Object | Configuration options |
72
- | onLoginSuccess | (data: { userPub: string; username: string; password?: string; authMethod?: string }) => void | Callback fired on successful login |
73
- | onSignupSuccess | (data: { userPub: string; username: string; password?: string; authMethod?: string }) => void | Callback fired on successful signup |
71
+ | onLoginSuccess | (data: AuthData) => void | Callback fired on successful login |
72
+ | onSignupSuccess | (data: AuthData) => void | Callback fired on successful signup |
74
73
  | onError | (error: Error) => void | Callback fired when an error occurs |
75
74
 
76
75
  ### ShogunButton
77
76
 
78
- The main button component for triggering Shogun authentication. The component provides a complete authentication UI with modal dialogs for login and signup.
77
+ The main button component for triggering Shogun authentication.
78
+
79
+ #### Custom Button
80
+
81
+ You can customize the button appearance using `ShogunButton.Custom`:
82
+
83
+ ```tsx
84
+ <ShogunButton.Custom>
85
+ {({ ready, authenticate }) => (
86
+ <button
87
+ className="my-custom-button"
88
+ disabled={!ready}
89
+ onClick={authenticate}
90
+ >
91
+ Connect with Shogun
92
+ </button>
93
+ )}
94
+ </ShogunButton.Custom>
95
+ ```
79
96
 
80
97
  ### useShogun Hook
81
98
 
82
99
  A hook to access Shogun authentication state and functions.
83
100
 
84
101
  ```tsx
85
- import React, { useEffect } from "react";
86
- import { useShogun } from "shogun-button-react";
102
+ import { useShogun } from "@shogun/shogun-button-react";
87
103
 
88
104
  function Profile() {
89
105
  const {
90
- isLoggedIn,
91
- userPub,
92
- username,
106
+ isAuthenticated,
107
+ user,
93
108
  login,
94
109
  signup,
95
110
  logout,
111
+ connectWithMetaMask,
112
+ connectWithWebAuthn,
96
113
  setProvider,
97
- hasPlugin,
98
- getPlugin,
99
- exportGunPair,
100
- importGunPair,
101
- observe,
102
114
  } = useShogun();
103
115
 
104
- const handleLogin = async () => {
105
- // Login with username/password
106
- await login("password", "username", "password");
107
-
108
- // Or login with MetaMask
109
- await login("web3");
110
-
111
- // Or login with WebAuthn
112
- await login("webauthn", "username");
113
-
114
- // Or login with Nostr
115
- await login("nostr");
116
-
117
- // Or login with OAuth
118
- await login("oauth", "google");
119
-
120
- // Or login with Gun pair (for account recovery)
121
- const pairData = { /* Gun pair object */ };
122
- await login("pair", pairData);
123
- };
124
-
125
- const handleSignUp = async () => {
126
- // Sign up with username/password
127
- await signup("password", "newusername", "newpassword");
128
-
129
- // Or sign up with other methods (similar to login)
130
- await signup("web3");
131
- await signup("webauthn", "newusername");
132
- };
133
-
134
116
  const switchToCustomNetwork = () => {
135
117
  setProvider('https://my-custom-rpc.example.com');
136
118
  };
137
119
 
138
- const handleExportPair = async () => {
139
- try {
140
- const pairData = await exportGunPair("optional-encryption-password");
141
- console.log("Exported pair:", pairData);
142
- // Save this data securely for account recovery
143
- } catch (error) {
144
- console.error("Export failed:", error);
145
- }
146
- };
147
-
148
- const handleImportPair = async () => {
149
- try {
150
- const success = await importGunPair(savedPairData, "optional-password");
151
- if (success) {
152
- console.log("Pair imported successfully");
153
- }
154
- } catch (error) {
155
- console.error("Import failed:", error);
156
- }
157
- };
158
-
159
- // Observe reactive data changes
160
- useEffect(() => {
161
- if (isLoggedIn) {
162
- const subscription = observe<any>('user/profile').subscribe(data => {
163
- console.log('Profile data updated:', data);
164
- });
165
-
166
- return () => subscription.unsubscribe();
167
- }
168
- }, [isLoggedIn, observe]);
169
-
170
- return isLoggedIn ? (
120
+ return isAuthenticated ? (
171
121
  <div>
172
- <h2>Welcome, {username}!</h2>
173
- <p>User Public Key: {userPub}</p>
122
+ <h2>Welcome, {user.username}!</h2>
174
123
  <button onClick={logout}>Logout</button>
175
124
  <button onClick={switchToCustomNetwork}>Switch Network</button>
176
- <button onClick={handleExportPair}>Export Account</button>
177
125
  </div>
178
126
  ) : (
179
127
  <div>Please login to continue</div>
@@ -187,43 +135,17 @@ The `shogunConnector` accepts the following options:
187
135
 
188
136
  ```typescript
189
137
  interface ShogunConnectorOptions {
190
- // App information
191
138
  appName: string;
192
139
  appDescription?: string;
193
140
  appUrl?: string;
194
141
  appIcon?: string;
195
-
196
- // Feature toggles
197
142
  showMetamask?: boolean;
198
143
  showWebauthn?: boolean;
199
- showNostr?: boolean;
200
- showOauth?: boolean;
201
144
  darkMode?: boolean;
202
-
203
- // Network configuration
204
145
  websocketSecure?: boolean;
146
+ didRegistryAddress?: string | null;
205
147
  providerUrl?: string | null;
206
148
  peers?: string[];
207
- authToken?: string;
208
- gunInstance?: IGunInstance<any>;
209
-
210
- // Advanced options
211
- logging?: {
212
- enabled: boolean;
213
- level: "error" | "warning" | "info" | "debug";
214
- };
215
- timeouts?: {
216
- login?: number;
217
- signup?: number;
218
- operation?: number;
219
- };
220
- oauth?: {
221
- providers: Record<string, {
222
- clientId: string;
223
- clientSecret?: string;
224
- redirectUri?: string;
225
- }>
226
- }
227
149
  }
228
150
  ```
229
151
 
@@ -235,8 +157,6 @@ interface ShogunConnectorResult {
235
157
  options: ShogunConnectorOptions;
236
158
  setProvider: (provider: string | EthersProvider) => boolean;
237
159
  getCurrentProviderUrl: () => string | null;
238
- registerPlugin: (plugin: any) => boolean;
239
- hasPlugin: (name: string) => boolean;
240
160
  }
241
161
  ```
242
162
 
@@ -536,7 +536,11 @@ export const ShogunButton = (() => {
536
536
  setError("WebAuthn is not supported in your browser");
537
537
  return;
538
538
  }
539
- setAuthView("webauthn-username");
539
+ if (!formUsername) {
540
+ setError("Username required for WebAuthn");
541
+ return;
542
+ }
543
+ handleAuth("webauthn", formUsername);
540
544
  };
541
545
  const handleNostrAuth = () => handleAuth("nostr");
542
546
  const handleOAuth = (provider) => handleAuth("oauth", provider);
@@ -649,7 +653,13 @@ export const ShogunButton = (() => {
649
653
  React.createElement(WalletIcon, null),
650
654
  formMode === "login" ? "Login with MetaMask" : "Signup with MetaMask"))),
651
655
  options.showWebauthn !== false && (sdk === null || sdk === void 0 ? void 0 : sdk.hasPlugin("webauthn")) && (React.createElement("div", { className: "shogun-auth-option-group" },
652
- React.createElement("button", { type: "button", className: "shogun-auth-option-button", onClick: handleWebAuthnAuth, disabled: loading },
656
+ React.createElement("button", { type: "button", className: "shogun-auth-option-button", onClick: () => {
657
+ if (!formUsername) {
658
+ setError("Username required for WebAuthn");
659
+ return;
660
+ }
661
+ handleAuth("webauthn", formUsername);
662
+ }, disabled: loading },
653
663
  React.createElement(WebAuthnIcon, null),
654
664
  formMode === "login" ? "Login with WebAuthn" : "Signup with WebAuthn"))),
655
665
  options.showNostr !== false && (sdk === null || sdk === void 0 ? void 0 : sdk.hasPlugin("nostr")) && (React.createElement("div", { className: "shogun-auth-option-group" },
@@ -710,22 +720,6 @@ export const ShogunButton = (() => {
710
720
  ? "Don't have an account? Sign up"
711
721
  : "Already have an account? Log in"),
712
722
  formMode === "login" && (React.createElement("button", { type: "button", className: "shogun-toggle-mode", onClick: () => setAuthView("recover"), disabled: loading }, "Forgot password?")))));
713
- const renderWebAuthnUsernameForm = () => (React.createElement("div", { className: "shogun-auth-form" },
714
- React.createElement("h3", null, formMode === "login" ? "Login with WebAuthn" : "Sign Up with WebAuthn"),
715
- React.createElement("div", { style: { backgroundColor: '#f0f9ff', padding: '12px', borderRadius: '8px', marginBottom: '16px', border: '1px solid #0ea5e9' } },
716
- React.createElement("p", { style: { fontSize: '14px', color: '#0c4a6e', margin: '0', fontWeight: '500' } }, "\uD83D\uDD11 WebAuthn Authentication"),
717
- React.createElement("p", { style: { fontSize: '13px', color: '#075985', margin: '4px 0 0 0' } },
718
- "Please enter your username to continue with WebAuthn ",
719
- formMode === "login" ? "login" : "registration",
720
- ".")),
721
- React.createElement("div", { className: "shogun-form-group" },
722
- React.createElement("label", { htmlFor: "username" },
723
- React.createElement(UserIcon, null),
724
- React.createElement("span", null, "Username")),
725
- React.createElement("input", { type: "text", id: "username", value: formUsername, onChange: (e) => setFormUsername(e.target.value), disabled: loading, required: true, placeholder: "Enter your username", autoFocus: true })),
726
- React.createElement("button", { type: "button", className: "shogun-submit-button", onClick: () => handleAuth("webauthn", formUsername), disabled: loading || !formUsername.trim() }, loading ? "Processing..." : `Continue with WebAuthn`),
727
- React.createElement("div", { className: "shogun-form-footer" },
728
- React.createElement("button", { type: "button", className: "shogun-back-button", onClick: () => setAuthView("options"), disabled: loading }, "\u2190 Back to Options"))));
729
723
  const renderRecoveryForm = () => (React.createElement("div", { className: "shogun-auth-form" },
730
724
  React.createElement("div", { className: "shogun-form-group" },
731
725
  React.createElement("label", { htmlFor: "username" },
@@ -851,11 +845,9 @@ export const ShogunButton = (() => {
851
845
  ? "Export Gun Pair"
852
846
  : authView === "import"
853
847
  ? "Import Gun Pair"
854
- : authView === "webauthn-username"
855
- ? "WebAuthn"
856
- : formMode === "login"
857
- ? "Login"
858
- : "Sign Up"),
848
+ : formMode === "login"
849
+ ? "Login"
850
+ : "Sign Up"),
859
851
  React.createElement("button", { className: "shogun-close-button", onClick: closeModal, "aria-label": "Close" },
860
852
  React.createElement(CloseIcon, null))),
861
853
  React.createElement("div", { className: "shogun-modal-content" },
@@ -872,8 +864,7 @@ export const ShogunButton = (() => {
872
864
  authView === "recover" && renderRecoveryForm(),
873
865
  authView === "showHint" && renderHint(),
874
866
  authView === "export" && renderExportForm(),
875
- authView === "import" && renderImportForm(),
876
- authView === "webauthn-username" && renderWebAuthnUsernameForm()))))));
867
+ authView === "import" && renderImportForm()))))));
877
868
  };
878
869
  Button.displayName = "ShogunButton";
879
870
  return Object.assign(Button, {
package/dist/index.css ADDED
@@ -0,0 +1,756 @@
1
+ /* Base styles */
2
+ :root {
3
+ --shogun-primary: #3b82f6;
4
+ --shogun-primary-hover: #2563eb;
5
+ --shogun-secondary: #6b7280;
6
+ --shogun-success: #10b981;
7
+ --shogun-danger: #ef4444;
8
+ --shogun-warning: #f59e0b;
9
+ --shogun-text: #1f2937;
10
+ --shogun-text-secondary: #6b7280;
11
+ --shogun-bg: #ffffff;
12
+ --shogun-bg-secondary: #f3f4f6;
13
+ --shogun-border: #e5e7eb;
14
+ --shogun-border-radius: 12px;
15
+ --shogun-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
16
+ --shogun-transition: all 0.2s ease;
17
+ --shogun-font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
18
+ }
19
+
20
+ /* Dark mode support */
21
+ @media (prefers-color-scheme: dark) {
22
+ :root {
23
+ --shogun-text: #f3f4f6;
24
+ --shogun-text-secondary: #9ca3af;
25
+ --shogun-bg: #1f2937;
26
+ --shogun-bg-secondary: #374151;
27
+ --shogun-border: #4b5563;
28
+ }
29
+ }
30
+
31
+ /* Connect Button */
32
+ .shogun-connect-button {
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ gap: 8px;
37
+ background-color: var(--shogun-primary);
38
+ color: white;
39
+ border: none;
40
+ border-radius: var(--shogun-border-radius);
41
+ padding: 10px 16px;
42
+ font-family: var(--shogun-font);
43
+ font-weight: 600;
44
+ font-size: 14px;
45
+ cursor: pointer;
46
+ transition: var(--shogun-transition);
47
+ box-shadow: var(--shogun-shadow);
48
+ }
49
+
50
+ .shogun-connect-button:hover {
51
+ background-color: var(--shogun-primary-hover);
52
+ }
53
+
54
+ .shogun-connect-button:focus {
55
+ outline: none;
56
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);
57
+ }
58
+
59
+ /* Logged in state */
60
+ .shogun-logged-in-container {
61
+ position: relative;
62
+ }
63
+
64
+ .shogun-dropdown {
65
+ position: relative;
66
+ }
67
+
68
+ .shogun-button.shogun-logged-in {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 8px;
72
+ background-color: var(--shogun-bg-secondary);
73
+ color: var(--shogun-text);
74
+ border: 1px solid var(--shogun-border);
75
+ border-radius: var(--shogun-border-radius);
76
+ padding: 8px 12px;
77
+ font-family: var(--shogun-font);
78
+ font-size: 14px;
79
+ cursor: pointer;
80
+ transition: var(--shogun-transition);
81
+ }
82
+
83
+ .shogun-button.shogun-logged-in:hover {
84
+ background-color: var(--shogun-bg);
85
+ }
86
+
87
+ .shogun-avatar {
88
+ width: 24px;
89
+ height: 24px;
90
+ background-color: var(--shogun-primary);
91
+ color: white;
92
+ border-radius: 50%;
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ font-weight: 600;
97
+ font-size: 12px;
98
+ }
99
+
100
+ .shogun-username {
101
+ font-weight: 500;
102
+ }
103
+
104
+ .shogun-dropdown-menu {
105
+ position: absolute;
106
+ top: calc(100% + 8px);
107
+ right: 0;
108
+ background-color: var(--shogun-bg);
109
+ border: 1px solid var(--shogun-border);
110
+ border-radius: var(--shogun-border-radius);
111
+ box-shadow: var(--shogun-shadow);
112
+ width: 240px;
113
+ z-index: 100;
114
+ overflow: hidden;
115
+ animation: shogun-dropdown-fade 0.2s ease;
116
+ }
117
+
118
+ @keyframes shogun-dropdown-fade {
119
+ from {
120
+ opacity: 0;
121
+ transform: translateY(-8px);
122
+ }
123
+ to {
124
+ opacity: 1;
125
+ transform: translateY(0);
126
+ }
127
+ }
128
+
129
+ .shogun-dropdown-header {
130
+ padding: 16px;
131
+ border-bottom: 1px solid var(--shogun-border);
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 12px;
135
+ }
136
+
137
+ .shogun-avatar-large {
138
+ width: 40px;
139
+ height: 40px;
140
+ background-color: var(--shogun-primary);
141
+ color: white;
142
+ border-radius: 50%;
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ font-weight: 600;
147
+ font-size: 16px;
148
+ }
149
+
150
+ .shogun-user-info {
151
+ display: flex;
152
+ flex-direction: column;
153
+ }
154
+
155
+ .shogun-username-full {
156
+ font-weight: 600;
157
+ color: var(--shogun-text);
158
+ font-size: 14px;
159
+ }
160
+
161
+ .shogun-dropdown-item {
162
+ padding: 12px 16px;
163
+ display: flex;
164
+ align-items: center;
165
+ gap: 12px;
166
+ color: var(--shogun-text);
167
+ font-size: 14px;
168
+ cursor: pointer;
169
+ transition: var(--shogun-transition);
170
+ }
171
+
172
+ .shogun-dropdown-item:hover {
173
+ background-color: var(--shogun-bg-secondary);
174
+ }
175
+
176
+ /* Modal */
177
+ .shogun-modal-overlay {
178
+ position: fixed;
179
+ top: 0;
180
+ left: 0;
181
+ right: 0;
182
+ bottom: 0;
183
+ background-color: rgba(0, 0, 0, 0.5);
184
+ display: flex;
185
+ align-items: center;
186
+ justify-content: center;
187
+ z-index: 1000;
188
+ animation: shogun-fade-in 0.2s ease;
189
+ }
190
+
191
+ @keyframes shogun-fade-in {
192
+ from {
193
+ opacity: 0;
194
+ }
195
+ to {
196
+ opacity: 1;
197
+ }
198
+ }
199
+
200
+ .shogun-modal {
201
+ background-color: var(--shogun-bg);
202
+ border-radius: var(--shogun-border-radius);
203
+ box-shadow: var(--shogun-shadow);
204
+ width: 90%;
205
+ max-width: 400px;
206
+ max-height: 90vh;
207
+ overflow-y: auto;
208
+ animation: shogun-scale-in 0.2s ease;
209
+ }
210
+
211
+ @keyframes shogun-scale-in {
212
+ from {
213
+ opacity: 0;
214
+ transform: scale(0.95);
215
+ }
216
+ to {
217
+ opacity: 1;
218
+ transform: scale(1);
219
+ }
220
+ }
221
+
222
+ .shogun-modal-header {
223
+ display: flex;
224
+ justify-content: space-between;
225
+ align-items: center;
226
+ padding: 16px 20px;
227
+ border-bottom: 1px solid var(--shogun-border);
228
+ }
229
+
230
+ .shogun-modal-header h2 {
231
+ margin: 0;
232
+ font-size: 1.5rem;
233
+ font-weight: 600;
234
+ color: #111827;
235
+ text-align: center;
236
+ width: 100%;
237
+ }
238
+
239
+ .shogun-close-button {
240
+ background: none;
241
+ border: none;
242
+ cursor: pointer;
243
+ color: var(--shogun-text-secondary);
244
+ padding: 4px;
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ border-radius: 50%;
249
+ transition: var(--shogun-transition);
250
+ }
251
+
252
+ .shogun-close-button:hover {
253
+ background-color: var(--shogun-bg-secondary);
254
+ color: var(--shogun-text);
255
+ }
256
+
257
+ .shogun-modal-content {
258
+ padding: 20px;
259
+ }
260
+
261
+ /* Auth options */
262
+ .shogun-auth-options {
263
+ display: flex;
264
+ flex-direction: column;
265
+ gap: 12px;
266
+ margin-bottom: 24px;
267
+ }
268
+
269
+ .shogun-auth-option-button {
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ gap: 12px;
274
+ background-color: var(--shogun-bg);
275
+ color: var(--shogun-text);
276
+ border: 1px solid var(--shogun-border);
277
+ border-radius: var(--shogun-border-radius);
278
+ padding: 12px 16px;
279
+ font-family: var(--shogun-font);
280
+ font-weight: 500;
281
+ font-size: 14px;
282
+ cursor: pointer;
283
+ transition: var(--shogun-transition);
284
+ width: 100%;
285
+ }
286
+
287
+ .shogun-auth-option-button:hover {
288
+ background-color: var(--shogun-bg-secondary);
289
+ }
290
+
291
+ .shogun-auth-option-button:disabled {
292
+ opacity: 0.6;
293
+ cursor: not-allowed;
294
+ }
295
+
296
+ .shogun-google-button {
297
+ border-color: #4285F4;
298
+ }
299
+
300
+ /* Divider */
301
+ .shogun-divider {
302
+ display: flex;
303
+ align-items: center;
304
+ margin: 20px 0;
305
+ color: var(--shogun-text-secondary);
306
+ font-size: 14px;
307
+ }
308
+
309
+ .shogun-divider::before,
310
+ .shogun-divider::after {
311
+ content: "";
312
+ flex: 1;
313
+ border-bottom: 1px solid var(--shogun-border);
314
+ }
315
+
316
+ .shogun-divider span {
317
+ padding: 0 10px;
318
+ }
319
+
320
+ /* Form */
321
+ .shogun-auth-form {
322
+ display: flex;
323
+ flex-direction: column;
324
+ gap: 16px;
325
+ }
326
+
327
+ .shogun-form-group {
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 8px;
331
+ }
332
+
333
+ .shogun-form-group label {
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 8px;
337
+ font-size: 14px;
338
+ font-weight: 500;
339
+ color: var(--shogun-text);
340
+ }
341
+
342
+ .shogun-form-group input {
343
+ padding: 12px;
344
+ border: 1px solid var(--shogun-border);
345
+ border-radius: var(--shogun-border-radius);
346
+ background-color: var(--shogun-bg);
347
+ color: var(--shogun-text);
348
+ font-size: 14px;
349
+ transition: var(--shogun-transition);
350
+ }
351
+
352
+ .shogun-form-group input:focus {
353
+ outline: none;
354
+ border-color: var(--shogun-primary);
355
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
356
+ }
357
+
358
+ .shogun-submit-button {
359
+ background-color: var(--shogun-primary);
360
+ color: white;
361
+ border: none;
362
+ border-radius: var(--shogun-border-radius);
363
+ padding: 12px 16px;
364
+ font-family: var(--shogun-font);
365
+ font-weight: 600;
366
+ font-size: 14px;
367
+ cursor: pointer;
368
+ transition: var(--shogun-transition);
369
+ margin-top: 8px;
370
+ }
371
+
372
+ .shogun-submit-button:hover:not(:disabled) {
373
+ background-color: var(--shogun-primary-hover);
374
+ }
375
+
376
+ .shogun-submit-button:disabled {
377
+ opacity: 0.6;
378
+ cursor: not-allowed;
379
+ }
380
+
381
+ /* Footer */
382
+ .shogun-form-footer {
383
+ margin-top: 20px;
384
+ text-align: center;
385
+ font-size: 14px;
386
+ color: var(--shogun-text-secondary);
387
+ }
388
+
389
+ .shogun-toggle-mode {
390
+ background: none;
391
+ border: none;
392
+ color: var(--shogun-primary);
393
+ font-weight: 600;
394
+ cursor: pointer;
395
+ padding: 0;
396
+ margin-left: 4px;
397
+ transition: var(--shogun-transition);
398
+ }
399
+
400
+ .shogun-toggle-mode:hover {
401
+ text-decoration: underline;
402
+ }
403
+
404
+ .shogun-toggle-mode:disabled {
405
+ opacity: 0.6;
406
+ cursor: not-allowed;
407
+ }
408
+
409
+ /* Error message */
410
+ .shogun-error-message {
411
+ background-color: rgba(239, 68, 68, 0.1);
412
+ color: var(--shogun-danger);
413
+ padding: 12px;
414
+ border-radius: var(--shogun-border-radius);
415
+ margin-bottom: 16px;
416
+ font-size: 14px;
417
+ border: 1px solid rgba(239, 68, 68, 0.2);
418
+ }
419
+
420
+ /* Shogun Button Styles */
421
+
422
+ .shogun-button {
423
+ display: flex;
424
+ align-items: center;
425
+ justify-content: center;
426
+ padding: 12px 20px;
427
+ background-color: #3861fb;
428
+ color: white;
429
+ border: none;
430
+ border-radius: 8px;
431
+ font-size: 16px;
432
+ font-weight: 600;
433
+ cursor: pointer;
434
+ transition: all 0.2s ease;
435
+ min-width: 150px;
436
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
437
+ }
438
+
439
+ .shogun-button:hover {
440
+ background-color: #2d4fd6;
441
+ transform: translateY(-1px);
442
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
443
+ }
444
+
445
+ .shogun-button:active {
446
+ transform: translateY(0);
447
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
448
+ }
449
+
450
+ .shogun-button.shogun-logged-in {
451
+ background-color: #4CAF50;
452
+ }
453
+
454
+ .shogun-button.shogun-logged-in:hover {
455
+ background-color: #43a047;
456
+ }
457
+
458
+ .shogun-button-custom {
459
+ cursor: pointer;
460
+ display: inline-flex;
461
+ align-items: center;
462
+ }
463
+
464
+ /* Tema scuro */
465
+ [data-shogun-theme="dark"] .shogun-button {
466
+ background-color: #4a5568;
467
+ color: white;
468
+ }
469
+
470
+ [data-shogun-theme="dark"] .shogun-button:hover {
471
+ background-color: #2d3748;
472
+ }
473
+
474
+ [data-shogun-theme="dark"] .shogun-button.shogun-logged-in {
475
+ background-color: #38a169;
476
+ }
477
+
478
+ [data-shogun-theme="dark"] .shogun-button.shogun-logged-in:hover {
479
+ background-color: #2f855a;
480
+ }
481
+
482
+ /* Stili per il modale di login/registrazione */
483
+ .shogun-modal-overlay {
484
+ position: fixed;
485
+ top: 0;
486
+ left: 0;
487
+ width: 100%;
488
+ height: 100%;
489
+ background-color: rgba(0, 0, 0, 0.5);
490
+ display: flex;
491
+ justify-content: center;
492
+ align-items: center;
493
+ z-index: 1000;
494
+ }
495
+
496
+ .shogun-modal {
497
+ background-color: white;
498
+ border-radius: 8px;
499
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
500
+ width: 100%;
501
+ max-width: 420px;
502
+ overflow: hidden;
503
+ }
504
+
505
+ .shogun-modal-header {
506
+ display: flex;
507
+ justify-content: space-between;
508
+ align-items: center;
509
+ padding: 16px 20px;
510
+ border-bottom: 1px solid #e0e0e0;
511
+ }
512
+
513
+ .shogun-modal-header h2 {
514
+ margin: 0;
515
+ font-size: 20px;
516
+ font-weight: 600;
517
+ color: #333;
518
+ }
519
+
520
+ .shogun-close-button {
521
+ background: none;
522
+ border: none;
523
+ font-size: 24px;
524
+ color: #666;
525
+ cursor: pointer;
526
+ }
527
+
528
+ .shogun-modal-content {
529
+ padding: 20px;
530
+ }
531
+
532
+ .shogun-error-message {
533
+ background-color: #ffebee;
534
+ color: #d32f2f;
535
+ border-radius: 4px;
536
+ padding: 10px;
537
+ margin-bottom: 16px;
538
+ font-size: 14px;
539
+ }
540
+
541
+ .shogun-form-group {
542
+ margin-bottom: 16px;
543
+ }
544
+
545
+ .shogun-form-group label {
546
+ display: block;
547
+ margin-bottom: 6px;
548
+ font-size: 14px;
549
+ font-weight: 500;
550
+ color: #333;
551
+ }
552
+
553
+ .shogun-form-group input {
554
+ width: 100%;
555
+ padding: 10px 12px;
556
+ border: 1px solid #ccc;
557
+ border-radius: 4px;
558
+ font-size: 14px;
559
+ }
560
+
561
+ .shogun-submit-button {
562
+ width: 100%;
563
+ background-color: #4a2afd;
564
+ color: white;
565
+ border: none;
566
+ border-radius: 4px;
567
+ padding: 12px;
568
+ font-size: 16px;
569
+ font-weight: 600;
570
+ cursor: pointer;
571
+ transition: background-color 0.2s;
572
+ margin-top: 8px;
573
+ }
574
+
575
+ .shogun-submit-button:hover {
576
+ background-color: #3115d6;
577
+ }
578
+
579
+ .shogun-submit-button:disabled {
580
+ background-color: #a9a9a9;
581
+ cursor: not-allowed;
582
+ }
583
+
584
+ .shogun-divider {
585
+ display: flex;
586
+ align-items: center;
587
+ text-align: center;
588
+ margin: 16px 0;
589
+ color: #666;
590
+ font-size: 14px;
591
+ }
592
+
593
+ .shogun-divider::before,
594
+ .shogun-divider::after {
595
+ content: '';
596
+ flex: 1;
597
+ border-bottom: 1px solid #e0e0e0;
598
+ }
599
+
600
+ .shogun-divider::before {
601
+ margin-right: 10px;
602
+ }
603
+
604
+ .shogun-divider::after {
605
+ margin-left: 10px;
606
+ }
607
+
608
+ .shogun-metamask-button,
609
+ .shogun-webauthn-button,
610
+ .shogun-nostr-button,
611
+ .shogun-oauth-button {
612
+ width: 100%;
613
+ background-color: #fff;
614
+ color: #333;
615
+ border: 1px solid #ccc;
616
+ border-radius: 4px;
617
+ padding: 12px;
618
+ font-size: 14px;
619
+ font-weight: 500;
620
+ cursor: pointer;
621
+ transition: background-color 0.2s;
622
+ margin-bottom: 8px;
623
+ display: flex;
624
+ align-items: center;
625
+ justify-content: center;
626
+ }
627
+
628
+ .shogun-metamask-button:hover,
629
+ .shogun-webauthn-button:hover,
630
+ .shogun-nostr-button:hover,
631
+ .shogun-oauth-button:hover {
632
+ background-color: #f5f5f5;
633
+ }
634
+
635
+ .shogun-metamask-button:disabled,
636
+ .shogun-webauthn-button:disabled,
637
+ .shogun-nostr-button:disabled,
638
+ .shogun-oauth-button:disabled {
639
+ background-color: #f5f5f5;
640
+ color: #a9a9a9;
641
+ cursor: not-allowed;
642
+ }
643
+
644
+ .shogun-form-footer {
645
+ text-align: center;
646
+ margin-top: 16px;
647
+ font-size: 14px;
648
+ color: #666;
649
+ }
650
+
651
+ .shogun-toggle-mode {
652
+ background: none;
653
+ border: none;
654
+ color: #4a2afd;
655
+ font-weight: 600;
656
+ cursor: pointer;
657
+ padding: 0;
658
+ margin-left: 4px;
659
+ }
660
+
661
+ .shogun-toggle-mode:disabled {
662
+ color: #a9a9a9;
663
+ cursor: not-allowed;
664
+ }
665
+
666
+ /* Stili per i container DID */
667
+ .shogun-logged-in-container {
668
+ display: flex;
669
+ flex-direction: column;
670
+ align-items: center;
671
+ gap: 10px;
672
+ }
673
+
674
+ .shogun-did-container {
675
+ max-width: 100%;
676
+ padding: 10px;
677
+ background-color: #f5f5f5;
678
+ border-radius: 5px;
679
+ margin-top: 5px;
680
+ word-break: break-all;
681
+ text-align: center;
682
+ }
683
+
684
+ .shogun-did-text {
685
+ font-size: 12px;
686
+ color: #555;
687
+ margin: 0 0 10px 0;
688
+ word-break: break-all;
689
+ }
690
+
691
+ .shogun-register-did-button {
692
+ padding: 6px 12px;
693
+ background-color: #4a56e2;
694
+ color: white;
695
+ border: none;
696
+ border-radius: 4px;
697
+ cursor: pointer;
698
+ font-size: 13px;
699
+ transition: background-color 0.3s;
700
+ }
701
+
702
+ .shogun-register-did-button:hover {
703
+ background-color: #3a46c2;
704
+ }
705
+
706
+ .shogun-register-did-button:disabled {
707
+ background-color: #a0a0a0;
708
+ cursor: not-allowed;
709
+ }
710
+
711
+ .shogun-logout-button {
712
+ padding: 6px 12px;
713
+ background-color: #e74c3c;
714
+ color: white;
715
+ border: none;
716
+ border-radius: 4px;
717
+ cursor: pointer;
718
+ font-size: 13px;
719
+ margin-top: 5px;
720
+ transition: background-color 0.3s;
721
+ }
722
+
723
+ .shogun-logout-button:hover {
724
+ background-color: #c0392b;
725
+ }
726
+
727
+ .shogun-prominent-toggle {
728
+ font-weight: 600;
729
+ color: #3b82f6;
730
+ padding: 8px 16px;
731
+ margin-top: 16px;
732
+ border: 1px solid #e5e7eb;
733
+ border-radius: 6px;
734
+ background-color: #f9fafb;
735
+ transition: all 0.2s ease;
736
+ }
737
+
738
+ .shogun-prominent-toggle:hover {
739
+ background-color: #f3f4f6;
740
+ border-color: #d1d5db;
741
+ }
742
+
743
+ [data-shogun-theme="dark"] .shogun-prominent-toggle {
744
+ background-color: #1f2937;
745
+ border-color: #374151;
746
+ color: #60a5fa;
747
+ }
748
+
749
+ [data-shogun-theme="dark"] .shogun-prominent-toggle:hover {
750
+ background-color: #111827;
751
+ border-color: #4b5563;
752
+ }
753
+
754
+ [data-shogun-theme="dark"] .shogun-modal-header h2 {
755
+ color: #f9fafb;
756
+ }
package/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import { ShogunButton, ShogunButtonProvider, useShogun } from './components/ShogunButton.js';
2
2
  import { ShogunConnectorOptions, ShogunConnectorResult } from './types/connector-options.js';
3
- import { shogunConnector } from './connector.js';
4
3
  export { ShogunButton, ShogunButtonProvider, useShogun };
5
- export { shogunConnector };
6
4
  export * from './types/index.js';
7
5
  export { ShogunConnectorOptions, ShogunConnectorResult };
package/dist/index.js CHANGED
@@ -1,8 +1,5 @@
1
1
  import { ShogunButton, ShogunButtonProvider, useShogun } from './components/ShogunButton.js';
2
- import { shogunConnector } from './connector.js';
3
2
  // Export components
4
3
  export { ShogunButton, ShogunButtonProvider, useShogun };
5
- // Export connector function
6
- export { shogunConnector };
7
4
  // Export all types
8
5
  export * from './types/index.js';
@@ -231,7 +231,7 @@
231
231
  margin: 0;
232
232
  font-size: 1.5rem;
233
233
  font-weight: 600;
234
- color: var(--shogun-text);
234
+ color: #111827;
235
235
  text-align: center;
236
236
  width: 100%;
237
237
  }
@@ -438,17 +438,31 @@
438
438
 
439
439
  .shogun-prominent-toggle {
440
440
  font-weight: 600;
441
- color: var(--shogun-primary);
441
+ color: #3b82f6;
442
442
  padding: 8px 16px;
443
443
  margin-top: 16px;
444
- border: none;
444
+ border: 1px solid #e5e7eb;
445
445
  border-radius: 6px;
446
- background-color: transparent;
446
+ background-color: #f9fafb;
447
447
  transition: all 0.2s ease;
448
448
  }
449
449
 
450
450
  .shogun-prominent-toggle:hover {
451
- text-decoration: underline;
451
+ background-color: #f3f4f6;
452
+ border-color: #d1d5db;
453
+ }
454
+
455
+ [data-shogun-theme="dark"] .shogun-prominent-toggle {
456
+ background-color: #1f2937;
457
+ border-color: #374151;
458
+ color: #60a5fa;
459
+ }
460
+
461
+ [data-shogun-theme="dark"] .shogun-prominent-toggle:hover {
462
+ background-color: #111827;
463
+ border-color: #4b5563;
452
464
  }
453
465
 
454
- /* Redundant dark theme styles removed */
466
+ [data-shogun-theme="dark"] .shogun-modal-header h2 {
467
+ color: #f9fafb;
468
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shogun-button-react",
3
3
  "description": "Shogun connector button",
4
- "version": "1.3.8",
4
+ "version": "1.3.41",
5
5
  "files": [
6
6
  "dist",
7
7
  "src/styles/index.css"
@@ -34,7 +34,7 @@
34
34
  "ethers": "^6.13.5",
35
35
  "prettier": "^3.5.3",
36
36
  "rxjs": "^7.8.1",
37
- "shogun-core": "^1.3.8"
37
+ "shogun-core": "latest"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "react": "^18.0.0",
@@ -231,7 +231,7 @@
231
231
  margin: 0;
232
232
  font-size: 1.5rem;
233
233
  font-weight: 600;
234
- color: var(--shogun-text);
234
+ color: #111827;
235
235
  text-align: center;
236
236
  width: 100%;
237
237
  }
@@ -438,17 +438,31 @@
438
438
 
439
439
  .shogun-prominent-toggle {
440
440
  font-weight: 600;
441
- color: var(--shogun-primary);
441
+ color: #3b82f6;
442
442
  padding: 8px 16px;
443
443
  margin-top: 16px;
444
- border: none;
444
+ border: 1px solid #e5e7eb;
445
445
  border-radius: 6px;
446
- background-color: transparent;
446
+ background-color: #f9fafb;
447
447
  transition: all 0.2s ease;
448
448
  }
449
449
 
450
450
  .shogun-prominent-toggle:hover {
451
- text-decoration: underline;
451
+ background-color: #f3f4f6;
452
+ border-color: #d1d5db;
453
+ }
454
+
455
+ [data-shogun-theme="dark"] .shogun-prominent-toggle {
456
+ background-color: #1f2937;
457
+ border-color: #374151;
458
+ color: #60a5fa;
459
+ }
460
+
461
+ [data-shogun-theme="dark"] .shogun-prominent-toggle:hover {
462
+ background-color: #111827;
463
+ border-color: #4b5563;
452
464
  }
453
465
 
454
- /* Redundant dark theme styles removed */
466
+ [data-shogun-theme="dark"] .shogun-modal-header h2 {
467
+ color: #f9fafb;
468
+ }
package/CHANGELOG.md DELETED
@@ -1,54 +0,0 @@
1
- # Changelog
2
-
3
- ## Version 1.3.4 (Latest)
4
-
5
- ### 🐛 Bug Fixes
6
- - **Export Gun Pair Fix**: Fixed issue where "Export Pair" option was not accessible from user dropdown - now works correctly without requiring disconnect
7
- - **Modal Logic Improvement**: Enhanced modal rendering logic to allow export functionality when user is already authenticated
8
- - **UX Enhancement**: Improved back button behavior in export modal - now properly closes modal when user is logged in instead of showing unnecessary auth options
9
-
10
- ### 🔧 Technical Changes
11
- - Modified component render logic to show modal even when user is logged in
12
- - Improved export form navigation for better user experience
13
- - Reordered dropdown menu items for better flow (Export Pair before Disconnect)
14
-
15
- ## Version 1.3.3
16
-
17
- ### ✨ New Features
18
- - **Import Gun Pair Login**: Aggiunta possibilità di effettuare login tramite importazione di un Gun pair esistente
19
- - **Export Gun Pair**: Funzionalità per esportare il proprio Gun pair con opzione di crittografia tramite password
20
- - **Improved UX**: Migliorata l'interfaccia utente con feedback visivi e messaggi informativi
21
-
22
- ### 🔧 Improvements
23
- - **Navigation Fix**: Il toggle "Don't have account? Sign up" ora porta alla selezione dei metodi di autenticazione invece che direttamente al form password
24
- - **Visual Feedback**: Sostituiti gli alert con feedback visivi eleganti per export/import
25
- - **Better Icons**: Aggiunte icone SVG personalizzate per import/export
26
- - **Auto-copy**: L'export del pair viene automaticamente copiato negli appunti (quando supportato dal browser)
27
- - **Enhanced Security**: Messaggi informativi per guidare l'utente nell'uso sicuro delle funzionalità
28
-
29
- ### 🛠 Technical Changes
30
- - Rimosso l'uso del metodo `on` non disponibile in ShogunCore
31
- - Definiti tipi locali per `AuthResult` per compatibilità
32
- - Migliorata gestione degli stati nel provider
33
- - Aggiunto reset completo degli stati quando si chiude il modal
34
-
35
- ### 🎨 UI/UX Enhancements
36
- - Box informativi colorati per import/export
37
- - Feedback di successo con timer automatico
38
- - Indicatori di caricamento migliorati
39
- - Messaggi di fallback per browser senza supporto clipboard
40
-
41
- ## Version 1.3.2
42
-
43
- ### Features
44
- - Basic Gun pair export/import functionality
45
- - Multi-authentication support (Password, MetaMask, WebAuthn, Nostr, OAuth)
46
- - Dark mode support
47
- - Responsive design
48
-
49
- ## Version 1.3.1
50
-
51
- ### Features
52
- - Initial release
53
- - Basic authentication flow
54
- - Provider integration