@lockerverse/react 0.2.52 → 0.2.54

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
@@ -1,18 +1,24 @@
1
1
  # `@lockerverse/react`
2
2
 
3
- React payment UI for Lockerverse checkout. The host owns product selection; this package renders and completes the payment step with Stripe Elements.
3
+ Tree-shakable React UI for Lockerverse payment and signup widgets. The Core SDK is installed automatically as a normal package dependency.
4
4
 
5
5
  ## Install
6
6
 
7
7
  ```sh
8
- npm install @lockerverse/react @stripe/react-stripe-js @stripe/stripe-js react react-dom
8
+ npm install @lockerverse/react react react-dom
9
+ ```
10
+
11
+ For payment UI, also install the optional Stripe peers:
12
+
13
+ ```sh
14
+ npm install @stripe/react-stripe-js @stripe/stripe-js
9
15
  ```
10
16
 
11
17
  ## Use
12
18
 
13
19
  ```tsx
14
- import { LockerversePayment } from "@lockerverse/react";
15
- import "@lockerverse/react/styles.css";
20
+ import { LockerversePayment } from "@lockerverse/react/payment";
21
+ import "@lockerverse/react/payment.css";
16
22
 
17
23
  export function Checkout() {
18
24
  return (
@@ -33,6 +39,36 @@ export function Checkout() {
33
39
  }
34
40
  ```
35
41
 
42
+ The original `@lockerverse/react` and `@lockerverse/react/styles.css` payment imports remain supported.
43
+
44
+ ## Signup
45
+
46
+ The signup entry does not import payment or Stripe code.
47
+
48
+ ```tsx
49
+ import { LockerverseSignup } from "@lockerverse/react/signup";
50
+ import "@lockerverse/react/signup.css";
51
+
52
+ export function Signup() {
53
+ return (
54
+ <LockerverseSignup
55
+ branding={{
56
+ accentColor: "#5751f2",
57
+ imageUrl: "https://cdn.example.com/community.png",
58
+ name: "Auburn",
59
+ }}
60
+ communitySlug="auburn"
61
+ onSignupComplete={(submission) => {
62
+ console.info("Signup complete", submission.id);
63
+ }}
64
+ signupSlug="tailgate-guests"
65
+ />
66
+ );
67
+ }
68
+ ```
69
+
70
+ Pass `googlePlacesApiKey` to enable US address suggestions when the signup asks for an address. Manual address entry always remains available.
71
+
36
72
  For a development HTTPS backend, provide `apiBaseUrl`. The backend supplies the
37
73
  correct Stripe public key.
38
74
 
