@amos.com/react-amos-js 0.11.24 → 0.11.26

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
@@ -10,7 +10,7 @@ It is a thin wrapper around [`@amos.com/amos-js`](../amos-js) that adapts the fr
10
10
  npm install @amos.com/react-amos-js @amos.com/node
11
11
  ```
12
12
 
13
- `@amos.com/node` is a **peer dependency** (requires `>=0.1.57`). Install it in your app for OpenAPI schema types (for example `components["schemas"]["CreatePaymentIntentInput"]`) used in the examples below, and for your server-side Amos API client. React (`^17`, `^18`, or `^19`) is also a peer dependency.
13
+ `@amos.com/node` is a **peer dependency** (requires `>=0.1.65`). Install it in your app for OpenAPI schema types (for example `components["schemas"]["CreatePaymentIntentInput"]`) used in the examples below, and for your server-side Amos API client. React (`^17`, `^18`, or `^19`) is also a peer dependency.
14
14
 
15
15
  ## What it gives you
16
16
 
@@ -139,9 +139,9 @@ appearance={{
139
139
 
140
140
  `rules` uses the same **replace** model as `themeVariables` and `fonts`: omit `rules` to keep the previous set; pass a new object to replace it (`{}` clears). Unknown class names and properties are ignored.
141
141
 
142
- Rules override `themeVariables` for the properties they set (Stripe). `--input-height` / `--floating-input-height` are a **minimum**; `.Input` `padding`, `fontSize`, and `lineHeight` can grow the field. Rule values may reference allowlisted tokens as `var(--primary)` (no fallback argument).
142
+ Rules override `themeVariables` for the properties they set (Stripe). `--input-height` / `--floating-input-height` are a **minimum**; `.Input` `padding`, `fontSize`, and `lineHeight` can grow the field. Floated input text padding is `--floating-value-padding-top` and `--floating-value-padding-bottom`. Rule values may reference allowlisted tokens as `var(--primary)` (no fallback argument).
143
143
 
144
- The host skeleton (shown until `UPDATED_APPEARANCE`, or 1.5s after `IFRAME_READY` if appearance never acks) copies `themeVariables` and resting **`.Input` / `.Label`** declarations (the same allowlisted properties as iframe rules). It covers a visible iframe (`opacity: 1`) so WebKit still runs iframe JS. It does not inject webfonts: it uses `--font-family` / `fontFamily` when that face is already on the host page, and falls back to `ui-sans-serif, system-ui, sans-serif`. Hover, invalid, placeholder, dropdown, and radio rules have no skeleton equivalent. Floating labels sit inside the control, so `.Label` / `.Label--floating` do not change skeleton height.
144
+ The host skeleton (shown until `UPDATED_APPEARANCE`, or 1.5s after mount if appearance never acks) copies `themeVariables` and resting **`.Input` / `.Label`** declarations (the same allowlisted properties as iframe rules). Its background is `--background`, so it covers the iframe. The iframe stays at opacity 1 and its default pixel height underneath, and is `inert` until reveal, so WebKit lays it out and still runs iframe JS. It does not inject webfonts: it uses `--font-family` / `fontFamily` when that face is already on the host page, and falls back to `ui-sans-serif, system-ui, sans-serif`. Hover, invalid, placeholder, dropdown, and radio rules have no skeleton equivalent. Floating labels sit inside the control, so `.Label` / `.Label--floating` do not change skeleton height.
145
145
 
146
146
  | Selector | Targets |
147
147
  | --- | --- |
@@ -207,6 +207,8 @@ Radio groups (e.g. account type) always use an above-style group label regardles
207
207
  | `--floating-label-color` | Color of floating labels when empty (unfocused) | `var(--muted-foreground)` |
208
208
  | `--floating-label-floated-color` | Color of floating labels when focused or filled | `var(--floating-label-color)` |
209
209
  | `--floating-label-offset` | Top offset of the shrunk floating label | `0.625rem` |
210
+ | `--floating-value-padding-top` | Top padding of the typed value when the label is floated | `calc(var(--floating-label-offset) + var(--floating-label-font-size) + 0.125rem)` |
211
+ | `--floating-value-padding-bottom` | Bottom padding of the typed value when the label is floated | `var(--floating-label-offset)` |
210
212
  | `--label-font-size` | Font size of above-style field labels | `0.875rem` |
211
213
  | `--label-font-weight` | Font weight of above-style field labels | `500` |
212
214
  | `--field-gap` | Vertical gap between stacked form fields | `1rem` |
@@ -560,7 +562,7 @@ Focus a named control inside the card or bank iframe. No-op if the field is not
560
562
 
561
563
  ### `AmosCreditCardPaymentMethodForm`
562
564
 
563
- Renders the secure credit card iframe form. A field-shaped skeleton covers a visible iframe immediately (sized from `appearance`, including resting `.Input` / `.Label` rules) and is removed once appearance is applied, or 1.5s after `IFRAME_READY` if appearance never acks.
565
+ Renders the secure credit card iframe form. A field-shaped skeleton with an opaque background is shown immediately (sized from `appearance`, including resting `.Input` / `.Label` rules). The iframe stays at opacity 1 and its default pixel height, and is `inert`, until appearance is applied, or for 1.5s after mount if appearance never acks.
564
566
 
565
567
  **Required props:**
566
568
 
@@ -584,7 +586,7 @@ Enter in a card or bank iframe field submits the enclosing host `<form>` via `re
584
586
 
