@dexterai/connect 0.12.0 → 0.13.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/dist/react.d.ts CHANGED
@@ -124,6 +124,43 @@ interface UseDexterWallet {
124
124
  }
125
125
  declare function useDexterWallet(): UseDexterWallet;
126
126
 
127
+ interface DexterWalletChipProps {
128
+ /** Connected (a wallet/account is present) → avatar + label; else signed-out label only. */
129
+ connected: boolean;
130
+ /** What to show: account name, wallet label, or the signed-out prompt (e.g. "Log in"). */
131
+ label: string;
132
+ /** Avatar image (e.g. a linked X avatar); falls back to the initial. */
133
+ avatarUrl?: string | null;
134
+ /** Single-character avatar fallback (defaults to the first letter of `label`). */
135
+ avatarInitial?: string;
136
+ onClick?: () => void;
137
+ /** Extra className composed after the brand classes. */
138
+ className?: string;
139
+ /** Reflected to aria-expanded (when the chip toggles a menu). */
140
+ ariaExpanded?: boolean;
141
+ }
142
+ /** The branded wallet/account chip. Wire it to open your menu via `onClick`. */
143
+ declare function DexterWalletChip(props: DexterWalletChipProps): ReactElement;
144
+
145
+ interface DexterWalletMenuProps {
146
+ /** The wallet's display name (nickname, else "Dexter Wallet"). */
147
+ walletLabel: string;
148
+ /** Avatar initial (defaults to the first letter of walletLabel). */
149
+ avatarInitial?: string;
150
+ /** "Manage wallet" → the consumer's wallet page. Row hidden if omitted. */
151
+ onManageWallet?: () => void;
152
+ /** "Start fresh" → the consumer ejects/resets (guard + perform on its side). Row hidden if omitted. */
153
+ onStartFresh?: () => void;
154
+ /** Sign-in/save UI revealed when "Save your wallet" is tapped (e.g. <SignInWithDexter/>). Row hidden if omitted. */
155
+ saveSlot?: ReactNode;
156
+ /** Short hint shown above the save UI. */
157
+ saveHint?: string;
158
+ /** Extra className composed after the brand classes. */
159
+ className?: string;
160
+ }
161
+ /** The branded wallet dropdown. */
162
+ declare function DexterWalletMenu(props: DexterWalletMenuProps): ReactElement;
163
+
127
164
  interface UseIdentityConfig {
128
165
  /** The account session token (e.g. a Supabase access_token), or null when the
129
166
  * user has no account session. The SDK is auth-agnostic — pass your own. */
@@ -131,4 +168,4 @@ interface UseIdentityConfig {
131
168
  }
132
169
  declare function useIdentity({ accountToken }: UseIdentityConfig): ResolvedIdentity;
133
170
 
134
- export { type ConnectStatus, DexterButton, type DexterButtonProps, DexterMark, SignInWithDexter, type SignInWithDexterProps, type UseDexterWallet, type UseIdentityConfig, type UseSignInWithDexter, type UseSignInWithDexterConfig, useDexterWallet, useIdentity, useSignInWithDexter };
171
+ export { type ConnectStatus, DexterButton, type DexterButtonProps, DexterMark, DexterWalletChip, type DexterWalletChipProps, DexterWalletMenu, type DexterWalletMenuProps, SignInWithDexter, type SignInWithDexterProps, type UseDexterWallet, type UseIdentityConfig, type UseSignInWithDexter, type UseSignInWithDexterConfig, useDexterWallet, useIdentity, useSignInWithDexter };
package/dist/react.js CHANGED
@@ -323,6 +323,136 @@ function useDexterWallet() {
323
323
  };
324
324
  }
325
325
 
