@bwalletx/connect 0.1.0 → 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.
Files changed (51) hide show
  1. package/BRAND.md +84 -0
  2. package/README.md +83 -0
  3. package/TRADEMARKS.md +9 -0
  4. package/assets/bwalletx-mark-circle.svg +1 -0
  5. package/assets/bwalletx-mark.svg +1 -0
  6. package/assets/signin-dark.svg +8 -0
  7. package/assets/signin-gold.svg +8 -0
  8. package/assets/signin-light.svg +8 -0
  9. package/assets/snippet.html +17 -0
  10. package/dist/bwalletx-connect.global.js +48 -2
  11. package/dist/bwalletx-connect.global.js.map +1 -1
  12. package/dist/bwalletx-shell.global.js +54 -0
  13. package/dist/bwalletx-shell.global.js.map +1 -0
  14. package/dist/chunk-NNMUSWPG.js +649 -0
  15. package/dist/chunk-NNMUSWPG.js.map +1 -0
  16. package/dist/chunk-OMEKHKMM.js +530 -0
  17. package/dist/chunk-OMEKHKMM.js.map +1 -0
  18. package/dist/element.cjs +665 -0
  19. package/dist/element.cjs.map +1 -0
  20. package/dist/element.d.cts +29 -0
  21. package/dist/element.d.ts +29 -0
  22. package/dist/element.js +24 -0
  23. package/dist/element.js.map +1 -0
  24. package/dist/index.cjs +218 -2
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +1 -0
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.js +31 -426
  29. package/dist/index.js.map +1 -1
  30. package/dist/manifest-Caj_Raqm.d.cts +81 -0
  31. package/dist/manifest-Caj_Raqm.d.ts +81 -0
  32. package/dist/react.cjs +700 -0
  33. package/dist/react.cjs.map +1 -0
  34. package/dist/react.d.cts +70 -0
  35. package/dist/react.d.ts +70 -0
  36. package/dist/react.js +59 -0
  37. package/dist/react.js.map +1 -0
  38. package/dist/shell-react.cjs +361 -0
  39. package/dist/shell-react.cjs.map +1 -0
  40. package/dist/shell-react.d.cts +58 -0
  41. package/dist/shell-react.d.ts +58 -0
  42. package/dist/shell-react.js +52 -0
  43. package/dist/shell-react.js.map +1 -0
  44. package/dist/shell.cjs +578 -0
  45. package/dist/shell.cjs.map +1 -0
  46. package/dist/shell.d.cts +132 -0
  47. package/dist/shell.d.ts +132 -0
  48. package/dist/shell.js +51 -0
  49. package/dist/shell.js.map +1 -0
  50. package/package.json +79 -6
  51. package/schema/bapp.schema.json +95 -0