585
587
  ### `AmosBankAccountPaymentMethodForm`
586
588
 
587
- Renders the secure bank account iframe form. A field-shaped skeleton covers a visible iframe immediately (sized from `appearance`, including resting `.Input` / `.Label` rules) and is removed once appearance is applied, or 1.5s after `IFRAME_READY` if appearance never acks.
589
+ Renders the secure bank account iframe form. A field-shaped skeleton with an opaque background is shown immediately (sized from `appearance`, including resting `.Input` / `.Label` rules). The iframe stays at opacity 1 and its default pixel height, and is `inert`, until appearance is applied, or for 1.5s after mount if appearance never acks.
588
590
 
589
591
  When `requireAchVerification` is true (or `intent` is `"setup"`), and the render token allows verification, the SDK hides the routing/account iframe and mounts [Plaid Embedded Institution Search](https://plaid.com/docs/link/embedded-institution-search/) in the parent. A **350px pulse skeleton** covers that slot until Plaid's `onLoad` (1.5s fallback). Do not overlay a host loader. Hosts do not proxy Pay API (`GET /merchants`, `POST /plaid_link_tokens`); embed does that with `PAY_API_KEY`. Do not put Plaid secrets in the browser.
590
592
 
@@ -621,7 +623,7 @@ Setup (always Plaid, unless the render token disables verification):
621
623
 
622
624
  ### `AmosGooglePayButton`
623
625
 
624
- Renders the secure Google Pay iframe button (express checkout flow). A button-shaped skeleton covers a visible iframe immediately and is removed once appearance is applied, or 1.5s after `IFRAME_READY` if appearance never acks.
626
+ Renders the secure Google Pay iframe button (express checkout flow). A button-shaped skeleton with an opaque background is shown immediately. The iframe stays at opacity 1 and its default pixel height, and is `inert`, until appearance is applied, or for 1.5s after mount if appearance never acks.
625
627
 
626
628
  **Required props:**
627
629
 
@@ -648,7 +650,7 @@ Renders the secure Google Pay iframe button (express checkout flow). A button-sh
648
650
 
649
651
  ### `AmosApplePayButton`
650
652
 
651
- Renders the secure Apple Pay iframe button (express checkout flow). Same required props and callbacks as `AmosGooglePayButton`. A button-shaped skeleton covers a visible iframe immediately and is removed once appearance is applied, or 1.5s after `IFRAME_READY` if appearance never acks.
653
+ Renders the secure Apple Pay iframe button (express checkout flow). Same required props and callbacks as `AmosGooglePayButton`. A button-shaped skeleton with an opaque background is shown immediately. The iframe stays at opacity 1 and its default pixel height, and is `inert`, until appearance is applied, or for 1.5s after mount if appearance never acks.
652
654
 
653
655
  **Optional props:**
654
656
 
@@ -690,7 +692,7 @@ Re-exports of the same advanced helpers exposed by `@amos.com/amos-js`. Most int
690
692
 
691
693
  Re-exports from `@amos.com/amos-js`. Build the iframe `src` URL for each form type. The React components call these for you.
692
694
 
693
- Each URL includes the embed's canonical search params (`token`, `additionalFields`, `billingAddressRequirement`, `intent`) so the embed router does not 307 to fill in defaults. After the iframe `load` event, if `IFRAME_READY` never arrives (stale HTML, missing JS chunk), the SDK rewrites `src` once with `amosReload` so the next document is a real navigation. Appearance is applied after handshake via `UPDATE_APPEARANCE`. A host-page skeleton covers the visible iframe until then, or for 1.5s after `IFRAME_READY` if appearance never acks.
695
+ Each URL includes the embed's canonical search params (`token`, `additionalFields`, `billingAddressRequirement`, `intent`) so the embed router does not 307 to fill in defaults. After the iframe `load` event, if `IFRAME_READY` never arrives (stale HTML, missing JS chunk), the SDK rewrites `src` once with `amosReload` so the next document is a real navigation. Appearance is applied after handshake via `UPDATE_APPEARANCE`. A host-page skeleton with an opaque background covers the iframe until then. The iframe stays at opacity 1 and its default pixel height, and is uncovered 1.5s after mount if appearance never acks.
694
696
 
695
697
  ### `updateDefaultValues({ iframe, defaultValues })`
696
698
 
@@ -702,7 +704,7 @@ Re-export from `@amos.com/amos-js`. Fills omitted Inter `fonts` / `--font-family
702
704
 
703
705
  ### Exported types
704
706
 
705
- `@amos.com/react-amos-js` re-exports everything from `@amos.com/amos-js`, including `ConfirmPaymentResult`, `ConfirmSetupResult`, `PaymentMethodFormValidityChangeEvent`, `CardBrand`, `PaymentMethodFormCardBrandChangeEvent`, `FormattedGooglePayPaymentData`, `WalletCustomerCreateAttributes`, `WalletPostalAddress`, `WalletContactRequirements`, `Message`, `Appearance`, `ThemeVariable`, `FontSource`, `CssFontSource`, `CustomFontSource`, `AppearanceRuleSelector`, `AppearanceRuleDeclarations`, `PaymentMethodFormDefaultValues`, `PaymentMethodFormField`, and the per-form `*Options` / `*Controller` types. For OpenAPI schema types (e.g. `PaymentIntent`, `CreatePaymentIntentInput`), import `components` from `@amos.com/node`.
707
+ `@amos.com/react-amos-js` re-exports everything from `@amos.com/amos-js`, including `ConfirmPaymentResult`, `ConfirmSetupResult`, `isConfirmTimeout`, `CONFIRM_TIMEOUT_MS`, `PaymentMethodFormValidityChangeEvent`, `CardBrand`, `PaymentMethodFormCardBrandChangeEvent`, `PaymentMethodFormPostalCodeChangeEvent`, `FormattedGooglePayPaymentData`, `WalletCustomerCreateAttributes`, `WalletPostalAddress`, `WalletContactRequirements`, `Message`, `Appearance`, `ThemeVariable`, `FontSource`, `CssFontSource`, `CustomFontSource`, `AppearanceRuleSelector`, `AppearanceRuleDeclarations`, `PaymentMethodFormDefaultValues`, `PaymentMethodFormField`, and the per-form `*Options` / `*Controller` types. For OpenAPI schema types (e.g. `PaymentIntent`, `CreatePaymentIntentInput`), import `components` from `@amos.com/node`.
706
708
 
707
709
  ## Notes and potential gotchas
708
710
 
@@ -711,7 +713,7 @@ Re-export from `@amos.com/amos-js`. Fills omitted Inter `fonts` / `--font-family
711
713
  - **Same components for payment vs setup intents**: `AmosCreditCardPaymentMethodForm` and `AmosBankAccountPaymentMethodForm` support both payment intents and setup intents. The flow differs only by which server call you make and which confirmation function you use (`confirmPayment` vs `confirmSetup`).
712
714
  - **Amount format**: for `AmosGooglePayButton` and `AmosApplePayButton`, `amount` is a major-currency decimal string (e.g. `"50.00"` for $50.00). For `components["schemas"]["CreatePaymentIntentInput"]` on the server (card/bank create, and the object the wallet iframe sends to `onConfirm`), `amount` is a number in cents (e.g. `5000`).
713
715
  - **Embed host / CSP**: iframes load from `https://js.amos.com` (production) and `https://js-sandbox.amos.com` (sandbox) via `getEmbedOrigin`. Parent pages that pin CSP must allow `frame-src https://js.amos.com https://js-sandbox.amos.com` (and `Permissions-Policy payment=` for those origins) **before** upgrading this package. Older SDK versions still load `embed.amos.com` / `embed-sandbox.amos.com`.
714
- - **Iframe handshake**: iframe URLs include canonical search params so the embed does not 307. If the document loads but never posts `IFRAME_READY`, the SDK rewrites `src` once with `amosReload`. Appearance is applied after handshake. The iframe stays visible under the skeleton until `UPDATED_APPEARANCE`, or for 1.5s after `IFRAME_READY` if appearance never acks. Embed messages match on origin plus `iframeName` when `contentWindow` identity changes.
716
+ - **Iframe handshake**: iframe URLs include canonical search params so the embed does not 307. If the document loads but never posts `IFRAME_READY`, the SDK rewrites `src` once with `amosReload`. Appearance is applied after handshake. The iframe stays at opacity 1 under an opaque skeleton until `UPDATED_APPEARANCE`, or for 1.5s after mount if appearance never acks. Embed messages match on origin plus `iframeName` when `contentWindow` identity changes.
715
717
  - **Plaid Embedded Link (ACH verification)**: load `cdn.plaid.com` from the **parent** document (see CSP on `AmosBankAccountPaymentMethodForm`). Merchants do not proxy Pay API; the bank iframe mints link tokens. Pass `requireAchVerification` when the host wants Plaid, or `intent="setup"` to always show it, unless the render token disables verification. Toggling that prop hides or shows the existing Embedded handler — it does not reload Institution Search. Confirm still goes through the bank iframe so Amos can attach `plaid` to the payment method. While Link loads, the SDK shows a 350px pulse skeleton until `onLoad` (1.5s fallback) — do not overlay a host loader. After success the same slot is a connected-account row (institution name, mask, outline Disconnect) styled with existing `themeVariables`. Disconnect shows Institution Search again.
716
718
  - **Apple Pay waiting overlay**: on browsers where Apple's QR handoff opens in a popup (non-Safari), `AmosApplePayButton` shows a fixed full-viewport overlay on the host page. **Cancel payment** is available until the buyer authorizes; after that the overlay shows **Completing your payment…** with no Cancel, then hides when `onConfirm` settles. Avoid stacking other fixed UI above it.
717
719
  - **Going framework-free**: if you need to use Amos outside of React (vanilla JS, another framework, etc.), use [`@amos.com/amos-js`](../amos-js) directly.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="googlepay" />
2
- import { Appearance, ApplePayButtonElementProps, BillingAddressRequirement, ConfirmPaymentResult, ConfirmSetupResult, CreditCardAdditionalFields, GooglePayButtonElementProps, PaymentMethodFormDefaultValues, PaymentMethodFormField, WalletCustomerCreateAttributes } from '@amos.com/amos-js';
2
+ import { Appearance, ApplePayButtonElementProps, BillingAddressRequirement, ConfirmPaymentResult, ConfirmSetupResult, CreditCardAdditionalFields, GooglePayButtonElementProps, PaymentMethodFormDefaultValues, PaymentMethodFormField, PaymentMethodFormPostalCodeChangeEvent, WalletCustomerCreateAttributes } from '@amos.com/amos-js';
3
3
  import { components } from '@amos.com/node';
4
4
  import { ComponentProps, Ref, RefObject } from 'react';
5
5
  export * from '@amos.com/amos-js';
@@ -67,10 +67,6 @@ export declare function focusField({ iframeRef, field, }: {
67
67
  }): void;
68
68
  type ForwardedIframeRef = Ref<HTMLIFrameElement> | undefined;
69
69
  type IframePassthroughProps = Omit<ComponentProps<"iframe">, "src" | "title" | "name" | "role" | "allow">;
70
- type PostalCodeChangeHandler = (event: {
71
- postalCode: string | null;
72
- country: string;
73
- }) => void;
74
70
  type AmosCreditCardPaymentMethodFormProps = IframePassthroughProps & {
75
71
  renderToken: string;
76
72
  appearance?: Appearance;
@@ -94,7 +90,7 @@ type AmosCreditCardPaymentMethodFormProps = IframePassthroughProps & {
94
90
  * one. `postalCode` is null when a finished code becomes incomplete.
95
91
  * Incomplete keystrokes and `defaultValues` writes are omitted.
96
92
  */
97
- onPostalCodeChange?: PostalCodeChangeHandler;
93
+ onPostalCodeChange?: (event: PaymentMethodFormPostalCodeChangeEvent) => void;
98
94
  /**
99
95
  * Called when the customer presses Escape in the iframe. PCI-safe —
100
96
  * no field values. Use this to close a host modal that contains the
@@ -137,7 +133,7 @@ type AmosBankAccountPaymentMethodFormProps = IframePassthroughProps & {
137
133
  * one. `postalCode` is null when a finished code becomes incomplete.
138
134
  * Incomplete keystrokes and `defaultValues` writes are omitted.
139
135
  */
140
- onPostalCodeChange?: PostalCodeChangeHandler;
136
+ onPostalCodeChange?: (event: PaymentMethodFormPostalCodeChangeEvent) => void;
141
137
  billingAddressRequirement?: BillingAddressRequirement;
142
138
  /**
143
139
  * Seed account holder name and billing address. Provided keys
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@amos.com/amos-js"),t=require("react"),n=require("react/jsx-runtime");function resolveIframe(e){var t;return e?(t=e.current)==null?null:t:null}function validateForm({iframeRef:t}){return(0,e.validateForm)({iframe:resolveIframe(t)})}function confirmPayment({iframeRef:t,token:n,defaultValues:r}){return(0,e.confirmPayment)({iframe:resolveIframe(t),token:n,defaultValues:r})}function confirmSetup({iframeRef:t,token:n,defaultValues:r}){return(0,e.confirmSetup)({iframe:resolveIframe(t),token:n,defaultValues:r})}function resetForm({iframeRef:t}){(0,e.resetForm)({iframe:resolveIframe(t)})}function focusField({iframeRef:t,field:n}){(0,e.focusField)({iframe:resolveIframe(t),field:n})}function setForwardedRef(e,t){typeof e==`function`?e(t):e&&(e.current=t)}function applyIframePassthrough(e,{style:t,className:n,id:r,...i}){n!=null&&(e.className=n),r!=null&&(e.id=r),Object.assign(e.style,t);for(let[t,n]of Object.entries(i))n!=null&&(t in e?Reflect.set(e,t,n):e.setAttribute(t,String(n)))}function useAmosEmbed({containerRef:e,iframeRef:n,mount:r,options:i,remountDeps:a,iframePassthrough:o,updateDeps:s}){let c=(0,t.useRef)(null);(0,t.useLayoutEffect)(()=>{let t=e.current;if(!t)return;let a=r(t,i);return c.current=a,setForwardedRef(n,a.iframe),applyIframePassthrough(a.iframe,o),()=>{a.destroy(),c.current=null,setForwardedRef(n,null)}},[...a]),(0,t.useEffect)(()=>{var e;(e=c.current)==null||e.update(i)},[...s]),(0,t.useEffect)(()=>{var e;let t=(e=c.current)==null?void 0:e.iframe;t&&applyIframePassthrough(t,o)})}var r=`oklch(0.97 0 0)`;function WalletButtonSlot({height:i,borderRadius:a,containerRef:o}){return(0,t.useLayoutEffect)(()=>{(0,e.ensureSkeletonStyles)()},[]),(0,n.jsxs)(`div`,{style:{boxSizing:`border-box`,position:`relative`,width:`100%`,height:i,minHeight:i,overflow:`hidden`},children:[(0,n.jsx)(`div`,{className:`amos-js-form-skeleton-input amos-js-wallet-skeleton`,style:{position:`absolute`,inset:0,height:i,borderRadius:a,background:r,pointerEvents:`none`,zIndex:0},"aria-hidden":!0}),(0,n.jsx)(`div`,{ref:o,style:{position:`absolute`,inset:0,zIndex:1,width:`100%`,height:`100%`}})]})}function mountCreditCardPaymentMethodForm(t,n){return(0,e.mountAmosCreditCardPaymentMethodForm)(t,n)}function mountBankAccountPaymentMethodForm(t,n){return(0,e.mountAmosBankAccountPaymentMethodForm)(t,n)}function AmosCreditCardPaymentMethodForm({ref:e,renderToken:r,appearance:i,onValidityChange:a,onCardBrandChanged:o,onPostalCodeChange:s,onEscapeKeyPressed:c,additionalFields:l={cardholderName:!1},billingAddressRequirement:u=`country`,defaultValues:d,style:f,...p}){let m=(0,t.useRef)(null);return useAmosEmbed({containerRef:m,iframeRef:e,mount:mountCreditCardPaymentMethodForm,options:{renderToken:r,appearance:i,additionalFields:l,billingAddressRequirement:u,defaultValues:d,onValidityChange:a,onCardBrandChanged:o,onPostalCodeChange:s,onEscapeKeyPressed:c},remountDeps:[r,l.cardholderName,u],iframePassthrough:{style:f,...p},updateDeps:[i,l,u,d,a,o,s,c]}),(0,n.jsx)(`div`,{ref:m})}function AmosBankAccountPaymentMethodForm({ref:e,renderToken:r,appearance:i,onValidityChange:a,onPostalCodeChange:o,onEscapeKeyPressed:s,billingAddressRequirement:c=`country`,defaultValues:l,requireAchVerification:u=!1,intent:d=`payment`,style:f,...p}){let m=(0,t.useRef)(null);return useAmosEmbed({containerRef:m,iframeRef:e,mount:mountBankAccountPaymentMethodForm,options:{renderToken:r,appearance:i,billingAddressRequirement:c,defaultValues:l,requireAchVerification:u,intent:d,onValidityChange:a,onPostalCodeChange:o,onEscapeKeyPressed:s},remountDeps:[r,c,d],iframePassthrough:{style:f,...p},updateDeps:[i,c,l,u,d,a,o,s]}),(0,n.jsx)(`div`,{ref:m})}function AmosGooglePayButton({ref:r,renderToken:i,amount:a,merchantName:o,height:s=`48px`,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,iframeProps:d,onConfirm:f}){let p=(0,t.useRef)(null),m=(0,e.resolveWalletButtonSkeletonBorderRadius)({iframeStyle:d==null?void 0:d.style,buttonProps:c});return useAmosEmbed({containerRef:p,iframeRef:r,mount:e.mountAmosGooglePayButton,options:{renderToken:i,amount:a,merchantName:o,height:s,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,onConfirm:f},remountDeps:[i],iframePassthrough:d==null?{}:d,updateDeps:[a,o,s,c,l,u,f]}),(0,n.jsx)(WalletButtonSlot,{height:s,borderRadius:m,containerRef:p})}function AmosApplePayButton({ref:r,renderToken:i,amount:a,merchantName:o,height:s=`48px`,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,iframeProps:d,onConfirm:f}){let p=(0,t.useRef)(null),m=(0,e.resolveWalletButtonSkeletonBorderRadius)({iframeStyle:d==null?void 0:d.style,buttonProps:c});return useAmosEmbed({containerRef:p,iframeRef:r,mount:e.mountAmosApplePayButton,options:{renderToken:i,amount:a,merchantName:o,height:s,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,onConfirm:f},remountDeps:[i],iframePassthrough:d==null?{}:d,updateDeps:[a,o,s,c,l,u,f]}),(0,n.jsx)(WalletButtonSlot,{height:s,borderRadius:m,containerRef:p})}exports.AmosApplePayButton=AmosApplePayButton,exports.AmosBankAccountPaymentMethodForm=AmosBankAccountPaymentMethodForm,exports.AmosCreditCardPaymentMethodForm=AmosCreditCardPaymentMethodForm,exports.AmosGooglePayButton=AmosGooglePayButton,exports.confirmPayment=confirmPayment,exports.confirmSetup=confirmSetup,exports.focusField=focusField,exports.resetForm=resetForm,exports.validateForm=validateForm,Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@amos.com/amos-js"),t=require("react"),n=require("react/jsx-runtime");function resolveIframe(e){var t;return e?(t=e.current)==null?null:t:null}function validateForm({iframeRef:t}){return(0,e.validateForm)({iframe:resolveIframe(t)})}function confirmPayment({iframeRef:t,token:n,defaultValues:r}){return(0,e.confirmPayment)({iframe:resolveIframe(t),token:n,defaultValues:r})}function confirmSetup({iframeRef:t,token:n,defaultValues:r}){return(0,e.confirmSetup)({iframe:resolveIframe(t),token:n,defaultValues:r})}function resetForm({iframeRef:t}){(0,e.resetForm)({iframe:resolveIframe(t)})}function focusField({iframeRef:t,field:n}){(0,e.focusField)({iframe:resolveIframe(t),field:n})}function setForwardedRef(e,t){typeof e==`function`?e(t):e&&(e.current=t)}function applyIframePassthrough(e,{style:t,className:n,id:r,...i}){n!=null&&(e.className=n),r!=null&&(e.id=r),Object.assign(e.style,t);for(let[t,n]of Object.entries(i))n!=null&&(t in e?Reflect.set(e,t,n):e.setAttribute(t,String(n)))}function useAmosEmbed({containerRef:e,iframeRef:n,mount:r,options:i,remountDeps:a,iframePassthrough:o,updateDeps:s}){let c=(0,t.useRef)(null);(0,t.useLayoutEffect)(()=>{let t=e.current;if(!t)return;let a=r(t,i);return c.current=a,setForwardedRef(n,a.iframe),applyIframePassthrough(a.iframe,o),()=>{a.destroy(),c.current=null,setForwardedRef(n,null)}},[...a]),(0,t.useEffect)(()=>{var e;(e=c.current)==null||e.update(i)},[...s]),(0,t.useEffect)(()=>{var e;let t=(e=c.current)==null?void 0:e.iframe;t&&applyIframePassthrough(t,o)})}var r=`oklch(0.97 0 0)`;function WalletButtonSlot({height:i,borderRadius:a,containerRef:o}){return(0,t.useLayoutEffect)(()=>{(0,e.ensureSkeletonStyles)()},[]),(0,n.jsxs)(`div`,{style:{boxSizing:`border-box`,position:`relative`,width:`100%`,height:i,minHeight:i,overflow:`hidden`},children:[(0,n.jsx)(`div`,{className:`amos-js-form-skeleton-input amos-js-wallet-skeleton`,style:{position:`absolute`,inset:0,height:i,borderRadius:a,background:r,pointerEvents:`none`,zIndex:0},"aria-hidden":!0}),(0,n.jsx)(`div`,{ref:o,style:{position:`absolute`,inset:0,zIndex:1,width:`100%`,height:`100%`}})]})}function AmosCreditCardPaymentMethodForm({ref:r,renderToken:i,appearance:a,onValidityChange:o,onCardBrandChanged:s,onPostalCodeChange:c,onEscapeKeyPressed:l,additionalFields:u={cardholderName:!1},billingAddressRequirement:d=`country`,defaultValues:f,style:p,...m}){let h=(0,t.useRef)(null);return useAmosEmbed({containerRef:h,iframeRef:r,mount:e.mountAmosCreditCardPaymentMethodForm,options:{renderToken:i,appearance:a,additionalFields:u,billingAddressRequirement:d,defaultValues:f,onValidityChange:o,onCardBrandChanged:s,onPostalCodeChange:c,onEscapeKeyPressed:l},remountDeps:[i,u.cardholderName,d],iframePassthrough:{style:p,...m},updateDeps:[a,u,d,f,o,s,c,l]}),(0,n.jsx)(`div`,{ref:h})}function AmosBankAccountPaymentMethodForm({ref:r,renderToken:i,appearance:a,onValidityChange:o,onPostalCodeChange:s,onEscapeKeyPressed:c,billingAddressRequirement:l=`country`,defaultValues:u,requireAchVerification:d=!1,intent:f=`payment`,style:p,...m}){let h=(0,t.useRef)(null);return useAmosEmbed({containerRef:h,iframeRef:r,mount:e.mountAmosBankAccountPaymentMethodForm,options:{renderToken:i,appearance:a,billingAddressRequirement:l,defaultValues:u,requireAchVerification:d,intent:f,onValidityChange:o,onPostalCodeChange:s,onEscapeKeyPressed:c},remountDeps:[i,l,f],iframePassthrough:{style:p,...m},updateDeps:[a,l,u,d,f,o,s,c]}),(0,n.jsx)(`div`,{ref:h})}function AmosGooglePayButton({ref:r,renderToken:i,amount:a,merchantName:o,height:s=`48px`,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,iframeProps:d,onConfirm:f}){let p=(0,t.useRef)(null),m=(0,e.resolveWalletButtonSkeletonBorderRadius)({iframeStyle:d==null?void 0:d.style,buttonProps:c});return useAmosEmbed({containerRef:p,iframeRef:r,mount:e.mountAmosGooglePayButton,options:{renderToken:i,amount:a,merchantName:o,height:s,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,onConfirm:f},remountDeps:[i],iframePassthrough:d==null?{}:d,updateDeps:[a,o,s,c,l,u,f]}),(0,n.jsx)(WalletButtonSlot,{height:s,borderRadius:m,containerRef:p})}function AmosApplePayButton({ref:r,renderToken:i,amount:a,merchantName:o,height:s=`48px`,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,iframeProps:d,onConfirm:f}){let p=(0,t.useRef)(null),m=(0,e.resolveWalletButtonSkeletonBorderRadius)({iframeStyle:d==null?void 0:d.style,buttonProps:c});return useAmosEmbed({containerRef:p,iframeRef:r,mount:e.mountAmosApplePayButton,options:{renderToken:i,amount:a,merchantName:o,height:s,buttonProps:c,phoneRequired:l,shippingAddressRequired:u,onConfirm:f},remountDeps:[i],iframePassthrough:d==null?{}:d,updateDeps:[a,o,s,c,l,u,f]}),(0,n.jsx)(WalletButtonSlot,{height:s,borderRadius:m,containerRef:p})}exports.AmosApplePayButton=AmosApplePayButton,exports.AmosBankAccountPaymentMethodForm=AmosBankAccountPaymentMethodForm,exports.AmosCreditCardPaymentMethodForm=AmosCreditCardPaymentMethodForm,exports.AmosGooglePayButton=AmosGooglePayButton,exports.confirmPayment=confirmPayment,exports.confirmSetup=confirmSetup,exports.focusField=focusField,exports.resetForm=resetForm,exports.validateForm=validateForm,Object.keys(e).forEach(function(t){t!=="default"&&!Object.prototype.hasOwnProperty.call(exports,t)&&Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
package/dist/index.mjs CHANGED
@@ -96,87 +96,81 @@ function WalletButtonSlot({ height: e, borderRadius: t, containerRef: r }) {
96
96
  })]
97
97
  });
98
98
  }
99
- function mountCreditCardPaymentMethodForm(e, t) {
100
- return o(e, t);
101
- }
102
- function mountBankAccountPaymentMethodForm(e, t) {
103
- return a(e, t);
104
- }
105
- function AmosCreditCardPaymentMethodForm({ ref: e, renderToken: t, appearance: n, onValidityChange: r, onCardBrandChanged: i, onPostalCodeChange: a, onEscapeKeyPressed: o, additionalFields: s = { cardholderName: !1 }, billingAddressRequirement: c = "country", defaultValues: l, style: u, ...d }) {
106
- let f = p(null);
99
+ function AmosCreditCardPaymentMethodForm({ ref: e, renderToken: t, appearance: n, onValidityChange: r, onCardBrandChanged: i, onPostalCodeChange: a, onEscapeKeyPressed: s, additionalFields: c = { cardholderName: !1 }, billingAddressRequirement: l = "country", defaultValues: u, style: d, ...f }) {
100
+ let h = p(null);
107
101
  return useAmosEmbed({
108
- containerRef: f,
102
+ containerRef: h,
109
103
  iframeRef: e,
110
- mount: mountCreditCardPaymentMethodForm,
104
+ mount: o,
111
105
  options: {
112
106
  renderToken: t,
113
107
  appearance: n,
114
- additionalFields: s,
115
- billingAddressRequirement: c,
116
- defaultValues: l,
108
+ additionalFields: c,
109
+ billingAddressRequirement: l,
110
+ defaultValues: u,
117
111
  onValidityChange: r,
118
112
  onCardBrandChanged: i,
119
113
  onPostalCodeChange: a,
120
- onEscapeKeyPressed: o
114
+ onEscapeKeyPressed: s
121
115
  },
122
116
  remountDeps: [
123
117
  t,
124
- s.cardholderName,
125
- c
118
+ c.cardholderName,
119
+ l
126
120
  ],
127
121
  iframePassthrough: {
128
- style: u,
129
- ...d
122
+ style: d,
123
+ ...f
130
124
  },
131
125
  updateDeps: [
132
126
  n,
133
- s,
134
127
  c,
135
128
  l,
129
+ u,
136
130
  r,
137
131
  i,
138
132
  a,
139
- o
133
+ s
140
134
  ]
141
- }), /* @__PURE__ */ m("div", { ref: f });
135
+ }), /* @__PURE__ */ m("div", { ref: h });
142
136
  }
