@open-mercato/checkout 0.6.7-develop.6834.1.e76f4b8cbc → 0.6.7-develop.6842.1.8cd8a8883c
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.
|
@@ -971,7 +971,8 @@ function PayPageFooter({ payload, themeTokens }) {
|
|
|
971
971
|
en: t("common.languages.english", "English"),
|
|
972
972
|
pl: t("common.languages.polish", "Polski"),
|
|
973
973
|
es: t("common.languages.spanish", "Espa\xF1ol"),
|
|
974
|
-
de: t("common.languages.german", "Deutsch")
|
|
974
|
+
de: t("common.languages.german", "Deutsch"),
|
|
975
|
+
ko: t("common.languages.korean", "\uD55C\uAD6D\uC5B4")
|
|
975
976
|
}), [t]);
|
|
976
977
|
const setLocale = React.useCallback(async (nextLocale) => {
|
|
977
978
|
if (nextLocale === locale) return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/checkout/components/PayPage.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/checkout/modules/checkout/extension-points'\nimport Link from 'next/link'\nimport { useParams, useRouter, useSearchParams } from 'next/navigation'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { locales, type Locale } from '@open-mercato/shared/lib/i18n/config'\nimport type { CustomFieldDisplayEntry } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { resolveLocaleFromCandidates } from '@open-mercato/shared/lib/i18n/locale'\nimport { getPaymentGatewayRenderer } from '@open-mercato/shared/modules/payment_gateways/client'\nimport type { PaymentGatewayRendererProps } from '@open-mercato/shared/modules/payment_gateways/client'\nimport type { PaymentGatewayClientSession } from '@open-mercato/shared/modules/payment_gateways/types'\nimport { InjectionSpot, useInjectionSpotEvents, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { useRegisteredComponent } from '@open-mercato/ui/backend/injection/useRegisteredComponent'\nimport { MarkdownContent } from '@open-mercato/ui/backend/markdown/MarkdownContent'\nimport { apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Card, CardContent } from '@open-mercato/ui/primitives/card'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { PasswordInput } from '@open-mercato/ui/primitives/password-input'\nimport { Radio, RadioGroup } from '@open-mercato/ui/primitives/radio'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport {\n getCheckoutCustomerFieldSemanticType,\n validateCheckoutCustomerData,\n} from '../lib/customerDataValidation'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('checkout').child({ component: 'PayPage' })\n\ntype CustomerFieldOption = {\n value: string\n label: string\n}\n\ntype CustomerFieldDefinition = {\n key: string\n label: string\n kind: string\n required: boolean\n placeholder?: string | null\n options?: CustomerFieldOption[]\n}\n\ntype PriceListItem = {\n id: string\n description: string\n amount: number\n currencyCode: string\n}\n\ntype CheckoutThemeMode = 'light' | 'dark' | 'auto'\n\nexport type PayLinkPayload = {\n id: string\n slug?: string | null\n name: string\n title?: string | null\n subtitle?: string | null\n description?: string | null\n logoUrl?: string | null\n logoPreviewUrl?: string | null\n primaryColor?: string | null\n secondaryColor?: string | null\n backgroundColor?: string | null\n themeMode?: CheckoutThemeMode | null\n status?: 'draft' | 'active' | 'inactive'\n pricingMode: 'fixed' | 'custom_amount' | 'price_list'\n fixedPriceAmount?: number | null\n fixedPriceCurrencyCode?: string | null\n fixedPriceOriginalAmount?: number | null\n customAmountMin?: number | null\n customAmountMax?: number | null\n customAmountCurrencyCode?: string | null\n priceListItems?: PriceListItem[]\n collectCustomerDetails?: boolean\n customerFieldsSchema?: CustomerFieldDefinition[]\n publicCustomFields?: CustomFieldDisplayEntry[]\n legalDocuments?: {\n terms?: { title?: string; markdown?: string; required?: boolean }\n privacyPolicy?: { title?: string; markdown?: string; required?: boolean }\n }\n requiresPassword?: boolean\n available?: boolean\n preview?: boolean\n gatewayProviderKey?: string | null\n}\n\ntype SubmitResponse = {\n transactionId: string\n redirectUrl?: string | null\n paymentSession?: (PaymentGatewayClientSession & {\n providerKey: string | null\n gatewayTransactionId: string\n }) | null\n}\n\ntype PayPageProps = {\n mode?: 'link' | 'template'\n sourceId?: string\n initialPayload?: PayLinkPayload | null\n initialLoadError?: string | null\n}\n\ntype FieldErrors = Record<string, string>\n\ntype PayPageSubmitData = {\n customerData: Record<string, unknown>\n acceptedLegalConsents: Record<string, boolean>\n amount: number | null\n selectedPriceItemId: string | null\n}\n\nexport type PayPageThemeTokens = {\n mode: 'light' | 'dark'\n accent: string\n accentSecondary: string\n accentContrast: string\n text: string\n mutedText: string\n pageBackground: string\n shellBackground: string\n surface: string\n surfaceMuted: string\n surfaceStrong: string\n border: string\n borderStrong: string\n shadow: string\n accentShadow: string\n heroBackground: string\n errorText: string\n errorBorder: string\n errorSurface: string\n errorSurfaceStrong: string\n errorRing: string\n}\n\ntype PayPageInjectionContext = {\n link: PayLinkPayload\n themeMode: 'light' | 'dark'\n themeTokens: PayPageThemeTokens\n preview: boolean\n selectedAmount: number | null\n currencyCode: string | null\n pricingMode: PayLinkPayload['pricingMode']\n customerSchema: CustomerFieldDefinition[]\n customerData: Record<string, unknown>\n legalDocuments: NonNullable<PayLinkPayload['legalDocuments']>\n acceptedLegalConsents: Record<string, boolean>\n transaction: { id: string } | null\n paymentView: 'idle' | 'embedded' | 'redirect'\n paymentSession: SubmitResponse['paymentSession']\n paymentProviderKey: string | null\n paymentRendererKey: string | null\n fieldErrors: FieldErrors\n submissionError: string | null\n inputsLocked: boolean\n isSubmitting: boolean\n canSubmit: boolean\n operation: 'create'\n}\n\nexport type PayPageSurfaceProps = {\n previewBanner: React.ReactNode\n leftColumn: React.ReactNode\n rightColumn: React.ReactNode\n footer: React.ReactNode\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageHeaderProps = {\n payload: PayLinkPayload\n preview: boolean\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageDescriptionProps = {\n payload: PayLinkPayload\n publicCustomFields: CustomFieldDisplayEntry[]\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageCustomerFormProps = {\n payload: PayLinkPayload\n customerData: Record<string, unknown>\n fieldErrors: FieldErrors\n inputsLocked: boolean\n onFieldChange: (fieldKey: string, value: unknown) => void\n translateValidationMessage: (message: string | null | undefined, fieldPath?: string) => string\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPagePricingProps = {\n payload: PayLinkPayload\n amount: number | null\n selectedPriceItemId: string | null\n fieldErrors: FieldErrors\n inputsLocked: boolean\n formatAmount: (value: number | null | undefined, currencyCode?: string | null) => string\n onAmountChange: (value: string) => void\n onPriceItemSelect: (item: PriceListItem) => void\n translateValidationMessage: (message: string | null | undefined, fieldPath?: string) => string\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageSummaryProps = {\n payload: PayLinkPayload\n selectedAmount: number | null\n currencyCode: string | null\n formatAmount: (value: number | null | undefined, currencyCode?: string | null) => string\n preview: boolean\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageLegalConsentProps = {\n payload: PayLinkPayload\n acceptedLegalConsents: Record<string, boolean>\n fieldErrors: FieldErrors\n inputsLocked: boolean\n onConsentChange: (fieldKey: 'terms' | 'privacyPolicy', value: boolean) => void\n translateValidationMessage: (message: string | null | undefined, fieldPath?: string) => string\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPagePaymentFormProps = {\n payload: PayLinkPayload\n slug: string\n preview: boolean\n isSubmitting: boolean\n submissionError: string | null\n paymentSession: SubmitResponse['paymentSession']\n activeTransactionId: string | null\n embeddedRenderer: React.ComponentType<PaymentGatewayRendererProps> | null | undefined\n onSubmit: () => Promise<void>\n onReset: () => void\n onComplete: () => void\n onError: (message: string) => void\n injectionContext: PayPageInjectionContext\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPagePaymentSectionProps = {\n payload: PayLinkPayload\n preview: boolean\n themeTokens: PayPageThemeTokens\n children: React.ReactNode\n}\n\nexport type PayPageHelpProps = {\n payload: PayLinkPayload\n preview: boolean\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageFooterProps = {\n payload: PayLinkPayload\n themeTokens: PayPageThemeTokens\n}\n\nconst PAGE_HANDLE = extensionPoints.hosts.payPage.componentId\nconst HEADER_HANDLE = extensionPoints.hosts.header.componentId\nconst DESCRIPTION_HANDLE = extensionPoints.hosts.description.componentId\nconst SUMMARY_HANDLE = extensionPoints.hosts.summary.componentId\nconst PRICING_HANDLE = extensionPoints.hosts.pricing.componentId\nconst PAYMENT_HANDLE = extensionPoints.hosts.payment.componentId\nconst CUSTOMER_FORM_HANDLE = extensionPoints.hosts.customerForm.componentId\nconst LEGAL_CONSENT_HANDLE = extensionPoints.hosts.legalConsent.componentId\nconst GATEWAY_FORM_HANDLE = extensionPoints.hosts.gatewayForm.componentId\nconst HELP_HANDLE = extensionPoints.hosts.help.componentId\nconst FOOTER_HANDLE = extensionPoints.hosts.footer.componentId\n\n// Checkout supports merchant branding defaults; keep those theme fallbacks isolated from general UI state colors.\nconst CHECKOUT_THEME_FALLBACKS = {\n accent: '#1E3A8A',\n accentSecondary: '#F59E0B',\n darkBackground: '#0B1020',\n lightBackground: '#F5EFE6',\n darkText: '#F8FAFC',\n lightText: '#111827',\n darkMutedText: '#CBD5E1',\n lightMutedText: '#6B7280',\n darkSurface: '#111827',\n lightSurface: '#FFFFFF',\n darkShell: '#020617',\n lightShell: '#FFFDF8',\n darkBorder: '#E2E8F0',\n inputBackground: 'rgba(255, 255, 255, 0.96)',\n inputText: '#0F172A',\n} as const\n\nconst PAY_PAGE_EMPTY_SELECT_VALUE = '__om_checkout_empty__'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction readErrorMessage(error: unknown, fallback: string) {\n return error instanceof Error && error.message ? error.message : fallback\n}\n\nfunction readTranslatedErrorMessage(\n error: unknown,\n translate: (key: string, fallback: string) => string,\n fallback: string,\n) {\n return translate(readErrorMessage(error, fallback), fallback)\n}\n\nfunction parseNumericInput(value: string): number | null {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = Number(trimmed)\n return Number.isFinite(parsed) ? parsed : null\n}\n\nfunction setSubmitDataFieldValue(\n data: PayPageSubmitData,\n fieldPath: string,\n value: unknown,\n): PayPageSubmitData {\n if (fieldPath.startsWith('customerData.')) {\n const fieldKey = fieldPath.slice('customerData.'.length)\n return {\n ...data,\n customerData: {\n ...data.customerData,\n [fieldKey]: value,\n },\n }\n }\n if (fieldPath.startsWith('acceptedLegalConsents.')) {\n const fieldKey = fieldPath.slice('acceptedLegalConsents.'.length)\n if (fieldKey === 'terms' || fieldKey === 'privacyPolicy') {\n return {\n ...data,\n acceptedLegalConsents: {\n ...data.acceptedLegalConsents,\n [fieldKey]: value === true,\n },\n }\n }\n return data\n }\n if (fieldPath === 'amount') {\n return {\n ...data,\n amount: typeof value === 'number' && Number.isFinite(value) ? value : null,\n }\n }\n if (fieldPath === 'selectedPriceItemId') {\n return {\n ...data,\n selectedPriceItemId: typeof value === 'string' && value.trim().length > 0 ? value : null,\n }\n }\n return data\n}\n\nfunction applySubmitDataSideEffects(\n data: PayPageSubmitData,\n sideEffects: Record<string, unknown> | undefined,\n): PayPageSubmitData {\n if (!sideEffects) return data\n return Object.entries(sideEffects).reduce(\n (current, [fieldPath, value]) => setSubmitDataFieldValue(current, fieldPath, value),\n data,\n )\n}\n\nfunction normalizeHexColor(value: string | null | undefined, fallback: string) {\n const normalized = typeof value === 'string' ? value.trim().replace(/^#/, '') : ''\n if (/^[0-9a-fA-F]{3}$/.test(normalized)) {\n return `#${normalized.split('').map((part) => `${part}${part}`).join('')}`.toUpperCase()\n }\n if (/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return `#${normalized}`.toUpperCase()\n }\n return fallback.toUpperCase()\n}\n\nfunction hexToRgb(color: string) {\n const normalized = normalizeHexColor(color, '#000000').replace('#', '')\n return {\n r: Number.parseInt(normalized.slice(0, 2), 16),\n g: Number.parseInt(normalized.slice(2, 4), 16),\n b: Number.parseInt(normalized.slice(4, 6), 16),\n }\n}\n\nfunction rgbToHex(rgb: { r: number; g: number; b: number }) {\n const encode = (value: number) => clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0')\n return `#${encode(rgb.r)}${encode(rgb.g)}${encode(rgb.b)}`.toUpperCase()\n}\n\nfunction mixHexColors(start: string, end: string, weight: number) {\n const from = hexToRgb(start)\n const to = hexToRgb(end)\n const amount = clamp(weight, 0, 1)\n return rgbToHex({\n r: from.r + (to.r - from.r) * amount,\n g: from.g + (to.g - from.g) * amount,\n b: from.b + (to.b - from.b) * amount,\n })\n}\n\nfunction withAlpha(color: string, alpha: number) {\n const { r, g, b } = hexToRgb(color)\n return `rgba(${r}, ${g}, ${b}, ${clamp(alpha, 0, 1)})`\n}\n\nfunction getContrastText(color: string) {\n const { r, g, b } = hexToRgb(color)\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n return luminance > 0.62 ? CHECKOUT_THEME_FALLBACKS.inputText : CHECKOUT_THEME_FALLBACKS.darkText\n}\n\nfunction resolveThemeTokens(payload: PayLinkPayload | null, prefersDark: boolean): PayPageThemeTokens {\n const accent = normalizeHexColor(payload?.primaryColor, CHECKOUT_THEME_FALLBACKS.accent)\n const accentSecondary = normalizeHexColor(payload?.secondaryColor, CHECKOUT_THEME_FALLBACKS.accentSecondary)\n const requestedMode = payload?.themeMode ?? 'auto'\n const mode = requestedMode === 'dark' || (requestedMode === 'auto' && prefersDark) ? 'dark' : 'light'\n const background = normalizeHexColor(\n payload?.backgroundColor,\n mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkBackground : CHECKOUT_THEME_FALLBACKS.lightBackground,\n )\n const text = mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkText : CHECKOUT_THEME_FALLBACKS.lightText\n const mutedText = mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkMutedText : CHECKOUT_THEME_FALLBACKS.lightMutedText\n const surface = mixHexColors(\n background,\n mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkSurface : CHECKOUT_THEME_FALLBACKS.lightSurface,\n mode === 'dark' ? 0.62 : 0.76,\n )\n const surfaceMuted = mixHexColors(accentSecondary, background, mode === 'dark' ? 0.18 : 0.88)\n const surfaceStrong = mixHexColors(accent, background, mode === 'dark' ? 0.22 : 0.9)\n const border = withAlpha(mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkBorder : accent, mode === 'dark' ? 0.16 : 0.14)\n const borderStrong = withAlpha(accent, mode === 'dark' ? 0.34 : 0.22)\n const shellBackground = mixHexColors(\n background,\n mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkShell : CHECKOUT_THEME_FALLBACKS.lightShell,\n mode === 'dark' ? 0.82 : 0.64,\n )\n const heroStart = withAlpha(accent, mode === 'dark' ? 0.26 : 0.16)\n const heroEnd = withAlpha(accentSecondary, mode === 'dark' ? 0.22 : 0.2)\n const errorBase = mode === 'dark' ? '#F87171' : '#DC2626'\n\n return {\n mode,\n accent,\n accentSecondary,\n accentContrast: getContrastText(accent),\n text,\n mutedText,\n pageBackground: `\n radial-gradient(circle at top left, ${withAlpha(accent, mode === 'dark' ? 0.2 : 0.12)} 0%, transparent 38%),\n radial-gradient(circle at bottom right, ${withAlpha(accentSecondary, mode === 'dark' ? 0.24 : 0.15)} 0%, transparent 34%),\n linear-gradient(140deg, ${background} 0%, ${shellBackground} 100%)\n `,\n shellBackground,\n surface,\n surfaceMuted,\n surfaceStrong,\n border,\n borderStrong,\n shadow: mode === 'dark'\n ? `0 32px 80px ${withAlpha(CHECKOUT_THEME_FALLBACKS.darkShell, 0.55)}`\n : `0 28px 72px ${withAlpha(accent, 0.12)}`,\n accentShadow: `0 22px 48px ${withAlpha(accent, mode === 'dark' ? 0.3 : 0.22)}`,\n heroBackground: `linear-gradient(145deg, ${heroStart} 0%, ${heroEnd} 100%)`,\n errorText: mode === 'dark' ? '#FCA5A5' : '#B91C1C',\n errorBorder: errorBase,\n errorSurface: withAlpha(errorBase, mode === 'dark' ? 0.14 : 0.08),\n errorSurfaceStrong: withAlpha(errorBase, mode === 'dark' ? 0.2 : 0.12),\n errorRing: withAlpha(errorBase, mode === 'dark' ? 0.28 : 0.18),\n }\n}\n\nfunction buildReadableInputStyle(themeTokens: PayPageThemeTokens, hasError: boolean, disabled = false): React.CSSProperties {\n if (disabled) {\n return {\n background: 'var(--bg-disabled)',\n color: 'var(--text-disabled)',\n borderColor: 'var(--border-disabled)',\n }\n }\n\n return {\n background: CHECKOUT_THEME_FALLBACKS.inputBackground,\n color: CHECKOUT_THEME_FALLBACKS.inputText,\n borderColor: hasError ? themeTokens.errorBorder : withAlpha(CHECKOUT_THEME_FALLBACKS.inputText, 0.12),\n boxShadow: hasError ? `0 0 0 3px ${themeTokens.errorRing}` : undefined,\n }\n}\n\nfunction buildValidationMessageStyle(themeTokens: PayPageThemeTokens): React.CSSProperties {\n return {\n color: themeTokens.errorText,\n fontWeight: 500,\n }\n}\n\nfunction formatPublicFieldValue(value: unknown, booleanLabels?: { trueLabel: string; falseLabel: string }): string {\n if (Array.isArray(value)) return value.map((entry) => String(entry)).join(', ')\n if (typeof value === 'boolean') {\n if (booleanLabels) return value ? booleanLabels.trueLabel : booleanLabels.falseLabel\n return value ? 'Yes' : 'No'\n }\n if (value == null) return ''\n return String(value)\n}\n\nfunction usePrefersDarkMode() {\n const [prefersDark, setPrefersDark] = React.useState(false)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const updatePreference = () => setPrefersDark(mediaQuery.matches)\n updatePreference()\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', updatePreference)\n return () => mediaQuery.removeEventListener('change', updatePreference)\n }\n mediaQuery.addListener(updatePreference)\n return () => mediaQuery.removeListener(updatePreference)\n }, [])\n\n return prefersDark\n}\n\nfunction hasStoredLocalePreference() {\n if (typeof document === 'undefined') return false\n\n return document.cookie\n .split(';')\n .some((part) => part.trim().startsWith('locale='))\n}\n\nasync function persistLocalePreference(locale: Locale) {\n const response = await fetch('/api/auth/locale', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ locale }),\n })\n\n return response.ok\n}\n\nfunction buildPanelStyle(themeTokens: PayPageThemeTokens, variant: 'default' | 'muted' | 'hero' | 'accent' = 'default'): React.CSSProperties {\n if (variant === 'hero') {\n return {\n background: themeTokens.heroBackground,\n borderColor: themeTokens.borderStrong,\n boxShadow: themeTokens.shadow,\n color: themeTokens.text,\n }\n }\n if (variant === 'accent') {\n return {\n background: `linear-gradient(145deg, ${themeTokens.accent} 0%, ${mixHexColors(themeTokens.accent, themeTokens.accentSecondary, 0.4)} 100%)`,\n borderColor: withAlpha(themeTokens.accentContrast, 0.12),\n boxShadow: themeTokens.accentShadow,\n color: themeTokens.accentContrast,\n }\n }\n return {\n background: variant === 'muted' ? themeTokens.surfaceMuted : themeTokens.surface,\n borderColor: variant === 'muted' ? themeTokens.borderStrong : themeTokens.border,\n boxShadow: themeTokens.shadow,\n color: themeTokens.text,\n }\n}\n\nfunction buildButtonStyle(themeTokens: PayPageThemeTokens, variant: 'solid' | 'outline' = 'solid'): React.CSSProperties {\n if (variant === 'outline') {\n return {\n borderColor: themeTokens.borderStrong,\n color: themeTokens.text,\n background: withAlpha(themeTokens.surface, 0.72),\n }\n }\n return {\n background: themeTokens.accent,\n color: themeTokens.accentContrast,\n boxShadow: themeTokens.accentShadow,\n }\n}\n\nconst READABLE_INPUT_CLASSNAME = 'border bg-white/95 text-slate-900 placeholder:text-slate-400 disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:border-border-disabled disabled:text-text-disabled'\n\nexport function PayPageSurface({\n previewBanner,\n leftColumn,\n rightColumn,\n footer,\n themeTokens,\n}: PayPageSurfaceProps) {\n return (\n <div\n className=\"relative min-h-screen overflow-hidden px-4 py-6 sm:px-6 lg:px-8 lg:py-10\"\n style={{ background: themeTokens.pageBackground, color: themeTokens.text }}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute left-[-10%] top-[-5%] h-80 w-80 rounded-full blur-3xl\"\n style={{ background: withAlpha(themeTokens.accent, 0.16) }}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute bottom-[-8%] right-[-4%] h-96 w-96 rounded-full blur-3xl\"\n style={{ background: withAlpha(themeTokens.accentSecondary, 0.16) }}\n />\n\n <div className=\"relative mx-auto max-w-7xl space-y-6\">\n {previewBanner}\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,1.12fr)_minmax(360px,430px)] lg:items-start\">\n <div className=\"space-y-6\">{leftColumn}</div>\n <div className=\"space-y-6 lg:sticky lg:top-6\">{rightColumn}</div>\n </div>\n {footer}\n </div>\n </div>\n )\n}\n\nexport function PayPageHeader({ payload, preview, themeTokens }: PayPageHeaderProps) {\n const t = useT()\n const resolvedLogoUrl = payload.logoPreviewUrl ?? payload.logoUrl ?? null\n\n return (\n <section\n className=\"relative overflow-hidden rounded-xl border p-6 sm:p-8\"\n style={buildPanelStyle(themeTokens, 'hero')}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute right-[-4rem] top-[-3rem] h-40 w-40 rounded-full blur-3xl\"\n style={{ background: withAlpha(themeTokens.accentSecondary, 0.22) }}\n />\n <div className=\"relative flex flex-col gap-6\">\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span\n className=\"inline-flex rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{\n background: withAlpha(themeTokens.accent, 0.14),\n color: themeTokens.text,\n }}\n >\n {t('checkout.payPage.badges.secure', 'Secure checkout')}\n </span>\n {preview ? (\n <span\n className=\"inline-flex rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{\n background: withAlpha(themeTokens.accentSecondary, 0.16),\n color: themeTokens.text,\n }}\n >\n {t('checkout.payPage.badges.preview', 'Preview')}\n </span>\n ) : null}\n </div>\n\n {resolvedLogoUrl ? (\n <img\n src={resolvedLogoUrl}\n alt={payload.title ?? payload.name}\n className=\"h-14 w-auto max-w-[180px] object-contain\"\n />\n ) : null}\n\n <div className=\"space-y-3\">\n <h1 className=\"max-w-3xl text-3xl font-semibold tracking-tight sm:text-5xl\">\n {payload.title ?? payload.name}\n </h1>\n {payload.subtitle ? (\n <p className=\"max-w-2xl text-base leading-7\" style={{ color: themeTokens.mutedText }}>\n {payload.subtitle}\n </p>\n ) : null}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\nexport function PayPageDescription({ payload, publicCustomFields, themeTokens }: PayPageDescriptionProps) {\n const t = useT()\n const hasDescription = Boolean(payload.description)\n const visibleFields = publicCustomFields.filter((field) => {\n const formattedValue = formatPublicFieldValue(field.value, {\n trueLabel: t('checkout.payPage.fields.booleanTrue', 'Yes'),\n falseLabel: t('checkout.payPage.fields.booleanFalse', 'No'),\n })\n return formattedValue.trim().length > 0\n })\n\n if (!hasDescription && visibleFields.length === 0) return null\n\n return (\n <section\n className=\"space-y-5 rounded-xl border p-6 sm:p-7\"\n style={buildPanelStyle(themeTokens, 'default')}\n >\n {hasDescription ? (\n <div className=\"space-y-3\">\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.description.kicker', 'Offer overview')}\n </div>\n <div className=\"prose prose-sm max-w-none\">\n <MarkdownContent body={payload.description ?? ''} format=\"markdown\" />\n </div>\n </div>\n ) : null}\n\n {visibleFields.length > 0 ? (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold\">{t('checkout.payPage.sections.productDetails', 'Product details')}</h2>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.productDetails', 'Additional offer details configured for this payment link.')}\n </p>\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {visibleFields.map((field) => {\n const formattedValue = formatPublicFieldValue(field.value, {\n trueLabel: t('checkout.payPage.fields.booleanTrue', 'Yes'),\n falseLabel: t('checkout.payPage.fields.booleanFalse', 'No'),\n })\n const isMultiline = field.kind === 'multiline' || formattedValue.includes('\\n')\n\n return (\n <div\n key={field.key}\n className={isMultiline ? 'rounded-xl border p-4 sm:col-span-2' : 'rounded-xl border p-4'}\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: themeTokens.border,\n }}\n >\n <div className=\"text-sm font-medium\">{field.label ?? field.key}</div>\n <div\n className={isMultiline ? 'mt-2 whitespace-pre-wrap text-sm' : 'mt-2 text-sm'}\n style={{ color: themeTokens.mutedText }}\n >\n {formattedValue}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ) : null}\n </section>\n )\n}\n\nexport function PayPageCustomerForm({\n payload,\n customerData,\n fieldErrors,\n inputsLocked,\n onFieldChange,\n translateValidationMessage,\n themeTokens,\n}: PayPageCustomerFormProps) {\n const t = useT()\n\n if ((payload.customerFieldsSchema?.length ?? 0) === 0 || payload.collectCustomerDetails === false) {\n return null\n }\n\n return (\n <section\n className=\"space-y-5 rounded-xl border p-6 sm:p-7\"\n style={buildPanelStyle(themeTokens, 'default')}\n >\n <div className=\"space-y-1\">\n <h2 className=\"text-xl font-semibold\">{t('checkout.payPage.sections.customerDetails', 'Customer details')}</h2>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.customerDetails', 'Add the buyer details once, then continue to payment.')}\n </p>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {(payload.customerFieldsSchema ?? []).map((field) => {\n const fieldPath = `customerData.${field.key}`\n const fieldError = fieldErrors[fieldPath]\n const value = customerData[field.key]\n const containerClass = field.kind === 'multiline' ? 'space-y-2 sm:col-span-2' : 'space-y-2'\n const semanticType = getCheckoutCustomerFieldSemanticType(field)\n const fieldId = `checkout-customer-${field.key}`\n const fieldErrorId = `${fieldId}-error`\n\n return (\n <div key={field.key} className={containerClass}>\n {field.kind === 'boolean' ? (\n <label\n className=\"flex items-start gap-3 rounded-xl border px-4 py-3 text-sm\"\n style={{\n background: fieldError\n ? themeTokens.errorSurface\n : withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: fieldError ? themeTokens.errorBorder : themeTokens.border,\n boxShadow: fieldError ? `0 0 0 2px ${themeTokens.errorRing}` : undefined,\n }}\n >\n <Checkbox\n checked={value === true}\n disabled={inputsLocked}\n aria-required={field.required ? true : undefined}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n onCheckedChange={(checked) => onFieldChange(field.key, checked === true)}\n />\n <span className=\"space-y-1\">\n <span className=\"font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </span>\n {field.placeholder ? (\n <span className=\"block\" style={{ color: themeTokens.mutedText }}>\n {field.placeholder}\n </span>\n ) : null}\n </span>\n </label>\n ) : (\n <>\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </label>\n {field.kind === 'multiline' ? (\n <Textarea\n id={fieldId}\n className={READABLE_INPUT_CLASSNAME}\n value={typeof value === 'string' ? value : ''}\n disabled={inputsLocked}\n onChange={(event) => onFieldChange(field.key, event.target.value)}\n placeholder={field.placeholder ?? undefined}\n aria-required={field.required ? true : undefined}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldError), inputsLocked)}\n />\n ) : field.kind === 'select' || field.kind === 'radio' ? (\n <Select\n value={typeof value === 'string' && value.length > 0 ? value : PAY_PAGE_EMPTY_SELECT_VALUE}\n disabled={inputsLocked}\n onValueChange={(nextValue) => {\n onFieldChange(field.key, nextValue === PAY_PAGE_EMPTY_SELECT_VALUE ? '' : nextValue)\n }}\n >\n <SelectTrigger\n id={fieldId}\n className={`rounded-xl ${READABLE_INPUT_CLASSNAME}`}\n aria-required={field.required ? true : undefined}\n aria-invalid={Boolean(fieldError)}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldError), inputsLocked)}\n >\n <SelectValue placeholder={t('checkout.payPage.fields.selectPlaceholder', 'Select...')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={PAY_PAGE_EMPTY_SELECT_VALUE}>\n {t('checkout.payPage.fields.selectPlaceholder', 'Select...')}\n </SelectItem>\n {(field.options ?? []).map((option) => (\n <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input\n id={fieldId}\n className={READABLE_INPUT_CLASSNAME}\n type={semanticType === 'email' ? 'email' : semanticType === 'phone' ? 'tel' : 'text'}\n value={typeof value === 'string' ? value : ''}\n disabled={inputsLocked}\n onChange={(event) => onFieldChange(field.key, event.target.value)}\n placeholder={field.placeholder ?? undefined}\n autoComplete={semanticType === 'email' ? 'email' : semanticType === 'phone' ? 'tel' : undefined}\n aria-required={field.required ? true : undefined}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldError), inputsLocked)}\n />\n )}\n </>\n )}\n {fieldError ? (\n <p id={fieldErrorId} className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldError, fieldPath)}\n </p>\n ) : null}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport function PayPagePricing({\n payload,\n amount,\n selectedPriceItemId,\n fieldErrors,\n inputsLocked,\n formatAmount,\n onAmountChange,\n onPriceItemSelect,\n translateValidationMessage,\n themeTokens,\n}: PayPagePricingProps) {\n const t = useT()\n\n return (\n <section className=\"space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.pricing.kicker', 'Payment setup')}\n </div>\n <h2 className=\"text-lg font-semibold\">{t('checkout.payPage.pricing.title', 'Choose how you want to pay')}</h2>\n </div>\n\n {payload.pricingMode === 'fixed' ? (\n <div className=\"rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'default')}>\n {typeof payload.fixedPriceOriginalAmount === 'number' ? (\n <div className=\"text-sm line-through\" style={{ color: themeTokens.mutedText }}>\n {formatAmount(payload.fixedPriceOriginalAmount, payload.fixedPriceCurrencyCode)}\n </div>\n ) : null}\n <div className=\"mt-1 text-4xl font-semibold\">\n {formatAmount(payload.fixedPriceAmount, payload.fixedPriceCurrencyCode)}\n </div>\n </div>\n ) : null}\n\n {payload.pricingMode === 'custom_amount' ? (\n <div className=\"space-y-2 rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'default')}>\n <label className=\"text-sm font-medium\">{t('checkout.payPage.fields.customAmount', 'Amount')}</label>\n <Input\n className={READABLE_INPUT_CLASSNAME}\n type=\"number\"\n value={amount ?? ''}\n disabled={inputsLocked}\n onChange={(event) => onAmountChange(event.target.value)}\n placeholder={[\n payload.customAmountMin != null ? formatAmount(payload.customAmountMin, payload.customAmountCurrencyCode) : null,\n payload.customAmountMax != null ? formatAmount(payload.customAmountMax, payload.customAmountCurrencyCode) : null,\n ].filter(Boolean).join(' - ')}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldErrors.amount), inputsLocked)}\n />\n {fieldErrors.amount ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors.amount, 'amount')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {payload.pricingMode === 'price_list' ? (\n <>\n <RadioGroup\n className=\"space-y-3\"\n value={selectedPriceItemId ?? ''}\n disabled={inputsLocked}\n onValueChange={(itemId) => {\n const item = (payload.priceListItems ?? []).find((candidate) => candidate.id === itemId)\n if (item) onPriceItemSelect(item)\n }}\n >\n {(payload.priceListItems ?? []).map((item) => (\n <label\n key={item.id}\n className=\"flex cursor-pointer items-center justify-between gap-3 rounded-xl border px-4 py-4 text-sm transition\"\n style={{\n background: selectedPriceItemId === item.id\n ? withAlpha(themeTokens.accent, 0.08)\n : withAlpha(themeTokens.shellBackground, 0.66),\n borderColor: selectedPriceItemId === item.id\n ? themeTokens.borderStrong\n : themeTokens.border,\n }}\n >\n <span className=\"flex items-center gap-3\">\n <Radio\n value={item.id}\n disabled={inputsLocked}\n />\n <span className=\"font-medium\">{item.description}</span>\n </span>\n <span className=\"whitespace-nowrap font-semibold\">{formatAmount(item.amount, item.currencyCode)}</span>\n </label>\n ))}\n </RadioGroup>\n {fieldErrors.selectedPriceItemId ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors.selectedPriceItemId, 'selectedPriceItemId')}\n </p>\n ) : null}\n </>\n ) : null}\n </section>\n )\n}\n\nexport function PayPageSummary({\n payload,\n selectedAmount,\n currencyCode,\n formatAmount,\n preview,\n themeTokens,\n}: PayPageSummaryProps) {\n const t = useT()\n const amountLabel = selectedAmount != null && currencyCode\n ? formatAmount(selectedAmount, currencyCode)\n : t('checkout.payPage.summary.awaitingSelection', 'Select an amount')\n\n return (\n <section className=\"rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'accent')}>\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-overline font-semibold uppercase tracking-widest text-current/70\">\n {t('checkout.payPage.summary.amountDue', 'Amount due')}\n </div>\n <div className=\"mt-2 text-4xl font-semibold\">{amountLabel}</div>\n </div>\n <div\n className=\"rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{ background: withAlpha(themeTokens.accentContrast, 0.12) }}\n >\n {preview\n ? t('checkout.payPage.summary.previewState', 'Preview')\n : t('checkout.payPage.summary.liveState', 'Live')}\n </div>\n </div>\n </section>\n )\n}\n\nexport function PayPageLegalConsent({\n payload,\n acceptedLegalConsents,\n fieldErrors,\n inputsLocked,\n onConsentChange,\n translateValidationMessage,\n themeTokens,\n}: PayPageLegalConsentProps) {\n const t = useT()\n const [activeDocument, setActiveDocument] = React.useState<'terms' | 'privacyPolicy' | null>(null)\n const hasTerms = Boolean(payload.legalDocuments?.terms?.markdown)\n const hasPrivacyPolicy = Boolean(payload.legalDocuments?.privacyPolicy?.markdown)\n const activeDocumentPayload = activeDocument ? payload.legalDocuments?.[activeDocument] : null\n\n if (!hasTerms && !hasPrivacyPolicy) return null\n\n return (\n <>\n <section className=\"space-y-4 rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'default')}>\n <div className=\"space-y-1\">\n <h3 className=\"text-base font-semibold\">{t('checkout.payPage.sections.legal', 'Legal confirmations')}</h3>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.legal', 'Required confirmations must be accepted before the payment step starts.')}\n </p>\n </div>\n\n {hasTerms ? (\n <div className=\"space-y-2\">\n <div\n className=\"rounded-xl border px-4 py-3\"\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: fieldErrors['acceptedLegalConsents.terms'] ? themeTokens.errorBorder : themeTokens.border,\n }}\n >\n <label className=\"flex items-start gap-3 text-sm\">\n <Checkbox\n checked={acceptedLegalConsents.terms === true}\n disabled={inputsLocked}\n onCheckedChange={(checked) => onConsentChange('terms', checked === true)}\n />\n <span className=\"space-y-2\">\n <span className=\"block\">\n {t(\n 'checkout.payPage.legal.acceptDocument',\n 'I accept {document}.',\n {\n document: payload.legalDocuments?.terms?.title || t('checkout.payPage.legal.defaultTermsTitle', 'the terms and conditions'),\n },\n )}\n </span>\n <Button\n type=\"button\"\n variant=\"link\"\n className=\"h-auto p-0 text-sm font-medium underline\"\n style={{ color: themeTokens.text }}\n onClick={() => setActiveDocument('terms')}\n >\n {t('checkout.payPage.legal.readDocument', 'Read document')}\n </Button>\n </span>\n </label>\n </div>\n {fieldErrors['acceptedLegalConsents.terms'] ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors['acceptedLegalConsents.terms'], 'acceptedLegalConsents.terms')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {hasPrivacyPolicy ? (\n <div className=\"space-y-2\">\n <div\n className=\"rounded-xl border px-4 py-3\"\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: fieldErrors['acceptedLegalConsents.privacyPolicy'] ? themeTokens.errorBorder : themeTokens.border,\n }}\n >\n <label className=\"flex items-start gap-3 text-sm\">\n <Checkbox\n checked={acceptedLegalConsents.privacyPolicy === true}\n disabled={inputsLocked}\n onCheckedChange={(checked) => onConsentChange('privacyPolicy', checked === true)}\n />\n <span className=\"space-y-2\">\n <span className=\"block\">\n {t(\n 'checkout.payPage.legal.acceptDocument',\n 'I accept {document}.',\n {\n document: payload.legalDocuments?.privacyPolicy?.title || t('checkout.payPage.legal.defaultPrivacyTitle', 'the privacy policy'),\n },\n )}\n </span>\n <Button\n type=\"button\"\n variant=\"link\"\n className=\"h-auto p-0 text-sm font-medium underline\"\n style={{ color: themeTokens.text }}\n onClick={() => setActiveDocument('privacyPolicy')}\n >\n {t('checkout.payPage.legal.readDocument', 'Read document')}\n </Button>\n </span>\n </label>\n </div>\n {fieldErrors['acceptedLegalConsents.privacyPolicy'] ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors['acceptedLegalConsents.privacyPolicy'], 'acceptedLegalConsents.privacyPolicy')}\n </p>\n ) : null}\n </div>\n ) : null}\n </section>\n\n <Dialog open={activeDocument !== null} onOpenChange={(open) => { if (!open) setActiveDocument(null) }}>\n <DialogContent className=\"max-h-[80vh] overflow-hidden sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {activeDocumentPayload?.title\n || (activeDocument === 'privacyPolicy'\n ? t('checkout.payPage.legal.defaultPrivacyTitle', 'the privacy policy')\n : t('checkout.payPage.legal.defaultTermsTitle', 'the terms and conditions'))}\n </DialogTitle>\n </DialogHeader>\n <div className=\"overflow-y-auto pr-2\">\n <div className=\"prose prose-sm max-w-none\">\n <MarkdownContent body={activeDocumentPayload?.markdown ?? ''} format=\"markdown\" />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\nexport function PayPagePaymentForm({\n payload,\n slug,\n preview,\n isSubmitting,\n submissionError,\n paymentSession,\n activeTransactionId,\n embeddedRenderer,\n onSubmit,\n onReset,\n onComplete,\n onError,\n injectionContext,\n themeTokens,\n}: PayPagePaymentFormProps) {\n const t = useT()\n const embeddedPaymentSession = paymentSession?.type === 'embedded' ? paymentSession : null\n\n return (\n <section className=\"space-y-4\">\n {submissionError ? (\n <Alert status=\"error\" style=\"lighter\" size=\"default\">\n <AlertDescription>{submissionError}</AlertDescription>\n </Alert>\n ) : null}\n\n <InjectionSpot spotId={extensionPoints.hosts.gatewayWidgetBefore.spotId} context={injectionContext} />\n {embeddedPaymentSession && embeddedRenderer ? (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.gatewayRendererBefore.spotId} context={injectionContext} />\n {React.createElement(embeddedRenderer, {\n providerKey: embeddedPaymentSession.providerKey ?? '',\n transactionId: activeTransactionId ?? '',\n gatewayTransactionId: embeddedPaymentSession.gatewayTransactionId,\n session: embeddedPaymentSession,\n disabled: preview,\n onComplete,\n onError,\n })}\n <InjectionSpot spotId={extensionPoints.hosts.gatewayRendererAfter.spotId} context={injectionContext} />\n </>\n ) : (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.gatewayActionsBefore.spotId} context={injectionContext} />\n <Button\n type=\"button\"\n className=\"h-12 w-full rounded-xl text-base\"\n disabled={preview || isSubmitting}\n style={buildButtonStyle(themeTokens)}\n onClick={() => { void onSubmit() }}\n >\n <span className=\"flex items-center justify-center gap-2\">\n {isSubmitting ? <Spinner size=\"sm\" /> : null}\n {preview\n ? t('checkout.payPage.actions.previewDisabled', 'Preview only')\n : isSubmitting\n ? t('checkout.payPage.actions.processingPayment', 'Processing payment...')\n : t('checkout.payPage.actions.payNow', 'Pay now')}\n </span>\n </Button>\n <InjectionSpot spotId={extensionPoints.hosts.gatewayActionsAfter.spotId} context={injectionContext} />\n </>\n )}\n <InjectionSpot spotId={extensionPoints.hosts.gatewayWidgetAfter.spotId} context={injectionContext} />\n\n {paymentSession ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full rounded-xl\"\n style={buildButtonStyle(themeTokens, 'outline')}\n onClick={onReset}\n >\n {t('checkout.payPage.actions.editDetails', 'Edit details')}\n </Button>\n ) : null}\n\n {payload.gatewayProviderKey ? (\n <div className=\"text-center text-xs\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.payment.providerHint', 'Your payment will be handled by {provider}.', {\n provider: payload.gatewayProviderKey,\n })}\n </div>\n ) : null}\n\n <div className=\"hidden text-xs\" data-pay-link-slug={slug} />\n </section>\n )\n}\n\nexport function PayPagePaymentSection({ payload, preview, themeTokens, children }: PayPagePaymentSectionProps) {\n const t = useT()\n\n return (\n <Card\n className=\"overflow-hidden rounded-xl border backdrop-blur\"\n style={{\n ...buildPanelStyle(themeTokens, 'default'),\n background: `linear-gradient(180deg, ${withAlpha(themeTokens.surface, 0.96)} 0%, ${withAlpha(themeTokens.shellBackground, 0.94)} 100%)`,\n }}\n >\n <CardContent className=\"space-y-6 p-5 sm:p-6\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.payment.kicker', 'Payment rail')}\n </div>\n <h2 className=\"mt-1 text-xl font-semibold\">{t('checkout.payPage.sections.payment', 'Payment')}</h2>\n </div>\n <div\n className=\"rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{\n background: withAlpha(preview ? themeTokens.accentSecondary : themeTokens.accent, 0.12),\n color: themeTokens.text,\n }}\n >\n {preview\n ? t('checkout.payPage.payment.previewState', 'No charge')\n : t('checkout.payPage.payment.liveState', 'Ready')}\n </div>\n </div>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.payment', 'Choose the amount, review the summary, then continue with the secure payment step.')}\n </p>\n {payload.gatewayProviderKey ? (\n <div className=\"text-sm font-medium\">{payload.gatewayProviderKey}</div>\n ) : null}\n </div>\n {children}\n </CardContent>\n </Card>\n )\n}\n\nexport function PayPageHelp({ payload, preview, themeTokens }: PayPageHelpProps) {\n const t = useT()\n\n return (\n <section\n className=\"rounded-xl border px-4 py-4 text-sm\"\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.7),\n borderColor: themeTokens.border,\n color: themeTokens.mutedText,\n }}\n >\n <div className=\"font-medium\" style={{ color: themeTokens.text }}>\n {preview\n ? t('checkout.payPage.help.previewHeadline', 'This is a preview of the payment flow.')\n : t('checkout.payPage.help.liveHeadline', 'The provider widget appears in this panel after validation.')}\n </div>\n <div className=\"mt-2\">\n {payload.gatewayProviderKey\n ? t('checkout.payPage.help.providerLine', 'Provider: {provider}.', { provider: payload.gatewayProviderKey })\n : t('checkout.payPage.help.providerFallback', 'The payment provider is configured in the checkout settings.')}\n </div>\n </section>\n )\n}\n\nexport function PayPageFooter({ payload, themeTokens }: PayPageFooterProps) {\n const t = useT()\n const locale = useLocale()\n const router = useRouter()\n const selectId = React.useId()\n const [pending, startTransition] = React.useTransition()\n\n const languageLabels = React.useMemo<Record<Locale, string>>(() => ({\n en: t('common.languages.english', 'English'),\n pl: t('common.languages.polish', 'Polski'),\n es: t('common.languages.spanish', 'Espa\u00F1ol'),\n de: t('common.languages.german', 'Deutsch'),\n }), [t])\n\n const setLocale = React.useCallback(async (nextLocale: Locale) => {\n if (nextLocale === locale) return\n\n try {\n const updated = await persistLocalePreference(nextLocale)\n if (!updated) return\n\n startTransition(() => router.refresh())\n } catch {\n // Keep the current locale when persistence fails.\n }\n }, [locale, router, startTransition])\n\n React.useEffect(() => {\n if (hasStoredLocalePreference() || typeof navigator === 'undefined') return\n\n const preferredLocale = resolveLocaleFromCandidates([\n ...(Array.isArray(navigator.languages) ? navigator.languages : []),\n navigator.language,\n ])\n\n if (!preferredLocale) return\n\n let active = true\n\n void (async () => {\n try {\n const updated = await persistLocalePreference(preferredLocale)\n if (!updated || !active || preferredLocale === locale) return\n\n startTransition(() => router.refresh())\n } catch {\n // Keep the current locale when auto-detection persistence fails.\n }\n })()\n\n return () => {\n active = false\n }\n }, [locale, router, startTransition])\n\n return (\n <footer\n className=\"rounded-xl border px-5 py-4 text-sm sm:px-6\"\n style={{\n background: withAlpha(themeTokens.surface, 0.86),\n borderColor: themeTokens.border,\n color: themeTokens.mutedText,\n }}\n >\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"font-medium\" style={{ color: themeTokens.text }}>{payload.title ?? payload.name}</div>\n <div>{t('checkout.payPage.footer.subtitle', 'Public payment page configured in checkout.')}</div>\n </div>\n <div className=\"flex flex-wrap items-center gap-3 sm:justify-end\">\n <div className=\"flex items-center gap-2 text-xs\" style={{ color: themeTokens.mutedText }}>\n <label htmlFor={selectId}>{t('common.language', 'Language')}</label>\n <Select\n value={locale}\n onValueChange={(nextLocale) => setLocale(nextLocale as Locale)}\n disabled={pending}\n >\n <SelectTrigger\n id={selectId}\n size=\"sm\"\n className=\"w-auto min-w-28 rounded-full text-xs font-medium\"\n style={{\n background: withAlpha(themeTokens.surface, 0.92),\n borderColor: themeTokens.borderStrong,\n color: themeTokens.text,\n }}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {locales.map((entry) => (\n <SelectItem key={entry} value={entry}>\n {languageLabels[entry]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-xs uppercase tracking-widest\">\n {payload.gatewayProviderKey ?? t('checkout.payPage.header.autoProvider', 'Configured in checkout')}\n </div>\n </div>\n </div>\n </footer>\n )\n}\n\nexport function PayPage({\n mode = 'link',\n sourceId,\n initialPayload = null,\n initialLoadError = null,\n}: PayPageProps) {\n const params = useParams<{ slug: string }>()\n const router = useRouter()\n const searchParams = useSearchParams()\n const t = useT()\n const locale = useLocale()\n const prefersDark = usePrefersDarkMode()\n\n const routeSlug = typeof params?.slug === 'string' ? params.slug : ''\n const slug = sourceId ?? routeSlug\n const previewRequested = searchParams.get('preview') === 'true' || mode === 'template'\n\n const [payload, setPayload] = React.useState<PayLinkPayload | null>(initialPayload)\n const [isLoading, setIsLoading] = React.useState(initialPayload == null && initialLoadError == null)\n const [loadError, setLoadError] = React.useState<string | null>(initialLoadError)\n const [password, setPassword] = React.useState('')\n const [passwordError, setPasswordError] = React.useState<string | null>(null)\n const [isVerifyingPassword, setIsVerifyingPassword] = React.useState(false)\n const [customerData, setCustomerData] = React.useState<Record<string, unknown>>({})\n const [acceptedLegalConsents, setAcceptedLegalConsents] = React.useState<Record<string, boolean>>({})\n const [amount, setAmount] = React.useState<number | null>(null)\n const [selectedPriceItemId, setSelectedPriceItemId] = React.useState<string | null>(null)\n const [submissionError, setSubmissionError] = React.useState<string | null>(null)\n const [fieldErrors, setFieldErrors] = React.useState<FieldErrors>({})\n const [paymentSession, setPaymentSession] = React.useState<SubmitResponse['paymentSession']>(null)\n const [activeTransactionId, setActiveTransactionId] = React.useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = React.useState(false)\n\n const themeTokens = React.useMemo(\n () => resolveThemeTokens(payload, prefersDark),\n [payload, prefersDark],\n )\n\n const loadPayload = React.useCallback(async () => {\n if (!slug) return\n setIsLoading(true)\n setLoadError(null)\n const endpoint = mode === 'template'\n ? `/api/checkout/templates/${encodeURIComponent(slug)}/preview`\n : `/api/checkout/pay/${encodeURIComponent(slug)}${previewRequested ? '?preview=true' : ''}`\n\n try {\n const result = await readApiResultOrThrow<PayLinkPayload>(endpoint)\n setPayload(result)\n setPaymentSession(null)\n setActiveTransactionId(null)\n if (result.pricingMode === 'fixed' && typeof result.fixedPriceAmount === 'number') {\n setAmount(result.fixedPriceAmount)\n }\n } catch (error) {\n setPayload(null)\n setLoadError(readErrorMessage(error, t('checkout.payPage.errors.loadMessage', \"We couldn't load this payment page. Please try again.\")))\n } finally {\n setIsLoading(false)\n }\n }, [mode, previewRequested, slug, t])\n\n React.useEffect(() => {\n if (!slug) return\n if (initialPayload) return\n void loadPayload()\n }, [initialPayload, loadPayload, slug])\n\n React.useEffect(() => {\n if (!payload) return\n if (payload.pricingMode === 'fixed' && typeof payload.fixedPriceAmount === 'number') {\n setAmount(payload.fixedPriceAmount)\n return\n }\n if (payload.pricingMode !== 'price_list') {\n setSelectedPriceItemId(null)\n }\n }, [payload])\n\n const formatAmount = React.useCallback((value: number | null | undefined, currencyCode?: string | null) => {\n const normalizedValue = typeof value === 'number' && Number.isFinite(value) ? value : 0\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(normalizedValue)\n } catch {\n return `${normalizedValue.toFixed(2)} ${currencyCode}`\n }\n }\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(normalizedValue)\n }, [locale])\n\n const isPreview = payload?.preview === true || previewRequested\n const selectedPriceItem = payload?.priceListItems?.find((item) => item.id === selectedPriceItemId) ?? null\n const shouldCollectCustomerDetails = payload != null\n && payload.collectCustomerDetails !== false\n && (payload.customerFieldsSchema?.length ?? 0) > 0\n const effectiveAmount = selectedPriceItem?.amount ?? amount\n const effectiveCurrencyCode = selectedPriceItem?.currencyCode\n ?? payload?.fixedPriceCurrencyCode\n ?? payload?.customAmountCurrencyCode\n ?? null\n const inputsLocked = isSubmitting || paymentSession != null\n const publicCustomFields = payload?.publicCustomFields ?? []\n const submitData = React.useMemo<PayPageSubmitData>(() => ({\n customerData,\n acceptedLegalConsents,\n amount: effectiveAmount ?? null,\n selectedPriceItemId,\n }), [acceptedLegalConsents, customerData, effectiveAmount, selectedPriceItemId])\n\n const resolveFieldLabel = React.useCallback((fieldPath: string): string => {\n if (!payload) return t('checkout.payPage.validation.thisField', 'this field')\n if (fieldPath.startsWith('customerData.')) {\n const fieldKey = fieldPath.slice('customerData.'.length)\n return payload.customerFieldsSchema?.find((field) => field.key === fieldKey)?.label\n ?? fieldKey\n }\n if (fieldPath === 'amount') {\n return t('checkout.payPage.summary.amountDue', 'Amount due')\n }\n if (fieldPath === 'selectedPriceItemId') {\n return t('checkout.payPage.validation.labels.option', 'payment option')\n }\n if (fieldPath.startsWith('acceptedLegalConsents.')) {\n const consentKey = fieldPath.slice('acceptedLegalConsents.'.length)\n if (consentKey === 'terms') {\n return payload.legalDocuments?.terms?.title\n ?? t('checkout.payPage.legal.defaultTermsTitle', 'the terms and conditions')\n }\n if (consentKey === 'privacyPolicy') {\n return payload.legalDocuments?.privacyPolicy?.title\n ?? t('checkout.payPage.legal.defaultPrivacyTitle', 'the privacy policy')\n }\n }\n return t('checkout.payPage.validation.thisField', 'this field')\n }, [payload, t])\n\n const translateValidationMessage = React.useCallback((message: string | null | undefined, fieldPath?: string) => {\n const trimmed = typeof message === 'string' ? message.trim() : ''\n if (!trimmed) return ''\n if (trimmed === 'checkout.payPage.validation.requiredField') {\n return t(trimmed, 'Enter {field}.', { field: resolveFieldLabel(fieldPath ?? '') })\n }\n if (trimmed === 'checkout.payPage.validation.documentRequired') {\n return t(trimmed, 'Accept {field} to continue.', { field: resolveFieldLabel(fieldPath ?? '') })\n }\n return t(trimmed, trimmed)\n }, [resolveFieldLabel, t])\n\n const clearFieldError = React.useCallback((fieldPath: string) => {\n setFieldErrors((current) => {\n if (!current[fieldPath]) return current\n const next = { ...current }\n delete next[fieldPath]\n return next\n })\n }, [])\n\n const applySubmitDataToState = React.useCallback((nextData: PayPageSubmitData) => {\n setCustomerData(nextData.customerData)\n setAcceptedLegalConsents(nextData.acceptedLegalConsents)\n setAmount(nextData.amount)\n setSelectedPriceItemId(nextData.selectedPriceItemId)\n }, [])\n\n const validateBeforeSubmit = React.useCallback((): FieldErrors => {\n if (!payload) return {}\n const nextErrors: FieldErrors = {}\n\n if (shouldCollectCustomerDetails) {\n Object.assign(\n nextErrors,\n validateCheckoutCustomerData(payload.customerFieldsSchema ?? [], customerData),\n )\n }\n\n if (payload.pricingMode === 'custom_amount') {\n if (effectiveAmount == null || !Number.isFinite(effectiveAmount)) {\n nextErrors.amount = 'checkout.payPage.validation.amountRequired'\n } else {\n if (payload.customAmountMin != null && effectiveAmount < payload.customAmountMin) {\n nextErrors.amount = t(\n 'checkout.payPage.validation.amountMin',\n 'Enter at least {amount}.',\n { amount: formatAmount(payload.customAmountMin, payload.customAmountCurrencyCode) },\n )\n }\n if (payload.customAmountMax != null && effectiveAmount > payload.customAmountMax) {\n nextErrors.amount = t(\n 'checkout.payPage.validation.amountMax',\n 'Enter no more than {amount}.',\n { amount: formatAmount(payload.customAmountMax, payload.customAmountCurrencyCode) },\n )\n }\n }\n }\n\n if (payload.pricingMode === 'price_list' && !selectedPriceItemId) {\n nextErrors.selectedPriceItemId = 'checkout.payPage.validation.priceSelectionRequired'\n }\n\n for (const key of ['terms', 'privacyPolicy'] as const) {\n const document = payload.legalDocuments?.[key]\n if (document?.required === true && acceptedLegalConsents[key] !== true) {\n nextErrors[`acceptedLegalConsents.${key}`] = 'checkout.payPage.validation.documentRequired'\n }\n }\n\n return nextErrors\n }, [\n acceptedLegalConsents,\n customerData,\n effectiveAmount,\n formatAmount,\n payload,\n selectedPriceItemId,\n shouldCollectCustomerDetails,\n t,\n ])\n\n const embeddedRenderer = paymentSession?.type === 'embedded' && paymentSession.providerKey\n ? getPaymentGatewayRenderer(paymentSession.providerKey, paymentSession.rendererKey)\n : null\n\n const paymentView: PayPageInjectionContext['paymentView'] = paymentSession == null\n ? 'idle'\n : embeddedRenderer\n ? 'embedded'\n : 'redirect'\n\n const injectionContext = React.useMemo<PayPageInjectionContext | null>(() => {\n if (!payload) return null\n return {\n link: payload,\n themeMode: themeTokens.mode,\n themeTokens,\n preview: isPreview,\n selectedAmount: effectiveAmount ?? null,\n currencyCode: effectiveCurrencyCode,\n pricingMode: payload.pricingMode,\n customerSchema: payload.customerFieldsSchema ?? [],\n customerData,\n legalDocuments: payload.legalDocuments ?? {},\n acceptedLegalConsents,\n transaction: activeTransactionId ? { id: activeTransactionId } : null,\n paymentView,\n paymentSession,\n paymentProviderKey: paymentSession?.providerKey ?? payload.gatewayProviderKey ?? null,\n paymentRendererKey: paymentSession?.type === 'embedded' ? paymentSession.rendererKey : null,\n fieldErrors,\n submissionError,\n inputsLocked,\n isSubmitting,\n canSubmit: !isPreview && !inputsLocked,\n operation: 'create',\n }\n }, [\n acceptedLegalConsents,\n activeTransactionId,\n customerData,\n effectiveAmount,\n effectiveCurrencyCode,\n isPreview,\n isSubmitting,\n inputsLocked,\n payload,\n fieldErrors,\n paymentSession,\n paymentView,\n submissionError,\n themeTokens,\n ])\n\n const injectionContextRef = React.useRef<PayPageInjectionContext | null>(injectionContext)\n const submitDataRef = React.useRef(submitData)\n\n React.useEffect(() => {\n injectionContextRef.current = injectionContext\n }, [injectionContext])\n\n React.useEffect(() => {\n submitDataRef.current = submitData\n }, [submitData])\n\n const { widgets: payPageFormWidgets } = useInjectionWidgets<PayPageInjectionContext>(\n injectionContext ? 'checkout.pay-page:form' : null,\n {\n context: injectionContext ?? undefined,\n triggerOnLoad: true,\n },\n )\n const { triggerEvent: triggerPayPageFormEvent } = useInjectionSpotEvents<PayPageInjectionContext, PayPageSubmitData>(\n 'checkout.pay-page:form',\n payPageFormWidgets,\n )\n\n const transformValidationErrors = React.useCallback(async (nextErrors: FieldErrors): Promise<FieldErrors> => {\n if (!injectionContextRef.current || !Object.keys(nextErrors).length) return nextErrors\n try {\n const result = await triggerPayPageFormEvent(\n 'transformValidation',\n nextErrors as unknown as PayPageSubmitData,\n injectionContextRef.current,\n { originalData: submitDataRef.current },\n )\n const transformed = result.data\n if (!transformed || typeof transformed !== 'object' || Array.isArray(transformed)) {\n return nextErrors\n }\n return Object.fromEntries(\n Object.entries(transformed as Record<string, unknown>).map(([fieldPath, value]) => [fieldPath, String(value)]),\n )\n } catch (error) {\n logger.error('Error in transformValidation', { err: error })\n return nextErrors\n }\n }, [triggerPayPageFormEvent])\n\n const dispatchFieldChange = React.useCallback((fieldPath: string, value: unknown, nextData: PayPageSubmitData) => {\n if (!injectionContextRef.current) return\n void (async () => {\n try {\n const result = await triggerPayPageFormEvent(\n 'onFieldChange',\n nextData,\n injectionContextRef.current as PayPageInjectionContext,\n {\n fieldId: fieldPath,\n fieldValue: value,\n originalData: submitDataRef.current,\n },\n )\n const adjustedData = applySubmitDataSideEffects(\n setSubmitDataFieldValue(\n nextData,\n fieldPath,\n result.fieldChange?.value !== undefined ? result.fieldChange.value : value,\n ),\n result.fieldChange?.sideEffects,\n )\n if (adjustedData !== nextData) {\n applySubmitDataToState(adjustedData)\n }\n const nextMessage = result.fieldChange?.messages?.find((message) => message.severity === 'error')?.text\n if (nextMessage) {\n setFieldErrors((current) => ({ ...current, [fieldPath]: nextMessage }))\n }\n } catch (error) {\n logger.error('Error in onFieldChange', { err: error })\n }\n })()\n }, [applySubmitDataToState, triggerPayPageFormEvent])\n\n const updateCustomerField = React.useCallback((fieldKey: string, value: unknown) => {\n const fieldPath = `customerData.${fieldKey}`\n const nextData = setSubmitDataFieldValue(submitDataRef.current, fieldPath, value)\n applySubmitDataToState(nextData)\n clearFieldError(fieldPath)\n setSubmissionError(null)\n dispatchFieldChange(fieldPath, value, nextData)\n }, [applySubmitDataToState, clearFieldError, dispatchFieldChange])\n\n const updateConsent = React.useCallback((fieldKey: 'terms' | 'privacyPolicy', value: boolean) => {\n const fieldPath = `acceptedLegalConsents.${fieldKey}`\n const nextData = setSubmitDataFieldValue(submitDataRef.current, fieldPath, value)\n applySubmitDataToState(nextData)\n clearFieldError(fieldPath)\n setSubmissionError(null)\n dispatchFieldChange(fieldPath, value, nextData)\n }, [applySubmitDataToState, clearFieldError, dispatchFieldChange])\n\n const previewBanner = payload ? (\n isPreview ? (\n <div\n className=\"rounded-xl border px-5 py-4\"\n style={{\n background: withAlpha(themeTokens.accentSecondary, 0.12),\n borderColor: withAlpha(themeTokens.accentSecondary, 0.44),\n color: themeTokens.text,\n }}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <span className=\"text-sm font-medium\">{t('checkout.payPage.previewBanner', 'Preview mode. Payments are disabled.')}</span>\n <Button asChild type=\"button\" variant=\"outline\" style={buildButtonStyle(themeTokens, 'outline')}>\n <Link href={mode === 'template'\n ? `/backend/checkout/templates/${encodeURIComponent(payload.id)}`\n : `/backend/checkout/pay-links/${encodeURIComponent(payload.id)}`}\n >\n {t('checkout.payPage.actions.backToAdmin', 'Back to admin')}\n </Link>\n </Button>\n </div>\n </div>\n ) : null\n ) : null\n\n const SurfaceComponent = useRegisteredComponent<PayPageSurfaceProps>(PAGE_HANDLE, PayPageSurface)\n const HeaderComponent = useRegisteredComponent<PayPageHeaderProps>(HEADER_HANDLE, PayPageHeader)\n const DescriptionComponent = useRegisteredComponent<PayPageDescriptionProps>(DESCRIPTION_HANDLE, PayPageDescription)\n const CustomerFormComponent = useRegisteredComponent<PayPageCustomerFormProps>(CUSTOMER_FORM_HANDLE, PayPageCustomerForm)\n const PricingComponent = useRegisteredComponent<PayPagePricingProps>(PRICING_HANDLE, PayPagePricing)\n const SummaryComponent = useRegisteredComponent<PayPageSummaryProps>(SUMMARY_HANDLE, PayPageSummary)\n const LegalConsentComponent = useRegisteredComponent<PayPageLegalConsentProps>(LEGAL_CONSENT_HANDLE, PayPageLegalConsent)\n const PaymentSectionComponent = useRegisteredComponent<PayPagePaymentSectionProps>(PAYMENT_HANDLE, PayPagePaymentSection)\n const PaymentFormComponent = useRegisteredComponent<PayPagePaymentFormProps>(GATEWAY_FORM_HANDLE, PayPagePaymentForm)\n const HelpComponent = useRegisteredComponent<PayPageHelpProps>(HELP_HANDLE, PayPageHelp)\n const FooterComponent = useRegisteredComponent<PayPageFooterProps>(FOOTER_HANDLE, PayPageFooter)\n\n const submitPayment = React.useCallback(async () => {\n if (isPreview || !payload) return\n const nextErrors = await transformValidationErrors(validateBeforeSubmit())\n if (Object.keys(nextErrors).length > 0) {\n setFieldErrors(nextErrors)\n setSubmissionError(t('checkout.payPage.validation.fixErrors', 'Check the highlighted fields and try again.'))\n return\n }\n\n setIsSubmitting(true)\n setSubmissionError(null)\n setFieldErrors({})\n\n try {\n let nextSubmitData = submitDataRef.current\n if (injectionContextRef.current) {\n try {\n const transformed = await triggerPayPageFormEvent(\n 'transformFormData',\n nextSubmitData,\n injectionContextRef.current,\n )\n if (transformed.data) {\n nextSubmitData = transformed.data\n if (transformed.applyToForm) {\n applySubmitDataToState(nextSubmitData)\n }\n }\n } catch (error) {\n logger.error('Error in transformFormData', { err: error })\n }\n }\n\n let injectionRequestHeaders: Record<string, string> | undefined\n if (injectionContextRef.current) {\n const guard = await triggerPayPageFormEvent('onBeforeSave', nextSubmitData, injectionContextRef.current)\n if (!guard.ok) {\n const transformedErrors = await transformValidationErrors(guard.fieldErrors ?? {})\n if (Object.keys(transformedErrors).length > 0) {\n setFieldErrors(transformedErrors)\n }\n setSubmissionError(\n guard.message\n || t('checkout.payPage.validation.fixErrors', 'Check the highlighted fields and try again.'),\n )\n setIsSubmitting(false)\n return\n }\n injectionRequestHeaders = guard.requestHeaders\n await triggerPayPageFormEvent('onSave', nextSubmitData, injectionContextRef.current)\n }\n\n const runSubmit = async () => readApiResultOrThrow<SubmitResponse>(\n `/api/checkout/pay/${encodeURIComponent(slug)}/submit`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': crypto.randomUUID(),\n 'x-om-unauthorized-redirect': '0',\n },\n body: JSON.stringify(nextSubmitData),\n },\n )\n\n const result = injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0\n ? await withScopedApiRequestHeaders(injectionRequestHeaders, runSubmit)\n : await runSubmit()\n\n setActiveTransactionId(result.transactionId)\n\n if (result.paymentSession?.type === 'embedded') {\n const nextRenderer = result.paymentSession.providerKey\n ? getPaymentGatewayRenderer(result.paymentSession.providerKey, result.paymentSession.rendererKey)\n : null\n\n if (nextRenderer) {\n setPaymentSession(result.paymentSession)\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n return\n }\n\n if (result.redirectUrl) {\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n window.location.href = result.redirectUrl\n return\n }\n\n setSubmissionError(t(\n 'checkout.payPage.errors.embeddedUnavailable',\n 'The payment form is unavailable right now. Please try again or use the hosted payment page.',\n ))\n return\n }\n\n if (result.redirectUrl) {\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n window.location.href = result.redirectUrl\n return\n }\n\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n router.push(`/pay/${encodeURIComponent(slug)}/success/${encodeURIComponent(result.transactionId)}`)\n } catch (error) {\n const normalized = mapCrudServerErrorToFormErrors(error)\n const nextFieldErrors = await transformValidationErrors(Object.fromEntries(\n Object.entries(normalized.fieldErrors ?? {}).map(([fieldPath, message]) => [\n fieldPath,\n translateValidationMessage(message, fieldPath),\n ]),\n ))\n if (Object.keys(nextFieldErrors).length > 0) {\n setFieldErrors(nextFieldErrors)\n }\n setSubmissionError(\n translateValidationMessage(normalized.message)\n || t('checkout.payPage.errors.submit', 'Unable to start the payment. Please try again.'),\n )\n } finally {\n setIsSubmitting(false)\n }\n }, [\n acceptedLegalConsents,\n applySubmitDataToState,\n customerData,\n effectiveAmount,\n isPreview,\n payload,\n router,\n selectedPriceItemId,\n slug,\n t,\n transformValidationErrors,\n triggerPayPageFormEvent,\n translateValidationMessage,\n validateBeforeSubmit,\n ])\n\n if (!slug || isLoading) {\n return (\n <div\n className=\"mx-auto flex min-h-[50vh] max-w-4xl items-center justify-center gap-3 px-4 py-16 text-sm\"\n style={{ color: themeTokens.mutedText }}\n >\n <Spinner size=\"sm\" />\n <span>{t('checkout.payPage.loading', 'Loading payment link...')}</span>\n </div>\n )\n }\n\n if (loadError || !payload) {\n return (\n <div className=\"mx-auto max-w-3xl px-4 py-16\">\n <Alert\n status=\"error\"\n style=\"lighter\"\n size=\"default\"\n action={(\n <Button type=\"button\" variant=\"outline\" onClick={() => { void loadPayload() }}>\n {t('checkout.payPage.actions.retry', 'Retry')}\n </Button>\n )}\n >\n <div className=\"space-y-1\">\n <AlertTitle>{t('checkout.payPage.errors.loadTitle', 'Unable to load payment link')}</AlertTitle>\n <AlertDescription>\n {loadError ?? t('checkout.payPage.errors.loadMessage', \"We couldn't load this payment page. Please try again.\")}\n </AlertDescription>\n </div>\n </Alert>\n </div>\n )\n }\n\n if (payload.requiresPassword) {\n return (\n <div\n className=\"min-h-screen px-4 py-8 sm:px-6\"\n style={{ background: themeTokens.pageBackground, color: themeTokens.text }}\n >\n <div className=\"mx-auto max-w-lg\">\n <Card\n className=\"rounded-xl border backdrop-blur\"\n style={buildPanelStyle(themeTokens, 'default')}\n >\n <CardContent className=\"space-y-5 p-6 sm:p-8\">\n <div className=\"space-y-2\">\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.badges.secure', 'Secure checkout')}\n </div>\n <h1 className=\"text-2xl font-semibold\">{payload.title ?? t('checkout.payPage.protectedTitle', 'Protected payment link')}</h1>\n </div>\n <PasswordInput\n className={READABLE_INPUT_CLASSNAME}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n placeholder={t('checkout.payPage.passwordPlaceholder', 'Password')}\n style={buildReadableInputStyle(themeTokens, Boolean(passwordError))}\n />\n {passwordError ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {passwordError}\n </p>\n ) : null}\n <Button\n type=\"button\"\n disabled={isVerifyingPassword}\n style={buildButtonStyle(themeTokens)}\n onClick={async () => {\n setIsVerifyingPassword(true)\n setPasswordError(null)\n try {\n await apiCallOrThrow(`/api/checkout/pay/${encodeURIComponent(slug)}/verify-password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-om-unauthorized-redirect': '0',\n },\n body: JSON.stringify({ password }),\n })\n await loadPayload()\n } catch (error) {\n setPasswordError(readTranslatedErrorMessage(\n error,\n t,\n t('checkout.payPage.errors.password', 'Unable to verify password. Please try again.'),\n ))\n } finally {\n setIsVerifyingPassword(false)\n }\n }}\n >\n <span className=\"flex items-center gap-2\">\n {isVerifyingPassword ? <Spinner size=\"sm\" /> : null}\n {isVerifyingPassword\n ? t('checkout.payPage.actions.verifying', 'Verifying...')\n : t('checkout.payPage.actions.continue', 'Continue')}\n </span>\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n )\n }\n\n if (payload.available === false && !isPreview) {\n return (\n <div className=\"mx-auto max-w-3xl px-4 py-16 text-center text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.unavailable', 'This payment link is no longer available.')}\n </div>\n )\n }\n\n if (!injectionContext) return null\n\n const leftColumn = (\n <div className=\"space-y-6\">\n <InjectionSpot spotId={extensionPoints.hosts.headerBefore.spotId} context={injectionContext} />\n <div data-component-handle={HEADER_HANDLE}>\n <HeaderComponent payload={payload} preview={isPreview} themeTokens={themeTokens} />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.headerAfter.spotId} context={injectionContext} />\n\n {(payload.description || publicCustomFields.length > 0) ? (\n <>\n <div data-component-handle={DESCRIPTION_HANDLE}>\n <DescriptionComponent\n payload={payload}\n publicCustomFields={publicCustomFields}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.descriptionAfter.spotId} context={injectionContext} />\n </>\n ) : null}\n\n <InjectionSpot spotId={extensionPoints.hosts.customerFieldsBefore.spotId} context={injectionContext} />\n {shouldCollectCustomerDetails ? (\n <div data-component-handle={CUSTOMER_FORM_HANDLE}>\n <CustomerFormComponent\n payload={payload}\n customerData={customerData}\n fieldErrors={fieldErrors}\n inputsLocked={inputsLocked}\n onFieldChange={updateCustomerField}\n translateValidationMessage={translateValidationMessage}\n themeTokens={themeTokens}\n />\n </div>\n ) : null}\n <InjectionSpot spotId={extensionPoints.hosts.customerFieldsAfter.spotId} context={injectionContext} />\n </div>\n )\n\n const paymentFlow = (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.pricingBefore.spotId} context={injectionContext} />\n <div data-component-handle={PRICING_HANDLE}>\n <PricingComponent\n payload={payload}\n amount={amount}\n selectedPriceItemId={selectedPriceItemId}\n fieldErrors={fieldErrors}\n inputsLocked={inputsLocked}\n formatAmount={formatAmount}\n onAmountChange={(value) => {\n const nextAmount = parseNumericInput(value)\n const nextData = setSubmitDataFieldValue(submitDataRef.current, 'amount', nextAmount)\n applySubmitDataToState(nextData)\n clearFieldError('amount')\n setSubmissionError(null)\n dispatchFieldChange('amount', nextAmount, nextData)\n }}\n onPriceItemSelect={(item) => {\n const nextData = {\n ...submitDataRef.current,\n amount: item.amount,\n selectedPriceItemId: item.id,\n }\n applySubmitDataToState(nextData)\n clearFieldError('selectedPriceItemId')\n setSubmissionError(null)\n dispatchFieldChange('selectedPriceItemId', item.id, nextData)\n }}\n translateValidationMessage={translateValidationMessage}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.pricingAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.summaryBefore.spotId} context={injectionContext} />\n <div data-component-handle={SUMMARY_HANDLE}>\n <SummaryComponent\n payload={payload}\n selectedAmount={effectiveAmount}\n currencyCode={effectiveCurrencyCode}\n formatAmount={formatAmount}\n preview={isPreview}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.summaryAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.legalConsentBefore.spotId} context={injectionContext} />\n <div data-component-handle={LEGAL_CONSENT_HANDLE}>\n <LegalConsentComponent\n payload={payload}\n acceptedLegalConsents={acceptedLegalConsents}\n fieldErrors={fieldErrors}\n inputsLocked={inputsLocked}\n onConsentChange={updateConsent}\n translateValidationMessage={translateValidationMessage}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.legalConsentAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.submitBefore.spotId} context={injectionContext} />\n <div data-component-handle={GATEWAY_FORM_HANDLE}>\n <PaymentFormComponent\n payload={payload}\n slug={slug}\n preview={isPreview}\n isSubmitting={isSubmitting}\n submissionError={submissionError}\n paymentSession={paymentSession}\n activeTransactionId={activeTransactionId}\n embeddedRenderer={embeddedRenderer}\n onSubmit={submitPayment}\n onReset={() => {\n setPaymentSession(null)\n setActiveTransactionId(null)\n setSubmissionError(null)\n }}\n onComplete={() => {\n if (!activeTransactionId) return\n router.push(`/pay/${encodeURIComponent(slug)}/success/${encodeURIComponent(activeTransactionId)}`)\n }}\n onError={(message) => {\n setSubmissionError(message)\n }}\n injectionContext={injectionContext}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.submitAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.helpBefore.spotId} context={injectionContext} />\n <div data-component-handle={HELP_HANDLE}>\n <HelpComponent payload={payload} preview={isPreview} themeTokens={themeTokens} />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.helpAfter.spotId} context={injectionContext} />\n </>\n )\n\n const rightColumn = (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.paymentBefore.spotId} context={injectionContext} />\n <div data-component-handle={PAYMENT_HANDLE}>\n <PaymentSectionComponent payload={payload} preview={isPreview} themeTokens={themeTokens}>\n {paymentFlow}\n </PaymentSectionComponent>\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.paymentAfter.spotId} context={injectionContext} />\n </>\n )\n\n const footer = (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.footerBefore.spotId} context={injectionContext} />\n <div data-component-handle={FOOTER_HANDLE}>\n <FooterComponent payload={payload} themeTokens={themeTokens} />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.footerAfter.spotId} context={injectionContext} />\n </>\n )\n\n return (\n <div data-component-handle={PAGE_HANDLE}>\n <SurfaceComponent\n previewBanner={previewBanner}\n leftColumn={leftColumn}\n rightColumn={rightColumn}\n footer={footer}\n themeTokens={themeTokens}\n />\n </div>\n )\n}\n\nexport default PayPage\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/checkout/modules/checkout/extension-points'\nimport Link from 'next/link'\nimport { useParams, useRouter, useSearchParams } from 'next/navigation'\nimport { useLocale, useT } from '@open-mercato/shared/lib/i18n/context'\nimport { locales, type Locale } from '@open-mercato/shared/lib/i18n/config'\nimport type { CustomFieldDisplayEntry } from '@open-mercato/shared/lib/crud/custom-fields'\nimport { resolveLocaleFromCandidates } from '@open-mercato/shared/lib/i18n/locale'\nimport { getPaymentGatewayRenderer } from '@open-mercato/shared/modules/payment_gateways/client'\nimport type { PaymentGatewayRendererProps } from '@open-mercato/shared/modules/payment_gateways/client'\nimport type { PaymentGatewayClientSession } from '@open-mercato/shared/modules/payment_gateways/types'\nimport { InjectionSpot, useInjectionSpotEvents, useInjectionWidgets } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { useRegisteredComponent } from '@open-mercato/ui/backend/injection/useRegisteredComponent'\nimport { MarkdownContent } from '@open-mercato/ui/backend/markdown/MarkdownContent'\nimport { apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { mapCrudServerErrorToFormErrors } from '@open-mercato/ui/backend/utils/serverErrors'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Card, CardContent } from '@open-mercato/ui/primitives/card'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { PasswordInput } from '@open-mercato/ui/primitives/password-input'\nimport { Radio, RadioGroup } from '@open-mercato/ui/primitives/radio'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport {\n getCheckoutCustomerFieldSemanticType,\n validateCheckoutCustomerData,\n} from '../lib/customerDataValidation'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('checkout').child({ component: 'PayPage' })\n\ntype CustomerFieldOption = {\n value: string\n label: string\n}\n\ntype CustomerFieldDefinition = {\n key: string\n label: string\n kind: string\n required: boolean\n placeholder?: string | null\n options?: CustomerFieldOption[]\n}\n\ntype PriceListItem = {\n id: string\n description: string\n amount: number\n currencyCode: string\n}\n\ntype CheckoutThemeMode = 'light' | 'dark' | 'auto'\n\nexport type PayLinkPayload = {\n id: string\n slug?: string | null\n name: string\n title?: string | null\n subtitle?: string | null\n description?: string | null\n logoUrl?: string | null\n logoPreviewUrl?: string | null\n primaryColor?: string | null\n secondaryColor?: string | null\n backgroundColor?: string | null\n themeMode?: CheckoutThemeMode | null\n status?: 'draft' | 'active' | 'inactive'\n pricingMode: 'fixed' | 'custom_amount' | 'price_list'\n fixedPriceAmount?: number | null\n fixedPriceCurrencyCode?: string | null\n fixedPriceOriginalAmount?: number | null\n customAmountMin?: number | null\n customAmountMax?: number | null\n customAmountCurrencyCode?: string | null\n priceListItems?: PriceListItem[]\n collectCustomerDetails?: boolean\n customerFieldsSchema?: CustomerFieldDefinition[]\n publicCustomFields?: CustomFieldDisplayEntry[]\n legalDocuments?: {\n terms?: { title?: string; markdown?: string; required?: boolean }\n privacyPolicy?: { title?: string; markdown?: string; required?: boolean }\n }\n requiresPassword?: boolean\n available?: boolean\n preview?: boolean\n gatewayProviderKey?: string | null\n}\n\ntype SubmitResponse = {\n transactionId: string\n redirectUrl?: string | null\n paymentSession?: (PaymentGatewayClientSession & {\n providerKey: string | null\n gatewayTransactionId: string\n }) | null\n}\n\ntype PayPageProps = {\n mode?: 'link' | 'template'\n sourceId?: string\n initialPayload?: PayLinkPayload | null\n initialLoadError?: string | null\n}\n\ntype FieldErrors = Record<string, string>\n\ntype PayPageSubmitData = {\n customerData: Record<string, unknown>\n acceptedLegalConsents: Record<string, boolean>\n amount: number | null\n selectedPriceItemId: string | null\n}\n\nexport type PayPageThemeTokens = {\n mode: 'light' | 'dark'\n accent: string\n accentSecondary: string\n accentContrast: string\n text: string\n mutedText: string\n pageBackground: string\n shellBackground: string\n surface: string\n surfaceMuted: string\n surfaceStrong: string\n border: string\n borderStrong: string\n shadow: string\n accentShadow: string\n heroBackground: string\n errorText: string\n errorBorder: string\n errorSurface: string\n errorSurfaceStrong: string\n errorRing: string\n}\n\ntype PayPageInjectionContext = {\n link: PayLinkPayload\n themeMode: 'light' | 'dark'\n themeTokens: PayPageThemeTokens\n preview: boolean\n selectedAmount: number | null\n currencyCode: string | null\n pricingMode: PayLinkPayload['pricingMode']\n customerSchema: CustomerFieldDefinition[]\n customerData: Record<string, unknown>\n legalDocuments: NonNullable<PayLinkPayload['legalDocuments']>\n acceptedLegalConsents: Record<string, boolean>\n transaction: { id: string } | null\n paymentView: 'idle' | 'embedded' | 'redirect'\n paymentSession: SubmitResponse['paymentSession']\n paymentProviderKey: string | null\n paymentRendererKey: string | null\n fieldErrors: FieldErrors\n submissionError: string | null\n inputsLocked: boolean\n isSubmitting: boolean\n canSubmit: boolean\n operation: 'create'\n}\n\nexport type PayPageSurfaceProps = {\n previewBanner: React.ReactNode\n leftColumn: React.ReactNode\n rightColumn: React.ReactNode\n footer: React.ReactNode\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageHeaderProps = {\n payload: PayLinkPayload\n preview: boolean\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageDescriptionProps = {\n payload: PayLinkPayload\n publicCustomFields: CustomFieldDisplayEntry[]\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageCustomerFormProps = {\n payload: PayLinkPayload\n customerData: Record<string, unknown>\n fieldErrors: FieldErrors\n inputsLocked: boolean\n onFieldChange: (fieldKey: string, value: unknown) => void\n translateValidationMessage: (message: string | null | undefined, fieldPath?: string) => string\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPagePricingProps = {\n payload: PayLinkPayload\n amount: number | null\n selectedPriceItemId: string | null\n fieldErrors: FieldErrors\n inputsLocked: boolean\n formatAmount: (value: number | null | undefined, currencyCode?: string | null) => string\n onAmountChange: (value: string) => void\n onPriceItemSelect: (item: PriceListItem) => void\n translateValidationMessage: (message: string | null | undefined, fieldPath?: string) => string\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageSummaryProps = {\n payload: PayLinkPayload\n selectedAmount: number | null\n currencyCode: string | null\n formatAmount: (value: number | null | undefined, currencyCode?: string | null) => string\n preview: boolean\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageLegalConsentProps = {\n payload: PayLinkPayload\n acceptedLegalConsents: Record<string, boolean>\n fieldErrors: FieldErrors\n inputsLocked: boolean\n onConsentChange: (fieldKey: 'terms' | 'privacyPolicy', value: boolean) => void\n translateValidationMessage: (message: string | null | undefined, fieldPath?: string) => string\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPagePaymentFormProps = {\n payload: PayLinkPayload\n slug: string\n preview: boolean\n isSubmitting: boolean\n submissionError: string | null\n paymentSession: SubmitResponse['paymentSession']\n activeTransactionId: string | null\n embeddedRenderer: React.ComponentType<PaymentGatewayRendererProps> | null | undefined\n onSubmit: () => Promise<void>\n onReset: () => void\n onComplete: () => void\n onError: (message: string) => void\n injectionContext: PayPageInjectionContext\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPagePaymentSectionProps = {\n payload: PayLinkPayload\n preview: boolean\n themeTokens: PayPageThemeTokens\n children: React.ReactNode\n}\n\nexport type PayPageHelpProps = {\n payload: PayLinkPayload\n preview: boolean\n themeTokens: PayPageThemeTokens\n}\n\nexport type PayPageFooterProps = {\n payload: PayLinkPayload\n themeTokens: PayPageThemeTokens\n}\n\nconst PAGE_HANDLE = extensionPoints.hosts.payPage.componentId\nconst HEADER_HANDLE = extensionPoints.hosts.header.componentId\nconst DESCRIPTION_HANDLE = extensionPoints.hosts.description.componentId\nconst SUMMARY_HANDLE = extensionPoints.hosts.summary.componentId\nconst PRICING_HANDLE = extensionPoints.hosts.pricing.componentId\nconst PAYMENT_HANDLE = extensionPoints.hosts.payment.componentId\nconst CUSTOMER_FORM_HANDLE = extensionPoints.hosts.customerForm.componentId\nconst LEGAL_CONSENT_HANDLE = extensionPoints.hosts.legalConsent.componentId\nconst GATEWAY_FORM_HANDLE = extensionPoints.hosts.gatewayForm.componentId\nconst HELP_HANDLE = extensionPoints.hosts.help.componentId\nconst FOOTER_HANDLE = extensionPoints.hosts.footer.componentId\n\n// Checkout supports merchant branding defaults; keep those theme fallbacks isolated from general UI state colors.\nconst CHECKOUT_THEME_FALLBACKS = {\n accent: '#1E3A8A',\n accentSecondary: '#F59E0B',\n darkBackground: '#0B1020',\n lightBackground: '#F5EFE6',\n darkText: '#F8FAFC',\n lightText: '#111827',\n darkMutedText: '#CBD5E1',\n lightMutedText: '#6B7280',\n darkSurface: '#111827',\n lightSurface: '#FFFFFF',\n darkShell: '#020617',\n lightShell: '#FFFDF8',\n darkBorder: '#E2E8F0',\n inputBackground: 'rgba(255, 255, 255, 0.96)',\n inputText: '#0F172A',\n} as const\n\nconst PAY_PAGE_EMPTY_SELECT_VALUE = '__om_checkout_empty__'\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max)\n}\n\nfunction readErrorMessage(error: unknown, fallback: string) {\n return error instanceof Error && error.message ? error.message : fallback\n}\n\nfunction readTranslatedErrorMessage(\n error: unknown,\n translate: (key: string, fallback: string) => string,\n fallback: string,\n) {\n return translate(readErrorMessage(error, fallback), fallback)\n}\n\nfunction parseNumericInput(value: string): number | null {\n const trimmed = value.trim()\n if (!trimmed) return null\n const parsed = Number(trimmed)\n return Number.isFinite(parsed) ? parsed : null\n}\n\nfunction setSubmitDataFieldValue(\n data: PayPageSubmitData,\n fieldPath: string,\n value: unknown,\n): PayPageSubmitData {\n if (fieldPath.startsWith('customerData.')) {\n const fieldKey = fieldPath.slice('customerData.'.length)\n return {\n ...data,\n customerData: {\n ...data.customerData,\n [fieldKey]: value,\n },\n }\n }\n if (fieldPath.startsWith('acceptedLegalConsents.')) {\n const fieldKey = fieldPath.slice('acceptedLegalConsents.'.length)\n if (fieldKey === 'terms' || fieldKey === 'privacyPolicy') {\n return {\n ...data,\n acceptedLegalConsents: {\n ...data.acceptedLegalConsents,\n [fieldKey]: value === true,\n },\n }\n }\n return data\n }\n if (fieldPath === 'amount') {\n return {\n ...data,\n amount: typeof value === 'number' && Number.isFinite(value) ? value : null,\n }\n }\n if (fieldPath === 'selectedPriceItemId') {\n return {\n ...data,\n selectedPriceItemId: typeof value === 'string' && value.trim().length > 0 ? value : null,\n }\n }\n return data\n}\n\nfunction applySubmitDataSideEffects(\n data: PayPageSubmitData,\n sideEffects: Record<string, unknown> | undefined,\n): PayPageSubmitData {\n if (!sideEffects) return data\n return Object.entries(sideEffects).reduce(\n (current, [fieldPath, value]) => setSubmitDataFieldValue(current, fieldPath, value),\n data,\n )\n}\n\nfunction normalizeHexColor(value: string | null | undefined, fallback: string) {\n const normalized = typeof value === 'string' ? value.trim().replace(/^#/, '') : ''\n if (/^[0-9a-fA-F]{3}$/.test(normalized)) {\n return `#${normalized.split('').map((part) => `${part}${part}`).join('')}`.toUpperCase()\n }\n if (/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return `#${normalized}`.toUpperCase()\n }\n return fallback.toUpperCase()\n}\n\nfunction hexToRgb(color: string) {\n const normalized = normalizeHexColor(color, '#000000').replace('#', '')\n return {\n r: Number.parseInt(normalized.slice(0, 2), 16),\n g: Number.parseInt(normalized.slice(2, 4), 16),\n b: Number.parseInt(normalized.slice(4, 6), 16),\n }\n}\n\nfunction rgbToHex(rgb: { r: number; g: number; b: number }) {\n const encode = (value: number) => clamp(Math.round(value), 0, 255).toString(16).padStart(2, '0')\n return `#${encode(rgb.r)}${encode(rgb.g)}${encode(rgb.b)}`.toUpperCase()\n}\n\nfunction mixHexColors(start: string, end: string, weight: number) {\n const from = hexToRgb(start)\n const to = hexToRgb(end)\n const amount = clamp(weight, 0, 1)\n return rgbToHex({\n r: from.r + (to.r - from.r) * amount,\n g: from.g + (to.g - from.g) * amount,\n b: from.b + (to.b - from.b) * amount,\n })\n}\n\nfunction withAlpha(color: string, alpha: number) {\n const { r, g, b } = hexToRgb(color)\n return `rgba(${r}, ${g}, ${b}, ${clamp(alpha, 0, 1)})`\n}\n\nfunction getContrastText(color: string) {\n const { r, g, b } = hexToRgb(color)\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n return luminance > 0.62 ? CHECKOUT_THEME_FALLBACKS.inputText : CHECKOUT_THEME_FALLBACKS.darkText\n}\n\nfunction resolveThemeTokens(payload: PayLinkPayload | null, prefersDark: boolean): PayPageThemeTokens {\n const accent = normalizeHexColor(payload?.primaryColor, CHECKOUT_THEME_FALLBACKS.accent)\n const accentSecondary = normalizeHexColor(payload?.secondaryColor, CHECKOUT_THEME_FALLBACKS.accentSecondary)\n const requestedMode = payload?.themeMode ?? 'auto'\n const mode = requestedMode === 'dark' || (requestedMode === 'auto' && prefersDark) ? 'dark' : 'light'\n const background = normalizeHexColor(\n payload?.backgroundColor,\n mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkBackground : CHECKOUT_THEME_FALLBACKS.lightBackground,\n )\n const text = mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkText : CHECKOUT_THEME_FALLBACKS.lightText\n const mutedText = mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkMutedText : CHECKOUT_THEME_FALLBACKS.lightMutedText\n const surface = mixHexColors(\n background,\n mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkSurface : CHECKOUT_THEME_FALLBACKS.lightSurface,\n mode === 'dark' ? 0.62 : 0.76,\n )\n const surfaceMuted = mixHexColors(accentSecondary, background, mode === 'dark' ? 0.18 : 0.88)\n const surfaceStrong = mixHexColors(accent, background, mode === 'dark' ? 0.22 : 0.9)\n const border = withAlpha(mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkBorder : accent, mode === 'dark' ? 0.16 : 0.14)\n const borderStrong = withAlpha(accent, mode === 'dark' ? 0.34 : 0.22)\n const shellBackground = mixHexColors(\n background,\n mode === 'dark' ? CHECKOUT_THEME_FALLBACKS.darkShell : CHECKOUT_THEME_FALLBACKS.lightShell,\n mode === 'dark' ? 0.82 : 0.64,\n )\n const heroStart = withAlpha(accent, mode === 'dark' ? 0.26 : 0.16)\n const heroEnd = withAlpha(accentSecondary, mode === 'dark' ? 0.22 : 0.2)\n const errorBase = mode === 'dark' ? '#F87171' : '#DC2626'\n\n return {\n mode,\n accent,\n accentSecondary,\n accentContrast: getContrastText(accent),\n text,\n mutedText,\n pageBackground: `\n radial-gradient(circle at top left, ${withAlpha(accent, mode === 'dark' ? 0.2 : 0.12)} 0%, transparent 38%),\n radial-gradient(circle at bottom right, ${withAlpha(accentSecondary, mode === 'dark' ? 0.24 : 0.15)} 0%, transparent 34%),\n linear-gradient(140deg, ${background} 0%, ${shellBackground} 100%)\n `,\n shellBackground,\n surface,\n surfaceMuted,\n surfaceStrong,\n border,\n borderStrong,\n shadow: mode === 'dark'\n ? `0 32px 80px ${withAlpha(CHECKOUT_THEME_FALLBACKS.darkShell, 0.55)}`\n : `0 28px 72px ${withAlpha(accent, 0.12)}`,\n accentShadow: `0 22px 48px ${withAlpha(accent, mode === 'dark' ? 0.3 : 0.22)}`,\n heroBackground: `linear-gradient(145deg, ${heroStart} 0%, ${heroEnd} 100%)`,\n errorText: mode === 'dark' ? '#FCA5A5' : '#B91C1C',\n errorBorder: errorBase,\n errorSurface: withAlpha(errorBase, mode === 'dark' ? 0.14 : 0.08),\n errorSurfaceStrong: withAlpha(errorBase, mode === 'dark' ? 0.2 : 0.12),\n errorRing: withAlpha(errorBase, mode === 'dark' ? 0.28 : 0.18),\n }\n}\n\nfunction buildReadableInputStyle(themeTokens: PayPageThemeTokens, hasError: boolean, disabled = false): React.CSSProperties {\n if (disabled) {\n return {\n background: 'var(--bg-disabled)',\n color: 'var(--text-disabled)',\n borderColor: 'var(--border-disabled)',\n }\n }\n\n return {\n background: CHECKOUT_THEME_FALLBACKS.inputBackground,\n color: CHECKOUT_THEME_FALLBACKS.inputText,\n borderColor: hasError ? themeTokens.errorBorder : withAlpha(CHECKOUT_THEME_FALLBACKS.inputText, 0.12),\n boxShadow: hasError ? `0 0 0 3px ${themeTokens.errorRing}` : undefined,\n }\n}\n\nfunction buildValidationMessageStyle(themeTokens: PayPageThemeTokens): React.CSSProperties {\n return {\n color: themeTokens.errorText,\n fontWeight: 500,\n }\n}\n\nfunction formatPublicFieldValue(value: unknown, booleanLabels?: { trueLabel: string; falseLabel: string }): string {\n if (Array.isArray(value)) return value.map((entry) => String(entry)).join(', ')\n if (typeof value === 'boolean') {\n if (booleanLabels) return value ? booleanLabels.trueLabel : booleanLabels.falseLabel\n return value ? 'Yes' : 'No'\n }\n if (value == null) return ''\n return String(value)\n}\n\nfunction usePrefersDarkMode() {\n const [prefersDark, setPrefersDark] = React.useState(false)\n\n React.useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const updatePreference = () => setPrefersDark(mediaQuery.matches)\n updatePreference()\n if (typeof mediaQuery.addEventListener === 'function') {\n mediaQuery.addEventListener('change', updatePreference)\n return () => mediaQuery.removeEventListener('change', updatePreference)\n }\n mediaQuery.addListener(updatePreference)\n return () => mediaQuery.removeListener(updatePreference)\n }, [])\n\n return prefersDark\n}\n\nfunction hasStoredLocalePreference() {\n if (typeof document === 'undefined') return false\n\n return document.cookie\n .split(';')\n .some((part) => part.trim().startsWith('locale='))\n}\n\nasync function persistLocalePreference(locale: Locale) {\n const response = await fetch('/api/auth/locale', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ locale }),\n })\n\n return response.ok\n}\n\nfunction buildPanelStyle(themeTokens: PayPageThemeTokens, variant: 'default' | 'muted' | 'hero' | 'accent' = 'default'): React.CSSProperties {\n if (variant === 'hero') {\n return {\n background: themeTokens.heroBackground,\n borderColor: themeTokens.borderStrong,\n boxShadow: themeTokens.shadow,\n color: themeTokens.text,\n }\n }\n if (variant === 'accent') {\n return {\n background: `linear-gradient(145deg, ${themeTokens.accent} 0%, ${mixHexColors(themeTokens.accent, themeTokens.accentSecondary, 0.4)} 100%)`,\n borderColor: withAlpha(themeTokens.accentContrast, 0.12),\n boxShadow: themeTokens.accentShadow,\n color: themeTokens.accentContrast,\n }\n }\n return {\n background: variant === 'muted' ? themeTokens.surfaceMuted : themeTokens.surface,\n borderColor: variant === 'muted' ? themeTokens.borderStrong : themeTokens.border,\n boxShadow: themeTokens.shadow,\n color: themeTokens.text,\n }\n}\n\nfunction buildButtonStyle(themeTokens: PayPageThemeTokens, variant: 'solid' | 'outline' = 'solid'): React.CSSProperties {\n if (variant === 'outline') {\n return {\n borderColor: themeTokens.borderStrong,\n color: themeTokens.text,\n background: withAlpha(themeTokens.surface, 0.72),\n }\n }\n return {\n background: themeTokens.accent,\n color: themeTokens.accentContrast,\n boxShadow: themeTokens.accentShadow,\n }\n}\n\nconst READABLE_INPUT_CLASSNAME = 'border bg-white/95 text-slate-900 placeholder:text-slate-400 disabled:cursor-not-allowed disabled:bg-bg-disabled disabled:border-border-disabled disabled:text-text-disabled'\n\nexport function PayPageSurface({\n previewBanner,\n leftColumn,\n rightColumn,\n footer,\n themeTokens,\n}: PayPageSurfaceProps) {\n return (\n <div\n className=\"relative min-h-screen overflow-hidden px-4 py-6 sm:px-6 lg:px-8 lg:py-10\"\n style={{ background: themeTokens.pageBackground, color: themeTokens.text }}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute left-[-10%] top-[-5%] h-80 w-80 rounded-full blur-3xl\"\n style={{ background: withAlpha(themeTokens.accent, 0.16) }}\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute bottom-[-8%] right-[-4%] h-96 w-96 rounded-full blur-3xl\"\n style={{ background: withAlpha(themeTokens.accentSecondary, 0.16) }}\n />\n\n <div className=\"relative mx-auto max-w-7xl space-y-6\">\n {previewBanner}\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,1.12fr)_minmax(360px,430px)] lg:items-start\">\n <div className=\"space-y-6\">{leftColumn}</div>\n <div className=\"space-y-6 lg:sticky lg:top-6\">{rightColumn}</div>\n </div>\n {footer}\n </div>\n </div>\n )\n}\n\nexport function PayPageHeader({ payload, preview, themeTokens }: PayPageHeaderProps) {\n const t = useT()\n const resolvedLogoUrl = payload.logoPreviewUrl ?? payload.logoUrl ?? null\n\n return (\n <section\n className=\"relative overflow-hidden rounded-xl border p-6 sm:p-8\"\n style={buildPanelStyle(themeTokens, 'hero')}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute right-[-4rem] top-[-3rem] h-40 w-40 rounded-full blur-3xl\"\n style={{ background: withAlpha(themeTokens.accentSecondary, 0.22) }}\n />\n <div className=\"relative flex flex-col gap-6\">\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span\n className=\"inline-flex rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{\n background: withAlpha(themeTokens.accent, 0.14),\n color: themeTokens.text,\n }}\n >\n {t('checkout.payPage.badges.secure', 'Secure checkout')}\n </span>\n {preview ? (\n <span\n className=\"inline-flex rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{\n background: withAlpha(themeTokens.accentSecondary, 0.16),\n color: themeTokens.text,\n }}\n >\n {t('checkout.payPage.badges.preview', 'Preview')}\n </span>\n ) : null}\n </div>\n\n {resolvedLogoUrl ? (\n <img\n src={resolvedLogoUrl}\n alt={payload.title ?? payload.name}\n className=\"h-14 w-auto max-w-[180px] object-contain\"\n />\n ) : null}\n\n <div className=\"space-y-3\">\n <h1 className=\"max-w-3xl text-3xl font-semibold tracking-tight sm:text-5xl\">\n {payload.title ?? payload.name}\n </h1>\n {payload.subtitle ? (\n <p className=\"max-w-2xl text-base leading-7\" style={{ color: themeTokens.mutedText }}>\n {payload.subtitle}\n </p>\n ) : null}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\nexport function PayPageDescription({ payload, publicCustomFields, themeTokens }: PayPageDescriptionProps) {\n const t = useT()\n const hasDescription = Boolean(payload.description)\n const visibleFields = publicCustomFields.filter((field) => {\n const formattedValue = formatPublicFieldValue(field.value, {\n trueLabel: t('checkout.payPage.fields.booleanTrue', 'Yes'),\n falseLabel: t('checkout.payPage.fields.booleanFalse', 'No'),\n })\n return formattedValue.trim().length > 0\n })\n\n if (!hasDescription && visibleFields.length === 0) return null\n\n return (\n <section\n className=\"space-y-5 rounded-xl border p-6 sm:p-7\"\n style={buildPanelStyle(themeTokens, 'default')}\n >\n {hasDescription ? (\n <div className=\"space-y-3\">\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.description.kicker', 'Offer overview')}\n </div>\n <div className=\"prose prose-sm max-w-none\">\n <MarkdownContent body={payload.description ?? ''} format=\"markdown\" />\n </div>\n </div>\n ) : null}\n\n {visibleFields.length > 0 ? (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold\">{t('checkout.payPage.sections.productDetails', 'Product details')}</h2>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.productDetails', 'Additional offer details configured for this payment link.')}\n </p>\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {visibleFields.map((field) => {\n const formattedValue = formatPublicFieldValue(field.value, {\n trueLabel: t('checkout.payPage.fields.booleanTrue', 'Yes'),\n falseLabel: t('checkout.payPage.fields.booleanFalse', 'No'),\n })\n const isMultiline = field.kind === 'multiline' || formattedValue.includes('\\n')\n\n return (\n <div\n key={field.key}\n className={isMultiline ? 'rounded-xl border p-4 sm:col-span-2' : 'rounded-xl border p-4'}\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: themeTokens.border,\n }}\n >\n <div className=\"text-sm font-medium\">{field.label ?? field.key}</div>\n <div\n className={isMultiline ? 'mt-2 whitespace-pre-wrap text-sm' : 'mt-2 text-sm'}\n style={{ color: themeTokens.mutedText }}\n >\n {formattedValue}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n ) : null}\n </section>\n )\n}\n\nexport function PayPageCustomerForm({\n payload,\n customerData,\n fieldErrors,\n inputsLocked,\n onFieldChange,\n translateValidationMessage,\n themeTokens,\n}: PayPageCustomerFormProps) {\n const t = useT()\n\n if ((payload.customerFieldsSchema?.length ?? 0) === 0 || payload.collectCustomerDetails === false) {\n return null\n }\n\n return (\n <section\n className=\"space-y-5 rounded-xl border p-6 sm:p-7\"\n style={buildPanelStyle(themeTokens, 'default')}\n >\n <div className=\"space-y-1\">\n <h2 className=\"text-xl font-semibold\">{t('checkout.payPage.sections.customerDetails', 'Customer details')}</h2>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.customerDetails', 'Add the buyer details once, then continue to payment.')}\n </p>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {(payload.customerFieldsSchema ?? []).map((field) => {\n const fieldPath = `customerData.${field.key}`\n const fieldError = fieldErrors[fieldPath]\n const value = customerData[field.key]\n const containerClass = field.kind === 'multiline' ? 'space-y-2 sm:col-span-2' : 'space-y-2'\n const semanticType = getCheckoutCustomerFieldSemanticType(field)\n const fieldId = `checkout-customer-${field.key}`\n const fieldErrorId = `${fieldId}-error`\n\n return (\n <div key={field.key} className={containerClass}>\n {field.kind === 'boolean' ? (\n <label\n className=\"flex items-start gap-3 rounded-xl border px-4 py-3 text-sm\"\n style={{\n background: fieldError\n ? themeTokens.errorSurface\n : withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: fieldError ? themeTokens.errorBorder : themeTokens.border,\n boxShadow: fieldError ? `0 0 0 2px ${themeTokens.errorRing}` : undefined,\n }}\n >\n <Checkbox\n checked={value === true}\n disabled={inputsLocked}\n aria-required={field.required ? true : undefined}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n onCheckedChange={(checked) => onFieldChange(field.key, checked === true)}\n />\n <span className=\"space-y-1\">\n <span className=\"font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </span>\n {field.placeholder ? (\n <span className=\"block\" style={{ color: themeTokens.mutedText }}>\n {field.placeholder}\n </span>\n ) : null}\n </span>\n </label>\n ) : (\n <>\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {field.label}\n {field.required ? ' *' : ''}\n </label>\n {field.kind === 'multiline' ? (\n <Textarea\n id={fieldId}\n className={READABLE_INPUT_CLASSNAME}\n value={typeof value === 'string' ? value : ''}\n disabled={inputsLocked}\n onChange={(event) => onFieldChange(field.key, event.target.value)}\n placeholder={field.placeholder ?? undefined}\n aria-required={field.required ? true : undefined}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldError), inputsLocked)}\n />\n ) : field.kind === 'select' || field.kind === 'radio' ? (\n <Select\n value={typeof value === 'string' && value.length > 0 ? value : PAY_PAGE_EMPTY_SELECT_VALUE}\n disabled={inputsLocked}\n onValueChange={(nextValue) => {\n onFieldChange(field.key, nextValue === PAY_PAGE_EMPTY_SELECT_VALUE ? '' : nextValue)\n }}\n >\n <SelectTrigger\n id={fieldId}\n className={`rounded-xl ${READABLE_INPUT_CLASSNAME}`}\n aria-required={field.required ? true : undefined}\n aria-invalid={Boolean(fieldError)}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldError), inputsLocked)}\n >\n <SelectValue placeholder={t('checkout.payPage.fields.selectPlaceholder', 'Select...')} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={PAY_PAGE_EMPTY_SELECT_VALUE}>\n {t('checkout.payPage.fields.selectPlaceholder', 'Select...')}\n </SelectItem>\n {(field.options ?? []).map((option) => (\n <SelectItem key={option.value} value={option.value}>{option.label}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Input\n id={fieldId}\n className={READABLE_INPUT_CLASSNAME}\n type={semanticType === 'email' ? 'email' : semanticType === 'phone' ? 'tel' : 'text'}\n value={typeof value === 'string' ? value : ''}\n disabled={inputsLocked}\n onChange={(event) => onFieldChange(field.key, event.target.value)}\n placeholder={field.placeholder ?? undefined}\n autoComplete={semanticType === 'email' ? 'email' : semanticType === 'phone' ? 'tel' : undefined}\n aria-required={field.required ? true : undefined}\n aria-invalid={fieldError ? true : undefined}\n aria-describedby={fieldError ? fieldErrorId : undefined}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldError), inputsLocked)}\n />\n )}\n </>\n )}\n {fieldError ? (\n <p id={fieldErrorId} className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldError, fieldPath)}\n </p>\n ) : null}\n </div>\n )\n })}\n </div>\n </section>\n )\n}\n\nexport function PayPagePricing({\n payload,\n amount,\n selectedPriceItemId,\n fieldErrors,\n inputsLocked,\n formatAmount,\n onAmountChange,\n onPriceItemSelect,\n translateValidationMessage,\n themeTokens,\n}: PayPagePricingProps) {\n const t = useT()\n\n return (\n <section className=\"space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.pricing.kicker', 'Payment setup')}\n </div>\n <h2 className=\"text-lg font-semibold\">{t('checkout.payPage.pricing.title', 'Choose how you want to pay')}</h2>\n </div>\n\n {payload.pricingMode === 'fixed' ? (\n <div className=\"rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'default')}>\n {typeof payload.fixedPriceOriginalAmount === 'number' ? (\n <div className=\"text-sm line-through\" style={{ color: themeTokens.mutedText }}>\n {formatAmount(payload.fixedPriceOriginalAmount, payload.fixedPriceCurrencyCode)}\n </div>\n ) : null}\n <div className=\"mt-1 text-4xl font-semibold\">\n {formatAmount(payload.fixedPriceAmount, payload.fixedPriceCurrencyCode)}\n </div>\n </div>\n ) : null}\n\n {payload.pricingMode === 'custom_amount' ? (\n <div className=\"space-y-2 rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'default')}>\n <label className=\"text-sm font-medium\">{t('checkout.payPage.fields.customAmount', 'Amount')}</label>\n <Input\n className={READABLE_INPUT_CLASSNAME}\n type=\"number\"\n value={amount ?? ''}\n disabled={inputsLocked}\n onChange={(event) => onAmountChange(event.target.value)}\n placeholder={[\n payload.customAmountMin != null ? formatAmount(payload.customAmountMin, payload.customAmountCurrencyCode) : null,\n payload.customAmountMax != null ? formatAmount(payload.customAmountMax, payload.customAmountCurrencyCode) : null,\n ].filter(Boolean).join(' - ')}\n style={buildReadableInputStyle(themeTokens, Boolean(fieldErrors.amount), inputsLocked)}\n />\n {fieldErrors.amount ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors.amount, 'amount')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {payload.pricingMode === 'price_list' ? (\n <>\n <RadioGroup\n className=\"space-y-3\"\n value={selectedPriceItemId ?? ''}\n disabled={inputsLocked}\n onValueChange={(itemId) => {\n const item = (payload.priceListItems ?? []).find((candidate) => candidate.id === itemId)\n if (item) onPriceItemSelect(item)\n }}\n >\n {(payload.priceListItems ?? []).map((item) => (\n <label\n key={item.id}\n className=\"flex cursor-pointer items-center justify-between gap-3 rounded-xl border px-4 py-4 text-sm transition\"\n style={{\n background: selectedPriceItemId === item.id\n ? withAlpha(themeTokens.accent, 0.08)\n : withAlpha(themeTokens.shellBackground, 0.66),\n borderColor: selectedPriceItemId === item.id\n ? themeTokens.borderStrong\n : themeTokens.border,\n }}\n >\n <span className=\"flex items-center gap-3\">\n <Radio\n value={item.id}\n disabled={inputsLocked}\n />\n <span className=\"font-medium\">{item.description}</span>\n </span>\n <span className=\"whitespace-nowrap font-semibold\">{formatAmount(item.amount, item.currencyCode)}</span>\n </label>\n ))}\n </RadioGroup>\n {fieldErrors.selectedPriceItemId ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors.selectedPriceItemId, 'selectedPriceItemId')}\n </p>\n ) : null}\n </>\n ) : null}\n </section>\n )\n}\n\nexport function PayPageSummary({\n payload,\n selectedAmount,\n currencyCode,\n formatAmount,\n preview,\n themeTokens,\n}: PayPageSummaryProps) {\n const t = useT()\n const amountLabel = selectedAmount != null && currencyCode\n ? formatAmount(selectedAmount, currencyCode)\n : t('checkout.payPage.summary.awaitingSelection', 'Select an amount')\n\n return (\n <section className=\"rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'accent')}>\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-overline font-semibold uppercase tracking-widest text-current/70\">\n {t('checkout.payPage.summary.amountDue', 'Amount due')}\n </div>\n <div className=\"mt-2 text-4xl font-semibold\">{amountLabel}</div>\n </div>\n <div\n className=\"rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{ background: withAlpha(themeTokens.accentContrast, 0.12) }}\n >\n {preview\n ? t('checkout.payPage.summary.previewState', 'Preview')\n : t('checkout.payPage.summary.liveState', 'Live')}\n </div>\n </div>\n </section>\n )\n}\n\nexport function PayPageLegalConsent({\n payload,\n acceptedLegalConsents,\n fieldErrors,\n inputsLocked,\n onConsentChange,\n translateValidationMessage,\n themeTokens,\n}: PayPageLegalConsentProps) {\n const t = useT()\n const [activeDocument, setActiveDocument] = React.useState<'terms' | 'privacyPolicy' | null>(null)\n const hasTerms = Boolean(payload.legalDocuments?.terms?.markdown)\n const hasPrivacyPolicy = Boolean(payload.legalDocuments?.privacyPolicy?.markdown)\n const activeDocumentPayload = activeDocument ? payload.legalDocuments?.[activeDocument] : null\n\n if (!hasTerms && !hasPrivacyPolicy) return null\n\n return (\n <>\n <section className=\"space-y-4 rounded-xl border p-5\" style={buildPanelStyle(themeTokens, 'default')}>\n <div className=\"space-y-1\">\n <h3 className=\"text-base font-semibold\">{t('checkout.payPage.sections.legal', 'Legal confirmations')}</h3>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.legal', 'Required confirmations must be accepted before the payment step starts.')}\n </p>\n </div>\n\n {hasTerms ? (\n <div className=\"space-y-2\">\n <div\n className=\"rounded-xl border px-4 py-3\"\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: fieldErrors['acceptedLegalConsents.terms'] ? themeTokens.errorBorder : themeTokens.border,\n }}\n >\n <label className=\"flex items-start gap-3 text-sm\">\n <Checkbox\n checked={acceptedLegalConsents.terms === true}\n disabled={inputsLocked}\n onCheckedChange={(checked) => onConsentChange('terms', checked === true)}\n />\n <span className=\"space-y-2\">\n <span className=\"block\">\n {t(\n 'checkout.payPage.legal.acceptDocument',\n 'I accept {document}.',\n {\n document: payload.legalDocuments?.terms?.title || t('checkout.payPage.legal.defaultTermsTitle', 'the terms and conditions'),\n },\n )}\n </span>\n <Button\n type=\"button\"\n variant=\"link\"\n className=\"h-auto p-0 text-sm font-medium underline\"\n style={{ color: themeTokens.text }}\n onClick={() => setActiveDocument('terms')}\n >\n {t('checkout.payPage.legal.readDocument', 'Read document')}\n </Button>\n </span>\n </label>\n </div>\n {fieldErrors['acceptedLegalConsents.terms'] ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors['acceptedLegalConsents.terms'], 'acceptedLegalConsents.terms')}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {hasPrivacyPolicy ? (\n <div className=\"space-y-2\">\n <div\n className=\"rounded-xl border px-4 py-3\"\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.72),\n borderColor: fieldErrors['acceptedLegalConsents.privacyPolicy'] ? themeTokens.errorBorder : themeTokens.border,\n }}\n >\n <label className=\"flex items-start gap-3 text-sm\">\n <Checkbox\n checked={acceptedLegalConsents.privacyPolicy === true}\n disabled={inputsLocked}\n onCheckedChange={(checked) => onConsentChange('privacyPolicy', checked === true)}\n />\n <span className=\"space-y-2\">\n <span className=\"block\">\n {t(\n 'checkout.payPage.legal.acceptDocument',\n 'I accept {document}.',\n {\n document: payload.legalDocuments?.privacyPolicy?.title || t('checkout.payPage.legal.defaultPrivacyTitle', 'the privacy policy'),\n },\n )}\n </span>\n <Button\n type=\"button\"\n variant=\"link\"\n className=\"h-auto p-0 text-sm font-medium underline\"\n style={{ color: themeTokens.text }}\n onClick={() => setActiveDocument('privacyPolicy')}\n >\n {t('checkout.payPage.legal.readDocument', 'Read document')}\n </Button>\n </span>\n </label>\n </div>\n {fieldErrors['acceptedLegalConsents.privacyPolicy'] ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {translateValidationMessage(fieldErrors['acceptedLegalConsents.privacyPolicy'], 'acceptedLegalConsents.privacyPolicy')}\n </p>\n ) : null}\n </div>\n ) : null}\n </section>\n\n <Dialog open={activeDocument !== null} onOpenChange={(open) => { if (!open) setActiveDocument(null) }}>\n <DialogContent className=\"max-h-[80vh] overflow-hidden sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {activeDocumentPayload?.title\n || (activeDocument === 'privacyPolicy'\n ? t('checkout.payPage.legal.defaultPrivacyTitle', 'the privacy policy')\n : t('checkout.payPage.legal.defaultTermsTitle', 'the terms and conditions'))}\n </DialogTitle>\n </DialogHeader>\n <div className=\"overflow-y-auto pr-2\">\n <div className=\"prose prose-sm max-w-none\">\n <MarkdownContent body={activeDocumentPayload?.markdown ?? ''} format=\"markdown\" />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n\nexport function PayPagePaymentForm({\n payload,\n slug,\n preview,\n isSubmitting,\n submissionError,\n paymentSession,\n activeTransactionId,\n embeddedRenderer,\n onSubmit,\n onReset,\n onComplete,\n onError,\n injectionContext,\n themeTokens,\n}: PayPagePaymentFormProps) {\n const t = useT()\n const embeddedPaymentSession = paymentSession?.type === 'embedded' ? paymentSession : null\n\n return (\n <section className=\"space-y-4\">\n {submissionError ? (\n <Alert status=\"error\" style=\"lighter\" size=\"default\">\n <AlertDescription>{submissionError}</AlertDescription>\n </Alert>\n ) : null}\n\n <InjectionSpot spotId={extensionPoints.hosts.gatewayWidgetBefore.spotId} context={injectionContext} />\n {embeddedPaymentSession && embeddedRenderer ? (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.gatewayRendererBefore.spotId} context={injectionContext} />\n {React.createElement(embeddedRenderer, {\n providerKey: embeddedPaymentSession.providerKey ?? '',\n transactionId: activeTransactionId ?? '',\n gatewayTransactionId: embeddedPaymentSession.gatewayTransactionId,\n session: embeddedPaymentSession,\n disabled: preview,\n onComplete,\n onError,\n })}\n <InjectionSpot spotId={extensionPoints.hosts.gatewayRendererAfter.spotId} context={injectionContext} />\n </>\n ) : (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.gatewayActionsBefore.spotId} context={injectionContext} />\n <Button\n type=\"button\"\n className=\"h-12 w-full rounded-xl text-base\"\n disabled={preview || isSubmitting}\n style={buildButtonStyle(themeTokens)}\n onClick={() => { void onSubmit() }}\n >\n <span className=\"flex items-center justify-center gap-2\">\n {isSubmitting ? <Spinner size=\"sm\" /> : null}\n {preview\n ? t('checkout.payPage.actions.previewDisabled', 'Preview only')\n : isSubmitting\n ? t('checkout.payPage.actions.processingPayment', 'Processing payment...')\n : t('checkout.payPage.actions.payNow', 'Pay now')}\n </span>\n </Button>\n <InjectionSpot spotId={extensionPoints.hosts.gatewayActionsAfter.spotId} context={injectionContext} />\n </>\n )}\n <InjectionSpot spotId={extensionPoints.hosts.gatewayWidgetAfter.spotId} context={injectionContext} />\n\n {paymentSession ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full rounded-xl\"\n style={buildButtonStyle(themeTokens, 'outline')}\n onClick={onReset}\n >\n {t('checkout.payPage.actions.editDetails', 'Edit details')}\n </Button>\n ) : null}\n\n {payload.gatewayProviderKey ? (\n <div className=\"text-center text-xs\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.payment.providerHint', 'Your payment will be handled by {provider}.', {\n provider: payload.gatewayProviderKey,\n })}\n </div>\n ) : null}\n\n <div className=\"hidden text-xs\" data-pay-link-slug={slug} />\n </section>\n )\n}\n\nexport function PayPagePaymentSection({ payload, preview, themeTokens, children }: PayPagePaymentSectionProps) {\n const t = useT()\n\n return (\n <Card\n className=\"overflow-hidden rounded-xl border backdrop-blur\"\n style={{\n ...buildPanelStyle(themeTokens, 'default'),\n background: `linear-gradient(180deg, ${withAlpha(themeTokens.surface, 0.96)} 0%, ${withAlpha(themeTokens.shellBackground, 0.94)} 100%)`,\n }}\n >\n <CardContent className=\"space-y-6 p-5 sm:p-6\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.payment.kicker', 'Payment rail')}\n </div>\n <h2 className=\"mt-1 text-xl font-semibold\">{t('checkout.payPage.sections.payment', 'Payment')}</h2>\n </div>\n <div\n className=\"rounded-full px-3 py-1 text-overline font-semibold uppercase tracking-widest\"\n style={{\n background: withAlpha(preview ? themeTokens.accentSecondary : themeTokens.accent, 0.12),\n color: themeTokens.text,\n }}\n >\n {preview\n ? t('checkout.payPage.payment.previewState', 'No charge')\n : t('checkout.payPage.payment.liveState', 'Ready')}\n </div>\n </div>\n <p className=\"text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.help.payment', 'Choose the amount, review the summary, then continue with the secure payment step.')}\n </p>\n {payload.gatewayProviderKey ? (\n <div className=\"text-sm font-medium\">{payload.gatewayProviderKey}</div>\n ) : null}\n </div>\n {children}\n </CardContent>\n </Card>\n )\n}\n\nexport function PayPageHelp({ payload, preview, themeTokens }: PayPageHelpProps) {\n const t = useT()\n\n return (\n <section\n className=\"rounded-xl border px-4 py-4 text-sm\"\n style={{\n background: withAlpha(themeTokens.shellBackground, 0.7),\n borderColor: themeTokens.border,\n color: themeTokens.mutedText,\n }}\n >\n <div className=\"font-medium\" style={{ color: themeTokens.text }}>\n {preview\n ? t('checkout.payPage.help.previewHeadline', 'This is a preview of the payment flow.')\n : t('checkout.payPage.help.liveHeadline', 'The provider widget appears in this panel after validation.')}\n </div>\n <div className=\"mt-2\">\n {payload.gatewayProviderKey\n ? t('checkout.payPage.help.providerLine', 'Provider: {provider}.', { provider: payload.gatewayProviderKey })\n : t('checkout.payPage.help.providerFallback', 'The payment provider is configured in the checkout settings.')}\n </div>\n </section>\n )\n}\n\nexport function PayPageFooter({ payload, themeTokens }: PayPageFooterProps) {\n const t = useT()\n const locale = useLocale()\n const router = useRouter()\n const selectId = React.useId()\n const [pending, startTransition] = React.useTransition()\n\n const languageLabels = React.useMemo<Record<Locale, string>>(() => ({\n en: t('common.languages.english', 'English'),\n pl: t('common.languages.polish', 'Polski'),\n es: t('common.languages.spanish', 'Espa\u00F1ol'),\n de: t('common.languages.german', 'Deutsch'),\n ko: t('common.languages.korean', '\uD55C\uAD6D\uC5B4'),\n }), [t])\n\n const setLocale = React.useCallback(async (nextLocale: Locale) => {\n if (nextLocale === locale) return\n\n try {\n const updated = await persistLocalePreference(nextLocale)\n if (!updated) return\n\n startTransition(() => router.refresh())\n } catch {\n // Keep the current locale when persistence fails.\n }\n }, [locale, router, startTransition])\n\n React.useEffect(() => {\n if (hasStoredLocalePreference() || typeof navigator === 'undefined') return\n\n const preferredLocale = resolveLocaleFromCandidates([\n ...(Array.isArray(navigator.languages) ? navigator.languages : []),\n navigator.language,\n ])\n\n if (!preferredLocale) return\n\n let active = true\n\n void (async () => {\n try {\n const updated = await persistLocalePreference(preferredLocale)\n if (!updated || !active || preferredLocale === locale) return\n\n startTransition(() => router.refresh())\n } catch {\n // Keep the current locale when auto-detection persistence fails.\n }\n })()\n\n return () => {\n active = false\n }\n }, [locale, router, startTransition])\n\n return (\n <footer\n className=\"rounded-xl border px-5 py-4 text-sm sm:px-6\"\n style={{\n background: withAlpha(themeTokens.surface, 0.86),\n borderColor: themeTokens.border,\n color: themeTokens.mutedText,\n }}\n >\n <div className=\"flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"font-medium\" style={{ color: themeTokens.text }}>{payload.title ?? payload.name}</div>\n <div>{t('checkout.payPage.footer.subtitle', 'Public payment page configured in checkout.')}</div>\n </div>\n <div className=\"flex flex-wrap items-center gap-3 sm:justify-end\">\n <div className=\"flex items-center gap-2 text-xs\" style={{ color: themeTokens.mutedText }}>\n <label htmlFor={selectId}>{t('common.language', 'Language')}</label>\n <Select\n value={locale}\n onValueChange={(nextLocale) => setLocale(nextLocale as Locale)}\n disabled={pending}\n >\n <SelectTrigger\n id={selectId}\n size=\"sm\"\n className=\"w-auto min-w-28 rounded-full text-xs font-medium\"\n style={{\n background: withAlpha(themeTokens.surface, 0.92),\n borderColor: themeTokens.borderStrong,\n color: themeTokens.text,\n }}\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {locales.map((entry) => (\n <SelectItem key={entry} value={entry}>\n {languageLabels[entry]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-xs uppercase tracking-widest\">\n {payload.gatewayProviderKey ?? t('checkout.payPage.header.autoProvider', 'Configured in checkout')}\n </div>\n </div>\n </div>\n </footer>\n )\n}\n\nexport function PayPage({\n mode = 'link',\n sourceId,\n initialPayload = null,\n initialLoadError = null,\n}: PayPageProps) {\n const params = useParams<{ slug: string }>()\n const router = useRouter()\n const searchParams = useSearchParams()\n const t = useT()\n const locale = useLocale()\n const prefersDark = usePrefersDarkMode()\n\n const routeSlug = typeof params?.slug === 'string' ? params.slug : ''\n const slug = sourceId ?? routeSlug\n const previewRequested = searchParams.get('preview') === 'true' || mode === 'template'\n\n const [payload, setPayload] = React.useState<PayLinkPayload | null>(initialPayload)\n const [isLoading, setIsLoading] = React.useState(initialPayload == null && initialLoadError == null)\n const [loadError, setLoadError] = React.useState<string | null>(initialLoadError)\n const [password, setPassword] = React.useState('')\n const [passwordError, setPasswordError] = React.useState<string | null>(null)\n const [isVerifyingPassword, setIsVerifyingPassword] = React.useState(false)\n const [customerData, setCustomerData] = React.useState<Record<string, unknown>>({})\n const [acceptedLegalConsents, setAcceptedLegalConsents] = React.useState<Record<string, boolean>>({})\n const [amount, setAmount] = React.useState<number | null>(null)\n const [selectedPriceItemId, setSelectedPriceItemId] = React.useState<string | null>(null)\n const [submissionError, setSubmissionError] = React.useState<string | null>(null)\n const [fieldErrors, setFieldErrors] = React.useState<FieldErrors>({})\n const [paymentSession, setPaymentSession] = React.useState<SubmitResponse['paymentSession']>(null)\n const [activeTransactionId, setActiveTransactionId] = React.useState<string | null>(null)\n const [isSubmitting, setIsSubmitting] = React.useState(false)\n\n const themeTokens = React.useMemo(\n () => resolveThemeTokens(payload, prefersDark),\n [payload, prefersDark],\n )\n\n const loadPayload = React.useCallback(async () => {\n if (!slug) return\n setIsLoading(true)\n setLoadError(null)\n const endpoint = mode === 'template'\n ? `/api/checkout/templates/${encodeURIComponent(slug)}/preview`\n : `/api/checkout/pay/${encodeURIComponent(slug)}${previewRequested ? '?preview=true' : ''}`\n\n try {\n const result = await readApiResultOrThrow<PayLinkPayload>(endpoint)\n setPayload(result)\n setPaymentSession(null)\n setActiveTransactionId(null)\n if (result.pricingMode === 'fixed' && typeof result.fixedPriceAmount === 'number') {\n setAmount(result.fixedPriceAmount)\n }\n } catch (error) {\n setPayload(null)\n setLoadError(readErrorMessage(error, t('checkout.payPage.errors.loadMessage', \"We couldn't load this payment page. Please try again.\")))\n } finally {\n setIsLoading(false)\n }\n }, [mode, previewRequested, slug, t])\n\n React.useEffect(() => {\n if (!slug) return\n if (initialPayload) return\n void loadPayload()\n }, [initialPayload, loadPayload, slug])\n\n React.useEffect(() => {\n if (!payload) return\n if (payload.pricingMode === 'fixed' && typeof payload.fixedPriceAmount === 'number') {\n setAmount(payload.fixedPriceAmount)\n return\n }\n if (payload.pricingMode !== 'price_list') {\n setSelectedPriceItemId(null)\n }\n }, [payload])\n\n const formatAmount = React.useCallback((value: number | null | undefined, currencyCode?: string | null) => {\n const normalizedValue = typeof value === 'number' && Number.isFinite(value) ? value : 0\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(normalizedValue)\n } catch {\n return `${normalizedValue.toFixed(2)} ${currencyCode}`\n }\n }\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(normalizedValue)\n }, [locale])\n\n const isPreview = payload?.preview === true || previewRequested\n const selectedPriceItem = payload?.priceListItems?.find((item) => item.id === selectedPriceItemId) ?? null\n const shouldCollectCustomerDetails = payload != null\n && payload.collectCustomerDetails !== false\n && (payload.customerFieldsSchema?.length ?? 0) > 0\n const effectiveAmount = selectedPriceItem?.amount ?? amount\n const effectiveCurrencyCode = selectedPriceItem?.currencyCode\n ?? payload?.fixedPriceCurrencyCode\n ?? payload?.customAmountCurrencyCode\n ?? null\n const inputsLocked = isSubmitting || paymentSession != null\n const publicCustomFields = payload?.publicCustomFields ?? []\n const submitData = React.useMemo<PayPageSubmitData>(() => ({\n customerData,\n acceptedLegalConsents,\n amount: effectiveAmount ?? null,\n selectedPriceItemId,\n }), [acceptedLegalConsents, customerData, effectiveAmount, selectedPriceItemId])\n\n const resolveFieldLabel = React.useCallback((fieldPath: string): string => {\n if (!payload) return t('checkout.payPage.validation.thisField', 'this field')\n if (fieldPath.startsWith('customerData.')) {\n const fieldKey = fieldPath.slice('customerData.'.length)\n return payload.customerFieldsSchema?.find((field) => field.key === fieldKey)?.label\n ?? fieldKey\n }\n if (fieldPath === 'amount') {\n return t('checkout.payPage.summary.amountDue', 'Amount due')\n }\n if (fieldPath === 'selectedPriceItemId') {\n return t('checkout.payPage.validation.labels.option', 'payment option')\n }\n if (fieldPath.startsWith('acceptedLegalConsents.')) {\n const consentKey = fieldPath.slice('acceptedLegalConsents.'.length)\n if (consentKey === 'terms') {\n return payload.legalDocuments?.terms?.title\n ?? t('checkout.payPage.legal.defaultTermsTitle', 'the terms and conditions')\n }\n if (consentKey === 'privacyPolicy') {\n return payload.legalDocuments?.privacyPolicy?.title\n ?? t('checkout.payPage.legal.defaultPrivacyTitle', 'the privacy policy')\n }\n }\n return t('checkout.payPage.validation.thisField', 'this field')\n }, [payload, t])\n\n const translateValidationMessage = React.useCallback((message: string | null | undefined, fieldPath?: string) => {\n const trimmed = typeof message === 'string' ? message.trim() : ''\n if (!trimmed) return ''\n if (trimmed === 'checkout.payPage.validation.requiredField') {\n return t(trimmed, 'Enter {field}.', { field: resolveFieldLabel(fieldPath ?? '') })\n }\n if (trimmed === 'checkout.payPage.validation.documentRequired') {\n return t(trimmed, 'Accept {field} to continue.', { field: resolveFieldLabel(fieldPath ?? '') })\n }\n return t(trimmed, trimmed)\n }, [resolveFieldLabel, t])\n\n const clearFieldError = React.useCallback((fieldPath: string) => {\n setFieldErrors((current) => {\n if (!current[fieldPath]) return current\n const next = { ...current }\n delete next[fieldPath]\n return next\n })\n }, [])\n\n const applySubmitDataToState = React.useCallback((nextData: PayPageSubmitData) => {\n setCustomerData(nextData.customerData)\n setAcceptedLegalConsents(nextData.acceptedLegalConsents)\n setAmount(nextData.amount)\n setSelectedPriceItemId(nextData.selectedPriceItemId)\n }, [])\n\n const validateBeforeSubmit = React.useCallback((): FieldErrors => {\n if (!payload) return {}\n const nextErrors: FieldErrors = {}\n\n if (shouldCollectCustomerDetails) {\n Object.assign(\n nextErrors,\n validateCheckoutCustomerData(payload.customerFieldsSchema ?? [], customerData),\n )\n }\n\n if (payload.pricingMode === 'custom_amount') {\n if (effectiveAmount == null || !Number.isFinite(effectiveAmount)) {\n nextErrors.amount = 'checkout.payPage.validation.amountRequired'\n } else {\n if (payload.customAmountMin != null && effectiveAmount < payload.customAmountMin) {\n nextErrors.amount = t(\n 'checkout.payPage.validation.amountMin',\n 'Enter at least {amount}.',\n { amount: formatAmount(payload.customAmountMin, payload.customAmountCurrencyCode) },\n )\n }\n if (payload.customAmountMax != null && effectiveAmount > payload.customAmountMax) {\n nextErrors.amount = t(\n 'checkout.payPage.validation.amountMax',\n 'Enter no more than {amount}.',\n { amount: formatAmount(payload.customAmountMax, payload.customAmountCurrencyCode) },\n )\n }\n }\n }\n\n if (payload.pricingMode === 'price_list' && !selectedPriceItemId) {\n nextErrors.selectedPriceItemId = 'checkout.payPage.validation.priceSelectionRequired'\n }\n\n for (const key of ['terms', 'privacyPolicy'] as const) {\n const document = payload.legalDocuments?.[key]\n if (document?.required === true && acceptedLegalConsents[key] !== true) {\n nextErrors[`acceptedLegalConsents.${key}`] = 'checkout.payPage.validation.documentRequired'\n }\n }\n\n return nextErrors\n }, [\n acceptedLegalConsents,\n customerData,\n effectiveAmount,\n formatAmount,\n payload,\n selectedPriceItemId,\n shouldCollectCustomerDetails,\n t,\n ])\n\n const embeddedRenderer = paymentSession?.type === 'embedded' && paymentSession.providerKey\n ? getPaymentGatewayRenderer(paymentSession.providerKey, paymentSession.rendererKey)\n : null\n\n const paymentView: PayPageInjectionContext['paymentView'] = paymentSession == null\n ? 'idle'\n : embeddedRenderer\n ? 'embedded'\n : 'redirect'\n\n const injectionContext = React.useMemo<PayPageInjectionContext | null>(() => {\n if (!payload) return null\n return {\n link: payload,\n themeMode: themeTokens.mode,\n themeTokens,\n preview: isPreview,\n selectedAmount: effectiveAmount ?? null,\n currencyCode: effectiveCurrencyCode,\n pricingMode: payload.pricingMode,\n customerSchema: payload.customerFieldsSchema ?? [],\n customerData,\n legalDocuments: payload.legalDocuments ?? {},\n acceptedLegalConsents,\n transaction: activeTransactionId ? { id: activeTransactionId } : null,\n paymentView,\n paymentSession,\n paymentProviderKey: paymentSession?.providerKey ?? payload.gatewayProviderKey ?? null,\n paymentRendererKey: paymentSession?.type === 'embedded' ? paymentSession.rendererKey : null,\n fieldErrors,\n submissionError,\n inputsLocked,\n isSubmitting,\n canSubmit: !isPreview && !inputsLocked,\n operation: 'create',\n }\n }, [\n acceptedLegalConsents,\n activeTransactionId,\n customerData,\n effectiveAmount,\n effectiveCurrencyCode,\n isPreview,\n isSubmitting,\n inputsLocked,\n payload,\n fieldErrors,\n paymentSession,\n paymentView,\n submissionError,\n themeTokens,\n ])\n\n const injectionContextRef = React.useRef<PayPageInjectionContext | null>(injectionContext)\n const submitDataRef = React.useRef(submitData)\n\n React.useEffect(() => {\n injectionContextRef.current = injectionContext\n }, [injectionContext])\n\n React.useEffect(() => {\n submitDataRef.current = submitData\n }, [submitData])\n\n const { widgets: payPageFormWidgets } = useInjectionWidgets<PayPageInjectionContext>(\n injectionContext ? 'checkout.pay-page:form' : null,\n {\n context: injectionContext ?? undefined,\n triggerOnLoad: true,\n },\n )\n const { triggerEvent: triggerPayPageFormEvent } = useInjectionSpotEvents<PayPageInjectionContext, PayPageSubmitData>(\n 'checkout.pay-page:form',\n payPageFormWidgets,\n )\n\n const transformValidationErrors = React.useCallback(async (nextErrors: FieldErrors): Promise<FieldErrors> => {\n if (!injectionContextRef.current || !Object.keys(nextErrors).length) return nextErrors\n try {\n const result = await triggerPayPageFormEvent(\n 'transformValidation',\n nextErrors as unknown as PayPageSubmitData,\n injectionContextRef.current,\n { originalData: submitDataRef.current },\n )\n const transformed = result.data\n if (!transformed || typeof transformed !== 'object' || Array.isArray(transformed)) {\n return nextErrors\n }\n return Object.fromEntries(\n Object.entries(transformed as Record<string, unknown>).map(([fieldPath, value]) => [fieldPath, String(value)]),\n )\n } catch (error) {\n logger.error('Error in transformValidation', { err: error })\n return nextErrors\n }\n }, [triggerPayPageFormEvent])\n\n const dispatchFieldChange = React.useCallback((fieldPath: string, value: unknown, nextData: PayPageSubmitData) => {\n if (!injectionContextRef.current) return\n void (async () => {\n try {\n const result = await triggerPayPageFormEvent(\n 'onFieldChange',\n nextData,\n injectionContextRef.current as PayPageInjectionContext,\n {\n fieldId: fieldPath,\n fieldValue: value,\n originalData: submitDataRef.current,\n },\n )\n const adjustedData = applySubmitDataSideEffects(\n setSubmitDataFieldValue(\n nextData,\n fieldPath,\n result.fieldChange?.value !== undefined ? result.fieldChange.value : value,\n ),\n result.fieldChange?.sideEffects,\n )\n if (adjustedData !== nextData) {\n applySubmitDataToState(adjustedData)\n }\n const nextMessage = result.fieldChange?.messages?.find((message) => message.severity === 'error')?.text\n if (nextMessage) {\n setFieldErrors((current) => ({ ...current, [fieldPath]: nextMessage }))\n }\n } catch (error) {\n logger.error('Error in onFieldChange', { err: error })\n }\n })()\n }, [applySubmitDataToState, triggerPayPageFormEvent])\n\n const updateCustomerField = React.useCallback((fieldKey: string, value: unknown) => {\n const fieldPath = `customerData.${fieldKey}`\n const nextData = setSubmitDataFieldValue(submitDataRef.current, fieldPath, value)\n applySubmitDataToState(nextData)\n clearFieldError(fieldPath)\n setSubmissionError(null)\n dispatchFieldChange(fieldPath, value, nextData)\n }, [applySubmitDataToState, clearFieldError, dispatchFieldChange])\n\n const updateConsent = React.useCallback((fieldKey: 'terms' | 'privacyPolicy', value: boolean) => {\n const fieldPath = `acceptedLegalConsents.${fieldKey}`\n const nextData = setSubmitDataFieldValue(submitDataRef.current, fieldPath, value)\n applySubmitDataToState(nextData)\n clearFieldError(fieldPath)\n setSubmissionError(null)\n dispatchFieldChange(fieldPath, value, nextData)\n }, [applySubmitDataToState, clearFieldError, dispatchFieldChange])\n\n const previewBanner = payload ? (\n isPreview ? (\n <div\n className=\"rounded-xl border px-5 py-4\"\n style={{\n background: withAlpha(themeTokens.accentSecondary, 0.12),\n borderColor: withAlpha(themeTokens.accentSecondary, 0.44),\n color: themeTokens.text,\n }}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <span className=\"text-sm font-medium\">{t('checkout.payPage.previewBanner', 'Preview mode. Payments are disabled.')}</span>\n <Button asChild type=\"button\" variant=\"outline\" style={buildButtonStyle(themeTokens, 'outline')}>\n <Link href={mode === 'template'\n ? `/backend/checkout/templates/${encodeURIComponent(payload.id)}`\n : `/backend/checkout/pay-links/${encodeURIComponent(payload.id)}`}\n >\n {t('checkout.payPage.actions.backToAdmin', 'Back to admin')}\n </Link>\n </Button>\n </div>\n </div>\n ) : null\n ) : null\n\n const SurfaceComponent = useRegisteredComponent<PayPageSurfaceProps>(PAGE_HANDLE, PayPageSurface)\n const HeaderComponent = useRegisteredComponent<PayPageHeaderProps>(HEADER_HANDLE, PayPageHeader)\n const DescriptionComponent = useRegisteredComponent<PayPageDescriptionProps>(DESCRIPTION_HANDLE, PayPageDescription)\n const CustomerFormComponent = useRegisteredComponent<PayPageCustomerFormProps>(CUSTOMER_FORM_HANDLE, PayPageCustomerForm)\n const PricingComponent = useRegisteredComponent<PayPagePricingProps>(PRICING_HANDLE, PayPagePricing)\n const SummaryComponent = useRegisteredComponent<PayPageSummaryProps>(SUMMARY_HANDLE, PayPageSummary)\n const LegalConsentComponent = useRegisteredComponent<PayPageLegalConsentProps>(LEGAL_CONSENT_HANDLE, PayPageLegalConsent)\n const PaymentSectionComponent = useRegisteredComponent<PayPagePaymentSectionProps>(PAYMENT_HANDLE, PayPagePaymentSection)\n const PaymentFormComponent = useRegisteredComponent<PayPagePaymentFormProps>(GATEWAY_FORM_HANDLE, PayPagePaymentForm)\n const HelpComponent = useRegisteredComponent<PayPageHelpProps>(HELP_HANDLE, PayPageHelp)\n const FooterComponent = useRegisteredComponent<PayPageFooterProps>(FOOTER_HANDLE, PayPageFooter)\n\n const submitPayment = React.useCallback(async () => {\n if (isPreview || !payload) return\n const nextErrors = await transformValidationErrors(validateBeforeSubmit())\n if (Object.keys(nextErrors).length > 0) {\n setFieldErrors(nextErrors)\n setSubmissionError(t('checkout.payPage.validation.fixErrors', 'Check the highlighted fields and try again.'))\n return\n }\n\n setIsSubmitting(true)\n setSubmissionError(null)\n setFieldErrors({})\n\n try {\n let nextSubmitData = submitDataRef.current\n if (injectionContextRef.current) {\n try {\n const transformed = await triggerPayPageFormEvent(\n 'transformFormData',\n nextSubmitData,\n injectionContextRef.current,\n )\n if (transformed.data) {\n nextSubmitData = transformed.data\n if (transformed.applyToForm) {\n applySubmitDataToState(nextSubmitData)\n }\n }\n } catch (error) {\n logger.error('Error in transformFormData', { err: error })\n }\n }\n\n let injectionRequestHeaders: Record<string, string> | undefined\n if (injectionContextRef.current) {\n const guard = await triggerPayPageFormEvent('onBeforeSave', nextSubmitData, injectionContextRef.current)\n if (!guard.ok) {\n const transformedErrors = await transformValidationErrors(guard.fieldErrors ?? {})\n if (Object.keys(transformedErrors).length > 0) {\n setFieldErrors(transformedErrors)\n }\n setSubmissionError(\n guard.message\n || t('checkout.payPage.validation.fixErrors', 'Check the highlighted fields and try again.'),\n )\n setIsSubmitting(false)\n return\n }\n injectionRequestHeaders = guard.requestHeaders\n await triggerPayPageFormEvent('onSave', nextSubmitData, injectionContextRef.current)\n }\n\n const runSubmit = async () => readApiResultOrThrow<SubmitResponse>(\n `/api/checkout/pay/${encodeURIComponent(slug)}/submit`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': crypto.randomUUID(),\n 'x-om-unauthorized-redirect': '0',\n },\n body: JSON.stringify(nextSubmitData),\n },\n )\n\n const result = injectionRequestHeaders && Object.keys(injectionRequestHeaders).length > 0\n ? await withScopedApiRequestHeaders(injectionRequestHeaders, runSubmit)\n : await runSubmit()\n\n setActiveTransactionId(result.transactionId)\n\n if (result.paymentSession?.type === 'embedded') {\n const nextRenderer = result.paymentSession.providerKey\n ? getPaymentGatewayRenderer(result.paymentSession.providerKey, result.paymentSession.rendererKey)\n : null\n\n if (nextRenderer) {\n setPaymentSession(result.paymentSession)\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n return\n }\n\n if (result.redirectUrl) {\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n window.location.href = result.redirectUrl\n return\n }\n\n setSubmissionError(t(\n 'checkout.payPage.errors.embeddedUnavailable',\n 'The payment form is unavailable right now. Please try again or use the hosted payment page.',\n ))\n return\n }\n\n if (result.redirectUrl) {\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n window.location.href = result.redirectUrl\n return\n }\n\n if (injectionContextRef.current) {\n await triggerPayPageFormEvent('onAfterSave', nextSubmitData, injectionContextRef.current)\n }\n router.push(`/pay/${encodeURIComponent(slug)}/success/${encodeURIComponent(result.transactionId)}`)\n } catch (error) {\n const normalized = mapCrudServerErrorToFormErrors(error)\n const nextFieldErrors = await transformValidationErrors(Object.fromEntries(\n Object.entries(normalized.fieldErrors ?? {}).map(([fieldPath, message]) => [\n fieldPath,\n translateValidationMessage(message, fieldPath),\n ]),\n ))\n if (Object.keys(nextFieldErrors).length > 0) {\n setFieldErrors(nextFieldErrors)\n }\n setSubmissionError(\n translateValidationMessage(normalized.message)\n || t('checkout.payPage.errors.submit', 'Unable to start the payment. Please try again.'),\n )\n } finally {\n setIsSubmitting(false)\n }\n }, [\n acceptedLegalConsents,\n applySubmitDataToState,\n customerData,\n effectiveAmount,\n isPreview,\n payload,\n router,\n selectedPriceItemId,\n slug,\n t,\n transformValidationErrors,\n triggerPayPageFormEvent,\n translateValidationMessage,\n validateBeforeSubmit,\n ])\n\n if (!slug || isLoading) {\n return (\n <div\n className=\"mx-auto flex min-h-[50vh] max-w-4xl items-center justify-center gap-3 px-4 py-16 text-sm\"\n style={{ color: themeTokens.mutedText }}\n >\n <Spinner size=\"sm\" />\n <span>{t('checkout.payPage.loading', 'Loading payment link...')}</span>\n </div>\n )\n }\n\n if (loadError || !payload) {\n return (\n <div className=\"mx-auto max-w-3xl px-4 py-16\">\n <Alert\n status=\"error\"\n style=\"lighter\"\n size=\"default\"\n action={(\n <Button type=\"button\" variant=\"outline\" onClick={() => { void loadPayload() }}>\n {t('checkout.payPage.actions.retry', 'Retry')}\n </Button>\n )}\n >\n <div className=\"space-y-1\">\n <AlertTitle>{t('checkout.payPage.errors.loadTitle', 'Unable to load payment link')}</AlertTitle>\n <AlertDescription>\n {loadError ?? t('checkout.payPage.errors.loadMessage', \"We couldn't load this payment page. Please try again.\")}\n </AlertDescription>\n </div>\n </Alert>\n </div>\n )\n }\n\n if (payload.requiresPassword) {\n return (\n <div\n className=\"min-h-screen px-4 py-8 sm:px-6\"\n style={{ background: themeTokens.pageBackground, color: themeTokens.text }}\n >\n <div className=\"mx-auto max-w-lg\">\n <Card\n className=\"rounded-xl border backdrop-blur\"\n style={buildPanelStyle(themeTokens, 'default')}\n >\n <CardContent className=\"space-y-5 p-6 sm:p-8\">\n <div className=\"space-y-2\">\n <div className=\"text-overline font-semibold uppercase tracking-widest\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.badges.secure', 'Secure checkout')}\n </div>\n <h1 className=\"text-2xl font-semibold\">{payload.title ?? t('checkout.payPage.protectedTitle', 'Protected payment link')}</h1>\n </div>\n <PasswordInput\n className={READABLE_INPUT_CLASSNAME}\n value={password}\n onChange={(event) => setPassword(event.target.value)}\n placeholder={t('checkout.payPage.passwordPlaceholder', 'Password')}\n style={buildReadableInputStyle(themeTokens, Boolean(passwordError))}\n />\n {passwordError ? (\n <p className=\"text-sm\" style={buildValidationMessageStyle(themeTokens)}>\n {passwordError}\n </p>\n ) : null}\n <Button\n type=\"button\"\n disabled={isVerifyingPassword}\n style={buildButtonStyle(themeTokens)}\n onClick={async () => {\n setIsVerifyingPassword(true)\n setPasswordError(null)\n try {\n await apiCallOrThrow(`/api/checkout/pay/${encodeURIComponent(slug)}/verify-password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-om-unauthorized-redirect': '0',\n },\n body: JSON.stringify({ password }),\n })\n await loadPayload()\n } catch (error) {\n setPasswordError(readTranslatedErrorMessage(\n error,\n t,\n t('checkout.payPage.errors.password', 'Unable to verify password. Please try again.'),\n ))\n } finally {\n setIsVerifyingPassword(false)\n }\n }}\n >\n <span className=\"flex items-center gap-2\">\n {isVerifyingPassword ? <Spinner size=\"sm\" /> : null}\n {isVerifyingPassword\n ? t('checkout.payPage.actions.verifying', 'Verifying...')\n : t('checkout.payPage.actions.continue', 'Continue')}\n </span>\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n )\n }\n\n if (payload.available === false && !isPreview) {\n return (\n <div className=\"mx-auto max-w-3xl px-4 py-16 text-center text-sm\" style={{ color: themeTokens.mutedText }}>\n {t('checkout.payPage.unavailable', 'This payment link is no longer available.')}\n </div>\n )\n }\n\n if (!injectionContext) return null\n\n const leftColumn = (\n <div className=\"space-y-6\">\n <InjectionSpot spotId={extensionPoints.hosts.headerBefore.spotId} context={injectionContext} />\n <div data-component-handle={HEADER_HANDLE}>\n <HeaderComponent payload={payload} preview={isPreview} themeTokens={themeTokens} />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.headerAfter.spotId} context={injectionContext} />\n\n {(payload.description || publicCustomFields.length > 0) ? (\n <>\n <div data-component-handle={DESCRIPTION_HANDLE}>\n <DescriptionComponent\n payload={payload}\n publicCustomFields={publicCustomFields}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.descriptionAfter.spotId} context={injectionContext} />\n </>\n ) : null}\n\n <InjectionSpot spotId={extensionPoints.hosts.customerFieldsBefore.spotId} context={injectionContext} />\n {shouldCollectCustomerDetails ? (\n <div data-component-handle={CUSTOMER_FORM_HANDLE}>\n <CustomerFormComponent\n payload={payload}\n customerData={customerData}\n fieldErrors={fieldErrors}\n inputsLocked={inputsLocked}\n onFieldChange={updateCustomerField}\n translateValidationMessage={translateValidationMessage}\n themeTokens={themeTokens}\n />\n </div>\n ) : null}\n <InjectionSpot spotId={extensionPoints.hosts.customerFieldsAfter.spotId} context={injectionContext} />\n </div>\n )\n\n const paymentFlow = (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.pricingBefore.spotId} context={injectionContext} />\n <div data-component-handle={PRICING_HANDLE}>\n <PricingComponent\n payload={payload}\n amount={amount}\n selectedPriceItemId={selectedPriceItemId}\n fieldErrors={fieldErrors}\n inputsLocked={inputsLocked}\n formatAmount={formatAmount}\n onAmountChange={(value) => {\n const nextAmount = parseNumericInput(value)\n const nextData = setSubmitDataFieldValue(submitDataRef.current, 'amount', nextAmount)\n applySubmitDataToState(nextData)\n clearFieldError('amount')\n setSubmissionError(null)\n dispatchFieldChange('amount', nextAmount, nextData)\n }}\n onPriceItemSelect={(item) => {\n const nextData = {\n ...submitDataRef.current,\n amount: item.amount,\n selectedPriceItemId: item.id,\n }\n applySubmitDataToState(nextData)\n clearFieldError('selectedPriceItemId')\n setSubmissionError(null)\n dispatchFieldChange('selectedPriceItemId', item.id, nextData)\n }}\n translateValidationMessage={translateValidationMessage}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.pricingAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.summaryBefore.spotId} context={injectionContext} />\n <div data-component-handle={SUMMARY_HANDLE}>\n <SummaryComponent\n payload={payload}\n selectedAmount={effectiveAmount}\n currencyCode={effectiveCurrencyCode}\n formatAmount={formatAmount}\n preview={isPreview}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.summaryAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.legalConsentBefore.spotId} context={injectionContext} />\n <div data-component-handle={LEGAL_CONSENT_HANDLE}>\n <LegalConsentComponent\n payload={payload}\n acceptedLegalConsents={acceptedLegalConsents}\n fieldErrors={fieldErrors}\n inputsLocked={inputsLocked}\n onConsentChange={updateConsent}\n translateValidationMessage={translateValidationMessage}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.legalConsentAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.submitBefore.spotId} context={injectionContext} />\n <div data-component-handle={GATEWAY_FORM_HANDLE}>\n <PaymentFormComponent\n payload={payload}\n slug={slug}\n preview={isPreview}\n isSubmitting={isSubmitting}\n submissionError={submissionError}\n paymentSession={paymentSession}\n activeTransactionId={activeTransactionId}\n embeddedRenderer={embeddedRenderer}\n onSubmit={submitPayment}\n onReset={() => {\n setPaymentSession(null)\n setActiveTransactionId(null)\n setSubmissionError(null)\n }}\n onComplete={() => {\n if (!activeTransactionId) return\n router.push(`/pay/${encodeURIComponent(slug)}/success/${encodeURIComponent(activeTransactionId)}`)\n }}\n onError={(message) => {\n setSubmissionError(message)\n }}\n injectionContext={injectionContext}\n themeTokens={themeTokens}\n />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.submitAfter.spotId} context={injectionContext} />\n\n <InjectionSpot spotId={extensionPoints.hosts.helpBefore.spotId} context={injectionContext} />\n <div data-component-handle={HELP_HANDLE}>\n <HelpComponent payload={payload} preview={isPreview} themeTokens={themeTokens} />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.helpAfter.spotId} context={injectionContext} />\n </>\n )\n\n const rightColumn = (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.paymentBefore.spotId} context={injectionContext} />\n <div data-component-handle={PAYMENT_HANDLE}>\n <PaymentSectionComponent payload={payload} preview={isPreview} themeTokens={themeTokens}>\n {paymentFlow}\n </PaymentSectionComponent>\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.paymentAfter.spotId} context={injectionContext} />\n </>\n )\n\n const footer = (\n <>\n <InjectionSpot spotId={extensionPoints.hosts.footerBefore.spotId} context={injectionContext} />\n <div data-component-handle={FOOTER_HANDLE}>\n <FooterComponent payload={payload} themeTokens={themeTokens} />\n </div>\n <InjectionSpot spotId={extensionPoints.hosts.footerAfter.spotId} context={injectionContext} />\n </>\n )\n\n return (\n <div data-component-handle={PAGE_HANDLE}>\n <SurfaceComponent\n previewBanner={previewBanner}\n leftColumn={leftColumn}\n rightColumn={rightColumn}\n footer={footer}\n themeTokens={themeTokens}\n />\n </div>\n )\n}\n\nexport default PayPage\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["document"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/checkout",
|
|
3
|
-
"version": "0.6.7-develop.
|
|
3
|
+
"version": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -62,18 +62,18 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@open-mercato/core": "0.6.7-develop.
|
|
66
|
-
"@open-mercato/ui": "0.6.7-develop.
|
|
65
|
+
"@open-mercato/core": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
66
|
+
"@open-mercato/ui": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
67
67
|
"bcryptjs": "^3.0.3"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
70
70
|
"@mikro-orm/postgresql": "^7.0.14",
|
|
71
|
-
"@open-mercato/shared": "0.6.7-develop.
|
|
71
|
+
"@open-mercato/shared": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
72
72
|
"react": "^19.0.0",
|
|
73
73
|
"react-dom": "^19.0.0"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@open-mercato/shared": "0.6.7-develop.
|
|
76
|
+
"@open-mercato/shared": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
77
77
|
"@types/jest": "^30.0.0",
|
|
78
78
|
"@types/react": "^19.2.17",
|
|
79
79
|
"@types/react-dom": "^19.2.3",
|
|
@@ -1369,6 +1369,7 @@ export function PayPageFooter({ payload, themeTokens }: PayPageFooterProps) {
|
|
|
1369
1369
|
pl: t('common.languages.polish', 'Polski'),
|
|
1370
1370
|
es: t('common.languages.spanish', 'Español'),
|
|
1371
1371
|
de: t('common.languages.german', 'Deutsch'),
|
|
1372
|
+
ko: t('common.languages.korean', '한국어'),
|
|
1372
1373
|
}), [t])
|
|
1373
1374
|
|
|
1374
1375
|
const setLocale = React.useCallback(async (nextLocale: Locale) => {
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
{
|
|
2
|
+
"checkout.admin.payLinks.actions.copyUrl": "링크 URL 복사",
|
|
3
|
+
"checkout.admin.payLinks.actions.create": "링크 생성",
|
|
4
|
+
"checkout.admin.payLinks.actions.deactivate": "비활성화",
|
|
5
|
+
"checkout.admin.payLinks.actions.publish": "게시",
|
|
6
|
+
"checkout.admin.payLinks.actions.showTransactions": "거래 보기",
|
|
7
|
+
"checkout.admin.payLinks.actions.viewPayPage": "결제 페이지 보기",
|
|
8
|
+
"checkout.admin.payLinks.columns.created": "생성됨",
|
|
9
|
+
"checkout.admin.payLinks.columns.name": "이름",
|
|
10
|
+
"checkout.admin.payLinks.columns.pricing": "가격 책정",
|
|
11
|
+
"checkout.admin.payLinks.columns.slug": "슬러그",
|
|
12
|
+
"checkout.admin.payLinks.columns.status": "상태",
|
|
13
|
+
"checkout.admin.payLinks.columns.uses": "사용 횟수",
|
|
14
|
+
"checkout.admin.payLinks.filters.pricing": "가격 책정",
|
|
15
|
+
"checkout.admin.payLinks.filters.status": "상태",
|
|
16
|
+
"checkout.admin.payLinks.flash.deactivateError": "결제 링크를 비활성화하지 못했습니다.",
|
|
17
|
+
"checkout.admin.payLinks.flash.deactivated": "결제 링크가 비활성화되었습니다.",
|
|
18
|
+
"checkout.admin.payLinks.flash.deleteError": "결제 링크를 삭제하지 못했습니다.",
|
|
19
|
+
"checkout.admin.payLinks.flash.deleted": "결제 링크가 삭제되었습니다.",
|
|
20
|
+
"checkout.admin.payLinks.flash.publishError": "결제 링크를 게시하지 못했습니다.",
|
|
21
|
+
"checkout.admin.payLinks.flash.published": "결제 링크가 게시되었습니다.",
|
|
22
|
+
"checkout.admin.payLinks.pricing.customAmount": "사용자 지정 {min}-{max} {currency}",
|
|
23
|
+
"checkout.admin.payLinks.pricing.fixed": "고정 {amount} {currency}",
|
|
24
|
+
"checkout.admin.payLinks.searchPlaceholder": "결제 링크 검색…",
|
|
25
|
+
"checkout.admin.payLinks.title": "결제 링크",
|
|
26
|
+
"checkout.admin.templates.actions.create": "템플릿 생성",
|
|
27
|
+
"checkout.admin.templates.actions.createLinkFromTemplate": "템플릿으로 링크 생성",
|
|
28
|
+
"checkout.admin.templates.columns.created": "생성됨",
|
|
29
|
+
"checkout.admin.templates.columns.gateway": "게이트웨이",
|
|
30
|
+
"checkout.admin.templates.columns.maxUses": "최대 사용 횟수",
|
|
31
|
+
"checkout.admin.templates.columns.name": "이름",
|
|
32
|
+
"checkout.admin.templates.columns.pricingMode": "가격 책정 방식",
|
|
33
|
+
"checkout.admin.templates.filters.pricingMode": "가격 책정 방식",
|
|
34
|
+
"checkout.admin.templates.searchPlaceholder": "템플릿 검색…",
|
|
35
|
+
"checkout.admin.templates.title": "링크 템플릿",
|
|
36
|
+
"checkout.admin.templates.unlimited": "무제한",
|
|
37
|
+
"checkout.admin.transactionDetail.actions.capturePayment": "결제 승인",
|
|
38
|
+
"checkout.admin.transactionDetail.actions.copyJson": "JSON 복사",
|
|
39
|
+
"checkout.admin.transactionDetail.actions.copyMarkdown": "마크다운 복사",
|
|
40
|
+
"checkout.admin.transactionDetail.actions.copySectionJson": "섹션을 JSON으로 복사",
|
|
41
|
+
"checkout.admin.transactionDetail.actions.copySectionMarkdown": "섹션을 마크다운으로 복사",
|
|
42
|
+
"checkout.admin.transactionDetail.actions.viewGatewayTransaction": "게이트웨이 거래 열기",
|
|
43
|
+
"checkout.admin.transactionDetail.actions.viewPayLink": "결제 링크 보기",
|
|
44
|
+
"checkout.admin.transactionDetail.captureError": "결제 승인에 실패했습니다.",
|
|
45
|
+
"checkout.admin.transactionDetail.copyError": "거래 데이터를 복사하지 못했습니다.",
|
|
46
|
+
"checkout.admin.transactionDetail.description": "체크아웃 거래와 관련 결제 링크 데이터를 확인합니다.",
|
|
47
|
+
"checkout.admin.transactionDetail.emptyCustomFields": "이 거래에 대해 캡처된 커스텀 필드가 없습니다.",
|
|
48
|
+
"checkout.admin.transactionDetail.entityType": "체크아웃 거래",
|
|
49
|
+
"checkout.admin.transactionDetail.fields.amount": "금액",
|
|
50
|
+
"checkout.admin.transactionDetail.fields.checkoutTransaction": "체크아웃 거래",
|
|
51
|
+
"checkout.admin.transactionDetail.fields.created": "생성됨",
|
|
52
|
+
"checkout.admin.transactionDetail.fields.email": "이메일",
|
|
53
|
+
"checkout.admin.transactionDetail.fields.firstName": "이름",
|
|
54
|
+
"checkout.admin.transactionDetail.fields.gatewayTransactionId": "게이트웨이 거래 ID",
|
|
55
|
+
"checkout.admin.transactionDetail.fields.lastName": "성",
|
|
56
|
+
"checkout.admin.transactionDetail.fields.linkName": "링크 이름",
|
|
57
|
+
"checkout.admin.transactionDetail.fields.paymentStatus": "결제 상태",
|
|
58
|
+
"checkout.admin.transactionDetail.fields.phone": "전화번호",
|
|
59
|
+
"checkout.admin.transactionDetail.fields.pricingMode": "가격 책정 방식",
|
|
60
|
+
"checkout.admin.transactionDetail.fields.selectedPriceItem": "선택한 가격 항목",
|
|
61
|
+
"checkout.admin.transactionDetail.fields.slug": "슬러그",
|
|
62
|
+
"checkout.admin.transactionDetail.fields.status": "상태",
|
|
63
|
+
"checkout.admin.transactionDetail.fields.transactionId": "거래 ID",
|
|
64
|
+
"checkout.admin.transactionDetail.fields.updated": "업데이트됨",
|
|
65
|
+
"checkout.admin.transactionDetail.flash.captured": "결제가 승인되었습니다.",
|
|
66
|
+
"checkout.admin.transactionDetail.flash.copiedJson": "거래 상세 정보가 JSON으로 복사되었습니다.",
|
|
67
|
+
"checkout.admin.transactionDetail.flash.copiedMarkdown": "거래 상세 정보가 마크다운으로 복사되었습니다.",
|
|
68
|
+
"checkout.admin.transactionDetail.flash.copiedSectionJson": "섹션이 JSON으로 복사되었습니다.",
|
|
69
|
+
"checkout.admin.transactionDetail.flash.copiedSectionMarkdown": "섹션이 마크다운으로 복사되었습니다.",
|
|
70
|
+
"checkout.admin.transactionDetail.sections.customFields": "커스텀 필드",
|
|
71
|
+
"checkout.admin.transactionDetail.sections.customer": "고객 정보",
|
|
72
|
+
"checkout.admin.transactionDetail.sections.gateway": "게이트웨이 거래",
|
|
73
|
+
"checkout.admin.transactionDetail.sections.link": "링크 상세 정보",
|
|
74
|
+
"checkout.admin.transactionDetail.sections.payment": "결제 상세 정보",
|
|
75
|
+
"checkout.admin.transactionDetail.title": "거래 상세 정보",
|
|
76
|
+
"checkout.admin.transactions.actions.viewDetail": "상세 정보 보기",
|
|
77
|
+
"checkout.admin.transactions.columns.amount": "금액",
|
|
78
|
+
"checkout.admin.transactions.columns.customer": "고객",
|
|
79
|
+
"checkout.admin.transactions.columns.date": "날짜",
|
|
80
|
+
"checkout.admin.transactions.columns.email": "이메일",
|
|
81
|
+
"checkout.admin.transactions.columns.link": "링크",
|
|
82
|
+
"checkout.admin.transactions.columns.paymentStatus": "결제 상태",
|
|
83
|
+
"checkout.admin.transactions.columns.status": "상태",
|
|
84
|
+
"checkout.admin.transactions.filters.link": "링크",
|
|
85
|
+
"checkout.admin.transactions.filters.status": "상태",
|
|
86
|
+
"checkout.admin.transactions.searchPlaceholder": "거래 검색…",
|
|
87
|
+
"checkout.admin.transactions.status.cancelled": "취소됨",
|
|
88
|
+
"checkout.admin.transactions.status.completed": "완료됨",
|
|
89
|
+
"checkout.admin.transactions.status.expired": "만료됨",
|
|
90
|
+
"checkout.admin.transactions.status.failed": "실패",
|
|
91
|
+
"checkout.admin.transactions.status.pending": "대기 중",
|
|
92
|
+
"checkout.admin.transactions.status.processing": "처리 중",
|
|
93
|
+
"checkout.admin.transactions.title": "거래",
|
|
94
|
+
"checkout.audit.links.create": "결제 링크 생성",
|
|
95
|
+
"checkout.audit.links.delete": "결제 링크 삭제",
|
|
96
|
+
"checkout.audit.links.update": "결제 링크 업데이트",
|
|
97
|
+
"checkout.audit.templates.create": "결제 링크 템플릿 생성",
|
|
98
|
+
"checkout.audit.templates.delete": "결제 링크 템플릿 삭제",
|
|
99
|
+
"checkout.audit.templates.update": "결제 링크 템플릿 업데이트",
|
|
100
|
+
"checkout.common.actions.delete": "삭제",
|
|
101
|
+
"checkout.common.actions.edit": "편집",
|
|
102
|
+
"checkout.common.actions.preview": "미리보기",
|
|
103
|
+
"checkout.common.actions.remove": "제거",
|
|
104
|
+
"checkout.common.actions.saveAndPublish": "저장 후 게시",
|
|
105
|
+
"checkout.common.emptyValue": "—",
|
|
106
|
+
"checkout.common.enabled": "활성화됨",
|
|
107
|
+
"checkout.common.flash.deleted": "삭제됨",
|
|
108
|
+
"checkout.common.flash.saved": "저장됨",
|
|
109
|
+
"checkout.common.status.active": "활성",
|
|
110
|
+
"checkout.common.status.draft": "임시 저장",
|
|
111
|
+
"checkout.common.status.inactive": "비활성",
|
|
112
|
+
"checkout.currencySelect.errors.load": "통화를 불러오지 못했습니다.",
|
|
113
|
+
"checkout.currencySelect.placeholder": "통화 선택",
|
|
114
|
+
"checkout.customerFieldsEditor.addField": "고객 필드 추가",
|
|
115
|
+
"checkout.customerFieldsEditor.columns.actions": "작업",
|
|
116
|
+
"checkout.customerFieldsEditor.columns.fieldKey": "필드 키",
|
|
117
|
+
"checkout.customerFieldsEditor.columns.label": "라벨",
|
|
118
|
+
"checkout.customerFieldsEditor.columns.placeholder": "플레이스홀더",
|
|
119
|
+
"checkout.customerFieldsEditor.columns.required": "필수",
|
|
120
|
+
"checkout.customerFieldsEditor.columns.type": "유형",
|
|
121
|
+
"checkout.customerFieldsEditor.locked": "잠김",
|
|
122
|
+
"checkout.customerFieldsEditor.newFieldLabel": "새 필드",
|
|
123
|
+
"checkout.customerFieldsEditor.newFieldPlaceholder": "체크아웃 양식에 표시됨",
|
|
124
|
+
"checkout.customerFieldsEditor.notices.defaultFields": "기본 고객 필드는 시작을 위한 제안일 뿐입니다. 양식을 간결하게 유지하기 위해 이름을 바꾸거나, 순서를 변경하거나, 제거할 수 있습니다.",
|
|
125
|
+
"checkout.customerFieldsEditor.notices.empty": "아직 설정된 고객 필드가 없습니다. 결제 페이지에서 구매자 정보를 수집하려면 필드를 하나 이상 추가하세요.",
|
|
126
|
+
"checkout.customerFieldsEditor.options.add": "옵션 추가",
|
|
127
|
+
"checkout.customerFieldsEditor.options.defaultLabel": "옵션 {index}",
|
|
128
|
+
"checkout.customerFieldsEditor.options.label": "라벨",
|
|
129
|
+
"checkout.customerFieldsEditor.options.placeholders.label": "스타터",
|
|
130
|
+
"checkout.customerFieldsEditor.options.placeholders.value": "starter",
|
|
131
|
+
"checkout.customerFieldsEditor.options.title": "옵션",
|
|
132
|
+
"checkout.customerFieldsEditor.options.value": "값",
|
|
133
|
+
"checkout.customerFieldsEditor.placeholders.fieldKey": "referenceCode",
|
|
134
|
+
"checkout.customerFieldsEditor.placeholders.label": "참조 코드",
|
|
135
|
+
"checkout.customerFieldsEditor.placeholders.placeholder": "입력란 안에 표시됨",
|
|
136
|
+
"checkout.customerFieldsEditor.types.boolean": "체크박스",
|
|
137
|
+
"checkout.customerFieldsEditor.types.multiline": "텍스트 영역",
|
|
138
|
+
"checkout.customerFieldsEditor.types.radio": "라디오 버튼",
|
|
139
|
+
"checkout.customerFieldsEditor.types.select": "선택",
|
|
140
|
+
"checkout.customerFieldsEditor.types.text": "텍스트",
|
|
141
|
+
"checkout.defaultCustomerFields.address.label": "주소",
|
|
142
|
+
"checkout.defaultCustomerFields.address.placeholder": "도로명, 도시, 우편번호",
|
|
143
|
+
"checkout.defaultCustomerFields.companyId.label": "사업자 등록번호",
|
|
144
|
+
"checkout.defaultCustomerFields.companyId.placeholder": "부가가치세 / 사업자 등록번호",
|
|
145
|
+
"checkout.defaultCustomerFields.companyName.label": "회사명",
|
|
146
|
+
"checkout.defaultCustomerFields.companyName.placeholder": "Acme Inc.",
|
|
147
|
+
"checkout.defaultCustomerFields.email.label": "이메일",
|
|
148
|
+
"checkout.defaultCustomerFields.email.placeholder": "jane@company.com",
|
|
149
|
+
"checkout.defaultCustomerFields.firstName.label": "이름",
|
|
150
|
+
"checkout.defaultCustomerFields.firstName.placeholder": "Jane",
|
|
151
|
+
"checkout.defaultCustomerFields.lastName.label": "성",
|
|
152
|
+
"checkout.defaultCustomerFields.lastName.placeholder": "Doe",
|
|
153
|
+
"checkout.defaultCustomerFields.phone.label": "전화번호",
|
|
154
|
+
"checkout.defaultCustomerFields.phone.placeholder": "+1 555 123 4567",
|
|
155
|
+
"checkout.gatewaySettings.notices.chooseProvider": "체크아웃 세션 설정을 구성하려면 게이트웨이 제공업체를 선택하세요.",
|
|
156
|
+
"checkout.gatewaySettings.notices.noSettings": "이 제공업체는 추가 세션 설정을 제공하지 않습니다.",
|
|
157
|
+
"checkout.gatewaySettings.selectPlaceholder": "선택…",
|
|
158
|
+
"checkout.link.created": "결제 링크가 생성됨",
|
|
159
|
+
"checkout.link.deleted": "결제 링크가 삭제됨",
|
|
160
|
+
"checkout.link.locked": "결제 링크가 잠김",
|
|
161
|
+
"checkout.link.published": "결제 링크가 게시됨",
|
|
162
|
+
"checkout.link.updated": "결제 링크가 업데이트됨",
|
|
163
|
+
"checkout.link.usageLimitReached": "결제 링크 사용 한도에 도달함",
|
|
164
|
+
"checkout.linkTemplateForm.appearance.fields.backgroundColor": "배경 색상",
|
|
165
|
+
"checkout.linkTemplateForm.appearance.fields.displayCustomFields": "공개 페이지에 커스텀 필드 표시",
|
|
166
|
+
"checkout.linkTemplateForm.appearance.fields.primaryColor": "기본 색상",
|
|
167
|
+
"checkout.linkTemplateForm.appearance.fields.secondaryColor": "보조 색상",
|
|
168
|
+
"checkout.linkTemplateForm.appearance.fields.themeMode": "테마 모드",
|
|
169
|
+
"checkout.linkTemplateForm.appearance.themeModes.auto": "자동",
|
|
170
|
+
"checkout.linkTemplateForm.appearance.themeModes.dark": "다크",
|
|
171
|
+
"checkout.linkTemplateForm.appearance.themeModes.light": "라이트",
|
|
172
|
+
"checkout.linkTemplateForm.customerDetails.description": "권장 사항: 영수증 발급, 부정 거래 검토, 결제 분쟁 대응을 위해 최소한 고객 이메일은 수집하는 것이 좋습니다. 필수는 아닙니다.",
|
|
173
|
+
"checkout.linkTemplateForm.customerDetails.notices.disabled": "고객 정보 수집이 비활성화되어 있습니다. 구매자에게는 결제 섹션과 법적 동의 체크박스만 표시됩니다.",
|
|
174
|
+
"checkout.linkTemplateForm.customerDetails.notices.simpleLink": "고객 양식 없이 단순한 결제 링크 페이지로 만들려면 이 기능을 끄세요.",
|
|
175
|
+
"checkout.linkTemplateForm.customerDetails.title": "고객 정보 수집",
|
|
176
|
+
"checkout.linkTemplateForm.emails.labels.body": "{state} 이메일 본문",
|
|
177
|
+
"checkout.linkTemplateForm.emails.labels.subject": "{state} 이메일 제목",
|
|
178
|
+
"checkout.linkTemplateForm.emails.notice": "이메일 본문은 마크다운과 아래 변수를 지원합니다.",
|
|
179
|
+
"checkout.linkTemplateForm.emails.placeholders.errorBody": "안녕하세요 {{firstName}}님, 결제를 완료하지 못했습니다. {{errorMessage}}",
|
|
180
|
+
"checkout.linkTemplateForm.emails.placeholders.errorSubject": "결제 실패 - {{linkTitle}}",
|
|
181
|
+
"checkout.linkTemplateForm.emails.placeholders.startBody": "안녕하세요 {{firstName}}님, **{{amount}} {{currencyCode}}** 결제 처리를 시작했습니다.",
|
|
182
|
+
"checkout.linkTemplateForm.emails.placeholders.startSubject": "결제 시작 - {{linkTitle}}",
|
|
183
|
+
"checkout.linkTemplateForm.emails.placeholders.successBody": "안녕하세요 {{firstName}}님, 결제가 완료되었습니다. 참조 번호: `{{transactionId}}`.",
|
|
184
|
+
"checkout.linkTemplateForm.emails.placeholders.successSubject": "결제 완료 - {{linkTitle}}",
|
|
185
|
+
"checkout.linkTemplateForm.emails.sendToCustomer": "고객에게 이 이메일 보내기",
|
|
186
|
+
"checkout.linkTemplateForm.emails.tabs.error": "오류",
|
|
187
|
+
"checkout.linkTemplateForm.emails.tabs.start": "시작됨",
|
|
188
|
+
"checkout.linkTemplateForm.emails.tabs.success": "성공",
|
|
189
|
+
"checkout.linkTemplateForm.emails.variableHint": "사용 가능한 변수:",
|
|
190
|
+
"checkout.linkTemplateForm.general.actions.clearTemplate": "빈 양식으로 시작",
|
|
191
|
+
"checkout.linkTemplateForm.general.actions.generateSlug": "생성",
|
|
192
|
+
"checkout.linkTemplateForm.general.fields.description": "설명",
|
|
193
|
+
"checkout.linkTemplateForm.general.fields.name": "이름",
|
|
194
|
+
"checkout.linkTemplateForm.general.fields.slug": "슬러그",
|
|
195
|
+
"checkout.linkTemplateForm.general.fields.subtitle": "부제목",
|
|
196
|
+
"checkout.linkTemplateForm.general.fields.template": "템플릿",
|
|
197
|
+
"checkout.linkTemplateForm.general.fields.title": "제목",
|
|
198
|
+
"checkout.linkTemplateForm.general.hints.description": "공개 페이지 미리보기에서는 마크다운을 사용할 수 있습니다.",
|
|
199
|
+
"checkout.linkTemplateForm.general.hints.slug": "이는 공개 결제 링크 URL이 됩니다.",
|
|
200
|
+
"checkout.linkTemplateForm.general.hints.template": "선택적 시작점입니다. 템플릿을 적용하면 현재 양식 값이 대체됩니다.",
|
|
201
|
+
"checkout.linkTemplateForm.general.notices.templateReplacement": "템플릿을 선택하면 링크가 자동으로 채워지며, 필요한 경우 복사된 값을 조정할 수 있습니다.",
|
|
202
|
+
"checkout.linkTemplateForm.general.placeholders.description": "# 포함 내용\n- 60분 전략 상담\n- 상담 후 요약",
|
|
203
|
+
"checkout.linkTemplateForm.general.placeholders.name": "1월 컨설팅 세션",
|
|
204
|
+
"checkout.linkTemplateForm.general.placeholders.slug": "january-consulting",
|
|
205
|
+
"checkout.linkTemplateForm.general.placeholders.subtitle": "1시간 전략 컨설팅",
|
|
206
|
+
"checkout.linkTemplateForm.general.placeholders.template": "템플릿 검색…",
|
|
207
|
+
"checkout.linkTemplateForm.general.placeholders.title": "컨설팅 세션 결제",
|
|
208
|
+
"checkout.linkTemplateForm.general.slugPreview": "미리보기: `/pay/{slug}`",
|
|
209
|
+
"checkout.linkTemplateForm.general.status.applyingTemplate": "템플릿 적용 중…",
|
|
210
|
+
"checkout.linkTemplateForm.groups.appearance": "외관",
|
|
211
|
+
"checkout.linkTemplateForm.groups.customFields": "커스텀 필드",
|
|
212
|
+
"checkout.linkTemplateForm.groups.customerFields": "고객 필드",
|
|
213
|
+
"checkout.linkTemplateForm.groups.emails": "이메일",
|
|
214
|
+
"checkout.linkTemplateForm.groups.general": "일반",
|
|
215
|
+
"checkout.linkTemplateForm.groups.legal": "법적 고지",
|
|
216
|
+
"checkout.linkTemplateForm.groups.messages": "메시지",
|
|
217
|
+
"checkout.linkTemplateForm.groups.payment": "결제",
|
|
218
|
+
"checkout.linkTemplateForm.groups.pricing": "가격 책정",
|
|
219
|
+
"checkout.linkTemplateForm.groups.settings": "설정",
|
|
220
|
+
"checkout.linkTemplateForm.legal.fields.acceptanceRequired": "동의 필수",
|
|
221
|
+
"checkout.linkTemplateForm.legal.fields.privacyBody": "개인정보 처리방침 본문",
|
|
222
|
+
"checkout.linkTemplateForm.legal.fields.privacyTitle": "개인정보 처리방침 제목",
|
|
223
|
+
"checkout.linkTemplateForm.legal.fields.termsBody": "이용약관 본문",
|
|
224
|
+
"checkout.linkTemplateForm.legal.fields.termsTitle": "이용약관 제목",
|
|
225
|
+
"checkout.linkTemplateForm.legal.notice": "이 탭들은 결제 페이지의 법적 동의 단계 주변에 표시됩니다. 제목, 목록, 링크에는 마크다운을 사용하세요.",
|
|
226
|
+
"checkout.linkTemplateForm.legal.placeholders.privacyBody": "# 개인정보\n\n수집하는 개인정보와 그 이유를 설명하세요.",
|
|
227
|
+
"checkout.linkTemplateForm.legal.placeholders.privacyTitle": "개인정보 처리방침",
|
|
228
|
+
"checkout.linkTemplateForm.legal.placeholders.termsBody": "# 이용약관\n\n결제 전 고객이 동의해야 하는 규칙을 설명하세요.",
|
|
229
|
+
"checkout.linkTemplateForm.legal.placeholders.termsTitle": "이용약관",
|
|
230
|
+
"checkout.linkTemplateForm.legal.tabs.privacy": "개인정보",
|
|
231
|
+
"checkout.linkTemplateForm.legal.tabs.terms": "이용약관",
|
|
232
|
+
"checkout.linkTemplateForm.locked.description": "이 결제 링크에는 이미 활성 거래가 있습니다. 저장된 설정을 확인할 수는 있지만 편집과 삭제는 비활성화되어 있습니다.",
|
|
233
|
+
"checkout.linkTemplateForm.locked.overlayDescription": "이 결제 링크에 활성 거래가 연결되어 있어 결제 무결성을 보호하기 위해 양식이 잠겨 있습니다.",
|
|
234
|
+
"checkout.linkTemplateForm.locked.overlayTitle": "편집 비활성화됨",
|
|
235
|
+
"checkout.linkTemplateForm.locked.title": "이 결제 링크는 읽기 전용입니다",
|
|
236
|
+
"checkout.linkTemplateForm.messages.labels.body": "{state} 메시지",
|
|
237
|
+
"checkout.linkTemplateForm.messages.labels.title": "{state} 제목",
|
|
238
|
+
"checkout.linkTemplateForm.messages.notice": "이 메시지들은 공개 성공, 취소, 오류 상태에 표시됩니다. 본문에는 마크다운을 사용할 수 있습니다.",
|
|
239
|
+
"checkout.linkTemplateForm.messages.placeholders.cancelBody": "결제가 완료되기 전에 취소되었습니다.",
|
|
240
|
+
"checkout.linkTemplateForm.messages.placeholders.cancelTitle": "결제 취소됨",
|
|
241
|
+
"checkout.linkTemplateForm.messages.placeholders.errorBody": "결제를 완료할 수 없었습니다. 다시 시도해 주세요.",
|
|
242
|
+
"checkout.linkTemplateForm.messages.placeholders.errorTitle": "결제 실패",
|
|
243
|
+
"checkout.linkTemplateForm.messages.placeholders.successBody": "결제해 주셔서 감사합니다. 현재 처리 중입니다.",
|
|
244
|
+
"checkout.linkTemplateForm.messages.placeholders.successTitle": "결제 완료됨",
|
|
245
|
+
"checkout.linkTemplateForm.messages.tabs.cancel": "취소",
|
|
246
|
+
"checkout.linkTemplateForm.messages.tabs.error": "오류",
|
|
247
|
+
"checkout.linkTemplateForm.messages.tabs.success": "성공",
|
|
248
|
+
"checkout.linkTemplateForm.notFound.link.description": "이 결제 링크가 더 이상 존재하지 않습니다. 다른 탭이나 다른 사용자가 삭제했을 수 있습니다.",
|
|
249
|
+
"checkout.linkTemplateForm.notFound.link.title": "결제 링크를 찾을 수 없음",
|
|
250
|
+
"checkout.linkTemplateForm.notFound.template.description": "이 템플릿이 더 이상 존재하지 않습니다. 다른 탭이나 다른 사용자가 삭제했을 수 있습니다.",
|
|
251
|
+
"checkout.linkTemplateForm.notFound.template.title": "템플릿을 찾을 수 없음",
|
|
252
|
+
"checkout.linkTemplateForm.payment.fields.gatewayProvider": "게이트웨이 제공업체",
|
|
253
|
+
"checkout.linkTemplateForm.payment.placeholders.provider": "제공업체 선택…",
|
|
254
|
+
"checkout.linkTemplateForm.payment.providerUnavailableSuffix": "(먼저 연동에서 구성하세요)",
|
|
255
|
+
"checkout.linkTemplateForm.priceList.actions.addItem": "항목 추가",
|
|
256
|
+
"checkout.linkTemplateForm.priceList.aria.amount": "금액 {index}",
|
|
257
|
+
"checkout.linkTemplateForm.priceList.aria.description": "설명 {index}",
|
|
258
|
+
"checkout.linkTemplateForm.priceList.aria.itemCode": "항목 코드 {index}",
|
|
259
|
+
"checkout.linkTemplateForm.priceList.columns.actions": "작업",
|
|
260
|
+
"checkout.linkTemplateForm.priceList.columns.amount": "금액",
|
|
261
|
+
"checkout.linkTemplateForm.priceList.columns.currency": "통화",
|
|
262
|
+
"checkout.linkTemplateForm.priceList.columns.description": "설명",
|
|
263
|
+
"checkout.linkTemplateForm.priceList.columns.itemCode": "항목 코드",
|
|
264
|
+
"checkout.linkTemplateForm.priceList.notices.empty": "아직 가격표 항목이 없습니다. 고객이 여러 가격 중에서 선택할 수 있도록 항목을 하나 이상 추가하세요.",
|
|
265
|
+
"checkout.linkTemplateForm.priceList.notices.singleCurrency": "모든 가격표 항목은 동일한 통화로 유지하세요. 첫 번째 통화가 새 행의 기본값이 됩니다.",
|
|
266
|
+
"checkout.linkTemplateForm.priceList.placeholders.description": "스타터 패키지",
|
|
267
|
+
"checkout.linkTemplateForm.priceList.placeholders.itemCode": "starter",
|
|
268
|
+
"checkout.linkTemplateForm.pricing.fields.amount": "금액",
|
|
269
|
+
"checkout.linkTemplateForm.pricing.fields.compareAtPrice": "비교 가격",
|
|
270
|
+
"checkout.linkTemplateForm.pricing.fields.currency": "통화",
|
|
271
|
+
"checkout.linkTemplateForm.pricing.fields.includesTax": "세금 포함 가격",
|
|
272
|
+
"checkout.linkTemplateForm.pricing.fields.maximumAmount": "최대 금액",
|
|
273
|
+
"checkout.linkTemplateForm.pricing.fields.minimumAmount": "최소 금액",
|
|
274
|
+
"checkout.linkTemplateForm.pricing.hints.compareAtPrice": "현재 가격 위에 취소선으로 표시되는 선택적 금액입니다.",
|
|
275
|
+
"checkout.linkTemplateForm.pricing.modes.customAmount": "고객이 금액 입력",
|
|
276
|
+
"checkout.linkTemplateForm.pricing.modes.fixed": "고정 가격",
|
|
277
|
+
"checkout.linkTemplateForm.pricing.modes.priceList": "가격표",
|
|
278
|
+
"checkout.linkTemplateForm.settings.fields.maxCompletions": "최대 완료 횟수",
|
|
279
|
+
"checkout.linkTemplateForm.settings.fields.password": "비밀번호",
|
|
280
|
+
"checkout.linkTemplateForm.settings.fields.status": "상태",
|
|
281
|
+
"checkout.linkTemplateForm.settings.hints.maxCompletions": "링크를 계속 재사용할 수 있게 하려면 비워 두세요.",
|
|
282
|
+
"checkout.linkTemplateForm.settings.hints.password": "결제 페이지를 열기 전에 요구되는 선택적 비밀번호입니다.",
|
|
283
|
+
"checkout.linkTemplateForm.settings.placeholders.password": "페이지를 공개 상태로 유지하려면 비워 두세요",
|
|
284
|
+
"checkout.linkTemplateForm.settings.placeholders.unlimited": "무제한",
|
|
285
|
+
"checkout.linkTemplateForm.titles.createLink": "결제 링크 생성",
|
|
286
|
+
"checkout.linkTemplateForm.titles.createTemplate": "템플릿 생성",
|
|
287
|
+
"checkout.linkTemplateForm.titles.editLink": "결제 링크 편집",
|
|
288
|
+
"checkout.linkTemplateForm.titles.editTemplate": "템플릿 편집",
|
|
289
|
+
"checkout.logoUpload.actions.attach": "로고 첨부",
|
|
290
|
+
"checkout.logoUpload.actions.removeUpload": "업로드 제거",
|
|
291
|
+
"checkout.logoUpload.actions.uploading": "업로드 중…",
|
|
292
|
+
"checkout.logoUpload.description": "로고를 첨부 파일로 업로드하거나 외부 URL을 계속 사용하세요.",
|
|
293
|
+
"checkout.logoUpload.empty": "아직 선택된 로고가 없습니다.",
|
|
294
|
+
"checkout.logoUpload.errors.remove": "업로드된 로고를 제거하지 못했습니다.",
|
|
295
|
+
"checkout.logoUpload.errors.upload": "로고 업로드에 실패했습니다.",
|
|
296
|
+
"checkout.logoUpload.externalUrl": "외부 로고 URL",
|
|
297
|
+
"checkout.logoUpload.externalUrlPlaceholder": "https://example.com/logo.png",
|
|
298
|
+
"checkout.logoUpload.notices.attachmentWins": "업로드된 첨부 파일이 우선 사용됩니다. 외부 URL로 대체하려면 첨부 파일을 제거하세요.",
|
|
299
|
+
"checkout.logoUpload.previewAlt": "체크아웃 로고 미리보기",
|
|
300
|
+
"checkout.logoUpload.title": "로고",
|
|
301
|
+
"checkout.nav.group": "체크아웃",
|
|
302
|
+
"checkout.nav.payLinks": "결제 링크",
|
|
303
|
+
"checkout.nav.root": "체크아웃",
|
|
304
|
+
"checkout.nav.templates": "템플릿",
|
|
305
|
+
"checkout.nav.transactions": "거래",
|
|
306
|
+
"checkout.notifications.link.usageLimitReached.body": "{linkName}이(가) 최대 완료 횟수에 도달했습니다.",
|
|
307
|
+
"checkout.notifications.link.usageLimitReached.title": "사용 한도 도달",
|
|
308
|
+
"checkout.notifications.renderer.viewLink": "결제 링크 보기",
|
|
309
|
+
"checkout.notifications.renderer.viewTransaction": "거래 보기",
|
|
310
|
+
"checkout.notifications.transaction.completed.body": "{customerName}님이 {amount} {currency}를 결제했습니다.",
|
|
311
|
+
"checkout.notifications.transaction.completed.title": "결제 완료됨",
|
|
312
|
+
"checkout.notifications.transaction.failed.body": "{amount} {currency} 결제가 실패했습니다.",
|
|
313
|
+
"checkout.notifications.transaction.failed.title": "결제 실패",
|
|
314
|
+
"checkout.payPage.actions.backToAdmin": "관리자로 돌아가기",
|
|
315
|
+
"checkout.payPage.actions.continue": "계속",
|
|
316
|
+
"checkout.payPage.actions.editDetails": "정보 편집",
|
|
317
|
+
"checkout.payPage.actions.payNow": "지금 결제",
|
|
318
|
+
"checkout.payPage.actions.previewDisabled": "미리보기 전용",
|
|
319
|
+
"checkout.payPage.actions.processingPayment": "결제 처리 중...",
|
|
320
|
+
"checkout.payPage.actions.retry": "재시도",
|
|
321
|
+
"checkout.payPage.actions.verifying": "확인 중...",
|
|
322
|
+
"checkout.payPage.badges.preview": "미리보기",
|
|
323
|
+
"checkout.payPage.badges.secure": "보안 체크아웃",
|
|
324
|
+
"checkout.payPage.description.kicker": "상품 개요",
|
|
325
|
+
"checkout.payPage.errors.embeddedUnavailable": "지금은 결제 양식을 사용할 수 없습니다. 다시 시도하거나 호스팅된 결제 페이지를 이용해 주세요.",
|
|
326
|
+
"checkout.payPage.errors.loadMessage": "이 결제 페이지를 불러올 수 없었습니다. 다시 시도해 주세요.",
|
|
327
|
+
"checkout.payPage.errors.loadTitle": "결제 링크를 불러올 수 없음",
|
|
328
|
+
"checkout.payPage.errors.password": "비밀번호를 확인할 수 없습니다. 다시 시도해 주세요.",
|
|
329
|
+
"checkout.payPage.errors.sessionStart": "결제 세션을 시작할 수 없습니다. 다시 시도해 주세요.",
|
|
330
|
+
"checkout.payPage.errors.submit": "결제를 시작할 수 없습니다. 다시 시도해 주세요.",
|
|
331
|
+
"checkout.payPage.fields.booleanFalse": "아니오",
|
|
332
|
+
"checkout.payPage.fields.booleanTrue": "예",
|
|
333
|
+
"checkout.payPage.fields.customAmount": "금액",
|
|
334
|
+
"checkout.payPage.fields.selectPlaceholder": "선택...",
|
|
335
|
+
"checkout.payPage.footer.subtitle": "체크아웃에서 구성된 공개 결제 페이지입니다.",
|
|
336
|
+
"checkout.payPage.header.autoProvider": "체크아웃에서 구성됨",
|
|
337
|
+
"checkout.payPage.header.pageLabel": "페이지",
|
|
338
|
+
"checkout.payPage.header.providerLabel": "게이트웨이",
|
|
339
|
+
"checkout.payPage.help.customerDetails": "구매자 정보를 한 번 입력한 후 결제를 진행하세요.",
|
|
340
|
+
"checkout.payPage.help.legal": "결제 단계를 시작하기 전에 필수 확인 사항에 동의해야 합니다.",
|
|
341
|
+
"checkout.payPage.help.liveHeadline": "검증이 완료되면 이 패널에 제공업체 위젯이 표시됩니다.",
|
|
342
|
+
"checkout.payPage.help.payment": "금액을 선택하고 요약을 확인한 후 보안 결제 단계로 진행하세요.",
|
|
343
|
+
"checkout.payPage.help.previewHeadline": "이것은 결제 흐름의 미리보기입니다.",
|
|
344
|
+
"checkout.payPage.help.productDetails": "이 결제 링크에 대해 구성된 추가 상품 정보입니다.",
|
|
345
|
+
"checkout.payPage.help.providerFallback": "결제 제공업체는 체크아웃 설정에서 구성됩니다.",
|
|
346
|
+
"checkout.payPage.help.providerLine": "제공업체: {provider}.",
|
|
347
|
+
"checkout.payPage.legal.acceptDocument": "{document}에 동의합니다.",
|
|
348
|
+
"checkout.payPage.legal.defaultPrivacyTitle": "개인정보 처리방침",
|
|
349
|
+
"checkout.payPage.legal.defaultTermsTitle": "이용약관",
|
|
350
|
+
"checkout.payPage.legal.readDocument": "문서 읽기",
|
|
351
|
+
"checkout.payPage.loading": "결제 링크를 불러오는 중...",
|
|
352
|
+
"checkout.payPage.passwordPlaceholder": "비밀번호",
|
|
353
|
+
"checkout.payPage.payment.kicker": "결제 수단",
|
|
354
|
+
"checkout.payPage.payment.liveState": "준비됨",
|
|
355
|
+
"checkout.payPage.payment.previewState": "청구 없음",
|
|
356
|
+
"checkout.payPage.payment.providerHint": "결제는 {provider}에서 처리됩니다.",
|
|
357
|
+
"checkout.payPage.previewBanner": "미리보기 모드입니다. 결제가 비활성화되어 있습니다.",
|
|
358
|
+
"checkout.payPage.pricing.kicker": "결제 설정",
|
|
359
|
+
"checkout.payPage.pricing.title": "결제 방법을 선택하세요",
|
|
360
|
+
"checkout.payPage.protectedTitle": "보호된 결제 링크",
|
|
361
|
+
"checkout.payPage.sections.customerDetails": "고객 정보",
|
|
362
|
+
"checkout.payPage.sections.legal": "법적 동의",
|
|
363
|
+
"checkout.payPage.sections.payment": "결제",
|
|
364
|
+
"checkout.payPage.sections.productDetails": "상품 정보",
|
|
365
|
+
"checkout.payPage.summary.amountDue": "청구 금액",
|
|
366
|
+
"checkout.payPage.summary.awaitingSelection": "금액을 선택하세요",
|
|
367
|
+
"checkout.payPage.summary.checkoutLabel": "체크아웃",
|
|
368
|
+
"checkout.payPage.summary.liveState": "실시간",
|
|
369
|
+
"checkout.payPage.summary.previewState": "미리보기",
|
|
370
|
+
"checkout.payPage.summary.providerLabel": "제공업체",
|
|
371
|
+
"checkout.payPage.unavailable": "이 결제 링크는 더 이상 사용할 수 없습니다.",
|
|
372
|
+
"checkout.payPage.validation.amountMax": "{amount} 이하로 입력하세요.",
|
|
373
|
+
"checkout.payPage.validation.amountMin": "{amount} 이상으로 입력하세요.",
|
|
374
|
+
"checkout.payPage.validation.amountRequired": "계속하려면 금액을 입력하세요.",
|
|
375
|
+
"checkout.payPage.validation.documentRequired": "계속하려면 {field}에 동의하세요.",
|
|
376
|
+
"checkout.payPage.validation.fixErrors": "강조 표시된 필드를 확인하고 다시 시도하세요.",
|
|
377
|
+
"checkout.payPage.validation.invalidEmail": "유효한 이메일 주소를 입력하세요.",
|
|
378
|
+
"checkout.payPage.validation.invalidPhone": "유효한 전화번호를 입력하세요.",
|
|
379
|
+
"checkout.payPage.validation.labels.option": "결제 옵션",
|
|
380
|
+
"checkout.payPage.validation.priceSelectionRequired": "계속하려면 결제 옵션을 선택하세요.",
|
|
381
|
+
"checkout.payPage.validation.requiredField": "{field}을(를) 입력하세요.",
|
|
382
|
+
"checkout.payPage.validation.thisField": "이 필드",
|
|
383
|
+
"checkout.search.subtitle.linkTemplate": "링크 템플릿",
|
|
384
|
+
"checkout.statusPage.backToPayment": "결제 페이지로 돌아가기",
|
|
385
|
+
"checkout.statusPage.cancel.cancelled": "결제 취소됨",
|
|
386
|
+
"checkout.statusPage.cancel.failed": "결제 실패",
|
|
387
|
+
"checkout.statusPage.cancel.message": "결제가 완료되기 전에 취소되었습니다. 언제든지 결제 페이지로 돌아갈 수 있습니다.",
|
|
388
|
+
"checkout.statusPage.checking": "결제 상태 확인 중…",
|
|
389
|
+
"checkout.statusPage.currentStatus": "현재 상태: {status}",
|
|
390
|
+
"checkout.statusPage.defaultLinkTitle": "이 결제",
|
|
391
|
+
"checkout.statusPage.error.message": "결제를 완료할 수 없었습니다. 다시 시도하거나 다른 결제 수단을 사용해 주세요.",
|
|
392
|
+
"checkout.statusPage.processing.message": "결제 제공업체로부터 최종 업데이트를 기다리는 중입니다.",
|
|
393
|
+
"checkout.statusPage.status.cancelled": "취소됨",
|
|
394
|
+
"checkout.statusPage.status.completed": "완료됨",
|
|
395
|
+
"checkout.statusPage.status.expired": "만료됨",
|
|
396
|
+
"checkout.statusPage.status.failed": "실패",
|
|
397
|
+
"checkout.statusPage.status.pending": "대기 중",
|
|
398
|
+
"checkout.statusPage.status.processing": "처리 중",
|
|
399
|
+
"checkout.statusPage.success.completed": "결제 완료됨",
|
|
400
|
+
"checkout.statusPage.success.message": "{linkTitle}에 대한 결제가 확인되었습니다.",
|
|
401
|
+
"checkout.statusPage.success.processing": "결제 처리 중",
|
|
402
|
+
"checkout.systemEmails.common.customerFallback": "고객",
|
|
403
|
+
"checkout.systemEmails.common.linkTitleFallback": "결제",
|
|
404
|
+
"checkout.systemEmails.error.greeting": "안녕하세요 {firstName}님, 안타깝게도 {linkTitle}에 대한 결제를 처리하지 못했습니다.",
|
|
405
|
+
"checkout.systemEmails.error.hint": "계정에 청구된 금액은 없습니다.",
|
|
406
|
+
"checkout.systemEmails.error.preview": "{linkTitle}에 대한 결제를 처리하지 못했습니다",
|
|
407
|
+
"checkout.systemEmails.error.retry": "다시 시도하거나 다른 결제 수단을 사용해 주세요. 문제가 계속되면 고객 지원팀에 문의하세요.",
|
|
408
|
+
"checkout.systemEmails.error.subject": "결제 실패 - {linkTitle}",
|
|
409
|
+
"checkout.systemEmails.error.title": "결제 실패",
|
|
410
|
+
"checkout.systemEmails.start.greeting": "안녕하세요 {firstName}님, {linkTitle}에 대한 결제가 시작되었습니다.",
|
|
411
|
+
"checkout.systemEmails.start.hint": "이 결제를 시작하지 않으셨다면 고객 지원팀에 문의하세요.",
|
|
412
|
+
"checkout.systemEmails.start.message": "결제를 처리하고 있습니다. 완료되면 확인 메일을 받으실 수 있습니다.",
|
|
413
|
+
"checkout.systemEmails.start.preview": "{amount} {currencyCode} 결제가 처리되고 있습니다",
|
|
414
|
+
"checkout.systemEmails.start.subject": "결제 시작 - {linkTitle}",
|
|
415
|
+
"checkout.systemEmails.start.title": "결제 시작됨",
|
|
416
|
+
"checkout.systemEmails.success.greeting": "안녕하세요 {firstName}님, {linkTitle}에 대한 결제가 성공적으로 완료되었습니다.",
|
|
417
|
+
"checkout.systemEmails.success.hint": "이 이메일을 기록용으로 보관해 주세요.",
|
|
418
|
+
"checkout.systemEmails.success.preview": "{amount} {currencyCode} 결제가 완료되었습니다",
|
|
419
|
+
"checkout.systemEmails.success.receipt": "결제해 주셔서 감사합니다. 이 이메일은 영수증 역할을 합니다.",
|
|
420
|
+
"checkout.systemEmails.success.subject": "결제 완료 - {linkTitle}",
|
|
421
|
+
"checkout.systemEmails.success.title": "결제 완료",
|
|
422
|
+
"checkout.systemEmails.success.transactionLabel": "거래",
|
|
423
|
+
"checkout.template.created": "템플릿이 생성됨",
|
|
424
|
+
"checkout.template.deleted": "템플릿이 삭제됨",
|
|
425
|
+
"checkout.template.updated": "템플릿이 업데이트됨",
|
|
426
|
+
"checkout.transaction.cancelled": "거래 취소됨",
|
|
427
|
+
"checkout.transaction.completed": "거래 완료됨",
|
|
428
|
+
"checkout.transaction.created": "거래 생성됨",
|
|
429
|
+
"checkout.transaction.customerDataCaptured": "고객 데이터 캡처됨",
|
|
430
|
+
"checkout.transaction.expired": "거래 만료됨",
|
|
431
|
+
"checkout.transaction.failed": "거래 실패",
|
|
432
|
+
"checkout.transaction.sessionStarted": "결제 세션 시작됨",
|
|
433
|
+
"checkout.validation.common.integer": "정수를 입력하세요.",
|
|
434
|
+
"checkout.validation.common.invalidColor": "#RRGGBB 형식의 유효한 16진수 색상을 입력하세요.",
|
|
435
|
+
"checkout.validation.common.invalidCurrencyCode": "유효한 3자리 통화 코드를 입력하세요.",
|
|
436
|
+
"checkout.validation.common.invalidFieldsetCode": "유효한 필드셋 코드를 입력하세요.",
|
|
437
|
+
"checkout.validation.common.invalidNumber": "유효한 숫자를 입력하세요.",
|
|
438
|
+
"checkout.validation.common.invalidUrl": "유효한 URL을 입력하세요.",
|
|
439
|
+
"checkout.validation.common.invalidUuid": "유효한 식별자를 입력하세요.",
|
|
440
|
+
"checkout.validation.common.nonNegativeInteger": "0 이상의 정수를 입력하세요.",
|
|
441
|
+
"checkout.validation.common.nonNegativeNumber": "0 이상의 숫자를 입력하세요.",
|
|
442
|
+
"checkout.validation.common.positiveInteger": "0보다 큰 정수를 입력하세요.",
|
|
443
|
+
"checkout.validation.common.required": "이 필드는 필수입니다.",
|
|
444
|
+
"checkout.validation.customAmount.range": "최대 금액은 최소 금액보다 크거나 같아야 합니다.",
|
|
445
|
+
"checkout.validation.customAmountCurrencyCode.required": "사용자 지정 금액 가격 책정에는 통화가 필요합니다.",
|
|
446
|
+
"checkout.validation.customAmountMax.required": "최대 금액은 필수입니다.",
|
|
447
|
+
"checkout.validation.customAmountMin.required": "최소 금액은 필수입니다.",
|
|
448
|
+
"checkout.validation.customerFields.key.invalid": "문자로 시작하는 카멜케이스를 사용하세요.",
|
|
449
|
+
"checkout.validation.fixedPriceAmount.required": "고정 가격 책정에는 금액이 필요합니다.",
|
|
450
|
+
"checkout.validation.fixedPriceCurrencyCode.required": "고정 가격 책정에는 통화가 필요합니다.",
|
|
451
|
+
"checkout.validation.gatewayProviderKey.disabled": "이 게이트웨이 제공업체는 연동에서 비활성화되어 있습니다.",
|
|
452
|
+
"checkout.validation.gatewayProviderKey.notConfigured": "이 게이트웨이 제공업체는 연동에서 구성되지 않았습니다.",
|
|
453
|
+
"checkout.validation.gatewayProviderKey.required": "게이트웨이 제공업체는 필수입니다.",
|
|
454
|
+
"checkout.validation.name.required": "이름은 필수입니다.",
|
|
455
|
+
"checkout.validation.priceListItems.required": "가격표 항목을 하나 이상 추가하세요.",
|
|
456
|
+
"checkout.validation.priceListItems.singleCurrency": "모든 가격표 항목은 동일한 통화를 사용해야 합니다.",
|
|
457
|
+
"checkout.widgets.gatewayTransactionLink.actions.openPayPage": "결제 페이지 열기",
|
|
458
|
+
"checkout.widgets.gatewayTransactionLink.actions.openTransaction": "거래 열기",
|
|
459
|
+
"checkout.widgets.gatewayTransactionLink.labels.link": "링크",
|
|
460
|
+
"checkout.widgets.gatewayTransactionLink.labels.transactionId": "거래 ID",
|
|
461
|
+
"checkout.widgets.gatewayTransactionLink.title": "체크아웃 거래",
|
|
462
|
+
"checkout.widgets.paymentGatewayToolbarLink.action": "결제 링크 생성"
|
|
463
|
+
}
|