package/BRAND.md ADDED
@@ -0,0 +1,84 @@
1
+ # Sign in with bWalletX: brand guidelines
2
+
3
+ The standard button is the gold one from bit-sign's sign-in card. Use `<bwalletx-signin>` (or the React wrapper) and you get it right by default. These rules are for when you place it, size it, or draw your own.
4
+
5
+ ## Variants and where to use them
6
+
7
+ | Variant | Use it for |
8
+ |---|---|
9
+ | `theme="gold"` (default) | The main way in. Sign-in pages, the first button in a list of sign-in options. |
10
+ | `theme="dark"` | Dark UIs where gold would compete with your own primary button, or a secondary row of sign-in options. |
11
+ | `theme="light"` | Light pages, and lists of outlined "Continue with …" buttons beside Google, Apple and so on. |
12
+ | `size="lg"` (default) | Sign-in cards and landing pages. Shows the subtitle. |
13
+ | `size="md"` | Dialogs and narrow cards. Shows the subtitle. |
14
+ | `size="sm"` | Navigation bars and toolbars. No subtitle. |
15
+ | `size="icon"` | Only where space is very tight and the context already says "sign in" (a row of provider icons). Always keep the aria-label. |
16
+ | `label="signin"` / `"continue"` / `"connect"` | "Sign in with" on sign-in pages, "Continue with" in mixed provider lists and onboarding, "Connect" when the user is already signed in and is linking a wallet. |
17
+ | `brand="bWallet"` | Store builds and pages shown inside the App Store / Play edition. Drops the subtitle. |
18
+
19
+ ## Do
20
+
21
+ - Keep the black circle with the gold "b" on the left of the text.
22
+ - Keep the text exactly as given ("Sign in with bWalletX", "Continue with bWalletX", "Connect bWalletX"). Translations are fine.
23
+ - Give the gold button the most prominent position when bWalletX is your main sign-in.
24
+ - Keep the subtitle "also works with bWallet" on lg and md, so store users know the button is for them.
25
+ - Make it the same height as the other sign-in buttons next to it.
26
+
27
+ ## Don't
28
+
29
+ - Don't recolour the gold, change the gradient direction, or put the mark on a coloured circle.
30
+ - Don't stretch, rotate, outline or add effects to the mark.
31
+ - Don't use the "b" mark alone as a generic Bitcoin or wallet icon.
32
+ - Don't write "BWalletX", "bwalletx", "B Wallet X" or "bWallet X" in the button.
33
+ - Don't make the bWalletX button smaller or less visible than other providers' buttons in the same list.
34
+ - Don't imply that bWalletX endorses your product.
35
+
36
+ ## Minimum sizes
37
+
38
+ | | Minimum |
39
+ |---|---|
40
+ | Button height | 36px (`sm`). 48px or more on touch screens (`md`, `lg`, `icon`). |
41
+ | Icon-only button | 40px across. 48px recommended. |
42
+ | Mark on its own | 16px tall on screen, 6mm in print. |
43
+ | Label text | 13px. Subtitle 10.5px, and only on `md` and `lg`. |
44
+
45
+ ## Clear space
46
+
47
+ Leave space around the button equal to half its height (at least 8px) free of other text and logos. Around the mark on its own, leave the width of the mark's bowl (about a third of the mark's height).
48
+
49
+ ## Colours
50
+
51
+ | Token | Value |
52
+ |---|---|
53
+ | Gold gradient top / bottom | `#fcd34d` → `#f59e0b` (hover `#fde68a` → `#fbbf24`) |
54
+ | Mark gradient | `#FFE58A` → `#FFD24D` (55%) → `#C98F00` |
55
+ | Mark circle | `#000000` |
56
+ | Label on gold | `#000000`, subtitle `rgba(0,0,0,.65)` |
57
+ | Corner radius | 12px (lg), 10px (md), 8px (sm), round (icon) |
58
+ | Shadow (gold) | `0 10px 15px -3px rgba(245,158,11,.2), 0 4px 6px -4px rgba(245,158,11,.2)` |
59
+
60
+ Black on the gold gradient is above 9:1, and the subtitle stays above 4.5:1 (WCAG AA) at every point of the gradient.
61
+
62
+ ## bApp shell (bar, top bar, drawer)
63
+
64
+ The shell copies the bWalletX dock exactly. Don't restyle it per app; `theme.accent` in bapp.json is the only override.
65
+
66
+ | Token | Value |
67
+ |---|---|
68
+ | Bar | 88px, background `#0A0B0D`, 1px top hairline `#1C1C1E` |
69
+ | Slot icons | 20px, inactive `#F2F2F0`, active `#FFD24D` |
70
+ | Slot labels | 10px, `#98A2B3`; active gold and bold |
71
+ | (b) | 52px black disc, 2px gold ring, snug in the bar (no float gap) |
72
+ | Disabled slot | 35% opacity, not clickable, never hidden |
73
+ | Top bar | 28px strip + 56px row; round 36px tools, ring `#2A2A2C`, icons `#F5B800` |
74
+ | Order | Wallet · Exchange · (b) · Feed · Chat. Top left: ☰ (in the wallet) then the app icon; ✕ on the right in the wallet |
75
+
76
+ Wording on Feed likes: "fund", "back", "support". Never "invest", "returns" or "earn".
77
+
78
+ ## Files
79
+
80
+ `assets/` has the mark (`bwalletx-mark.svg`, `bwalletx-mark-circle.svg`), full buttons (`signin-gold.svg`, `signin-dark.svg`, `signin-light.svg`) and a no-JavaScript HTML/CSS version (`snippet.html`).
81
+
82
+ ## Trademarks
83
+
84
+ The code in this package is MIT. The names bWalletX and bWallet, and the "b" mark, are not covered by that licence. See [TRADEMARKS.md](./TRADEMARKS.md).
package/README.md CHANGED
@@ -14,6 +14,45 @@ pnpm add @bwalletx/connect @bsv/sdk
14
14
 
