@superlogic/spree-pay 0.4.2 → 0.4.8

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/build/index.css CHANGED
@@ -695,6 +695,9 @@
695
695
  background-color: color-mix(in oklab, var(--s-warning) 10%, transparent);
696
696
  }
697
697
  }
698
+ .sl-spreepay .bg-\(--s-warning-subtle\) {
699
+ background-color: var(--s-warning-subtle);
700
+ }
698
701
  .sl-spreepay .bg-\(--secondary\) {
699
702
  background-color: var(--secondary);
700
703
  }
@@ -1408,14 +1411,9 @@
1408
1411
  translate: var(--tw-translate-x) var(--tw-translate-y);
1409
1412
  }
1410
1413
  }
1411
- .sl-spreepay .data-\[state\=checked\]\:border-\(--primary\) {
1414
+ .sl-spreepay .data-\[state\=checked\]\:border-\(--s-brand\) {
1412
1415
  &[data-state=checked] {
1413
- border-color: var(--primary);
1414
- }
1415
- }
1416
- .sl-spreepay .data-\[state\=checked\]\:bg-\(--primary\) {
1417
- &[data-state=checked] {
1418
- background-color: var(--primary);
1416
+ border-color: var(--s-brand);
1419
1417
  }
1420
1418
  }
1421
1419
  .sl-spreepay .data-\[state\=checked\]\:bg-\(--s-brand\) {
@@ -1592,13 +1590,6 @@
1592
1590
  }
1593
1591
  }
1594
1592
  }
1595
- .sl-spreepay .dark\:data-\[state\=checked\]\:bg-\(--primary\) {
1596
- &:is(.dark *) {
1597
- &[data-state=checked] {
1598
- background-color: var(--primary);
1599
- }
1600
- }
1601
- }
1602
1593
  .sl-spreepay .\[\&_a\]\:underline {
1603
1594
  & a {
1604
1595
  text-decoration-line: underline;
package/build/index.js CHANGED
@@ -8,10 +8,10 @@ import {
8
8
  getSplitAmount,
9
9
  getTransactionFee,
10
10
  useSlapiBalance
11
- } from "./chunk-LXX5P2LL.js";
11
+ } from "./chunk-W43VOUYP.js";
12
12
  import {
13
13
  Iframe3ds
14
- } from "./chunk-4ELDS4N4.js";
14
+ } from "./chunk-EXKCBGNL.js";
15
15
  import {
16
16
  InfoBanner,
17
17
  LogLevel,
@@ -23,6 +23,7 @@ import {
23
23
  StaticConfigProvider,
24
24
  cn,
25
25
  configureLogger,
26
+ isNewCard,
26
27
  logger,
27
28
  registerApi,
28
29
  useSpreePay,
@@ -31,10 +32,10 @@ import {
31
32
  useSpreePayRegister,
32
33
  useSpreePaymentMethod,
33
34
  useStaticConfig
34
- } from "./chunk-I35SE3K2.js";
35
+ } from "./chunk-SKM7ZAUY.js";
35
36
 
36
37
  // src/SpreePay.tsx
37
- import { useCallback as useCallback7, useEffect as useEffect8, useMemo as useMemo7, useState as useState11 } from "react";
38
+ import { useCallback as useCallback8, useEffect as useEffect8, useMemo as useMemo9, useState as useState12 } from "react";
38
39
  import NiceModal4 from "@ebay/nice-modal-react";
39
40
  import { SWRConfig } from "swr";
40
41
 
@@ -42,7 +43,7 @@ import { SWRConfig } from "swr";
42
43
  import { Suspense, lazy } from "react";
43
44
 
44
45
  // src/components/CreditCardTab/CreditCardTab.tsx
45
- import { useCallback as useCallback5, useEffect as useEffect6 } from "react";
46
+ import { useCallback as useCallback6, useEffect as useEffect6, useState as useState10 } from "react";
46
47
 
47
48
  // src/hooks/payments/useCardPayment.ts
48
49
  import NiceModal from "@ebay/nice-modal-react";
@@ -540,25 +541,27 @@ var useSplitCardPayments = (mode = "web2") => {
540
541
  };
541
542
 
542
543
  // src/hooks/useCards.ts
544
+ import { useMemo } from "react";
543
545
  import useSWR from "swr";
544
546
  var URL = "/v1/payments/cards";
545
547
  var useCards = () => {
546
548
  const { origin } = useSpreePayEnv();
547
549
  const { data, isLoading, mutate } = useSWR(origin ? `${URL}?origin=${origin}` : URL);
550
+ const cards = useMemo(() => data?.data.filter((c) => c.active) ?? [], [data]);
548
551
  return {
549
- cards: data?.data.filter((c) => c.active) || [],
552
+ cards,
550
553
  cardsIsLoading: isLoading,
551
554
  mutateCards: mutate
552
555
  };
553
556
  };
554
557
 
555
558
  // src/components/CreditCardTab/CreditCard/CreditCard.tsx
556
- import { useMemo, useState as useState3 } from "react";
559
+ import { useCallback as useCallback2, useMemo as useMemo3, useState as useState3 } from "react";
557
560
  import { Elements } from "@stripe/react-stripe-js";
558
561
  import { loadStripe } from "@stripe/stripe-js";
559
562
 
560
563
  // src/components/CreditCardTab/CreditCard/CardsList.tsx
561
- import { useState } from "react";
564
+ import { useMemo as useMemo2, useState } from "react";
562
565
  import { jsx, jsxs } from "react/jsx-runtime";
563
566
  var CardListItem = ({ card, isSelected, onSelect, onRemove }) => {
564
567
  const [isRemoving, setIsRemoving] = useState(false);
@@ -624,19 +627,22 @@ var CardListItem = ({ card, isSelected, onSelect, onRemove }) => {
624
627
  }
625
628
  );
626
629
  };