326
+ // src/DexterWalletChip.tsx
327
+ import { useEffect as useEffect5 } from "react";
328
+
329
+ // src/walletKitStyles.ts
330
+ var STYLE_ID2 = "dexter-connect-wallet-kit-styles";
331
+ var WALLET_KIT_CSS = `
332
+ .dx-wchip{
333
+ --dx-ember:#f26c18; --dx-ember-2:#ba3a00; --dx-fg:#fff4ea; --dx-radius:0px;
334
+ display:inline-flex; align-items:center; gap:9px; max-width:240px;
335
+ padding:6px 12px 6px 7px; font:inherit; font-weight:600; font-size:.74rem;
336
+ letter-spacing:.1em; text-transform:uppercase; cursor:pointer; background:transparent;
337
+ color:inherit; border:1px solid color-mix(in srgb,var(--dx-ember) 42%,transparent);
338
+ border-radius:var(--dx-radius); -webkit-tap-highlight-color:transparent;
339
+ transition:filter .16s ease, box-shadow .16s ease, border-color .16s ease;
340
+ }
341
+ .dx-wchip:hover{ filter:brightness(1.08); box-shadow:0 8px 18px color-mix(in srgb,var(--dx-ember) 18%,transparent); }
342
+ .dx-wchip:focus-visible{ outline:none; box-shadow:0 0 0 3px color-mix(in srgb,var(--dx-ember) 34%,transparent); }
343
+ .dx-wchip--signedout{ border-color:color-mix(in srgb,currentColor 22%,transparent); padding-left:12px; }
344
+ .dx-wchip__avatar{
345
+ width:22px; height:22px; flex-shrink:0; display:inline-flex; align-items:center; justify-content:center;
346
+ border-radius:50%; overflow:hidden; font-size:.72rem; font-weight:700; letter-spacing:0; line-height:1;
347
+ background:linear-gradient(135deg,var(--dx-ember),var(--dx-ember-2)); color:var(--dx-fg);
348
+ }
349
+ .dx-wchip__avatar img{ width:100%; height:100%; object-fit:cover; }
350
+ .dx-wchip__label{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
351
+
352
+ .dx-wmenu{ --dx-ember:#f26c18; --dx-ember-2:#ba3a00; --dx-fg:#fff4ea; display:flex; flex-direction:column; min-width:248px; }
353
+ .dx-wmenu__id{ display:flex; align-items:center; gap:10px; padding:13px 15px; border-bottom:1px solid color-mix(in srgb,currentColor 12%,transparent); }
354
+ .dx-wmenu__avatar{ width:32px; height:32px; flex-shrink:0; display:inline-flex; align-items:center; justify-content:center; border-radius:50%; font-weight:700; font-size:.85rem; line-height:1; background:linear-gradient(135deg,var(--dx-ember),var(--dx-ember-2)); color:var(--dx-fg); }
355
+ .dx-wmenu__meta{ display:flex; flex-direction:column; gap:2px; min-width:0; }
356
+ .dx-wmenu__name{ font-weight:700; font-size:.9rem; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
357
+ .dx-wmenu__sub{ font-size:.66rem; letter-spacing:.12em; text-transform:uppercase; opacity:.55; }
358
+ .dx-wmenu__list{ display:flex; flex-direction:column; padding:6px; }
359
+ .dx-wmenu__item{ display:flex; align-items:center; justify-content:space-between; gap:10px; width:100%; padding:10px 12px; font:inherit; font-size:.82rem; font-weight:600; text-align:left; background:transparent; border:none; color:inherit; cursor:pointer; transition:background .12s ease; }
360
+ .dx-wmenu__item:hover{ background:color-mix(in srgb,var(--dx-ember) 10%,transparent); }
361
+ .dx-wmenu__item--danger{ color:#e5552e; }
362
+ .dx-wmenu__icon{ opacity:.45; font-size:.9rem; }
363
+ .dx-wmenu__back{ border-bottom:1px solid color-mix(in srgb,currentColor 10%,transparent); opacity:.85; }
364
+ .dx-wmenu__save{ display:flex; flex-direction:column; gap:9px; padding:13px 15px; }
365
+ .dx-wmenu__savehint{ font-size:.78rem; line-height:1.4; opacity:.7; }
366
+ `;
367
+ function ensureWalletKitStyles() {
368
+ if (typeof document === "undefined") return;
369
+ if (document.getElementById(STYLE_ID2)) return;
370
+ const el = document.createElement("style");
371
+ el.id = STYLE_ID2;
372
+ el.textContent = WALLET_KIT_CSS;
373
+ document.head.appendChild(el);
374
+ }
375
+ ensureWalletKitStyles();
376
+
377
+ // src/DexterWalletChip.tsx
378
+ import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
379
+ function DexterWalletChip(props) {
380
+ const { connected, label, avatarUrl, avatarInitial, onClick, className, ariaExpanded } = props;
381
+ useEffect5(ensureWalletKitStyles, []);
382
+ const initial = (avatarInitial ?? label.trim().charAt(0) ?? "D").toUpperCase();
383
+ return /* @__PURE__ */ jsxs3(
384
+ "button",
385
+ {
386
+ type: "button",
387
+ className: cx("dx-wchip", !connected && "dx-wchip--signedout", className),
388
+ onClick,
389
+ "aria-expanded": ariaExpanded,
390
+ children: [
391
+ connected ? /* @__PURE__ */ jsx3("span", { className: "dx-wchip__avatar", "aria-hidden": "true", children: avatarUrl ? /* @__PURE__ */ jsx3("img", { src: avatarUrl, alt: "" }) : initial }) : null,
392
+ /* @__PURE__ */ jsx3("span", { className: "dx-wchip__label", children: label })
393
+ ]
394
+ }
395
+ );
396
+ }
397
+
398
+ // src/DexterWalletMenu.tsx
399
+ import { useEffect as useEffect6, useState as useState3 } from "react";
400
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
401
+ function DexterWalletMenu(props) {
402
+ const { walletLabel, avatarInitial, onManageWallet, onStartFresh, saveSlot, saveHint, className } = props;
403
+ useEffect6(ensureWalletKitStyles, []);
404
+ const [showSave, setShowSave] = useState3(false);
405
+ const initial = (avatarInitial ?? walletLabel.trim().charAt(0) ?? "D").toUpperCase();
406
+ if (showSave && saveSlot) {
407
+ return /* @__PURE__ */ jsxs4("div", { className: cx("dx-wmenu", className), children: [
408
+ /* @__PURE__ */ jsx4(
409
+ "button",
410
+ {
411
+ type: "button",
412
+ className: "dx-wmenu__item dx-wmenu__back",
413
+ onClick: () => setShowSave(false),
414
+ children: /* @__PURE__ */ jsx4("span", { children: "\u2190 Back to wallet" })
415
+ }
416
+ ),
417
+ /* @__PURE__ */ jsxs4("div", { className: "dx-wmenu__save", children: [
418
+ saveHint ? /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__savehint", children: saveHint }) : null,
419
+ saveSlot
420
+ ] })
421
+ ] });
422
+ }
423
+ return /* @__PURE__ */ jsxs4("div", { className: cx("dx-wmenu", className), children: [
424
+ /* @__PURE__ */ jsxs4("div", { className: "dx-wmenu__id", children: [
425
+ /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__avatar", "aria-hidden": "true", children: initial }),
426
+ /* @__PURE__ */ jsxs4("span", { className: "dx-wmenu__meta", children: [
427
+ /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__name", children: walletLabel }),
428
+ /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__sub", children: "Your Dexter Wallet" })
429
+ ] })
430
+ ] }),
431
+ /* @__PURE__ */ jsxs4("div", { className: "dx-wmenu__list", children: [
432
+ onManageWallet ? /* @__PURE__ */ jsxs4("button", { type: "button", className: "dx-wmenu__item", onClick: onManageWallet, children: [
433
+ /* @__PURE__ */ jsx4("span", { children: "Manage wallet" }),
434
+ /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__icon", "aria-hidden": "true", children: "\u2197" })
435
+ ] }) : null,
436
+ saveSlot ? /* @__PURE__ */ jsxs4("button", { type: "button", className: "dx-wmenu__item", onClick: () => setShowSave(true), children: [
437
+ /* @__PURE__ */ jsx4("span", { children: "Save your wallet" }),
438
+ /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__icon", "aria-hidden": "true", children: "\u2197" })
439
+ ] }) : null,
440
+ onStartFresh ? /* @__PURE__ */ jsxs4(
441
+ "button",
442
+ {
443
+ type: "button",
444
+ className: "dx-wmenu__item dx-wmenu__item--danger",
445
+ onClick: onStartFresh,
446
+ children: [
447
+ /* @__PURE__ */ jsx4("span", { children: "Start fresh" }),
448
+ /* @__PURE__ */ jsx4("span", { className: "dx-wmenu__icon", "aria-hidden": "true", children: "\u27F5" })
449
+ ]
450
+ }
451
+ ) : null
452
+ ] })
453
+ ] });
454
+ }
455
+
326
456
  // src/useIdentity.ts
327
457
  import { useMemo as useMemo2 } from "react";
328
458
  function useIdentity({ accountToken }) {
@@ -338,6 +468,8 @@ function useIdentity({ accountToken }) {
338
468
  export {
339
469
  DexterButton,
340
470
  DexterMark,
471
+ DexterWalletChip,
472
+ DexterWalletMenu,
341
473
  SignInWithDexter,
342
474
  useDexterWallet,
343
475
  useIdentity,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dexterai/connect",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Sign in with Dexter — passkey connector. Composes @dexterai/vault.",
5
5
  "type": "module",
6
6
  "exports": {