@open-mercato/checkout 0.6.5-develop.4544.1.71c003c861 → 0.6.5-develop.4559.1.839e136509

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.
@@ -1,2 +1,2 @@
1
- [build:checkout] found 148 entry points
1
+ [build:checkout] found 149 entry points
2
2
  [build:checkout] built successfully
@@ -0,0 +1,118 @@
1
+ import { expect, test } from "@playwright/test";
2
+ import { getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
3
+ import { readJsonSafe } from "@open-mercato/core/modules/core/__integration__/helpers/generalFixtures";
4
+ import {
5
+ createFixedTemplateInput,
6
+ createLinkFixture,
7
+ createTemplateFixture,
8
+ deleteCheckoutEntityIfExists,
9
+ readLink,
10
+ readTemplate,
11
+ updateLink,
12
+ updateTemplate
13
+ } from "./helpers/fixtures.js";
14
+ test.describe("TC-CHKT-039: Draft template/pay-link edits tolerate a null gateway provider (issue #2505)", () => {
15
+ test("template: clearing the gateway provider on a draft saves and round-trips as null", async ({ request }) => {
16
+ let token = null;
17
+ let templateId = null;
18
+ try {
19
+ token = await getAuthToken(request);
20
+ templateId = await createTemplateFixture(request, token, createFixedTemplateInput({ status: "draft" }));
21
+ const clearResponse = await updateTemplate(request, token, templateId, {
22
+ name: "Consulting Fee (no gateway)",
23
+ pricingMode: "fixed",
24
+ fixedPriceAmount: 49.99,
25
+ fixedPriceCurrencyCode: "USD",
26
+ status: "draft",
27
+ gatewayProviderKey: null
28
+ });
29
+ expect(
30
+ clearResponse.ok(),
31
+ `Clearing the gateway on a draft template should succeed: ${clearResponse.status()} ${JSON.stringify(await readJsonSafe(clearResponse))}`
32
+ ).toBeTruthy();
33
+ const cleared = await readTemplate(request, token, templateId);
34
+ expect(cleared.gatewayProviderKey ?? null).toBeNull();
35
+ expect(cleared.name).toBe("Consulting Fee (no gateway)");
36
+ const renameResponse = await updateTemplate(request, token, templateId, {
37
+ name: "Consulting Fee renamed",
38
+ gatewayProviderKey: null
39
+ });
40
+ expect(
41
+ renameResponse.ok(),
42
+ `Editing a field on a gateway-less draft template should succeed: ${renameResponse.status()} ${JSON.stringify(await readJsonSafe(renameResponse))}`
43
+ ).toBeTruthy();
44
+ const renamed = await readTemplate(request, token, templateId);
45
+ expect(renamed.gatewayProviderKey ?? null).toBeNull();
46
+ expect(renamed.name).toBe("Consulting Fee renamed");
47
+ const blankResponse = await updateTemplate(request, token, templateId, {
48
+ gatewayProviderKey: " "
49
+ });
50
+ expect(
51
+ blankResponse.ok(),
52
+ `A blank gateway should normalize to null on a draft template: ${blankResponse.status()} ${JSON.stringify(await readJsonSafe(blankResponse))}`
53
+ ).toBeTruthy();
54
+ const blanked = await readTemplate(request, token, templateId);
55
+ expect(blanked.gatewayProviderKey ?? null).toBeNull();
56
+ } finally {
57
+ await deleteCheckoutEntityIfExists(request, token, "templates", templateId);
58
+ }
59
+ });
60
+ test("pay-link: clearing the gateway provider on a draft saves and round-trips as null", async ({ request }) => {
61
+ let token = null;
62
+ let linkId = null;
63
+ try {
64
+ token = await getAuthToken(request);
65
+ const link = await createLinkFixture(request, token, createFixedTemplateInput({ status: "draft" }));
66
+ linkId = link.id;
67
+ const clearResponse = await updateLink(request, token, link.id, {
68
+ name: "Pay link (no gateway)",
69
+ pricingMode: "fixed",
70
+ fixedPriceAmount: 49.99,
71
+ fixedPriceCurrencyCode: "USD",
72
+ status: "draft",
73
+ gatewayProviderKey: null
74
+ });
75
+ expect(
76
+ clearResponse.ok(),
77
+ `Clearing the gateway on a draft pay-link should succeed: ${clearResponse.status()} ${JSON.stringify(await readJsonSafe(clearResponse))}`
78
+ ).toBeTruthy();
79
+ const cleared = await readLink(request, token, link.id);
80
+ expect(cleared.gatewayProviderKey ?? null).toBeNull();
81
+ expect(cleared.name).toBe("Pay link (no gateway)");
82
+ const renameResponse = await updateLink(request, token, link.id, {
83
+ name: "Pay link renamed",
84
+ gatewayProviderKey: null
85
+ });
86
+ expect(
87
+ renameResponse.ok(),
88
+ `Editing a field on a gateway-less draft pay-link should succeed: ${renameResponse.status()} ${JSON.stringify(await readJsonSafe(renameResponse))}`
89
+ ).toBeTruthy();
90
+ const renamed = await readLink(request, token, link.id);
91
+ expect(renamed.gatewayProviderKey ?? null).toBeNull();
92
+ expect(renamed.name).toBe("Pay link renamed");
93
+ } finally {
94
+ await deleteCheckoutEntityIfExists(request, token, "links", linkId);
95
+ }
96
+ });
97
+ test("pay-link: publishing still requires a gateway provider", async ({ request }) => {
98
+ let token = null;
99
+ let linkId = null;
100
+ try {
101
+ token = await getAuthToken(request);
102
+ const link = await createLinkFixture(request, token, createFixedTemplateInput({ status: "draft" }));
103
+ linkId = link.id;
104
+ const publishResponse = await updateLink(request, token, link.id, {
105
+ status: "active",
106
+ gatewayProviderKey: null
107
+ });
108
+ expect([400, 422]).toContain(publishResponse.status());
109
+ const body = await readJsonSafe(publishResponse);
110
+ const fieldError = typeof body?.fieldErrors?.gatewayProviderKey === "string" ? body.fieldErrors.gatewayProviderKey : "";
111
+ const errorMessage = typeof body?.error === "string" ? body.error : "";
112
+ expect(`${fieldError} ${errorMessage}`.toLowerCase()).toContain("gateway");
113
+ } finally {
114
+ await deleteCheckoutEntityIfExists(request, token, "links", linkId);
115
+ }
116
+ });
117
+ });
118
+ //# sourceMappingURL=TC-CHKT-039-null-gateway-edit.spec.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/checkout/__integration__/TC-CHKT-039-null-gateway-edit.spec.ts"],
4
+ "sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'\nimport { readJsonSafe } from '@open-mercato/core/modules/core/__integration__/helpers/generalFixtures'\nimport {\n createFixedTemplateInput,\n createLinkFixture,\n createTemplateFixture,\n deleteCheckoutEntityIfExists,\n readLink,\n readTemplate,\n updateLink,\n updateTemplate,\n} from './helpers/fixtures'\n\ntest.describe('TC-CHKT-039: Draft template/pay-link edits tolerate a null gateway provider (issue #2505)', () => {\n test('template: clearing the gateway provider on a draft saves and round-trips as null', async ({ request }) => {\n let token: string | null = null\n let templateId: string | null = null\n\n try {\n token = await getAuthToken(request)\n templateId = await createTemplateFixture(request, token, createFixedTemplateInput({ status: 'draft' }))\n\n const clearResponse = await updateTemplate(request, token, templateId, {\n name: 'Consulting Fee (no gateway)',\n pricingMode: 'fixed',\n fixedPriceAmount: 49.99,\n fixedPriceCurrencyCode: 'USD',\n status: 'draft',\n gatewayProviderKey: null,\n })\n expect(\n clearResponse.ok(),\n `Clearing the gateway on a draft template should succeed: ${clearResponse.status()} ${JSON.stringify(await readJsonSafe(clearResponse))}`,\n ).toBeTruthy()\n\n const cleared = await readTemplate(request, token, templateId)\n expect(cleared.gatewayProviderKey ?? null).toBeNull()\n expect(cleared.name).toBe('Consulting Fee (no gateway)')\n\n const renameResponse = await updateTemplate(request, token, templateId, {\n name: 'Consulting Fee renamed',\n gatewayProviderKey: null,\n })\n expect(\n renameResponse.ok(),\n `Editing a field on a gateway-less draft template should succeed: ${renameResponse.status()} ${JSON.stringify(await readJsonSafe(renameResponse))}`,\n ).toBeTruthy()\n\n const renamed = await readTemplate(request, token, templateId)\n expect(renamed.gatewayProviderKey ?? null).toBeNull()\n expect(renamed.name).toBe('Consulting Fee renamed')\n\n const blankResponse = await updateTemplate(request, token, templateId, {\n gatewayProviderKey: ' ',\n })\n expect(\n blankResponse.ok(),\n `A blank gateway should normalize to null on a draft template: ${blankResponse.status()} ${JSON.stringify(await readJsonSafe(blankResponse))}`,\n ).toBeTruthy()\n\n const blanked = await readTemplate(request, token, templateId)\n expect(blanked.gatewayProviderKey ?? null).toBeNull()\n } finally {\n await deleteCheckoutEntityIfExists(request, token, 'templates', templateId)\n }\n })\n\n test('pay-link: clearing the gateway provider on a draft saves and round-trips as null', async ({ request }) => {\n let token: string | null = null\n let linkId: string | null = null\n\n try {\n token = await getAuthToken(request)\n const link = await createLinkFixture(request, token, createFixedTemplateInput({ status: 'draft' }))\n linkId = link.id\n\n const clearResponse = await updateLink(request, token, link.id, {\n name: 'Pay link (no gateway)',\n pricingMode: 'fixed',\n fixedPriceAmount: 49.99,\n fixedPriceCurrencyCode: 'USD',\n status: 'draft',\n gatewayProviderKey: null,\n })\n expect(\n clearResponse.ok(),\n `Clearing the gateway on a draft pay-link should succeed: ${clearResponse.status()} ${JSON.stringify(await readJsonSafe(clearResponse))}`,\n ).toBeTruthy()\n\n const cleared = await readLink(request, token, link.id)\n expect(cleared.gatewayProviderKey ?? null).toBeNull()\n expect(cleared.name).toBe('Pay link (no gateway)')\n\n const renameResponse = await updateLink(request, token, link.id, {\n name: 'Pay link renamed',\n gatewayProviderKey: null,\n })\n expect(\n renameResponse.ok(),\n `Editing a field on a gateway-less draft pay-link should succeed: ${renameResponse.status()} ${JSON.stringify(await readJsonSafe(renameResponse))}`,\n ).toBeTruthy()\n\n const renamed = await readLink(request, token, link.id)\n expect(renamed.gatewayProviderKey ?? null).toBeNull()\n expect(renamed.name).toBe('Pay link renamed')\n } finally {\n await deleteCheckoutEntityIfExists(request, token, 'links', linkId)\n }\n })\n\n test('pay-link: publishing still requires a gateway provider', async ({ request }) => {\n let token: string | null = null\n let linkId: string | null = null\n\n try {\n token = await getAuthToken(request)\n const link = await createLinkFixture(request, token, createFixedTemplateInput({ status: 'draft' }))\n linkId = link.id\n\n const publishResponse = await updateLink(request, token, link.id, {\n status: 'active',\n gatewayProviderKey: null,\n })\n expect([400, 422]).toContain(publishResponse.status())\n const body = await readJsonSafe<{ error?: string; fieldErrors?: { gatewayProviderKey?: string } }>(publishResponse)\n const fieldError = typeof body?.fieldErrors?.gatewayProviderKey === 'string' ? body.fieldErrors.gatewayProviderKey : ''\n const errorMessage = typeof body?.error === 'string' ? body.error : ''\n expect(`${fieldError} ${errorMessage}`.toLowerCase()).toContain('gateway')\n } finally {\n await deleteCheckoutEntityIfExists(request, token, 'links', linkId)\n }\n })\n})\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -205,6 +205,7 @@ function normalizeFormValues(value, t) {
205
205
  primaryColor: readString(source.primaryColor).trim() || defaults.primaryColor,
206
206
  secondaryColor: readString(source.secondaryColor).trim() || defaults.secondaryColor,
207
207
  backgroundColor: readString(source.backgroundColor).trim() || defaults.backgroundColor,
208
+ gatewayProviderKey: readString(source.gatewayProviderKey).trim(),
208
209
  gatewaySettings: isRecord(source.gatewaySettings) ? source.gatewaySettings : {},
209
210
  customFieldsetCode: readString(source.customFieldsetCode).trim() || null,
210
211
  collectCustomerDetails: readBoolean(source.collectCustomerDetails, true),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/checkout/components/LinkTemplateForm.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams } from 'next/navigation'\nimport { useT, type TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport {\n AlertTriangle,\n BadgeCheck,\n CircleDollarSign,\n Eye,\n FileCheck2,\n FileText,\n IdCard,\n MessageSquare,\n Plus,\n Send,\n Shield,\n Sparkles,\n Trash2,\n WalletCards,\n} from 'lucide-react'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport { CrudForm, type CrudField, type CrudFormGroup, type CrudFormGroupComponentProps } from '@open-mercato/ui/backend/CrudForm'\nimport { ComboboxInput, type ComboboxOption } from '@open-mercato/ui/backend/inputs'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { SwitchableMarkdownInput } from '@open-mercato/ui/backend/inputs'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ColorPicker } from '@open-mercato/ui/primitives/color-picker'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { PasswordInput } from '@open-mercato/ui/primitives/password-input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { CHECKOUT_ENTITY_IDS } from '../lib/constants'\nimport { getLocalizedDefaultCheckoutCustomerFields } from '../lib/defaults'\nimport type { CustomerFieldDefinitionInput, PriceListItemInput } from '../data/validators'\nimport { getGatewayProviderConfigurationMessageKey } from '../lib/gatewayProviderAvailability'\nimport { readCustomerFieldsSectionError } from '../lib/customerFieldErrors'\nimport { CheckoutCurrencySelect } from './CheckoutCurrencySelect'\nimport { CustomerFieldsEditor } from './CustomerFieldsEditor'\nimport { GatewaySettingsFields } from './GatewaySettingsFields'\nimport { LogoUploadField } from './LogoUploadField'\n\ntype Props = {\n mode: 'link' | 'template'\n recordId?: string\n}\n\ntype FormValues = Record<string, unknown>\n\ntype ProviderDescriptor = {\n providerKey: string\n label: string\n isConfigured?: boolean\n requiresConfiguration?: boolean\n configurationStatus?: 'configured' | 'missing_credentials' | 'disabled' | 'unmanaged' | null\n}\n\ntype TemplateSummary = {\n id: string\n name: string\n title?: string | null\n pricingMode?: string | null\n gatewayProviderKey?: string | null\n}\n\ntype LegalDocumentValue = {\n title: string\n markdown: string\n required: boolean\n}\n\ntype LegalDocumentsValue = {\n terms: LegalDocumentValue\n privacyPolicy: LegalDocumentValue\n}\n\ntype PriceListItem = PriceListItemInput\n\nconst DEFAULT_COLORS = {\n primaryColor: '#1E3A8A',\n secondaryColor: '#F59E0B',\n backgroundColor: '#F8F4EE',\n} as const\n\nconst SETTINGS_TABS_LIST_CLASS = 'h-auto w-full justify-start overflow-x-auto rounded-none border-b border-border bg-transparent p-0'\nconst SETTINGS_TABS_TRIGGER_CLASS = 'mr-8 h-auto rounded-none border-b-2 border-transparent bg-transparent px-0 py-2.5 text-sm font-medium text-muted-foreground shadow-none transition-colors hover:bg-transparent hover:text-foreground aria-selected:border-accent-indigo aria-selected:bg-transparent aria-selected:text-foreground aria-selected:shadow-none last:mr-0'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction readNumberInputValue(value: unknown): string {\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n if (typeof value === 'string') return value\n return ''\n}\n\nfunction readBoolean(value: unknown, fallback = false): boolean {\n return typeof value === 'boolean' ? value : fallback\n}\n\nfunction cloneDefaultCustomerFields(t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return getLocalizedDefaultCheckoutCustomerFields(t).map((field) => ({\n ...field,\n placeholder: typeof field.placeholder === 'string' ? field.placeholder : undefined,\n }))\n}\n\nfunction createDefaultLegalDocuments(): LegalDocumentsValue {\n return {\n terms: { title: '', markdown: '', required: false },\n privacyPolicy: { title: '', markdown: '', required: false },\n }\n}\n\nfunction createDefaultValues(t?: TranslateFn): FormValues {\n return {\n name: '',\n title: '',\n subtitle: '',\n description: '',\n slug: '',\n logoAttachmentId: null,\n logoUrl: null,\n ...DEFAULT_COLORS,\n themeMode: 'auto',\n displayCustomFieldsOnPage: false,\n pricingMode: 'fixed',\n fixedPriceAmount: null,\n fixedPriceCurrencyCode: 'USD',\n fixedPriceIncludesTax: true,\n fixedPriceOriginalAmount: null,\n customAmountMin: null,\n customAmountMax: null,\n customAmountCurrencyCode: 'USD',\n priceListItems: [],\n gatewayProviderKey: '',\n gatewaySettings: {},\n templateId: null,\n customFieldsetCode: null,\n collectCustomerDetails: true,\n customerFieldsSchema: cloneDefaultCustomerFields(t),\n legalDocuments: createDefaultLegalDocuments(),\n status: 'draft',\n maxCompletions: null,\n password: '',\n successTitle: '',\n successMessage: '',\n cancelTitle: '',\n cancelMessage: '',\n errorTitle: '',\n errorMessage: '',\n startEmailSubject: '',\n startEmailBody: '',\n sendStartEmail: true,\n successEmailSubject: '',\n successEmailBody: '',\n sendSuccessEmail: true,\n errorEmailSubject: '',\n errorEmailBody: '',\n sendErrorEmail: true,\n }\n}\n\nfunction normalizePriceListItems(value: unknown): PriceListItem[] {\n if (!Array.isArray(value)) return []\n return value\n .map((item) => {\n if (!isRecord(item)) return null\n const id = readString(item.id).trim()\n const description = readString(item.description)\n const amount = Number(item.amount ?? 0)\n const currencyCode = readString(item.currencyCode).trim().toUpperCase()\n return {\n id: id || `item_${Date.now()}`,\n description,\n amount: Number.isFinite(amount) ? amount : 0,\n currencyCode: currencyCode || 'USD',\n }\n })\n .filter((item): item is PriceListItem => item !== null)\n}\n\nfunction normalizeCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n if (!Array.isArray(value)) return cloneDefaultCustomerFields(t)\n return value.reduce<CustomerFieldDefinitionInput[]>((result, field, index) => {\n if (!isRecord(field)) return result\n const key = readString(field.key).trim()\n const label = readString(field.label).trim()\n const kind = readString(field.kind)\n if (!key || !label) return result\n if (!['text', 'multiline', 'boolean', 'select', 'radio'].includes(kind)) return result\n const options = Array.isArray(field.options)\n ? field.options.reduce<Array<{ value: string; label: string }>>((optionResult, option) => {\n if (!isRecord(option)) return optionResult\n const valuePart = readString(option.value).trim()\n const labelPart = readString(option.label).trim()\n if (!valuePart || !labelPart) return optionResult\n optionResult.push({ value: valuePart, label: labelPart })\n return optionResult\n }, [])\n : []\n result.push({\n key,\n label,\n kind: kind as CustomerFieldDefinitionInput['kind'],\n required: readBoolean(field.required),\n fixed: readBoolean(field.fixed),\n placeholder: readString(field.placeholder).trim() || undefined,\n options,\n sortOrder: typeof field.sortOrder === 'number' ? field.sortOrder : index,\n })\n return result\n }, [])\n}\n\nfunction readCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return Array.isArray(value) ? value as CustomerFieldDefinitionInput[] : cloneDefaultCustomerFields(t)\n}\n\nfunction normalizeLegalDocuments(value: unknown): LegalDocumentsValue {\n const defaults = createDefaultLegalDocuments()\n if (!isRecord(value)) return defaults\n const normalizeDocument = (raw: unknown, fallback: LegalDocumentValue): LegalDocumentValue => {\n if (!isRecord(raw)) return fallback\n return {\n title: readString(raw.title),\n markdown: readString(raw.markdown),\n required: readBoolean(raw.required),\n }\n }\n return {\n terms: normalizeDocument(value.terms, defaults.terms),\n privacyPolicy: normalizeDocument(value.privacyPolicy, defaults.privacyPolicy),\n }\n}\n\nfunction normalizeFormValues(value: FormValues | null | undefined, t?: TranslateFn): FormValues {\n const defaults = createDefaultValues(t)\n const source = isRecord(value) ? value : {}\n const customFields = isRecord(source.customFields) ? source.customFields : {}\n\n const prefixedCustomFieldValues = Object.fromEntries(\n Object.entries(customFields).map(([key, fieldValue]) => [`cf_${key}`, fieldValue]),\n )\n\n return {\n ...defaults,\n ...source,\n ...prefixedCustomFieldValues,\n logoAttachmentId: readString(source.logoAttachmentId).trim() || null,\n logoUrl: readString(source.logoUrl).trim() || null,\n primaryColor: readString(source.primaryColor).trim() || defaults.primaryColor,\n secondaryColor: readString(source.secondaryColor).trim() || defaults.secondaryColor,\n backgroundColor: readString(source.backgroundColor).trim() || defaults.backgroundColor,\n gatewaySettings: isRecord(source.gatewaySettings) ? source.gatewaySettings : {},\n customFieldsetCode: readString(source.customFieldsetCode).trim() || null,\n collectCustomerDetails: readBoolean(source.collectCustomerDetails, true),\n customerFieldsSchema: normalizeCustomerFields(source.customerFieldsSchema, t),\n legalDocuments: normalizeLegalDocuments(source.legalDocuments),\n priceListItems: normalizePriceListItems(source.priceListItems),\n fixedPriceCurrencyCode: readString(source.fixedPriceCurrencyCode).trim().toUpperCase() || 'USD',\n customAmountCurrencyCode: readString(source.customAmountCurrencyCode).trim().toUpperCase() || 'USD',\n sendStartEmail: readBoolean(source.sendStartEmail, true),\n sendSuccessEmail: readBoolean(source.sendSuccessEmail, true),\n sendErrorEmail: readBoolean(source.sendErrorEmail, true),\n }\n}\n\nfunction readError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n if (errors[path]) return errors[path]\n const prefix = `${path}.`\n const nestedEntry = Object.entries(errors).find(([key]) => key.startsWith(prefix))\n return nestedEntry?.[1]\n}\n\nfunction readDirectError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n return errors[path]\n}\n\nfunction readAnyError(errors: Record<string, string>, ...paths: string[]): string | undefined {\n for (const path of paths) {\n const error = readError(errors, path)\n if (error) return error\n }\n return undefined\n}\n\nfunction toTemplateOption(template: TemplateSummary): ComboboxOption {\n const title = typeof template.title === 'string' ? template.title.trim() : ''\n const provider = typeof template.gatewayProviderKey === 'string' ? template.gatewayProviderKey.trim() : ''\n const parts = [title, provider].filter((part) => part.length > 0)\n return {\n value: template.id,\n label: template.name,\n description: parts.length > 0 ? parts.join(' \u2022 ') : null,\n }\n}\n\nfunction errorInputClassName(error?: string): string | undefined {\n return error ? 'border-destructive aria-invalid:ring-destructive' : undefined\n}\n\nfunction SectionLabel({\n label,\n hint,\n error,\n required,\n children,\n}: {\n label: string\n hint?: string\n error?: string\n required?: boolean\n children: React.ReactNode\n}) {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <Label className=\"gap-0\">\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </Label>\n {hint ? <p className=\"text-xs text-muted-foreground\">{hint}</p> : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n {children}\n </div>\n )\n}\n\nfunction ColorField({\n label,\n value,\n onChange,\n error,\n}: {\n label: string\n value: string\n onChange: (next: string) => void\n error?: string\n}) {\n const pickerValue = /^#([0-9a-fA-F]{6})$/.test(value) ? value : '#000000'\n return (\n <SectionLabel label={label} error={error}>\n <div className=\"flex items-center gap-3\">\n <ColorPicker\n value={pickerValue}\n onChange={(next) => onChange(next.toUpperCase())}\n aria-label={label}\n />\n <Input\n value={value}\n onChange={(event) => onChange(event.target.value.toUpperCase())}\n placeholder=\"#1E3A8A\"\n className={error ? `min-w-0 ${errorInputClassName(error)}` : 'min-w-0'}\n aria-invalid={Boolean(error)}\n />\n </div>\n </SectionLabel>\n )\n}\n\nfunction PriceListEditor({\n value,\n onChange,\n error,\n}: {\n value: PriceListItem[]\n onChange: (next: PriceListItem[]) => void\n error?: string\n}) {\n const t = useT()\n const items = Array.isArray(value) ? value : []\n\n const updateItem = React.useCallback(\n (index: number, patch: Partial<PriceListItem>) => {\n onChange(items.map((item, currentIndex) => (currentIndex === index ? { ...item, ...patch } : item)))\n },\n [items, onChange],\n )\n\n const addItem = React.useCallback(() => {\n onChange([\n ...items,\n {\n id: `item_${items.length + 1}`,\n description: '',\n amount: 0,\n currencyCode: items[0]?.currencyCode ?? 'USD',\n },\n ])\n }, [items, onChange])\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.singleCurrency')}\n </AlertDescription>\n </Alert>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"overflow-hidden rounded-xl border border-border/70 bg-background\">\n {items.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] table-fixed\">\n <thead className=\"border-b bg-muted/30\">\n <tr className=\"text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2 w-[22%]\">{t('checkout.linkTemplateForm.priceList.columns.itemCode')}</th>\n <th className=\"px-3 py-2\">{t('checkout.linkTemplateForm.priceList.columns.description')}</th>\n <th className=\"px-3 py-2 w-[16%]\">{t('checkout.linkTemplateForm.priceList.columns.amount')}</th>\n <th className=\"px-3 py-2 w-[24%]\">{t('checkout.linkTemplateForm.priceList.columns.currency')}</th>\n <th className=\"px-3 py-2 w-[110px] text-right\">{t('checkout.linkTemplateForm.priceList.columns.actions')}</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/70\">\n {items.map((item, index) => (\n <tr key={`${item.id}:${index}`} className=\"align-top\">\n <td className=\"px-3 py-2\">\n <Input\n value={item.id}\n onChange={(event) => updateItem(index, { id: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.itemCode')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.itemCode', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={item.description}\n onChange={(event) => updateItem(index, { description: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.description')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.description', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={item.amount}\n onChange={(event) => updateItem(index, { amount: Number(event.target.value) })}\n placeholder=\"0.00\"\n aria-label={t('checkout.linkTemplateForm.priceList.aria.amount', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <CheckoutCurrencySelect\n value={item.currencyCode}\n onChange={(next) => updateItem(index, { currencyCode: next })}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </td>\n <td className=\"px-3 py-2 text-right\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onChange(items.filter((_, currentIndex) => currentIndex !== index))}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.remove')}\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"px-4 py-8\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.empty')}\n </AlertDescription>\n </Alert>\n </div>\n )}\n </div>\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addItem}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.priceList.actions.addItem')}\n </Button>\n </div>\n )\n}\n\nfunction PricingSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const pricingMode = readString(values.pricingMode) || 'fixed'\n const pricingModeError = readError(errors, 'pricingMode')\n const fixedPriceAmountError = readError(errors, 'fixedPriceAmount')\n const fixedPriceCurrencyError = readError(errors, 'fixedPriceCurrencyCode')\n const fixedPriceOriginalAmountError = readError(errors, 'fixedPriceOriginalAmount')\n const customAmountMinError = readError(errors, 'customAmountMin')\n const customAmountMaxError = readError(errors, 'customAmountMax')\n const customAmountCurrencyError = readError(errors, 'customAmountCurrencyCode')\n const priceListItemsError = readError(errors, 'priceListItems')\n\n return (\n <div className=\"space-y-4\">\n {pricingModeError ? <p className=\"text-xs text-destructive\">{pricingModeError}</p> : null}\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'fixed', label: t('checkout.linkTemplateForm.pricing.modes.fixed'), icon: CircleDollarSign },\n { id: 'custom_amount', label: t('checkout.linkTemplateForm.pricing.modes.customAmount'), icon: WalletCards },\n { id: 'price_list', label: t('checkout.linkTemplateForm.pricing.modes.priceList'), icon: FileText },\n ].map((mode) => {\n const Icon = mode.icon\n const active = pricingMode === mode.id\n return (\n <Button\n key={mode.id}\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('pricingMode', mode.id)}\n >\n <Icon className=\"mr-2 h-4 w-4\" />\n {mode.label}\n </Button>\n )\n })}\n </div>\n\n {pricingMode === 'fixed' ? (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.amount')} error={fixedPriceAmountError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceAmount)}\n onChange={(event) => setValue('fixedPriceAmount', Number(event.target.value))}\n placeholder=\"150\"\n className={errorInputClassName(fixedPriceAmountError)}\n aria-invalid={Boolean(fixedPriceAmountError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={fixedPriceCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.fixedPriceCurrencyCode) || 'USD'}\n onChange={(next) => setValue('fixedPriceCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n\n <SectionLabel\n label={t('checkout.linkTemplateForm.pricing.fields.compareAtPrice')}\n hint={t('checkout.linkTemplateForm.pricing.hints.compareAtPrice')}\n error={fixedPriceOriginalAmountError}\n >\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceOriginalAmount)}\n onChange={(event) => setValue('fixedPriceOriginalAmount', Number(event.target.value))}\n placeholder=\"200\"\n className={errorInputClassName(fixedPriceOriginalAmountError)}\n aria-invalid={Boolean(fixedPriceOriginalAmountError)}\n />\n </SectionLabel>\n\n <div className=\"flex items-end\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.fixedPriceIncludesTax, true)}\n onChange={(event) => setValue('fixedPriceIncludesTax', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.pricing.fields.includesTax')}\n </label>\n </div>\n </div>\n ) : null}\n\n {pricingMode === 'custom_amount' ? (\n <div className=\"grid gap-4 md:grid-cols-3\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.minimumAmount')} error={customAmountMinError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMin)}\n onChange={(event) => setValue('customAmountMin', Number(event.target.value))}\n placeholder=\"10\"\n className={errorInputClassName(customAmountMinError)}\n aria-invalid={Boolean(customAmountMinError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.maximumAmount')} error={customAmountMaxError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMax)}\n onChange={(event) => setValue('customAmountMax', Number(event.target.value))}\n placeholder=\"500\"\n className={errorInputClassName(customAmountMaxError)}\n aria-invalid={Boolean(customAmountMaxError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={customAmountCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.customAmountCurrencyCode) || 'USD'}\n onChange={(next) => setValue('customAmountCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n </div>\n ) : null}\n\n {pricingMode === 'price_list' ? (\n <PriceListEditor\n value={normalizePriceListItems(values.priceListItems)}\n onChange={(next) => setValue('priceListItems', next)}\n error={priceListItemsError}\n />\n ) : null}\n </div>\n )\n}\n\nfunction GeneralSection({\n values,\n setValue,\n errors,\n mode,\n templateOptions,\n loadTemplateSuggestions,\n applyTemplate,\n isApplyingTemplate,\n}: CrudFormGroupComponentProps & {\n mode: 'link' | 'template'\n templateOptions: ComboboxOption[]\n loadTemplateSuggestions: (query?: string) => Promise<ComboboxOption[]>\n applyTemplate: (templateId: string | null) => Promise<void>\n isApplyingTemplate: boolean\n}) {\n const t = useT()\n const fallbackSlug = slugify(\n readString(values.title).trim().length > 0\n ? readString(values.title)\n : readString(values.name),\n ) || 'pay-link'\n const currentSlug = readString(values.slug)\n const resolvedSlug = currentSlug.trim() || fallbackSlug\n const currentTemplateId = readString(values.templateId).trim()\n const nameError = readError(errors, 'name')\n const titleError = readError(errors, 'title')\n const subtitleError = readError(errors, 'subtitle')\n const descriptionError = readError(errors, 'description')\n const slugError = readError(errors, 'slug')\n const templateError = readError(errors, 'templateId')\n\n return (\n <div className=\"space-y-4\">\n {mode === 'link' ? (\n <SectionLabel\n label={t('checkout.linkTemplateForm.general.fields.template')}\n hint={t('checkout.linkTemplateForm.general.hints.template')}\n error={templateError}\n >\n <div className=\"space-y-3\">\n <ComboboxInput\n value={currentTemplateId}\n suggestions={templateOptions}\n loadSuggestions={loadTemplateSuggestions}\n resolveLabel={(value) => templateOptions.find((option) => option.value === value)?.label ?? value}\n resolveDescription={(value) => templateOptions.find((option) => option.value === value)?.description}\n onChange={(nextValue) => {\n const normalized = nextValue.trim()\n setValue('templateId', normalized || null)\n void applyTemplate(normalized || null)\n }}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.template')}\n disabled={isApplyingTemplate}\n allowCustomValues={false}\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isApplyingTemplate || currentTemplateId.length === 0}\n onClick={() => {\n setValue('templateId', null)\n void applyTemplate(null)\n }}\n >\n {t('checkout.linkTemplateForm.general.actions.clearTemplate')}\n </Button>\n {isApplyingTemplate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.status.applyingTemplate')}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.notices.templateReplacement')}\n </p>\n )}\n </div>\n </div>\n </SectionLabel>\n ) : null}\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.name')} error={nameError} required>\n <Input\n value={readString(values.name)}\n onChange={(event) => setValue('name', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.name')}\n className={errorInputClassName(nameError)}\n aria-invalid={Boolean(nameError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.title')} error={titleError}>\n <Input\n value={readString(values.title)}\n onChange={(event) => setValue('title', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.title')}\n className={errorInputClassName(titleError)}\n aria-invalid={Boolean(titleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.subtitle')} error={subtitleError}>\n <Input\n value={readString(values.subtitle)}\n onChange={(event) => setValue('subtitle', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.subtitle')}\n className={errorInputClassName(subtitleError)}\n aria-invalid={Boolean(subtitleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.description')} hint={t('checkout.linkTemplateForm.general.hints.description')} error={descriptionError}>\n <SwitchableMarkdownInput\n value={readString(values.description)}\n onChange={(next) => setValue('description', next)}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.description')}\n />\n </SectionLabel>\n\n {mode === 'link' ? (\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.slug')} hint={t('checkout.linkTemplateForm.general.hints.slug')} error={slugError}>\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={currentSlug}\n onChange={(event) => setValue('slug', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.slug')}\n className={errorInputClassName(slugError)}\n aria-invalid={Boolean(slugError)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setValue('slug', fallbackSlug)}\n >\n <Sparkles className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.general.actions.generateSlug')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.general.slugPreview', { slug: resolvedSlug })}</p>\n </div>\n </SectionLabel>\n ) : null}\n </div>\n )\n}\n\nfunction AppearanceSection({\n values,\n setValue,\n errors,\n entityId,\n attachmentRecordId,\n}: CrudFormGroupComponentProps & { entityId: string; attachmentRecordId: string }) {\n const t = useT()\n const logoError = readAnyError(errors, 'logoAttachmentId', 'logoUrl')\n const primaryColorError = readError(errors, 'primaryColor')\n const secondaryColorError = readError(errors, 'secondaryColor')\n const backgroundColorError = readError(errors, 'backgroundColor')\n const themeModeError = readError(errors, 'themeMode')\n const displayCustomFieldsError = readError(errors, 'displayCustomFieldsOnPage')\n\n return (\n <div className=\"space-y-4\">\n <LogoUploadField\n entityId={entityId}\n recordId={attachmentRecordId}\n attachmentId={readString(values.logoAttachmentId) || null}\n logoUrl={readString(values.logoUrl) || null}\n error={logoError}\n onChange={(next) => {\n setValue('logoAttachmentId', next.logoAttachmentId)\n setValue('logoUrl', next.logoUrl)\n }}\n />\n\n <div className=\"space-y-4\">\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.primaryColor')}\n value={readString(values.primaryColor) || DEFAULT_COLORS.primaryColor}\n onChange={(next) => setValue('primaryColor', next)}\n error={primaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.secondaryColor')}\n value={readString(values.secondaryColor) || DEFAULT_COLORS.secondaryColor}\n onChange={(next) => setValue('secondaryColor', next)}\n error={secondaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.backgroundColor')}\n value={readString(values.backgroundColor) || DEFAULT_COLORS.backgroundColor}\n onChange={(next) => setValue('backgroundColor', next)}\n error={backgroundColorError}\n />\n </div>\n\n <SectionLabel label={t('checkout.linkTemplateForm.appearance.fields.themeMode')} error={themeModeError}>\n <select\n className={themeModeError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(themeModeError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.themeMode) || 'auto'}\n onChange={(event) => setValue('themeMode', event.target.value)}\n aria-invalid={Boolean(themeModeError)}\n >\n <option value=\"auto\">{t('checkout.linkTemplateForm.appearance.themeModes.auto')}</option>\n <option value=\"light\">{t('checkout.linkTemplateForm.appearance.themeModes.light')}</option>\n <option value=\"dark\">{t('checkout.linkTemplateForm.appearance.themeModes.dark')}</option>\n </select>\n </SectionLabel>\n\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.displayCustomFieldsOnPage)}\n onChange={(event) => setValue('displayCustomFieldsOnPage', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.appearance.fields.displayCustomFields')}\n </label>\n {displayCustomFieldsError ? <p className=\"text-xs text-destructive\">{displayCustomFieldsError}</p> : null}\n </div>\n )\n}\n\nfunction PaymentSection({ values, setValue, errors, providers }: CrudFormGroupComponentProps & { providers: ProviderDescriptor[] }) {\n const t = useT()\n const selectedProviderKey = readString(values.gatewayProviderKey)\n const selectedProvider = providers.find((provider) => provider.providerKey === selectedProviderKey)\n const gatewayProviderError = readError(errors, 'gatewayProviderKey')\n ?? (() => {\n const messageKey = getGatewayProviderConfigurationMessageKey(selectedProvider)\n return messageKey ? t(messageKey) : undefined\n })()\n const gatewaySettingsError = readError(errors, 'gatewaySettings')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.payment.fields.gatewayProvider')} error={gatewayProviderError} required>\n <select\n className={gatewayProviderError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(gatewayProviderError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.gatewayProviderKey)}\n onChange={(event) => setValue('gatewayProviderKey', event.target.value)}\n aria-invalid={Boolean(gatewayProviderError)}\n >\n <option value=\"\">{t('checkout.linkTemplateForm.payment.placeholders.provider')}</option>\n {providers.map((provider) => (\n <option\n key={provider.providerKey}\n value={provider.providerKey}\n disabled={provider.isConfigured === false}\n >\n {provider.isConfigured === false\n ? `${provider.label} ${t('checkout.linkTemplateForm.payment.providerUnavailableSuffix')}`\n : provider.label}\n </option>\n ))}\n </select>\n </SectionLabel>\n\n <GatewaySettingsFields\n providerKey={readString(values.gatewayProviderKey) || null}\n value={isRecord(values.gatewaySettings) ? values.gatewaySettings : {}}\n onChange={(next) => setValue('gatewaySettings', next)}\n />\n {gatewaySettingsError ? <p className=\"text-xs text-destructive\">{gatewaySettingsError}</p> : null}\n </div>\n )\n}\n\nfunction CustomerDetailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const collectCustomerDetails = readBoolean(values.collectCustomerDetails, true)\n const collectCustomerDetailsError = readError(errors, 'collectCustomerDetails')\n const customerFieldsError = readCustomerFieldsSectionError(errors)\n\n return (\n <div className=\"space-y-4\">\n <label className=\"flex items-start gap-3 rounded-xl border border-border/70 bg-muted/30 px-4 py-3 text-sm\">\n <input\n type=\"checkbox\"\n checked={collectCustomerDetails}\n onChange={(event) => setValue('collectCustomerDetails', event.target.checked)}\n />\n <span className=\"space-y-1\">\n <span className=\"flex items-center gap-2 font-medium\">\n <IdCard className=\"h-4 w-4\" />\n {t('checkout.linkTemplateForm.customerDetails.title')}\n </span>\n <span className=\"block text-muted-foreground\">\n {t('checkout.linkTemplateForm.customerDetails.description')}\n </span>\n </span>\n </label>\n {collectCustomerDetailsError ? <p className=\"text-xs text-destructive\">{collectCustomerDetailsError}</p> : null}\n\n {collectCustomerDetails ? (\n <>\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.simpleLink')}\n </AlertDescription>\n </Alert>\n {customerFieldsError ? <p className=\"text-xs text-destructive\">{customerFieldsError}</p> : null}\n <CustomerFieldsEditor\n value={readCustomerFields(values.customerFieldsSchema, t)}\n onChange={(next) => setValue('customerFieldsSchema', next)}\n errors={errors}\n />\n </>\n ) : (\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.disabled')}\n </AlertDescription>\n </Alert>\n )}\n </div>\n )\n}\n\nfunction LegalSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'terms' | 'privacyPolicy'>('terms')\n const legalDocuments = normalizeLegalDocuments(values.legalDocuments)\n const termsTitleError = readAnyError(errors, 'legalDocuments.terms.title', 'legalDocuments.terms')\n const termsMarkdownError = readAnyError(errors, 'legalDocuments.terms.markdown', 'legalDocuments.terms')\n const privacyTitleError = readAnyError(errors, 'legalDocuments.privacyPolicy.title', 'legalDocuments.privacyPolicy')\n const privacyMarkdownError = readAnyError(errors, 'legalDocuments.privacyPolicy.markdown', 'legalDocuments.privacyPolicy')\n\n const patchDocument = React.useCallback(\n (key: 'terms' | 'privacyPolicy', patch: Partial<LegalDocumentValue>) => {\n setValue('legalDocuments', {\n ...legalDocuments,\n [key]: {\n ...legalDocuments[key],\n ...patch,\n },\n })\n },\n [legalDocuments, setValue],\n )\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.legal.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'terms' | 'privacyPolicy')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n <TabsTrigger value=\"terms\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Shield className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.terms')}\n </TabsTrigger>\n <TabsTrigger value=\"privacyPolicy\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <FileCheck2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.privacy')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"terms\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsTitle')} error={termsTitleError}>\n <Input\n value={legalDocuments.terms.title}\n onChange={(event) => patchDocument('terms', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsTitle')}\n className={errorInputClassName(termsTitleError)}\n aria-invalid={Boolean(termsTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsBody')} error={termsMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.terms.markdown}\n onChange={(next) => patchDocument('terms', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.terms.required}\n onChange={(event) => patchDocument('terms', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n\n <TabsContent value=\"privacyPolicy\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyTitle')} error={privacyTitleError}>\n <Input\n value={legalDocuments.privacyPolicy.title}\n onChange={(event) => patchDocument('privacyPolicy', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyTitle')}\n className={errorInputClassName(privacyTitleError)}\n aria-invalid={Boolean(privacyTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyBody')} error={privacyMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.privacyPolicy.markdown}\n onChange={(next) => patchDocument('privacyPolicy', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.privacyPolicy.required}\n onChange={(event) => patchDocument('privacyPolicy', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n\nfunction MessagesSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'success' | 'cancel' | 'error'>('success')\n\n const config = {\n success: {\n titleKey: 'successTitle',\n bodyKey: 'successMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.success'),\n },\n cancel: {\n titleKey: 'cancelTitle',\n bodyKey: 'cancelMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.cancel'),\n },\n error: {\n titleKey: 'errorTitle',\n bodyKey: 'errorMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.error'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.messages.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'success' | 'cancel' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <MessageSquare className=\"mr-2 h-4 w-4\" />\n {config[item].label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.title', { state: config[item].label })} error={readError(errors, config[item].titleKey)}>\n <Input\n value={readString(values[config[item].titleKey])}\n onChange={(event) => setValue(config[item].titleKey, event.target.value)}\n placeholder={config[item].titlePlaceholder}\n className={errorInputClassName(readError(errors, config[item].titleKey))}\n aria-invalid={Boolean(readError(errors, config[item].titleKey))}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.body', { state: config[item].label })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction VariableHint() {\n const t = useT()\n const variables = ['{{firstName}}', '{{amount}}', '{{currencyCode}}', '{{linkTitle}}', '{{transactionId}}', '{{errorMessage}}']\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.emails.variableHint')}</p>\n <div className=\"flex flex-wrap gap-2\">\n {variables.map((variable) => (\n <span\n key={variable}\n className=\"rounded-full border border-border/70 bg-background px-2 py-1 text-xs text-muted-foreground\"\n >\n {variable}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction EmailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'start' | 'success' | 'error'>('start')\n\n const config = {\n start: {\n enabledKey: 'sendStartEmail',\n subjectKey: 'startEmailSubject',\n bodyKey: 'startEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.start'),\n Icon: Send,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startBody'),\n },\n success: {\n enabledKey: 'sendSuccessEmail',\n subjectKey: 'successEmailSubject',\n bodyKey: 'successEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.success'),\n Icon: BadgeCheck,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successBody'),\n },\n error: {\n enabledKey: 'sendErrorEmail',\n subjectKey: 'errorEmailSubject',\n bodyKey: 'errorEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.error'),\n Icon: AlertTriangle,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorBody'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.emails.notice')}\n </AlertDescription>\n </Alert>\n <VariableHint />\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'start' | 'success' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['start', 'success', 'error'] as const).map((item) => {\n const Icon = config[item].Icon\n return (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Icon className=\"mr-2 h-4 w-4\" />\n {config[item].title}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {(['start', 'success', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values[config[item].enabledKey], true)}\n onChange={(event) => setValue(config[item].enabledKey, event.target.checked)}\n />\n {t('checkout.linkTemplateForm.emails.sendToCustomer')}\n </label>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.subject', { state: config[item].title })} error={readError(errors, config[item].subjectKey)}>\n <Input\n value={readString(values[config[item].subjectKey])}\n onChange={(event) => setValue(config[item].subjectKey, event.target.value)}\n placeholder={config[item].subjectPlaceholder}\n className={errorInputClassName(readError(errors, config[item].subjectKey))}\n aria-invalid={Boolean(readError(errors, config[item].subjectKey))}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.body', { state: config[item].title })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction SettingsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const status = readString(values.status) || 'draft'\n const statusError = readError(errors, 'status')\n const maxCompletionsError = readError(errors, 'maxCompletions')\n const passwordError = readError(errors, 'password')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.status')} error={statusError}>\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'draft', label: t('checkout.common.status.draft') },\n { id: 'active', label: t('checkout.common.status.active') },\n { id: 'inactive', label: t('checkout.common.status.inactive') },\n ].map((option) => (\n <Button\n key={option.id}\n type=\"button\"\n variant={status === option.id ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('status', option.id)}\n >\n {option.label}\n </Button>\n ))}\n </div>\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.maxCompletions')} hint={t('checkout.linkTemplateForm.settings.hints.maxCompletions')} error={maxCompletionsError}>\n <Input\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={readNumberInputValue(values.maxCompletions)}\n onChange={(event) => setValue('maxCompletions', event.target.value ? Number(event.target.value) : null)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.unlimited')}\n className={errorInputClassName(maxCompletionsError)}\n aria-invalid={Boolean(maxCompletionsError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.password')} hint={t('checkout.linkTemplateForm.settings.hints.password')} error={passwordError}>\n <PasswordInput\n value={readString(values.password)}\n onChange={(event) => setValue('password', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.password')}\n className={errorInputClassName(passwordError)}\n aria-invalid={Boolean(passwordError)}\n />\n </SectionLabel>\n </div>\n )\n}\n\nexport function LinkTemplateForm({ mode, recordId }: Props) {\n const t = useT()\n const searchParams = useSearchParams()\n const entityId = mode === 'link' ? CHECKOUT_ENTITY_IDS.link : CHECKOUT_ENTITY_IDS.template\n const templateId = React.useMemo(() => {\n const raw = searchParams.get('templateId')\n return raw && raw.trim().length > 0 ? raw : null\n }, [searchParams])\n const attachmentDraftRecordId = React.useMemo(\n () => recordId ?? (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : `draft-${Date.now()}`),\n [recordId],\n )\n const initialLogoAttachmentIdRef = React.useRef<string | null>(null)\n const [providers, setProviders] = React.useState<ProviderDescriptor[]>([])\n const [templateOptions, setTemplateOptions] = React.useState<ComboboxOption[]>([])\n const [isApplyingTemplate, setIsApplyingTemplate] = React.useState(false)\n const [formInstanceKey, setFormInstanceKey] = React.useState(0)\n const [initialValues, setInitialValues] = React.useState<FormValues | null>(\n recordId ? null : normalizeFormValues(createDefaultValues(t), t),\n )\n\n const replaceInitialValues = React.useCallback((nextValues: FormValues) => {\n setInitialValues(nextValues)\n setFormInstanceKey((current) => current + 1)\n }, [])\n\n React.useEffect(() => {\n initialLogoAttachmentIdRef.current = initialValues && typeof initialValues.logoAttachmentId === 'string'\n ? initialValues.logoAttachmentId\n : null\n }, [initialValues])\n\n React.useEffect(() => {\n let active = true\n void readApiResultOrThrow<{ items: ProviderDescriptor[] }>('/api/payment_gateways/providers')\n .then((result) => {\n if (!active) return\n setProviders(Array.isArray(result.items) ? result.items : [])\n })\n .catch(() => {\n if (active) setProviders([])\n })\n return () => {\n active = false\n }\n }, [])\n\n const rememberTemplateOptions = React.useCallback((items: TemplateSummary[] | ComboboxOption[]) => {\n setTemplateOptions((current) => {\n const next = new Map(current.map((option) => [option.value, option]))\n items.forEach((item) => {\n if ('value' in item) {\n next.set(item.value, item)\n return\n }\n const option = toTemplateOption(item)\n next.set(option.value, option)\n })\n return Array.from(next.values())\n })\n }, [])\n\n const loadTemplateSuggestions = React.useCallback(async (query?: string): Promise<ComboboxOption[]> => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '25',\n })\n if (query && query.trim().length > 0) {\n params.set('search', query.trim())\n }\n const result = await readApiResultOrThrow<{ items: TemplateSummary[] }>(`/api/checkout/templates?${params.toString()}`)\n const options = Array.isArray(result.items) ? result.items.map(toTemplateOption) : []\n rememberTemplateOptions(options)\n return options\n }, [rememberTemplateOptions])\n\n const applyTemplate = React.useCallback(async (nextTemplateId: string | null) => {\n if (recordId || mode !== 'link') return\n if (!nextTemplateId) {\n replaceInitialValues(normalizeFormValues(createDefaultValues(t), t))\n return\n }\n setIsApplyingTemplate(true)\n try {\n const result = await readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(nextTemplateId)}`)\n rememberTemplateOptions([{\n id: nextTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n replaceInitialValues(\n normalizeFormValues({\n ...result,\n slug: '',\n templateId: nextTemplateId,\n }, t),\n )\n } finally {\n setIsApplyingTemplate(false)\n }\n }, [mode, recordId, rememberTemplateOptions, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (mode !== 'link' || recordId) return\n void loadTemplateSuggestions()\n .catch(() => null)\n }, [loadTemplateSuggestions, mode, recordId])\n\n React.useEffect(() => {\n if (!recordId) return\n let active = true\n void readApiResultOrThrow<FormValues>(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`)\n .then((result) => {\n if (!active) return\n replaceInitialValues(normalizeFormValues(result, t))\n })\n .catch(() => {\n if (active) replaceInitialValues(normalizeFormValues({}, t))\n })\n return () => {\n active = false\n }\n }, [mode, recordId, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (recordId || mode !== 'link' || !templateId) return\n void applyTemplate(templateId).catch(() => null)\n }, [applyTemplate, mode, recordId, templateId])\n\n React.useEffect(() => {\n const currentTemplateId = readString(initialValues?.templateId).trim()\n if (mode !== 'link' || !currentTemplateId) return\n if (templateOptions.some((option) => option.value === currentTemplateId)) return\n\n let active = true\n void readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(currentTemplateId)}`)\n .then((result) => {\n if (!active) return\n rememberTemplateOptions([{\n id: currentTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n })\n .catch(() => null)\n\n return () => {\n active = false\n }\n }, [initialValues?.templateId, mode, rememberTemplateOptions, templateOptions])\n\n const fields = React.useMemo<CrudField[]>(() => [], [])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n {\n id: 'general',\n title: t('checkout.linkTemplateForm.groups.general'),\n column: 1,\n component: (ctx) => (\n <GeneralSection\n {...ctx}\n mode={mode}\n templateOptions={templateOptions}\n loadTemplateSuggestions={loadTemplateSuggestions}\n applyTemplate={applyTemplate}\n isApplyingTemplate={isApplyingTemplate}\n />\n ),\n },\n {\n id: 'payment',\n title: t('checkout.linkTemplateForm.groups.payment'),\n column: 2,\n component: (ctx) => <PaymentSection {...ctx} providers={providers} />,\n },\n {\n id: 'pricing',\n title: t('checkout.linkTemplateForm.groups.pricing'),\n column: 1,\n component: (ctx) => <PricingSection {...ctx} />,\n },\n {\n id: 'appearance',\n title: t('checkout.linkTemplateForm.groups.appearance'),\n column: 2,\n component: (ctx) => (\n <AppearanceSection\n {...ctx}\n entityId={entityId}\n attachmentRecordId={attachmentDraftRecordId}\n />\n ),\n },\n {\n id: 'customerFields',\n title: t('checkout.linkTemplateForm.groups.customerFields'),\n column: 1,\n component: (ctx) => <CustomerDetailsSection {...ctx} />,\n },\n {\n id: 'settings',\n title: t('checkout.linkTemplateForm.groups.settings'),\n column: 2,\n component: (ctx) => <SettingsSection {...ctx} />,\n },\n {\n id: 'legal',\n title: t('checkout.linkTemplateForm.groups.legal'),\n column: 1,\n component: (ctx) => <LegalSection {...ctx} />,\n },\n {\n id: 'messages',\n title: t('checkout.linkTemplateForm.groups.messages'),\n column: 1,\n component: (ctx) => <MessagesSection {...ctx} />,\n },\n {\n id: 'emails',\n title: t('checkout.linkTemplateForm.groups.emails'),\n column: 1,\n component: (ctx) => <EmailsSection {...ctx} />,\n },\n { id: 'customFields', title: t('checkout.linkTemplateForm.groups.customFields'), column: 2, kind: 'customFields' },\n ], [applyTemplate, attachmentDraftRecordId, entityId, isApplyingTemplate, loadTemplateSuggestions, mode, providers, t, templateOptions])\n\n const isLocked = mode === 'link' && Boolean(recordId) && readBoolean(initialValues?.isLocked)\n const formId = React.useMemo(\n () => `checkout-${mode}-editor-${recordId ?? 'new'}`,\n [mode, recordId],\n )\n const lockedNotice = isLocked ? (\n <Alert variant=\"warning\">\n <AlertTitle>{t('checkout.linkTemplateForm.locked.title')}</AlertTitle>\n <AlertDescription>{t('checkout.linkTemplateForm.locked.description')}</AlertDescription>\n </Alert>\n ) : undefined\n const lockedOverlay = isLocked ? (\n <div className=\"mx-auto mt-6 max-w-md rounded-xl border border-status-warning-border bg-background/95 px-5 py-4 text-center shadow-sm\">\n <div className=\"mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-status-warning-bg text-status-warning-icon\">\n <Shield className=\"h-5 w-5\" />\n </div>\n <p className=\"text-sm font-semibold text-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayTitle')}\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayDescription')}\n </p>\n </div>\n ) : undefined\n\n return (\n <Page>\n <PageBody>\n {initialValues ? (\n <CrudForm<FormValues>\n key={formInstanceKey}\n formId={formId}\n title={recordId\n ? t(mode === 'link' ? 'checkout.linkTemplateForm.titles.editLink' : 'checkout.linkTemplateForm.titles.editTemplate')\n : t(mode === 'link' ? 'checkout.linkTemplateForm.titles.createLink' : 'checkout.linkTemplateForm.titles.createTemplate')}\n backHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n cancelHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n fields={fields}\n groups={groups}\n extraActions={recordId ? (\n <>\n {isLocked ? (\n <Button asChild type=\"button\" variant=\"outline\">\n <a\n href={mode === 'link'\n ? `/pay/${encodeURIComponent(readString(initialValues.slug))}?preview=true`\n : `/backend/checkout/templates/${encodeURIComponent(recordId)}/preview`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </a>\n </Button>\n ) : (\n <Button\n type=\"submit\"\n form={formId}\n variant=\"outline\"\n name=\"submitIntent\"\n value=\"preview\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </Button>\n )}\n {mode === 'link' && recordId && !isLocked ? (\n <Button\n type=\"submit\"\n form={formId}\n name=\"submitIntent\"\n value=\"publish\"\n >\n <BadgeCheck className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.saveAndPublish')}\n </Button>\n ) : null}\n </>\n ) : null}\n entityId={entityId}\n customFieldsetBindings={{ [entityId]: { valueKey: 'customFieldsetCode' } }}\n initialValues={initialValues}\n contentHeader={lockedNotice}\n readOnly={isLocked}\n readOnlyOverlay={lockedOverlay}\n deleteVisible={Boolean(recordId)}\n onSubmit={async (values, context) => {\n const submitIntent = context?.submitter?.value === 'preview'\n ? 'preview'\n : context?.submitter?.value === 'publish'\n ? 'publish'\n : 'save'\n const shouldOpenPreview = submitIntent === 'preview'\n const payload = {\n ...values,\n status: submitIntent === 'publish' ? 'active' : values.status,\n customFields: collectCustomFieldValues(values),\n }\n const endpoint = `/api/checkout/${mode === 'link' ? 'links' : 'templates'}${recordId ? `/${encodeURIComponent(recordId)}` : ''}`\n let response: { id?: string; slug?: string; ok?: boolean }\n try {\n response = await withScopedApiRequestHeaders(\n recordId ? buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null) : {},\n () => readApiResultOrThrow<{ id?: string; slug?: string; ok?: boolean }>(endpoint, {\n method: recordId ? 'PUT' : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n throw error\n }\n const targetId = recordId ?? (typeof response?.id === 'string' ? response.id : null)\n const logoAttachmentId = readString(values.logoAttachmentId)\n if (\n !recordId &&\n targetId &&\n logoAttachmentId &&\n logoAttachmentId !== initialLogoAttachmentIdRef.current\n ) {\n await apiCall('/api/attachments/transfer', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n entityId,\n attachmentIds: [logoAttachmentId],\n fromRecordId: attachmentDraftRecordId,\n toRecordId: targetId,\n }),\n })\n }\n if (shouldOpenPreview) {\n if (mode === 'link') {\n const savedSlug = typeof response?.slug === 'string' && response.slug.trim().length > 0\n ? response.slug.trim()\n : readString(values.slug).trim() || readString(initialValues.slug).trim()\n if (savedSlug) {\n window.open(`/pay/${encodeURIComponent(savedSlug)}?preview=true`, '_blank', 'noopener,noreferrer')\n return\n }\n } else if (targetId) {\n window.open(\n `/backend/checkout/templates/${encodeURIComponent(targetId)}/preview`,\n '_blank',\n 'noopener,noreferrer',\n )\n return\n }\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(\n t(submitIntent === 'publish' ? 'checkout.admin.payLinks.flash.published' : 'checkout.common.flash.saved'),\n )}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.saved'))}&type=success`\n }}\n onDelete={recordId ? async () => {\n try {\n await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null),\n () => apiCallOrThrow(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`, { method: 'DELETE' }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n throw error\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n } : undefined}\n />\n ) : null}\n </PageBody>\n </Page>\n )\n}\n\nexport default LinkTemplateForm\n"],