143
- function AmosBankAccountPaymentMethodForm({ ref: e, renderToken: t, appearance: n, onValidityChange: r, onPostalCodeChange: i, onEscapeKeyPressed: a, billingAddressRequirement: o = "country", defaultValues: s, requireAchVerification: c = !1, intent: l = "payment", style: u, ...d }) {
144
- let f = p(null);
137
+ function AmosBankAccountPaymentMethodForm({ ref: e, renderToken: t, appearance: n, onValidityChange: r, onPostalCodeChange: i, onEscapeKeyPressed: o, billingAddressRequirement: s = "country", defaultValues: c, requireAchVerification: l = !1, intent: u = "payment", style: d, ...f }) {
138
+ let h = p(null);
145
139
  return useAmosEmbed({
146
- containerRef: f,
140
+ containerRef: h,
147
141
  iframeRef: e,
148
- mount: mountBankAccountPaymentMethodForm,
142
+ mount: a,
149
143
  options: {
150
144
  renderToken: t,
151
145
  appearance: n,
152
- billingAddressRequirement: o,
153
- defaultValues: s,
154
- requireAchVerification: c,
155
- intent: l,
146
+ billingAddressRequirement: s,
147
+ defaultValues: c,
148
+ requireAchVerification: l,
149
+ intent: u,
156
150
  onValidityChange: r,
157
151
  onPostalCodeChange: i,
158
- onEscapeKeyPressed: a
152
+ onEscapeKeyPressed: o
159
153
  },
160
154
  remountDeps: [
161
155
  t,
162
- o,
163
- l
156
+ s,
157
+ u
164
158
  ],
165
159
  iframePassthrough: {
166
- style: u,
167
- ...d
160
+ style: d,
161
+ ...f
168
162
  },
169
163
  updateDeps: [
170
164
  n,
171
- o,
172
165
  s,
173
166
  c,
174
167
  l,
168
+ u,
175
169
  r,
176
170
  i,
177
- a
171
+ o
178
172
  ]
179
- }), /* @__PURE__ */ m("div", { ref: f });
173
+ }), /* @__PURE__ */ m("div", { ref: h });
180
174
  }