@@ -0,0 +1,2 @@
1
+ import{array as e,email as t,minLength as n,nonEmpty as r,pipe as i,regex as a,safeParse as o,string as s,transform as c,trim as l}from"valibot";import{jsx as u,jsxs as d}from"react/jsx-runtime";const f=/^#([\da-f]{3}|[\da-f]{6})$/i;function p(e){let t=f.exec(e.trim());if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function m([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function h(e){let t=p(e);if(!t)return;let n=m(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}function g(e){return Object.fromEntries(e.map(e=>[e.id,e.type===`checkboxes`||e.type===`multi_select`?[]:``]))}function _(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:typeof n==`string`?n:``}})}function v(t,a){let c={};for(let u of t){if(!u.required)continue;let t=`${u.label} is required.`,d=a[u.id],f=u.type===`checkboxes`||u.type===`multi_select`?o(i(e(s()),n(1,t)),d??[]):o(i(s(),l(),r(t)),typeof d==`string`?d:``);f.success||(c[u.id]=f.issues[0]?.message??t)}return c}function y({choiceClassName:e,errorClassName:t,errors:n,fields:r,idPrefix:i,onChange:a,values:o}){return r.map(r=>u(b,{choiceClassName:e,error:n[r.id],errorClassName:t,field:r,idPrefix:i,onChange:e=>a({...o,[r.id]:e}),value:o[r.id]},r.id))}function b(e){let{field:t,idPrefix:n}=e,r=`${n}-custom-${t.id}`,i=`${r}-error`,a={...e,controlId:r,errorId:i};switch(t.type){case`text`:case`textarea`:return u(S,{...a,field:t});case`select`:case`multi_select`:return u(C,{...a,field:t});case`radio`:case`checkboxes`:return u(w,{...a,field:t});default:return null}}function x({className:e,error:t,id:n}){return t?u(`span`,{className:e,id:n,role:`alert`,children:t}):null}function S({controlId:e,error:t,errorClassName:n,errorId:r,field:i,onChange:a,value:o}){let s={"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,id:e,name:`custom:${i.id}`,onChange:e=>a(e.currentTarget.value),required:i.required,value:typeof o==`string`?o:``};return d(`label`,{htmlFor:e,children:[u(`span`,{children:i.label}),i.type===`textarea`?u(`textarea`,{...s}):u(`input`,{...s}),u(x,{className:n,error:t,id:r})]})}function C({controlId:e,error:t,errorClassName:n,errorId:r,field:i,onChange:a,value:o}){return d(`label`,{htmlFor:e,children:[u(`span`,{children:i.label}),d(`select`,{"aria-describedby":t?r:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:i.type===`multi_select`,name:`custom:${i.id}`,onChange:e=>a(i.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:i.required,value:o??(i.type===`multi_select`?[]:``),children:[i.type===`select`?u(`option`,{value:``,children:`Select…`}):null,i.options.map(e=>u(`option`,{value:e.id,children:e.label},e.id))]}),u(x,{className:n,error:t,id:r})]})}function w({choiceClassName:e,controlId:t,error:n,errorClassName:r,errorId:i,field:a,onChange:o,value:s}){let c=Array.isArray(s)?s:[];return d(`fieldset`,{"aria-describedby":n?i:void 0,"aria-invalid":n?`true`:void 0,children:[u(`legend`,{children:a.label}),a.options.map((n,r)=>d(`label`,{className:e,children:[u(`input`,{checked:Array.isArray(s)?s.includes(n.id):s===n.id,id:`${t}-${r}`,name:`custom:${a.id}`,onChange:e=>{if(a.type===`radio`){o(n.id);return}o(e.currentTarget.checked?[...c,n.id]:c.filter(e=>e!==n.id))},required:a.required&&a.type===`radio`,type:a.type===`radio`?`radio`:`checkbox`,value:n.id}),u(`span`,{children:n.label})]},n.id)),u(x,{className:r,error:n,id:i})]})}const T=`Enter a valid email address.`,E=`Enter a valid phone number.`,D=/^(?:$|[^\s@]+@[^\s@]+\.[^\s@]+)$/,O=/^\+[1-9]\d{6,14}$/,k=/^(?:$|\+[1-9]\d{6,14})$/;function A(e){return e.trim().replace(/[().\s-]/g,``)}const j=i(s(),l(),a(D,T)),M=i(s(),l(),r(`Email is required.`),t(T)),N=i(s(),l(),c(A),a(k,E)),P=i(s(),l(),r(`Phone is required.`),c(A),a(O,E));export{P as a,g as c,M as i,v as l,j as n,y as o,N as r,_ as s,A as t,h as u};
2
+ //# sourceMappingURL=contact-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-validation.js","names":[],"sources":["../src/accent-contrast.ts","../src/custom-fields.tsx","../src/contact-validation.ts"],"sourcesContent":["const HEX_COLOR = /^#([\\da-f]{3}|[\\da-f]{6})$/i;\n\nfunction parseHexColor(color: string) {\n const match = HEX_COLOR.exec(color.trim());\n if (!match) {\n return;\n }\n const [, value] = match;\n if (!value) {\n return;\n }\n const expanded =\n value.length === 3\n ? Array.from(value, (character) => `${character}${character}`).join(\"\")\n : value;\n return [0, 2, 4].map((offset) =>\n Number.parseInt(expanded.slice(offset, offset + 2), 16)\n );\n}\n\nfunction relativeLuminance([red, green, blue]: number[]) {\n const [linearRed = 0, linearGreen = 0, linearBlue = 0] = [\n red,\n green,\n blue,\n ].map((channel = 0) => {\n const normalized = channel / 255;\n return normalized <= 0.040_45\n ? normalized / 12.92\n : ((normalized + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * linearRed + 0.7152 * linearGreen + 0.0722 * linearBlue;\n}\n\nexport function getAccentContrast(color: string) {\n const parsed = parseHexColor(color);\n if (!parsed) {\n return;\n }\n const luminance = relativeLuminance(parsed);\n const blackContrast = (luminance + 0.05) / 0.05;\n const whiteContrast = 1.05 / (luminance + 0.05);\n return blackContrast >= whiteContrast ? \"#000\" : \"#fff\";\n}\n","import type {\n LockerverseCustomField,\n LockerverseCustomFieldAnswer,\n LockerverseMultiOptionCustomField,\n LockerverseSingleOptionCustomField,\n} from \"@lockerverse/sdk/checkout\";\nimport {\n array,\n minLength,\n nonEmpty,\n pipe,\n safeParse,\n string,\n trim,\n} from \"valibot\";\n\nexport type CustomFieldValues = Record<string, string | string[]>;\n\nexport function createCustomFieldValues(fields: LockerverseCustomField[]) {\n return Object.fromEntries(\n fields.map((field) => [\n field.id,\n field.type === \"checkboxes\" || field.type === \"multi_select\" ? [] : \"\",\n ])\n ) as CustomFieldValues;\n}\n\nexport function buildCustomFieldAnswers(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n): LockerverseCustomFieldAnswer[] {\n return fields.map((field): LockerverseCustomFieldAnswer => {\n const value = values[field.id];\n return field.type === \"checkboxes\" || field.type === \"multi_select\"\n ? { fieldId: field.id, value: Array.isArray(value) ? value : [] }\n : {\n fieldId: field.id,\n value: typeof value === \"string\" ? value : \"\",\n };\n });\n}\n\nexport function validateCustomFields(\n fields: LockerverseCustomField[],\n values: CustomFieldValues\n) {\n const errors: Record<string, string> = {};\n for (const field of fields) {\n if (!field.required) {\n continue;\n }\n const message = `${field.label} is required.`;\n const value = values[field.id];\n const result =\n field.type === \"checkboxes\" || field.type === \"multi_select\"\n ? safeParse(pipe(array(string()), minLength(1, message)), value ?? [])\n : safeParse(\n pipe(string(), trim(), nonEmpty(message)),\n typeof value === \"string\" ? value : \"\"\n );\n if (!result.success) {\n errors[field.id] = result.issues[0]?.message ?? message;\n }\n }\n return errors;\n}\n\nexport function CustomFields({\n choiceClassName,\n errorClassName,\n errors,\n fields,\n idPrefix,\n onChange,\n values,\n}: {\n choiceClassName: string;\n errorClassName: string;\n errors: Record<string, string>;\n fields: LockerverseCustomField[];\n idPrefix: string;\n onChange: (values: CustomFieldValues) => void;\n values: CustomFieldValues;\n}) {\n return fields.map((field) => (\n <CustomField\n choiceClassName={choiceClassName}\n error={errors[field.id]}\n errorClassName={errorClassName}\n field={field}\n idPrefix={idPrefix}\n key={field.id}\n onChange={(value) => onChange({ ...values, [field.id]: value })}\n value={values[field.id]}\n />\n ));\n}\n\ntype CustomFieldProps = {\n choiceClassName: string;\n error: string | undefined;\n errorClassName: string;\n field: LockerverseCustomField;\n idPrefix: string;\n onChange: (value: string | string[]) => void;\n value: string | string[] | undefined;\n};\n\nfunction CustomField(props: CustomFieldProps) {\n const { field, idPrefix } = props;\n const controlId = `${idPrefix}-custom-${field.id}`;\n const errorId = `${controlId}-error`;\n const controlProps = { ...props, controlId, errorId };\n switch (field.type) {\n case \"text\":\n case \"textarea\":\n return <TextCustomField {...controlProps} field={field} />;\n case \"select\":\n case \"multi_select\":\n return <SelectCustomField {...controlProps} field={field} />;\n case \"radio\":\n case \"checkboxes\":\n return <ChoiceCustomField {...controlProps} field={field} />;\n default:\n return null;\n }\n}\n\ntype ControlProps = CustomFieldProps & {\n controlId: string;\n errorId: string;\n};\n\nfunction FieldError({\n className,\n error,\n id,\n}: {\n className: string;\n error: string | undefined;\n id: string;\n}) {\n return error ? (\n <span className={className} id={id} role=\"alert\">\n {error}\n </span>\n ) : null;\n}\n\nfunction TextCustomField({\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: Extract<LockerverseCustomField, { type: \"text\" | \"textarea\" }>;\n}) {\n const commonProps = {\n \"aria-describedby\": error ? errorId : undefined,\n \"aria-invalid\": error ? (\"true\" as const) : undefined,\n id: controlId,\n name: `custom:${field.id}`,\n onChange: (\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => onChange(event.currentTarget.value),\n required: field.required,\n value: typeof value === \"string\" ? value : \"\",\n };\n return (\n <label htmlFor={controlId}>\n <span>{field.label}</span>\n {field.type === \"textarea\" ? (\n <textarea {...commonProps} />\n ) : (\n <input {...commonProps} />\n )}\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\nfunction SelectCustomField({\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n return (\n <label htmlFor={controlId}>\n <span>{field.label}</span>\n <select\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n id={controlId}\n multiple={field.type === \"multi_select\"}\n name={`custom:${field.id}`}\n onChange={(event) =>\n onChange(\n field.type === \"multi_select\"\n ? [...event.currentTarget.selectedOptions].map(\n (option) => option.value\n )\n : event.currentTarget.value\n )\n }\n required={field.required}\n value={value ?? (field.type === \"multi_select\" ? [] : \"\")}\n >\n {field.type === \"select\" ? <option value=\"\">Select…</option> : null}\n {field.options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n <FieldError className={errorClassName} error={error} id={errorId} />\n </label>\n );\n}\n\nfunction ChoiceCustomField({\n choiceClassName,\n controlId,\n error,\n errorClassName,\n errorId,\n field,\n onChange,\n value,\n}: ControlProps & {\n field: LockerverseMultiOptionCustomField | LockerverseSingleOptionCustomField;\n}) {\n const selectedValues = Array.isArray(value) ? value : [];\n return (\n <fieldset\n aria-describedby={error ? errorId : undefined}\n aria-invalid={error ? \"true\" : undefined}\n >\n <legend>{field.label}</legend>\n {field.options.map((option, index) => (\n <label className={choiceClassName} key={option.id}>\n <input\n checked={\n Array.isArray(value)\n ? value.includes(option.id)\n : value === option.id\n }\n id={`${controlId}-${index}`}\n name={`custom:${field.id}`}\n onChange={(event) => {\n if (field.type === \"radio\") {\n onChange(option.id);\n return;\n }\n onChange(\n event.currentTarget.checked\n ? [...selectedValues, option.id]\n : selectedValues.filter((id) => id !== option.id)\n );\n }}\n required={field.required && field.type === \"radio\"}\n type={field.type === \"radio\" ? \"radio\" : \"checkbox\"}\n value={option.id}\n />\n <span>{option.label}</span>\n </label>\n ))}\n <FieldError className={errorClassName} error={error} id={errorId} />\n </fieldset>\n );\n}\n","import { email, nonEmpty, pipe, regex, string, transform, trim } from \"valibot\";\n\nexport const EMAIL_REQUIRED_MESSAGE = \"Email is required.\";\nexport const EMAIL_INVALID_MESSAGE = \"Enter a valid email address.\";\nexport const PHONE_REQUIRED_MESSAGE = \"Phone is required.\";\nexport const PHONE_INVALID_MESSAGE = \"Enter a valid phone number.\";\n\nconst OPTIONAL_EMAIL_PATTERN = /^(?:$|[^\\s@]+@[^\\s@]+\\.[^\\s@]+)$/;\nconst INTERNATIONAL_PHONE_PATTERN = /^\\+[1-9]\\d{6,14}$/;\nconst OPTIONAL_INTERNATIONAL_PHONE_PATTERN = /^(?:$|\\+[1-9]\\d{6,14})$/;\n\nexport function normalizePhone(input: string) {\n return input.trim().replace(/[().\\s-]/g, \"\");\n}\n\nexport const optionalEmailSchema = pipe(\n string(),\n trim(),\n regex(OPTIONAL_EMAIL_PATTERN, EMAIL_INVALID_MESSAGE)\n);\n\nexport const requiredEmailSchema = pipe(\n string(),\n trim(),\n nonEmpty(EMAIL_REQUIRED_MESSAGE),\n email(EMAIL_INVALID_MESSAGE)\n);\n\nexport const optionalPhoneSchema = pipe(\n string(),\n trim(),\n transform(normalizePhone),\n regex(OPTIONAL_INTERNATIONAL_PHONE_PATTERN, PHONE_INVALID_MESSAGE)\n);\n\nexport const requiredPhoneSchema = pipe(\n string(),\n trim(),\n nonEmpty(PHONE_REQUIRED_MESSAGE),\n transform(normalizePhone),\n regex(INTERNATIONAL_PHONE_PATTERN, PHONE_INVALID_MESSAGE)\n);\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,59 +1,2 @@
1
- import { loadStripe } from "@stripe/stripe-js";
2
- import { CSSProperties, ComponentPropsWithoutRef } from "react";
3
- import { CreateLockerverseWidgetOptions, LockerversePaymentResult } from "@lockerverse/sdk/checkout";
4
- //#region src/types.d.ts
5
- type LockerversePaymentSelectionItem = {
6
- amountCents: number;
7
- productSlug: string;
8
- } | {
9
- productSlug: string;
10
- quantity: number;
11
- };
12
- type LockerversePaymentTheme = "dark" | "light";
13
- type LockerversePaymentBranding = {
14
- accentColor?: string;
15
- imageUrl?: string | null;
16
- name: string;
17
- };
18
- type LockerversePaymentStyle = CSSProperties & {
19
- "--lockerverse-accent"?: string;
20
- "--lockerverse-accent-contrast"?: string;
21
- "--lockerverse-bg"?: string;
22
- "--lockerverse-border"?: string;
23
- "--lockerverse-control"?: string;
24
- "--lockerverse-danger"?: string;
25
- "--lockerverse-danger-border"?: string;
26
- "--lockerverse-font-family"?: string;
27
- "--lockerverse-muted"?: string;
28
- "--lockerverse-placeholder"?: string;
29
- "--lockerverse-radius"?: string;
30
- "--lockerverse-subtle"?: string;
31
- "--lockerverse-text"?: string;
32
- };
33
- type LockerversePaymentUncertain = {
34
- paymentReference: string;
35
- reason: "action_required" | "pending" | "recovery_failed";
36
- };
37
- type LockerversePaymentRecovery = {
38
- connectedAccountId: string | null;
39
- paymentReference: string;
40
- };
41
- type LockerverseStripeLoader = (...args: Parameters<typeof loadStripe>) => ReturnType<typeof loadStripe>;
42
- type LockerversePaymentProps = CreateLockerverseWidgetOptions & Omit<ComponentPropsWithoutRef<"section">, "children" | "onError"> & {
43
- branding?: LockerversePaymentBranding;
44
- metadata?: Record<string, string>;
45
- onPaymentComplete?: (payment: LockerversePaymentResult) => void;
46
- onPaymentRecoveryChange?: (recovery: LockerversePaymentRecovery | null) => void;
47
- onPaymentUncertain?: (payment: LockerversePaymentUncertain) => void;
48
- resumePayment?: LockerversePaymentRecovery | null;
49
- selection: LockerversePaymentSelectionItem[];
50
- stripeLoader?: LockerverseStripeLoader;
51
- style?: LockerversePaymentStyle;
52
- theme?: LockerversePaymentTheme;
53
- };
54
- //#endregion
55
- //#region src/lockerverse-payment.d.ts
56
- declare function LockerversePayment({ apiBaseUrl, branding, className, communitySlug, environment, fetch, metadata, onError, onPaymentComplete, onPaymentRecoveryChange, onPaymentUncertain, requestTimeoutMs, resumePayment, selection, sentryDsn, style, stripeLoader, theme, widgetSlug, ...sectionProps }: LockerversePaymentProps): import("react").JSX.Element;
57
- //#endregion
58
- export { LockerversePayment, type LockerversePaymentBranding, type LockerversePaymentProps, type LockerversePaymentRecovery, type LockerversePaymentSelectionItem, type LockerversePaymentStyle, type LockerversePaymentTheme, type LockerversePaymentUncertain, type LockerverseStripeLoader };
59
- //# sourceMappingURL=index.d.ts.map
1
+ import { a as LockerversePaymentSelectionItem, c as LockerversePaymentUncertain, i as LockerversePaymentRecovery, l as LockerverseStripeLoader, n as LockerversePaymentBranding, o as LockerversePaymentStyle, r as LockerversePaymentProps, s as LockerversePaymentTheme, t as LockerversePayment } from "./lockerverse-payment.js";
2
+ export { LockerversePayment, type LockerversePaymentBranding, type LockerversePaymentProps, type LockerversePaymentRecovery, type LockerversePaymentSelectionItem, type LockerversePaymentStyle, type LockerversePaymentTheme, type LockerversePaymentUncertain, type LockerverseStripeLoader };
package/dist/index.js CHANGED
@@ -1,2 +1 @@
1
- import{AddressElement as e,Elements as t,PaymentElement as n,useElements as r,useStripe as i}from"@stripe/react-stripe-js";import{loadStripe as a}from"@stripe/stripe-js";import{createContext as o,useContext as s,useEffect as c,useId as l,useMemo as u,useReducer as d,useRef as f,useState as p}from"react";import{Select as m}from"@base-ui/react/select";import{Fragment as h,jsx as g,jsxs as _}from"react/jsx-runtime";import{LockerverseSdkError as v,createLockerverseCheckoutClient as y}from"@lockerverse/sdk/checkout";import{array as b,email as x,minLength as S,minValue as C,nonEmpty as w,number as T,object as E,pipe as D,regex as O,safeInteger as ee,safeParse as k,strictObject as A,string as j,trim as M,union as N}from"valibot";const P=/^#([\da-f]{3}|[\da-f]{6})$/i;function F(e){let t=P.exec(e.trim());if(!t)return;let[,n]=t;if(!n)return;let r=n.length===3?Array.from(n,e=>`${e}${e}`).join(``):n;return[0,2,4].map(e=>Number.parseInt(r.slice(e,e+2),16))}function I([e,t,n]){let[r=0,i=0,a=0]=[e,t,n].map((e=0)=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4});return .2126*r+.7152*i+.0722*a}function te(e){let t=F(e);if(!t)return;let n=I(t);return(n+.05)/.05>=1.05/(n+.05)?`#000`:`#fff`}const L=o(void 0);function ne({children:e,container:t}){return g(L.Provider,{value:t,children:e})}function R(){return g(`svg`,{"aria-hidden":`true`,fill:`none`,viewBox:`0 0 16 16`,children:g(`path`,{d:`m4 6 4 4 4-4`})})}function z(){return g(`svg`,{"aria-hidden":`true`,fill:`none`,viewBox:`0 0 16 16`,children:g(`path`,{d:`m3 8 3 3 7-7`})})}function B({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:c,options:l,value:u}){let d=s(L),f=[`lockerverse-payment__select`,r].filter(Boolean).join(` `);return g(`div`,{className:f,children:_(m.Root,{id:i,items:l,name:o,onValueChange:e=>{e!==null&&c(e)},value:u,children:[_(m.Trigger,{"aria-describedby":e,"aria-invalid":a||void 0,"aria-label":t,"aria-labelledby":n,className:`lockerverse-payment__select-trigger`,children:[g(m.Value,{}),g(m.Icon,{"aria-hidden":`true`,className:`lockerverse-payment__select-icon`,children:g(R,{})})]}),g(m.Portal,{container:d,children:g(m.Positioner,{alignItemWithTrigger:!1,className:`lockerverse-payment__select-positioner`,sideOffset:6,children:g(m.Popup,{className:`lockerverse-payment__select-popup`,children:g(m.List,{className:`lockerverse-payment__select-list`,children:l.map(e=>_(m.Item,{className:`lockerverse-payment__select-item`,value:e.value,children:[g(m.ItemText,{children:e.label}),g(m.ItemIndicator,{"aria-hidden":`true`,className:`lockerverse-payment__select-item-indicator`,children:g(z,{})})]},e.value))})})})})]})})}const re=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],V=[`15`,`12`,`10`,`5`],H=[...V,`custom`];function ie({enabled:e,error:t,errorId:n,onChange:r,values:i}){if(!e)return null;let a=e=>r({...i,...e}),o=(e,t)=>{let n=H.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%H.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+H.length)%H.length;break;case`Home`:r=0;break;case`End`:r=H.length-1;break;default:return}e.preventDefault();let i=H[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return _(`div`,{className:`lockerverse-payment__tip-box`,children:[g(`p`,{children:`Add a tip to support the Lockerverse platform`}),_(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[V.map(e=>_(`label`,{className:`lockerverse-payment__tip-choice`,children:[g(`input`,{checked:i.tipPercent===e,name:`tipPercent`,onChange:()=>a({tipPercent:e}),onKeyDown:t=>o(t,e),tabIndex:i.tipPercent===e?0:-1,type:`radio`,value:e}),_(`span`,{children:[e,`%`]})]},e)),_(`label`,{className:`lockerverse-payment__tip-choice`,children:[g(`input`,{checked:i.tipPercent===`custom`,name:`tipPercent`,onChange:()=>a({tipPercent:`custom`}),onKeyDown:e=>o(e,`custom`),tabIndex:i.tipPercent===`custom`?0:-1,type:`radio`,value:`custom`}),g(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?_(`label`,{children:[g(`span`,{children:`Custom tip`}),_(`span`,{className:`lockerverse-payment__money-input`,children:[g(`span`,{"aria-hidden":`true`,children:`$`}),g(`input`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,inputMode:`decimal`,name:`tip`,onChange:e=>a({customTip:e.currentTarget.value}),placeholder:`0.00`,value:i.customTip})]}),t?g(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):g(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function ae({checked:e,children:t,name:n,onChange:r}){return _(`label`,{className:`lockerverse-payment__check-row`,children:[g(`input`,{checked:e,name:n,onChange:e=>r(e.currentTarget.checked),type:`checkbox`}),g(`span`,{children:t})]})}function oe({customFields:e,errors:t,fields:n,idPrefix:r,isPromoApplying:i,onChange:a,onApplyPromo:o,promoError:s,values:c}){let l=e=>a({...c,...e});return _(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?_(`label`,{children:[g(`span`,{children:`Member ID`}),g(`input`,{name:`memberId`,onChange:e=>l({memberId:e.currentTarget.value}),placeholder:`Optional`,value:c.memberId})]}):null,n.merchSize?_(`div`,{className:`lockerverse-payment__field`,children:[g(`span`,{id:`${r}-merch-size-label`,children:`Size`}),g(B,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>l({merchSize:e}),options:re.map(e=>({label:e,value:e})),value:c.merchSize})]}):null,n.promoCode?_(`div`,{className:`lockerverse-payment__field`,children:[g(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),_(`div`,{className:`lockerverse-payment__promo-control`,children:[g(`input`,{"aria-describedby":s?`${r}-promo-code-error`:void 0,"aria-invalid":s?`true`:void 0,"aria-labelledby":`${r}-promo-code-label`,name:`promoCode`,onChange:e=>l({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:c.promoCode}),g(`button`,{disabled:!c.promoCode.trim()||i,onClick:o,type:`button`,children:i?`Applying…`:`Apply`})]}),s?g(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:s}):null]}):null,e.map(e=>g(U,{error:t[e.id],field:e,idPrefix:r,onChange:t=>l({customFields:{...c.customFields,[e.id]:t}}),value:c.customFields[e.id]},e.id))]})}function se({amountCents:e,enabled:t,onChange:n,values:r}){return t?_(ae,{checked:r.includeServiceFee,name:`includeServiceFee`,onChange:e=>n({...r,includeServiceFee:e}),children:[`Add `,de(e),` to help cover processing fees`]}):null}function U({error:e,field:t,idPrefix:n,onChange:r,value:i}){let a=`custom:${t.id}`,o=`${n}-custom-${t.id}`,s=`${o}-error`;switch(t.type){case`text`:case`textarea`:return g(W,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});case`select`:case`multi_select`:return g(le,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});case`radio`:case`checkboxes`:return g(ue,{controlId:o,error:e,errorId:s,field:t,name:a,onChange:r,value:i});default:return null}}function ce({error:e,id:t}){return e?g(`p`,{className:`lockerverse-payment__field-message`,id:t,children:e}):null}function W({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){let s={"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,id:e,name:i,onChange:e=>a(e.currentTarget.value),required:r.required,value:typeof o==`string`?o:``};return _(`label`,{htmlFor:e,children:[g(`span`,{children:r.label}),r.type===`textarea`?g(`textarea`,{...s}):g(`input`,{...s}),g(ce,{error:t,id:n})]})}function le({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){return _(`label`,{htmlFor:e,children:[g(`span`,{children:r.label}),_(`select`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,id:e,multiple:r.type===`multi_select`,name:i,onChange:e=>a(r.type===`multi_select`?[...e.currentTarget.selectedOptions].map(e=>e.value):e.currentTarget.value),required:r.required,value:o??(r.type===`multi_select`?[]:``),children:[r.type===`select`?g(`option`,{value:``,children:`Select…`}):null,r.options.map(e=>g(`option`,{value:e.id,children:e.label},e.id))]}),g(ce,{error:t,id:n})]})}function ue({controlId:e,error:t,errorId:n,field:r,name:i,onChange:a,value:o}){return _(`fieldset`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,children:[g(`legend`,{children:r.label}),r.options.map((t,n)=>{let s=Array.isArray(o)?o.includes(t.id):o===t.id;return _(`label`,{className:`lockerverse-payment__check-row`,children:[g(`input`,{checked:s,id:`${e}-${n}`,name:i,onChange:e=>{if(r.type===`radio`){a(t.id);return}let n=Array.isArray(o)?o:[];a(e.currentTarget.checked?[...n,t.id]:n.filter(e=>e!==t.id))},required:r.required,type:r.type===`radio`?`radio`:`checkbox`,value:t.id}),g(`span`,{children:t.label})]},t.id)}),g(ce,{error:t,id:n})]})}function de(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}const fe=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],G=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function pe(e,t,n){return(n===t.totalCents?G:fe).some(n=>e[n]!==t[n])||e.payment.connectedAccountId!==t.payment.connectedAccountId||e.payment.currency!==t.payment.currency||JSON.stringify(e.appliedDiscount)!==JSON.stringify(t.appliedDiscount)||JSON.stringify(e.lineItems)!==JSON.stringify(t.lineItems)}function K(e){return e.checkoutStatus===`success`?{kind:`success`,payment:e}:e.checkoutStatus===`failed`?{kind:`failed`,payment:e}:{kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`}}async function me(e,t,n){if(t.checkoutStatus!==`action_required`)return K(t);if(t.clientSecret)try{await n.handleNextAction({clientSecret:t.clientSecret})}catch{}try{return K(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function q(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof v&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return me(e,r,n)}async function he(e,t,n){try{return me(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const J=D(j(),M(),w()),Y=D(T(),ee(),C(1)),ge=D(b(N([A({amountCents:Y,productSlug:J}),A({productSlug:J,quantity:Y})])),S(1)),_e=D(j(),M(),O(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function ve(e){let t=k(_e,e);if(!t.success)return{message:t.issues[0]?.message??`Enter a valid tip amount.`,success:!1};let[n=`0`,r=``]=t.output.split(`.`),i=BigInt(n)*100n+BigInt(r.padEnd(2,`0`));return i>BigInt(2**53-1)?{message:`Enter a valid tip amount.`,success:!1}:{cents:Number(i),success:!0}}function ye(e){let t=k(ge,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}const be=D(j(),M(),w(`Email is required.`),x(`Enter a valid email address.`)),X=D(j(),M(),w(`Phone is required.`),O(/^\+[1-9]\d{6,14}$/,`Enter a valid phone number.`));function Z(e){return e.trim().replace(/[().\s-]/g,``)}function xe(e,t){let n=t?{...e,phone:Z(e.phone)}:e,r=E(t?{email:be,phone:X}:{email:be}),i=k(r,n);if(i.success)return{errors:{},value:i.output};let a={};for(let e of i.issues){let t=e.path?.[0]?.key;(t===`email`||t===`phone`)&&!a[t]&&(a[t]=e.message)}return{errors:a,value:null}}function Se(e,t){let n={};for(let r of e){if(!r.required)continue;let e=`${r.label} is required.`,i=t[r.id],a=r.type===`checkboxes`||r.type===`multi_select`?k(D(b(j()),S(1,e)),i??[]):k(D(j(),M(),w(e)),typeof i==`string`?i:``);a.success||(n[r.id]=a.issues[0]?.message??e)}return n}function Ce(e,t){switch(t.type){case`loading`:return{configuration:t.configuration,phase:`loading`,revision:e.revision,selectionKey:t.selectionKey};case`ready`:return{catalog:t.catalog,checkoutItems:t.checkoutItems,client:t.client,configuration:t.configuration,phase:`ready`,preparedCheckout:t.preparedCheckout,revision:e.revision+1,selectionKey:t.selectionKey};case`error`:return{configuration:t.configuration,failure:t.failure,phase:`error`,revision:e.revision,selectionKey:t.selectionKey};case`checkout`:return e.phase===`ready`?{...e,preparedCheckout:t.preparedCheckout}:e;case`retry`:return{phase:`idle`,revision:e.revision+1};default:return e}}function we(e,t){let{apiBaseUrl:n,communitySlug:r,environment:i,fetch:a,requestTimeoutMs:o,sentryDsn:s,widgetSlug:c}=e,l={communitySlug:r,widgetSlug:c,...a?{fetch:a}:{},...t?{onError:t}:{},...o===void 0?{}:{requestTimeoutMs:o},...s===void 0?{}:{sentryDsn:s}};if(n===void 0){if(i===`development`)throw TypeError(`Lockerverse development checkout requires an API base URL.`);return{...l,...i===`production`?{environment:i}:{}}}return{...l,apiBaseUrl:n,...i===void 0?{}:{environment:i}}}function Te(e,t,n){return e?.configuration===t&&e.selectionKey===n}function Ee({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,onError:i,paymentState:a,requestTimeoutMs:o,selection:s,sentryDsn:l,widgetSlug:p}){let m=u(()=>({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,requestTimeoutMs:o,sentryDsn:l,widgetSlug:p}),[e,t,n,r,o,l,p]),h=ye(s),g=h.success?JSON.stringify(h.value):`invalid-selection`,_=u(()=>h.success?JSON.parse(g):[],[h.success,g]),[v,b]=d(Ce,{phase:`idle`,revision:0}),x=f(void 0),S=f(void 0),C=f(i);return C.current=i,c(()=>{if(!h.success||a===`submitting`||a===`success`||a===`unresolved`||Te(S.current,m,g)||Te(x.current,m,g))return;let e=!0,t={configuration:m,selectionKey:g};x.current=t,b({configuration:m,selectionKey:g,type:`loading`});async function n(){try{let n=y(we(m,e=>C.current?.(e))),{catalog:r,checkout:i}=await n.bootstrapCheckout({items:_}),a=[...i.items];e&&(x.current=void 0,S.current=t,b({catalog:r,checkoutItems:a,client:n,configuration:m,preparedCheckout:i,selectionKey:g,type:`ready`}))}catch(n){e&&(x.current=void 0,S.current=t,b({configuration:m,failure:n instanceof Error?n.message:`Lockerverse payment could not load.`,selectionKey:g,type:`error`}))}}return n(),()=>{e=!1,Te(x.current,m,g)&&(x.current=void 0)}},[m,h.success,a,g,v.revision,_]),{retryCheckout:()=>{x.current=void 0,S.current=void 0,b({type:`retry`})},selectionError:h.success?void 0:h.message,session:v,updateCheckout:e=>b({preparedCheckout:e,type:`checkout`})}}function Q(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}function De(e,t){return t.tipPercent===`custom`?t.customTip.trim()?ve(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}const Oe=[{callingCode:`+1`,label:`🇺🇸 +1`,value:`US`},{callingCode:`+52`,label:`🇲🇽 +52`,value:`MX`},{callingCode:`+380`,label:`🇺🇦 +380`,value:`UA`},{callingCode:`+48`,label:`🇵🇱 +48`,value:`PL`},{callingCode:`+1`,label:`🇨🇦 +1`,value:`CA`},{callingCode:`+49`,label:`🇩🇪 +49`,value:`DE`},{callingCode:`+44`,label:`🇬🇧 +44`,value:`GB`},{callingCode:`+46`,label:`🇸🇪 +46`,value:`SE`},{callingCode:`+358`,label:`🇫🇮 +358`,value:`FI`},{callingCode:`+1`,label:`🇵🇷 +1`,value:`PR`}];function ke(e,t){return e.trim().startsWith(`+`)?e:`${Oe.find(e=>e.value===t)?.callingCode??`+1`}${e}`}function Ae(e,t){return e.map(e=>{let n=t[e.id];return e.type===`checkboxes`||e.type===`multi_select`?{fieldId:e.id,value:Array.isArray(n)?n:[]}:{fieldId:e.id,value:typeof n==`string`?n:``}})}function je(e,t,n,r){return{...n?{email:n}:{},...e.widget.fields.serviceFee?{includeServiceFee:t.includeServiceFee}:{},...e.widget.fields.promoCode&&t.promoCode.trim()?{promoCode:t.promoCode.trim()}:{},...e.widget.fields.tipping?{tipCents:r}:{}}}function Me(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function Ne(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:Me(r.shipping,`Shipping`)}function Pe({billingAddress:e,catalog:t,email:n,phone:r,shippingAddress:i}){return{payment_method_data:{billing_details:{address:e.address,email:n,name:e.name,...t.widget.fields.phone?{phone:r}:{}}},...i?{shipping:{address:i.address,name:i.name,phone:t.widget.fields.phone?r:i.phone??null}}:{}}}function Fe({catalog:e,confirmationToken:t,email:n,fieldValues:r,metadata:i,phone:a,shippingAddress:o}){return{...t?{confirmationToken:t}:{},customFieldAnswers:Ae(e.widget.customFields,r.customFields),email:n,...i?{metadata:i}:{},...e.widget.fields.memberId&&r.memberId.trim()?{memberId:r.memberId.trim()}:{},...e.widget.fields.merchSize?{merchSize:r.merchSize}:{},...e.widget.fields.phone?{phone:a}:{},...o?{shipping:{address:{city:o.address.city??``,country:o.address.country,line1:o.address.line1??``,...o.address.line2?{line2:o.address.line2}:{},postal_code:o.address.postal_code??``,state:o.address.state??``},name:o.name}}:{}}}async function Ie({addresses:e,catalog:t,checkoutItems:n,client:r,elements:i,email:a,fieldValues:o,locallyPreviewedTotalCents:s,metadata:c,onPaymentRecoveryChange:l,phone:u,quote:d,stripe:f}){let p=a.trim().toLowerCase(),m=Z(u),h=De(d.subtotalCents,o);if(!h.success)throw Error(h.message);let g=je(t,o,p,h.cents),_=await r.calculateTotal({...g,items:n});if(_.totalCents>0&&pe(d,_,s))return{kind:`quote_changed`,quote:_};if(_.totalCents===0){let n;t.widget.fields.shipping&&(n=Ne(t,o,Me(e.billing,`Billing`),e)),$(l,{connectedAccountId:_.payment.connectedAccountId,paymentReference:_.paymentReference});let i=await q(r,{checkout:_,submission:Fe({catalog:t,email:p,fieldValues:o,metadata:c,phone:m,...n?{shippingAddress:n}:{}})},f);return i.kind===`failed`?{kind:`payment_failed`,message:`Order could not be completed. Review the details and try again.`}:i.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:i.paymentReference,reason:i.reason}:{kind:`payment`,payment:i.payment,quote:_}}await i.update({amount:_.totalCents});let v=await i.submit();if(v.error)throw Error(v.error.message);let y=Me(e.billing,`Billing`),b=Ne(t,o,y,e),x=await f.createConfirmationToken({elements:i,params:Pe({billingAddress:y,catalog:t,email:p,phone:m,shippingAddress:b})});if(x.error)throw Error(x.error.message);$(l,{connectedAccountId:_.payment.connectedAccountId,paymentReference:_.paymentReference});let S=await q(r,{checkout:_,submission:Fe({catalog:t,confirmationToken:x.confirmationToken.id,email:p,fieldValues:o,metadata:c,phone:m,...b?{shippingAddress:b}:{}})},f);return S.kind===`failed`?{kind:`payment_failed`,message:`Payment was declined. Check your payment details and try again.`}:S.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:S.paymentReference,reason:S.reason}:{kind:`payment`,payment:S.payment,quote:_}}function Le({accentColor:e,catalog:n,checkoutItems:r,client:i,fontFamily:a,metadata:o,onPaymentComplete:s,onPaymentRecoveryChange:c,onPaymentUncertain:l,onQuoteChange:d,quote:f,resumePayment:p,onStateChange:m,stripeLoader:h,theme:_,visualStyle:v}){let y=p?p.connectedAccountId:f.payment.connectedAccountId,b=u(()=>h(n.payment.publishableKey,y?{stripeAccount:y}:void 0),[n.payment.publishableKey,y,h]);return g(t,{options:{amount:Math.max(f.totalCents,100),appearance:{rules:{".Input:focus":{borderColor:e,boxShadow:`0 0 0 1px ${e}`,outline:`none`}},theme:_===`light`?`stripe`:`night`,variables:{borderRadius:v?.[`--lockerverse-radius`]??`10px`,colorBackground:v?.[`--lockerverse-control`]??(_===`light`?`#f5f6f7`:`#121212`),colorDanger:v?.[`--lockerverse-danger`]??(_===`light`?`#c52b3e`:`#f08a98`),colorPrimary:e,colorText:v?.[`--lockerverse-text`]??(_===`light`?`#121416`:`#ffffff`),colorTextPlaceholder:v?.[`--lockerverse-placeholder`]??(_===`light`?`#72767d`:`#6b6b6b`),colorTextSecondary:v?.[`--lockerverse-muted`]??(_===`light`?`#62666d`:`#a1a1aa`),focusBoxShadow:`none`,focusOutline:`none`,fontFamily:a,fontSizeBase:`16px`}},currency:f.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:`payment`,syncAddressCheckbox:`none`},stripe:b,children:g(Je,{catalog:n,checkoutItems:r,client:i,metadata:o,onPaymentComplete:s,onPaymentRecoveryChange:c,onPaymentUncertain:l,onQuoteChange:d,onStateChange:m,quote:f,resumePayment:p})},`${n.payment.publishableKey}:${y??`platform`}`)}function Re({label:e}){return _(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[g(`p`,{children:e}),_(`div`,{"aria-hidden":`true`,children:[g(`span`,{}),g(`span`,{}),g(`span`,{})]})]})}function ze({onError:e,onReady:t,ready:r}){return _(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":r,children:[r?null:g(Re,{label:`Loading payment form...`}),g(`div`,{className:`lockerverse-payment__stripe-mount`,children:g(n,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function Be({label:t,mode:n,onChange:r,onError:i,onReady:a,ready:o}){return _(`div`,{className:`lockerverse-payment__address`,children:[g(`h2`,{children:t}),_(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":o,children:[o?null:g(Re,{label:`Loading ${t.toLowerCase()}...`}),g(`div`,{className:`lockerverse-payment__stripe-mount`,children:g(e,{onChange:r,onLoadError:({error:e})=>i(e.message??`${t} failed to load.`),onReady:a,options:{autocomplete:{mode:`automatic`},mode:n}})})]})]})}function Ve({message:e}){return e?g(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function He({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isShippingAddressReady:a,onAddressChange:o,onFieldValuesChange:s,onStripeLoadError:c,setIsBillingAddressReady:l,setIsPaymentReady:u,setIsShippingAddressReady:d}){let f=t>0;return _(h,{children:[f?g(ze,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?g(Be,{label:f?`Billing address`:`Shipping address`,mode:`billing`,onChange:e=>o(`billing`,e),onError:c,onReady:()=>l(!0),ready:r}):null,e.widget.fields.shipping?_(`div`,{className:`lockerverse-payment__shipping`,children:[g(ae,{checked:n.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{s({...n,shippingMatchesBilling:e}),e?o(`shipping`,null):d(!1)},children:`Shipping is same as billing information`}),n.shippingMatchesBilling?null:g(Be,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function Ue({displayedBaseCents:e,displayedTipCents:t,displayedTotalCents:n,quote:r}){let i=Math.max(0,e-r.subtotalCents+r.discountCents);return _(`section`,{"aria-label":`Payment summary`,className:`lockerverse-payment__payment-summary`,children:[g(`h2`,{children:`Order summary`}),g(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.lineItems.map(e=>_(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[_(`span`,{children:[e.productName,e.quantity>1?_(h,{children:[` `,_(`small`,{children:[`× `,e.quantity]})]}):null]}),g(`strong`,{children:Q(e.subtotalCents)})]},e.listingId))}),_(`div`,{className:`lockerverse-payment__payment-summary-totals`,children:[i>0?_(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail`,children:[g(`span`,{children:`Service fee`}),g(`strong`,{children:Q(i)})]}):null,r.discountCents>0&&r.appliedDiscount?_(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-discount`,children:[_(`span`,{children:[r.appliedDiscount.source===`email_list`?`Email discount`:`Promo code discount`,` `,`(`,r.appliedDiscount.percentageOff,`% off)`]}),_(`strong`,{children:[`-`,Q(r.discountCents)]})]}):null,t>0?_(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail lockerverse-payment__payment-summary-tip`,children:[g(`span`,{children:`Tip`}),g(`strong`,{children:Q(t)})]}):null,_(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-total`,children:[g(`span`,{children:`Total`}),g(`strong`,{children:Q(n)})]})]})]})}function We({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isRequiredShippingReady:a,isSubmitting:o,onFieldValuesChange:s,quote:c}){let l=t===0,u=l?!e.widget.fields.shipping||r&&a:i&&r&&a,d=l?`Complete order`:`Pay ${Q(t)}`;return o&&(d=l?`Completing…`:`Processing…`),_(`div`,{className:`lockerverse-payment__actions`,children:[g(se,{amountCents:c.serviceFeeCents||Math.round(c.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:e.widget.fields.serviceFee,onChange:s,values:n}),g(`button`,{"aria-busy":o,"aria-label":l?`Complete order`:`Process payment for ${Q(t)} total`,disabled:o||!u,type:`submit`,children:d})]})}function $(e,t){try{e?.(t)}catch{}}function Ge({customFieldErrors:e,emailRef:t,form:n,parsedTipSuccess:r,phoneRef:i,validationErrors:a}){if(a.email){t.current?.focus();return}if(a.phone){i.current?.focus();return}if(!r){n.querySelector(`[name="tip"]`)?.focus();return}let[o]=Object.keys(e);o&&n.querySelector(`[name="custom:${o}"]`)?.focus()}function Ke({onPaymentComplete:e,onPaymentRecoveryChange:t,onPaymentUncertain:n,onQuoteChange:r,onStateChange:i,result:a,setDisplayedTotalCents:o,setPaymentError:s,setTerminalState:c}){if(a.kind===`quote_changed`){let e=`The total changed to ${Q(a.quote.totalCents)}. Review it and pay again.`;r(a.quote,e),o(a.quote.totalCents),i(`idle`);return}if(a.kind===`payment_failed`){$(t,null),s(a.message),i(`error`);return}if(a.kind===`payment_unresolved`){c({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),i(`unresolved`);try{n?.({paymentReference:a.paymentReference,reason:a.reason})}catch{}return}r(a.quote),$(t,null),c({kind:`success`,message:a.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`}),i(`success`);try{e?.(a.payment)}catch{}}function qe({email:e,emailDiscountPercentOff:t,emailErrorId:n,emailId:r,emailRef:i,errors:a,onEmailBlur:o,onEmailChange:s,onPhoneChange:c,onPhoneCountryChange:l,phone:u,phoneCountry:d,phoneEnabled:f,phoneErrorId:p,phoneId:m,phoneRef:v}){return _(`div`,{className:`lockerverse-payment__contact`,children:[g(`label`,{htmlFor:r,children:`Email`}),g(`input`,{"aria-describedby":a.email?n:void 0,"aria-invalid":a.email?`true`:void 0,autoComplete:`email`,id:r,name:`email`,onBlur:o,onChange:e=>s(e.currentTarget.value),placeholder:`name@example.com`,ref:i,type:`email`,value:e}),a.email?g(`p`,{className:`lockerverse-payment__field-message`,id:n,children:a.email}):null,t===void 0?null:_(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:[`Your email qualifies for `,t,`% off.`]}),f?_(h,{children:[g(`label`,{htmlFor:m,children:`Phone`}),_(`div`,{className:`lockerverse-payment__phone-control`,children:[g(B,{ariaLabel:`Phone number country`,className:`lockerverse-payment__select--phone-country`,name:`phoneCountry`,onValueChange:l,options:Oe,value:d}),g(`input`,{"aria-describedby":a.phone?p:void 0,"aria-invalid":a.phone?`true`:void 0,autoComplete:`tel`,id:m,inputMode:`tel`,name:`phone`,onChange:e=>c(e.currentTarget.value),placeholder:`(201) 555-0123`,ref:v,type:`tel`,value:u})]}),a.phone?g(`p`,{className:`lockerverse-payment__field-message`,id:p,children:a.phone}):null]}):null]})}function Je({catalog:e,checkoutItems:t,client:n,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:u,onQuoteChange:d,onStateChange:m,quote:h,resumePayment:v}){let[y,b]=p(``),[x,S]=p(``),[C,w]=p(`US`),[T,E]=p({}),[D,O]=p(),[ee,k]=p({}),[A,j]=p(),[M,N]=p(),[P,F]=p(!1),[I,te]=p(!1),[L,ne]=p(!!v),[R,z]=p(),[B,re]=p(!1),[V,H]=p(!1),[ae,se]=p(!1),[U,ce]=p({customFields:{},customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),[W,le]=p(h.totalCents),ue=f({billing:null,shipping:null}),de=f(null),fe=f(null),G=f(null),pe=f(!1),K=f(0),me=f(h.totalCents>0),q=r(),J=i(),Y=`lockerverse-${l()}`,ge=`${Y}-email`,_e=`${ge}-error`,ve=`${Y}-phone`,ye=`${ve}-error`,be=`${Y}-tip-error`,X=e.widget.fields.tipping?De(h.subtotalCents,U):{cents:0,success:!0},Z=X.success?X.cents:null,Ce=Z??0,we=W-Ce,Te=!e.widget.fields.shipping||U.shippingMatchesBilling||ae;c(()=>{if(Z===null)return;let t=e.widget.fields.serviceFee&&U.includeServiceFee?h.serviceFeeCents||Math.round(h.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,n=h.totalCents-h.serviceFeeCents-h.tipCents+t+Z;le(n),n>0&&q?.update({amount:n})},[e.widget.fields.serviceFee,e.widget.fields.tipping,q,U.includeServiceFee,U.tipPercent,U.customTip,Z,h.serviceFeeCents,h.tipCents,h.totalCents]),c(()=>{P&&G.current?.focus()},[P]),c(()=>{let e=W>0;e&&!me.current&&(re(!1),H(!1)),me.current=e},[W]),c(()=>{!(v&&J)||pe.current||(pe.current=!0,m(`submitting`),he(n,v.paymentReference,J).then(e=>{if(e.kind===`failed`){$(s,null),O(`The previous payment failed. Check your details and try again.`),ne(!1),m(`error`);return}if(e.kind===`unresolved`){z({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),m(`unresolved`);try{u?.({paymentReference:e.paymentReference,reason:e.reason})}catch{}return}$(s,null),z({kind:`success`,message:e.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`}),m(`success`);try{o?.(e.payment)}catch{}}))},[n,o,s,u,m,v,J]);function Ee(e){E(t=>{let n={...t};return delete n[e],n})}function Q(e){e.promoCode!==U.promoCode&&N(void 0),ce(e),k({}),j(void 0)}function Oe(e){O(e),m(`error`)}function Ae(e){N(e.appliedDiscount?.source===`promo_code`?void 0:`This promo code is invalid or cannot be applied.`)}function Me(e,t){if(t){N(`This promo code is invalid or cannot be applied.`);return}O(e instanceof Error?e.message:`The order total could not be updated.`)}async function Ne(r=!1,i=!1){let a=xe({email:y.trim().toLowerCase(),phone:``},!1);if(!(X.success&&(a.value||r)))return;K.current+=1;let o=K.current;te(!0);try{let r=await n.calculateTotal({...je(e,U,a.value?.email??``,X.cents),items:t});if(o!==K.current)return;O(void 0),le(r.totalCents),d(r),i&&Ae(r)}catch(e){o===K.current&&Me(e,i)}finally{o===K.current&&te(!1)}}async function Pe(){N(void 0),await Ne(!0,!0)}async function Fe(r){r.preventDefault();let i=xe({email:y,phone:ke(x,C)},e.widget.fields.phone),c=Se(e.widget.customFields,U.customFields);if(!(i.value&&X.success)||Object.keys(c).length>0){E(i.errors),k(c),j(X.success?void 0:X.message),m(`invalid`);let e=r.currentTarget;queueMicrotask(()=>{Ge({customFieldErrors:c,emailRef:de,form:e,parsedTipSuccess:X.success,phoneRef:fe,validationErrors:i.errors})});return}if(E({}),k({}),!(q&&J)){O(`Payment form is still loading.`),m(`error`);return}O(void 0),F(!0),m(`submitting`);try{Ke({onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:u,onQuoteChange:d,onStateChange:m,result:await Ie({addresses:ue.current,catalog:e,checkoutItems:t,client:n,elements:q,email:y,fieldValues:U,locallyPreviewedTotalCents:W,metadata:a,onPaymentRecoveryChange:s,phone:ke(x,C),quote:h,stripe:J}),setDisplayedTotalCents:le,setPaymentError:O,setTerminalState:z})}catch(e){$(s,null),O(e instanceof Error?e.message:`Payment could not be completed.`),m(`error`)}finally{F(!1)}}return R?g(`p`,{className:`lockerverse-payment__payment-status`,ref:G,role:`status`,tabIndex:-1,children:R.message}):L?g(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):_(`form`,{"aria-busy":P,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:Fe,children:[g(`div`,{"data-lockerverse-input-region":``,inert:P?!0:void 0,children:_(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:P,children:[g(Ue,{displayedBaseCents:we,displayedTipCents:Ce,displayedTotalCents:W,quote:h}),g(ie,{enabled:e.widget.fields.tipping,error:A,errorId:be,onChange:Q,values:U}),g(qe,{email:y,emailDiscountPercentOff:h.appliedDiscount?.source===`email_list`?h.appliedDiscount.percentageOff:void 0,emailErrorId:_e,emailId:ge,emailRef:de,errors:T,onEmailBlur:()=>Ne(),onEmailChange:e=>{b(e),Ee(`email`)},onPhoneChange:e=>{S(e),Ee(`phone`)},onPhoneCountryChange:w,phone:x,phoneCountry:C,phoneEnabled:e.widget.fields.phone,phoneErrorId:ye,phoneId:ve,phoneRef:fe}),g(He,{catalog:e,displayedTotalCents:W,fieldValues:U,isBillingAddressReady:V,isPaymentReady:B,isShippingAddressReady:ae,onAddressChange:(e,t)=>{ue.current[e]=t},onFieldValuesChange:Q,onStripeLoadError:Oe,setIsBillingAddressReady:H,setIsPaymentReady:re,setIsShippingAddressReady:se}),g(oe,{customFields:e.widget.customFields,errors:ee,fields:e.widget.fields,idPrefix:Y,isPromoApplying:I,onApplyPromo:Pe,onChange:Q,promoError:M,values:U}),g(We,{catalog:e,displayedTotalCents:W,fieldValues:U,isBillingAddressReady:V,isPaymentReady:B,isRequiredShippingReady:Te,isSubmitting:P,onFieldValuesChange:Q,quote:h})]})}),P?g(`p`,{className:`lockerverse-payment__sr-only`,ref:G,role:`status`,tabIndex:-1,children:W===0?`Completing order…`:`Processing payment…`}):null,g(Ve,{message:D})]})}function Ye(){return _(`div`,{className:`lockerverse-payment__skeleton-loader-block`,children:[g(`span`,{className:`lockerverse-payment__skeleton-loader-label`}),_(`div`,{className:`lockerverse-payment__skeleton-loader-content`,children:[g(`span`,{className:`lockerverse-payment__skeleton-loader-full`}),_(`div`,{className:`lockerverse-payment__skeleton-loader-grid`,children:[g(`span`,{className:`lockerverse-payment__skeleton-loader-half`}),g(`span`,{className:`lockerverse-payment__skeleton-loader-half`})]})]})]})}function Xe(){return _(`div`,{className:`lockerverse-payment__loading`,children:[g(`span`,{"aria-live":`polite`,className:`lockerverse-payment__sr-only`,role:`status`,children:`Loading payment…`}),_(`div`,{"aria-hidden":`true`,className:`lockerverse-payment__skeleton`,children:[_(`div`,{className:`lockerverse-payment__skeleton-branding`,children:[g(`span`,{className:`lockerverse-payment__skeleton-avatar`}),g(`span`,{className:`lockerverse-payment__skeleton-community`})]}),_(`div`,{className:`lockerverse-payment__skeleton-contact`,children:[_(`div`,{className:`lockerverse-payment__skeleton-field`,children:[g(`span`,{className:`lockerverse-payment__skeleton-label`}),g(`span`,{className:`lockerverse-payment__skeleton-input`})]}),_(`div`,{className:`lockerverse-payment__skeleton-field`,children:[g(`span`,{className:`lockerverse-payment__skeleton-label`}),g(`span`,{className:`lockerverse-payment__skeleton-input`})]})]}),g(Ye,{}),g(Ye,{}),_(`div`,{className:`lockerverse-payment__skeleton-actions`,children:[g(`span`,{className:`lockerverse-payment__skeleton-check-line`}),g(`span`,{className:`lockerverse-payment__skeleton-button`})]})]})]})}function Ze({apiBaseUrl:e,branding:t,className:n,communitySlug:r,environment:i,fetch:o,metadata:s,onError:l,onPaymentComplete:u,onPaymentRecoveryChange:d,onPaymentUncertain:m,requestTimeoutMs:h,resumePayment:v,selection:y,sentryDsn:b,style:x,stripeLoader:S=a,theme:C=`dark`,widgetSlug:w,...T}){let E=f(v).current,D=f(null),[O,ee]=p(),[k,A]=p(`idle`),{retryCheckout:j,selectionError:M,session:N,updateCheckout:P}=Ee({apiBaseUrl:e,communitySlug:r,environment:i,fetch:o,onError:l,paymentState:k,requestTimeoutMs:h,selection:y,sentryDsn:b,widgetSlug:w});c(()=>{N.phase===`loading`&&ee(void 0)},[N.phase]),c(()=>{N.phase===`ready`&&A(e=>e===`success`||e===`unresolved`?e:`idle`)},[N.phase,N.revision]);let F=[`lockerverse-payment`,n].filter(Boolean).join(` `),I=t??(N.phase===`ready`?N.catalog.community:null),L=te(x?.[`--lockerverse-accent`]??I?.accentColor??`#38d77a`),R={...x,...I?.accentColor&&x?.[`--lockerverse-accent`]===void 0?{"--lockerverse-accent":I.accentColor}:{},...L&&x?.[`--lockerverse-accent-contrast`]===void 0?{"--lockerverse-accent-contrast":L}:{}};if(M)return g(`section`,{...T,className:F,"data-lockerverse-theme":C,role:`alert`,style:R,children:M});if(N.phase===`error`)return _(`section`,{...T,className:F,"data-lockerverse-theme":C,style:R,children:[g(`p`,{role:`alert`,children:N.failure}),g(`button`,{onClick:j,type:`button`,children:`Retry`})]});if(N.phase!==`ready`)return g(`section`,{...T,"aria-busy":`true`,"aria-label":`Payment`,className:F,"data-lockerverse-theme":C,style:R,children:g(Xe,{})});let{catalog:z,checkoutItems:B,client:re,preparedCheckout:V}=N;return _(`section`,{...T,"aria-label":`Payment`,className:F,"data-lockerverse-theme":C,"data-payment-state":k,ref:D,style:R,children:[_(`header`,{children:[z.widget.showCommunityBranding&&I?_(`div`,{className:`lockerverse-payment__branding`,children:[I.imageUrl?g(`img`,{alt:I.name,height:`48`,src:I.imageUrl,width:`48`}):null,g(`strong`,{children:I.name})]}):null,g(`h1`,{children:z.widget.title??z.widget.name}),z.widget.description?g(`p`,{children:z.widget.description}):null]}),O?g(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:O}):null,g(ne,{container:D,children:g(Le,{accentColor:x?.[`--lockerverse-accent`]??I?.accentColor??`#38d77a`,catalog:z,checkoutItems:B,client:re,fontFamily:x?.[`--lockerverse-font-family`]??`ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`,metadata:s,onPaymentComplete:u,onPaymentRecoveryChange:d,onPaymentUncertain:m,onQuoteChange:(e,t)=>{ee(t),P(e)},onStateChange:A,quote:V,resumePayment:E,stripeLoader:S,theme:C,visualStyle:R})})]})}export{Ze as LockerversePayment};
2
- //# sourceMappingURL=index.js.map
1
+ import{t as e}from"./lockerverse-payment.js";export{e as LockerversePayment};
@@ -0,0 +1,59 @@
1
+ import { loadStripe } from "@stripe/stripe-js";
2
+ import { CSSProperties, ComponentPropsWithoutRef } from "react";
3
+ import { CreateLockerverseWidgetOptions, LockerversePaymentResult } from "@lockerverse/sdk/checkout";
4
+ //#region src/types.d.ts
5
+ type LockerversePaymentSelectionItem = {
6
+ amountCents: number;
7
+ productSlug: string;
8
+ } | {
9
+ productSlug: string;
10
+ quantity: number;
11
+ };
12
+ type LockerversePaymentTheme = "dark" | "light";
13
+ type LockerversePaymentBranding = {
14
+ accentColor?: string;
15
+ imageUrl?: string | null;
16
+ name: string;
17
+ };
18
+ type LockerversePaymentStyle = CSSProperties & {
19
+ "--lockerverse-accent"?: string;
20
+ "--lockerverse-accent-contrast"?: string;
21
+ "--lockerverse-bg"?: string;
22
+ "--lockerverse-border"?: string;
23
+ "--lockerverse-control"?: string;
24
+ "--lockerverse-danger"?: string;
25
+ "--lockerverse-danger-border"?: string;
26
+ "--lockerverse-font-family"?: string;
27
+ "--lockerverse-muted"?: string;
28
+ "--lockerverse-placeholder"?: string;
29
+ "--lockerverse-radius"?: string;
30
+ "--lockerverse-subtle"?: string;
31
+ "--lockerverse-text"?: string;
32
+ };
33
+ type LockerversePaymentUncertain = {
34
+ paymentReference: string;
35
+ reason: "action_required" | "pending" | "recovery_failed";
36
+ };
37
+ type LockerversePaymentRecovery = {
38
+ connectedAccountId: string | null;
39
+ paymentReference: string;
40
+ };
41
+ type LockerverseStripeLoader = (...args: Parameters<typeof loadStripe>) => ReturnType<typeof loadStripe>;
42
+ type LockerversePaymentProps = CreateLockerverseWidgetOptions & Omit<ComponentPropsWithoutRef<"section">, "children" | "onError"> & {
43
+ branding?: LockerversePaymentBranding;
44
+ metadata?: Record<string, string>;
45
+ onPaymentComplete?: (payment: LockerversePaymentResult) => void;
46
+ onPaymentRecoveryChange?: (recovery: LockerversePaymentRecovery | null) => void;
47
+ onPaymentUncertain?: (payment: LockerversePaymentUncertain) => void;
48
+ resumePayment?: LockerversePaymentRecovery | null;
49
+ selection: LockerversePaymentSelectionItem[];
50
+ stripeLoader?: LockerverseStripeLoader;
51
+ style?: LockerversePaymentStyle;
52
+ theme?: LockerversePaymentTheme;
53
+ };
54
+ //#endregion
55
+ //#region src/lockerverse-payment.d.ts
56
+ declare function LockerversePayment({ apiBaseUrl, branding, className, communitySlug, environment, fetch, metadata, onError, onPaymentComplete, onPaymentRecoveryChange, onPaymentUncertain, requestTimeoutMs, resumePayment, selection, sentryDsn, style, stripeLoader, theme, widgetSlug, ...sectionProps }: LockerversePaymentProps): import("react").JSX.Element;
57
+ //#endregion
58
+ export { LockerversePaymentSelectionItem as a, LockerversePaymentUncertain as c, LockerversePaymentRecovery as i, LockerverseStripeLoader as l, LockerversePaymentBranding as n, LockerversePaymentStyle as o, LockerversePaymentProps as r, LockerversePaymentTheme as s, LockerversePayment as t };
59
+ //# sourceMappingURL=lockerverse-payment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockerverse-payment.d.ts","names":[],"sources":["../src/types.ts","../src/lockerverse-payment.tsx"],"mappings":";;;;KAOY;EACN;EAAqB;;EACrB;EAAqB;;KAEf;KAEA;EACV;EACA;EACA;;KAGU,0BAA0B;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA;;KAGU;EACV;EACA;;KAGU,8BACP,MAAM,kBAAkB,gBACxB,kBAAkB;KAEX,0BAA0B,iCACpC,KAAK;EACH,WAAW;EACX,WAAW;EACX,qBAAqB,SAAS;EAC9B,2BACE,UAAU;EAEZ,sBAAsB,SAAS;EAC/B,gBAAgB;EAChB,WAAW;EACX,eAAe;EACf,QAAQ;EACR,QAAQ;;;;iBCkkDI,qBACd,YACA,UACA,WACA,eACA,aACA,OACA,UACA,SACA,mBACA,yBACA,oBACA,kBACA,eACA,WACA,WACA,OACA,cACA,OACA,eACG,gBACF,0CAAuB,IAAA"}
@@ -0,0 +1,2 @@
1
+ import{a as e,c as t,i as n,l as r,o as i,s as a,t as o,u as s}from"./contact-validation.js";import{AddressElement as c,Elements as l,PaymentElement as u,useElements as d,useStripe as f}from"@stripe/react-stripe-js";import{loadStripe as p}from"@stripe/stripe-js";import{createContext as m,useContext as h,useEffect as g,useId as _,useMemo as v,useReducer as y,useRef as b,useState as x}from"react";import{array as S,minLength as C,minValue as w,nonEmpty as ee,number as T,object as te,pipe as E,regex as ne,safeInteger as D,safeParse as O,strictObject as k,string as A,trim as j,union as M}from"valibot";import{Fragment as N,jsx as P,jsxs as F}from"react/jsx-runtime";import{Select as I}from"@base-ui/react/select";import{LockerverseSdkError as L,createLockerverseCheckoutClient as R}from"@lockerverse/sdk/checkout";const z=m(void 0);function re({children:e,container:t}){return P(z.Provider,{value:t,children:e})}function B(){return P(`svg`,{"aria-hidden":`true`,fill:`none`,viewBox:`0 0 16 16`,children:P(`path`,{d:`m4 6 4 4 4-4`})})}function ie(){return P(`svg`,{"aria-hidden":`true`,fill:`none`,viewBox:`0 0 16 16`,children:P(`path`,{d:`m3 8 3 3 7-7`})})}function V({ariaDescribedBy:e,ariaLabel:t,ariaLabelledBy:n,className:r,id:i,invalid:a=!1,name:o,onValueChange:s,options:c,value:l}){let u=h(z),d=[`lockerverse-payment__select`,r].filter(Boolean).join(` `);return P(`div`,{className:d,children:F(I.Root,{id:i,items:c,name:o,onValueChange:e=>{e!==null&&s(e)},value:l,children:[F(I.Trigger,{"aria-describedby":e,"aria-invalid":a||void 0,"aria-label":t,"aria-labelledby":n,className:`lockerverse-payment__select-trigger`,children:[P(I.Value,{}),P(I.Icon,{"aria-hidden":`true`,className:`lockerverse-payment__select-icon`,children:P(B,{})})]}),P(I.Portal,{container:u,children:P(I.Positioner,{alignItemWithTrigger:!1,className:`lockerverse-payment__select-positioner`,sideOffset:6,children:P(I.Popup,{className:`lockerverse-payment__select-popup`,children:P(I.List,{className:`lockerverse-payment__select-list`,children:c.map(e=>F(I.Item,{className:`lockerverse-payment__select-item`,value:e.value,children:[P(I.ItemText,{children:e.label}),P(I.ItemIndicator,{"aria-hidden":`true`,className:`lockerverse-payment__select-item-indicator`,children:P(ie,{})})]},e.value))})})})})]})})}const ae=[`XS`,`S`,`M`,`L`,`XL`,`XXL`,`XXXL`],oe=[`15`,`12`,`10`,`5`],H=[...oe,`custom`];function se({enabled:e,error:t,errorId:n,onChange:r,values:i}){if(!e)return null;let a=e=>r({...i,...e}),o=(e,t)=>{let n=H.indexOf(t),r;switch(e.key){case`ArrowDown`:case`ArrowRight`:r=(n+1)%H.length;break;case`ArrowLeft`:case`ArrowUp`:r=(n-1+H.length)%H.length;break;case`Home`:r=0;break;case`End`:r=H.length-1;break;default:return}e.preventDefault();let i=H[r];i&&((e.currentTarget.closest(`[role="radiogroup"]`)?.querySelectorAll(`input[type="radio"]`))?.[r]?.focus(),a({tipPercent:i}))};return F(`div`,{className:`lockerverse-payment__tip-box`,children:[P(`p`,{children:`Add a tip to support the Lockerverse platform`}),F(`div`,{"aria-label":`Tip amount`,role:`radiogroup`,children:[oe.map(e=>F(`label`,{className:`lockerverse-payment__tip-choice`,children:[P(`input`,{checked:i.tipPercent===e,name:`tipPercent`,onChange:()=>a({tipPercent:e}),onKeyDown:t=>o(t,e),tabIndex:i.tipPercent===e?0:-1,type:`radio`,value:e}),F(`span`,{children:[e,`%`]})]},e)),F(`label`,{className:`lockerverse-payment__tip-choice`,children:[P(`input`,{checked:i.tipPercent===`custom`,name:`tipPercent`,onChange:()=>a({tipPercent:`custom`}),onKeyDown:e=>o(e,`custom`),tabIndex:i.tipPercent===`custom`?0:-1,type:`radio`,value:`custom`}),P(`span`,{children:`Other`})]})]}),i.tipPercent===`custom`?F(`label`,{children:[P(`span`,{children:`Custom tip`}),F(`span`,{className:`lockerverse-payment__money-input`,children:[P(`span`,{"aria-hidden":`true`,children:`$`}),P(`input`,{"aria-describedby":t?n:void 0,"aria-invalid":t?`true`:void 0,inputMode:`decimal`,name:`tip`,onChange:e=>a({customTip:e.currentTarget.value}),placeholder:`0.00`,value:i.customTip})]}),t?P(`span`,{className:`lockerverse-payment__field-message`,id:n,children:t}):null]}):P(`input`,{name:`tip`,type:`hidden`,value:i.tipPercent})]})}function ce({checked:e,children:t,name:n,onChange:r}){return F(`label`,{className:`lockerverse-payment__check-row`,children:[P(`input`,{checked:e,name:n,onChange:e=>r(e.currentTarget.checked),type:`checkbox`}),P(`span`,{children:t})]})}function le({customFields:e,errors:t,fields:n,idPrefix:r,isPromoApplying:a,onChange:o,onApplyPromo:s,promoError:c,values:l}){let u=e=>o({...l,...e});return F(`div`,{className:`lockerverse-payment__additional-fields`,children:[n.memberId?F(`label`,{children:[P(`span`,{children:`Member ID`}),P(`input`,{name:`memberId`,onChange:e=>u({memberId:e.currentTarget.value}),placeholder:`Optional`,value:l.memberId})]}):null,n.merchSize?F(`div`,{className:`lockerverse-payment__field`,children:[P(`span`,{id:`${r}-merch-size-label`,children:`Size`}),P(V,{ariaLabelledBy:`${r}-merch-size-label`,name:`merchSize`,onValueChange:e=>u({merchSize:e}),options:ae.map(e=>({label:e,value:e})),value:l.merchSize})]}):null,n.promoCode?F(`div`,{className:`lockerverse-payment__field`,children:[P(`span`,{id:`${r}-promo-code-label`,children:`Promo code`}),F(`div`,{className:`lockerverse-payment__promo-control`,children:[P(`input`,{"aria-describedby":c?`${r}-promo-code-error`:void 0,"aria-invalid":c?`true`:void 0,"aria-labelledby":`${r}-promo-code-label`,name:`promoCode`,onChange:e=>u({promoCode:e.currentTarget.value}),placeholder:`Optional`,value:l.promoCode}),P(`button`,{disabled:!l.promoCode.trim()||a,onClick:s,type:`button`,children:a?`Applying…`:`Apply`})]}),c?P(`p`,{className:`lockerverse-payment__field-message`,id:`${r}-promo-code-error`,role:`alert`,children:c}):null]}):null,P(i,{choiceClassName:`lockerverse-payment__check-row`,errorClassName:`lockerverse-payment__field-message`,errors:t,fields:e,idPrefix:r,onChange:e=>u({customFields:e}),values:l.customFields})]})}function U({amountCents:e,enabled:t,onChange:n,values:r}){return t?F(ce,{checked:r.includeServiceFee,name:`includeServiceFee`,onChange:e=>n({...r,includeServiceFee:e}),children:[`Add `,ue(e),` to help cover processing fees`]}):null}function ue(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}const W=[`amountCents`,`discountableSubtotalCents`,`discountCents`,`serviceFeeCents`,`subtotalCents`,`tipCents`,`totalCents`],de=[`discountableSubtotalCents`,`discountCents`,`subtotalCents`];function fe(e,t,n){return(n===t.totalCents?de:W).some(n=>e[n]!==t[n])||e.payment.connectedAccountId!==t.payment.connectedAccountId||e.payment.currency!==t.payment.currency||JSON.stringify(e.appliedDiscount)!==JSON.stringify(t.appliedDiscount)||JSON.stringify(e.lineItems)!==JSON.stringify(t.lineItems)}function pe(e){return e.checkoutStatus===`success`?{kind:`success`,payment:e}:e.checkoutStatus===`failed`?{kind:`failed`,payment:e}:{kind:`unresolved`,paymentReference:e.paymentReference,reason:e.checkoutStatus===`action_required`?`action_required`:`pending`}}async function me(e,t,n){if(t.checkoutStatus!==`action_required`)return pe(t);if(!n)return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`};if(t.clientSecret)try{await n.handleNextAction({clientSecret:t.clientSecret})}catch{}try{return pe(await e.getPaymentStatus(t.paymentReference))}catch{return{kind:`unresolved`,paymentReference:t.paymentReference,reason:`action_required`}}}async function G(e,t,n){let r;try{r=await e.submitPayment(t)}catch(n){if(!(n instanceof L&&n.recoveryRecommended))throw n;try{r=await e.getPaymentStatus(t.checkout.paymentReference)}catch{return{kind:`unresolved`,paymentReference:t.checkout.paymentReference,reason:`recovery_failed`}}}return me(e,r,n)}async function he(e,t,n){try{return me(e,await e.getPaymentStatus(t),n)}catch{return{kind:`unresolved`,paymentReference:t,reason:`recovery_failed`}}}const ge=E(A(),j(),ee()),K=E(T(),D(),w(1)),_e=E(S(M([k({amountCents:K,productSlug:ge}),k({productSlug:ge,quantity:K})])),C(1)),ve=E(A(),j(),ne(/^(?:0|[1-9]\d*)(?:\.\d{1,2})?$/,`Enter a valid tip amount.`));function q(e){let t=O(ve,e);if(!t.success)return{message:t.issues[0]?.message??`Enter a valid tip amount.`,success:!1};let[n=`0`,r=``]=t.output.split(`.`),i=BigInt(n)*100n+BigInt(r.padEnd(2,`0`));return i>BigInt(2**53-1)?{message:`Enter a valid tip amount.`,success:!1}:{cents:Number(i),success:!0}}function J(e){let t=O(_e,e);return t.success?{success:!0,value:t.output}:{message:`Lockerverse payment configuration is invalid.`,success:!1}}function ye(e){return o(e)}function be(t,r){let i=r?{...t,phone:ye(t.phone)}:t,a=te(r?{email:n,phone:e}:{email:n}),o=O(a,i);if(o.success)return{errors:{},value:o.output};let s={};for(let e of o.issues){let t=e.path?.[0]?.key;(t===`email`||t===`phone`)&&!s[t]&&(s[t]=e.message)}return{errors:s,value:null}}function xe(e,t){switch(t.type){case`loading`:return{configuration:t.configuration,phase:`loading`,revision:e.revision,selectionKey:t.selectionKey};case`ready`:return{catalog:t.catalog,checkoutItems:t.checkoutItems,client:t.client,configuration:t.configuration,phase:`ready`,preparedCheckout:t.preparedCheckout,revision:e.revision+1,selectionKey:t.selectionKey};case`error`:return{configuration:t.configuration,failure:t.failure,phase:`error`,revision:e.revision,selectionKey:t.selectionKey};case`checkout`:return e.phase===`ready`?{...e,preparedCheckout:t.preparedCheckout}:e;case`retry`:return{phase:`idle`,revision:e.revision+1};default:return e}}function Se(e,t){let{apiBaseUrl:n,communitySlug:r,environment:i,fetch:a,requestTimeoutMs:o,sentryDsn:s,widgetSlug:c}=e,l={communitySlug:r,widgetSlug:c,...a?{fetch:a}:{},...t?{onError:t}:{},...o===void 0?{}:{requestTimeoutMs:o},...s===void 0?{}:{sentryDsn:s}};if(n===void 0){if(i===`development`)throw TypeError(`Lockerverse development checkout requires an API base URL.`);return{...l,...i===`production`?{environment:i}:{}}}return{...l,apiBaseUrl:n,...i===void 0?{}:{environment:i}}}function Ce(e,t,n){return e?.configuration===t&&e.selectionKey===n}function we({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,onError:i,paymentState:a,requestTimeoutMs:o,selection:s,sentryDsn:c,widgetSlug:l}){let u=v(()=>({apiBaseUrl:e,communitySlug:t,environment:n,fetch:r,requestTimeoutMs:o,sentryDsn:c,widgetSlug:l}),[e,t,n,r,o,c,l]),d=J(s),f=d.success?JSON.stringify(d.value):`invalid-selection`,p=v(()=>d.success?JSON.parse(f):[],[d.success,f]),[m,h]=y(xe,{phase:`idle`,revision:0}),_=b(void 0),x=b(void 0),S=b(i);return S.current=i,g(()=>{if(!d.success||a===`submitting`||a===`success`||a===`unresolved`||Ce(x.current,u,f)||Ce(_.current,u,f))return;let e=!0,t={configuration:u,selectionKey:f};_.current=t,h({configuration:u,selectionKey:f,type:`loading`});async function n(){try{let n=R(Se(u,e=>S.current?.(e))),{catalog:r,checkout:i}=await n.bootstrapCheckout({items:p}),a=[...i.items];e&&(_.current=void 0,x.current=t,h({catalog:r,checkoutItems:a,client:n,configuration:u,preparedCheckout:i,selectionKey:f,type:`ready`}))}catch(n){e&&(_.current=void 0,x.current=t,h({configuration:u,failure:n instanceof Error?n.message:`Lockerverse payment could not load.`,selectionKey:f,type:`error`}))}}return n(),()=>{e=!1,Ce(_.current,u,f)&&(_.current=void 0)}},[u,d.success,a,f,m.revision,p]),{retryCheckout:()=>{_.current=void 0,x.current=void 0,h({type:`retry`})},selectionError:d.success?void 0:d.message,session:m,updateCheckout:e=>h({preparedCheckout:e,type:`checkout`})}}function Y(e){return new Intl.NumberFormat(`en-US`,{currency:`USD`,style:`currency`}).format(e/100)}function Te(e,t){return t.tipPercent===`custom`?t.customTip.trim()?q(t.customTip):{cents:0,success:!0}:{cents:Math.round(e*Number(t.tipPercent)/100),success:!0}}const X=[{callingCode:`+1`,label:`🇺🇸 +1`,value:`US`},{callingCode:`+52`,label:`🇲🇽 +52`,value:`MX`},{callingCode:`+380`,label:`🇺🇦 +380`,value:`UA`},{callingCode:`+48`,label:`🇵🇱 +48`,value:`PL`},{callingCode:`+1`,label:`🇨🇦 +1`,value:`CA`},{callingCode:`+49`,label:`🇩🇪 +49`,value:`DE`},{callingCode:`+44`,label:`🇬🇧 +44`,value:`GB`},{callingCode:`+46`,label:`🇸🇪 +46`,value:`SE`},{callingCode:`+358`,label:`🇫🇮 +358`,value:`FI`},{callingCode:`+1`,label:`🇵🇷 +1`,value:`PR`}];function Ee(e,t){return e.trim().startsWith(`+`)?e:`${X.find(e=>e.value===t)?.callingCode??`+1`}${e}`}function De(e,t,n,r){return{...n?{email:n}:{},...e.widget.fields.serviceFee?{includeServiceFee:t.includeServiceFee}:{},...e.widget.fields.promoCode&&t.promoCode.trim()?{promoCode:t.promoCode.trim()}:{},...e.widget.fields.tipping?{tipCents:r}:{}}}function Z(e,t){if(!e?.complete)throw Error(`${t} address is required.`);return e.value}function Oe(e,t,n,r){if(e.widget.fields.shipping)return t.shippingMatchesBilling?n:Z(r.shipping,`Shipping`)}function ke({billingAddress:e,catalog:t,email:n,phone:r,shippingAddress:i}){return{payment_method_data:{billing_details:{address:e.address,email:n,name:e.name,...t.widget.fields.phone?{phone:r}:{}}},...i?{shipping:{address:i.address,name:i.name,phone:t.widget.fields.phone?r:i.phone??null}}:{}}}function Ae({catalog:e,confirmationToken:t,email:n,fieldValues:r,metadata:i,phone:o,shippingAddress:s}){return{...t?{confirmationToken:t}:{},customFieldAnswers:a(e.widget.customFields,r.customFields),email:n,...i?{metadata:i}:{},...e.widget.fields.memberId&&r.memberId.trim()?{memberId:r.memberId.trim()}:{},...e.widget.fields.merchSize?{merchSize:r.merchSize}:{},...e.widget.fields.phone?{phone:o}:{},...s?{shipping:{address:{city:s.address.city??``,country:s.address.country,line1:s.address.line1??``,...s.address.line2?{line2:s.address.line2}:{},postal_code:s.address.postal_code??``,state:s.address.state??``},name:s.name}}:{}}}async function je({addresses:e,catalog:t,checkoutItems:n,client:r,elements:i,email:a,fieldValues:o,locallyPreviewedTotalCents:s,metadata:c,onPaymentRecoveryChange:l,phone:u,quote:d,stripe:f}){let p=a.trim().toLowerCase(),m=ye(u),h=Te(d.subtotalCents,o);if(!h.success)throw Error(h.message);let g=De(t,o,p,h.cents),_=await r.calculateTotal({...g,items:n});if(_.totalCents>0&&fe(d,_,s))return{kind:`quote_changed`,quote:_};if(_.totalCents===0){let n;t.widget.fields.shipping&&(n=Oe(t,o,Z(e.billing,`Billing`),e)),$(l,{connectedAccountId:_.payment.connectedAccountId,paymentReference:_.paymentReference});let i=await G(r,{checkout:_,submission:Ae({catalog:t,email:p,fieldValues:o,metadata:c,phone:m,...n?{shippingAddress:n}:{}})},f);return i.kind===`failed`?{kind:`payment_failed`,message:`Order could not be completed. Review the details and try again.`}:i.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:i.paymentReference,reason:i.reason}:{kind:`payment`,payment:i.payment,quote:_}}if(!(i&&f))throw Error(`Payment form is still loading.`);await i.update({amount:_.totalCents});let v=await i.submit();if(v.error)throw Error(v.error.message);let y=Z(e.billing,`Billing`),b=Oe(t,o,y,e),x=await f.createConfirmationToken({elements:i,params:ke({billingAddress:y,catalog:t,email:p,phone:m,shippingAddress:b})});if(x.error)throw Error(x.error.message);$(l,{connectedAccountId:_.payment.connectedAccountId,paymentReference:_.paymentReference});let S=await G(r,{checkout:_,submission:Ae({catalog:t,confirmationToken:x.confirmationToken.id,email:p,fieldValues:o,metadata:c,phone:m,...b?{shippingAddress:b}:{}})},f);return S.kind===`failed`?{kind:`payment_failed`,message:`Payment was declined. Check your payment details and try again.`}:S.kind===`unresolved`?{kind:`payment_unresolved`,paymentReference:S.paymentReference,reason:S.reason}:{kind:`payment`,payment:S.payment,quote:_}}function Q({accentColor:e,catalog:t,checkoutItems:n,client:r,fontFamily:i,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,onQuoteChange:u,quote:d,resumePayment:f,onStateChange:p,stripeLoader:m,theme:h,visualStyle:g}){let _=f?f.connectedAccountId:d.payment.connectedAccountId,y=v(()=>m(t.payment.publishableKey,_?{stripeAccount:_}:void 0).catch(()=>null),[t.payment.publishableKey,_,m]);return P(l,{options:{amount:Math.max(d.totalCents,100),appearance:{rules:{".Input:focus":{borderColor:e,boxShadow:`0 0 0 1px ${e}`,outline:`none`}},theme:h===`light`?`stripe`:`night`,variables:{borderRadius:g?.[`--lockerverse-radius`]??`10px`,colorBackground:g?.[`--lockerverse-control`]??(h===`light`?`#f5f6f7`:`#121212`),colorDanger:g?.[`--lockerverse-danger`]??(h===`light`?`#c52b3e`:`#f08a98`),colorPrimary:e,colorText:g?.[`--lockerverse-text`]??(h===`light`?`#121416`:`#ffffff`),colorTextPlaceholder:g?.[`--lockerverse-placeholder`]??(h===`light`?`#72767d`:`#6b6b6b`),colorTextSecondary:g?.[`--lockerverse-muted`]??(h===`light`?`#62666d`:`#a1a1aa`),focusBoxShadow:`none`,focusOutline:`none`,fontFamily:i,fontSizeBase:`16px`}},currency:d.payment.currency,excludedPaymentMethodTypes:[`us_bank_account`],mode:`payment`,syncAddressCheckbox:`none`},stripe:y,children:P(Ue,{catalog:t,checkoutItems:n,client:r,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,onQuoteChange:u,onStateChange:p,quote:d,resumePayment:f})},`${t.payment.publishableKey}:${_??`platform`}`)}function Me({label:e}){return F(`div`,{className:`lockerverse-payment__stripe-loader`,role:`status`,children:[P(`p`,{children:e}),F(`div`,{"aria-hidden":`true`,children:[P(`span`,{}),P(`span`,{}),P(`span`,{})]})]})}function Ne({onError:e,onReady:t,ready:n}){return F(`div`,{className:`lockerverse-payment__stripe-element`,"data-ready":n,children:[n?null:P(Me,{label:`Loading payment form...`}),P(`div`,{className:`lockerverse-payment__stripe-mount`,children:P(u,{onLoadError:({error:t})=>e(t.message??`Payment form failed to load.`),onReady:t,options:{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},layout:`tabs`,terms:{applePay:`auto`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:`auto`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:`auto`,googlePay:`never`}}})})]})}function Pe({label:e,mode:t,onChange:n,onError:r,onReady:i,ready:a}){return F(`div`,{className:`lockerverse-payment__address`,children:[P(`h2`,{children:e}),F(`div`,{className:`lockerverse-payment__stripe-element lockerverse-payment__stripe-element--address`,"data-ready":a,children:[a?null:P(Me,{label:`Loading ${e.toLowerCase()}...`}),P(`div`,{className:`lockerverse-payment__stripe-mount`,children:P(c,{onChange:n,onLoadError:({error:t})=>r(t.message??`${e} failed to load.`),onReady:i,options:{autocomplete:{mode:`automatic`},mode:t}})})]})]})}function Fe({message:e}){return e?P(`p`,{className:`lockerverse-payment__field-message`,role:`alert`,children:e}):null}function Ie({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isShippingAddressReady:a,onAddressChange:o,onFieldValuesChange:s,onStripeLoadError:c,setIsBillingAddressReady:l,setIsPaymentReady:u,setIsShippingAddressReady:d}){let f=t>0;return F(N,{children:[f?P(Ne,{onError:c,onReady:()=>u(!0),ready:i}):null,f||e.widget.fields.shipping?P(Pe,{label:f?`Billing address`:`Shipping address`,mode:`billing`,onChange:e=>o(`billing`,e),onError:c,onReady:()=>l(!0),ready:r}):null,e.widget.fields.shipping?F(`div`,{className:`lockerverse-payment__shipping`,children:[P(ce,{checked:n.shippingMatchesBilling,name:`shippingMatchesBilling`,onChange:e=>{s({...n,shippingMatchesBilling:e}),e?o(`shipping`,null):d(!1)},children:`Shipping is same as billing information`}),n.shippingMatchesBilling?null:P(Pe,{label:`Shipping address`,mode:`shipping`,onChange:e=>o(`shipping`,e),onError:c,onReady:()=>d(!0),ready:a})]}):null]})}function Le({displayedBaseCents:e,displayedTipCents:t,displayedTotalCents:n,quote:r}){let i=Math.max(0,e-r.subtotalCents+r.discountCents);return F(`section`,{"aria-label":`Payment summary`,className:`lockerverse-payment__payment-summary`,children:[P(`h2`,{children:`Order summary`}),P(`div`,{className:`lockerverse-payment__payment-summary-items`,children:r.lineItems.map(e=>F(`div`,{className:`lockerverse-payment__payment-summary-row`,children:[F(`span`,{children:[e.productName,e.quantity>1?F(N,{children:[` `,F(`small`,{children:[`× `,e.quantity]})]}):null]}),P(`strong`,{children:Y(e.subtotalCents)})]},e.listingId))}),F(`div`,{className:`lockerverse-payment__payment-summary-totals`,children:[i>0?F(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail`,children:[P(`span`,{children:`Service fee`}),P(`strong`,{children:Y(i)})]}):null,r.discountCents>0&&r.appliedDiscount?F(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-discount`,children:[F(`span`,{children:[r.appliedDiscount.source===`email_list`?`Email discount`:`Promo code discount`,` `,`(`,r.appliedDiscount.percentageOff,`% off)`]}),F(`strong`,{children:[`-`,Y(r.discountCents)]})]}):null,t>0?F(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-detail lockerverse-payment__payment-summary-tip`,children:[P(`span`,{children:`Tip`}),P(`strong`,{children:Y(t)})]}):null,F(`div`,{className:`lockerverse-payment__payment-summary-row lockerverse-payment__payment-summary-total`,children:[P(`span`,{children:`Total`}),P(`strong`,{children:Y(n)})]})]})]})}function Re({catalog:e,displayedTotalCents:t,fieldValues:n,isBillingAddressReady:r,isPaymentReady:i,isRequiredShippingReady:a,isSubmitting:o,onFieldValuesChange:s,quote:c}){let l=t===0,u=l?!e.widget.fields.shipping||r&&a:i&&r&&a,d=l?`Complete order`:`Pay ${Y(t)}`;return o&&(d=l?`Completing…`:`Processing…`),F(`div`,{className:`lockerverse-payment__actions`,children:[P(U,{amountCents:c.serviceFeeCents||Math.round(c.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4),enabled:e.widget.fields.serviceFee,onChange:s,values:n}),P(`button`,{"aria-busy":o,"aria-label":l?`Complete order`:`Process payment for ${Y(t)} total`,disabled:o||!u,type:`submit`,children:d})]})}function $(e,t){try{e?.(t)}catch{}}function ze(e,t){let n=e.elements.namedItem(t);if(n instanceof HTMLElement){n.focus();return}n instanceof RadioNodeList&&Array.from(n).find(e=>e instanceof HTMLElement)?.focus()}function Be({customFieldErrors:e,emailRef:t,form:n,parsedTipSuccess:r,phoneRef:i,validationErrors:a}){if(a.email){t.current?.focus();return}if(a.phone){i.current?.focus();return}if(!r){n.querySelector(`[name="tip"]`)?.focus();return}let[o]=Object.keys(e);o&&ze(n,`custom:${o}`)}function Ve({onPaymentComplete:e,onPaymentRecoveryChange:t,onPaymentUncertain:n,onQuoteChange:r,onStateChange:i,result:a,setDisplayedTotalCents:o,setPaymentError:s,setTerminalState:c}){if(a.kind===`quote_changed`){let e=`The total changed to ${Y(a.quote.totalCents)}. Review it and pay again.`;r(a.quote,e),o(a.quote.totalCents),i(`idle`);return}if(a.kind===`payment_failed`){$(t,null),s(a.message),i(`error`);return}if(a.kind===`payment_unresolved`){c({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),i(`unresolved`);try{n?.({paymentReference:a.paymentReference,reason:a.reason})}catch{}return}r(a.quote),$(t,null),c({kind:`success`,message:a.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`}),i(`success`);try{e?.(a.payment)}catch{}}function He({email:e,emailDiscountPercentOff:t,emailErrorId:n,emailId:r,emailRef:i,errors:a,onEmailBlur:o,onEmailChange:s,onPhoneChange:c,onPhoneCountryChange:l,phone:u,phoneCountry:d,phoneEnabled:f,phoneErrorId:p,phoneId:m,phoneRef:h}){return F(`div`,{className:`lockerverse-payment__contact`,children:[P(`label`,{htmlFor:r,children:`Email`}),P(`input`,{"aria-describedby":a.email?n:void 0,"aria-invalid":a.email?`true`:void 0,autoComplete:`email`,id:r,name:`email`,onBlur:o,onChange:e=>s(e.currentTarget.value),placeholder:`name@example.com`,ref:i,type:`email`,value:e}),a.email?P(`p`,{className:`lockerverse-payment__field-message`,id:n,children:a.email}):null,t===void 0?null:F(`p`,{className:`lockerverse-payment__discount-message`,role:`status`,children:[`Your email qualifies for `,t,`% off.`]}),f?F(N,{children:[P(`label`,{htmlFor:m,children:`Phone`}),F(`div`,{className:`lockerverse-payment__phone-control`,children:[P(V,{ariaLabel:`Phone number country`,className:`lockerverse-payment__select--phone-country`,name:`phoneCountry`,onValueChange:l,options:X,value:d}),P(`input`,{"aria-describedby":a.phone?p:void 0,"aria-invalid":a.phone?`true`:void 0,autoComplete:`tel`,id:m,inputMode:`tel`,name:`phone`,onChange:e=>c(e.currentTarget.value),placeholder:`(201) 555-0123`,ref:h,type:`tel`,value:u})]}),a.phone?P(`p`,{className:`lockerverse-payment__field-message`,id:p,children:a.phone}):null]}):null]})}function Ue({catalog:e,checkoutItems:n,client:i,metadata:a,onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,onQuoteChange:l,onStateChange:u,quote:p,resumePayment:m}){let[h,v]=x(``),[y,S]=x(``),[C,w]=x(`US`),[ee,T]=x({}),[te,E]=x(),[ne,D]=x({}),[O,k]=x(),[A,j]=x(),[M,N]=x(!1),[I,L]=x(!1),[R,z]=x(!!m),[re,B]=x(),[ie,V]=x(!1),[ae,oe]=x(!1),[H,ce]=x(!1),[U,ue]=x({customFields:t(e.widget.customFields),customTip:``,includeServiceFee:e.widget.fields.serviceFee,memberId:``,merchSize:`M`,promoCode:``,shippingMatchesBilling:!0,tipPercent:`10`}),[W,de]=x(p.totalCents),fe=b({billing:null,shipping:null}),pe=b(null),me=b(null),G=b(null),ge=b(!1),K=b(0),_e=b(p.totalCents>0),ve=d(),q=f(),J=`lockerverse-${_()}`,ye=`${J}-email`,xe=`${ye}-error`,Se=`${J}-phone`,Ce=`${Se}-error`,we=`${J}-tip-error`,Y=e.widget.fields.tipping?Te(p.subtotalCents,U):{cents:0,success:!0},X=Y.success?Y.cents:null,Z=X??0,Oe=W-Z,ke=!e.widget.fields.shipping||U.shippingMatchesBilling||H;g(()=>{if(X===null)return;let t=e.widget.fields.serviceFee&&U.includeServiceFee?p.serviceFeeCents||Math.round(p.subtotalCents*e.pricingPolicy.serviceFeeRateBasisPoints/1e4):0,n=p.totalCents-p.serviceFeeCents-p.tipCents+t+X;de(n),n>0&&ve?.update({amount:n})},[e.widget.fields.serviceFee,e.widget.fields.tipping,ve,U.includeServiceFee,U.tipPercent,U.customTip,X,p.serviceFeeCents,p.tipCents,p.totalCents]),g(()=>{M&&G.current?.focus()},[M]),g(()=>{let e=W>0;e&&!_e.current&&(V(!1),oe(!1)),_e.current=e},[W]),g(()=>{!(m&&q)||ge.current||(ge.current=!0,u(`submitting`),he(i,m.paymentReference,q).then(e=>{if(e.kind===`failed`){$(s,null),E(`The previous payment failed. Check your details and try again.`),z(!1),u(`error`);return}if(e.kind===`unresolved`){B({kind:`unresolved`,message:`Payment is still processing. Do not submit it again.`}),u(`unresolved`);try{c?.({paymentReference:e.paymentReference,reason:e.reason})}catch{}return}$(s,null),B({kind:`success`,message:e.payment.paymentRequired?`Payment completed successfully.`:`Order confirmed. No payment was required.`}),u(`success`);try{o?.(e.payment)}catch{}}))},[i,o,s,c,u,m,q]);function Ae(e){T(t=>{let n={...t};return delete n[e],n})}function Q(e){e.promoCode!==U.promoCode&&j(void 0),ue(e),D({}),k(void 0)}function Me(e){E(e),u(`error`)}function Ne(e){j(e.appliedDiscount?.source===`promo_code`?void 0:`This promo code is invalid or cannot be applied.`)}function Pe(e,t){if(t){j(`This promo code is invalid or cannot be applied.`);return}E(e instanceof Error?e.message:`The order total could not be updated.`)}async function ze(t=!1,r=!1){let a=be({email:h.trim().toLowerCase(),phone:``},!1);if(!(Y.success&&(a.value||t)))return;K.current+=1;let o=K.current;L(!0);try{let t=await i.calculateTotal({...De(e,U,a.value?.email??``,Y.cents),items:n});if(o!==K.current)return;E(void 0),de(t.totalCents),l(t),r&&Ne(t)}catch(e){o===K.current&&Pe(e,r)}finally{o===K.current&&L(!1)}}async function Ue(){j(void 0),await ze(!0,!0)}async function We(t){t.preventDefault();let d=be({email:h,phone:Ee(y,C)},e.widget.fields.phone),f=r(e.widget.customFields,U.customFields);if(!(d.value&&Y.success)||Object.keys(f).length>0){T(d.errors),D(f),k(Y.success?void 0:Y.message),u(`invalid`);let e=t.currentTarget;queueMicrotask(()=>{Be({customFieldErrors:f,emailRef:pe,form:e,parsedTipSuccess:Y.success,phoneRef:me,validationErrors:d.errors})});return}T({}),D({}),E(void 0),N(!0),u(`submitting`);try{Ve({onPaymentComplete:o,onPaymentRecoveryChange:s,onPaymentUncertain:c,onQuoteChange:l,onStateChange:u,result:await je({addresses:fe.current,catalog:e,checkoutItems:n,client:i,elements:ve,email:h,fieldValues:U,locallyPreviewedTotalCents:W,metadata:a,onPaymentRecoveryChange:s,phone:Ee(y,C),quote:p,stripe:q}),setDisplayedTotalCents:de,setPaymentError:E,setTerminalState:B})}catch(e){$(s,null),E(e instanceof Error?e.message:`Payment could not be completed.`),u(`error`)}finally{N(!1)}}return re?P(`p`,{className:`lockerverse-payment__payment-status`,ref:G,role:`status`,tabIndex:-1,children:re.message}):R?P(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:`Recovering payment…`}):F(`form`,{"aria-busy":M,className:`lockerverse-payment__form`,noValidate:!0,onSubmit:We,children:[P(`div`,{"data-lockerverse-input-region":``,inert:M?!0:void 0,children:F(`fieldset`,{className:`lockerverse-payment__input-fieldset`,disabled:M,children:[P(Le,{displayedBaseCents:Oe,displayedTipCents:Z,displayedTotalCents:W,quote:p}),P(se,{enabled:e.widget.fields.tipping,error:O,errorId:we,onChange:Q,values:U}),P(He,{email:h,emailDiscountPercentOff:p.appliedDiscount?.source===`email_list`?p.appliedDiscount.percentageOff:void 0,emailErrorId:xe,emailId:ye,emailRef:pe,errors:ee,onEmailBlur:()=>ze(),onEmailChange:e=>{v(e),Ae(`email`)},onPhoneChange:e=>{S(e),Ae(`phone`)},onPhoneCountryChange:w,phone:y,phoneCountry:C,phoneEnabled:e.widget.fields.phone,phoneErrorId:Ce,phoneId:Se,phoneRef:me}),P(Ie,{catalog:e,displayedTotalCents:W,fieldValues:U,isBillingAddressReady:ae,isPaymentReady:ie,isShippingAddressReady:H,onAddressChange:(e,t)=>{fe.current[e]=t},onFieldValuesChange:Q,onStripeLoadError:Me,setIsBillingAddressReady:oe,setIsPaymentReady:V,setIsShippingAddressReady:ce}),P(le,{customFields:e.widget.customFields,errors:ne,fields:e.widget.fields,idPrefix:J,isPromoApplying:I,onApplyPromo:Ue,onChange:Q,promoError:A,values:U}),P(Re,{catalog:e,displayedTotalCents:W,fieldValues:U,isBillingAddressReady:ae,isPaymentReady:ie,isRequiredShippingReady:ke,isSubmitting:M,onFieldValuesChange:Q,quote:p})]})}),M?P(`p`,{className:`lockerverse-payment__sr-only`,ref:G,role:`status`,tabIndex:-1,children:W===0?`Completing order…`:`Processing payment…`}):null,P(Fe,{message:te})]})}function We(){return F(`div`,{className:`lockerverse-payment__skeleton-loader-block`,children:[P(`span`,{className:`lockerverse-payment__skeleton-loader-label`}),F(`div`,{className:`lockerverse-payment__skeleton-loader-content`,children:[P(`span`,{className:`lockerverse-payment__skeleton-loader-full`}),F(`div`,{className:`lockerverse-payment__skeleton-loader-grid`,children:[P(`span`,{className:`lockerverse-payment__skeleton-loader-half`}),P(`span`,{className:`lockerverse-payment__skeleton-loader-half`})]})]})]})}function Ge(){return F(`div`,{className:`lockerverse-payment__loading`,children:[P(`span`,{"aria-live":`polite`,className:`lockerverse-payment__sr-only`,role:`status`,children:`Loading payment…`}),F(`div`,{"aria-hidden":`true`,className:`lockerverse-payment__skeleton`,children:[F(`div`,{className:`lockerverse-payment__skeleton-branding`,children:[P(`span`,{className:`lockerverse-payment__skeleton-avatar`}),P(`span`,{className:`lockerverse-payment__skeleton-community`})]}),F(`div`,{className:`lockerverse-payment__skeleton-contact`,children:[F(`div`,{className:`lockerverse-payment__skeleton-field`,children:[P(`span`,{className:`lockerverse-payment__skeleton-label`}),P(`span`,{className:`lockerverse-payment__skeleton-input`})]}),F(`div`,{className:`lockerverse-payment__skeleton-field`,children:[P(`span`,{className:`lockerverse-payment__skeleton-label`}),P(`span`,{className:`lockerverse-payment__skeleton-input`})]})]}),P(We,{}),P(We,{}),F(`div`,{className:`lockerverse-payment__skeleton-actions`,children:[P(`span`,{className:`lockerverse-payment__skeleton-check-line`}),P(`span`,{className:`lockerverse-payment__skeleton-button`})]})]})]})}function Ke({apiBaseUrl:e,branding:t,className:n,communitySlug:r,environment:i,fetch:a,metadata:o,onError:c,onPaymentComplete:l,onPaymentRecoveryChange:u,onPaymentUncertain:d,requestTimeoutMs:f,resumePayment:m,selection:h,sentryDsn:_,style:v,stripeLoader:y=p,theme:S=`dark`,widgetSlug:C,...w}){let ee=b(m).current,T=b(null),[te,E]=x(),[ne,D]=x(`idle`),{retryCheckout:O,selectionError:k,session:A,updateCheckout:j}=we({apiBaseUrl:e,communitySlug:r,environment:i,fetch:a,onError:c,paymentState:ne,requestTimeoutMs:f,selection:h,sentryDsn:_,widgetSlug:C});g(()=>{A.phase===`loading`&&E(void 0)},[A.phase]),g(()=>{A.phase===`ready`&&D(e=>e===`success`||e===`unresolved`?e:`idle`)},[A.phase,A.revision]);let M=[`lockerverse-payment`,n].filter(Boolean).join(` `),N=t??(A.phase===`ready`?A.catalog.community:null),I=v?.[`--lockerverse-accent`]??N?.accentColor??`#38d77a`,L=s(I),R={...v,...N?.accentColor&&v?.[`--lockerverse-accent`]===void 0?{"--lockerverse-accent":N.accentColor}:{},...L&&v?.[`--lockerverse-accent-contrast`]===void 0?{"--lockerverse-accent-contrast":L}:{}};if(k)return P(`section`,{...w,className:M,"data-lockerverse-theme":S,role:`alert`,style:R,children:k});if(A.phase===`error`)return F(`section`,{...w,className:M,"data-lockerverse-theme":S,style:R,children:[P(`p`,{role:`alert`,children:A.failure}),P(`button`,{onClick:O,type:`button`,children:`Retry`})]});if(A.phase!==`ready`)return P(`section`,{...w,"aria-busy":`true`,"aria-label":`Payment`,className:M,"data-lockerverse-theme":S,style:R,children:P(Ge,{})});let{catalog:z,checkoutItems:B,client:ie,preparedCheckout:V}=A;return F(`section`,{...w,"aria-label":`Payment`,className:M,"data-lockerverse-theme":S,"data-payment-state":ne,ref:T,style:R,children:[F(`header`,{children:[z.widget.showCommunityBranding&&N?F(`div`,{className:`lockerverse-payment__branding`,children:[N.imageUrl?P(`img`,{alt:N.name,height:`48`,src:N.imageUrl,width:`48`}):null,P(`strong`,{children:N.name})]}):null,P(`h1`,{children:z.widget.title??z.widget.name}),z.widget.description?P(`p`,{children:z.widget.description}):null]}),te?P(`p`,{className:`lockerverse-payment__payment-status`,role:`status`,children:te}):null,P(re,{container:T,children:P(Q,{accentColor:v?.[`--lockerverse-accent`]??N?.accentColor??`#38d77a`,catalog:z,checkoutItems:B,client:ie,fontFamily:v?.[`--lockerverse-font-family`]??`ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`,metadata:o,onPaymentComplete:l,onPaymentRecoveryChange:u,onPaymentUncertain:d,onQuoteChange:(e,t)=>{E(t),j(e)},onStateChange:D,quote:V,resumePayment:ee,stripeLoader:y,theme:S,visualStyle:R})})]})}export{Ke as t};
2
+ //# sourceMappingURL=lockerverse-payment.js.map