15
15
  `@bsv/sdk` (2.2 or later, 2.x or 3.x) is a peer dependency.
16
16
 
17
+ ## The button
18
+
19
+ `<bwalletx-signin>` is the standard "Sign in with bWalletX" button: a web component with no dependencies (Shadow DOM), plus a React wrapper. It is the gold button from bit-sign's sign-in card.
20
+
21
+ ```html
22
+ <script src="https://unpkg.com/@bwalletx/connect@0.2.0"></script>
23
+ <bwalletx-signin challenge-url="/auth/bwalletx/challenge" verify-url="/auth/bwalletx/verify"></bwalletx-signin>
24
+ <script>
25
+ document.addEventListener('bwalletx-signed-in', (e) => location.assign('/'));
26
+ </script>
27
+ ```
28
+
29
+ With a bundler: `import '@bwalletx/connect/element'` registers the element. In React:
30
+
31
+ ```tsx
32
+ import { BwalletxSignin } from '@bwalletx/connect/react';
33
+
34
+ <BwalletxSignin challengeUrl="/auth/bwalletx/challenge" verifyUrl="/auth/bwalletx/verify" onSignedIn={(d) => console.log(d.identityKey)} />
35
+ ```
36
+
37
+ | Attribute | Values |
38
+ |---|---|
39
+ | `size` | `lg` (default), `md`, `sm`, `icon` |
40
+ | `theme` | `gold` (default), `dark`, `light` |
41
+ | `label` | `signin` (default), `continue`, `connect` |
42
+ | `brand` | `bWalletX` (default), `bWallet` (store edition) |
43
+ | `subtitle` | `on`, `off`, or your own text. Default "also works with bWallet" on lg/md |
44
+ | `full-width`, `loading`, `disabled` | flags |
45
+ | `challenge-url`, `verify-url` | run the sign-in flow on click: POST `{ identityKey }`, then POST `{ identityKey, nonce, signature }` |
46
+ | `get-url`, `web-url` | where "Get bWalletX" and the web wallet link go (bwalletx.com/get, web.bwalletx.com) |
47
+ | `href` | navigate on click instead |
48
+ | `authorize-url`, `client-id`, `redirect-uri`, `scope` | OAuth 2.1 redirect with S256 PKCE (verifier, state and nonce in `sessionStorage["bwalletx:oauth"]`). For auth.bwalletx.com, which is planned and not live yet |
49
+
50
+ Events (bubbling, composed): `bwalletx-signin` on every click (call `preventDefault()` to run your own flow instead), `bwalletx-signed-in` with `{ identityKey, method, nonce, signature, response }`, `bwalletx-not-found` (the button then shows "Get bWalletX" and a web wallet link), `bwalletx-error` with `{ error }`.
51
+
52
+ Without `challenge-url`, `href` or `authorize-url` the button only fires `bwalletx-signin`. The built-in flow uses the extension or in-app browser only. For phone pairing, listen for `bwalletx-signin`, call `preventDefault()`, and call `signInWithBwalletX` with `pairing` as shown above.
53
+
54
+ SVG files, and an HTML/CSS version with no JavaScript, are in `assets/`. All variants: `examples/buttons.html`. Placement, sizes and do/don't: [BRAND.md](./BRAND.md). The names and logo are not MIT licensed: [TRADEMARKS.md](./TRADEMARKS.md).
55
+
17
56
  ## Server
18
57
 