627
- var CardsList = ({ selectedCard, setCard }) => {
630
+ var CardsList = ({ selectedCard, setCard, newCards, onRemoveNewCard }) => {
628
631
  const { cards, cardsIsLoading, mutateCards } = useCards();
632
+ const allCards = useMemo2(() => [...cards, ...newCards], [cards, newCards]);
629
633
  const handleRemove = async (card) => {
630
- if ("cardId" in card) {
634
+ if (isNewCard(card)) {
635
+ onRemoveNewCard(card);
636
+ } else {
631
637
  await SlapiPaymentService.removeCard({ cardId: card.id });
638
+ mutateCards((data) => ({ ...data, data: (data?.data ?? []).filter((c) => c.id !== card.id) }));
632
639
  }
633
- mutateCards((data) => ({ ...data, data: (data?.data ?? []).filter((c) => c.id !== card.id) }));
634
640
  };
635
641
  if (cardsIsLoading) {
636
642
  return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-col", children: /* @__PURE__ */ jsx("div", { className: "h-11 animate-pulse rounded-sm bg-(--s-primary)" }) });
637
643
  }
638
- if (cards.length === 0) return null;
639
- return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-col gap-4", children: cards.map((card) => /* @__PURE__ */ jsx(
644
+ if (allCards.length === 0) return null;
645
+ return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-col gap-4", children: allCards.map((card) => /* @__PURE__ */ jsx(
640
646
  CardListItem,
641
647
  {
642
648
  isSelected: selectedCard?.id === card.id,
@@ -649,7 +655,7 @@ var CardsList = ({ selectedCard, setCard }) => {
649
655
  };
650
656
 
651
657
  // src/components/CreditCardTab/CreditCard/CreditCardForm.tsx
652
- import { useCallback, useEffect, useId, useRef, useState as useState2 } from "react";
658
+ import { useCallback, useEffect, useRef, useState as useState2 } from "react";
653
659
  import { CardCvcElement, CardExpiryElement, CardNumberElement, useElements, useStripe } from "@stripe/react-stripe-js";
654
660
 
655
661
  // src/ui/button.tsx
@@ -703,7 +709,7 @@ function Checkbox({ className, ...props }) {
703
709
  {
704
710
  "data-slot": "checkbox",
705
711
  className: cn(
706
- "peer border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-sm border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-(--primary) data-[state=checked]:bg-(--primary) data-[state=checked]:text-(--inverse) dark:data-[state=checked]:bg-(--primary)",
712
+ "peer border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-sm border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-(--s-brand) data-[state=checked]:bg-(--s-brand) data-[state=checked]:text-(--inverse)",
707
713
  className
708
714
  ),
709
715
  ...props,
@@ -734,7 +740,7 @@ var CreditCardForm = ({ cancel, saveCard }) => {
734
740
  const formRef = useRef(null);
735
741
  const elements = useElements();
736
742
  const stripe = useStripe();
737
- const id = useId();
743
+ const [id] = useState2(() => crypto.randomUUID());
738
744
  const computeStripeStyles = useCallback(() => {
739
745
  const formRefCurrent = formRef.current;
740
746
  if (typeof window === "undefined" || !formRefCurrent) return {};
@@ -859,13 +865,12 @@ var CreditCardForm = ({ cancel, saveCard }) => {
859
865
  // src/components/CreditCardTab/CreditCard/CreditCard.tsx
860
866
  import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
861
867
  var StripeWrapper = ({ onCancel, saveNewCard, publicKey }) => {
862
- const stripePromise = useMemo(() => loadStripe(publicKey), [publicKey]);
868
+ const stripePromise = useMemo3(() => loadStripe(publicKey), [publicKey]);
863
869
  return /* @__PURE__ */ jsx5(Elements, { stripe: stripePromise, children: /* @__PURE__ */ jsx5(CreditCardForm, { cancel: onCancel, saveCard: saveNewCard }) });
864
870
  };
865
- var CreditCard = () => {
871
+ var CreditCard = ({ newCards, setNewCards }) => {
866
872
  const [showForm, setShowForm] = useState3(false);
867
873
  const { selectedPaymentMethod, setSelectedPaymentMethod } = useSpreePaymentMethod();
868
- const { mutateCards } = useCards();
869
874
  const { spreePayConfig } = useSpreePayConfig();
870
875
  const setCard = (card) => {
871
876
  const isAlreadySelected = selectedPaymentMethod?.type === "CREDIT_CARD" /* CREDIT_CARD */ && selectedPaymentMethod.method?.id === card.id;
@@ -876,10 +881,16 @@ var CreditCard = () => {
876
881
  });
877
882
  };
878
883
  const saveNewCard = (newCard) => {
879
- mutateCards((data) => ({ ...data, data: [...data?.data ?? [], newCard] }), { revalidate: false });
884
+ setNewCards((prev) => [...prev, newCard]);
880
885
  setCard(newCard);
881
886
  setShowForm(false);
882
887
  };
888
+ const removeNewCard = useCallback2(
889
+ (card) => {
890
+ setNewCards((prev) => prev.filter((c) => c.id !== card.id));
891
+ },
892
+ [setNewCards]
893
+ );
883
894
  const handleCancel = () => {
884
895
  setShowForm(false);
885
896
  };
@@ -890,7 +901,9 @@ var CreditCard = () => {
890
901
  CardsList,
891
902
  {
892
903
  selectedCard: selectedPaymentMethod?.type === "CREDIT_CARD" /* CREDIT_CARD */ ? selectedPaymentMethod.method : null,
893
- setCard
904
+ setCard,
905
+ newCards,
906
+ onRemoveNewCard: removeNewCard
894
907
  }
895
908
  ),
896
909
  spreePayConfig?.creditCard.infoMessage && /* @__PURE__ */ jsx5(InfoBanner, { message: spreePayConfig.creditCard.infoMessage }),
@@ -912,7 +925,7 @@ var CreditCard = () => {
912
925
  import { useState as useState9 } from "react";
913
926
 
914
927
  // src/components/CreditCardTab/Points/SplitBlock.tsx
915
- import { useCallback as useCallback4, useEffect as useEffect5, useRef as useRef6, useState as useState8 } from "react";
928
+ import { useCallback as useCallback5, useEffect as useEffect5, useRef as useRef6, useState as useState8 } from "react";
916
929
  import { BUILD_ENV as BUILD_ENV2 } from "@mocanetwork/airkit";
917
930
 
918
931
  // src/components/CreditCardTab/Points/PointsSelector.tsx
@@ -2014,7 +2027,7 @@ var SplitBlock = (props) => {
2014
2027
  const hasForeignCurrency = !!(currencyCode && exchangeRate && foreignCurrencyAmount);
2015
2028
  const formatPointsValue = (usd) => hasForeignCurrency ? formatCurrency(usd / exchangeRate, currencyCode) : formatCurrency(usd);
2016
2029
  const prevPointsChainRef = useRef6(spreePayConfig?.pointsChain);
2017
- const initWallet = useCallback4(
2030
+ const initWallet = useCallback5(
2018
2031
  async (pointsChain) => {
2019
2032
  if (!pointsChain) return;
2020
2033
  try {
@@ -2108,13 +2121,14 @@ var CreditCardTab = ({ isLoggedIn }) => {
2108
2121
  const { appProps } = useStaticConfig();
2109
2122
  const { spreePayConfig } = useSpreePayConfig();
2110
2123
  const { register } = useSpreePayRegister();
2111
- const { mutateCards } = useCards();
2124
+ const { cards, mutateCards } = useCards();
2112
2125
  const { mutateBalance } = useSlapiBalance();
2126
+ const [newCards, setNewCards] = useState10([]);
2113
2127
  const isWeb3Enabled = Boolean(useWeb3Points);
2114
2128
  const { cardPayment } = useCardPayment();
2115
2129
  const { splitPayment } = useSplitCardPayments(isWeb3Enabled ? "web3" : "web2");
2116
2130
  const { pointsPayment } = usePointsPayment(isWeb3Enabled ? "web3" : "web2");
2117
- const handlePay = useCallback5(
2131
+ const handlePay = useCallback6(
2118
2132
  async (data) => {
2119
2133
  try {
2120
2134
  let res = null;
@@ -2134,14 +2148,24 @@ var CreditCardTab = ({ isLoggedIn }) => {
2134
2148
  } catch (_) {
2135
2149
  return Promise.reject(new PaymentError("Payment failed", "FAILED" /* FAILED */));
2136
2150
  } finally {
2137
- if ("token" in (selectedPaymentMethod.method || {})) {
2138
- setSelectedPaymentMethod({ ...selectedPaymentMethod, type: "CREDIT_CARD" /* CREDIT_CARD */, method: null });
2139
- }
2140
- mutateCards();
2141
2151
  mutateBalance();
2152
+ if (selectedPaymentMethod.type === "CREDIT_CARD" /* CREDIT_CARD */ && selectedPaymentMethod.method && isNewCard(selectedPaymentMethod.method)) {
2153
+ const knownIds = new Set(cards.map((c) => c.id));
2154
+ const updated = await mutateCards();
2155
+ const newSavedCard = (updated?.data ?? []).find((c) => c.active && !knownIds.has(c.id));
2156
+ setSelectedPaymentMethod({
2157
+ ...selectedPaymentMethod,
2158
+ type: "CREDIT_CARD" /* CREDIT_CARD */,
2159
+ method: newSavedCard ?? null
2160
+ });
2161
+ setNewCards([]);
2162
+ } else {
2163
+ mutateCards();
2164
+ }
2142
2165
  }
2143
2166
  },
2144
2167
  [
2168
+ cards,
2145
2169
  mutateCards,
2146
2170
  selectedPaymentMethod,
2147
2171
  pointsPayment,
@@ -2157,7 +2181,7 @@ var CreditCardTab = ({ isLoggedIn }) => {
2157
2181
  register(handlePay);
2158
2182
  }, [register, handlePay]);
2159
2183
  return /* @__PURE__ */ jsxs9("div", { children: [
2160
- /* @__PURE__ */ jsx16("div", { className: "border-b border-b-(--border-component-specific-card) px-5 py-5 md:px-7 md:py-6", children: /* @__PURE__ */ jsx16(CreditCard, {}) }),
2184
+ /* @__PURE__ */ jsx16("div", { className: "border-b border-b-(--border-component-specific-card) px-5 py-5 md:px-7 md:py-6", children: /* @__PURE__ */ jsx16(CreditCard, { newCards, setNewCards }) }),
2161
2185
  !spreePayConfig?.creditCard.hidePoints && /* @__PURE__ */ jsx16("div", { className: "flex flex-col gap-4 border-b border-b-(--border-component-specific-card) px-5 pt-5 pb-5 md:px-7 md:pt-6 md:pb-7", children: /* @__PURE__ */ jsx16(Points, {}) }),
2162
2186
  /* @__PURE__ */ jsx16(CheckoutButton, { isLoggedIn })
2163
2187
  ] });
@@ -2235,9 +2259,9 @@ var TabButtons = (props) => {
2235
2259
 
2236
2260
  // src/SpreePayContent.tsx
2237
2261
  import { jsx as jsx18, jsxs as jsxs11 } from "react/jsx-runtime";
2238
- var CryptoTab = lazy(() => import("./CryptoTab-RY2NTNZJ.js").then((module) => ({ default: module.CryptoTab })));
2262
+ var CryptoTab = lazy(() => import("./CryptoTab-DQCQF6BG.js").then((module) => ({ default: module.CryptoTab })));
2239
2263
  var CryptoComTab = lazy(
2240
- () => import("./CryptoComTab-GNJ4XACU.js").then((module) => ({ default: module.CryptoComTab }))
2264
+ () => import("./CryptoComTab-3SEGMLPB.js").then((module) => ({ default: module.CryptoComTab }))
2241
2265
  );
2242
2266
  var TabLoadingFallback = () => /* @__PURE__ */ jsx18("div", { className: "flex items-center justify-center px-5 py-8 md:px-7", children: /* @__PURE__ */ jsxs11("div", { className: "flex flex-col items-center gap-3", children: [
2243
2267
  /* @__PURE__ */ jsx18("div", { className: "h-8 w-8 animate-spin rounded-full border-4 border-(--border-component-specific-card) border-t-(--brand-primary)" }),
@@ -2279,8 +2303,8 @@ var ErrorBoundary = class extends Component {
2279
2303
  if (this.props.fallback) {
2280
2304
  return this.props.fallback;
2281
2305
  }
2282
- return /* @__PURE__ */ jsxs12("div", { className: "flex w-full flex-col items-center justify-center rounded-3xl border border-(--b-inverse) bg-(--s-primary) p-8", children: [
2283
- /* @__PURE__ */ jsx19("div", { className: "mb-4 flex size-12 items-center justify-center rounded-full bg-(--s-secondary)", children: /* @__PURE__ */ jsxs12(
2306
+ return /* @__PURE__ */ jsx19("div", { className: cn("sl-spreepay", this.props.className), children: /* @__PURE__ */ jsxs12("div", { className: "flex w-full flex-col items-center justify-center rounded-3xl border border-(--border-component-specific-card) bg-(--surface-component-specific-card-default-card) p-8 shadow-[0_6.25px_25px_0_var(--shadow-component-specific-card)]", children: [
2307
+ /* @__PURE__ */ jsx19("div", { className: "mb-4 flex size-12 items-center justify-center rounded-full bg-(--s-warning-subtle)", children: /* @__PURE__ */ jsxs12(
2284
2308
  "svg",
2285
2309
  {
2286
2310
  xmlns: "http://www.w3.org/2000/svg",
@@ -2298,16 +2322,16 @@ var ErrorBoundary = class extends Component {
2298
2322
  ]
2299
2323
  }
2300
2324
  ) }),
2301
- /* @__PURE__ */ jsx19("h3", { className: "mb-2 text-lg font-semibold text-(--primary)", children: "Payment Widget Error" }),
2302
- /* @__PURE__ */ jsx19("p", { className: "text-center text-sm text-(--secondary)", children: "Something went wrong loading the payment widget. Please refresh the page and try again." })
2303
- ] });
2325
+ /* @__PURE__ */ jsx19("h3", { className: "mb-2 text-lg font-semibold text-(--brand-primary)", children: "Payment Widget Error" }),
2326
+ /* @__PURE__ */ jsx19("p", { className: "text-center text-sm text-(--text-tertiary)", children: "Something went wrong loading the payment widget. Please refresh the page and try again." })
2327
+ ] }) });
2304
2328
  }
2305
2329
  return this.props.children;
2306
2330
  }
2307
2331
  };
2308
2332
 
2309
2333
  // src/hooks/useKeycloakSSO.ts
2310
- import { useCallback as useCallback6, useEffect as useEffect7, useRef as useRef7, useState as useState10 } from "react";
2334
+ import { useCallback as useCallback7, useEffect as useEffect7, useRef as useRef7, useState as useState11 } from "react";
2311
2335
  import Keycloak from "keycloak-js";
2312
2336
  var refreshAheadSeconds = 60;
2313
2337
  var keycloakLogger = logger.child("keycloak");
@@ -2318,10 +2342,10 @@ function useKeycloakSSO(config) {
2318
2342
  const refreshTimerRef = useRef7(null);
2319
2343
  const scheduleRefreshRef = useRef7(() => {
2320
2344
  });
2321
- const [error, setError] = useState10(null);
2322
- const [isChecking, setIsChecking] = useState10(enabled);
2323
- const [accessToken, setAccessToken] = useState10(null);
2324
- const scheduleRefresh = useCallback6(() => {
2345
+ const [error, setError] = useState11(null);
2346
+ const [isChecking, setIsChecking] = useState11(enabled);
2347
+ const [accessToken, setAccessToken] = useState11(null);
2348
+ const scheduleRefresh = useCallback7(() => {
2325
2349
  const kc = kcRef.current;
2326
2350
  if (!kc || !kc.tokenParsed || !kc.tokenParsed.exp) {
2327
2351
  return;
@@ -2381,11 +2405,22 @@ function useKeycloakSSO(config) {
2381
2405
  return { isChecking, accessToken, error };
2382
2406
  }
2383
2407
 
2408
+ // src/utils/token.ts
2409
+ import { jwtDecode } from "jwt-decode";
2410
+ var isTokenExpired = (token) => {
2411
+ try {
2412
+ const { exp } = jwtDecode(token);
2413
+ return typeof exp === "number" && exp < Math.floor(Date.now() / 1e3);
2414
+ } catch {
2415
+ return true;
2416
+ }
2417
+ };
2418
+
2384
2419
  // src/SpreePay.tsx
2385
2420
  import { jsx as jsx20, jsxs as jsxs13 } from "react/jsx-runtime";
2386
2421
  var SpreePayInner = () => {
2387
- const [portalEl, setPortalEl] = useState11(null);
2388
- const rootRef = useCallback7((node) => {
2422
+ const [portalEl, setPortalEl] = useState12(null);
2423
+ const rootRef = useCallback8((node) => {
2389
2424
  if (!node) return;
2390
2425
  const el = node.querySelector(":scope > .sl-spreepay__portal");
2391
2426
  setPortalEl(el ?? null);
@@ -2396,16 +2431,17 @@ var SpreePayInner = () => {
2396
2431
  logger.logVersion();
2397
2432
  }, [environment]);
2398
2433
  const { staticConfig, appProps } = useStaticConfig();
2434
+ const envTokenValid = Boolean(envAccessToken && !isTokenExpired(envAccessToken));
2399
2435
  const { isChecking, accessToken } = useKeycloakSSO({
2400
2436
  realm: tenantId,
2401
2437
  url: staticConfig.keycloakUrl,
2402
2438
  clientId: keycloakClientId ?? "oneof-next",
2403
2439
  ssoPageURI,
2404
- enabled: !envAccessToken
2440
+ enabled: !envTokenValid
2405
2441
  });
2406
- const _accessToken = envAccessToken ?? accessToken;
2407
- const unauthenticatedFetcher = useCallback7(() => Promise.resolve(null), []);
2408
- const slapiFetcher = useMemo7(() => {
2442
+ const _accessToken = envTokenValid ? envAccessToken : accessToken;
2443
+ const unauthenticatedFetcher = useCallback8(() => Promise.resolve(null), []);
2444
+ const slapiFetcher = useMemo9(() => {
2409
2445
  if (_accessToken) {
2410
2446
  return registerApi({
2411
2447
  accessToken: _accessToken,
@@ -2441,7 +2477,7 @@ var SpreePayInner = () => {
2441
2477
  ] });
2442
2478
  };
2443
2479
  var SpreePay = (props) => {
2444
- return /* @__PURE__ */ jsx20(ErrorBoundary, { children: /* @__PURE__ */ jsx20(StaticConfigProvider, { props, children: /* @__PURE__ */ jsx20(SpreePayInner, {}) }) });
2480
+ return /* @__PURE__ */ jsx20(ErrorBoundary, { className: props.className, children: /* @__PURE__ */ jsx20(StaticConfigProvider, { props, children: /* @__PURE__ */ jsx20(SpreePayInner, {}) }) });
2445
2481
  };
2446
2482
 
2447
2483
  // src/hooks/useCapture3DS.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superlogic/spree-pay",
3
- "version": "0.4.2",
3
+ "version": "0.4.8",
4
4
  "description": "Spree-pay React component and utilities",
5
5
  "private": false,
6
6
  "type": "module",
@@ -18,7 +18,8 @@
18
18
  "require": "./build/index.cjs",
19
19
  "default": "./build/index.js"
20
20
  },
21
- "./styles.css": "./build/index.css"
21
+ "./styles.css": "./build/index.css",
22
+ "./bridge.css": "./src/styles/bridge.css"
22
23
  },
23
24
  "files": [
24
25
  "build",
@@ -40,7 +41,7 @@
40
41
  },
41
42
  "dependencies": {
42
43
  "@ebay/nice-modal-react": "^1.2.13",
43
- "@mocanetwork/airkit": "^1.7.0",
44
+ "@mocanetwork/airkit": "1.7.0",
44
45
  "@radix-ui/react-checkbox": "^1.1.3",
45
46
  "@radix-ui/react-dialog": "^1.1.15",
46
47
  "@radix-ui/react-label": "^2.1.8",
@@ -52,6 +53,7 @@
52
53
  "@tanstack/react-query": "^5.97.0",
53
54
  "class-variance-authority": "^0.7.0",
54
55
  "clsx": "^2.1.1",
56
+ "jwt-decode": "^4.0.0",
55
57
  "keycloak-js": "^26.2.3",
56
58
  "lucide-react": "^1.8.0",
57
59
  "swr": "^2.4.1",
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Spree-pay CSS variable bridge — live-tickets context only.
3
+ *
4
+ * Exposes legacy short-name CSS variables that spree-pay TSX components
5
+ * still reference, mapped to the current Figma token names. This file is
6
+ * imported by apps/live-tickets/src/theme/globals.css so the host app's
7
+ * tenant *.figma.css tokens are available under the old names.
8
+ *
9
+ * NOT used in standalone mode — the standalone build gets default values
10
+ * from packages/spree-pay/src/styles/globals.css instead.
11
+ */
12
+ :root {
13
+ /* text / icons */
14
+ --primary: var(--color-text-icons-primary-default);
15
+ --secondary: var(--color-text-icons-secondary-default);
16
+ --tertiary: var(--color-text-icons-tertiary-default);
17
+ --text-tertiary: var(--color-text-icons-tertiary-default); /* pre-existing alias bug */
18
+ --brand-primary: var(--color-text-icons-brand-default);
19
+ --accent: var(--color-text-icons-accent-default);
20
+ --inverse: var(--color-text-icons-inverse-default);
21
+ --disabled: var(--color-text-icons-primary-disabled);
22
+ --positive: var(--color-feedback-success);
23
+ --warning: var(--color-feedback-attention);
24
+ --negative: var(--color-feedback-error);
25
+
26
+ /* surface */
27
+ --s-default: var(--color-surface-layer-page);
28
+ --s-primary: var(--color-surface-container-subtle);
29
+ --s-primary-hover: var(--color-component-list-row-subtle-hover);
30
+ --s-secondary: var(--color-component-table-header);
31
+ --s-tertiary: var(--color-control-tertiary-bg-default);
32
+ --s-brand: var(--color-surface-container-brand);
33
+ --s-brand-hover: var(--color-control-primary-bg-hover);
34
+ --s-disabled: var(--color-component-bg-disabled);
35
+ --s-warning: var(--color-feedback-attention);
36
+
37
+ /* border */
38
+ --b-primary: var(--color-border-subtle);
39
+ --b-secondary: var(--color-border-default);
40
+ --b-tertiary: var(--color-component-divider-default);
41
+ --b-brand: var(--color-control-primary-border-default);
42
+ --b-inverse: var(--color-border-inverse);
43
+
44
+ /* overlay / component-specific */
45
+ --overlay: var(--color-surface-layer-backdrop);
46
+ --border-component-specific-card: var(--color-component-divider-subtle);
47
+ --surface-component-specific-card-default-card: var(--color-surface-layer-card);
48
+ --shadow-component-specific-card: var(--color-effect-shadow-card);
49
+
50
+ /* Crypto.com brand colors — same across all tenants */
51
+ --crypto-pay-bg: #00307d;
52
+ --crypto-pay-bg-hover: #002655;
53
+ }