Public order/pay POSTs hit ladl.link first; satellite CSRF tokens cannot bind
to Link (or platform/satellite) sessions, which returned 419 and showed
"Could not start checkout." Except public checkout paths and return
access_code from owner-gateway Paystack init. Sync contained Paystack sheet.
Paystack blocks iframes, so checkout uses a popup beside the sheet/modal chrome. Opening about:blank on the user tap keeps that window from being blocked after the async initiate response.
Paystack checkout.paystack.com returns X-Frame-Options: SAMEORIGIN, so the shared sheet opened empty. Keep mobile sheet/desktop modal chrome, launch checkout in a named window with a Continue CTA fallback, and escape payment-return via window.opener or top.
Standardize customer-facing Ladill Pay checkout shells across products, open them on all viewports, and escape iframe callbacks back to the product flow.
Storefront QR cards, slug preview, payment callbacks, and document downloads now use LadillLink so displayed and encoded links match ladl.link.
Co-authored-by: Cursor <cursoragent@cursor.com>
Drop required buyer email on public merchant forms; require phone for bookings so merchants can reach guests without Ladill accounts.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Storefronts use Figtree as the default font (shop/menu, booking, book)
- Remove "Powered by Ladill" branding from the storefront header
- Fix storefront logo hiding behind the cover (logo row now relative z-10)
- Add a Share button to storefront QR downloads using the Web Share API
(native mobile share sheet for image+link; clipboard fallback)
- storefronts:import-legacy: --deactivate-source now also retires the
platform copy of already-imported (skipped) codes, no --refresh needed
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The storefront create/edit/manage UI and the public storefront page were
give's church-donation flow relabeled. Replace with genuine merchant
storefronts, reusing the QR-core manager + validator (which already build
sections/services content):
- Merchant create: type picker (shop/menu/booking) + per-type editors in a
shared partial (products/menu items with prices; bookable services with
days/hours). x-if per type so inputs never collide across types.
- StorefrontController store/update/create now delegate to QrCodeManagerService
for all three types (was hardcoded church org_type/denomination/collection).
- Storefront show = QR preview + download + live toggle + delete + full editor.
- QrCodeManagerService: shop/menu/booking are free (no QR-wallet gate); drop
the duplicate church TYPE_SHOP arm in hasContentChanges.
- Public: new storefront catalog+cart view for shop/menu (posts items[] to the
existing order/Pay flow); route shop+menu to it. Booking already had a real
public page; church TYPE_SHOP landing branch retired.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>