5
- "mappings": ";AA0UQ,SAsmBA,UApmBc,KAFd;AAxUR,YAAY,WAAW;AACvB,SAAS,uBAAuB;AAChC,SAAS,YAA8B;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,gBAAsF;AAC/F,SAAS,qBAA0C;AACnD,SAAS,MAAM,gBAAgB;AAC/B,SAAS,+BAA+B;AACxC,SAAS,SAAS,gBAAgB,sBAAsB,mCAAmC;AAC3F,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AACtC,SAAS,gCAAgC;AACzC,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,aAAa;AACtB,SAAS,OAAO,kBAAkB,kBAAkB;AACpD,SAAS,MAAM,aAAa,UAAU,mBAAmB;AACzD,SAAS,2BAA2B;AACpC,SAAS,iDAAiD;AAE1D,SAAS,iDAAiD;AAC1D,SAAS,sCAAsC;AAC/C,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AACrC,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAsChC,MAAM,iBAAiB;AAAA,EACrB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAEA,MAAM,2BAA2B;AACjC,MAAM,8BAA8B;AAEpC,SAAS,SAAS,OAAkD;AAClE,SAAO,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,WAAW,OAAwB;AAC1C,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,qBAAqB,OAAwB;AACpD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,QAAO,OAAO,KAAK;AAC5E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,YAAY,OAAgB,WAAW,OAAgB;AAC9D,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAEA,SAAS,2BAA2B,GAAiD;AACnF,SAAO,0CAA0C,CAAC,EAAE,IAAI,CAAC,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,aAAa,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc;AAAA,EAC3E,EAAE;AACJ;AAEA,SAAS,8BAAmD;AAC1D,SAAO;AAAA,IACL,OAAO,EAAE,OAAO,IAAI,UAAU,IAAI,UAAU,MAAM;AAAA,IAClD,eAAe,EAAE,OAAO,IAAI,UAAU,IAAI,UAAU,MAAM;AAAA,EAC5D;AACF;AAEA,SAAS,oBAAoB,GAA6B;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,SAAS;AAAA,IACT,GAAG;AAAA,IACH,WAAW;AAAA,IACX,2BAA2B;AAAA,IAC3B,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,IAC1B,gBAAgB,CAAC;AAAA,IACjB,oBAAoB;AAAA,IACpB,iBAAiB,CAAC;AAAA,IAClB,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,sBAAsB,2BAA2B,CAAC;AAAA,IAClD,gBAAgB,4BAA4B;AAAA,IAC5C,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAEA,SAAS,wBAAwB,OAAiC;AAChE,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MACJ,IAAI,CAAC,SAAS;AACb,QAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,UAAM,KAAK,WAAW,KAAK,EAAE,EAAE,KAAK;AACpC,UAAM,cAAc,WAAW,KAAK,WAAW;AAC/C,UAAM,SAAS,OAAO,KAAK,UAAU,CAAC;AACtC,UAAM,eAAe,WAAW,KAAK,YAAY,EAAE,KAAK,EAAE,YAAY;AACtE,WAAO;AAAA,MACL,IAAI,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC5B;AAAA,MACA,QAAQ,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,MAC3C,cAAc,gBAAgB;AAAA,IAChC;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAgC,SAAS,IAAI;AAC1D;AAEA,SAAS,wBAAwB,OAAgB,GAAiD;AAChG,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,2BAA2B,CAAC;AAC9D,SAAO,MAAM,OAAuC,CAAC,QAAQ,OAAO,UAAU;AAC5E,QAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,UAAM,MAAM,WAAW,MAAM,GAAG,EAAE,KAAK;AACvC,UAAM,QAAQ,WAAW,MAAM,KAAK,EAAE,KAAK;AAC3C,UAAM,OAAO,WAAW,MAAM,IAAI;AAClC,QAAI,CAAC,OAAO,CAAC,MAAO,QAAO;AAC3B,QAAI,CAAC,CAAC,QAAQ,aAAa,WAAW,UAAU,OAAO,EAAE,SAAS,IAAI,EAAG,QAAO;AAChF,UAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IACvC,MAAM,QAAQ,OAAgD,CAAC,cAAc,WAAW;AACtF,UAAI,CAAC,SAAS,MAAM,EAAG,QAAO;AAC9B,YAAM,YAAY,WAAW,OAAO,KAAK,EAAE,KAAK;AAChD,YAAM,YAAY,WAAW,OAAO,KAAK,EAAE,KAAK;AAChD,UAAI,CAAC,aAAa,CAAC,UAAW,QAAO;AACrC,mBAAa,KAAK,EAAE,OAAO,WAAW,OAAO,UAAU,CAAC;AACxD,aAAO;AAAA,IACT,GAAG,CAAC,CAAC,IACL,CAAC;AACL,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,YAAY,MAAM,QAAQ;AAAA,MACpC,OAAO,YAAY,MAAM,KAAK;AAAA,MAC9B,aAAa,WAAW,MAAM,WAAW,EAAE,KAAK,KAAK;AAAA,MACrD;AAAA,MACA,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,IACrE,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEA,SAAS,mBAAmB,OAAgB,GAAiD;AAC3F,SAAO,MAAM,QAAQ,KAAK,IAAI,QAA0C,2BAA2B,CAAC;AACtG;AAEA,SAAS,wBAAwB,OAAqC;AACpE,QAAM,WAAW,4BAA4B;AAC7C,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,QAAM,oBAAoB,CAAC,KAAc,aAAqD;AAC5F,QAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,WAAO;AAAA,MACL,OAAO,WAAW,IAAI,KAAK;AAAA,MAC3B,UAAU,WAAW,IAAI,QAAQ;AAAA,MACjC,UAAU,YAAY,IAAI,QAAQ;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO,kBAAkB,MAAM,OAAO,SAAS,KAAK;AAAA,IACpD,eAAe,kBAAkB,MAAM,eAAe,SAAS,aAAa;AAAA,EAC9E;AACF;AAEA,SAAS,oBAAoB,OAAsC,GAA6B;AAC9F,QAAM,WAAW,oBAAoB,CAAC;AACtC,QAAM,SAAS,SAAS,KAAK,IAAI,QAAQ,CAAC;AAC1C,QAAM,eAAe,SAAS,OAAO,YAAY,IAAI,OAAO,eAAe,CAAC;AAE5E,QAAM,4BAA4B,OAAO;AAAA,IACvC,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC;AAAA,EACnF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,kBAAkB,WAAW,OAAO,gBAAgB,EAAE,KAAK,KAAK;AAAA,IAChE,SAAS,WAAW,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,IAC9C,cAAc,WAAW,OAAO,YAAY,EAAE,KAAK,KAAK,SAAS;AAAA,IACjE,gBAAgB,WAAW,OAAO,cAAc,EAAE,KAAK,KAAK,SAAS;AAAA,IACrE,iBAAiB,WAAW,OAAO,eAAe,EAAE,KAAK,KAAK,SAAS;AAAA,IACvE,iBAAiB,SAAS,OAAO,eAAe,IAAI,OAAO,kBAAkB,CAAC;AAAA,IAC9E,oBAAoB,WAAW,OAAO,kBAAkB,EAAE,KAAK,KAAK;AAAA,IACpE,wBAAwB,YAAY,OAAO,wBAAwB,IAAI;AAAA,IACvE,sBAAsB,wBAAwB,OAAO,sBAAsB,CAAC;AAAA,IAC5E,gBAAgB,wBAAwB,OAAO,cAAc;AAAA,IAC7D,gBAAgB,wBAAwB,OAAO,cAAc;AAAA,IAC7D,wBAAwB,WAAW,OAAO,sBAAsB,EAAE,KAAK,EAAE,YAAY,KAAK;AAAA,IAC1F,0BAA0B,WAAW,OAAO,wBAAwB,EAAE,KAAK,EAAE,YAAY,KAAK;AAAA,IAC9F,gBAAgB,YAAY,OAAO,gBAAgB,IAAI;AAAA,IACvD,kBAAkB,YAAY,OAAO,kBAAkB,IAAI;AAAA,IAC3D,gBAAgB,YAAY,OAAO,gBAAgB,IAAI;AAAA,EACzD;AACF;AAEA,SAAS,UAAU,QAAgC,MAAkC;AACnF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,OAAO,IAAI,EAAG,QAAO,OAAO,IAAI;AACpC,QAAM,SAAS,GAAG,IAAI;AACtB,QAAM,cAAc,OAAO,QAAQ,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,IAAI,WAAW,MAAM,CAAC;AACjF,SAAO,cAAc,CAAC;AACxB;AAEA,SAAS,gBAAgB,QAAgC,MAAkC;AACzF,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,OAAO,IAAI;AACpB;AAEA,SAAS,aAAa,WAAmC,OAAqC;AAC5F,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,UAAU,QAAQ,IAAI;AACpC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAA2C;AACnE,QAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,SAAS,MAAM,KAAK,IAAI;AAC3E,QAAM,WAAW,OAAO,SAAS,uBAAuB,WAAW,SAAS,mBAAmB,KAAK,IAAI;AACxG,QAAM,QAAQ,CAAC,OAAO,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAChE,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,IAChB,aAAa,MAAM,SAAS,IAAI,MAAM,KAAK,UAAK,IAAI;AAAA,EACtD;AACF;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,SAAO,QAAQ,qDAAqD;AACtE;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAM,WAAU,SACd;AAAA;AAAA,QACA,WAAW,oBAAC,UAAK,WAAU,oBAAmB,gBAAE,IAAU;AAAA,SAC7D;AAAA,MACC,OAAO,oBAAC,OAAE,WAAU,iCAAiC,gBAAK,IAAO;AAAA,MACjE,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,OACjE;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,cAAc,sBAAsB,KAAK,KAAK,IAAI,QAAQ;AAChE,SACE,oBAAC,gBAAa,OAAc,OAC1B,+BAAC,SAAI,WAAU,2BACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,SAAS,SAAS,KAAK,YAAY,CAAC;AAAA,QAC/C,cAAY;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,MAAM,YAAY,CAAC;AAAA,QAC9D,aAAY;AAAA,QACZ,WAAW,QAAQ,WAAW,oBAAoB,KAAK,CAAC,KAAK;AAAA,QAC7D,gBAAc,QAAQ,KAAK;AAAA;AAAA,IAC7B;AAAA,KACF,GACF;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAE9C,QAAM,aAAa,MAAM;AAAA,IACvB,CAAC,OAAe,UAAkC;AAChD,eAAS,MAAM,IAAI,CAAC,MAAM,iBAAkB,iBAAiB,QAAQ,EAAE,GAAG,MAAM,GAAG,MAAM,IAAI,IAAK,CAAC;AAAA,IACrG;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EAClB;AAEA,QAAM,UAAU,MAAM,YAAY,MAAM;AACtC,aAAS;AAAA,MACP,GAAG;AAAA,MACH;AAAA,QACE,IAAI,QAAQ,MAAM,SAAS,CAAC;AAAA,QAC5B,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,cAAc,MAAM,CAAC,GAAG,gBAAgB;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,4DAA4D,GACjE,GACF;AAAA,IACC,QAAQ,oBAAC,OAAE,WAAU,4BAA4B,iBAAM,IAAO;AAAA,IAE/D,oBAAC,SAAI,WAAU,oEACZ,gBAAM,SAAS,IACd,oBAAC,SAAI,WAAU,mBACb,+BAAC,WAAM,WAAU,oCACf;AAAA,0BAAC,WAAM,WAAU,wBACf,+BAAC,QAAG,WAAU,iFACZ;AAAA,4BAAC,QAAG,WAAU,qBAAqB,YAAE,sDAAsD,GAAE;AAAA,QAC7F,oBAAC,QAAG,WAAU,aAAa,YAAE,yDAAyD,GAAE;AAAA,QACxF,oBAAC,QAAG,WAAU,qBAAqB,YAAE,oDAAoD,GAAE;AAAA,QAC3F,oBAAC,QAAG,WAAU,qBAAqB,YAAE,sDAAsD,GAAE;AAAA,QAC7F,oBAAC,QAAG,WAAU,kCAAkC,YAAE,qDAAqD,GAAE;AAAA,SAC3G,GACF;AAAA,MACA,oBAAC,WAAM,WAAU,6BACd,gBAAM,IAAI,CAAC,MAAM,UAChB,qBAAC,QAA+B,WAAU,aACxC;AAAA,4BAAC,QAAG,WAAU,aACZ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,UAAU,WAAW,OAAO,EAAE,IAAI,MAAM,OAAO,MAAM,CAAC;AAAA,YACjE,aAAa,EAAE,2DAA2D;AAAA,YAC1E,cAAY,EAAE,qDAAqD,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,YACvF,WAAU;AAAA;AAAA,QACZ,GACF;AAAA,QACA,oBAAC,QAAG,WAAU,aACZ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,UAAU,WAAW,OAAO,EAAE,aAAa,MAAM,OAAO,MAAM,CAAC;AAAA,YAC1E,aAAa,EAAE,8DAA8D;AAAA,YAC7E,cAAY,EAAE,wDAAwD,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,YAC1F,WAAU;AAAA;AAAA,QACZ,GACF;AAAA,QACA,oBAAC,QAAG,WAAU,aACZ;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAI;AAAA,YACJ,MAAK;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,UAAU,WAAW,OAAO,EAAE,QAAQ,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,YAC7E,aAAY;AAAA,YACZ,cAAY,EAAE,mDAAmD,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,YACrF,WAAU;AAAA;AAAA,QACZ,GACF;AAAA,QACA,oBAAC,QAAG,WAAU,aACZ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,SAAS,WAAW,OAAO,EAAE,cAAc,KAAK,CAAC;AAAA,YAC5D,aAAa,EAAE,qCAAqC;AAAA;AAAA,QACtD,GACF;AAAA,QACA,oBAAC,QAAG,WAAU,wBACZ;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,MAAM,OAAO,CAAC,GAAG,iBAAiB,iBAAiB,KAAK,CAAC;AAAA,YAEjF;AAAA,kCAAC,UAAO,WAAU,gBAAe;AAAA,cAChC,EAAE,gCAAgC;AAAA;AAAA;AAAA,QACrC,GACF;AAAA,WAhDO,GAAG,KAAK,EAAE,IAAI,KAAK,EAiD5B,CACD,GACH;AAAA,OACF,GACF,IAEA,oBAAC,SAAI,WAAU,aACb,8BAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,mDAAmD,GACxD,GACF,GACF,GAEJ;AAAA,IAEA,qBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,SACzD;AAAA,0BAAC,QAAK,WAAU,gBAAe;AAAA,MAC9B,EAAE,qDAAqD;AAAA,OAC1D;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe,EAAE,QAAQ,UAAU,OAAO,GAAgC;AACjF,QAAM,IAAI,KAAK;AACf,QAAM,cAAc,WAAW,OAAO,WAAW,KAAK;AACtD,QAAM,mBAAmB,UAAU,QAAQ,aAAa;AACxD,QAAM,wBAAwB,UAAU,QAAQ,kBAAkB;AAClE,QAAM,0BAA0B,UAAU,QAAQ,wBAAwB;AAC1E,QAAM,gCAAgC,UAAU,QAAQ,0BAA0B;AAClF,QAAM,uBAAuB,UAAU,QAAQ,iBAAiB;AAChE,QAAM,uBAAuB,UAAU,QAAQ,iBAAiB;AAChE,QAAM,4BAA4B,UAAU,QAAQ,0BAA0B;AAC9E,QAAM,sBAAsB,UAAU,QAAQ,gBAAgB;AAE9D,SACE,qBAAC,SAAI,WAAU,aACZ;AAAA,uBAAmB,oBAAC,OAAE,WAAU,4BAA4B,4BAAiB,IAAO;AAAA,IACrF,oBAAC,SAAI,WAAU,wBACZ;AAAA,MACC,EAAE,IAAI,SAAS,OAAO,EAAE,+CAA+C,GAAG,MAAM,iBAAiB;AAAA,MACjG,EAAE,IAAI,iBAAiB,OAAO,EAAE,sDAAsD,GAAG,MAAM,YAAY;AAAA,MAC3G,EAAE,IAAI,cAAc,OAAO,EAAE,mDAAmD,GAAG,MAAM,SAAS;AAAA,IACpG,EAAE,IAAI,CAAC,SAAS;AACd,YAAM,OAAO,KAAK;AAClB,YAAM,SAAS,gBAAgB,KAAK;AACpC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,SAAS,SAAS,YAAY;AAAA,UAC9B,MAAK;AAAA,UACL,SAAS,MAAM,SAAS,eAAe,KAAK,EAAE;AAAA,UAE9C;AAAA,gCAAC,QAAK,WAAU,gBAAe;AAAA,YAC9B,KAAK;AAAA;AAAA;AAAA,QAPD,KAAK;AAAA,MAQZ;AAAA,IAEJ,CAAC,GACH;AAAA,IAEC,gBAAgB,UACf,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,gBAAa,OAAO,EAAE,iDAAiD,GAAG,OAAO,uBAAuB,UAAQ,MAC/G;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,MAAK;AAAA,UACL,OAAO,qBAAqB,OAAO,gBAAgB;AAAA,UACnD,UAAU,CAAC,UAAU,SAAS,oBAAoB,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,UAC5E,aAAY;AAAA,UACZ,WAAW,oBAAoB,qBAAqB;AAAA,UACpD,gBAAc,QAAQ,qBAAqB;AAAA;AAAA,MAC7C,GACF;AAAA,MAEA,oBAAC,gBAAa,OAAO,EAAE,mDAAmD,GAAG,OAAO,yBAAyB,UAAQ,MACnH;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,WAAW,OAAO,sBAAsB,KAAK;AAAA,UACpD,UAAU,CAAC,SAAS,SAAS,0BAA0B,IAAI;AAAA,UAC3D,aAAa,EAAE,qCAAqC;AAAA;AAAA,MACtD,GACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,yDAAyD;AAAA,UAClE,MAAM,EAAE,wDAAwD;AAAA,UAChE,OAAO;AAAA,UAEP;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAI;AAAA,cACJ,MAAK;AAAA,cACL,OAAO,qBAAqB,OAAO,wBAAwB;AAAA,cAC3D,UAAU,CAAC,UAAU,SAAS,4BAA4B,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,cACpF,aAAY;AAAA,cACZ,WAAW,oBAAoB,6BAA6B;AAAA,cAC5D,gBAAc,QAAQ,6BAA6B;AAAA;AAAA,UACrD;AAAA;AAAA,MACF;AAAA,MAEA,oBAAC,SAAI,WAAU,kBACb,+BAAC,WAAM,WAAU,4FACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,YAAY,OAAO,uBAAuB,IAAI;AAAA,YACvD,UAAU,CAAC,UAAU,SAAS,yBAAyB,MAAM,OAAO,OAAO;AAAA;AAAA,QAC7E;AAAA,QACC,EAAE,sDAAsD;AAAA,SAC3D,GACF;AAAA,OACF,IACE;AAAA,IAEH,gBAAgB,kBACf,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,gBAAa,OAAO,EAAE,wDAAwD,GAAG,OAAO,sBAAsB,UAAQ,MACrH;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,MAAK;AAAA,UACL,OAAO,qBAAqB,OAAO,eAAe;AAAA,UAClD,UAAU,CAAC,UAAU,SAAS,mBAAmB,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,UAC3E,aAAY;AAAA,UACZ,WAAW,oBAAoB,oBAAoB;AAAA,UACnD,gBAAc,QAAQ,oBAAoB;AAAA;AAAA,MAC5C,GACF;AAAA,MAEA,oBAAC,gBAAa,OAAO,EAAE,wDAAwD,GAAG,OAAO,sBAAsB,UAAQ,MACrH;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,MAAK;AAAA,UACL,OAAO,qBAAqB,OAAO,eAAe;AAAA,UAClD,UAAU,CAAC,UAAU,SAAS,mBAAmB,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,UAC3E,aAAY;AAAA,UACZ,WAAW,oBAAoB,oBAAoB;AAAA,UACnD,gBAAc,QAAQ,oBAAoB;AAAA;AAAA,MAC5C,GACF;AAAA,MAEA,oBAAC,gBAAa,OAAO,EAAE,mDAAmD,GAAG,OAAO,2BAA2B,UAAQ,MACrH;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,WAAW,OAAO,wBAAwB,KAAK;AAAA,UACtD,UAAU,CAAC,SAAS,SAAS,4BAA4B,IAAI;AAAA,UAC7D,aAAa,EAAE,qCAAqC;AAAA;AAAA,MACtD,GACF;AAAA,OACF,IACE;AAAA,IAEH,gBAAgB,eACf;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,wBAAwB,OAAO,cAAc;AAAA,QACpD,UAAU,CAAC,SAAS,SAAS,kBAAkB,IAAI;AAAA,QACnD,OAAO;AAAA;AAAA,IACT,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,IAAI,KAAK;AACf,QAAM,eAAe;AAAA,IACnB,WAAW,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,IACrC,WAAW,OAAO,KAAK,IACvB,WAAW,OAAO,IAAI;AAAA,EAC5B,KAAK;AACL,QAAM,cAAc,WAAW,OAAO,IAAI;AAC1C,QAAM,eAAe,YAAY,KAAK,KAAK;AAC3C,QAAM,oBAAoB,WAAW,OAAO,UAAU,EAAE,KAAK;AAC7D,QAAM,YAAY,UAAU,QAAQ,MAAM;AAC1C,QAAM,aAAa,UAAU,QAAQ,OAAO;AAC5C,QAAM,gBAAgB,UAAU,QAAQ,UAAU;AAClD,QAAM,mBAAmB,UAAU,QAAQ,aAAa;AACxD,QAAM,YAAY,UAAU,QAAQ,MAAM;AAC1C,QAAM,gBAAgB,UAAU,QAAQ,YAAY;AAEpD,SACE,qBAAC,SAAI,WAAU,aACZ;AAAA,aAAS,SACR;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,mDAAmD;AAAA,QAC5D,MAAM,EAAE,kDAAkD;AAAA,QAC1D,OAAO;AAAA,QAEP,+BAAC,SAAI,WAAU,aACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,aAAa;AAAA,cACb,iBAAiB;AAAA,cACjB,cAAc,CAAC,UAAU,gBAAgB,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG,SAAS;AAAA,cAC5F,oBAAoB,CAAC,UAAU,gBAAgB,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG;AAAA,cACzF,UAAU,CAAC,cAAc;AACvB,sBAAM,aAAa,UAAU,KAAK;AAClC,yBAAS,cAAc,cAAc,IAAI;AACzC,qBAAK,cAAc,cAAc,IAAI;AAAA,cACvC;AAAA,cACA,aAAa,EAAE,yDAAyD;AAAA,cACxE,UAAU;AAAA,cACV,mBAAmB;AAAA;AAAA,UACrB;AAAA,UACA,qBAAC,SAAI,WAAU,qCACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,UAAU,sBAAsB,kBAAkB,WAAW;AAAA,gBAC7D,SAAS,MAAM;AACb,2BAAS,cAAc,IAAI;AAC3B,uBAAK,cAAc,IAAI;AAAA,gBACzB;AAAA,gBAEC,YAAE,yDAAyD;AAAA;AAAA,YAC9D;AAAA,YACC,qBACC,oBAAC,OAAE,WAAU,iCACV,YAAE,2DAA2D,GAChE,IAEA,oBAAC,OAAE,WAAU,iCACV,YAAE,+DAA+D,GACpE;AAAA,aAEJ;AAAA,WACF;AAAA;AAAA,IACF,IACE;AAAA,IAEJ,oBAAC,gBAAa,OAAO,EAAE,+CAA+C,GAAG,OAAO,WAAW,UAAQ,MACjG;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,WAAW,OAAO,IAAI;AAAA,QAC7B,UAAU,CAAC,UAAU,SAAS,QAAQ,MAAM,OAAO,KAAK;AAAA,QACxD,aAAa,EAAE,qDAAqD;AAAA,QACpE,WAAW,oBAAoB,SAAS;AAAA,QACxC,gBAAc,QAAQ,SAAS;AAAA;AAAA,IACjC,GACF;AAAA,IAEA,oBAAC,gBAAa,OAAO,EAAE,gDAAgD,GAAG,OAAO,YAC/E;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,WAAW,OAAO,KAAK;AAAA,QAC9B,UAAU,CAAC,UAAU,SAAS,SAAS,MAAM,OAAO,KAAK;AAAA,QACzD,aAAa,EAAE,sDAAsD;AAAA,QACrE,WAAW,oBAAoB,UAAU;AAAA,QACzC,gBAAc,QAAQ,UAAU;AAAA;AAAA,IAClC,GACF;AAAA,IAEA,oBAAC,gBAAa,OAAO,EAAE,mDAAmD,GAAG,OAAO,eAClF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,WAAW,OAAO,QAAQ;AAAA,QACjC,UAAU,CAAC,UAAU,SAAS,YAAY,MAAM,OAAO,KAAK;AAAA,QAC5D,aAAa,EAAE,yDAAyD;AAAA,QACxE,WAAW,oBAAoB,aAAa;AAAA,QAC5C,gBAAc,QAAQ,aAAa;AAAA;AAAA,IACrC,GACF;AAAA,IAEA,oBAAC,gBAAa,OAAO,EAAE,sDAAsD,GAAG,MAAM,EAAE,qDAAqD,GAAG,OAAO,kBACrJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,WAAW,OAAO,WAAW;AAAA,QACpC,UAAU,CAAC,SAAS,SAAS,eAAe,IAAI;AAAA,QAChD,mBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,aAAa,EAAE,4DAA4D;AAAA;AAAA,IAC7E,GACF;AAAA,IAEC,SAAS,SACR,oBAAC,gBAAa,OAAO,EAAE,+CAA+C,GAAG,MAAM,EAAE,8CAA8C,GAAG,OAAO,WACvI,+BAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,SAAS,QAAQ,MAAM,OAAO,KAAK;AAAA,YACxD,aAAa,EAAE,qDAAqD;AAAA,YACpE,WAAW,oBAAoB,SAAS;AAAA,YACxC,gBAAc,QAAQ,SAAS;AAAA;AAAA,QACjC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS,MAAM,SAAS,QAAQ,YAAY;AAAA,YAE5C;AAAA,kCAAC,YAAS,WAAU,gBAAe;AAAA,cAClC,EAAE,wDAAwD;AAAA;AAAA;AAAA,QAC7D;AAAA,SACF;AAAA,MACA,oBAAC,OAAE,WAAU,iCAAiC,YAAE,iDAAiD,EAAE,MAAM,aAAa,CAAC,GAAE;AAAA,OAC3H,GACF,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmF;AACjF,QAAM,IAAI,KAAK;AACf,QAAM,YAAY,aAAa,QAAQ,oBAAoB,SAAS;AACpE,QAAM,oBAAoB,UAAU,QAAQ,cAAc;AAC1D,QAAM,sBAAsB,UAAU,QAAQ,gBAAgB;AAC9D,QAAM,uBAAuB,UAAU,QAAQ,iBAAiB;AAChE,QAAM,iBAAiB,UAAU,QAAQ,WAAW;AACpD,QAAM,2BAA2B,UAAU,QAAQ,2BAA2B;AAE9E,SACE,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU;AAAA,QACV,cAAc,WAAW,OAAO,gBAAgB,KAAK;AAAA,QACrD,SAAS,WAAW,OAAO,OAAO,KAAK;AAAA,QACvC,OAAO;AAAA,QACP,UAAU,CAAC,SAAS;AAClB,mBAAS,oBAAoB,KAAK,gBAAgB;AAClD,mBAAS,WAAW,KAAK,OAAO;AAAA,QAClC;AAAA;AAAA,IACF;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,0DAA0D;AAAA,UACnE,OAAO,WAAW,OAAO,YAAY,KAAK,eAAe;AAAA,UACzD,UAAU,CAAC,SAAS,SAAS,gBAAgB,IAAI;AAAA,UACjD,OAAO;AAAA;AAAA,MACT;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,4DAA4D;AAAA,UACrE,OAAO,WAAW,OAAO,cAAc,KAAK,eAAe;AAAA,UAC3D,UAAU,CAAC,SAAS,SAAS,kBAAkB,IAAI;AAAA,UACnD,OAAO;AAAA;AAAA,MACT;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE,6DAA6D;AAAA,UACtE,OAAO,WAAW,OAAO,eAAe,KAAK,eAAe;AAAA,UAC5D,UAAU,CAAC,SAAS,SAAS,mBAAmB,IAAI;AAAA,UACpD,OAAO;AAAA;AAAA,MACT;AAAA,OACF;AAAA,IAEA,oBAAC,gBAAa,OAAO,EAAE,uDAAuD,GAAG,OAAO,gBACtF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,iBACP,4DAA4D,oBAAoB,cAAc,CAAC,KAC/F;AAAA,QACJ,OAAO,WAAW,OAAO,SAAS,KAAK;AAAA,QACvC,UAAU,CAAC,UAAU,SAAS,aAAa,MAAM,OAAO,KAAK;AAAA,QAC7D,gBAAc,QAAQ,cAAc;AAAA,QAEpC;AAAA,8BAAC,YAAO,OAAM,QAAQ,YAAE,sDAAsD,GAAE;AAAA,UAChF,oBAAC,YAAO,OAAM,SAAS,YAAE,uDAAuD,GAAE;AAAA,UAClF,oBAAC,YAAO,OAAM,QAAQ,YAAE,sDAAsD,GAAE;AAAA;AAAA;AAAA,IAClF,GACF;AAAA,IAEA,qBAAC,WAAM,WAAU,4FACf;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,YAAY,OAAO,yBAAyB;AAAA,UACrD,UAAU,CAAC,UAAU,SAAS,6BAA6B,MAAM,OAAO,OAAO;AAAA;AAAA,MACjF;AAAA,MACC,EAAE,iEAAiE;AAAA,OACtE;AAAA,IACC,2BAA2B,oBAAC,OAAE,WAAU,4BAA4B,oCAAyB,IAAO;AAAA,KACvG;AAEJ;AAEA,SAAS,eAAe,EAAE,QAAQ,UAAU,QAAQ,UAAU,GAAsE;AAClI,QAAM,IAAI,KAAK;AACf,QAAM,sBAAsB,WAAW,OAAO,kBAAkB;AAChE,QAAM,mBAAmB,UAAU,KAAK,CAAC,aAAa,SAAS,gBAAgB,mBAAmB;AAClG,QAAM,uBAAuB,UAAU,QAAQ,oBAAoB,MAC7D,MAAM;AACR,UAAM,aAAa,0CAA0C,gBAAgB;AAC7E,WAAO,aAAa,EAAE,UAAU,IAAI;AAAA,EACtC,GAAG;AACL,QAAM,uBAAuB,UAAU,QAAQ,iBAAiB;AAEhE,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,gBAAa,OAAO,EAAE,0DAA0D,GAAG,OAAO,sBAAsB,UAAQ,MACvH;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,uBACP,4DAA4D,oBAAoB,oBAAoB,CAAC,KACrG;AAAA,QACJ,OAAO,WAAW,OAAO,kBAAkB;AAAA,QAC3C,UAAU,CAAC,UAAU,SAAS,sBAAsB,MAAM,OAAO,KAAK;AAAA,QACtE,gBAAc,QAAQ,oBAAoB;AAAA,QAE1C;AAAA,8BAAC,YAAO,OAAM,IAAI,YAAE,yDAAyD,GAAE;AAAA,UAC9E,UAAU,IAAI,CAAC,aACd;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,SAAS;AAAA,cAChB,UAAU,SAAS,iBAAiB;AAAA,cAEnC,mBAAS,iBAAiB,QACvB,GAAG,SAAS,KAAK,IAAI,EAAE,6DAA6D,CAAC,KACrF,SAAS;AAAA;AAAA,YANR,SAAS;AAAA,UAOhB,CACD;AAAA;AAAA;AAAA,IACH,GACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,WAAW,OAAO,kBAAkB,KAAK;AAAA,QACtD,OAAO,SAAS,OAAO,eAAe,IAAI,OAAO,kBAAkB,CAAC;AAAA,QACpE,UAAU,CAAC,SAAS,SAAS,mBAAmB,IAAI;AAAA;AAAA,IACtD;AAAA,IACC,uBAAuB,oBAAC,OAAE,WAAU,4BAA4B,gCAAqB,IAAO;AAAA,KAC/F;AAEJ;AAEA,SAAS,uBAAuB,EAAE,QAAQ,UAAU,OAAO,GAAgC;AACzF,QAAM,IAAI,KAAK;AACf,QAAM,yBAAyB,YAAY,OAAO,wBAAwB,IAAI;AAC9E,QAAM,8BAA8B,UAAU,QAAQ,wBAAwB;AAC9E,QAAM,sBAAsB,+BAA+B,MAAM;AAEjE,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,WAAM,WAAU,2FACf;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,CAAC,UAAU,SAAS,0BAA0B,MAAM,OAAO,OAAO;AAAA;AAAA,MAC9E;AAAA,MACA,qBAAC,UAAK,WAAU,aACd;AAAA,6BAAC,UAAK,WAAU,uCACd;AAAA,8BAAC,UAAO,WAAU,WAAU;AAAA,UAC3B,EAAE,iDAAiD;AAAA,WACtD;AAAA,QACA,oBAAC,UAAK,WAAU,+BACb,YAAE,uDAAuD,GAC5D;AAAA,SACF;AAAA,OACF;AAAA,IACC,8BAA8B,oBAAC,OAAE,WAAU,4BAA4B,uCAA4B,IAAO;AAAA,IAE1G,yBACC,iCACE;AAAA,0BAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,8DAA8D,GACnE,GACF;AAAA,MACC,sBAAsB,oBAAC,OAAE,WAAU,4BAA4B,+BAAoB,IAAO;AAAA,MAC3F;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,mBAAmB,OAAO,sBAAsB,CAAC;AAAA,UACxD,UAAU,CAAC,SAAS,SAAS,wBAAwB,IAAI;AAAA,UACzD;AAAA;AAAA,MACF;AAAA,OACF,IAEA,oBAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,4DAA4D,GACjE,GACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,aAAa,EAAE,QAAQ,UAAU,OAAO,GAAgC;AAC/E,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,KAAK,MAAM,IAAI,MAAM,SAAoC,OAAO;AACvE,QAAM,iBAAiB,wBAAwB,OAAO,cAAc;AACpE,QAAM,kBAAkB,aAAa,QAAQ,8BAA8B,sBAAsB;AACjG,QAAM,qBAAqB,aAAa,QAAQ,iCAAiC,sBAAsB;AACvG,QAAM,oBAAoB,aAAa,QAAQ,sCAAsC,8BAA8B;AACnH,QAAM,uBAAuB,aAAa,QAAQ,yCAAyC,8BAA8B;AAEzH,QAAM,gBAAgB,MAAM;AAAA,IAC1B,CAAC,KAAgC,UAAuC;AACtE,eAAS,kBAAkB;AAAA,QACzB,GAAG;AAAA,QACH,CAAC,GAAG,GAAG;AAAA,UACL,GAAG,eAAe,GAAG;AAAA,UACrB,GAAG;AAAA,QACL;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,gBAAgB,QAAQ;AAAA,EAC3B;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,wCAAwC,GAC7C,GACF;AAAA,IAEA,qBAAC,QAAK,OAAO,KAAK,eAAe,CAAC,SAAS,OAAO,IAAiC,GACjF;AAAA,2BAAC,YAAS,WAAW,0BACnB;AAAA,6BAAC,eAAY,OAAM,SAAQ,WAAW,6BACpC;AAAA,8BAAC,UAAO,WAAU,gBAAe;AAAA,UAChC,EAAE,4CAA4C;AAAA,WACjD;AAAA,QACA,qBAAC,eAAY,OAAM,iBAAgB,WAAW,6BAC5C;AAAA,8BAAC,cAAW,WAAU,gBAAe;AAAA,UACpC,EAAE,8CAA8C;AAAA,WACnD;AAAA,SACF;AAAA,MAEA,qBAAC,eAAY,OAAM,SAAQ,WAAU,aACnC;AAAA,4BAAC,gBAAa,OAAO,EAAE,mDAAmD,GAAG,OAAO,iBAClF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,eAAe,MAAM;AAAA,YAC5B,UAAU,CAAC,UAAU,cAAc,SAAS,EAAE,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,YACzE,aAAa,EAAE,yDAAyD;AAAA,YACxE,WAAW,oBAAoB,eAAe;AAAA,YAC9C,gBAAc,QAAQ,eAAe;AAAA;AAAA,QACvC,GACF;AAAA,QACA,oBAAC,gBAAa,OAAO,EAAE,kDAAkD,GAAG,OAAO,oBACjF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,eAAe,MAAM;AAAA,YAC5B,UAAU,CAAC,SAAS,cAAc,SAAS,EAAE,UAAU,KAAK,CAAC;AAAA,YAC7D,mBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,aAAa,EAAE,wDAAwD;AAAA;AAAA,QACzE,GACF;AAAA,QACA,qBAAC,WAAM,WAAU,mCACf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,eAAe,MAAM;AAAA,cAC9B,UAAU,CAAC,UAAU,cAAc,SAAS,EAAE,UAAU,MAAM,OAAO,QAAQ,CAAC;AAAA;AAAA,UAChF;AAAA,UACC,EAAE,2DAA2D;AAAA,WAChE;AAAA,SACF;AAAA,MAEA,qBAAC,eAAY,OAAM,iBAAgB,WAAU,aAC3C;AAAA,4BAAC,gBAAa,OAAO,EAAE,qDAAqD,GAAG,OAAO,mBACpF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,eAAe,cAAc;AAAA,YACpC,UAAU,CAAC,UAAU,cAAc,iBAAiB,EAAE,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,YACjF,aAAa,EAAE,2DAA2D;AAAA,YAC1E,WAAW,oBAAoB,iBAAiB;AAAA,YAChD,gBAAc,QAAQ,iBAAiB;AAAA;AAAA,QACzC,GACF;AAAA,QACA,oBAAC,gBAAa,OAAO,EAAE,oDAAoD,GAAG,OAAO,sBACnF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,eAAe,cAAc;AAAA,YACpC,UAAU,CAAC,SAAS,cAAc,iBAAiB,EAAE,UAAU,KAAK,CAAC;AAAA,YACrE,mBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,aAAa,EAAE,0DAA0D;AAAA;AAAA,QAC3E,GACF;AAAA,QACA,qBAAC,WAAM,WAAU,mCACf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,eAAe,cAAc;AAAA,cACtC,UAAU,CAAC,UAAU,cAAc,iBAAiB,EAAE,UAAU,MAAM,OAAO,QAAQ,CAAC;AAAA;AAAA,UACxF;AAAA,UACC,EAAE,2DAA2D;AAAA,WAChE;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,gBAAgB,EAAE,QAAQ,UAAU,OAAO,GAAgC;AAClF,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,KAAK,MAAM,IAAI,MAAM,SAAyC,SAAS;AAE9E,QAAM,SAAS;AAAA,IACb,SAAS;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,MACT,kBAAkB,EAAE,8DAA8D;AAAA,MAClF,iBAAiB,EAAE,6DAA6D;AAAA,MAChF,OAAO,EAAE,iDAAiD;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,kBAAkB,EAAE,6DAA6D;AAAA,MACjF,iBAAiB,EAAE,4DAA4D;AAAA,MAC/E,OAAO,EAAE,gDAAgD;AAAA,IAC3D;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,kBAAkB,EAAE,4DAA4D;AAAA,MAChF,iBAAiB,EAAE,2DAA2D;AAAA,MAC9E,OAAO,EAAE,+CAA+C;AAAA,IAC1D;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,2CAA2C,GAChD,GACF;AAAA,IAEA,qBAAC,QAAK,OAAO,KAAK,eAAe,CAAC,SAAS,OAAO,IAAsC,GACtF;AAAA,0BAAC,YAAS,WAAW,0BACjB,WAAC,WAAW,UAAU,OAAO,EAAY,IAAI,CAAC,SAC9C,qBAAC,eAAuB,OAAO,MAAM,WAAW,6BAC9C;AAAA,4BAAC,iBAAc,WAAU,gBAAe;AAAA,QACvC,OAAO,IAAI,EAAE;AAAA,WAFE,IAGlB,CACD,GACH;AAAA,MAEE,CAAC,WAAW,UAAU,OAAO,EAAY,IAAI,CAAC,SAC9C,qBAAC,eAAuB,OAAO,MAAM,WAAU,aAC7C;AAAA,4BAAC,gBAAa,OAAO,EAAE,mDAAmD,EAAE,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,UAAU,QAAQ,OAAO,IAAI,EAAE,QAAQ,GACtJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,WAAW,OAAO,OAAO,IAAI,EAAE,QAAQ,CAAC;AAAA,YAC/C,UAAU,CAAC,UAAU,SAAS,OAAO,IAAI,EAAE,UAAU,MAAM,OAAO,KAAK;AAAA,YACvE,aAAa,OAAO,IAAI,EAAE;AAAA,YAC1B,WAAW,oBAAoB,UAAU,QAAQ,OAAO,IAAI,EAAE,QAAQ,CAAC;AAAA,YACvE,gBAAc,QAAQ,UAAU,QAAQ,OAAO,IAAI,EAAE,QAAQ,CAAC;AAAA;AAAA,QAChE,GACF;AAAA,QACA,oBAAC,gBAAa,OAAO,EAAE,kDAAkD,EAAE,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,UAAU,QAAQ,OAAO,IAAI,EAAE,OAAO,GACpJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,WAAW,OAAO,OAAO,IAAI,EAAE,OAAO,CAAC;AAAA,YAC9C,UAAU,CAAC,SAAS,SAAS,OAAO,IAAI,EAAE,SAAS,IAAI;AAAA,YACvD,mBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,aAAa,OAAO,IAAI,EAAE;AAAA;AAAA,QAC5B,GACF;AAAA,WAlBgB,IAmBlB,CACD;AAAA,OACH;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe;AACtB,QAAM,IAAI,KAAK;AACf,QAAM,YAAY,CAAC,iBAAiB,cAAc,oBAAoB,iBAAiB,qBAAqB,kBAAkB;AAC9H,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,OAAE,WAAU,iCAAiC,YAAE,+CAA+C,GAAE;AAAA,IACjG,oBAAC,SAAI,WAAU,wBACd,oBAAU,IAAI,CAAC,aACd;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAET;AAAA;AAAA,MAHI;AAAA,IAIP,CACD,GACD;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc,EAAE,QAAQ,UAAU,OAAO,GAAgC;AAChF,QAAM,IAAI,KAAK;AACf,QAAM,CAAC,KAAK,MAAM,IAAI,MAAM,SAAwC,OAAO;AAE3E,QAAM,SAAS;AAAA,IACb,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,EAAE,6CAA6C;AAAA,MACtD,MAAM;AAAA,MACN,oBAAoB,EAAE,4DAA4D;AAAA,MAClF,iBAAiB,EAAE,yDAAyD;AAAA,IAC9E;AAAA,IACA,SAAS;AAAA,MACP,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,EAAE,+CAA+C;AAAA,MACxD,MAAM;AAAA,MACN,oBAAoB,EAAE,8DAA8D;AAAA,MACpF,iBAAiB,EAAE,2DAA2D;AAAA,IAChF;AAAA,IACA,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,EAAE,6CAA6C;AAAA,MACtD,MAAM;AAAA,MACN,oBAAoB,EAAE,4DAA4D;AAAA,MAClF,iBAAiB,EAAE,yDAAyD;AAAA,IAC9E;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAM,SAAQ,QACb,8BAAC,oBACE,YAAE,yCAAyC,GAC9C,GACF;AAAA,IACA,oBAAC,gBAAa;AAAA,IAEd,qBAAC,QAAK,OAAO,KAAK,eAAe,CAAC,SAAS,OAAO,IAAqC,GACrF;AAAA,0BAAC,YAAS,WAAW,0BACjB,WAAC,SAAS,WAAW,OAAO,EAAY,IAAI,CAAC,SAAS;AACtD,cAAM,OAAO,OAAO,IAAI,EAAE;AAC1B,eACE,qBAAC,eAAuB,OAAO,MAAM,WAAW,6BAC9C;AAAA,8BAAC,QAAK,WAAU,gBAAe;AAAA,UAC9B,OAAO,IAAI,EAAE;AAAA,aAFE,IAGlB;AAAA,MAEJ,CAAC,GACH;AAAA,MAEE,CAAC,SAAS,WAAW,OAAO,EAAY,IAAI,CAAC,SAC7C,qBAAC,eAAuB,OAAO,MAAM,WAAU,aAC7C;AAAA,6BAAC,WAAM,WAAU,4FACf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,YAAY,OAAO,OAAO,IAAI,EAAE,UAAU,GAAG,IAAI;AAAA,cAC1D,UAAU,CAAC,UAAU,SAAS,OAAO,IAAI,EAAE,YAAY,MAAM,OAAO,OAAO;AAAA;AAAA,UAC7E;AAAA,UACC,EAAE,iDAAiD;AAAA,WACtD;AAAA,QAEA,oBAAC,gBAAa,OAAO,EAAE,mDAAmD,EAAE,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,UAAU,QAAQ,OAAO,IAAI,EAAE,UAAU,GACxJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,WAAW,OAAO,OAAO,IAAI,EAAE,UAAU,CAAC;AAAA,YACjD,UAAU,CAAC,UAAU,SAAS,OAAO,IAAI,EAAE,YAAY,MAAM,OAAO,KAAK;AAAA,YACzE,aAAa,OAAO,IAAI,EAAE;AAAA,YAC1B,WAAW,oBAAoB,UAAU,QAAQ,OAAO,IAAI,EAAE,UAAU,CAAC;AAAA,YACzE,gBAAc,QAAQ,UAAU,QAAQ,OAAO,IAAI,EAAE,UAAU,CAAC;AAAA;AAAA,QAClE,GACF;AAAA,QAEA,oBAAC,gBAAa,OAAO,EAAE,gDAAgD,EAAE,OAAO,OAAO,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,UAAU,QAAQ,OAAO,IAAI,EAAE,OAAO,GAClJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,WAAW,OAAO,OAAO,IAAI,EAAE,OAAO,CAAC;AAAA,YAC9C,UAAU,CAAC,SAAS,SAAS,OAAO,IAAI,EAAE,SAAS,IAAI;AAAA,YACvD,mBAAiB;AAAA,YACjB,QAAQ;AAAA,YACR,aAAa,OAAO,IAAI,EAAE;AAAA;AAAA,QAC5B,GACF;AAAA,WA5BgB,IA6BlB,CACD;AAAA,OACH;AAAA,KACF;AAEJ;AAEA,SAAS,gBAAgB,EAAE,QAAQ,UAAU,OAAO,GAAgC;AAClF,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,WAAW,OAAO,MAAM,KAAK;AAC5C,QAAM,cAAc,UAAU,QAAQ,QAAQ;AAC9C,QAAM,sBAAsB,UAAU,QAAQ,gBAAgB;AAC9D,QAAM,gBAAgB,UAAU,QAAQ,UAAU;AAElD,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,gBAAa,OAAO,EAAE,kDAAkD,GAAG,OAAO,aACjF,8BAAC,SAAI,WAAU,wBACZ;AAAA,MACC,EAAE,IAAI,SAAS,OAAO,EAAE,8BAA8B,EAAE;AAAA,MACxD,EAAE,IAAI,UAAU,OAAO,EAAE,+BAA+B,EAAE;AAAA,MAC1D,EAAE,IAAI,YAAY,OAAO,EAAE,iCAAiC,EAAE;AAAA,IAChE,EAAE,IAAI,CAAC,WACL;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,WAAW,OAAO,KAAK,YAAY;AAAA,QAC5C,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,UAAU,OAAO,EAAE;AAAA,QAE1C,iBAAO;AAAA;AAAA,MANH,OAAO;AAAA,IAOd,CACD,GACH,GACF;AAAA,IAEA,oBAAC,gBAAa,OAAO,EAAE,0DAA0D,GAAG,MAAM,EAAE,yDAAyD,GAAG,OAAO,qBAC7J;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAI;AAAA,QACJ,MAAK;AAAA,QACL,OAAO,qBAAqB,OAAO,cAAc;AAAA,QACjD,UAAU,CAAC,UAAU,SAAS,kBAAkB,MAAM,OAAO,QAAQ,OAAO,MAAM,OAAO,KAAK,IAAI,IAAI;AAAA,QACtG,aAAa,EAAE,2DAA2D;AAAA,QAC1E,WAAW,oBAAoB,mBAAmB;AAAA,QAClD,gBAAc,QAAQ,mBAAmB;AAAA;AAAA,IAC3C,GACF;AAAA,IAEA,oBAAC,gBAAa,OAAO,EAAE,oDAAoD,GAAG,MAAM,EAAE,mDAAmD,GAAG,OAAO,eACjJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,WAAW,OAAO,QAAQ;AAAA,QACjC,UAAU,CAAC,UAAU,SAAS,YAAY,MAAM,OAAO,KAAK;AAAA,QAC5D,aAAa,EAAE,0DAA0D;AAAA,QACzE,WAAW,oBAAoB,aAAa;AAAA,QAC5C,gBAAc,QAAQ,aAAa;AAAA;AAAA,IACrC,GACF;AAAA,KACF;AAEJ;AAEO,SAAS,iBAAiB,EAAE,MAAM,SAAS,GAAU;AAC1D,QAAM,IAAI,KAAK;AACf,QAAM,eAAe,gBAAgB;AACrC,QAAM,WAAW,SAAS,SAAS,oBAAoB,OAAO,oBAAoB;AAClF,QAAM,aAAa,MAAM,QAAQ,MAAM;AACrC,UAAM,MAAM,aAAa,IAAI,YAAY;AACzC,WAAO,OAAO,IAAI,KAAK,EAAE,SAAS,IAAI,MAAM;AAAA,EAC9C,GAAG,CAAC,YAAY,CAAC;AACjB,QAAM,0BAA0B,MAAM;AAAA,IACpC,MAAM,aAAa,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,aAAa,OAAO,WAAW,IAAI,SAAS,KAAK,IAAI,CAAC;AAAA,IACvI,CAAC,QAAQ;AAAA,EACX;AACA,QAAM,6BAA6B,MAAM,OAAsB,IAAI;AACnE,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAA+B,CAAC,CAAC;AACzE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAA2B,CAAC,CAAC;AACjF,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,MAAM,SAAS,KAAK;AACxE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,MAAM,SAAS,CAAC;AAC9D,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM;AAAA,IAC9C,WAAW,OAAO,oBAAoB,oBAAoB,CAAC,GAAG,CAAC;AAAA,EACjE;AAEA,QAAM,uBAAuB,MAAM,YAAY,CAAC,eAA2B;AACzE,qBAAiB,UAAU;AAC3B,uBAAmB,CAAC,YAAY,UAAU,CAAC;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,MAAM;AACpB,+BAA2B,UAAU,iBAAiB,OAAO,cAAc,qBAAqB,WAC5F,cAAc,mBACd;AAAA,EACN,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS;AACb,SAAK,qBAAsD,iCAAiC,EACzF,KAAK,CAAC,WAAW;AAChB,UAAI,CAAC,OAAQ;AACb,mBAAa,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC,CAAC;AAAA,IAC9D,CAAC,EACA,MAAM,MAAM;AACX,UAAI,OAAQ,cAAa,CAAC,CAAC;AAAA,IAC7B,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,0BAA0B,MAAM,YAAY,CAAC,UAAgD;AACjG,uBAAmB,CAAC,YAAY;AAC9B,YAAM,OAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,OAAO,MAAM,CAAC,CAAC;AACpE,YAAM,QAAQ,CAAC,SAAS;AACtB,YAAI,WAAW,MAAM;AACnB,eAAK,IAAI,KAAK,OAAO,IAAI;AACzB;AAAA,QACF;AACA,cAAM,SAAS,iBAAiB,IAAI;AACpC,aAAK,IAAI,OAAO,OAAO,MAAM;AAAA,MAC/B,CAAC;AACD,aAAO,MAAM,KAAK,KAAK,OAAO,CAAC;AAAA,IACjC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,0BAA0B,MAAM,YAAY,OAAO,UAA8C;AACrG,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,SAAS,MAAM,KAAK,EAAE,SAAS,GAAG;AACpC,aAAO,IAAI,UAAU,MAAM,KAAK,CAAC;AAAA,IACnC;AACA,UAAM,SAAS,MAAM,qBAAmD,2BAA2B,OAAO,SAAS,CAAC,EAAE;AACtH,UAAM,UAAU,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,MAAM,IAAI,gBAAgB,IAAI,CAAC;AACpF,4BAAwB,OAAO;AAC/B,WAAO;AAAA,EACT,GAAG,CAAC,uBAAuB,CAAC;AAE5B,QAAM,gBAAgB,MAAM,YAAY,OAAO,mBAAkC;AAC/E,QAAI,YAAY,SAAS,OAAQ;AACjC,QAAI,CAAC,gBAAgB;AACnB,2BAAqB,oBAAoB,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACnE;AAAA,IACF;AACA,0BAAsB,IAAI;AAC1B,QAAI;AACF,YAAM,SAAS,MAAM,qBAAiC,2BAA2B,mBAAmB,cAAc,CAAC,EAAE;AACrH,8BAAwB,CAAC;AAAA,QACvB,IAAI;AAAA,QACJ,MAAM,WAAW,OAAO,IAAI;AAAA,QAC5B,OAAO,WAAW,OAAO,KAAK,KAAK;AAAA,QACnC,oBAAoB,WAAW,OAAO,kBAAkB,KAAK;AAAA,QAC7D,aAAa,WAAW,OAAO,WAAW,KAAK;AAAA,MACjD,CAAC,CAAC;AACF;AAAA,QACE,oBAAoB;AAAA,UAClB,GAAG;AAAA,UACH,MAAM;AAAA,UACN,YAAY;AAAA,QACd,GAAG,CAAC;AAAA,MACN;AAAA,IACF,UAAE;AACA,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,yBAAyB,sBAAsB,CAAC,CAAC;AAErE,QAAM,UAAU,MAAM;AACpB,QAAI,SAAS,UAAU,SAAU;AACjC,SAAK,wBAAwB,EAC1B,MAAM,MAAM,IAAI;AAAA,EACrB,GAAG,CAAC,yBAAyB,MAAM,QAAQ,CAAC;AAE5C,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,SAAU;AACf,QAAI,SAAS;AACb,SAAK,qBAAiC,iBAAiB,SAAS,SAAS,UAAU,WAAW,IAAI,mBAAmB,QAAQ,CAAC,EAAE,EAC7H,KAAK,CAAC,WAAW;AAChB,UAAI,CAAC,OAAQ;AACb,2BAAqB,oBAAoB,QAAQ,CAAC,CAAC;AAAA,IACrD,CAAC,EACA,MAAM,MAAM;AACX,UAAI,OAAQ,sBAAqB,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAAA,IAC7D,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,sBAAsB,CAAC,CAAC;AAE5C,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY,SAAS,UAAU,CAAC,WAAY;AAChD,SAAK,cAAc,UAAU,EAAE,MAAM,MAAM,IAAI;AAAA,EACjD,GAAG,CAAC,eAAe,MAAM,UAAU,UAAU,CAAC;AAE9C,QAAM,UAAU,MAAM;AACpB,UAAM,oBAAoB,WAAW,eAAe,UAAU,EAAE,KAAK;AACrE,QAAI,SAAS,UAAU,CAAC,kBAAmB;AAC3C,QAAI,gBAAgB,KAAK,CAAC,WAAW,OAAO,UAAU,iBAAiB,EAAG;AAE1E,QAAI,SAAS;AACb,SAAK,qBAAiC,2BAA2B,mBAAmB,iBAAiB,CAAC,EAAE,EACrG,KAAK,CAAC,WAAW;AAChB,UAAI,CAAC,OAAQ;AACb,8BAAwB,CAAC;AAAA,QACvB,IAAI;AAAA,QACJ,MAAM,WAAW,OAAO,IAAI;AAAA,QAC5B,OAAO,WAAW,OAAO,KAAK,KAAK;AAAA,QACnC,oBAAoB,WAAW,OAAO,kBAAkB,KAAK;AAAA,QAC7D,aAAa,WAAW,OAAO,WAAW,KAAK;AAAA,MACjD,CAAC,CAAC;AAAA,IACJ,CAAC,EACA,MAAM,MAAM,IAAI;AAEnB,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,eAAe,YAAY,MAAM,yBAAyB,eAAe,CAAC;AAE9E,QAAM,SAAS,MAAM,QAAqB,MAAM,CAAC,GAAG,CAAC,CAAC;AAEtD,QAAM,SAAS,MAAM,QAAyB,MAAM;AAAA,IAClD;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,0CAA0C;AAAA,MACnD,QAAQ;AAAA,MACR,WAAW,CAAC,QACV;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,0CAA0C;AAAA,MACnD,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,kBAAgB,GAAG,KAAK,WAAsB;AAAA,IACrE;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,0CAA0C;AAAA,MACnD,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,kBAAgB,GAAG,KAAK;AAAA,IAC/C;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,6CAA6C;AAAA,MACtD,QAAQ;AAAA,MACR,WAAW,CAAC,QACV;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA,oBAAoB;AAAA;AAAA,MACtB;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,iDAAiD;AAAA,MAC1D,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,0BAAwB,GAAG,KAAK;AAAA,IACvD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,2CAA2C;AAAA,MACpD,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,mBAAiB,GAAG,KAAK;AAAA,IAChD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,wCAAwC;AAAA,MACjD,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,gBAAc,GAAG,KAAK;AAAA,IAC7C;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,2CAA2C;AAAA,MACpD,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,mBAAiB,GAAG,KAAK;AAAA,IAChD;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,EAAE,yCAAyC;AAAA,MAClD,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,oBAAC,iBAAe,GAAG,KAAK;AAAA,IAC9C;AAAA,IACA,EAAE,IAAI,gBAAgB,OAAO,EAAE,+CAA+C,GAAG,QAAQ,GAAG,MAAM,eAAe;AAAA,EACnH,GAAG,CAAC,eAAe,yBAAyB,UAAU,oBAAoB,yBAAyB,MAAM,WAAW,GAAG,eAAe,CAAC;AAEvI,QAAM,WAAW,SAAS,UAAU,QAAQ,QAAQ,KAAK,YAAY,eAAe,QAAQ;AAC5F,QAAM,SAAS,MAAM;AAAA,IACnB,MAAM,YAAY,IAAI,WAAW,YAAY,KAAK;AAAA,IAClD,CAAC,MAAM,QAAQ;AAAA,EACjB;AACA,QAAM,eAAe,WACnB,qBAAC,SAAM,SAAQ,WACb;AAAA,wBAAC,cAAY,YAAE,wCAAwC,GAAE;AAAA,IACzD,oBAAC,oBAAkB,YAAE,8CAA8C,GAAE;AAAA,KACvE,IACE;AACJ,QAAM,gBAAgB,WACpB,qBAAC,SAAI,WAAU,yHACb;AAAA,wBAAC,SAAI,WAAU,sHACb,8BAAC,UAAO,WAAU,WAAU,GAC9B;AAAA,IACA,oBAAC,OAAE,WAAU,yCACV,YAAE,+CAA+C,GACpD;AAAA,IACA,oBAAC,OAAE,WAAU,sCACV,YAAE,qDAAqD,GAC1D;AAAA,KACF,IACE;AAEJ,SACE,oBAAC,QACC,8BAAC,YACE,0BACC;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA,OAAO,WACH,EAAE,SAAS,SAAS,8CAA8C,+CAA+C,IACjH,EAAE,SAAS,SAAS,gDAAgD,iDAAiD;AAAA,MACzH,UAAU,SAAS,SAAS,gCAAgC;AAAA,MAC5D,YAAY,SAAS,SAAS,gCAAgC;AAAA,MAC9D;AAAA,MACA;AAAA,MACA,cAAc,WACZ,iCACG;AAAA,mBACC,oBAAC,UAAO,SAAO,MAAC,MAAK,UAAS,SAAQ,WACpC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,SAAS,SACX,QAAQ,mBAAmB,WAAW,cAAc,IAAI,CAAC,CAAC,kBAC1D,+BAA+B,mBAAmB,QAAQ,CAAC;AAAA,YAC/D,QAAO;AAAA,YACP,KAAI;AAAA,YAEJ;AAAA,kCAAC,OAAI,WAAU,gBAAe;AAAA,cAC7B,EAAE,iCAAiC;AAAA;AAAA;AAAA,QACtC,GACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAM;AAAA,YACN,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,OAAM;AAAA,YAEN;AAAA,kCAAC,OAAI,WAAU,gBAAe;AAAA,cAC7B,EAAE,iCAAiC;AAAA;AAAA;AAAA,QACtC;AAAA,QAED,SAAS,UAAU,YAAY,CAAC,WAC/B;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAM;AAAA,YACN,MAAK;AAAA,YACL,OAAM;AAAA,YAEN;AAAA,kCAAC,cAAW,WAAU,gBAAe;AAAA,cACpC,EAAE,wCAAwC;AAAA;AAAA;AAAA,QAC7C,IACE;AAAA,SACN,IACE;AAAA,MACJ;AAAA,MACA,wBAAwB,EAAE,CAAC,QAAQ,GAAG,EAAE,UAAU,qBAAqB,EAAE;AAAA,MACzE;AAAA,MACA,eAAe;AAAA,MACf,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,eAAe,QAAQ,QAAQ;AAAA,MAC/B,UAAU,OAAO,QAAQ,YAAY;AACnC,cAAM,eAAe,SAAS,WAAW,UAAU,YAC/C,YACA,SAAS,WAAW,UAAU,YAC5B,YACA;AACN,cAAM,oBAAoB,iBAAiB;AAC3C,cAAM,UAAU;AAAA,UACd,GAAG;AAAA,UACH,QAAQ,iBAAiB,YAAY,WAAW,OAAO;AAAA,UACvD,cAAc,yBAAyB,MAAM;AAAA,QAC/C;AACA,cAAM,WAAW,iBAAiB,SAAS,SAAS,UAAU,WAAW,GAAG,WAAW,IAAI,mBAAmB,QAAQ,CAAC,KAAK,EAAE;AAC9H,YAAI;AACJ,YAAI;AACF,qBAAW,MAAM;AAAA,YACf,WAAW,0BAA0B,WAAW,eAAe,SAAS,KAAK,IAAI,IAAI,CAAC;AAAA,YACtF,MAAM,qBAAmE,UAAU;AAAA,cACjF,QAAQ,WAAW,QAAQ;AAAA,cAC3B,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,cAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,YAC9B,CAAC;AAAA,UACH;AAAA,QACF,SAAS,OAAO;AACd,cAAI,sBAAsB,OAAO,CAAC,EAAG;AACrC,gBAAM;AAAA,QACR;AACA,cAAM,WAAW,aAAa,OAAO,UAAU,OAAO,WAAW,SAAS,KAAK;AAC/E,cAAM,mBAAmB,WAAW,OAAO,gBAAgB;AAC3D,YACE,CAAC,YACD,YACA,oBACA,qBAAqB,2BAA2B,SAChD;AACA,gBAAM,QAAQ,6BAA6B;AAAA,YACzC,QAAQ;AAAA,YACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,YAC9C,MAAM,KAAK,UAAU;AAAA,cACnB;AAAA,cACA,eAAe,CAAC,gBAAgB;AAAA,cAChC,cAAc;AAAA,cACd,YAAY;AAAA,YACd,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AACA,YAAI,mBAAmB;AACrB,cAAI,SAAS,QAAQ;AACnB,kBAAM,YAAY,OAAO,UAAU,SAAS,YAAY,SAAS,KAAK,KAAK,EAAE,SAAS,IAClF,SAAS,KAAK,KAAK,IACnB,WAAW,OAAO,IAAI,EAAE,KAAK,KAAK,WAAW,cAAc,IAAI,EAAE,KAAK;AAC1E,gBAAI,WAAW;AACb,qBAAO,KAAK,QAAQ,mBAAmB,SAAS,CAAC,iBAAiB,UAAU,qBAAqB;AACjG;AAAA,YACF;AAAA,UACF,WAAW,UAAU;AACnB,mBAAO;AAAA,cACL,+BAA+B,mBAAmB,QAAQ,CAAC;AAAA,cAC3D;AAAA,cACA;AAAA,YACF;AACA;AAAA,UACF;AAAA,QACF;AACA,eAAO,SAAS,OAAO,SAAS,SAC5B,qCAAqC;AAAA,UACrC,EAAE,iBAAiB,YAAY,4CAA4C,6BAA6B;AAAA,QAC1G,CAAC,kBACC,qCAAqC,mBAAmB,EAAE,6BAA6B,CAAC,CAAC;AAAA,MAC/F;AAAA,MACA,UAAU,WAAW,YAAY;AAC/B,YAAI;AACF,gBAAM;AAAA,YACJ,0BAA0B,WAAW,eAAe,SAAS,KAAK,IAAI;AAAA,YACtE,MAAM,eAAe,iBAAiB,SAAS,SAAS,UAAU,WAAW,IAAI,mBAAmB,QAAQ,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,UACvI;AAAA,QACF,SAAS,OAAO;AACd,cAAI,sBAAsB,OAAO,CAAC,EAAG;AACrC,gBAAM;AAAA,QACR;AACA,eAAO,SAAS,OAAO,SAAS,SAC5B,qCAAqC,mBAAmB,EAAE,+BAA+B,CAAC,CAAC,kBAC3F,qCAAqC,mBAAmB,EAAE,+BAA+B,CAAC,CAAC;AAAA,MACjG,IAAI;AAAA;AAAA,IA3IC;AAAA,EA4IP,IACE,MACN,GACF;AAEJ;AAEA,IAAO,2BAAQ;",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useSearchParams } from 'next/navigation'\nimport { useT, type TranslateFn } from '@open-mercato/shared/lib/i18n/context'\nimport {\n AlertTriangle,\n BadgeCheck,\n CircleDollarSign,\n Eye,\n FileCheck2,\n FileText,\n IdCard,\n MessageSquare,\n Plus,\n Send,\n Shield,\n Sparkles,\n Trash2,\n WalletCards,\n} from 'lucide-react'\nimport { slugify } from '@open-mercato/shared/lib/slugify'\nimport { CrudForm, type CrudField, type CrudFormGroup, type CrudFormGroupComponentProps } from '@open-mercato/ui/backend/CrudForm'\nimport { ComboboxInput, type ComboboxOption } from '@open-mercato/ui/backend/inputs'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { SwitchableMarkdownInput } from '@open-mercato/ui/backend/inputs'\nimport { apiCall, apiCallOrThrow, readApiResultOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ColorPicker } from '@open-mercato/ui/primitives/color-picker'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { PasswordInput } from '@open-mercato/ui/primitives/password-input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@open-mercato/ui/primitives/tabs'\nimport { CHECKOUT_ENTITY_IDS } from '../lib/constants'\nimport { getLocalizedDefaultCheckoutCustomerFields } from '../lib/defaults'\nimport type { CustomerFieldDefinitionInput, PriceListItemInput } from '../data/validators'\nimport { getGatewayProviderConfigurationMessageKey } from '../lib/gatewayProviderAvailability'\nimport { readCustomerFieldsSectionError } from '../lib/customerFieldErrors'\nimport { CheckoutCurrencySelect } from './CheckoutCurrencySelect'\nimport { CustomerFieldsEditor } from './CustomerFieldsEditor'\nimport { GatewaySettingsFields } from './GatewaySettingsFields'\nimport { LogoUploadField } from './LogoUploadField'\n\ntype Props = {\n mode: 'link' | 'template'\n recordId?: string\n}\n\ntype FormValues = Record<string, unknown>\n\ntype ProviderDescriptor = {\n providerKey: string\n label: string\n isConfigured?: boolean\n requiresConfiguration?: boolean\n configurationStatus?: 'configured' | 'missing_credentials' | 'disabled' | 'unmanaged' | null\n}\n\ntype TemplateSummary = {\n id: string\n name: string\n title?: string | null\n pricingMode?: string | null\n gatewayProviderKey?: string | null\n}\n\ntype LegalDocumentValue = {\n title: string\n markdown: string\n required: boolean\n}\n\ntype LegalDocumentsValue = {\n terms: LegalDocumentValue\n privacyPolicy: LegalDocumentValue\n}\n\ntype PriceListItem = PriceListItemInput\n\nconst DEFAULT_COLORS = {\n primaryColor: '#1E3A8A',\n secondaryColor: '#F59E0B',\n backgroundColor: '#F8F4EE',\n} as const\n\nconst SETTINGS_TABS_LIST_CLASS = 'h-auto w-full justify-start overflow-x-auto rounded-none border-b border-border bg-transparent p-0'\nconst SETTINGS_TABS_TRIGGER_CLASS = 'mr-8 h-auto rounded-none border-b-2 border-transparent bg-transparent px-0 py-2.5 text-sm font-medium text-muted-foreground shadow-none transition-colors hover:bg-transparent hover:text-foreground aria-selected:border-accent-indigo aria-selected:bg-transparent aria-selected:text-foreground aria-selected:shadow-none last:mr-0'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction readString(value: unknown): string {\n return typeof value === 'string' ? value : ''\n}\n\nfunction readNumberInputValue(value: unknown): string {\n if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n if (typeof value === 'string') return value\n return ''\n}\n\nfunction readBoolean(value: unknown, fallback = false): boolean {\n return typeof value === 'boolean' ? value : fallback\n}\n\nfunction cloneDefaultCustomerFields(t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return getLocalizedDefaultCheckoutCustomerFields(t).map((field) => ({\n ...field,\n placeholder: typeof field.placeholder === 'string' ? field.placeholder : undefined,\n }))\n}\n\nfunction createDefaultLegalDocuments(): LegalDocumentsValue {\n return {\n terms: { title: '', markdown: '', required: false },\n privacyPolicy: { title: '', markdown: '', required: false },\n }\n}\n\nfunction createDefaultValues(t?: TranslateFn): FormValues {\n return {\n name: '',\n title: '',\n subtitle: '',\n description: '',\n slug: '',\n logoAttachmentId: null,\n logoUrl: null,\n ...DEFAULT_COLORS,\n themeMode: 'auto',\n displayCustomFieldsOnPage: false,\n pricingMode: 'fixed',\n fixedPriceAmount: null,\n fixedPriceCurrencyCode: 'USD',\n fixedPriceIncludesTax: true,\n fixedPriceOriginalAmount: null,\n customAmountMin: null,\n customAmountMax: null,\n customAmountCurrencyCode: 'USD',\n priceListItems: [],\n gatewayProviderKey: '',\n gatewaySettings: {},\n templateId: null,\n customFieldsetCode: null,\n collectCustomerDetails: true,\n customerFieldsSchema: cloneDefaultCustomerFields(t),\n legalDocuments: createDefaultLegalDocuments(),\n status: 'draft',\n maxCompletions: null,\n password: '',\n successTitle: '',\n successMessage: '',\n cancelTitle: '',\n cancelMessage: '',\n errorTitle: '',\n errorMessage: '',\n startEmailSubject: '',\n startEmailBody: '',\n sendStartEmail: true,\n successEmailSubject: '',\n successEmailBody: '',\n sendSuccessEmail: true,\n errorEmailSubject: '',\n errorEmailBody: '',\n sendErrorEmail: true,\n }\n}\n\nfunction normalizePriceListItems(value: unknown): PriceListItem[] {\n if (!Array.isArray(value)) return []\n return value\n .map((item) => {\n if (!isRecord(item)) return null\n const id = readString(item.id).trim()\n const description = readString(item.description)\n const amount = Number(item.amount ?? 0)\n const currencyCode = readString(item.currencyCode).trim().toUpperCase()\n return {\n id: id || `item_${Date.now()}`,\n description,\n amount: Number.isFinite(amount) ? amount : 0,\n currencyCode: currencyCode || 'USD',\n }\n })\n .filter((item): item is PriceListItem => item !== null)\n}\n\nfunction normalizeCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n if (!Array.isArray(value)) return cloneDefaultCustomerFields(t)\n return value.reduce<CustomerFieldDefinitionInput[]>((result, field, index) => {\n if (!isRecord(field)) return result\n const key = readString(field.key).trim()\n const label = readString(field.label).trim()\n const kind = readString(field.kind)\n if (!key || !label) return result\n if (!['text', 'multiline', 'boolean', 'select', 'radio'].includes(kind)) return result\n const options = Array.isArray(field.options)\n ? field.options.reduce<Array<{ value: string; label: string }>>((optionResult, option) => {\n if (!isRecord(option)) return optionResult\n const valuePart = readString(option.value).trim()\n const labelPart = readString(option.label).trim()\n if (!valuePart || !labelPart) return optionResult\n optionResult.push({ value: valuePart, label: labelPart })\n return optionResult\n }, [])\n : []\n result.push({\n key,\n label,\n kind: kind as CustomerFieldDefinitionInput['kind'],\n required: readBoolean(field.required),\n fixed: readBoolean(field.fixed),\n placeholder: readString(field.placeholder).trim() || undefined,\n options,\n sortOrder: typeof field.sortOrder === 'number' ? field.sortOrder : index,\n })\n return result\n }, [])\n}\n\nfunction readCustomerFields(value: unknown, t?: TranslateFn): CustomerFieldDefinitionInput[] {\n return Array.isArray(value) ? value as CustomerFieldDefinitionInput[] : cloneDefaultCustomerFields(t)\n}\n\nfunction normalizeLegalDocuments(value: unknown): LegalDocumentsValue {\n const defaults = createDefaultLegalDocuments()\n if (!isRecord(value)) return defaults\n const normalizeDocument = (raw: unknown, fallback: LegalDocumentValue): LegalDocumentValue => {\n if (!isRecord(raw)) return fallback\n return {\n title: readString(raw.title),\n markdown: readString(raw.markdown),\n required: readBoolean(raw.required),\n }\n }\n return {\n terms: normalizeDocument(value.terms, defaults.terms),\n privacyPolicy: normalizeDocument(value.privacyPolicy, defaults.privacyPolicy),\n }\n}\n\nfunction normalizeFormValues(value: FormValues | null | undefined, t?: TranslateFn): FormValues {\n const defaults = createDefaultValues(t)\n const source = isRecord(value) ? value : {}\n const customFields = isRecord(source.customFields) ? source.customFields : {}\n\n const prefixedCustomFieldValues = Object.fromEntries(\n Object.entries(customFields).map(([key, fieldValue]) => [`cf_${key}`, fieldValue]),\n )\n\n return {\n ...defaults,\n ...source,\n ...prefixedCustomFieldValues,\n logoAttachmentId: readString(source.logoAttachmentId).trim() || null,\n logoUrl: readString(source.logoUrl).trim() || null,\n primaryColor: readString(source.primaryColor).trim() || defaults.primaryColor,\n secondaryColor: readString(source.secondaryColor).trim() || defaults.secondaryColor,\n backgroundColor: readString(source.backgroundColor).trim() || defaults.backgroundColor,\n gatewayProviderKey: readString(source.gatewayProviderKey).trim(),\n gatewaySettings: isRecord(source.gatewaySettings) ? source.gatewaySettings : {},\n customFieldsetCode: readString(source.customFieldsetCode).trim() || null,\n collectCustomerDetails: readBoolean(source.collectCustomerDetails, true),\n customerFieldsSchema: normalizeCustomerFields(source.customerFieldsSchema, t),\n legalDocuments: normalizeLegalDocuments(source.legalDocuments),\n priceListItems: normalizePriceListItems(source.priceListItems),\n fixedPriceCurrencyCode: readString(source.fixedPriceCurrencyCode).trim().toUpperCase() || 'USD',\n customAmountCurrencyCode: readString(source.customAmountCurrencyCode).trim().toUpperCase() || 'USD',\n sendStartEmail: readBoolean(source.sendStartEmail, true),\n sendSuccessEmail: readBoolean(source.sendSuccessEmail, true),\n sendErrorEmail: readBoolean(source.sendErrorEmail, true),\n }\n}\n\nfunction readError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n if (errors[path]) return errors[path]\n const prefix = `${path}.`\n const nestedEntry = Object.entries(errors).find(([key]) => key.startsWith(prefix))\n return nestedEntry?.[1]\n}\n\nfunction readDirectError(errors: Record<string, string>, path: string): string | undefined {\n if (!path) return undefined\n return errors[path]\n}\n\nfunction readAnyError(errors: Record<string, string>, ...paths: string[]): string | undefined {\n for (const path of paths) {\n const error = readError(errors, path)\n if (error) return error\n }\n return undefined\n}\n\nfunction toTemplateOption(template: TemplateSummary): ComboboxOption {\n const title = typeof template.title === 'string' ? template.title.trim() : ''\n const provider = typeof template.gatewayProviderKey === 'string' ? template.gatewayProviderKey.trim() : ''\n const parts = [title, provider].filter((part) => part.length > 0)\n return {\n value: template.id,\n label: template.name,\n description: parts.length > 0 ? parts.join(' \u2022 ') : null,\n }\n}\n\nfunction errorInputClassName(error?: string): string | undefined {\n return error ? 'border-destructive aria-invalid:ring-destructive' : undefined\n}\n\nfunction SectionLabel({\n label,\n hint,\n error,\n required,\n children,\n}: {\n label: string\n hint?: string\n error?: string\n required?: boolean\n children: React.ReactNode\n}) {\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <Label className=\"gap-0\">\n {label}\n {required ? <span className=\"text-destructive\"> *</span> : null}\n </Label>\n {hint ? <p className=\"text-xs text-muted-foreground\">{hint}</p> : null}\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n </div>\n {children}\n </div>\n )\n}\n\nfunction ColorField({\n label,\n value,\n onChange,\n error,\n}: {\n label: string\n value: string\n onChange: (next: string) => void\n error?: string\n}) {\n const pickerValue = /^#([0-9a-fA-F]{6})$/.test(value) ? value : '#000000'\n return (\n <SectionLabel label={label} error={error}>\n <div className=\"flex items-center gap-3\">\n <ColorPicker\n value={pickerValue}\n onChange={(next) => onChange(next.toUpperCase())}\n aria-label={label}\n />\n <Input\n value={value}\n onChange={(event) => onChange(event.target.value.toUpperCase())}\n placeholder=\"#1E3A8A\"\n className={error ? `min-w-0 ${errorInputClassName(error)}` : 'min-w-0'}\n aria-invalid={Boolean(error)}\n />\n </div>\n </SectionLabel>\n )\n}\n\nfunction PriceListEditor({\n value,\n onChange,\n error,\n}: {\n value: PriceListItem[]\n onChange: (next: PriceListItem[]) => void\n error?: string\n}) {\n const t = useT()\n const items = Array.isArray(value) ? value : []\n\n const updateItem = React.useCallback(\n (index: number, patch: Partial<PriceListItem>) => {\n onChange(items.map((item, currentIndex) => (currentIndex === index ? { ...item, ...patch } : item)))\n },\n [items, onChange],\n )\n\n const addItem = React.useCallback(() => {\n onChange([\n ...items,\n {\n id: `item_${items.length + 1}`,\n description: '',\n amount: 0,\n currencyCode: items[0]?.currencyCode ?? 'USD',\n },\n ])\n }, [items, onChange])\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.singleCurrency')}\n </AlertDescription>\n </Alert>\n {error ? <p className=\"text-xs text-destructive\">{error}</p> : null}\n\n <div className=\"overflow-hidden rounded-xl border border-border/70 bg-background\">\n {items.length > 0 ? (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[760px] table-fixed\">\n <thead className=\"border-b bg-muted/30\">\n <tr className=\"text-left text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n <th className=\"px-3 py-2 w-[22%]\">{t('checkout.linkTemplateForm.priceList.columns.itemCode')}</th>\n <th className=\"px-3 py-2\">{t('checkout.linkTemplateForm.priceList.columns.description')}</th>\n <th className=\"px-3 py-2 w-[16%]\">{t('checkout.linkTemplateForm.priceList.columns.amount')}</th>\n <th className=\"px-3 py-2 w-[24%]\">{t('checkout.linkTemplateForm.priceList.columns.currency')}</th>\n <th className=\"px-3 py-2 w-[110px] text-right\">{t('checkout.linkTemplateForm.priceList.columns.actions')}</th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border/70\">\n {items.map((item, index) => (\n <tr key={`${item.id}:${index}`} className=\"align-top\">\n <td className=\"px-3 py-2\">\n <Input\n value={item.id}\n onChange={(event) => updateItem(index, { id: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.itemCode')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.itemCode', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={item.description}\n onChange={(event) => updateItem(index, { description: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.priceList.placeholders.description')}\n aria-label={t('checkout.linkTemplateForm.priceList.aria.description', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={item.amount}\n onChange={(event) => updateItem(index, { amount: Number(event.target.value) })}\n placeholder=\"0.00\"\n aria-label={t('checkout.linkTemplateForm.priceList.aria.amount', { index: index + 1 })}\n className=\"h-8\"\n />\n </td>\n <td className=\"px-3 py-2\">\n <CheckoutCurrencySelect\n value={item.currencyCode}\n onChange={(next) => updateItem(index, { currencyCode: next })}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </td>\n <td className=\"px-3 py-2 text-right\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onChange(items.filter((_, currentIndex) => currentIndex !== index))}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.remove')}\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <div className=\"px-4 py-8\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.priceList.notices.empty')}\n </AlertDescription>\n </Alert>\n </div>\n )}\n </div>\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={addItem}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.priceList.actions.addItem')}\n </Button>\n </div>\n )\n}\n\nfunction PricingSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const pricingMode = readString(values.pricingMode) || 'fixed'\n const pricingModeError = readError(errors, 'pricingMode')\n const fixedPriceAmountError = readError(errors, 'fixedPriceAmount')\n const fixedPriceCurrencyError = readError(errors, 'fixedPriceCurrencyCode')\n const fixedPriceOriginalAmountError = readError(errors, 'fixedPriceOriginalAmount')\n const customAmountMinError = readError(errors, 'customAmountMin')\n const customAmountMaxError = readError(errors, 'customAmountMax')\n const customAmountCurrencyError = readError(errors, 'customAmountCurrencyCode')\n const priceListItemsError = readError(errors, 'priceListItems')\n\n return (\n <div className=\"space-y-4\">\n {pricingModeError ? <p className=\"text-xs text-destructive\">{pricingModeError}</p> : null}\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'fixed', label: t('checkout.linkTemplateForm.pricing.modes.fixed'), icon: CircleDollarSign },\n { id: 'custom_amount', label: t('checkout.linkTemplateForm.pricing.modes.customAmount'), icon: WalletCards },\n { id: 'price_list', label: t('checkout.linkTemplateForm.pricing.modes.priceList'), icon: FileText },\n ].map((mode) => {\n const Icon = mode.icon\n const active = pricingMode === mode.id\n return (\n <Button\n key={mode.id}\n type=\"button\"\n variant={active ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('pricingMode', mode.id)}\n >\n <Icon className=\"mr-2 h-4 w-4\" />\n {mode.label}\n </Button>\n )\n })}\n </div>\n\n {pricingMode === 'fixed' ? (\n <div className=\"grid gap-4 md:grid-cols-2\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.amount')} error={fixedPriceAmountError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceAmount)}\n onChange={(event) => setValue('fixedPriceAmount', Number(event.target.value))}\n placeholder=\"150\"\n className={errorInputClassName(fixedPriceAmountError)}\n aria-invalid={Boolean(fixedPriceAmountError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={fixedPriceCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.fixedPriceCurrencyCode) || 'USD'}\n onChange={(next) => setValue('fixedPriceCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n\n <SectionLabel\n label={t('checkout.linkTemplateForm.pricing.fields.compareAtPrice')}\n hint={t('checkout.linkTemplateForm.pricing.hints.compareAtPrice')}\n error={fixedPriceOriginalAmountError}\n >\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.fixedPriceOriginalAmount)}\n onChange={(event) => setValue('fixedPriceOriginalAmount', Number(event.target.value))}\n placeholder=\"200\"\n className={errorInputClassName(fixedPriceOriginalAmountError)}\n aria-invalid={Boolean(fixedPriceOriginalAmountError)}\n />\n </SectionLabel>\n\n <div className=\"flex items-end\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.fixedPriceIncludesTax, true)}\n onChange={(event) => setValue('fixedPriceIncludesTax', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.pricing.fields.includesTax')}\n </label>\n </div>\n </div>\n ) : null}\n\n {pricingMode === 'custom_amount' ? (\n <div className=\"grid gap-4 md:grid-cols-3\">\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.minimumAmount')} error={customAmountMinError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMin)}\n onChange={(event) => setValue('customAmountMin', Number(event.target.value))}\n placeholder=\"10\"\n className={errorInputClassName(customAmountMinError)}\n aria-invalid={Boolean(customAmountMinError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.maximumAmount')} error={customAmountMaxError} required>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={readNumberInputValue(values.customAmountMax)}\n onChange={(event) => setValue('customAmountMax', Number(event.target.value))}\n placeholder=\"500\"\n className={errorInputClassName(customAmountMaxError)}\n aria-invalid={Boolean(customAmountMaxError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.pricing.fields.currency')} error={customAmountCurrencyError} required>\n <CheckoutCurrencySelect\n value={readString(values.customAmountCurrencyCode) || 'USD'}\n onChange={(next) => setValue('customAmountCurrencyCode', next)}\n placeholder={t('checkout.currencySelect.placeholder')}\n />\n </SectionLabel>\n </div>\n ) : null}\n\n {pricingMode === 'price_list' ? (\n <PriceListEditor\n value={normalizePriceListItems(values.priceListItems)}\n onChange={(next) => setValue('priceListItems', next)}\n error={priceListItemsError}\n />\n ) : null}\n </div>\n )\n}\n\nfunction GeneralSection({\n values,\n setValue,\n errors,\n mode,\n templateOptions,\n loadTemplateSuggestions,\n applyTemplate,\n isApplyingTemplate,\n}: CrudFormGroupComponentProps & {\n mode: 'link' | 'template'\n templateOptions: ComboboxOption[]\n loadTemplateSuggestions: (query?: string) => Promise<ComboboxOption[]>\n applyTemplate: (templateId: string | null) => Promise<void>\n isApplyingTemplate: boolean\n}) {\n const t = useT()\n const fallbackSlug = slugify(\n readString(values.title).trim().length > 0\n ? readString(values.title)\n : readString(values.name),\n ) || 'pay-link'\n const currentSlug = readString(values.slug)\n const resolvedSlug = currentSlug.trim() || fallbackSlug\n const currentTemplateId = readString(values.templateId).trim()\n const nameError = readError(errors, 'name')\n const titleError = readError(errors, 'title')\n const subtitleError = readError(errors, 'subtitle')\n const descriptionError = readError(errors, 'description')\n const slugError = readError(errors, 'slug')\n const templateError = readError(errors, 'templateId')\n\n return (\n <div className=\"space-y-4\">\n {mode === 'link' ? (\n <SectionLabel\n label={t('checkout.linkTemplateForm.general.fields.template')}\n hint={t('checkout.linkTemplateForm.general.hints.template')}\n error={templateError}\n >\n <div className=\"space-y-3\">\n <ComboboxInput\n value={currentTemplateId}\n suggestions={templateOptions}\n loadSuggestions={loadTemplateSuggestions}\n resolveLabel={(value) => templateOptions.find((option) => option.value === value)?.label ?? value}\n resolveDescription={(value) => templateOptions.find((option) => option.value === value)?.description}\n onChange={(nextValue) => {\n const normalized = nextValue.trim()\n setValue('templateId', normalized || null)\n void applyTemplate(normalized || null)\n }}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.template')}\n disabled={isApplyingTemplate}\n allowCustomValues={false}\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={isApplyingTemplate || currentTemplateId.length === 0}\n onClick={() => {\n setValue('templateId', null)\n void applyTemplate(null)\n }}\n >\n {t('checkout.linkTemplateForm.general.actions.clearTemplate')}\n </Button>\n {isApplyingTemplate ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.status.applyingTemplate')}\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t('checkout.linkTemplateForm.general.notices.templateReplacement')}\n </p>\n )}\n </div>\n </div>\n </SectionLabel>\n ) : null}\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.name')} error={nameError} required>\n <Input\n value={readString(values.name)}\n onChange={(event) => setValue('name', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.name')}\n className={errorInputClassName(nameError)}\n aria-invalid={Boolean(nameError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.title')} error={titleError}>\n <Input\n value={readString(values.title)}\n onChange={(event) => setValue('title', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.title')}\n className={errorInputClassName(titleError)}\n aria-invalid={Boolean(titleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.subtitle')} error={subtitleError}>\n <Input\n value={readString(values.subtitle)}\n onChange={(event) => setValue('subtitle', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.subtitle')}\n className={errorInputClassName(subtitleError)}\n aria-invalid={Boolean(subtitleError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.description')} hint={t('checkout.linkTemplateForm.general.hints.description')} error={descriptionError}>\n <SwitchableMarkdownInput\n value={readString(values.description)}\n onChange={(next) => setValue('description', next)}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.description')}\n />\n </SectionLabel>\n\n {mode === 'link' ? (\n <SectionLabel label={t('checkout.linkTemplateForm.general.fields.slug')} hint={t('checkout.linkTemplateForm.general.hints.slug')} error={slugError}>\n <div className=\"space-y-2\">\n <div className=\"flex gap-2\">\n <Input\n value={currentSlug}\n onChange={(event) => setValue('slug', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.general.placeholders.slug')}\n className={errorInputClassName(slugError)}\n aria-invalid={Boolean(slugError)}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setValue('slug', fallbackSlug)}\n >\n <Sparkles className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.general.actions.generateSlug')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.general.slugPreview', { slug: resolvedSlug })}</p>\n </div>\n </SectionLabel>\n ) : null}\n </div>\n )\n}\n\nfunction AppearanceSection({\n values,\n setValue,\n errors,\n entityId,\n attachmentRecordId,\n}: CrudFormGroupComponentProps & { entityId: string; attachmentRecordId: string }) {\n const t = useT()\n const logoError = readAnyError(errors, 'logoAttachmentId', 'logoUrl')\n const primaryColorError = readError(errors, 'primaryColor')\n const secondaryColorError = readError(errors, 'secondaryColor')\n const backgroundColorError = readError(errors, 'backgroundColor')\n const themeModeError = readError(errors, 'themeMode')\n const displayCustomFieldsError = readError(errors, 'displayCustomFieldsOnPage')\n\n return (\n <div className=\"space-y-4\">\n <LogoUploadField\n entityId={entityId}\n recordId={attachmentRecordId}\n attachmentId={readString(values.logoAttachmentId) || null}\n logoUrl={readString(values.logoUrl) || null}\n error={logoError}\n onChange={(next) => {\n setValue('logoAttachmentId', next.logoAttachmentId)\n setValue('logoUrl', next.logoUrl)\n }}\n />\n\n <div className=\"space-y-4\">\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.primaryColor')}\n value={readString(values.primaryColor) || DEFAULT_COLORS.primaryColor}\n onChange={(next) => setValue('primaryColor', next)}\n error={primaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.secondaryColor')}\n value={readString(values.secondaryColor) || DEFAULT_COLORS.secondaryColor}\n onChange={(next) => setValue('secondaryColor', next)}\n error={secondaryColorError}\n />\n <ColorField\n label={t('checkout.linkTemplateForm.appearance.fields.backgroundColor')}\n value={readString(values.backgroundColor) || DEFAULT_COLORS.backgroundColor}\n onChange={(next) => setValue('backgroundColor', next)}\n error={backgroundColorError}\n />\n </div>\n\n <SectionLabel label={t('checkout.linkTemplateForm.appearance.fields.themeMode')} error={themeModeError}>\n <select\n className={themeModeError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(themeModeError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.themeMode) || 'auto'}\n onChange={(event) => setValue('themeMode', event.target.value)}\n aria-invalid={Boolean(themeModeError)}\n >\n <option value=\"auto\">{t('checkout.linkTemplateForm.appearance.themeModes.auto')}</option>\n <option value=\"light\">{t('checkout.linkTemplateForm.appearance.themeModes.light')}</option>\n <option value=\"dark\">{t('checkout.linkTemplateForm.appearance.themeModes.dark')}</option>\n </select>\n </SectionLabel>\n\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values.displayCustomFieldsOnPage)}\n onChange={(event) => setValue('displayCustomFieldsOnPage', event.target.checked)}\n />\n {t('checkout.linkTemplateForm.appearance.fields.displayCustomFields')}\n </label>\n {displayCustomFieldsError ? <p className=\"text-xs text-destructive\">{displayCustomFieldsError}</p> : null}\n </div>\n )\n}\n\nfunction PaymentSection({ values, setValue, errors, providers }: CrudFormGroupComponentProps & { providers: ProviderDescriptor[] }) {\n const t = useT()\n const selectedProviderKey = readString(values.gatewayProviderKey)\n const selectedProvider = providers.find((provider) => provider.providerKey === selectedProviderKey)\n const gatewayProviderError = readError(errors, 'gatewayProviderKey')\n ?? (() => {\n const messageKey = getGatewayProviderConfigurationMessageKey(selectedProvider)\n return messageKey ? t(messageKey) : undefined\n })()\n const gatewaySettingsError = readError(errors, 'gatewaySettings')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.payment.fields.gatewayProvider')} error={gatewayProviderError} required>\n <select\n className={gatewayProviderError\n ? `w-full rounded-md border bg-background px-3 py-2 text-sm ${errorInputClassName(gatewayProviderError)}`\n : 'w-full rounded-md border bg-background px-3 py-2 text-sm'}\n value={readString(values.gatewayProviderKey)}\n onChange={(event) => setValue('gatewayProviderKey', event.target.value)}\n aria-invalid={Boolean(gatewayProviderError)}\n >\n <option value=\"\">{t('checkout.linkTemplateForm.payment.placeholders.provider')}</option>\n {providers.map((provider) => (\n <option\n key={provider.providerKey}\n value={provider.providerKey}\n disabled={provider.isConfigured === false}\n >\n {provider.isConfigured === false\n ? `${provider.label} ${t('checkout.linkTemplateForm.payment.providerUnavailableSuffix')}`\n : provider.label}\n </option>\n ))}\n </select>\n </SectionLabel>\n\n <GatewaySettingsFields\n providerKey={readString(values.gatewayProviderKey) || null}\n value={isRecord(values.gatewaySettings) ? values.gatewaySettings : {}}\n onChange={(next) => setValue('gatewaySettings', next)}\n />\n {gatewaySettingsError ? <p className=\"text-xs text-destructive\">{gatewaySettingsError}</p> : null}\n </div>\n )\n}\n\nfunction CustomerDetailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const collectCustomerDetails = readBoolean(values.collectCustomerDetails, true)\n const collectCustomerDetailsError = readError(errors, 'collectCustomerDetails')\n const customerFieldsError = readCustomerFieldsSectionError(errors)\n\n return (\n <div className=\"space-y-4\">\n <label className=\"flex items-start gap-3 rounded-xl border border-border/70 bg-muted/30 px-4 py-3 text-sm\">\n <input\n type=\"checkbox\"\n checked={collectCustomerDetails}\n onChange={(event) => setValue('collectCustomerDetails', event.target.checked)}\n />\n <span className=\"space-y-1\">\n <span className=\"flex items-center gap-2 font-medium\">\n <IdCard className=\"h-4 w-4\" />\n {t('checkout.linkTemplateForm.customerDetails.title')}\n </span>\n <span className=\"block text-muted-foreground\">\n {t('checkout.linkTemplateForm.customerDetails.description')}\n </span>\n </span>\n </label>\n {collectCustomerDetailsError ? <p className=\"text-xs text-destructive\">{collectCustomerDetailsError}</p> : null}\n\n {collectCustomerDetails ? (\n <>\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.simpleLink')}\n </AlertDescription>\n </Alert>\n {customerFieldsError ? <p className=\"text-xs text-destructive\">{customerFieldsError}</p> : null}\n <CustomerFieldsEditor\n value={readCustomerFields(values.customerFieldsSchema, t)}\n onChange={(next) => setValue('customerFieldsSchema', next)}\n errors={errors}\n />\n </>\n ) : (\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.customerDetails.notices.disabled')}\n </AlertDescription>\n </Alert>\n )}\n </div>\n )\n}\n\nfunction LegalSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'terms' | 'privacyPolicy'>('terms')\n const legalDocuments = normalizeLegalDocuments(values.legalDocuments)\n const termsTitleError = readAnyError(errors, 'legalDocuments.terms.title', 'legalDocuments.terms')\n const termsMarkdownError = readAnyError(errors, 'legalDocuments.terms.markdown', 'legalDocuments.terms')\n const privacyTitleError = readAnyError(errors, 'legalDocuments.privacyPolicy.title', 'legalDocuments.privacyPolicy')\n const privacyMarkdownError = readAnyError(errors, 'legalDocuments.privacyPolicy.markdown', 'legalDocuments.privacyPolicy')\n\n const patchDocument = React.useCallback(\n (key: 'terms' | 'privacyPolicy', patch: Partial<LegalDocumentValue>) => {\n setValue('legalDocuments', {\n ...legalDocuments,\n [key]: {\n ...legalDocuments[key],\n ...patch,\n },\n })\n },\n [legalDocuments, setValue],\n )\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.legal.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'terms' | 'privacyPolicy')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n <TabsTrigger value=\"terms\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Shield className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.terms')}\n </TabsTrigger>\n <TabsTrigger value=\"privacyPolicy\" className={SETTINGS_TABS_TRIGGER_CLASS}>\n <FileCheck2 className=\"mr-2 h-4 w-4\" />\n {t('checkout.linkTemplateForm.legal.tabs.privacy')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"terms\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsTitle')} error={termsTitleError}>\n <Input\n value={legalDocuments.terms.title}\n onChange={(event) => patchDocument('terms', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsTitle')}\n className={errorInputClassName(termsTitleError)}\n aria-invalid={Boolean(termsTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.termsBody')} error={termsMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.terms.markdown}\n onChange={(next) => patchDocument('terms', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.termsBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.terms.required}\n onChange={(event) => patchDocument('terms', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n\n <TabsContent value=\"privacyPolicy\" className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyTitle')} error={privacyTitleError}>\n <Input\n value={legalDocuments.privacyPolicy.title}\n onChange={(event) => patchDocument('privacyPolicy', { title: event.target.value })}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyTitle')}\n className={errorInputClassName(privacyTitleError)}\n aria-invalid={Boolean(privacyTitleError)}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.legal.fields.privacyBody')} error={privacyMarkdownError}>\n <SwitchableMarkdownInput\n value={legalDocuments.privacyPolicy.markdown}\n onChange={(next) => patchDocument('privacyPolicy', { markdown: next })}\n isMarkdownEnabled\n height={220}\n placeholder={t('checkout.linkTemplateForm.legal.placeholders.privacyBody')}\n />\n </SectionLabel>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={legalDocuments.privacyPolicy.required}\n onChange={(event) => patchDocument('privacyPolicy', { required: event.target.checked })}\n />\n {t('checkout.linkTemplateForm.legal.fields.acceptanceRequired')}\n </label>\n </TabsContent>\n </Tabs>\n </div>\n )\n}\n\nfunction MessagesSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'success' | 'cancel' | 'error'>('success')\n\n const config = {\n success: {\n titleKey: 'successTitle',\n bodyKey: 'successMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.successBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.success'),\n },\n cancel: {\n titleKey: 'cancelTitle',\n bodyKey: 'cancelMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.cancelBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.cancel'),\n },\n error: {\n titleKey: 'errorTitle',\n bodyKey: 'errorMessage',\n titlePlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorTitle'),\n bodyPlaceholder: t('checkout.linkTemplateForm.messages.placeholders.errorBody'),\n label: t('checkout.linkTemplateForm.messages.tabs.error'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.messages.notice')}\n </AlertDescription>\n </Alert>\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'success' | 'cancel' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <MessageSquare className=\"mr-2 h-4 w-4\" />\n {config[item].label}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {(['success', 'cancel', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.title', { state: config[item].label })} error={readError(errors, config[item].titleKey)}>\n <Input\n value={readString(values[config[item].titleKey])}\n onChange={(event) => setValue(config[item].titleKey, event.target.value)}\n placeholder={config[item].titlePlaceholder}\n className={errorInputClassName(readError(errors, config[item].titleKey))}\n aria-invalid={Boolean(readError(errors, config[item].titleKey))}\n />\n </SectionLabel>\n <SectionLabel label={t('checkout.linkTemplateForm.messages.labels.body', { state: config[item].label })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction VariableHint() {\n const t = useT()\n const variables = ['{{firstName}}', '{{amount}}', '{{currencyCode}}', '{{linkTitle}}', '{{transactionId}}', '{{errorMessage}}']\n return (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-muted-foreground\">{t('checkout.linkTemplateForm.emails.variableHint')}</p>\n <div className=\"flex flex-wrap gap-2\">\n {variables.map((variable) => (\n <span\n key={variable}\n className=\"rounded-full border border-border/70 bg-background px-2 py-1 text-xs text-muted-foreground\"\n >\n {variable}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction EmailsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const [tab, setTab] = React.useState<'start' | 'success' | 'error'>('start')\n\n const config = {\n start: {\n enabledKey: 'sendStartEmail',\n subjectKey: 'startEmailSubject',\n bodyKey: 'startEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.start'),\n Icon: Send,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.startBody'),\n },\n success: {\n enabledKey: 'sendSuccessEmail',\n subjectKey: 'successEmailSubject',\n bodyKey: 'successEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.success'),\n Icon: BadgeCheck,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.successBody'),\n },\n error: {\n enabledKey: 'sendErrorEmail',\n subjectKey: 'errorEmailSubject',\n bodyKey: 'errorEmailBody',\n title: t('checkout.linkTemplateForm.emails.tabs.error'),\n Icon: AlertTriangle,\n subjectPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorSubject'),\n bodyPlaceholder: t('checkout.linkTemplateForm.emails.placeholders.errorBody'),\n },\n } as const\n\n return (\n <div className=\"space-y-4\">\n <Alert variant=\"info\">\n <AlertDescription>\n {t('checkout.linkTemplateForm.emails.notice')}\n </AlertDescription>\n </Alert>\n <VariableHint />\n\n <Tabs value={tab} onValueChange={(next) => setTab(next as 'start' | 'success' | 'error')}>\n <TabsList className={SETTINGS_TABS_LIST_CLASS}>\n {(['start', 'success', 'error'] as const).map((item) => {\n const Icon = config[item].Icon\n return (\n <TabsTrigger key={item} value={item} className={SETTINGS_TABS_TRIGGER_CLASS}>\n <Icon className=\"mr-2 h-4 w-4\" />\n {config[item].title}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {(['start', 'success', 'error'] as const).map((item) => (\n <TabsContent key={item} value={item} className=\"space-y-4\">\n <label className=\"flex items-center gap-2 rounded-lg border border-border/70 bg-muted/30 px-3 py-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={readBoolean(values[config[item].enabledKey], true)}\n onChange={(event) => setValue(config[item].enabledKey, event.target.checked)}\n />\n {t('checkout.linkTemplateForm.emails.sendToCustomer')}\n </label>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.subject', { state: config[item].title })} error={readError(errors, config[item].subjectKey)}>\n <Input\n value={readString(values[config[item].subjectKey])}\n onChange={(event) => setValue(config[item].subjectKey, event.target.value)}\n placeholder={config[item].subjectPlaceholder}\n className={errorInputClassName(readError(errors, config[item].subjectKey))}\n aria-invalid={Boolean(readError(errors, config[item].subjectKey))}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.emails.labels.body', { state: config[item].title })} error={readError(errors, config[item].bodyKey)}>\n <SwitchableMarkdownInput\n value={readString(values[config[item].bodyKey])}\n onChange={(next) => setValue(config[item].bodyKey, next)}\n isMarkdownEnabled\n height={220}\n placeholder={config[item].bodyPlaceholder}\n />\n </SectionLabel>\n </TabsContent>\n ))}\n </Tabs>\n </div>\n )\n}\n\nfunction SettingsSection({ values, setValue, errors }: CrudFormGroupComponentProps) {\n const t = useT()\n const status = readString(values.status) || 'draft'\n const statusError = readError(errors, 'status')\n const maxCompletionsError = readError(errors, 'maxCompletions')\n const passwordError = readError(errors, 'password')\n\n return (\n <div className=\"space-y-4\">\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.status')} error={statusError}>\n <div className=\"flex flex-wrap gap-2\">\n {[\n { id: 'draft', label: t('checkout.common.status.draft') },\n { id: 'active', label: t('checkout.common.status.active') },\n { id: 'inactive', label: t('checkout.common.status.inactive') },\n ].map((option) => (\n <Button\n key={option.id}\n type=\"button\"\n variant={status === option.id ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setValue('status', option.id)}\n >\n {option.label}\n </Button>\n ))}\n </div>\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.maxCompletions')} hint={t('checkout.linkTemplateForm.settings.hints.maxCompletions')} error={maxCompletionsError}>\n <Input\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={readNumberInputValue(values.maxCompletions)}\n onChange={(event) => setValue('maxCompletions', event.target.value ? Number(event.target.value) : null)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.unlimited')}\n className={errorInputClassName(maxCompletionsError)}\n aria-invalid={Boolean(maxCompletionsError)}\n />\n </SectionLabel>\n\n <SectionLabel label={t('checkout.linkTemplateForm.settings.fields.password')} hint={t('checkout.linkTemplateForm.settings.hints.password')} error={passwordError}>\n <PasswordInput\n value={readString(values.password)}\n onChange={(event) => setValue('password', event.target.value)}\n placeholder={t('checkout.linkTemplateForm.settings.placeholders.password')}\n className={errorInputClassName(passwordError)}\n aria-invalid={Boolean(passwordError)}\n />\n </SectionLabel>\n </div>\n )\n}\n\nexport function LinkTemplateForm({ mode, recordId }: Props) {\n const t = useT()\n const searchParams = useSearchParams()\n const entityId = mode === 'link' ? CHECKOUT_ENTITY_IDS.link : CHECKOUT_ENTITY_IDS.template\n const templateId = React.useMemo(() => {\n const raw = searchParams.get('templateId')\n return raw && raw.trim().length > 0 ? raw : null\n }, [searchParams])\n const attachmentDraftRecordId = React.useMemo(\n () => recordId ?? (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function' ? crypto.randomUUID() : `draft-${Date.now()}`),\n [recordId],\n )\n const initialLogoAttachmentIdRef = React.useRef<string | null>(null)\n const [providers, setProviders] = React.useState<ProviderDescriptor[]>([])\n const [templateOptions, setTemplateOptions] = React.useState<ComboboxOption[]>([])\n const [isApplyingTemplate, setIsApplyingTemplate] = React.useState(false)\n const [formInstanceKey, setFormInstanceKey] = React.useState(0)\n const [initialValues, setInitialValues] = React.useState<FormValues | null>(\n recordId ? null : normalizeFormValues(createDefaultValues(t), t),\n )\n\n const replaceInitialValues = React.useCallback((nextValues: FormValues) => {\n setInitialValues(nextValues)\n setFormInstanceKey((current) => current + 1)\n }, [])\n\n React.useEffect(() => {\n initialLogoAttachmentIdRef.current = initialValues && typeof initialValues.logoAttachmentId === 'string'\n ? initialValues.logoAttachmentId\n : null\n }, [initialValues])\n\n React.useEffect(() => {\n let active = true\n void readApiResultOrThrow<{ items: ProviderDescriptor[] }>('/api/payment_gateways/providers')\n .then((result) => {\n if (!active) return\n setProviders(Array.isArray(result.items) ? result.items : [])\n })\n .catch(() => {\n if (active) setProviders([])\n })\n return () => {\n active = false\n }\n }, [])\n\n const rememberTemplateOptions = React.useCallback((items: TemplateSummary[] | ComboboxOption[]) => {\n setTemplateOptions((current) => {\n const next = new Map(current.map((option) => [option.value, option]))\n items.forEach((item) => {\n if ('value' in item) {\n next.set(item.value, item)\n return\n }\n const option = toTemplateOption(item)\n next.set(option.value, option)\n })\n return Array.from(next.values())\n })\n }, [])\n\n const loadTemplateSuggestions = React.useCallback(async (query?: string): Promise<ComboboxOption[]> => {\n const params = new URLSearchParams({\n page: '1',\n pageSize: '25',\n })\n if (query && query.trim().length > 0) {\n params.set('search', query.trim())\n }\n const result = await readApiResultOrThrow<{ items: TemplateSummary[] }>(`/api/checkout/templates?${params.toString()}`)\n const options = Array.isArray(result.items) ? result.items.map(toTemplateOption) : []\n rememberTemplateOptions(options)\n return options\n }, [rememberTemplateOptions])\n\n const applyTemplate = React.useCallback(async (nextTemplateId: string | null) => {\n if (recordId || mode !== 'link') return\n if (!nextTemplateId) {\n replaceInitialValues(normalizeFormValues(createDefaultValues(t), t))\n return\n }\n setIsApplyingTemplate(true)\n try {\n const result = await readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(nextTemplateId)}`)\n rememberTemplateOptions([{\n id: nextTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n replaceInitialValues(\n normalizeFormValues({\n ...result,\n slug: '',\n templateId: nextTemplateId,\n }, t),\n )\n } finally {\n setIsApplyingTemplate(false)\n }\n }, [mode, recordId, rememberTemplateOptions, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (mode !== 'link' || recordId) return\n void loadTemplateSuggestions()\n .catch(() => null)\n }, [loadTemplateSuggestions, mode, recordId])\n\n React.useEffect(() => {\n if (!recordId) return\n let active = true\n void readApiResultOrThrow<FormValues>(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`)\n .then((result) => {\n if (!active) return\n replaceInitialValues(normalizeFormValues(result, t))\n })\n .catch(() => {\n if (active) replaceInitialValues(normalizeFormValues({}, t))\n })\n return () => {\n active = false\n }\n }, [mode, recordId, replaceInitialValues, t])\n\n React.useEffect(() => {\n if (recordId || mode !== 'link' || !templateId) return\n void applyTemplate(templateId).catch(() => null)\n }, [applyTemplate, mode, recordId, templateId])\n\n React.useEffect(() => {\n const currentTemplateId = readString(initialValues?.templateId).trim()\n if (mode !== 'link' || !currentTemplateId) return\n if (templateOptions.some((option) => option.value === currentTemplateId)) return\n\n let active = true\n void readApiResultOrThrow<FormValues>(`/api/checkout/templates/${encodeURIComponent(currentTemplateId)}`)\n .then((result) => {\n if (!active) return\n rememberTemplateOptions([{\n id: currentTemplateId,\n name: readString(result.name),\n title: readString(result.title) || null,\n gatewayProviderKey: readString(result.gatewayProviderKey) || null,\n pricingMode: readString(result.pricingMode) || null,\n }])\n })\n .catch(() => null)\n\n return () => {\n active = false\n }\n }, [initialValues?.templateId, mode, rememberTemplateOptions, templateOptions])\n\n const fields = React.useMemo<CrudField[]>(() => [], [])\n\n const groups = React.useMemo<CrudFormGroup[]>(() => [\n {\n id: 'general',\n title: t('checkout.linkTemplateForm.groups.general'),\n column: 1,\n component: (ctx) => (\n <GeneralSection\n {...ctx}\n mode={mode}\n templateOptions={templateOptions}\n loadTemplateSuggestions={loadTemplateSuggestions}\n applyTemplate={applyTemplate}\n isApplyingTemplate={isApplyingTemplate}\n />\n ),\n },\n {\n id: 'payment',\n title: t('checkout.linkTemplateForm.groups.payment'),\n column: 2,\n component: (ctx) => <PaymentSection {...ctx} providers={providers} />,\n },\n {\n id: 'pricing',\n title: t('checkout.linkTemplateForm.groups.pricing'),\n column: 1,\n component: (ctx) => <PricingSection {...ctx} />,\n },\n {\n id: 'appearance',\n title: t('checkout.linkTemplateForm.groups.appearance'),\n column: 2,\n component: (ctx) => (\n <AppearanceSection\n {...ctx}\n entityId={entityId}\n attachmentRecordId={attachmentDraftRecordId}\n />\n ),\n },\n {\n id: 'customerFields',\n title: t('checkout.linkTemplateForm.groups.customerFields'),\n column: 1,\n component: (ctx) => <CustomerDetailsSection {...ctx} />,\n },\n {\n id: 'settings',\n title: t('checkout.linkTemplateForm.groups.settings'),\n column: 2,\n component: (ctx) => <SettingsSection {...ctx} />,\n },\n {\n id: 'legal',\n title: t('checkout.linkTemplateForm.groups.legal'),\n column: 1,\n component: (ctx) => <LegalSection {...ctx} />,\n },\n {\n id: 'messages',\n title: t('checkout.linkTemplateForm.groups.messages'),\n column: 1,\n component: (ctx) => <MessagesSection {...ctx} />,\n },\n {\n id: 'emails',\n title: t('checkout.linkTemplateForm.groups.emails'),\n column: 1,\n component: (ctx) => <EmailsSection {...ctx} />,\n },\n { id: 'customFields', title: t('checkout.linkTemplateForm.groups.customFields'), column: 2, kind: 'customFields' },\n ], [applyTemplate, attachmentDraftRecordId, entityId, isApplyingTemplate, loadTemplateSuggestions, mode, providers, t, templateOptions])\n\n const isLocked = mode === 'link' && Boolean(recordId) && readBoolean(initialValues?.isLocked)\n const formId = React.useMemo(\n () => `checkout-${mode}-editor-${recordId ?? 'new'}`,\n [mode, recordId],\n )\n const lockedNotice = isLocked ? (\n <Alert variant=\"warning\">\n <AlertTitle>{t('checkout.linkTemplateForm.locked.title')}</AlertTitle>\n <AlertDescription>{t('checkout.linkTemplateForm.locked.description')}</AlertDescription>\n </Alert>\n ) : undefined\n const lockedOverlay = isLocked ? (\n <div className=\"mx-auto mt-6 max-w-md rounded-xl border border-status-warning-border bg-background/95 px-5 py-4 text-center shadow-sm\">\n <div className=\"mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-status-warning-bg text-status-warning-icon\">\n <Shield className=\"h-5 w-5\" />\n </div>\n <p className=\"text-sm font-semibold text-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayTitle')}\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {t('checkout.linkTemplateForm.locked.overlayDescription')}\n </p>\n </div>\n ) : undefined\n\n return (\n <Page>\n <PageBody>\n {initialValues ? (\n <CrudForm<FormValues>\n key={formInstanceKey}\n formId={formId}\n title={recordId\n ? t(mode === 'link' ? 'checkout.linkTemplateForm.titles.editLink' : 'checkout.linkTemplateForm.titles.editTemplate')\n : t(mode === 'link' ? 'checkout.linkTemplateForm.titles.createLink' : 'checkout.linkTemplateForm.titles.createTemplate')}\n backHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n cancelHref={mode === 'link' ? '/backend/checkout/pay-links' : '/backend/checkout/templates'}\n fields={fields}\n groups={groups}\n extraActions={recordId ? (\n <>\n {isLocked ? (\n <Button asChild type=\"button\" variant=\"outline\">\n <a\n href={mode === 'link'\n ? `/pay/${encodeURIComponent(readString(initialValues.slug))}?preview=true`\n : `/backend/checkout/templates/${encodeURIComponent(recordId)}/preview`}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </a>\n </Button>\n ) : (\n <Button\n type=\"submit\"\n form={formId}\n variant=\"outline\"\n name=\"submitIntent\"\n value=\"preview\"\n >\n <Eye className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.preview')}\n </Button>\n )}\n {mode === 'link' && recordId && !isLocked ? (\n <Button\n type=\"submit\"\n form={formId}\n name=\"submitIntent\"\n value=\"publish\"\n >\n <BadgeCheck className=\"mr-2 h-4 w-4\" />\n {t('checkout.common.actions.saveAndPublish')}\n </Button>\n ) : null}\n </>\n ) : null}\n entityId={entityId}\n customFieldsetBindings={{ [entityId]: { valueKey: 'customFieldsetCode' } }}\n initialValues={initialValues}\n contentHeader={lockedNotice}\n readOnly={isLocked}\n readOnlyOverlay={lockedOverlay}\n deleteVisible={Boolean(recordId)}\n onSubmit={async (values, context) => {\n const submitIntent = context?.submitter?.value === 'preview'\n ? 'preview'\n : context?.submitter?.value === 'publish'\n ? 'publish'\n : 'save'\n const shouldOpenPreview = submitIntent === 'preview'\n const payload = {\n ...values,\n status: submitIntent === 'publish' ? 'active' : values.status,\n customFields: collectCustomFieldValues(values),\n }\n const endpoint = `/api/checkout/${mode === 'link' ? 'links' : 'templates'}${recordId ? `/${encodeURIComponent(recordId)}` : ''}`\n let response: { id?: string; slug?: string; ok?: boolean }\n try {\n response = await withScopedApiRequestHeaders(\n recordId ? buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null) : {},\n () => readApiResultOrThrow<{ id?: string; slug?: string; ok?: boolean }>(endpoint, {\n method: recordId ? 'PUT' : 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n throw error\n }\n const targetId = recordId ?? (typeof response?.id === 'string' ? response.id : null)\n const logoAttachmentId = readString(values.logoAttachmentId)\n if (\n !recordId &&\n targetId &&\n logoAttachmentId &&\n logoAttachmentId !== initialLogoAttachmentIdRef.current\n ) {\n await apiCall('/api/attachments/transfer', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n entityId,\n attachmentIds: [logoAttachmentId],\n fromRecordId: attachmentDraftRecordId,\n toRecordId: targetId,\n }),\n })\n }\n if (shouldOpenPreview) {\n if (mode === 'link') {\n const savedSlug = typeof response?.slug === 'string' && response.slug.trim().length > 0\n ? response.slug.trim()\n : readString(values.slug).trim() || readString(initialValues.slug).trim()\n if (savedSlug) {\n window.open(`/pay/${encodeURIComponent(savedSlug)}?preview=true`, '_blank', 'noopener,noreferrer')\n return\n }\n } else if (targetId) {\n window.open(\n `/backend/checkout/templates/${encodeURIComponent(targetId)}/preview`,\n '_blank',\n 'noopener,noreferrer',\n )\n return\n }\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(\n t(submitIntent === 'publish' ? 'checkout.admin.payLinks.flash.published' : 'checkout.common.flash.saved'),\n )}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.saved'))}&type=success`\n }}\n onDelete={recordId ? async () => {\n try {\n await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(readString(initialValues?.updatedAt) || null),\n () => apiCallOrThrow(`/api/checkout/${mode === 'link' ? 'links' : 'templates'}/${encodeURIComponent(recordId)}`, { method: 'DELETE' }),\n )\n } catch (error) {\n if (surfaceRecordConflict(error, t)) return\n throw error\n }\n window.location.href = mode === 'link'\n ? `/backend/checkout/pay-links?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n : `/backend/checkout/templates?flash=${encodeURIComponent(t('checkout.common.flash.deleted'))}&type=success`\n } : undefined}\n />\n ) : null}\n </PageBody>\n </Page>\n )\n}\n\nexport default LinkTemplateForm\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -98,7 +98,7 @@ const checkoutContentSchema = z.object({
98
98
  customAmountMax: positiveMoneySchema.optional().nullable(),