181
175
  function AmosGooglePayButton({ ref: e, renderToken: t, amount: n, merchantName: r, height: i = "48px", buttonProps: a, phoneRequired: o, shippingAddressRequired: c, iframeProps: u, onConfirm: d }) {
182
176
  let f = p(null), h = l({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amos.com/react-amos-js",
3
- "version": "0.11.24",
3
+ "version": "0.11.26",
4
4
  "main": "dist/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -57,7 +57,7 @@
57
57
  "vite-plugin-dts": "5.1.1"
58
58
  },
59
59
  "dependencies": {
60
- "@amos.com/amos-js": "0.11.26",
60
+ "@amos.com/amos-js": "0.11.28",
61
61
  "@types/googlepay": "0.7.13"
62
62
  },
63
63
  "peerDependencies": {
package/src/index.tsx CHANGED
@@ -20,6 +20,7 @@ import {
20
20
  mountAmosGooglePayButton,
21
21
  type PaymentMethodFormDefaultValues,
22
22
  type PaymentMethodFormField,
23
+ type PaymentMethodFormPostalCodeChangeEvent,
23
24
  resolveWalletButtonSkeletonBorderRadius,
24
25
  type WalletCustomerCreateAttributes,
25
26
  } from "@amos.com/amos-js";
@@ -296,35 +297,6 @@ function WalletButtonSlot({
296
297
  );
297
298
  }
298
299
 
299
- type PostalCodeChangeHandler = (event: {
300
- postalCode: string | null;
301
- country: string;
302
- }) => void;
303
-
304
- /**
305
- * The installed `@amos.com/amos-js` types may not include
306
- * `onPostalCodeChange` until that package is published. The mount
307
- * parameter accepts the extra field; the runtime object still carries
308
- * it into `attachPaymentMethodFormListeners`.
309
- */
310
- function mountCreditCardPaymentMethodForm(
311
- container: HTMLElement,
312
- options: Parameters<typeof mountAmosCreditCardPaymentMethodForm>[1] & {
313
- onPostalCodeChange?: PostalCodeChangeHandler;
314
- },
315
- ) {
316
- return mountAmosCreditCardPaymentMethodForm(container, options);
317
- }
318
-
319
- function mountBankAccountPaymentMethodForm(
320
- container: HTMLElement,
321
- options: Parameters<typeof mountAmosBankAccountPaymentMethodForm>[1] & {
322
- onPostalCodeChange?: PostalCodeChangeHandler;
323
- },
324
- ) {
325
- return mountAmosBankAccountPaymentMethodForm(container, options);
326
- }
327
-
328
300
  type AmosCreditCardPaymentMethodFormProps = IframePassthroughProps & {
329
301
  renderToken: string;
330
302
  appearance?: Appearance;
@@ -353,7 +325,7 @@ type AmosCreditCardPaymentMethodFormProps = IframePassthroughProps & {
353
325
  * one. `postalCode` is null when a finished code becomes incomplete.
354
326
  * Incomplete keystrokes and `defaultValues` writes are omitted.
355
327
  */
356
- onPostalCodeChange?: PostalCodeChangeHandler;
328
+ onPostalCodeChange?: (event: PaymentMethodFormPostalCodeChangeEvent) => void;
357
329
  /**
358
330
  * Called when the customer presses Escape in the iframe. PCI-safe —
359
331
  * no field values. Use this to close a host modal that contains the
@@ -391,7 +363,7 @@ export function AmosCreditCardPaymentMethodForm({
391
363
  useAmosEmbed({
392
364
  containerRef,
393
365
  iframeRef: ref as ForwardedIframeRef,
394
- mount: mountCreditCardPaymentMethodForm,
366
+ mount: mountAmosCreditCardPaymentMethodForm,
395
367
  options: {
396
368
  renderToken,
397
369
  appearance,
@@ -446,7 +418,7 @@ type AmosBankAccountPaymentMethodFormProps = IframePassthroughProps & {
446
418
  * one. `postalCode` is null when a finished code becomes incomplete.
447
419
  * Incomplete keystrokes and `defaultValues` writes are omitted.
448
420
  */
449
- onPostalCodeChange?: PostalCodeChangeHandler;
421
+ onPostalCodeChange?: (event: PaymentMethodFormPostalCodeChangeEvent) => void;
450
422
  billingAddressRequirement?: BillingAddressRequirement;
451
423
  /**
452
424
  * Seed account holder name and billing address. Provided keys
@@ -496,7 +468,7 @@ export function AmosBankAccountPaymentMethodForm({
496
468
  useAmosEmbed({
497
469
  containerRef,
498
470
  iframeRef: ref as ForwardedIframeRef,
499
- mount: mountBankAccountPaymentMethodForm,
471
+ mount: mountAmosBankAccountPaymentMethodForm,
500
472
  options: {
501
473
  renderToken,
502
474
  appearance,