docs/briefs/page-lock.md

Module brief: PageLockModule

Slug / tier / group / category: page-lock · advanced · features · Commerce One-liner: Lock an external page or drop (e.g. a Shopify collection) behind portal access. Closest references: TicketingModule (media + meta + CTA), FileDownloadModule (locked state).

Anatomy (top → bottom)

  • ModuleShell, title default "Exclusive drop"
  • Media cover (aspect-ratio options 16:9 / 1:1) with a centred lock badge while locked
  • Body: page title, destination label (e.g. shop.departmnt.xyz), gate label
  • Footer: CtaRow — locked: "Unlock access" (soft); unlocked: "Open page" (solid, uses url)

Content model (props)

prop type sample value
pageTitle string "Summer '26 — early access"
destination string shop.departmnt.xyz
gate string "Tour '26 claimers"
locked boolean true
url string https://… (used when unlocked)
imageUrl string? cover
aspectRatio '16:9' | '1:1' 16:9
onUnlock / onOpen () => void host-driven

Client-editable fields

key label type (options)
title Module title text
pageTitle Page title text
destination Destination text
locked Locked toggle
aspectRatio Aspect ratio aspect-ratio (16:9, 1:1)
header Show header toggle

States & interactions

Locked ↔ unlocked swaps badge, meta, and CTA. Access mechanics are a backend contract — redirect/token per NEXT-PHASE §4; the module renders state and fires callbacks only.

Out of scope

Token/redirect implementation, countdowns, per-user entitlements.