99
99
  customAmountCurrencyCode: currencyCodeSchema.optional().nullable(),
100
100
  priceListItems: z.array(priceListItemSchema).optional().nullable(),
101
- gatewayProviderKey: requiredTrimmedString("checkout.validation.gatewayProviderKey.required"),
101
+ gatewayProviderKey: optionalTrimmedString,
102
102
  gatewaySettings: gatewaySettingsSchema,
103
103
  customFieldsetCode: optionalFieldsetCodeSchema,
104
104
  collectCustomerDetails: z.boolean().default(true),
@@ -159,7 +159,16 @@ function validatePricingConsistency(value, ctx) {
159
159
  }
160
160
  }
161
161
  }
162
- const createTemplateSchema = checkoutContentSchema.superRefine(validatePricingConsistency);
162
+ const createTemplateSchema = checkoutContentSchema.superRefine((value, ctx) => {
163
+ validatePricingConsistency(value, ctx);
164
+ if (!value.gatewayProviderKey) {
165
+ ctx.addIssue({
166
+ code: z.ZodIssueCode.custom,
167
+ message: "checkout.validation.gatewayProviderKey.required",
168
+ path: ["gatewayProviderKey"]
169
+ });
170
+ }
171
+ });
163
172
  function applyPartialPricingConsistency(value, ctx) {
164
173
  if (!value.pricingMode) return;
165
174
  validatePricingConsistency({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/checkout/data/validators.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport { fieldsetCodeRegex } from '@open-mercato/shared/modules/entities/validators'\nimport { DEFAULT_CHECKOUT_CUSTOMER_FIELDS } from '../lib/defaults'\nimport { CHECKOUT_LINK_STATUSES } from '../lib/constants'\n\nfunction normalizeBlankString(value: unknown): unknown {\n if (typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction normalizeOptionalDocument(value: unknown): unknown {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n const source = value as Record<string, unknown>\n const title = typeof source.title === 'string' ? source.title.trim() : ''\n const markdown = typeof source.markdown === 'string' ? source.markdown.trim() : ''\n const required = source.required === true\n if (!title && !markdown && !required) return undefined\n return value\n}\n\nfunction requiredTrimmedString(message: string) {\n return z.string().trim().min(1, { message })\n}\n\nconst hexColorSchema = z.string().regex(/^#([0-9a-fA-F]{6})$/, {\n message: 'checkout.validation.common.invalidColor',\n})\nconst currencyCodeSchema = z.string().trim().toUpperCase().regex(/^[A-Z]{3}$/, {\n message: 'checkout.validation.common.invalidCurrencyCode',\n})\nconst optionalTrimmedString = z.preprocess(\n normalizeBlankString,\n z.string().trim().min(1, { message: 'checkout.validation.common.required' }).optional().nullable(),\n)\nconst optionalUrlSchema = z.preprocess(\n normalizeBlankString,\n z.string().url('checkout.validation.common.invalidUrl').optional().nullable(),\n)\nconst optionalFieldsetCodeSchema = z.preprocess(\n normalizeBlankString,\n z.string().regex(fieldsetCodeRegex, {\n message: 'checkout.validation.common.invalidFieldsetCode',\n }).optional().nullable(),\n)\nconst positiveMoneySchema = z.coerce.number().finite('checkout.validation.common.invalidNumber').nonnegative('checkout.validation.common.nonNegativeNumber')\nconst linkStatusSchema = z.enum(CHECKOUT_LINK_STATUSES)\n\nexport const customerFieldOptionSchema = z.object({\n value: requiredTrimmedString('checkout.validation.common.required'),\n label: requiredTrimmedString('checkout.validation.common.required'),\n})\n\nexport const customerFieldDefinitionSchema = z.object({\n key: z.string().regex(/^[a-z][A-Za-z0-9]*$/, {\n message: 'checkout.validation.customerFields.key.invalid',\n }),\n label: requiredTrimmedString('checkout.validation.common.required'),\n kind: z.enum(['text', 'multiline', 'boolean', 'select', 'radio']),\n required: z.boolean(),\n fixed: z.boolean(),\n placeholder: optionalTrimmedString,\n options: z.array(customerFieldOptionSchema).optional(),\n sortOrder: z.coerce.number().int('checkout.validation.common.integer').min(0, {\n message: 'checkout.validation.common.nonNegativeInteger',\n }),\n})\n\nexport const legalDocumentSchema = z.preprocess(\n normalizeOptionalDocument,\n z.object({\n title: requiredTrimmedString('checkout.validation.common.required'),\n markdown: requiredTrimmedString('checkout.validation.common.required'),\n required: z.boolean().default(false),\n }).optional(),\n)\n\nexport const legalDocumentsSchema = z.object({\n terms: legalDocumentSchema.optional(),\n privacyPolicy: legalDocumentSchema.optional(),\n}).optional()\n\nexport const priceListItemSchema = z.object({\n id: requiredTrimmedString('checkout.validation.common.required'),\n description: requiredTrimmedString('checkout.validation.common.required'),\n amount: positiveMoneySchema,\n currencyCode: currencyCodeSchema,\n})\n\nexport const gatewaySettingsSchema = z.record(z.string(), z.unknown()).optional()\n\nconst checkoutContentSchema = z.object({\n name: requiredTrimmedString('checkout.validation.name.required'),\n title: optionalTrimmedString,\n subtitle: optionalTrimmedString,\n description: z.string().optional().nullable(),\n logoAttachmentId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n logoUrl: optionalUrlSchema,\n primaryColor: hexColorSchema.optional().nullable(),\n secondaryColor: hexColorSchema.optional().nullable(),\n backgroundColor: hexColorSchema.optional().nullable(),\n themeMode: z.enum(['light', 'dark', 'auto']).default('auto'),\n pricingMode: z.enum(['fixed', 'custom_amount', 'price_list']),\n fixedPriceAmount: positiveMoneySchema.optional().nullable(),\n fixedPriceCurrencyCode: currencyCodeSchema.optional().nullable(),\n fixedPriceIncludesTax: z.boolean().default(true),\n fixedPriceOriginalAmount: positiveMoneySchema.optional().nullable(),\n customAmountMin: positiveMoneySchema.optional().nullable(),\n customAmountMax: positiveMoneySchema.optional().nullable(),\n customAmountCurrencyCode: currencyCodeSchema.optional().nullable(),\n priceListItems: z.array(priceListItemSchema).optional().nullable(),\n gatewayProviderKey: requiredTrimmedString('checkout.validation.gatewayProviderKey.required'),\n gatewaySettings: gatewaySettingsSchema,\n customFieldsetCode: optionalFieldsetCodeSchema,\n collectCustomerDetails: z.boolean().default(true),\n customerFieldsSchema: z.array(customerFieldDefinitionSchema).default([...DEFAULT_CHECKOUT_CUSTOMER_FIELDS]),\n legalDocuments: legalDocumentsSchema,\n displayCustomFieldsOnPage: z.boolean().default(false),\n successTitle: optionalTrimmedString,\n successMessage: z.string().optional().nullable(),\n cancelTitle: optionalTrimmedString,\n cancelMessage: z.string().optional().nullable(),\n errorTitle: optionalTrimmedString,\n errorMessage: z.string().optional().nullable(),\n successEmailSubject: optionalTrimmedString,\n successEmailBody: z.string().optional().nullable(),\n sendSuccessEmail: z.boolean().default(true),\n errorEmailSubject: optionalTrimmedString,\n errorEmailBody: z.string().optional().nullable(),\n sendErrorEmail: z.boolean().default(true),\n startEmailSubject: optionalTrimmedString,\n startEmailBody: z.string().optional().nullable(),\n sendStartEmail: z.boolean().default(true),\n password: optionalTrimmedString,\n maxCompletions: z.coerce.number().int('checkout.validation.common.integer').positive('checkout.validation.common.positiveInteger').optional().nullable(),\n status: linkStatusSchema.default('draft'),\n checkoutType: z.enum(['pay_link', 'simple_checkout']).default('pay_link'),\n})\n\nfunction validatePricingConsistency<T extends z.infer<typeof checkoutContentSchema>>(value: T, ctx: z.RefinementCtx) {\n if (value.pricingMode === 'fixed') {\n if (value.fixedPriceAmount == null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.fixedPriceAmount.required', path: ['fixedPriceAmount'] })\n }\n if (!value.fixedPriceCurrencyCode) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.fixedPriceCurrencyCode.required', path: ['fixedPriceCurrencyCode'] })\n }\n }\n\n if (value.pricingMode === 'custom_amount') {\n if (value.customAmountMin == null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmountMin.required', path: ['customAmountMin'] })\n }\n if (value.customAmountMax == null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmountMax.required', path: ['customAmountMax'] })\n }\n if (!value.customAmountCurrencyCode) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmountCurrencyCode.required', path: ['customAmountCurrencyCode'] })\n }\n if (value.customAmountMin != null && value.customAmountMax != null && value.customAmountMin > value.customAmountMax) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmount.range', path: ['customAmountMax'] })\n }\n }\n\n if (value.pricingMode === 'price_list') {\n if (!Array.isArray(value.priceListItems) || value.priceListItems.length === 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.priceListItems.required', path: ['priceListItems'] })\n return\n }\n const currencies = new Set(value.priceListItems.map((item) => item.currencyCode))\n if (currencies.size > 1) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.priceListItems.singleCurrency', path: ['priceListItems'] })\n }\n }\n}\n\nexport const createTemplateSchema = checkoutContentSchema.superRefine(validatePricingConsistency)\n\nfunction applyPartialPricingConsistency(value: Record<string, unknown>, ctx: z.RefinementCtx) {\n if (!value.pricingMode) return\n validatePricingConsistency({\n ...checkoutContentSchema.parse({\n ...value,\n name: value.name ?? 'placeholder',\n pricingMode: value.pricingMode,\n customerFieldsSchema: value.customerFieldsSchema ?? [...DEFAULT_CHECKOUT_CUSTOMER_FIELDS],\n }),\n ...value,\n }, ctx)\n}\n\nexport const updateTemplateSchema = checkoutContentSchema.partial().extend({\n id: z.string().uuid('checkout.validation.common.invalidUuid'),\n password: optionalTrimmedString,\n customerFieldsSchema: z.array(customerFieldDefinitionSchema).optional(),\n}).superRefine((value, ctx) => {\n applyPartialPricingConsistency(value, ctx)\n})\n\nexport const createLinkSchema = createTemplateSchema.safeExtend({\n templateId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n slug: optionalTrimmedString,\n})\n\nexport const updateLinkSchema = checkoutContentSchema.partial().safeExtend({\n id: z.string().uuid('checkout.validation.common.invalidUuid'),\n templateId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n slug: optionalTrimmedString,\n password: optionalTrimmedString,\n customerFieldsSchema: z.array(customerFieldDefinitionSchema).optional(),\n}).superRefine((value, ctx) => {\n applyPartialPricingConsistency(value, ctx)\n})\n\nexport const transactionStatusSchema = z.enum(['pending', 'processing', 'completed', 'failed', 'cancelled', 'expired'])\n\nexport const transactionCreateSchema = z.object({\n linkId: z.string().uuid('checkout.validation.common.invalidUuid'),\n amount: positiveMoneySchema,\n currencyCode: currencyCodeSchema,\n idempotencyKey: requiredTrimmedString('checkout.validation.common.required'),\n customerData: z.record(z.string(), z.unknown()).default({}),\n firstName: optionalTrimmedString,\n lastName: optionalTrimmedString,\n email: optionalTrimmedString,\n phone: optionalTrimmedString,\n gatewayTransactionId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n paymentStatus: optionalTrimmedString,\n selectedPriceItemId: optionalTrimmedString,\n acceptedLegalConsents: z.record(z.string(), z.unknown()).optional().nullable(),\n ipAddress: optionalTrimmedString,\n userAgent: z.string().optional().nullable(),\n tenantId: z.string().uuid('checkout.validation.common.invalidUuid'),\n organizationId: z.string().uuid('checkout.validation.common.invalidUuid'),\n})\n\nexport const transactionUpdateStatusSchema = z.object({\n id: z.string().uuid('checkout.validation.common.invalidUuid'),\n status: transactionStatusSchema,\n paymentStatus: optionalTrimmedString,\n gatewayTransactionId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n tenantId: z.string().uuid('checkout.validation.common.invalidUuid'),\n organizationId: z.string().uuid('checkout.validation.common.invalidUuid'),\n})\n\nexport const publicPasswordVerifySchema = z.object({\n password: z.string().min(1, { message: 'checkout.validation.common.required' }),\n})\n\nexport const publicSubmitSchema = z.object({\n customerData: z.record(z.string(), z.unknown()),\n acceptedLegalConsents: z.object({\n terms: z.boolean().optional(),\n privacyPolicy: z.boolean().optional(),\n }).default({}),\n amount: z.coerce.number().finite().nonnegative().optional(),\n selectedPriceItemId: optionalTrimmedString,\n})\n\nexport type CustomerFieldDefinitionInput = z.infer<typeof customerFieldDefinitionSchema>\nexport type PriceListItemInput = z.infer<typeof priceListItemSchema>\nexport type CreateTemplateInput = z.infer<typeof createTemplateSchema>\nexport type UpdateTemplateInput = z.infer<typeof updateTemplateSchema>\nexport type CreateLinkInput = z.infer<typeof createLinkSchema>\nexport type UpdateLinkInput = z.infer<typeof updateLinkSchema>\nexport type CreateTransactionInput = z.infer<typeof transactionCreateSchema>\nexport type UpdateTransactionStatusInput = z.infer<typeof transactionUpdateStatusSchema>\nexport type PublicSubmitInput = z.infer<typeof publicSubmitSchema>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport { fieldsetCodeRegex } from '@open-mercato/shared/modules/entities/validators'\nimport { DEFAULT_CHECKOUT_CUSTOMER_FIELDS } from '../lib/defaults'\nimport { CHECKOUT_LINK_STATUSES } from '../lib/constants'\n\nfunction normalizeBlankString(value: unknown): unknown {\n if (typeof value !== 'string') return value\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction normalizeOptionalDocument(value: unknown): unknown {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return value\n const source = value as Record<string, unknown>\n const title = typeof source.title === 'string' ? source.title.trim() : ''\n const markdown = typeof source.markdown === 'string' ? source.markdown.trim() : ''\n const required = source.required === true\n if (!title && !markdown && !required) return undefined\n return value\n}\n\nfunction requiredTrimmedString(message: string) {\n return z.string().trim().min(1, { message })\n}\n\nconst hexColorSchema = z.string().regex(/^#([0-9a-fA-F]{6})$/, {\n message: 'checkout.validation.common.invalidColor',\n})\nconst currencyCodeSchema = z.string().trim().toUpperCase().regex(/^[A-Z]{3}$/, {\n message: 'checkout.validation.common.invalidCurrencyCode',\n})\nconst optionalTrimmedString = z.preprocess(\n normalizeBlankString,\n z.string().trim().min(1, { message: 'checkout.validation.common.required' }).optional().nullable(),\n)\nconst optionalUrlSchema = z.preprocess(\n normalizeBlankString,\n z.string().url('checkout.validation.common.invalidUrl').optional().nullable(),\n)\nconst optionalFieldsetCodeSchema = z.preprocess(\n normalizeBlankString,\n z.string().regex(fieldsetCodeRegex, {\n message: 'checkout.validation.common.invalidFieldsetCode',\n }).optional().nullable(),\n)\nconst positiveMoneySchema = z.coerce.number().finite('checkout.validation.common.invalidNumber').nonnegative('checkout.validation.common.nonNegativeNumber')\nconst linkStatusSchema = z.enum(CHECKOUT_LINK_STATUSES)\n\nexport const customerFieldOptionSchema = z.object({\n value: requiredTrimmedString('checkout.validation.common.required'),\n label: requiredTrimmedString('checkout.validation.common.required'),\n})\n\nexport const customerFieldDefinitionSchema = z.object({\n key: z.string().regex(/^[a-z][A-Za-z0-9]*$/, {\n message: 'checkout.validation.customerFields.key.invalid',\n }),\n label: requiredTrimmedString('checkout.validation.common.required'),\n kind: z.enum(['text', 'multiline', 'boolean', 'select', 'radio']),\n required: z.boolean(),\n fixed: z.boolean(),\n placeholder: optionalTrimmedString,\n options: z.array(customerFieldOptionSchema).optional(),\n sortOrder: z.coerce.number().int('checkout.validation.common.integer').min(0, {\n message: 'checkout.validation.common.nonNegativeInteger',\n }),\n})\n\nexport const legalDocumentSchema = z.preprocess(\n normalizeOptionalDocument,\n z.object({\n title: requiredTrimmedString('checkout.validation.common.required'),\n markdown: requiredTrimmedString('checkout.validation.common.required'),\n required: z.boolean().default(false),\n }).optional(),\n)\n\nexport const legalDocumentsSchema = z.object({\n terms: legalDocumentSchema.optional(),\n privacyPolicy: legalDocumentSchema.optional(),\n}).optional()\n\nexport const priceListItemSchema = z.object({\n id: requiredTrimmedString('checkout.validation.common.required'),\n description: requiredTrimmedString('checkout.validation.common.required'),\n amount: positiveMoneySchema,\n currencyCode: currencyCodeSchema,\n})\n\nexport const gatewaySettingsSchema = z.record(z.string(), z.unknown()).optional()\n\nconst checkoutContentSchema = z.object({\n name: requiredTrimmedString('checkout.validation.name.required'),\n title: optionalTrimmedString,\n subtitle: optionalTrimmedString,\n description: z.string().optional().nullable(),\n logoAttachmentId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n logoUrl: optionalUrlSchema,\n primaryColor: hexColorSchema.optional().nullable(),\n secondaryColor: hexColorSchema.optional().nullable(),\n backgroundColor: hexColorSchema.optional().nullable(),\n themeMode: z.enum(['light', 'dark', 'auto']).default('auto'),\n pricingMode: z.enum(['fixed', 'custom_amount', 'price_list']),\n fixedPriceAmount: positiveMoneySchema.optional().nullable(),\n fixedPriceCurrencyCode: currencyCodeSchema.optional().nullable(),\n fixedPriceIncludesTax: z.boolean().default(true),\n fixedPriceOriginalAmount: positiveMoneySchema.optional().nullable(),\n customAmountMin: positiveMoneySchema.optional().nullable(),\n customAmountMax: positiveMoneySchema.optional().nullable(),\n customAmountCurrencyCode: currencyCodeSchema.optional().nullable(),\n priceListItems: z.array(priceListItemSchema).optional().nullable(),\n gatewayProviderKey: optionalTrimmedString,\n gatewaySettings: gatewaySettingsSchema,\n customFieldsetCode: optionalFieldsetCodeSchema,\n collectCustomerDetails: z.boolean().default(true),\n customerFieldsSchema: z.array(customerFieldDefinitionSchema).default([...DEFAULT_CHECKOUT_CUSTOMER_FIELDS]),\n legalDocuments: legalDocumentsSchema,\n displayCustomFieldsOnPage: z.boolean().default(false),\n successTitle: optionalTrimmedString,\n successMessage: z.string().optional().nullable(),\n cancelTitle: optionalTrimmedString,\n cancelMessage: z.string().optional().nullable(),\n errorTitle: optionalTrimmedString,\n errorMessage: z.string().optional().nullable(),\n successEmailSubject: optionalTrimmedString,\n successEmailBody: z.string().optional().nullable(),\n sendSuccessEmail: z.boolean().default(true),\n errorEmailSubject: optionalTrimmedString,\n errorEmailBody: z.string().optional().nullable(),\n sendErrorEmail: z.boolean().default(true),\n startEmailSubject: optionalTrimmedString,\n startEmailBody: z.string().optional().nullable(),\n sendStartEmail: z.boolean().default(true),\n password: optionalTrimmedString,\n maxCompletions: z.coerce.number().int('checkout.validation.common.integer').positive('checkout.validation.common.positiveInteger').optional().nullable(),\n status: linkStatusSchema.default('draft'),\n checkoutType: z.enum(['pay_link', 'simple_checkout']).default('pay_link'),\n})\n\nfunction validatePricingConsistency<T extends z.infer<typeof checkoutContentSchema>>(value: T, ctx: z.RefinementCtx) {\n if (value.pricingMode === 'fixed') {\n if (value.fixedPriceAmount == null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.fixedPriceAmount.required', path: ['fixedPriceAmount'] })\n }\n if (!value.fixedPriceCurrencyCode) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.fixedPriceCurrencyCode.required', path: ['fixedPriceCurrencyCode'] })\n }\n }\n\n if (value.pricingMode === 'custom_amount') {\n if (value.customAmountMin == null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmountMin.required', path: ['customAmountMin'] })\n }\n if (value.customAmountMax == null) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmountMax.required', path: ['customAmountMax'] })\n }\n if (!value.customAmountCurrencyCode) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmountCurrencyCode.required', path: ['customAmountCurrencyCode'] })\n }\n if (value.customAmountMin != null && value.customAmountMax != null && value.customAmountMin > value.customAmountMax) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.customAmount.range', path: ['customAmountMax'] })\n }\n }\n\n if (value.pricingMode === 'price_list') {\n if (!Array.isArray(value.priceListItems) || value.priceListItems.length === 0) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.priceListItems.required', path: ['priceListItems'] })\n return\n }\n const currencies = new Set(value.priceListItems.map((item) => item.currencyCode))\n if (currencies.size > 1) {\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'checkout.validation.priceListItems.singleCurrency', path: ['priceListItems'] })\n }\n }\n}\n\nexport const createTemplateSchema = checkoutContentSchema.superRefine((value, ctx) => {\n validatePricingConsistency(value, ctx)\n if (!value.gatewayProviderKey) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'checkout.validation.gatewayProviderKey.required',\n path: ['gatewayProviderKey'],\n })\n }\n})\n\nfunction applyPartialPricingConsistency(value: Record<string, unknown>, ctx: z.RefinementCtx) {\n if (!value.pricingMode) return\n validatePricingConsistency({\n ...checkoutContentSchema.parse({\n ...value,\n name: value.name ?? 'placeholder',\n pricingMode: value.pricingMode,\n customerFieldsSchema: value.customerFieldsSchema ?? [...DEFAULT_CHECKOUT_CUSTOMER_FIELDS],\n }),\n ...value,\n }, ctx)\n}\n\nexport const updateTemplateSchema = checkoutContentSchema.partial().extend({\n id: z.string().uuid('checkout.validation.common.invalidUuid'),\n password: optionalTrimmedString,\n customerFieldsSchema: z.array(customerFieldDefinitionSchema).optional(),\n}).superRefine((value, ctx) => {\n applyPartialPricingConsistency(value, ctx)\n})\n\nexport const createLinkSchema = createTemplateSchema.safeExtend({\n templateId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n slug: optionalTrimmedString,\n})\n\nexport const updateLinkSchema = checkoutContentSchema.partial().safeExtend({\n id: z.string().uuid('checkout.validation.common.invalidUuid'),\n templateId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n slug: optionalTrimmedString,\n password: optionalTrimmedString,\n customerFieldsSchema: z.array(customerFieldDefinitionSchema).optional(),\n}).superRefine((value, ctx) => {\n applyPartialPricingConsistency(value, ctx)\n})\n\nexport const transactionStatusSchema = z.enum(['pending', 'processing', 'completed', 'failed', 'cancelled', 'expired'])\n\nexport const transactionCreateSchema = z.object({\n linkId: z.string().uuid('checkout.validation.common.invalidUuid'),\n amount: positiveMoneySchema,\n currencyCode: currencyCodeSchema,\n idempotencyKey: requiredTrimmedString('checkout.validation.common.required'),\n customerData: z.record(z.string(), z.unknown()).default({}),\n firstName: optionalTrimmedString,\n lastName: optionalTrimmedString,\n email: optionalTrimmedString,\n phone: optionalTrimmedString,\n gatewayTransactionId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n paymentStatus: optionalTrimmedString,\n selectedPriceItemId: optionalTrimmedString,\n acceptedLegalConsents: z.record(z.string(), z.unknown()).optional().nullable(),\n ipAddress: optionalTrimmedString,\n userAgent: z.string().optional().nullable(),\n tenantId: z.string().uuid('checkout.validation.common.invalidUuid'),\n organizationId: z.string().uuid('checkout.validation.common.invalidUuid'),\n})\n\nexport const transactionUpdateStatusSchema = z.object({\n id: z.string().uuid('checkout.validation.common.invalidUuid'),\n status: transactionStatusSchema,\n paymentStatus: optionalTrimmedString,\n gatewayTransactionId: z.string().uuid('checkout.validation.common.invalidUuid').optional().nullable(),\n tenantId: z.string().uuid('checkout.validation.common.invalidUuid'),\n organizationId: z.string().uuid('checkout.validation.common.invalidUuid'),\n})\n\nexport const publicPasswordVerifySchema = z.object({\n password: z.string().min(1, { message: 'checkout.validation.common.required' }),\n})\n\nexport const publicSubmitSchema = z.object({\n customerData: z.record(z.string(), z.unknown()),\n acceptedLegalConsents: z.object({\n terms: z.boolean().optional(),\n privacyPolicy: z.boolean().optional(),\n }).default({}),\n amount: z.coerce.number().finite().nonnegative().optional(),\n selectedPriceItemId: optionalTrimmedString,\n})\n\nexport type CustomerFieldDefinitionInput = z.infer<typeof customerFieldDefinitionSchema>\nexport type PriceListItemInput = z.infer<typeof priceListItemSchema>\nexport type CreateTemplateInput = z.infer<typeof createTemplateSchema>\nexport type UpdateTemplateInput = z.infer<typeof updateTemplateSchema>\nexport type CreateLinkInput = z.infer<typeof createLinkSchema>\nexport type UpdateLinkInput = z.infer<typeof updateLinkSchema>\nexport type CreateTransactionInput = z.infer<typeof transactionCreateSchema>\nexport type UpdateTransactionStatusInput = z.infer<typeof transactionUpdateStatusSchema>\nexport type PublicSubmitInput = z.infer<typeof publicSubmitSchema>\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/checkout",
3
- "version": "0.6.5-develop.4544.1.71c003c861",
3
+ "version": "0.6.5-develop.4559.1.839e136509",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -61,18 +61,18 @@
61
61
  }
62
62
  },
63
63
  "dependencies": {
64
- "@open-mercato/core": "0.6.5-develop.4544.1.71c003c861",
65
- "@open-mercato/ui": "0.6.5-develop.4544.1.71c003c861",
64
+ "@open-mercato/core": "0.6.5-develop.4559.1.839e136509",
65
+ "@open-mercato/ui": "0.6.5-develop.4559.1.839e136509",
66
66
  "bcryptjs": "^3.0.3"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "@mikro-orm/postgresql": "^7.0.14",
70
- "@open-mercato/shared": "0.6.5-develop.4544.1.71c003c861",
70
+ "@open-mercato/shared": "0.6.5-develop.4559.1.839e136509",
71
71
  "react": "^19.0.0",
72
72
  "react-dom": "^19.0.0"
73
73
  },
74
74
  "devDependencies": {
75
- "@open-mercato/shared": "0.6.5-develop.4544.1.71c003c861",
75
+ "@open-mercato/shared": "0.6.5-develop.4559.1.839e136509",
76
76
  "@types/jest": "^30.0.0",
77
77
  "@types/react": "^19.2.16",
78
78
  "@types/react-dom": "^19.2.3",
@@ -0,0 +1,134 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'
3
+ import { readJsonSafe } from '@open-mercato/core/modules/core/__integration__/helpers/generalFixtures'
4
+ import {
5
+ createFixedTemplateInput,
6
+ createLinkFixture,
7
+ createTemplateFixture,
8
+ deleteCheckoutEntityIfExists,
9
+ readLink,
10
+ readTemplate,
11
+ updateLink,
12
+ updateTemplate,
13
+ } from './helpers/fixtures'
14
+
15
+ test.describe('TC-CHKT-039: Draft template/pay-link edits tolerate a null gateway provider (issue #2505)', () => {
16
+ test('template: clearing the gateway provider on a draft saves and round-trips as null', async ({ request }) => {
17
+ let token: string | null = null
18
+ let templateId: string | null = null
19
+
20
+ try {
21
+ token = await getAuthToken(request)
22
+ templateId = await createTemplateFixture(request, token, createFixedTemplateInput({ status: 'draft' }))
23
+
24
+ const clearResponse = await updateTemplate(request, token, templateId, {
25
+ name: 'Consulting Fee (no gateway)',
26
+ pricingMode: 'fixed',
27
+ fixedPriceAmount: 49.99,
28
+ fixedPriceCurrencyCode: 'USD',
29
+ status: 'draft',
30
+ gatewayProviderKey: null,
31
+ })
32
+ expect(
33
+ clearResponse.ok(),
34
+ `Clearing the gateway on a draft template should succeed: ${clearResponse.status()} ${JSON.stringify(await readJsonSafe(clearResponse))}`,
35
+ ).toBeTruthy()
36
+
37
+ const cleared = await readTemplate(request, token, templateId)
38
+ expect(cleared.gatewayProviderKey ?? null).toBeNull()
39
+ expect(cleared.name).toBe('Consulting Fee (no gateway)')
40
+
41
+ const renameResponse = await updateTemplate(request, token, templateId, {
42
+ name: 'Consulting Fee renamed',
43
+ gatewayProviderKey: null,
44
+ })
45
+ expect(
46
+ renameResponse.ok(),
47
+ `Editing a field on a gateway-less draft template should succeed: ${renameResponse.status()} ${JSON.stringify(await readJsonSafe(renameResponse))}`,
48
+ ).toBeTruthy()
49
+
50
+ const renamed = await readTemplate(request, token, templateId)
51
+ expect(renamed.gatewayProviderKey ?? null).toBeNull()
52
+ expect(renamed.name).toBe('Consulting Fee renamed')
53
+
54
+ const blankResponse = await updateTemplate(request, token, templateId, {
55
+ gatewayProviderKey: ' ',
56
+ })
57
+ expect(
58
+ blankResponse.ok(),
59
+ `A blank gateway should normalize to null on a draft template: ${blankResponse.status()} ${JSON.stringify(await readJsonSafe(blankResponse))}`,
60
+ ).toBeTruthy()
61
+
62
+ const blanked = await readTemplate(request, token, templateId)
63
+ expect(blanked.gatewayProviderKey ?? null).toBeNull()
64
+ } finally {
65
+ await deleteCheckoutEntityIfExists(request, token, 'templates', templateId)
66
+ }
67
+ })
68
+
69
+ test('pay-link: clearing the gateway provider on a draft saves and round-trips as null', async ({ request }) => {
70
+ let token: string | null = null
71
+ let linkId: string | null = null
72
+
73
+ try {
74
+ token = await getAuthToken(request)
75
+ const link = await createLinkFixture(request, token, createFixedTemplateInput({ status: 'draft' }))
76
+ linkId = link.id
77
+
78
+ const clearResponse = await updateLink(request, token, link.id, {
79
+ name: 'Pay link (no gateway)',
80
+ pricingMode: 'fixed',
81
+ fixedPriceAmount: 49.99,
82
+ fixedPriceCurrencyCode: 'USD',
83
+ status: 'draft',
84
+ gatewayProviderKey: null,
85
+ })
86
+ expect(
87
+ clearResponse.ok(),
88
+ `Clearing the gateway on a draft pay-link should succeed: ${clearResponse.status()} ${JSON.stringify(await readJsonSafe(clearResponse))}`,
89
+ ).toBeTruthy()
90
+
91
+ const cleared = await readLink(request, token, link.id)
92
+ expect(cleared.gatewayProviderKey ?? null).toBeNull()
93
+ expect(cleared.name).toBe('Pay link (no gateway)')
94
+
95
+ const renameResponse = await updateLink(request, token, link.id, {
96
+ name: 'Pay link renamed',
97
+ gatewayProviderKey: null,
98
+ })
99
+ expect(
100
+ renameResponse.ok(),
101
+ `Editing a field on a gateway-less draft pay-link should succeed: ${renameResponse.status()} ${JSON.stringify(await readJsonSafe(renameResponse))}`,
102
+ ).toBeTruthy()
103
+
104
+ const renamed = await readLink(request, token, link.id)
105
+ expect(renamed.gatewayProviderKey ?? null).toBeNull()
106
+ expect(renamed.name).toBe('Pay link renamed')
107
+ } finally {
108
+ await deleteCheckoutEntityIfExists(request, token, 'links', linkId)
109
+ }
110
+ })
111
+
112
+ test('pay-link: publishing still requires a gateway provider', async ({ request }) => {
113
+ let token: string | null = null
114
+ let linkId: string | null = null
115
+
116
+ try {
117
+ token = await getAuthToken(request)
118
+ const link = await createLinkFixture(request, token, createFixedTemplateInput({ status: 'draft' }))
119
+ linkId = link.id
120
+
121
+ const publishResponse = await updateLink(request, token, link.id, {
122
+ status: 'active',
123
+ gatewayProviderKey: null,
124
+ })
125
+ expect([400, 422]).toContain(publishResponse.status())
126
+ const body = await readJsonSafe<{ error?: string; fieldErrors?: { gatewayProviderKey?: string } }>(publishResponse)
127
+ const fieldError = typeof body?.fieldErrors?.gatewayProviderKey === 'string' ? body.fieldErrors.gatewayProviderKey : ''
128
+ const errorMessage = typeof body?.error === 'string' ? body.error : ''
129
+ expect(`${fieldError} ${errorMessage}`.toLowerCase()).toContain('gateway')
130
+ } finally {
131
+ await deleteCheckoutEntityIfExists(request, token, 'links', linkId)
132
+ }
133
+ })
134
+ })
@@ -262,6 +262,7 @@ function normalizeFormValues(value: FormValues | null | undefined, t?: Translate
262
262
  primaryColor: readString(source.primaryColor).trim() || defaults.primaryColor,
263
263
  secondaryColor: readString(source.secondaryColor).trim() || defaults.secondaryColor,
264
264
  backgroundColor: readString(source.backgroundColor).trim() || defaults.backgroundColor,
265
+ gatewayProviderKey: readString(source.gatewayProviderKey).trim(),
265
266
  gatewaySettings: isRecord(source.gatewaySettings) ? source.gatewaySettings : {},
266
267
  customFieldsetCode: readString(source.customFieldsetCode).trim() || null,
267
268
  collectCustomerDetails: readBoolean(source.collectCustomerDetails, true),
@@ -1,4 +1,11 @@
1
- import { createLinkSchema, createTemplateSchema } from '../validators'
1
+ import {
2
+ createLinkSchema,
3
+ createTemplateSchema,
4
+ updateLinkSchema,
5
+ updateTemplateSchema,
6
+ } from '../validators'
7
+
8
+ const TEMPLATE_ID = '020b29c5-db01-4ee3-8080-1d9b185c5e29'
2
9
 
3
10
  describe('checkout validators', () => {
4
11
  test('createTemplateSchema accepts payloads that omit optional normalized fields', () => {
@@ -44,4 +51,55 @@ describe('checkout validators', () => {
44
51
  expect(result.slug).toBeNull()
45
52
  expect(result.password).toBeNull()
46
53
  })
54
+
55
+ test('updateTemplateSchema accepts a null gatewayProviderKey (issue #2505)', () => {
56
+ const result = updateTemplateSchema.parse({
57
+ id: TEMPLATE_ID,
58
+ name: 'Consulting Fee',
59
+ pricingMode: 'fixed',
60
+ fixedPriceAmount: 49.99,
61
+ fixedPriceCurrencyCode: 'USD',
62
+ gatewayProviderKey: null,
63
+ })
64
+
65
+ expect(result.gatewayProviderKey).toBeNull()
66
+ })
67
+
68
+ test('updateTemplateSchema normalizes a blank gatewayProviderKey to null (issue #2505)', () => {
69
+ const result = updateTemplateSchema.parse({
70
+ id: TEMPLATE_ID,
71
+ name: 'Consulting Fee',
72
+ pricingMode: 'fixed',
73
+ fixedPriceAmount: 49.99,
74
+ fixedPriceCurrencyCode: 'USD',
75
+ gatewayProviderKey: ' ',
76
+ })
77
+
78
+ expect(result.gatewayProviderKey).toBeNull()
79
+ })
80
+
81
+ test('updateLinkSchema accepts a null gatewayProviderKey (issue #2505)', () => {
82
+ const result = updateLinkSchema.parse({
83
+ id: TEMPLATE_ID,
84
+ name: 'Consulting Fee link',
85
+ pricingMode: 'fixed',
86
+ fixedPriceAmount: 49.99,
87
+ fixedPriceCurrencyCode: 'USD',
88
+ gatewayProviderKey: null,
89
+ })
90
+
91
+ expect(result.gatewayProviderKey).toBeNull()
92
+ })
93
+
94
+ test('createTemplateSchema still rejects a null gatewayProviderKey', () => {
95
+ expect(() =>
96
+ createTemplateSchema.parse({
97
+ name: 'QA template',
98
+ pricingMode: 'fixed',
99
+ fixedPriceAmount: 49.99,
100
+ fixedPriceCurrencyCode: 'USD',
101
+ gatewayProviderKey: null,
102
+ }),
103
+ ).toThrow()
104
+ })
47
105
  })
@@ -109,7 +109,7 @@ const checkoutContentSchema = z.object({
109
109
  customAmountMax: positiveMoneySchema.optional().nullable(),
110
110
  customAmountCurrencyCode: currencyCodeSchema.optional().nullable(),
111
111
  priceListItems: z.array(priceListItemSchema).optional().nullable(),
112
- gatewayProviderKey: requiredTrimmedString('checkout.validation.gatewayProviderKey.required'),
112
+ gatewayProviderKey: optionalTrimmedString,
113
113
  gatewaySettings: gatewaySettingsSchema,
114
114
  customFieldsetCode: optionalFieldsetCodeSchema,
115
115
  collectCustomerDetails: z.boolean().default(true),
@@ -174,7 +174,16 @@ function validatePricingConsistency<T extends z.infer<typeof checkoutContentSche
174
174
  }
175
175
  }
176
176
 
177
- export const createTemplateSchema = checkoutContentSchema.superRefine(validatePricingConsistency)
177
+ export const createTemplateSchema = checkoutContentSchema.superRefine((value, ctx) => {
178
+ validatePricingConsistency(value, ctx)
179
+ if (!value.gatewayProviderKey) {
180
+ ctx.addIssue({
181
+ code: z.ZodIssueCode.custom,
182
+ message: 'checkout.validation.gatewayProviderKey.required',
183
+ path: ['gatewayProviderKey'],
184
+ })
185
+ }
186
+ })
178
187
 
179
188
  function applyPartialPricingConsistency(value: Record<string, unknown>, ctx: z.RefinementCtx) {
180
189
  if (!value.pricingMode) return