19
58
  ```ts
@@ -153,6 +192,50 @@ The phone sends a plain `hello` and then, as soon as the user taps Connect, an e
153
192
 
154
193
  This build includes `@bsv/sdk` (about 125 KB minified). The server functions are not in it.
155
194
 
195
+ ## bApp shell
196
+
197
+ `@bwalletx/connect/shell` gives every bApp the same 5-slot bar as the bWalletX dock: **Wallet · Exchange · (b) · Feed · Chat**, each scoped to your app. Your app's Home and sections live in a drawer opened from the app icon, top left. On the web the package draws the bar; inside bWalletX it hides it and the wallet's native dock drives your app instead.
198
+
199
+ ![bApp shell at 390px](docs/screens/shell-390.png)
200
+
201
+ 1. Serve `/.well-known/bapp.json` (schema: [`schema/bapp.schema.json`](schema/bapp.schema.json), sample: [`examples/bapp.bmovies.json`](examples/bapp.bmovies.json)). All paths are same-origin; a slot you don't use is `"enabled": false` (shown greyed out, never hidden).
202
+ 2. Add the elements:
203
+
204
+ ```html
205
+ <bwalletx-topbar drawer="sections"></bwalletx-topbar>
206
+ <main>…</main>
207
+ <bwalletx-drawer id="sections"></bwalletx-drawer>
208
+ <bwalletx-bar active="feed"></bwalletx-bar>
209
+ <script type="module">
210
+ import { defineBappShell, loadManifest, applyManifest, startShellBridge } from '@bwalletx/connect/shell';
211
+ defineBappShell();
212
+ const manifest = await loadManifest(); // fetches and validates /.well-known/bapp.json
213
+ applyManifest(manifest);
214
+ startShellBridge({ manifest }); // inside bWalletX: hide the bar, follow the wallet's dock
215
+ </script>
216
+ ```
217
+
218
+ React:
219
+
220
+ ```tsx
221
+ import { BappTopbar, BappDrawer, BappBar } from '@bwalletx/connect/shell/react';
222
+ <BappTopbar manifest={m} drawer="sections" />
223
+ <BappDrawer id="sections" manifest={m} manualNavigation onNavigate={(d) => router.push(d.path!)} />
224
+ <BappBar manifest={m} active={slot} manualNavigation onNavigate={(d) => router.push(d.path!)} />
225
+ ```
226
+
227
+ No bundler: `<script src="https://unpkg.com/@bwalletx/connect/dist/bwalletx-shell.global.js">` registers the elements and exposes `window.bWalletXShell`.
228
+
229
+ | Element | Attributes | Events (bubble, composed) |
230
+ |---|---|---|
231
+ | `<bwalletx-bar>` | `active`, `in-wallet` (`auto`/`true`/`false`), `navigate="manual"`; property `manifest` | `bapp-navigate {slot, path}` (cancelable), `bapp-active {slot}`, `bapp-b-press`, `bapp-b-hold {phase}` |
232
+ | `<bwalletx-topbar>` | `title`, `subtitle`, `drawer` (id), `menu="true"`, `strip="off"`, `in-wallet`; slots `strip-left`, `strip-right`, `tools` | `bapp-menu`, `bapp-close`, `bapp-drawer-toggle` (cancelable) |
233
+ | `<bwalletx-drawer>` | `open`, `current` (path), `in-wallet`, `navigate="manual"` | `bapp-navigate {path}` (cancelable), `bapp-close` |
234
+
235
+ `bapp-navigate` goes to the manifest path with `location.assign` unless you call `preventDefault()` or set `navigate="manual"`, so SPAs route themselves. Inside the wallet, ☰ and ✕ appear in the top bar and the drawer gets "Back to bWalletX".
236
+
237
+ API: `validateManifest(json)` → `{ok, manifest, errors}`, `parseManifest`, `loadManifest(path?)`, `isSameOriginPath`, `slotPath`, `detectWalletUA(ua?)`, `walletState()`, `ShellBridge` / `startShellBridge({manifest, walletOrigins?})`, `defineBappShell()`, `applyManifest(m)`, `TOKENS`. The wallet message protocol is in [docs/SHELL-PROTOCOL.md](docs/SHELL-PROTOCOL.md). Demo: `examples/shell.html` (after `pnpm build`; `?wallet=1` shows the in-wallet top bar, `#drawer` opens the drawer).
238
+
156
239
  ## Limits
157
240
 
158
241
  - You get the identity key and nothing else: no handle, paymail or name.
package/TRADEMARKS.md ADDED
@@ -0,0 +1,9 @@
1
+ # Trademarks
2
+
3
+ bWalletX, bWallet and the gold "b" mark are trademarks of The Bitcoin Corporation Ltd. The MIT licence in [LICENSE](./LICENSE) covers the code in this package. It does not grant any right to the names or the logo.
4
+
5
+ You may use the names and the mark, unchanged, to let your users sign in with bWalletX or bWallet: the button in this package, the SVG files in `assets/`, and text such as "Sign in with bWalletX". Follow [BRAND.md](./BRAND.md) when you do.
6
+
7
+ You may not use them in your own product, company or domain name, in a way that suggests bWalletX sponsors or endorses you, or in a changed form.
8
+
9
+ Questions: https://bwalletx.com
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" role="img" aria-label="bWalletX"><defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="0" y1="12" x2="0" y2="105"><stop offset="0" stop-color="#FFE58A"/><stop offset=".55" stop-color="#FFD24D"/><stop offset="1" stop-color="#C98F00"/></linearGradient><mask id="h"><rect width="140" height="140" fill="#fff"/><circle cx="60" cy="72" r="15" fill="#000"/></mask></defs><circle cx="60" cy="60" r="60" fill="#000"/><g transform="translate(60 60) scale(.62) translate(-60 -58)"><g fill="url(#g)" mask="url(#h)"><polygon points="45,12 45,76 27,76 27,30"/><circle cx="60" cy="72" r="33"/></g></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="23 8 74 100" role="img" aria-label="bWalletX"><defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="0" y1="12" x2="0" y2="105"><stop offset="0" stop-color="#FFE58A"/><stop offset=".55" stop-color="#FFD24D"/><stop offset="1" stop-color="#C98F00"/></linearGradient><mask id="h"><rect width="140" height="140" fill="#fff"/><circle cx="60" cy="72" r="15" fill="#000"/></mask></defs><g fill="url(#g)" mask="url(#h)"><polygon points="45,12 45,76 27,76 27,30"/><circle cx="60" cy="72" r="33"/></g></svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="260" height="60" viewBox="0 0 260 60" role="img" aria-label="Sign in with bWalletX, also works with bWallet">
2
+ <defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="0" y1="12" x2="0" y2="105"><stop offset="0" stop-color="#FFE58A"/><stop offset=".55" stop-color="#FFD24D"/><stop offset="1" stop-color="#C98F00"/></linearGradient><mask id="h"><rect width="140" height="140" fill="#fff"/><circle cx="60" cy="72" r="15" fill="#000"/></mask><linearGradient id="bg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs>
3
+ <rect x="1" y=".5" width="252" height="59" rx="12" fill="#0a0a0a" stroke="#3f3f46" stroke-width="1"/>
4
+ <circle cx="38" cy="30" r="14" fill="#000"/>
5
+ <g transform="translate(38 30) scale(.2) translate(-60 -58)"><g fill="url(#g)" mask="url(#h)"><polygon points="45,12 45,76 27,76 27,30"/><circle cx="60" cy="72" r="33"/></g></g>
6
+ <text x="64" y="28" font-family="Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="700" fill="#fafafa">Sign in with bWalletX</text>
7
+ <text x="64" y="42" font-family="Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="500" fill="rgba(255,255,255,.65)">also works with bWallet</text>
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="260" height="60" viewBox="0 0 260 60" role="img" aria-label="Sign in with bWalletX, also works with bWallet">
2
+ <defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="0" y1="12" x2="0" y2="105"><stop offset="0" stop-color="#FFE58A"/><stop offset=".55" stop-color="#FFD24D"/><stop offset="1" stop-color="#C98F00"/></linearGradient><mask id="h"><rect width="140" height="140" fill="#fff"/><circle cx="60" cy="72" r="15" fill="#000"/></mask><linearGradient id="bg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs>
3
+ <rect x="0" y=".5" width="252" height="59" rx="12" fill="url(#bg)" stroke="none" stroke-width="0"/>
4
+ <circle cx="38" cy="30" r="14" fill="#000"/>
5
+ <g transform="translate(38 30) scale(.2) translate(-60 -58)"><g fill="url(#g)" mask="url(#h)"><polygon points="45,12 45,76 27,76 27,30"/><circle cx="60" cy="72" r="33"/></g></g>
6
+ <text x="64" y="28" font-family="Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="700" fill="#000">Sign in with bWalletX</text>
7
+ <text x="64" y="42" font-family="Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="500" fill="rgba(0,0,0,.65)">also works with bWallet</text>
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="260" height="60" viewBox="0 0 260 60" role="img" aria-label="Sign in with bWalletX, also works with bWallet">
2
+ <defs><linearGradient id="g" gradientUnits="userSpaceOnUse" x1="0" y1="12" x2="0" y2="105"><stop offset="0" stop-color="#FFE58A"/><stop offset=".55" stop-color="#FFD24D"/><stop offset="1" stop-color="#C98F00"/></linearGradient><mask id="h"><rect width="140" height="140" fill="#fff"/><circle cx="60" cy="72" r="15" fill="#000"/></mask><linearGradient id="bg" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#fcd34d"/><stop offset="1" stop-color="#f59e0b"/></linearGradient></defs>
3
+ <rect x="1" y=".5" width="252" height="59" rx="12" fill="#ffffff" stroke="#d4d4d8" stroke-width="1"/>
4
+ <circle cx="38" cy="30" r="14" fill="#000"/>
5
+ <g transform="translate(38 30) scale(.2) translate(-60 -58)"><g fill="url(#g)" mask="url(#h)"><polygon points="45,12 45,76 27,76 27,30"/><circle cx="60" cy="72" r="33"/></g></g>
6
+ <text x="64" y="28" font-family="Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="16" font-weight="700" fill="#09090b">Sign in with bWalletX</text>
7
+ <text x="64" y="42" font-family="Inter, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif" font-size="11" font-weight="500" fill="#52525b">also works with bWallet</text>
8
+ </svg>
@@ -0,0 +1,17 @@
1
+ <!-- "Sign in with bWalletX" without JavaScript or a build step. Gold, large. Wire the click yourself. -->
2
+ <style>
3
+ .bwx-btn{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:12px;padding:16px 20px;border-radius:12px;cursor:pointer;
4
+ background:linear-gradient(180deg,#fcd34d,#f59e0b);color:#000;font:700 16px/1.2 Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
5
+ box-shadow:0 10px 15px -3px rgba(245,158,11,.2),0 4px 6px -4px rgba(245,158,11,.2)}
6
+ .bwx-btn:hover{background:linear-gradient(180deg,#fde68a,#fbbf24)}
7
+ .bwx-btn:active{background:linear-gradient(180deg,#fbbf24,#d97706)}
8
+ .bwx-btn:focus-visible{outline:2px solid #b45309;outline-offset:3px}
9
+ .bwx-btn:disabled{opacity:.6;cursor:not-allowed}
10
+ .bwx-btn .bwx-mark{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;background:#000;flex:none}
11
+ .bwx-btn .bwx-txt{display:flex;flex-direction:column;align-items:flex-start}
12
+ .bwx-btn small{font-size:11px;font-weight:500;color:rgba(0,0,0,.65)}
13
+ </style>
14
+ <button type="button" class="bwx-btn" aria-label="Sign in with bWalletX, also works with bWallet">
15
+ <span class="bwx-mark"><svg viewBox="23 8 74 100" width="15" height="20" aria-hidden="true"><defs><linearGradient id="bwxg" gradientUnits="userSpaceOnUse" x1="0" y1="12" x2="0" y2="105"><stop offset="0" stop-color="#FFE58A"/><stop offset=".55" stop-color="#FFD24D"/><stop offset="1" stop-color="#C98F00"/></linearGradient><mask id="bwxh"><rect width="140" height="140" fill="#fff"/><circle cx="60" cy="72" r="15" fill="#000"/></mask></defs><g fill="url(#bwxg)" mask="url(#bwxh)"><polygon points="45,12 45,76 27,76 27,30"/><circle cx="60" cy="72" r="33"/></g></svg></span>
16
+ <span class="bwx-txt">Sign in with bWalletX<small>also works with bWallet</small></span>
17
+ </button>