@odla-ai/chapter 0.50.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1665,6 +1665,13 @@ These bite silently — a smoke test won't catch them:
1665
1665
  it never sends mail. Confirmed non-delivery permits only the original workflow
1666
1666
  to retry its frozen payload. Non-production recipient redirection still applies.
1667
1667
 
1668
+ An offering may omit `seatPurchaseWindowCalendarMonths`: then a seat may be
1669
+ bought for as long as the primary membership is paid and active, renewals
1670
+ included, and the offer reports `purchaseWindowed: false`. Memberships frozen
1671
+ under an earlier windowed offering keep their window until the network owner
1672
+ lifts it once per chapter with `POST /api/admin/membership-seats/lift-purchase-window`
1673
+ (super admin; only ever widens).
1674
+
1668
1675
  The public join config asks the authority, per paid tier, what a founding
1669
1676
  applicant pays today (`offer-preview`, read-only: nothing is reserved) and
1670
1677
  exposes it as `tiers[].founding` ({ cohortLabel, dueTodayCents, discountCents,
@@ -748,11 +748,7 @@ function NamedSeatPurchase({ api }) {
748
748
  }
749
749
  ) : null
750
750
  ] })
751
- ] }) : !data.seat ? /* @__PURE__ */ jsxs9("p", { children: [
752
- "Additional seats can be purchased until ",
753
- new Date(data.purchaseEndsAt).toLocaleDateString("en-US", { timeZone: "UTC" }),
754
- "."
755
- ] }) : null,
751
+ ] }) : !data.seat ? /* @__PURE__ */ jsx9("p", { children: data.purchaseWindowed === false ? "An additional seat can be purchased for as long as your membership stays paid." : `Additional seats can be purchased until ${new Date(data.purchaseEndsAt).toLocaleDateString("en-US", { timeZone: "UTC" })}.` }) : null,
756
752
  pending ? /* @__PURE__ */ jsx9("p", { role: "status", children: "Payment confirmation is being reconciled. The recipient\u2019s access begins only after their own acceptance and approval." }) : null
757
753
  ] }) : !error ? /* @__PURE__ */ jsx9("p", { children: "Loading your seat terms\u2026" }) : null,
758
754
  /* @__PURE__ */ jsx9("button", { className: "btn secondary", onClick: () => void load(), children: "Refresh seat status" })
@@ -2039,4 +2035,4 @@ export {
2039
2035
  membershipApplicationHref,
2040
2036
  MembershipCards
2041
2037
  };
2042
- //# sourceMappingURL=chunk-OS46ZE46.js.map
2038
+ //# sourceMappingURL=chunk-UAXWA5BL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/slot-picker.tsx","../src/ui/datetime.ts","../src/ui/member-restart.tsx","../src/ui/membership-payment-step.tsx","../src/ui/payment-step.tsx","../src/ui/journey-frame.tsx","../src/ui/members.tsx","../src/ui/reschedule.tsx","../src/ui/member-gifts.tsx","../src/ui/gift-offer-cards.tsx","../src/ui/member-named-seat.tsx","../src/ui/member-content.tsx","../src/ui/join.tsx","../src/ui/join-booking.tsx","../src/ui/join-accepted.tsx","../src/ui/gift-claim-card.tsx","../src/ui/join-tiers.tsx","../src/ui/join-application-form.tsx","../src/ui/join-application-response.ts","../src/ui/gift-code-redeemer.tsx","../src/ui/join-resume.ts","../src/ui/join-gift-claim.tsx","../src/ui/join-named-seat.tsx","../src/ui/join-invitation.tsx","../src/ui/join-pending.ts","../src/ui/membership-cards.tsx","../src/membership-page.ts"],"sourcesContent":["// SlotPicker — a pure presentational day-chips + time-grid picker, shared by the\n// join booking step and the member-area reschedule. Ported from the proven\n// reference Preact island; behaviour and DOM shape are unchanged.\n//\n// It holds only the active-day UI state; slot data, selection, and booking are\n// the caller's (the picker is `onPick`-driven). `classes` lets the composing\n// island supply its own CSS contract (join styles `slot-*`, reschedule\n// `msched-*`); the defaults work standalone against those class names.\nimport { useMemo, useState } from \"preact/hooks\";\nimport { dayLabel, groupSlotsByDay, timeLabel } from \"./datetime.js\";\nimport type { Slot } from \"./datetime.js\";\n\n/** CSS class names for the four picker parts — overridable so one component\n * serves several differently-styled surfaces. */\nexport interface SlotPickerClasses {\n days: string;\n day: string;\n times: string;\n time: string;\n}\n\nconst DEFAULT_CLASSES: SlotPickerClasses = {\n days: \"slot-days\",\n day: \"slot-day\",\n times: \"slot-grid\",\n time: \"slot-time\",\n};\n\n/** Props for {@link SlotPicker}. Generic over the slot type so a caller's richer\n * slot object survives through `onPick`. */\nexport interface SlotPickerProps<T extends Slot = Slot> {\n /** Bookable slots, ideally already chronological. */\n slots: readonly T[];\n /** The group's scheduling timezone; all labels render in it. */\n timezone: string;\n /** The currently-selected slot's start, for the pressed state. */\n selectedStartAt?: number;\n /** Called with the full slot object when a time is chosen. */\n onPick: (slot: T) => void;\n /** Called when the active day changes (callers clear their selection). */\n onDayChange?: () => void;\n classes?: SlotPickerClasses;\n}\n\n/** A day-chips + time-grid slot picker. Presentational and `onPick`-driven: it\n * owns only the active-day selection; the caller owns slot data, the chosen\n * slot, and booking. Shared by the join booking step and the member reschedule. */\nexport function SlotPicker<T extends Slot = Slot>(props: SlotPickerProps<T>) {\n const { slots, timezone, selectedStartAt, onPick, onDayChange, classes = DEFAULT_CLASSES } = props;\n const byDay = useMemo(() => groupSlotsByDay(slots, timezone), [slots, timezone]);\n const dayKeys = [...byDay.keys()];\n const [activeDay, setActiveDay] = useState<string | undefined>(dayKeys[0]);\n\n // Keep the active day valid if the slot set changed under us (e.g. a reload\n // after a 409): fall back to the first available day.\n const day = activeDay !== undefined && byDay.has(activeDay) ? activeDay : dayKeys[0];\n const times = (day !== undefined ? byDay.get(day) : undefined) ?? [];\n\n return (\n <>\n <div className={classes.days}>\n {dayKeys.map((key) => {\n const first = byDay.get(key)?.[0];\n return (\n <button\n key={key}\n type=\"button\"\n className={classes.day}\n aria-pressed={key === day}\n onClick={() => {\n setActiveDay(key);\n onDayChange?.();\n }}\n >\n {first ? dayLabel(first.startAt, timezone) : key}\n </button>\n );\n })}\n </div>\n <div className={classes.times}>\n {times.map((s) => (\n <button\n key={s.startAt}\n type=\"button\"\n className={classes.time}\n aria-pressed={selectedStartAt === s.startAt}\n onClick={() => onPick(s)}\n >\n {timeLabel(s.startAt, timezone)}\n </button>\n ))}\n </div>\n </>\n );\n}\n","// Date/timezone formatting for the chapter member islands (join booking, member\n// area). Ported from proven production helpers. Every time renders in the\n// group's SCHEDULING timezone with an explicit abbreviation — never the viewer's\n// unlabeled local zone — so an applicant always sees the time the chapter meant.\n// Pure and framework-free, so it is unit-testable without a DOM.\n\n/** A bookable slot: a start instant in epoch milliseconds. */\nexport interface Slot {\n startAt: number;\n}\n\n/** The timezone's short abbreviation (e.g. \"PST\"); falls back to the id if the\n * runtime can't resolve it. */\nexport function tzShort(tz: string): string {\n try {\n const parts = new Intl.DateTimeFormat(undefined, { timeZone: tz, timeZoneName: \"short\" }).formatToParts(\n new Date(),\n );\n return parts.find((p) => p.type === \"timeZoneName\")?.value ?? tz;\n } catch {\n return tz;\n }\n}\n\n/** DST-safe day bucket key (ISO date in the target zone). Groups slots by the\n * calendar day a viewer in `tz` would see, not by UTC midnight. */\nexport function dayKey(ms: number, tz: string): string {\n return new Date(ms).toLocaleDateString(\"en-CA\", { timeZone: tz });\n}\n\n/** Short day label for a day chip, e.g. \"Mon, Jun 3\". */\nexport function dayLabel(ms: number, tz: string): string {\n return new Date(ms).toLocaleDateString(undefined, { timeZone: tz, weekday: \"short\", month: \"short\", day: \"numeric\" });\n}\n\n/** Time-of-day label for a slot button, e.g. \"2:30 PM PST\". */\nexport function timeLabel(ms: number, tz: string): string {\n return new Date(ms).toLocaleTimeString(undefined, {\n timeZone: tz,\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZoneName: \"short\",\n });\n}\n\n/** Full, human confirmation label, e.g. \"Monday, June 3, 2:30 PM PST\". */\nexport function fullLabel(ms: number, tz: string): string {\n return new Date(ms).toLocaleString(undefined, {\n timeZone: tz,\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZoneName: \"short\",\n });\n}\n\n/** Currency label from integer cents, e.g. 100000 → \"$1,000\". */\nexport function fmtMoney(cents: number): string {\n return \"$\" + Math.round(cents / 100).toLocaleString();\n}\n\n/** Short date label, e.g. \"Jun 3, 2026\" (used for renewal/refund copy). */\nexport function fmtDate(ms: number): string {\n return new Date(ms).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n}\n\n/** Bucket slots into an insertion-ordered `Map<dayKey, Slot[]>` for the picker.\n * Input order is preserved within each day, so a server that returns slots\n * chronologically yields chronological chips + times. */\nexport function groupSlotsByDay<T extends Slot>(slots: readonly T[], tz: string): Map<string, T[]> {\n const byDay = new Map<string, T[]>();\n for (const s of slots) {\n const k = dayKey(s.startAt, tz);\n const bucket = byDay.get(k);\n if (bucket) bucket.push(s);\n else byDay.set(k, [s]);\n }\n return byDay;\n}\n","import { useEffect, useState } from \"preact/hooks\";\nimport type { ApiFn } from \"./api\";\nimport type { MemberApplication } from \"../session\";\nimport { MembershipPaymentStep } from \"./membership-payment-step\";\nimport { JourneyFrame } from \"./journey-frame\";\n\n/** Returning members retain their account and approval and go directly to a fresh payment quote. */\nexport function MemberRestart(props: { api: ApiFn; application: MemberApplication; applicationId: string | null;\n onComplete: () => Promise<void> }) {\n const [id, setId] = useState(props.applicationId);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(\"\");\n const [paid, setPaid] = useState(false);\n const [checking, setChecking] = useState(false);\n const [revision, setRevision] = useState(0);\n useEffect(() => {\n if (!paid) return;\n let live = true, timer: ReturnType<typeof setTimeout> | undefined, attempt = 0;\n setChecking(true);\n const check = async () => {\n try {\n const me = await props.api<{ memberAccess?: boolean }>(\"/api/me\");\n if (!live) return;\n if (me.memberAccess === true) { await props.onComplete(); return; }\n } catch { /* A delayed webhook or unavailable authority is not proof of failed payment. */ }\n if (!live) return;\n if (++attempt < 12) timer = setTimeout(() => void check(), 2500);\n else setChecking(false);\n };\n void check();\n return () => { live = false; clearTimeout(timer); };\n }, [paid, revision]);\n const start = async () => {\n setBusy(true); setError(\"\");\n try {\n const result = await props.api<{ applicationId: string }>(\"/api/membership/restart\", { method: \"POST\" });\n if (!result.applicationId) throw new Error(\"We could not prepare your subscription. Please retry.\");\n setId(result.applicationId);\n } catch (cause) { setError(cause instanceof Error ? cause.message.slice(0, 300) : \"We could not prepare your subscription. Please retry.\"); }\n finally { setBusy(false); }\n };\n return <JourneyFrame><section className=\"card\" aria-label=\"Restart membership\">\n <p className=\"card-label\">Welcome back</p>\n <h2>Restart your membership</h2>\n <p>Your account is ready, and your previous approval still counts. No new application or interview is needed.</p>\n <dl className=\"journey-summary\"><dt>Name</dt><dd>{[props.application.firstName, props.application.lastName].filter(Boolean).join(\" \")}</dd>\n <dt>Email</dt><dd>{props.application.email}</dd></dl>\n {paid ? <div role=\"status\"><h3>Confirming your membership</h3>\n <p>We’re waiting for payment confirmation. Your membership will open here as soon as it arrives.</p>\n {!checking ? <button type=\"button\" onClick={() => setRevision(value => value + 1)}>Check membership</button> : null}\n </div> : id ? <MembershipPaymentStep applicationId={id} refundPolicyText=\"\" onPaid={() => setPaid(true)} /> :\n <button type=\"button\" disabled={busy} onClick={() => void start()}>{busy ? \"Preparing your membership…\" : \"Review membership and payment\"}</button>}\n {error ? <p role=\"alert\">{error}</p> : null}\n </section></JourneyFrame>;\n}\n","import { useEffect, useState } from \"preact/hooks\";\nimport type { PaymentQuote } from \"../payment-quote\";\nimport { PaymentStep, type PaymentStepProps, type SubResponse } from \"./payment-step\";\nimport { useChapterCopy } from \"./copy-context\";\n\n/** Quote-first membership checkout; no money object exists until the displayed quote is accepted. */\nexport function MembershipPaymentStep(props: PaymentStepProps) {\n const inherited = useChapterCopy();\n const copy = props.copy ?? inherited.join.payment;\n const [quote, setQuote] = useState<PaymentQuote | null>(null);\n const [error, setError] = useState(false);\n const [revision, setRevision] = useState(0);\n useEffect(() => {\n let live = true;\n setQuote(null); setError(false);\n void fetch(`/api/payments/quote?application=${encodeURIComponent(props.applicationId)}`, { method: \"POST\", cache: \"no-store\" })\n .then(async (response) => {\n if (!response.ok) throw new Error(\"quote unavailable\");\n const value = await response.json() as PaymentQuote;\n if (value.applicationId !== props.applicationId || !/^[a-f0-9]{64}$/.test(value.digest) ||\n !/^[a-z]{3}$/.test(value.currency) || !Number.isSafeInteger(value.lineItems?.dueTodayCents) ||\n value.lineItems.dueTodayCents <= 0 || typeof value.refundPolicyText !== \"string\") throw new Error(\"invalid quote\");\n if (live) setQuote(value);\n }).catch(() => { if (live) setError(true); });\n return () => { live = false; };\n }, [props.applicationId, revision]);\n const refresh = () => { setQuote(null); setRevision((value) => value + 1); };\n if (!quote || quote.applicationId !== props.applicationId) return <div className=\"join-pay\" role=\"status\">\n {props.merchantDisclosureText ? <p className=\"compliance-merchant\">{props.merchantDisclosureText}</p> : null}\n <p>{error ? copy.setupFailed : copy.preparing}</p>\n {error ? <button type=\"button\" onClick={refresh}>Reload payment terms</button> : null}\n </div>;\n const startCheckout = async (): Promise<SubResponse> => {\n const response = await fetch(\"/api/payments/subscription\", { method: \"POST\", headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ applicationId: props.applicationId, refundPolicyAck: true, quoteDigest: quote.digest }) });\n if (!response.ok) {\n if (response.status === 409) refresh();\n throw new Error(copy.setupFailed);\n }\n return response.json();\n };\n const amount = (cents: number) => new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: quote.currency }).format(cents / 100);\n return <>\n <section className=\"payment-quote\" aria-label=\"Membership price\">\n <h3>{quote.tierName}</h3>\n {quote.founding ? <p className=\"payment-founding\" role=\"note\" aria-label=\"Founding member\">{copy.foundingMember}</p> : null}\n {props.renderPriceLines ? props.renderPriceLines(quote.lineItems) : <dl>\n <dt>Membership price</dt><dd>{amount(quote.lineItems.standardCents)} per {quote.interval}</dd>\n {quote.lineItems.discountCents > 0 ? <><dt>{quote.founding || quote.presentation ? copy.foundingDiscount : \"Discount\"}</dt><dd>{amount(quote.lineItems.discountCents)}</dd></> : null}\n <dt>Due today</dt><dd>{amount(quote.lineItems.dueTodayCents)}</dd>\n </dl>}\n {quote.commercial ? <div role=\"note\" aria-label=\"Renewal terms\">\n {quote.commercial.initialTermEndsAt !== undefined ? <p>First renewal: {new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"long\", timeZone: \"UTC\",\n }).format(quote.commercial.initialTermEndsAt)}.</p> : null}\n <p>Renews automatically at {amount(quote.commercial.renewalCents)} per {quote.interval} unless canceled before renewal.</p>\n {quote.commercial.discountDuration === \"first_term\" ? <p>The discount applies to your first paid term only.</p> : null}\n {quote.commercial.discountDuration === \"while_active\" ? <p>The discounted rate continues while this membership stays active.</p> : null}\n </div> : null}\n {quote.trustCopy ? <p className=\"pay-trust\">{quote.trustCopy}</p> : null}\n </section>\n <PaymentStep {...props} refundPolicyText={quote.refundPolicyText} merchantDisclosureText={quote.merchantDisclosureText}\n renderPriceLines={undefined} startCheckout={startCheckout} />\n </>;\n}\n","// The join flow's payment step. Ports the reference card entry into the island:\n// dynamically loads js.stripe.com (NO @stripe/react-stripe-js dep), creates a\n// subscription server-side, and mounts a Stripe Payment Element. The refund-policy\n// checkbox is the gate — checking it starts the (money-creating) subscription\n// call. Client success is advisory only; the webhook is the\n// authoritative writer of paid state (see payments.ts).\nimport type { ComponentChildren } from \"preact\";\nimport { useRef, useState } from \"preact/hooks\";\nimport type { ChapterCopy } from \"../copy.js\";\nimport { useChapterCopy } from \"./copy-context.js\";\n\n// Minimal shapes for the dynamically-loaded js.stripe.com global.\ninterface StripeElementsApi {\n create(type: string): { mount(target: HTMLElement): void };\n}\ninterface StripeApi {\n elements(opts: {\n clientSecret: string;\n appearance?: Record<string, unknown>;\n fonts?: readonly Record<string, unknown>[];\n }): StripeElementsApi;\n confirmPayment(opts: {\n elements: StripeElementsApi;\n confirmParams?: { return_url?: string };\n redirect?: \"if_required\";\n }): Promise<{ error?: { message?: string }; paymentIntent?: { status?: string } }>;\n}\ntype StripeFactory = (publishableKey: string) => StripeApi;\n\nlet loader: Promise<StripeFactory> | null = null;\n\n/** Load js.stripe.com once and resolve the `Stripe` global (browser only). */\nfunction loadStripe(): Promise<StripeFactory> {\n const existing = (globalThis as { Stripe?: StripeFactory }).Stripe;\n if (existing) return Promise.resolve(existing);\n if (!loader) {\n loader = new Promise<StripeFactory>((resolve, reject) => {\n const s = document.createElement(\"script\");\n s.src = \"https://js.stripe.com/v3/\";\n s.onload = () => {\n const fn = (globalThis as { Stripe?: StripeFactory }).Stripe;\n if (fn) resolve(fn);\n else reject(new Error(\"stripe.js unavailable\"));\n };\n s.onerror = () => reject(new Error(\"stripe.js failed to load\"));\n document.head.appendChild(s);\n });\n }\n return loader;\n}\n\n/** Props for {@link PaymentStep}. */\nexport interface PaymentStepProps {\n /** The application to attach the subscription to (the capability). */\n applicationId: string;\n /** Refund-policy copy the applicant must acknowledge to start payment. */\n refundPolicyText: string;\n /** Plain-language merchant identity shown before the applicant consents. */\n merchantDisclosureText?: string;\n /** Called once the payment succeeds (or is processing) — advance to booking. */\n onPaid: (result: { gift: boolean; giftCode?: string }) => void;\n /** Override checkout creation for authenticated member gift purchases. */\n startCheckout?: () => Promise<SubResponse>;\n /** Stripe Elements appearance passed through without Chapter reinterpretation. */\n appearance?: Record<string, unknown>;\n /** Stripe Elements custom-font descriptors. */\n fonts?: readonly Record<string, unknown>[];\n /** Resolved payment-step copy. */\n copy?: ChapterCopy[\"join\"][\"payment\"];\n /** Render the server-returned membership price breakdown. */\n renderPriceLines?: (lines: PaymentPriceLines) => ComponentChildren;\n /** Site-owned trust, security, or explanatory content. */\n children?: ComponentChildren;\n /**\n * Side-effect-free payment data for a Studio or test journey. When present,\n * this component never calls the subscription route or loads Stripe.js; it\n * presents an inert card form and advances only the local flow.\n */\n simulation?: PaymentStepSimulation;\n}\n\n/** Server-authoritative membership amounts supplied to the payment price slot. */\nexport interface PaymentPriceLines {\n standardCents: number;\n discountCents: number;\n dueTodayCents: number;\n}\n\n/** Deterministic, non-charging inputs for a simulated payment step. */\nexport interface PaymentStepSimulation {\n lineItems: PaymentPriceLines;\n}\n\n/** Checkout setup response shared by membership and gift Payment Element flows. */\nexport interface SubResponse {\n clientSecret?: string;\n publishableKey?: string | null;\n lineItems?: PaymentPriceLines;\n gift?: boolean;\n giftCode?: string;\n}\n\n/** The card-entry step: acknowledge the refund policy → create the subscription\n * → mount Stripe Elements → confirm. */\nexport function PaymentStep(props: PaymentStepProps) {\n const inheritedCopy = useChapterCopy();\n const {\n applicationId,\n refundPolicyText,\n merchantDisclosureText,\n onPaid,\n appearance,\n fonts,\n renderPriceLines,\n children,\n simulation,\n } = props;\n const copy = props.copy ?? inheritedCopy.join.payment;\n const [status, setStatus] = useState<\"idle\" | \"loading\" | \"ready\" | \"confirming\">(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [lineItems, setLineItems] = useState<PaymentPriceLines | null>(null);\n const mountRef = useRef<HTMLDivElement | null>(null);\n const stripeRef = useRef<StripeApi | null>(null);\n const elementsRef = useRef<StripeElementsApi | null>(null);\n const completionRef = useRef<{ gift: boolean; giftCode?: string }>({ gift: false });\n\n const begin = async () => {\n setStatus(\"loading\");\n setError(null);\n try {\n if (simulation) {\n setLineItems(simulation.lineItems);\n setStatus(\"ready\");\n return;\n }\n const data = props.startCheckout ? await props.startCheckout() : await (async () => {\n const res = await fetch(\"/api/payments/subscription\", {\n method: \"POST\", headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ applicationId, refundPolicyAck: true }),\n });\n const body = (await res.json()) as SubResponse;\n if (!res.ok) throw new Error(copy.setupFailed);\n return body;\n })();\n if (!data.clientSecret || !data.publishableKey) throw new Error(copy.setupFailed);\n const stripe = (await loadStripe())(data.publishableKey);\n const elements = stripe.elements({\n clientSecret: data.clientSecret,\n ...(appearance ? { appearance } : {}),\n ...(fonts ? { fonts } : {}),\n });\n const element = elements.create(\"payment\");\n if (mountRef.current) element.mount(mountRef.current);\n stripeRef.current = stripe;\n elementsRef.current = elements;\n setLineItems(data.lineItems ?? null);\n completionRef.current = { gift: data.gift === true, ...(data.giftCode ? { giftCode: data.giftCode } : {}) };\n setStatus(\"ready\");\n } catch (e) {\n setStatus(\"idle\");\n setError(e instanceof Error ? e.message : copy.setupFailed);\n }\n };\n\n const pay = async () => {\n if (simulation) {\n setStatus(\"confirming\");\n onPaid({ gift: false });\n return;\n }\n const stripe = stripeRef.current;\n const elements = elementsRef.current;\n if (!stripe || !elements) return;\n setStatus(\"confirming\");\n setError(null);\n let returnUrl: string | undefined;\n if (typeof window !== \"undefined\") {\n const next = new URL(window.location.href);\n next.searchParams.set(\"application\", applicationId);\n next.searchParams.set(\"redirect_status\", \"succeeded\");\n returnUrl = next.toString();\n }\n const result = await stripe.confirmPayment({ elements, confirmParams: { return_url: returnUrl }, redirect: \"if_required\" });\n if (result.error) {\n setError(result.error.message ?? copy.incomplete);\n setStatus(\"ready\");\n return;\n }\n const paid = result.paymentIntent?.status;\n if (paid === \"succeeded\" || paid === \"processing\") onPaid(completionRef.current);\n else {\n setError(copy.incomplete);\n setStatus(\"ready\");\n }\n };\n\n return (\n <div className=\"join-pay\">\n {/*\n The policy is a block of its own and the checkbox carries the\n affirmative sentence, so what the member agrees to is a statement of\n agreement rather than the policy text itself. A site that wants the\n checkbox labelled only by the policy sets `copy.join.payment.consent`\n to an empty string.\n */}\n <div className=\"compliance-box\">\n {merchantDisclosureText ? <p className=\"compliance-merchant\">{merchantDisclosureText}</p> : null}\n <p className=\"compliance-policy\">{refundPolicyText}</p>\n <label className=\"compliance-check\">\n <input\n type=\"checkbox\"\n disabled={status !== \"idle\"}\n onChange={(e) => {\n if (e.currentTarget.checked) void begin();\n }}\n />\n {copy.consent ? <span>{copy.consent}</span> : null}\n </label>\n </div>\n {status === \"loading\" ? <p className=\"pay-status\">{copy.preparing}</p> : null}\n {lineItems && renderPriceLines ? renderPriceLines(lineItems) : null}\n {children}\n {simulation && (status === \"ready\" || status === \"confirming\") ? (\n <fieldset className=\"join-pay-simulation\">\n <legend>Payment details</legend>\n <label>\n Card number\n <input name=\"simulationCardNumber\" inputMode=\"numeric\" autoComplete=\"off\" defaultValue=\"4242 4242 4242 4242\" />\n </label>\n <label>\n Expiration\n <input name=\"simulationCardExpiry\" inputMode=\"numeric\" autoComplete=\"off\" defaultValue=\"12 / 34\" />\n </label>\n <label>\n Security code\n <input name=\"simulationCardCvc\" inputMode=\"numeric\" autoComplete=\"off\" defaultValue=\"123\" />\n </label>\n <p>This is a simulation. No card data is sent and no charge is created.</p>\n </fieldset>\n ) : null}\n <div ref={mountRef} hidden={status === \"idle\" || status === \"loading\"} />\n {status === \"ready\" || status === \"confirming\" ? (\n <button className=\"submit-btn\" disabled={status === \"confirming\"} onClick={() => void pay()}>\n {status === \"confirming\" ? copy.processing : copy.payAndContinue}\n </button>\n ) : null}\n {error ? <p className=\"pay-error\">{error}</p> : null}\n </div>\n );\n}\n","import type { ComponentChildren } from \"preact\";\n\n// Scope the foundation to Chapter journeys; host branding continues through --ui-*.\nconst styles = `\n.chapter-journey{color:var(--ui-text,#202827);font-family:var(--ui-font-sans,inherit);line-height:1.65;max-width:46rem;margin-inline:auto;min-width:0}\n.chapter-journey *{box-sizing:border-box}\n.chapter-journey :where(h2,h3,p){margin:0 0 1rem}\n.chapter-journey :where(h2,h3){font-family:var(--ui-font-display,inherit);line-height:1.2;letter-spacing:-.025em;text-transform:none}\n.chapter-journey h2{font-size:clamp(1.6rem,3vw,2.15rem)}\n.chapter-journey h3{font-size:1.3rem}\n.chapter-journey :where(.card,.join-form,.payment-quote,.join-book){padding:clamp(1.25rem,4vw,2.4rem);border:1px solid var(--ui-border,#dfe3df);border-radius:var(--ui-radius-lg,16px);background:var(--ui-surface,#fff);margin-block:1.2rem}\n.chapter-journey :where(.card-label,.journey-eyebrow){font-size:.75rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ui-text-muted,#536360);margin-bottom:.7rem;font-weight:600}\n.chapter-journey :where(form,.journey-fields){display:grid;gap:1.25rem}\n.chapter-journey :where(label){display:block;font-size:.95rem;font-weight:500;letter-spacing:normal;text-transform:none;line-height:1.55}\n.chapter-journey :where(input:not([type=checkbox]):not([type=radio]),select,textarea){display:block;width:100%;margin-top:.45rem;padding:.8rem 1rem;border:1px solid var(--ui-border-strong,#aeb9b5);border-radius:8px;background:var(--ui-bg,#fff);color:inherit;font:inherit;min-height:48px}\n.chapter-journey :where(input,textarea,button,a,select):focus-visible{outline:3px solid var(--ui-accent,#3d6a60);outline-offset:3px}\n.chapter-journey :where(input[type=checkbox],input[type=radio]){width:1.15rem;height:1.15rem;margin:.2rem 0 0;flex:none;accent-color:var(--ui-accent,#285c50)}\n.chapter-journey :where(.journey-consent,.compliance-check,.check){display:flex;align-items:flex-start;gap:.8rem;text-align:left;letter-spacing:normal;text-transform:none;font-size:.95rem;font-weight:400}\n.chapter-journey :where(button,.submit-btn,.apply-link){display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:.75rem 1.2rem;border:1px solid transparent;border-radius:8px;font:inherit;font-size:.95rem;font-weight:600;letter-spacing:normal;line-height:1.35;text-decoration:none;text-transform:none;cursor:pointer;background:var(--ui-accent,#285c50);color:var(--ui-on-accent,#fff)}\n.chapter-journey :where(button.secondary,.journey-secondary){background:transparent;color:var(--ui-text,#202827);border-color:var(--ui-border,#dfe3df)}\n.chapter-journey :is(.slot-time,.slot-day){background:var(--ui-surface,#fff);color:var(--ui-text,#202827);border-color:var(--ui-border,#dfe3df)}\n.chapter-journey :is(.slot-time,.slot-day):hover{background:var(--ui-surface-2,#f3f5f2);color:var(--ui-text,#202827);border-color:var(--ui-accent,#285c50)}\n.chapter-journey :is(.slot-time,.slot-day)[aria-pressed=true]{background:var(--ui-accent,#285c50);color:var(--ui-on-accent,#fff)}\n.chapter-journey button:disabled{opacity:.55;cursor:default}\n.chapter-journey :where(.compliance-box,.journey-note){padding:1.2rem;background:var(--ui-surface-2,#f3f5f2);border-radius:10px;margin-block:1.2rem}\n.chapter-journey :where(.compliance-box p:last-child,.journey-note p:last-child,.card p:last-child){margin-bottom:0}\n.chapter-journey .journey-invitation{padding:1.1rem 1.3rem;border-left:3px solid var(--ui-accent,#285c50);background:var(--ui-surface-2,#f3f5f2);border-radius:0 10px 10px 0;margin-block:1rem}\n.chapter-journey .journey-invitation p{margin:0}\n.chapter-journey :where(.journey-error,.join-error,.pay-error,[role=alert]){padding:.9rem 1rem;border:1px solid var(--ui-danger,#9c3636);border-radius:8px;color:var(--ui-danger,#9c3636);font-size:.95rem}\n.chapter-journey :where(.payment-quote dl,.journey-summary){display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.65rem 1rem;margin:1.3rem 0;padding:1rem 0;border-block:1px solid var(--ui-border,#dfe3df)}\n.chapter-journey :where(dd){margin:0;text-align:right;font-variant-numeric:tabular-nums}\n.chapter-journey :where(.pay-status,.meeting-note,.slots-status){color:var(--ui-text-muted,#536360)}\n.chapter-journey .journey-actions{display:flex;gap:.75rem;flex-wrap:wrap;margin-top:1.25rem}\n.chapter-journey fieldset{min-width:0;border:0;padding:0;margin:0}\n@media(max-width:520px){.chapter-journey .journey-actions>*{width:100%}.chapter-journey .journey-summary{grid-template-columns:1fr}.chapter-journey .journey-summary dd{text-align:left}.chapter-journey :where(.card,.join-form,.payment-quote,.join-book){padding:1.25rem}}\n`;\n\n/** Consistent, responsive purchase and application presentation using the host's Chapter brand tokens. */\nexport function JourneyFrame({ children }: { children: ComponentChildren }) {\n return <div className=\"chapter-journey\"><style>{styles}</style>{children}</div>;\n}\n","import { MemberRestart } from \"./member-restart\";\n// The member area island. Reads GET /api/me (role + the member's own\n// application, folded server-side) and renders the account header plus, for a\n// provisional member, their application card with book/reschedule; a full member\n// sees the caller-supplied `memberContent`. Ported from the reference members island to\n// Preact, driven by the injected `api` (no Clerk SDK dependency).\nimport type { ComponentChildren } from \"preact\";\nimport { useEffect, useState } from \"preact/hooks\";\nimport { Rescheduler } from \"./reschedule.js\";\nimport { fmtDate, fullLabel } from \"./datetime.js\";\nimport type { ApiFn } from \"./api.js\";\nimport type { MemberApplication } from \"../session.js\";\nimport { formatChapterCopy, type ChapterCopy } from \"../copy.js\";\nimport { useChapterCopy } from \"./copy-context.js\";\nimport { GiftPurchases } from \"./member-gifts.js\";\nimport { NamedSeatPurchase } from \"./member-named-seat.js\";\nimport { MemberContentArea, type MemberContentAreaProps } from \"./member-content.js\";\n\ninterface Me {\n email: string | null;\n role: string;\n authorized?: boolean;\n superAdmin?: boolean;\n memberAccess?: boolean | null;\n application: MemberApplication | null;\n namedSeatsEnabled?: boolean;\n membershipRestart?: { eligible: boolean; applicationId: string | null } | null;\n}\n\n/** Props for {@link MembersArea}. */\nexport interface MembersAreaProps {\n api: ApiFn;\n /** Sign the member out (the host owns Clerk's signOut). */\n signOut: () => void;\n /** Where the \"Admin console\" link points for admins. Default \"/admin/\". */\n adminHref?: string;\n /** Where an accountless member goes to apply. Default \"/join.html\". */\n applyHref?: string;\n /** What a full (non-provisional) member sees below the account header. */\n memberContent?: ComponentChildren;\n /** Opt into the standard server-filtered member-page navigator. */\n memberPages?: true | Omit<MemberContentAreaProps, \"api\">;\n /** Resolved member-area copy. */\n copy?: ChapterCopy[\"members\"];\n /** Replace the provisional application card without replacing auth/data load. */\n renderProvisional?: (context: MemberProvisionalRenderContext) => ComponentChildren;\n}\n\n/** Data and actions supplied to a site's provisional-member render slot. */\nexport interface MemberProvisionalRenderContext {\n api: ApiFn;\n application: MemberApplication | null;\n applyHref: string;\n reload: () => Promise<void>;\n defaultContent: ComponentChildren;\n}\n\nfunction card(copy: ChapterCopy[\"members\"], kicker: string, body: ComponentChildren): ComponentChildren {\n return (\n <div className=\"card\">\n <div className=\"card-label\">{copy.provisional.cardLabel}</div>\n <div className=\"meeting-block\">\n <div className=\"meeting-kicker\">{kicker}</div>\n {body}\n </div>\n </div>\n );\n}\n\nfunction ProvisionalCard(props: {\n api: ApiFn;\n application: MemberApplication | null;\n applyHref: string;\n copy: ChapterCopy[\"members\"];\n onReschedule: () => void | Promise<void>;\n}): ComponentChildren {\n const { api, application, applyHref, copy, onReschedule } = props;\n if (!application) {\n return card(\n copy,\n copy.provisional.applicationNeeded,\n <>\n <div className=\"meeting-note\">{copy.provisional.applicationNeededBody}</div>\n <a className=\"apply-link\" href={applyHref}>\n {copy.provisional.apply}\n </a>\n </>,\n );\n }\n if (application.status === \"refunded\") {\n return card(\n copy,\n copy.provisional.refunded,\n <div className=\"meeting-note\">{copy.provisional.refundedBody}</div>,\n );\n }\n const membership = application.paid ? (\n <div className=\"meeting-note\">\n {application.renewalAt\n ? formatChapterCopy(copy.provisional.renews, { date: fmtDate(application.renewalAt) })\n : copy.provisional.active}\n </div>\n ) : null;\n if (application.meetingAt) {\n return card(\n copy,\n copy.provisional.introductionCall,\n <>\n <div className=\"meeting-date\">{fullLabel(application.meetingAt, application.timezone)}</div>\n <div className=\"meeting-note\">{copy.provisional.calendarInvite}</div>\n {application.meetUrl ? (\n <div className=\"meeting-note\">\n <a href={application.meetUrl} target=\"_blank\" rel=\"noopener\">\n {copy.provisional.joinCall}\n </a>\n </div>\n ) : null}\n <Rescheduler\n api={api}\n applicationId={application.id}\n timezone={application.timezone}\n copy={copy.reschedule}\n onRescheduled={onReschedule}\n />\n {membership}\n </>,\n );\n }\n return card(\n copy,\n copy.provisional.bookCall,\n <>\n <div className=\"meeting-note\">{copy.provisional.bookCallBody}</div>\n <Rescheduler\n api={api}\n applicationId={application.id}\n timezone={application.timezone}\n copy={copy.reschedule}\n onRescheduled={onReschedule}\n label={copy.provisional.chooseTime}\n />\n {membership}\n </>,\n );\n}\n\n/** The signed-in member area. Loads /api/me on mount and renders the account\n * header plus the provisional application card or the full-member content. */\nexport function MembersArea(props: MembersAreaProps) {\n const inheritedCopy = useChapterCopy();\n const {\n api,\n signOut,\n adminHref = \"/admin/\",\n applyHref = \"/join.html\",\n memberContent,\n memberPages,\n renderProvisional,\n } = props;\n const copy = props.copy ?? inheritedCopy.members;\n const [me, setMe] = useState<Me | null>(null);\n const [error, setError] = useState(false);\n\n const reload = async () => {\n try {\n setMe(await api<Me>(\"/api/me\"));\n } catch {\n setError(true);\n }\n };\n useEffect(() => {\n void reload();\n }, []);\n\n if (error) return <p className=\"meeting-note\">{copy.loadFailed}</p>;\n if (!me) return <p className=\"meeting-note\">{inheritedCopy.common.loading}</p>;\n const role = me.role || \"provisional\";\n\n return (\n <>\n <div className=\"card\">\n <div className=\"member-row\">\n <span className=\"member-email\">{me.email}</span>\n <span className={\"role-badge \" + role}>{role}</span>\n </div>\n <div className=\"account-actions\">\n <button className=\"btn secondary mini\" onClick={signOut}>\n {copy.account.signOut}\n </button>\n {me.authorized || me.superAdmin ? (\n <a className=\"admin-console-link\" href={adminHref}>\n {copy.account.adminConsole}\n </a>\n ) : null}\n </div>\n </div>\n {me.memberAccess !== true && me.membershipRestart?.eligible && me.application ?\n <MemberRestart api={api} application={me.application} applicationId={me.membershipRestart.applicationId} onComplete={reload} /> : me.memberAccess !== true ? (() => {\n const defaultContent = (\n <ProvisionalCard\n api={api}\n application={me.application}\n applyHref={applyHref}\n copy={copy}\n onReschedule={reload}\n />\n );\n return renderProvisional?.({\n api,\n application: me.application,\n applyHref,\n reload,\n defaultContent,\n }) ?? defaultContent;\n })() : (\n (memberContent ?? (memberPages ? (\n <MemberContentArea\n api={api}\n {...(memberPages === true ? {} : memberPages)}\n />\n ) : (\n <div className=\"card\">\n <div className=\"card-label\">{copy.full.welcome}</div>\n </div>\n )))\n )}\n <GiftPurchases api={api} copy={copy.gifts} paymentCopy={inheritedCopy.join.payment} />\n {me.namedSeatsEnabled ? <NamedSeatPurchase api={api} /> : null}\n </>\n );\n}\n","// In-place reschedule: open a SlotPicker, rebook via /api/schedule/book (the same\n// capability the join flow uses; the application id is the credential). Ported\n// from the reference member-area Rescheduler, driven by the injected `api`.\nimport { useState } from \"preact/hooks\";\nimport { SlotPicker } from \"./slot-picker.js\";\nimport type { Slot } from \"./datetime.js\";\nimport type { ApiFn } from \"./api.js\";\nimport type { ChapterCopy } from \"../copy.js\";\nimport { useChapterCopy } from \"./copy-context.js\";\n\ninterface SlotsResponse {\n schedulingReady?: boolean;\n slots?: Slot[];\n timezone?: string;\n}\n\n/** Props for {@link Rescheduler}. */\nexport interface RescheduleProps {\n api: ApiFn;\n applicationId: string;\n timezone: string;\n /** Called after a successful (re)booking so the caller can refresh /api/me. */\n onRescheduled: () => void | Promise<void>;\n /** Link text to open the picker (e.g. \"Choose a time\" for a first booking). */\n label?: string;\n /** Resolved rescheduling copy. */\n copy?: ChapterCopy[\"members\"][\"reschedule\"];\n}\n\n/** A collapsed \"change your time\" link that expands into a {@link SlotPicker} and\n * rebooks on pick. Degrades to a message when scheduling is unavailable. */\nexport function Rescheduler(props: RescheduleProps) {\n const inheritedCopy = useChapterCopy();\n const copy = props.copy ?? inheritedCopy.members.reschedule;\n const { api, applicationId, timezone, onRescheduled, label = copy.changeTime } = props;\n const [open, setOpen] = useState(false);\n const [slots, setSlots] = useState<Slot[] | null>(null);\n const [tz, setTz] = useState(timezone);\n const [busy, setBusy] = useState(false);\n const [msg, setMsg] = useState<string | null>(null);\n\n const start = async () => {\n setOpen(true);\n setSlots(null);\n setMsg(null);\n try {\n const r = await api<SlotsResponse>(\"/api/schedule/slots\");\n if (r.schedulingReady === false) {\n setSlots([]);\n setMsg(copy.unavailable);\n return;\n }\n setSlots(r.slots ?? []);\n if (r.timezone) setTz(r.timezone);\n } catch {\n setSlots([]);\n setMsg(copy.loadFailed);\n }\n };\n\n const pick = async (slot: Slot) => {\n setBusy(true);\n setMsg(null);\n try {\n await api(\"/api/schedule/book\", { method: \"POST\", body: JSON.stringify({ applicationId, startAt: slot.startAt }) });\n setOpen(false);\n await onRescheduled();\n } catch (e) {\n setMsg(e instanceof Error ? e.message : copy.slotGone);\n } finally {\n setBusy(false);\n }\n };\n\n if (!open) {\n return (\n <p className=\"meeting-note\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n void start();\n }}\n >\n {label}\n </a>\n </p>\n );\n }\n return (\n <div className=\"msched\">\n {slots === null ? (\n <p className=\"meeting-note\">{copy.loading}</p>\n ) : slots.length === 0 ? (\n <p className=\"meeting-note\">{msg ?? copy.noTimes}</p>\n ) : (\n <SlotPicker\n slots={slots}\n timezone={tz}\n classes={{ days: \"msched-days\", day: \"msched-day\", times: \"msched-times\", time: \"msched-time\" }}\n onPick={(s) => void pick(s)}\n />\n )}\n {busy ? <p className=\"meeting-note\">{copy.rescheduling}</p> : null}\n {msg && slots && slots.length > 0 ? <p className=\"meeting-note error\">{msg}</p> : null}\n <p className=\"meeting-note\">\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n setOpen(false);\n }}\n >\n {copy.keepTime}\n </a>\n </p>\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"preact/hooks\";\nimport type { ChapterCopy } from \"../copy.js\";\nimport type { PublicGiftOffer } from \"../gift-offers.js\";\nimport type { BuyerGiftClaim } from \"../gift-store.js\";\nimport type { ApiFn } from \"./api.js\";\nimport { GiftOfferCards } from \"./gift-offer-cards.js\";\nimport { PaymentStep, type SubResponse } from \"./payment-step.js\";\n\ninterface GiftData {\n offers: PublicGiftOffer[];\n claims: BuyerGiftClaim[];\n refundPolicyText?: string;\n merchantDisclosureText?: string;\n}\n\n/** Props for the authenticated gift purchaser ledger and checkout surface. */\nexport interface GiftPurchasesProps {\n api: ApiFn;\n copy: ChapterCopy[\"members\"][\"gifts\"];\n paymentCopy: ChapterCopy[\"join\"][\"payment\"];\n}\n\n/** Authenticated buyer offers, purchase history, and code rotation. */\nexport function GiftPurchases(props: GiftPurchasesProps) {\n const [data, setData] = useState<GiftData | null>(null);\n const [selected, setSelected] = useState<string | null>(null);\n const [code, setCode] = useState(\"\");\n const [message, setMessage] = useState(\"\");\n const purchaseId = useRef(crypto.randomUUID());\n const load = async () => setData(await props.api<GiftData>(\"/api/gifts\"));\n useEffect(() => { void load().catch(() => setData({ offers: [], claims: [] })); }, []);\n const rotate = async (claimId: string) => {\n try {\n const result = await props.api<{ code: string }>(`/api/gifts/${encodeURIComponent(claimId)}/rotate`, { method: \"POST\" });\n setCode(result.code); setMessage(props.copy.rotated);\n } catch { setMessage(props.copy.rotateFailed); }\n };\n if (!data) return null;\n if (data.offers.length === 0 && data.claims.length === 0) return null;\n const offer = data.offers.find((item) => item.id === selected);\n return (\n <section className=\"member-gifts\">\n {data.offers.length ? <div className=\"card\">\n <div className=\"card-label\">{props.copy.title}</div>\n <p>{props.copy.body}</p>\n <GiftOfferCards offers={data.offers} mode=\"select\" selectedOfferId={selected} onSelect={(id) => {\n setSelected(id); setCode(\"\"); purchaseId.current = crypto.randomUUID();\n }} />\n {offer ? <PaymentStep\n applicationId={purchaseId.current}\n refundPolicyText={data.refundPolicyText ?? \"\"}\n merchantDisclosureText={data.merchantDisclosureText}\n copy={props.paymentCopy}\n startCheckout={() => props.api<SubResponse>(\"/api/gifts/checkout\", {\n method: \"POST\", headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ offerId: offer.id, purchaseId: purchaseId.current }),\n })}\n onPaid={(result) => {\n if (result.giftCode) setCode(result.giftCode);\n setMessage(props.copy.paid);\n setSelected(null);\n setTimeout(() => void load(), 1_500);\n }}\n /> : null}\n {code ? <div className=\"gift-code-once\"><output>{code}</output><p>{props.copy.saveCode}</p></div> : null}\n </div> : null}\n <div className=\"card\">\n <div className=\"card-label\">{props.copy.purchases}</div>\n {data.claims.length ? data.claims.map((claim) => <div className=\"member-row\" key={claim.id}>\n <span>{claim.offerId}</span><span>{props.copy[claim.status]}</span>\n {claim.status === \"pending\" ? <button className=\"btn secondary mini\" onClick={() => void rotate(claim.id)}>{props.copy.rotate}</button> : null}\n </div>) : <p>{props.copy.noPurchases}</p>}\n {message ? <p role=\"status\">{message}</p> : null}\n </div>\n </section>\n );\n}\n\n/**\n * Compatibility name for the authenticated gift purchaser surface.\n * @deprecated Use {@link GiftPurchases}; recipient claiming belongs in JoinIsland.\n */\nexport const MemberGifts = GiftPurchases;\n","import type { JSX } from \"preact\";\nimport type { PublicGiftOffer } from \"../gift-offers.js\";\nimport { fmtMoney } from \"./datetime.js\";\n\nconst price = (cents: number, currency: string): string => currency === \"usd\"\n ? fmtMoney(cents)\n : new Intl.NumberFormat(undefined, { style: \"currency\", currency: currency.toUpperCase() }).format(cents / 100);\n\n/** Interactive live selection or inert exact-preview rendering. */\nexport type GiftOfferCardsMode = \"select\" | \"preview\";\n/** Public provider-free offer-card renderer inputs. */\nexport interface GiftOfferCardsProps {\n offers: readonly PublicGiftOffer[];\n mode?: GiftOfferCardsMode;\n selectedOfferId?: string | null;\n onSelect?: (offerId: string) => void;\n ariaLabel?: string;\n}\n\n/** Exact Chapter gift-offer renderer shared by live signup, members, and CMS preview. */\nexport function GiftOfferCards(props: GiftOfferCardsProps): JSX.Element {\n const mode = props.mode ?? \"preview\";\n return (\n <section className=\"chapter-gift-offers\" aria-label={props.ariaLabel ?? \"Gift options\"}>\n {props.offers.map((offer) => (\n <article className=\"card chapter-gift-offer\" data-offer-id={offer.id} key={offer.id}>\n <div className=\"card-label\">{offer.title}</div>\n <p>{offer.description}</p>\n <p className=\"meeting-date\">{price(offer.priceCents, offer.currency)}{offer.billingMode === \"subscription\" ? \" recurring\" : \"\"}</p>\n {mode === \"select\" ? (\n <button type=\"button\" className=\"btn secondary\" aria-pressed={props.selectedOfferId === offer.id} onClick={() => props.onSelect?.(offer.id)}>\n {offer.ctaLabel}\n </button>\n ) : <span className=\"btn secondary\" aria-disabled=\"true\">{offer.ctaLabel}</span>}\n </article>\n ))}\n </section>\n );\n}\n","import { useEffect, useState } from \"preact/hooks\";\nimport type { ApiFn } from \"./api.js\";\nimport type { NamedSeatOffer } from \"../membership-seat-offer.js\";\nimport { PaymentStep, type SubResponse } from \"./payment-step.js\";\nimport { JourneyFrame } from \"./journey-frame.js\";\n\ntype SeatData = NamedSeatOffer & { refundPolicyText: string; merchantDisclosureText: string };\n/** The authenticated purchaser's one named additional seat, using real Payment Elements and server quotes. */\nexport function NamedSeatPurchase({ api }: { api: ApiFn }) {\n const [data, setData] = useState<SeatData | null>(null), [error, setError] = useState(\"\");\n const [name, setName] = useState(\"\"), [email, setEmail] = useState(\"\"), [reviewing, setReviewing] = useState(false);\n const [terms, setTerms] = useState(false), [pending, setPending] = useState(false);\n const load = async () => {\n try {\n const value = await api<SeatData>(\"/api/named-seat\"); setData(value); setError(\"\");\n if (value.seat) { setName(value.seat.recipientName); setEmail(value.seat.recipientEmail); }\n } catch { setError(\"The named-seat service is unavailable. Refresh to check your purchase before trying again.\"); }\n };\n useEffect(() => { void load(); }, []);\n const money = data ? new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency: data.currency }).format(data.amountCents / 100) : \"\";\n return <JourneyFrame><section className=\"card member-named-seat\" aria-label=\"Named additional seat\">\n <h2>Named additional seat</h2>\n {error ? <p role=\"alert\">{error}</p> : null}\n {data ? <>\n {data.seat ? <p>{data.seat.recipientName} · {data.seat.recipientEmail} · {data.seat.status.replaceAll(\"_\", \" \")}</p> : null}\n {data.eligible ? <>\n <p>{money} paid in full now. This seat {data.autoRenew ? \"renews with your primary membership\" : \"ends with your primary membership\"} on {new Date(data.termEndsAt).toLocaleDateString(\"en-US\", { timeZone: \"UTC\" })}.\n {data.autoRenew ? ` Renewal then repeats every ${data.interval}; cancel renewal through your primary membership.` : \" Your primary membership renewal is canceled; buying this seat does not turn it back on.\"}\n {\" \"}It belongs to one named person and cannot be reassigned.</p>\n <p>The recipient must accept and complete their own application and any required interview. The seat stays open for them while your membership is paid; it is not refunded automatically. Contact the chapter if you need a refund.</p>\n {!reviewing ? <form onSubmit={event => { event.preventDefault(); setReviewing(true); setTerms(false); }}>\n <label>Recipient name<input required maxLength={160} value={name} disabled={Boolean(data.seat)} onInput={event => setName(event.currentTarget.value)} /></label>\n <label>Recipient email<input required type=\"email\" maxLength={254} value={email} disabled={Boolean(data.seat)} onInput={event => setEmail(event.currentTarget.value)} /></label>\n <button className=\"btn primary\" type=\"submit\">Review named seat</button>\n </form> : <>\n <p>For {name} · {email}</p>\n <button className=\"btn secondary\" type=\"button\" onClick={() => { setReviewing(false); setTerms(false); void load(); }}>Back to recipient</button>\n <label className=\"journey-consent\"><input type=\"checkbox\" checked={terms} onChange={event => setTerms(event.currentTarget.checked)} />\n <span>{data.autoRenew ? \"I agree to the full initial payment and automatic renewal with my membership; I can cancel renewal.\" : \"I agree to the full initial payment and the displayed end date, with no automatic renewal while my membership renewal is canceled.\"}</span></label>\n {terms ? <PaymentStep applicationId={data.membershipId} refundPolicyText={data.refundPolicyText}\n merchantDisclosureText={data.merchantDisclosureText}\n startCheckout={() => api<SubResponse>(\"/api/named-seat/checkout\", { method: \"POST\", headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ recipientName: name, recipientEmail: email, quoteDigest: data.digest, seatTermsAck: true, refundPolicyAck: true }) })}\n onPaid={() => { setPending(true); setReviewing(false); void load(); }} /> : null}\n </>}\n </> : !data.seat ? <p>{data.purchaseWindowed === false ? \"An additional seat can be purchased for as long as your membership stays paid.\"\n : `Additional seats can be purchased until ${new Date(data.purchaseEndsAt).toLocaleDateString(\"en-US\", { timeZone: \"UTC\" })}.`}</p> : null}\n {pending ? <p role=\"status\">Payment confirmation is being reconciled. The recipient’s access begins only after their own acceptance and approval.</p> : null}\n </> : !error ? <p>Loading your seat terms…</p> : null}\n <button className=\"btn secondary\" onClick={() => void load()}>Refresh seat status</button>\n </section></JourneyFrame>;\n}\n","import type { ComponentChildren } from \"preact\";\nimport { useEffect, useMemo, useState } from \"preact/hooks\";\nimport { Markdown } from \"@odla-ai/ui/components\";\nimport type { MemberContentPageProjection, MemberContentProjection } from \"../member-content.js\";\nimport type { ApiFn } from \"./api.js\";\nimport { fmtMoney } from \"./datetime.js\";\n\n/** Inputs for the stock authenticated member-content navigator. */\nexport interface MemberContentAreaProps {\n api: ApiFn;\n /** Defaults to the package-owned `/api/member-content` projection. */\n path?: string;\n initialPageId?: string;\n /** Exact preloaded projection for SSR, tests, or package-identical previews. */\n initialData?: MemberContentProjection;\n /** Return a host-owned upgrade URL. Omit to render an informational offer. */\n upsellHref?: (tierId: string, page: MemberContentPageProjection) => string | undefined;\n /** Optional action for a host-owned upgrade journey. */\n onUpsell?: (tierId: string, page: MemberContentPageProjection) => void;\n loadingContent?: ComponentChildren;\n emptyContent?: ComponentChildren;\n}\n\nconst pageLabel = (page: MemberContentPageProjection): string =>\n `${page.title}${page.access === \"locked\" ? \" · Locked\" : \"\"}`;\n\n/**\n * Render the exact server-filtered catalog. This component never receives a\n * restricted body: locked access is a wire-level omission, not a CSS gate.\n */\nexport function MemberContentArea(props: MemberContentAreaProps) {\n const {\n api,\n path = \"/api/member-content\",\n upsellHref,\n onUpsell,\n loadingContent = <p className=\"meeting-note\">Loading member pages…</p>,\n emptyContent = <p className=\"meeting-note\">No member pages have been published yet.</p>,\n } = props;\n const [data, setData] = useState<MemberContentProjection | null>(props.initialData ?? null);\n const [error, setError] = useState<string | null>(null);\n const [selectedId, setSelectedId] = useState(\n props.initialPageId ?? props.initialData?.pages[0]?.id ?? \"\",\n );\n\n useEffect(() => {\n if (props.initialData) return;\n let live = true;\n setError(null);\n void api<MemberContentProjection>(path)\n .then((value) => {\n if (!live) return;\n setData(value);\n setSelectedId((current) =>\n value.pages.some((page) => page.id === current)\n ? current\n : (value.pages[0]?.id ?? \"\"));\n })\n .catch((reason: unknown) => live && setError(reason instanceof Error ? reason.message : String(reason)));\n return () => { live = false; };\n }, [api, path, props.initialData]);\n\n const sections = useMemo(() => {\n const result = new Map<string, MemberContentPageProjection[]>();\n for (const page of data?.pages ?? []) {\n const list = result.get(page.navigation.section) ?? [];\n list.push(page);\n result.set(page.navigation.section, list);\n }\n return [...result.entries()];\n }, [data]);\n if (error) return <p className=\"meeting-note\" role=\"alert\">Member pages could not be loaded: {error}</p>;\n if (!data) return <>{loadingContent}</>;\n if (data.pages.length === 0) return <>{emptyContent}</>;\n const selected = data.pages.find((page) => page.id === selectedId) ?? data.pages[0]!;\n const href = selected.upsell && upsellHref ? upsellHref(selected.upsell.tierId, selected) : undefined;\n\n return (\n <div className=\"chapter-member-content\" data-member-content>\n <nav className=\"chapter-member-content-nav\" aria-label=\"Member pages\">\n {sections.map(([section, pages]) => (\n <section key={section} className=\"chapter-member-content-section\">\n <h2>{section}</h2>\n <ul>\n {pages.map((page) => (\n <li key={page.id} data-parent-page={page.navigation.parentId ?? undefined}>\n <button\n type=\"button\"\n aria-current={page.id === selected.id ? \"page\" : undefined}\n onClick={() => setSelectedId(page.id)}\n >\n {pageLabel(page)}\n </button>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </nav>\n <article className=\"chapter-member-content-page\" data-access={selected.access}>\n <header>\n <div className=\"card-label\">\n {selected.source.type === \"parent\" ? \"Parent\" : \"Chapter\"} · {selected.access}\n </div>\n <h1>{selected.title}</h1>\n {selected.summary ? <p>{selected.summary}</p> : null}\n </header>\n {selected.access === \"allowed\" && selected.bodyMarkdown ? (\n <Markdown source={selected.bodyMarkdown} />\n ) : (\n <div className=\"chapter-member-content-locked\">\n {selected.teaserMarkdown ? <Markdown source={selected.teaserMarkdown} /> : <p>This page is not included in your current membership.</p>}\n {selected.upsell ? (\n <aside className=\"chapter-member-content-upsell\" aria-label={selected.upsell.label ?? \"Membership option\"}>\n <h2>{selected.upsell.label ?? selected.upsell.tierName}</h2>\n <p>{fmtMoney(selected.upsell.priceCents)}</p>\n {selected.upsell.bodyMarkdown ? <Markdown source={selected.upsell.bodyMarkdown} /> : null}\n {href ? (\n <a className=\"btn primary\" href={href}>{selected.upsell.ctaLabel ?? `Explore ${selected.upsell.tierName}`}</a>\n ) : onUpsell ? (\n <button className=\"btn primary\" type=\"button\" onClick={() => onUpsell(selected.upsell!.tierId, selected)}>\n {selected.upsell.ctaLabel ?? `Explore ${selected.upsell.tierName}`}\n </button>\n ) : null}\n </aside>\n ) : null}\n </div>\n )}\n </article>\n </div>\n );\n}\n","// The join island owns form → application → payment → booking → confirmation; the site owns presentation.\nimport type { JSX } from \"preact\";\nimport { useEffect, useRef, useState } from \"preact/hooks\";\nimport { PaymentStep } from \"./payment-step.js\";\nimport { MembershipPaymentStep } from \"./membership-payment-step.js\";\nimport { fullLabel } from \"./datetime.js\";\nimport { useChapterCopy } from \"./copy-context.js\";\nimport { collectFormFields } from \"./form-fields.js\";\nimport { JoinBooking } from \"./join-booking.js\";\nimport { JoinAccepted } from \"./join-accepted.js\";\nimport { GiftClaimCard } from \"./gift-claim-card.js\";\nimport { JoinApplicationForm } from \"./join-application-form.js\";\nimport { applicationSubmitError, joinStateFromApplicationResponse, type JoinApplicationResponse } from \"./join-application-response.js\";\nimport { JoinGiftClaim } from \"./join-gift-claim.js\";\nimport { JoinNamedSeat } from \"./join-named-seat.js\";\nimport { JourneyFrame } from \"./journey-frame.js\";\nimport { useJoinInvitation, JoinInvitationNotice } from \"./join-invitation.js\";\nimport type { JoinSimulation } from \"./join-simulation.js\";\nimport { tierNeedsPayment, useTierSelection } from \"./join-tiers.js\";\nimport type { JoinFlowState, JoinIslandProps } from \"./join-types.js\";\nimport { loadJoinResume } from \"./join-resume.js\";\nimport { useJoinPending } from \"./join-pending.js\";\n\nexport type { JoinTier, JoinTierRenderContext } from \"./join-tiers.js\";\nexport type { JoinSimulation } from \"./join-simulation.js\";\nexport type { JoinConfig, JoinFlowState, JoinIslandProps, JoinStepRenderContext, JoinSubmitRenderContext } from \"./join-types.js\";\n\nexport { loadJoinResume } from \"./join-resume.js\";\n\n/** Signup island with stable retries and server-driven payment/booking continuation. */\nexport function JoinIsland(props: JoinIslandProps) {\n return <JourneyFrame><JoinFlow {...props} /></JourneyFrame>;\n}\n\nfunction JoinFlow(props: JoinIslandProps) {\n const inheritedCopy = useChapterCopy();\n const {\n config,\n membersHref = \"/members/\",\n renderStepHeader,\n renderDone,\n renderAccepted,\n renderGift,\n } = props;\n const copy = props.copy ?? config.copy ?? inheritedCopy.join;\n const seatCopy = copy.namedSeat ?? inheritedCopy.join.namedSeat!;\n const tiers = config.tiers ?? [];\n const tierSelection = useTierSelection(tiers, props.initialTierId);\n const requestedSeat = props.simulation ? undefined : props.initialNamedSeatId;\n const invitationState = useJoinInvitation(requestedSeat, props.namedSeatClaimApi, seatCopy.unavailable);\n const invitation = invitationState.invitation;\n const selectedTierId = invitation?.skuId ?? tierSelection.selectedTierId;\n const selectedTier = tiers.find(tier => tier.id === selectedTierId) ?? tierSelection.selected;\n const [state, setState] = useState<JoinFlowState>(requestedSeat ? { step: \"form\" } : props.initialState ?? { step: \"form\" });\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n const [giftOfferId, setGiftOfferId] = useState<string | null>(props.initialGiftOfferId ?? null);\n // Simulation fails closed at runtime even for an untyped/older caller: once\n // the flag exists, no step may silently fall through to a live adapter.\n const simulatedPayment = props.simulation\n ? props.simulation.payment ?? {\n lineItems: {\n standardCents: selectedTier?.priceCents ?? 0,\n discountCents: 0,\n dueTodayCents: selectedTier?.priceCents ?? 0,\n },\n }\n : undefined;\n const simulatedBooking = props.simulation\n ? props.simulation.booking ?? { slots: [], timezone: \"UTC\" }\n : undefined;\n // One logical form journey owns one idempotency key. Keep it across explicit\n // errors and ambiguous lost responses so a retry cannot create another row.\n const submissionId = useRef<string | null>(null);\n\n useEffect(() => {\n if (props.simulation) return;\n const resolver = requestedSeat ? () => invitation?.applicationId ? loadJoinResume(invitation.applicationId) : Promise.resolve(null) : props.loadResume ?? (() => {\n if (typeof window === \"undefined\") return Promise.resolve(null);\n const applicationId = new URL(window.location.href).searchParams.get(\"application\");\n return applicationId ? loadJoinResume(applicationId) : Promise.resolve(null);\n });\n let live = true;\n void resolver()\n .then((resumed) => {\n if (live && resumed) setState(resumed);\n })\n .catch(() => {\n if (live) setError(copy.form.unexpectedFailure);\n });\n return () => {\n live = false;\n };\n }, [props.loadResume, props.simulation, requestedSeat, invitation?.applicationId]);\n\n useJoinPending(state, requestedSeat ? undefined : props.loadResume, setState);\n\n const submit = async (e: JSX.TargetedSubmitEvent<HTMLFormElement>) => {\n e.preventDefault();\n if (submitting || props.submitDisabled === true || (requestedSeat && !invitation)) return;\n setSubmitting(true);\n setError(null);\n try {\n const fields = collectFormFields(new FormData(e.currentTarget));\n fields.submissionId = submissionId.current ??= crypto.randomUUID();\n if (invitation) {\n fields.namedSeatId = invitation.seatId; fields.tierId = invitation.skuId; fields.email = invitation.recipientEmail;\n } else if (giftOfferId) fields.giftOfferId = giftOfferId;\n else if (selectedTierId) fields.tierId = selectedTierId;\n if (props.simulation) {\n setState({\n // Preview the intended paid journey even before live Stripe wiring is\n // ready. Production still uses the server-authoritative readiness bit.\n step: giftOfferId || tierNeedsPayment(selectedTier, true) ? \"payment\" : \"booking\",\n applicationId: props.simulation.applicationId ?? \"simulation-application\",\n });\n return;\n }\n if (invitation && props.namedSeatClaimApi) {\n const result = await props.namedSeatClaimApi<JoinApplicationResponse>(\"/api/applications\", {\n method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify(fields),\n });\n if (!result.id) throw new Error(copy.form.submitFailed);\n setState(joinStateFromApplicationResponse(result, true, false)!);\n return;\n }\n const res = await fetch(\"/api/applications\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(fields),\n });\n const data = (await res.json()) as JoinApplicationResponse;\n if (!res.ok || !data?.id) throw new Error(applicationSubmitError(data, copy.form.submitFailed));\n setState(joinStateFromApplicationResponse(\n data,\n tierNeedsPayment(selectedTier, config.paymentsReady),\n Boolean(giftOfferId),\n )!);\n } catch (err) {\n setError(err instanceof Error ? err.message : copy.form.unexpectedFailure);\n } finally {\n setSubmitting(false);\n }\n };\n\n if (requestedSeat && !invitation) return <section className=\"card\" aria-live=\"polite\">\n <h2>{seatCopy.title}</h2>\n <p role={invitationState.error ? \"alert\" : \"status\"}>{invitationState.error || seatCopy.loading}</p>\n {invitationState.error ? <button type=\"button\" onClick={invitationState.retry}>{seatCopy.retry}</button> : null}\n </section>;\n const header = <>{invitation ? <JoinInvitationNotice invitation={invitation} copy={seatCopy}\n tierName={selectedTier?.name ?? \"\"} /> : null}{renderStepHeader?.({\n state, ...(invitation ? { invitation } : {}),\n ...(\"applicationId\" in state ? { applicationId: state.applicationId } : {}),\n })}</>;\n if (state.step === \"closed\") {\n return <>{header}<section className=\"card\" aria-label=\"Application closed\">\n <h2>This application is closed</h2>\n <p>This link cannot resume payment or booking. Sign in to view your application status, or contact the chapter if you need help.</p>\n <a className=\"apply-link\" href={membersHref}>{copy.done.memberArea}</a>\n </section></>;\n }\n if (state.step === \"done\") {\n const body = renderDone?.({ ...state, membersHref }) ?? (\n <div className=\"join-done card\">\n <div className=\"card-label\">{copy.done.label}</div>\n <p className=\"meeting-date\">{fullLabel(state.booked.startAt, state.booked.timezone)}</p>\n <p className=\"meeting-note\">{copy.done.calendarInvite}</p>\n <a className=\"apply-link\" href={membersHref}>\n {copy.done.memberArea}\n </a>\n </div>\n );\n return <>{header}{body}</>;\n }\n if (state.step === \"accepted\") {\n const body = renderAccepted?.({ ...state, membersHref }) ?? <JoinAccepted copy={copy} membersHref={membersHref} />;\n return <>{header}{body}</>;\n }\n if (state.step === \"gift\") {\n const body = renderGift?.(state) ?? <GiftClaimCard applicationId={state.applicationId} claimId={state.claimId} initialCode={state.code} copy={copy.gift} />;\n return <>{header}{body}</>;\n }\n if (state.step === \"booking\") {\n return (\n <>\n {header}\n <JoinBooking\n applicationId={state.applicationId}\n copy={copy.booking}\n simulation={simulatedBooking}\n onBooked={(booked) => {\n setState({ step: \"done\", applicationId: state.applicationId, booked });\n }}\n />\n </>\n );\n }\n if (state.step === \"payment\") {\n if (props.namedSeatClaimApi && props.initialNamedSeatId && !props.simulation && !state.giftPurchase) {\n return <>{header}<JoinNamedSeat api={props.namedSeatClaimApi} applicationId={state.applicationId}\n seatId={props.initialNamedSeatId} copy={seatCopy} onState={setState} /></>;\n }\n const Payment = state.giftPurchase || props.simulation ? PaymentStep : MembershipPaymentStep;\n return (\n <>\n {header}\n {props.giftClaimApi && !state.giftPurchase ? (\n <JoinGiftClaim\n api={props.giftClaimApi}\n applicationId={state.applicationId}\n copy={copy.gift}\n loadResume={props.loadResume}\n onState={setState}\n onError={() => setError(copy.form.unexpectedFailure)}\n />\n ) : null}\n <Payment\n applicationId={state.applicationId}\n refundPolicyText={config.refundPolicyText ?? \"\"}\n merchantDisclosureText={config.merchantDisclosureText}\n copy={copy.payment}\n appearance={props.payment?.appearance}\n fonts={props.payment?.fonts}\n renderPriceLines={props.payment?.renderPriceLines}\n simulation={simulatedPayment}\n onPaid={(result) => {\n if (props.simulation) {\n setState(giftOfferId\n ? { step: \"gift\", applicationId: state.applicationId, code: \"gift1_simulation_only_not_a_real_claim_code\" }\n : { step: \"booking\", applicationId: state.applicationId });\n return;\n }\n if (result.gift && result.giftCode) {\n setState({ step: \"gift\", applicationId: state.applicationId, code: result.giftCode });\n return;\n }\n setState({ step: \"paymentPending\", applicationId: state.applicationId });\n }}\n >\n {props.payment?.children}\n </Payment>\n </>\n );\n }\n if (state.step === \"paymentPending\") {\n if (props.namedSeatClaimApi && props.initialNamedSeatId && !props.simulation) {\n return <>{header}<JoinNamedSeat api={props.namedSeatClaimApi} applicationId={state.applicationId}\n seatId={props.initialNamedSeatId} copy={seatCopy} onState={setState} /></>;\n }\n return (\n <>\n {header}\n <p className=\"pay-status\" role=\"status\">{copy.payment.pending}</p>\n </>\n );\n }\n return <>{header}<JoinApplicationForm props={props} copy={copy} invitation={invitation} requestedSeat={requestedSeat}\n tierSelection={tierSelection} giftOfferId={giftOfferId} selectGift={setGiftOfferId} submitting={submitting}\n error={error} submit={submit} /></>;\n}\n","import type { ComponentChildren } from \"preact\";\nimport { useEffect, useState } from \"preact/hooks\";\nimport type { ChapterCopy } from \"../copy.js\";\nimport type { Slot } from \"./datetime.js\";\nimport { DEFAULT_JOIN_COPY } from \"../copy-defaults.js\";\nimport { SlotPicker } from \"./slot-picker.js\";\n\ninterface SlotsResponse {\n schedulingReady?: boolean;\n slots?: Slot[];\n timezone?: string;\n}\n\n/** Deterministic, side-effect-free availability for a simulated join flow. */\nexport interface JoinBookingSimulation {\n slots: readonly Slot[];\n timezone: string;\n}\n\nexport function JoinBooking(props: {\n applicationId: string;\n copy: ChapterCopy[\"join\"][\"booking\"];\n onBooked: (b: { startAt: number; timezone: string }) => void;\n simulation?: JoinBookingSimulation;\n}): ComponentChildren {\n const { applicationId, copy, onBooked, simulation } = props;\n const [state, setState] = useState<{ slots: Slot[]; timezone: string } | null>(null);\n const [msg, setMsg] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [selected, setSelected] = useState<Slot | null>(null);\n\n const load = async () => {\n setMsg(null);\n try {\n if (simulation) {\n if (!simulation.slots.length) {\n setState(null);\n setMsg(copy.unavailable);\n return;\n }\n setState({ slots: [...simulation.slots], timezone: simulation.timezone });\n return;\n }\n const res = await fetch(\"/api/schedule/slots\");\n const data = (await res.json()) as SlotsResponse;\n if (data.schedulingReady === false || !data.slots?.length) {\n setState(null);\n setMsg(copy.unavailable);\n return;\n }\n setState({ slots: data.slots, timezone: data.timezone ?? \"UTC\" });\n } catch {\n setMsg(copy.loadFailed);\n }\n };\n useEffect(() => {\n void load();\n }, [simulation]);\n\n const book = async () => {\n if (!selected) return;\n setBusy(true);\n setMsg(null);\n try {\n if (simulation) {\n onBooked({ startAt: selected.startAt, timezone: simulation.timezone });\n return;\n }\n const res = await fetch(\"/api/schedule/book\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ applicationId, startAt: selected.startAt }),\n });\n const data = (await res.json()) as { startAt?: number; error?: string; code?: string };\n if (res.status === 409 && data.code === \"calendar_slot_unavailable\") {\n setSelected(null);\n setMsg(copy.slotTaken);\n await load();\n return;\n }\n if (!res.ok) throw new Error(data.error ?? copy.failed);\n onBooked({ startAt: data.startAt ?? selected.startAt, timezone: state?.timezone ?? \"UTC\" });\n } catch (e) {\n setMsg(e instanceof Error ? e.message : copy.failed);\n } finally {\n setBusy(false);\n }\n };\n\n if (!state) return <p className=\"slots-status\">{msg ?? copy.loading}</p>;\n return (\n <div className=\"join-book\">\n <h2>{copy.title ?? DEFAULT_JOIN_COPY.booking.title}</h2>\n <p>{copy.intro ?? DEFAULT_JOIN_COPY.booking.intro}</p>\n <SlotPicker\n slots={state.slots}\n timezone={state.timezone}\n selectedStartAt={selected?.startAt}\n onPick={setSelected}\n onDayChange={() => setSelected(null)}\n />\n <div className=\"slot-confirm\" hidden={!selected}>\n <button className=\"submit-btn\" disabled={busy} onClick={() => void book()}>\n {busy ? copy.booking : copy.book}\n </button>\n {msg ? <p className=\"step2-note\">{msg}</p> : null}\n </div>\n </div>\n );\n}\n","import type { ChapterCopy } from \"../copy.js\";\n\nexport function JoinAccepted(props: {\n copy: ChapterCopy[\"join\"];\n membersHref: string;\n}) {\n return (\n <div className=\"join-done card\">\n <div className=\"card-label\">{props.copy.accepted.label}</div>\n <p className=\"meeting-note\">{props.copy.accepted.body}</p>\n <a className=\"apply-link\" href={props.membersHref}>{props.copy.done.memberArea}</a>\n </div>\n );\n}\n","import { useState } from \"preact/hooks\";\nimport type { ChapterCopy } from \"../copy.js\";\n\n/** One-time buyer display and capability-based recovery for a signup gift code. */\nexport function GiftClaimCard(props: {\n applicationId: string;\n claimId?: string;\n initialCode?: string;\n copy: ChapterCopy[\"join\"][\"gift\"];\n}) {\n const [code, setCode] = useState(props.initialCode ?? \"\");\n const [error, setError] = useState(false);\n const rotate = async () => {\n if (!props.claimId) return;\n setError(false);\n const response = await fetch(`/api/gifts/${encodeURIComponent(props.claimId)}/rotate`, {\n method: \"POST\", headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ applicationId: props.applicationId }),\n });\n const body = await response.json() as { code?: string };\n if (response.ok && body.code) setCode(body.code); else setError(true);\n };\n return (\n <div className=\"join-done card\">\n <div className=\"card-label\">{props.copy.label}</div>\n <p className=\"meeting-note\">{props.copy.body}</p>\n {code ? <><output className=\"gift-code\">{code}</output><p>{props.copy.save}</p></> : null}\n {!code && props.claimId ? <button type=\"button\" className=\"btn secondary\" onClick={() => void rotate()}>{props.copy.rotate}</button> : null}\n {error ? <p role=\"alert\">{props.copy.rotateFailed}</p> : null}\n </div>\n );\n}\n","// The tier chooser seam. The package owns which tier is selected, whether it\n// needs paying for, and what gets posted; a site owns entirely what a tier\n// looks like. Everything here exists so the site can replace the visuals\n// without reimplementing the flow.\nimport type { ComponentChildren } from \"preact\";\nimport { useState } from \"preact/hooks\";\n\n/** One membership tier as the public join config exposes it. */\nexport interface JoinTier {\n id: string;\n name: string;\n priceCents: number;\n blurb: string;\n /** True when the tier costs nothing, so the flow skips the payment step. */\n free: boolean;\n /** Present when the network authority currently qualifies applicants as founding members at a reduced rate. */\n founding?: { cohortLabel: string; dueTodayCents: number; discountCents: number; renewalCents: number; discountDuration?: \"first_term\" | \"while_active\" };\n}\n\n/** Money for the placeholder chooser and cards; sites format their own. */\nexport const joinTierMoney = (cents: number, currency = \"usd\") =>\n new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency }).format(cents / 100);\n\n/**\n * What a site needs to render its own tier chooser.\n *\n * Pass `renderTiers` to take over presentation entirely — the built-in output\n * is an unstyled placeholder, not a design.\n */\nexport interface JoinTierRenderContext {\n /** Offered tiers, in display order. */\n tiers: readonly JoinTier[];\n /** The chosen tier, or null while nothing is chosen. */\n selected: JoinTier | null;\n selectedTierId: string | null;\n /** Choose a tier. Unknown ids are ignored. */\n selectTier: (tierId: string) => void;\n}\n\n/**\n * Track the selected tier.\n *\n * A single offered tier is selected implicitly: the choice is unambiguous, so\n * a chooser would be furniture. Nothing is preselected when several are on\n * offer, because defaulting silently picks a price on the applicant's behalf.\n */\nexport function useTierSelection(\n tiers: readonly JoinTier[],\n initialTierId?: string,\n): JoinTierRenderContext {\n const [selectedTierId, setSelectedTierId] = useState<string | null>(() => {\n const preset = tiers.find((tier) => tier.id === initialTierId);\n if (preset) return preset.id;\n return tiers.length === 1 ? tiers[0]!.id : null;\n });\n return {\n tiers,\n selected: tiers.find((tier) => tier.id === selectedTierId) ?? null,\n selectedTierId,\n selectTier: (tierId: string) => {\n if (tiers.some((tier) => tier.id === tierId)) setSelectedTierId(tierId);\n },\n };\n}\n\n/**\n * The unstyled fallback chooser.\n *\n * Deliberately plain and self-labelling: the flow stays usable before a site\n * has designed anything, and it is obvious on sight that this was never meant\n * to ship. Sites replace it wholesale via `renderTiers`; the `data-*` hook is\n * there so a build can assert no placeholder survives into production.\n */\nexport function TierPlaceholder(context: JoinTierRenderContext): ComponentChildren {\n return (\n <fieldset data-chapter-placeholder=\"tiers\">\n <legend>Membership (placeholder — pass renderTiers to style this)</legend>\n {context.tiers.map((tier) => (\n <label key={tier.id}>\n <input\n type=\"radio\"\n name=\"__chapterTier\"\n value={tier.id}\n checked={context.selectedTierId === tier.id}\n onChange={() => context.selectTier(tier.id)}\n />\n {tier.name}\n {tier.founding ? <> — {joinTierMoney(tier.founding.dueTodayCents)} founding member rate (list {joinTierMoney(tier.priceCents)})</>\n : tier.free ? \" — free\" : <> — {joinTierMoney(tier.priceCents)}</>}\n </label>\n ))}\n </fieldset>\n );\n}\n\n/**\n * Whether the flow should charge for this submission.\n *\n * A free tier skips payment even on a chapter otherwise wired for it. With no\n * tier in play the chapter-wide readiness decides, which is how every chapter\n * behaved before tiers existed.\n */\nexport function tierNeedsPayment(\n selected: JoinTier | null,\n paymentsReady: boolean,\n): boolean {\n return selected ? !selected.free && paymentsReady : paymentsReady;\n}\n","import type { JSX } from \"preact\";\nimport type { ChapterCopy } from \"../copy\";\nimport type { JoinIslandProps } from \"./join-types\";\nimport type { JoinInvitation } from \"./join-invitation\";\nimport { TierPlaceholder, type useTierSelection } from \"./join-tiers\";\nimport { GiftOfferCards } from \"./gift-offer-cards\";\n\n/** Render application fields with prepaid invitations locked to their authoritative membership. */\nexport function JoinApplicationForm({ props, copy, invitation, requestedSeat, tierSelection, giftOfferId, selectGift, submitting, error, submit }: {\n props: JoinIslandProps; copy: ChapterCopy[\"join\"]; invitation: JoinInvitation | null; requestedSeat?: string;\n tierSelection: ReturnType<typeof useTierSelection>; giftOfferId: string | null; selectGift: (id: string | null) => void;\n submitting: boolean; error: string | null; submit: (event: JSX.TargetedSubmitEvent<HTMLFormElement>) => Promise<void>;\n}) {\n const disabled = submitting || props.submitDisabled === true;\n return <form className=\"join-form\" onSubmit={event => void submit(event)}>\n {!requestedSeat && (props.config.giftOffers?.length ?? 0) > 0 ? <fieldset>\n <legend>{copy.gift.optionsLabel}</legend>\n <button type=\"button\" className=\"btn secondary\" aria-pressed={!giftOfferId} onClick={() => selectGift(null)}>{copy.gift.chooseSelf}</button>\n <GiftOfferCards offers={props.config.giftOffers ?? []} mode=\"select\" selectedOfferId={giftOfferId} onSelect={selectGift} />\n </fieldset> : null}\n {!requestedSeat && (props.config.tiers?.length ?? 0) > 1 ? props.renderTiers?.(tierSelection) ?? TierPlaceholder(tierSelection) : null}\n {typeof props.children === \"function\" ? props.children({ invitation }) : props.children}\n {error ? <p className=\"join-error\" role=\"alert\">{error}</p> : null}\n {props.renderSubmit?.({ submitting, disabled }) ?? <button className=\"submit-btn\" type=\"submit\" disabled={disabled}>\n {submitting ? copy.form.submitting : copy.form.submit}\n </button>}\n </form>;\n}\n","import type { JoinResumeResponse } from \"./join-resume.js\";\nimport type { JoinFlowState } from \"./join-types.js\";\n\n/** Minimal application-submit response consumed by the browser journey. */\nexport interface JoinApplicationResponse {\n id?: string;\n state?: JoinResumeResponse[\"state\"];\n giftPurchase?: boolean;\n error?: string | { code?: string; message?: string };\n}\n\n/** Render the public route's string or structured failure without coercing an\n * object to \"[object Object]\" or exposing arbitrary response properties. */\nexport function applicationSubmitError(data: JoinApplicationResponse, fallback: string): string {\n if (typeof data?.error === \"string\" && data.error.trim()) return data.error;\n if (data?.error && typeof data.error === \"object\" &&\n typeof data.error.message === \"string\" && data.error.message.trim()) return data.error.message;\n return fallback;\n}\n\n/** Convert the server continuation, or an older Worker's fallback, into UI state. */\nexport function joinStateFromApplicationResponse(\n data: JoinApplicationResponse,\n fallbackNeedsPayment: boolean,\n submittedGiftPurchase: boolean,\n): JoinFlowState | null {\n if (!data.id) return null;\n if (data.state === \"accepted\") return { step: \"accepted\", applicationId: data.id };\n if (data.state === \"paymentPending\") return { step: \"paymentPending\", applicationId: data.id };\n if (data.state === \"booking\") return { step: \"booking\", applicationId: data.id };\n if (data.state === \"payment\") return {\n step: \"payment\",\n applicationId: data.id,\n ...(data.giftPurchase || submittedGiftPurchase ? { giftPurchase: true } : {}),\n };\n return fallbackNeedsPayment\n ? { step: \"payment\", applicationId: data.id, ...(submittedGiftPurchase ? { giftPurchase: true } : {}) }\n : { step: \"booking\", applicationId: data.id };\n}\n","import { InlineActionField, type InlineActionFieldTone } from \"@odla-ai/ui/components\";\nimport { useState } from \"preact/hooks\";\nimport type { ApiFn } from \"./api.js\";\n\n/** Resolved Chapter copy consumed by {@link GiftCodeRedeemer}. */\nexport interface GiftCodeRedeemerCopy {\n code: string;\n redeem: string;\n redeemed: string;\n redeemFailed: string;\n}\n\n/** Canonical continuation returned after a recipient claim is committed. */\nexport interface GiftCodeRedeemResult {\n ok: true;\n kind: \"application\";\n id: string;\n applicationId: string;\n state?: \"payment\" | \"paymentPending\" | \"booking\" | \"accepted\";\n}\n\n/** Props for the canonical Chapter member gift-code redemption control. */\nexport interface GiftCodeRedeemerProps {\n api: ApiFn;\n /** Exact application whose payment requirement the gift must satisfy. */\n applicationId: string;\n copy: GiftCodeRedeemerCopy;\n id?: string;\n onRedeemed?: (result: GiftCodeRedeemResult) => void | Promise<void>;\n}\n\n// Member sites do not have to load the full admin design-system stylesheet.\n// Keep this small public control self-contained, just like MembershipCards,\n// while retaining the same semantic tokens as InlineActionField.\nconst GIFT_CODE_REDEEMER_CSS = `\n.gift-code-redeemer{container-type:inline-size;display:grid;gap:var(--ui-space-1,.35rem);margin:0}\n.gift-code-redeemer .inline-action-field-label{display:block;color:var(--ui-text-muted,#66777f);font-size:var(--ui-text-xs,.72rem);font-weight:var(--ui-weight-strong,700);letter-spacing:var(--ui-tracking-caps,.08em);text-transform:uppercase}\n.gift-code-redeemer .inline-action-field-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--ui-space-2,.65rem);align-items:stretch}\n.gift-code-redeemer .inline-action-field-input,.gift-code-redeemer .inline-action-field-action{min-height:var(--ui-inline-action-control-height,38px)}\n.gift-code-redeemer .inline-action-field-input.code{font-family:var(--ui-font-mono,ui-monospace,monospace);font-variant-ligatures:none;letter-spacing:var(--ui-tracking-wide,.04em)}\n.gift-code-redeemer .inline-action-field-input:focus-visible{outline:none;border-color:var(--ui-accent,#168c84);box-shadow:var(--ui-focus,0 0 0 3px rgb(22 140 132 / .18))}\n.gift-code-redeemer .inline-action-field-action{white-space:nowrap}\n.gift-code-redeemer .inline-action-field-status{display:block;min-block-size:1.4em;margin:0;color:var(--ui-text-muted,#66777f);font-size:var(--ui-text-sm,.8rem);line-height:1.4}\n.gift-code-redeemer .inline-action-field-status.success{color:var(--ui-good,#1f7a52)}\n.gift-code-redeemer .inline-action-field-status.error{color:var(--ui-danger,#b42318)}\n@container (max-width:26rem){.gift-code-redeemer .inline-action-field-row{grid-template-columns:minmax(0,1fr)}.gift-code-redeemer .inline-action-field-action{width:100%}}\n`;\n\n/**\n * Redeems one Chapter gift code through the canonical member API.\n *\n * The component owns input, in-flight, success, and failure state and renders\n * the shared `InlineActionField` contract. Gift codes remain case-sensitive:\n * browser capitalization and spellcheck are disabled, while\n * `autocomplete=\"one-time-code\"` allows platform code suggestions.\n */\nexport function GiftCodeRedeemer({ api, applicationId, copy, id, onRedeemed }: GiftCodeRedeemerProps) {\n const [code, setCode] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n const [messageTone, setMessageTone] = useState<InlineActionFieldTone>(\"neutral\");\n const normalizedCode = code.trim();\n\n const redeem = async () => {\n if (!normalizedCode || loading) return;\n setLoading(true);\n setMessage(\"\");\n setMessageTone(\"neutral\");\n try {\n const result = await api<GiftCodeRedeemResult>(\"/api/gifts/redeem\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ code: normalizedCode, applicationId }),\n });\n setCode(\"\");\n setMessage(copy.redeemed);\n setMessageTone(\"success\");\n try {\n await onRedeemed?.(result);\n } catch {\n // Redemption already succeeded. A stale ledger refresh must not report\n // the irreversible server result as a failed redemption.\n }\n } catch {\n setMessage(copy.redeemFailed);\n setMessageTone(\"error\");\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <>\n <style>{GIFT_CODE_REDEEMER_CSS}</style>\n <InlineActionField\n id={id}\n className=\"gift-code-redeemer\"\n label={copy.code}\n value={code}\n code\n actionLabel={copy.redeem}\n loadingLabel={`${copy.redeem}…`}\n loading={loading}\n actionDisabled={!normalizedCode}\n message={message}\n messageTone={messageTone}\n inputProps={{\n name: \"giftCode\",\n maxLength: 64,\n autoComplete: \"one-time-code\",\n autoCapitalize: \"none\",\n autocorrect: \"off\",\n spellcheck: false,\n }}\n onValueChange={(value) => {\n setCode(value);\n if (message) {\n setMessage(\"\");\n setMessageTone(\"neutral\");\n }\n }}\n onAction={() => void redeem()}\n />\n </>\n );\n}\n","import type { JoinFlowState } from \"./join-types.js\";\n\nexport interface JoinResumeResponse {\n state: \"payment\" | \"paymentPending\" | \"booking\" | \"accepted\" | \"gift\" | \"done\";\n applicationId: string;\n claimId?: string;\n giftPurchase?: boolean;\n booked?: { startAt: number; timezone: string };\n}\n\n/** Load canonical server state for a capability-bearing application id. */\nexport async function loadJoinResume(applicationId: string, fetcher: typeof fetch = fetch): Promise<JoinFlowState> {\n const res = await fetcher(`/api/join/resume?application=${encodeURIComponent(applicationId)}`);\n const data = (await res.json()) as JoinResumeResponse & { error?: string; code?: string };\n if (!data || data.applicationId !== applicationId) throw new Error(\"The application could not be resumed.\");\n if (res.status === 409 && data.code === \"application_closed\") return { step: \"closed\", applicationId };\n if (!res.ok) throw new Error(data.error ?? \"The application could not be resumed.\");\n if (data.state === \"done\" && data.booked) return { step: \"done\", applicationId: data.applicationId, booked: data.booked };\n if (data.state === \"paymentPending\") return { step: \"paymentPending\", applicationId: data.applicationId };\n if (data.state === \"booking\") return { step: \"booking\", applicationId: data.applicationId };\n if (data.state === \"accepted\") return { step: \"accepted\", applicationId: data.applicationId };\n if (data.state === \"gift\") return { step: \"gift\", applicationId: data.applicationId, ...(data.claimId ? { claimId: data.claimId } : {}) };\n if (data.state !== \"payment\") throw new Error(\"The application continuation is not recognized.\");\n return {\n step: \"payment\",\n applicationId: data.applicationId,\n ...(data.giftPurchase ? { giftPurchase: true } : {}),\n };\n}\n","import type { ChapterCopy } from \"../copy.js\";\nimport type { ApiFn } from \"./api.js\";\nimport { GiftCodeRedeemer } from \"./gift-code-redeemer.js\";\nimport { loadJoinResume } from \"./join-resume.js\";\nimport type { JoinFlowState, JoinIslandProps } from \"./join-types.js\";\n\ninterface JoinGiftClaimProps {\n api: ApiFn;\n applicationId: string;\n copy: ChapterCopy[\"join\"][\"gift\"];\n loadResume?: JoinIslandProps[\"loadResume\"];\n onState: (state: JoinFlowState) => void;\n onError: () => void;\n}\n\n/** Recipient claim control composed ahead of the paid signup card form. */\nexport function JoinGiftClaim(props: JoinGiftClaimProps) {\n return (\n <section className=\"join-gift-claim card\">\n <div className=\"card-label\">{props.copy.claimTitle}</div>\n <p>{props.copy.claimBody}</p>\n <GiftCodeRedeemer\n api={props.api}\n applicationId={props.applicationId}\n copy={props.copy}\n onRedeemed={async (result) => {\n if (result.state === \"booking\" || result.state === \"accepted\") {\n props.onState({ step: result.state, applicationId: result.applicationId });\n return;\n }\n try {\n const resumed = props.loadResume\n ? await props.loadResume()\n : await loadJoinResume(result.applicationId);\n if (resumed) props.onState(resumed);\n } catch {\n props.onError();\n }\n }}\n />\n </section>\n );\n}\n","import { useState } from \"preact/hooks\";\nimport type { ApiFn } from \"./api.js\";\nimport type { JoinFlowState } from \"./join-types.js\";\nimport { useChapterCopy } from \"./copy-context.js\";\nimport type { ChapterCopy } from \"../copy.js\";\n\n/** A named recipient uses their own signed-in account and application; this control never charges a card. */\nexport function JoinNamedSeat(props: { api: ApiFn; applicationId: string; seatId?: string; copy?: ChapterCopy[\"join\"][\"namedSeat\"]; onState: (state: JoinFlowState) => void }) {\n const seatId = props.seatId ?? \"\";\n const inherited = useChapterCopy(), copy = props.copy ?? inherited.join.namedSeat!;\n const [accepted, setAccepted] = useState(false), [busy, setBusy] = useState(false), [error, setError] = useState(\"\");\n return <section className=\"join-named-seat card\">\n <h2>{copy.title}</h2>\n <p>{copy.body}</p>\n <label className=\"journey-consent\"><input type=\"checkbox\" checked={accepted} disabled={busy} onChange={event => setAccepted(event.currentTarget.checked)} />\n <span>{copy.consent}</span></label>\n {error ? <p role=\"alert\">{error}</p> : null}\n <button type=\"button\" className=\"btn btn-primary\" disabled={busy || !accepted || !seatId.trim()} onClick={async () => {\n setBusy(true); setError(\"\");\n try {\n const result = await props.api<{ ok: boolean; applicationId: string; state: string }>(\"/api/named-seat/accept\", {\n method: \"POST\", body: JSON.stringify({ applicationId: props.applicationId, seatId: seatId.trim(), acceptTerms: true }),\n });\n if (!result.ok || result.applicationId !== props.applicationId || ![\"booking\", \"accepted\", \"paymentPending\"].includes(result.state)) throw new Error(\"acceptance pending\");\n props.onState({ step: result.state as \"booking\" | \"accepted\" | \"paymentPending\", applicationId: result.applicationId });\n } catch (error) { setError(error instanceof Error && error.message && error.message !== \"acceptance pending\" ? error.message.slice(0, 400) : copy.failure); }\n finally { setBusy(false); }\n }}>{busy ? copy.accepting : copy.accept}</button>\n </section>;\n}\n","import { useEffect, useState } from \"preact/hooks\";\nimport { formatChapterCopy, type ChapterCopy } from \"../copy\";\nimport type { ApiFn } from \"./api\";\n\n/** Verified recipient-visible invitation, without purchaser contact or billing credentials. */\nexport interface JoinInvitation {\n applicationId?: string;\n seatId: string; skuId: string; purchaserName: string; recipientName: string; recipientEmail: string;\n acceptanceEndsAt: number; termEndsAt: number; status: string;\n}\n\n/** Keep the invitation authoritative across sign-in, refresh and each join step. */\nexport function useJoinInvitation(seatId: string | undefined, api: ApiFn | undefined, fallback: string) {\n const [invitation, setInvitation] = useState<JoinInvitation | null>(null);\n const [error, setError] = useState(\"\");\n const [revision, setRevision] = useState(0);\n useEffect(() => {\n let live = true;\n setInvitation(null); setError(\"\");\n if (!seatId) return;\n if (!api) { setError(fallback); return; }\n void api<JoinInvitation>(`/api/named-seat/invitation?seat=${encodeURIComponent(seatId)}`)\n .then(value => {\n if (value.seatId !== seatId || !value.skuId || !value.purchaserName) throw new Error(fallback);\n if (live) setInvitation(value);\n }).catch(error => { if (live) setError(error instanceof Error ? error.message.slice(0, 400) : fallback); });\n return () => { live = false; };\n }, [seatId, api, revision]);\n return { invitation: invitation?.seatId === seatId ? invitation : null, error, retry: () => setRevision(value => value + 1) };\n}\n\n/** Persistent purchaser attribution and prepaid status for every recipient screen. */\nexport function JoinInvitationNotice(props: { invitation: JoinInvitation; tierName: string; copy: NonNullable<ChapterCopy[\"join\"][\"namedSeat\"]> }) {\n return <aside className=\"journey-invitation\" aria-label={props.copy.title}>\n <p><strong>{formatChapterCopy(props.copy.from, { purchaserName: props.invitation.purchaserName })}</strong></p>\n <p>{formatChapterCopy(props.copy.prepaid, { tierName: props.tierName })}</p>\n </aside>;\n}\n","import { useEffect } from \"preact/hooks\";\nimport { loadJoinResume } from \"./join-resume.js\";\nimport type { JoinFlowState, JoinIslandProps } from \"./join-types.js\";\n\n/** Retry a server-confirmed pending journey without treating browser payment success as approval. */\nexport function useJoinPending(state: JoinFlowState, loadResume: JoinIslandProps[\"loadResume\"], setState: (state: JoinFlowState) => void) {\n useEffect(() => {\n if (state.step !== \"paymentPending\") return;\n let live = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const poll = async () => {\n try {\n const resumed = loadResume ? await loadResume() : await loadJoinResume(state.applicationId);\n if (!live || !resumed) return;\n setState(resumed);\n if (resumed.step === \"paymentPending\") timer = setTimeout(() => void poll(), 1500);\n } catch {\n if (live) timer = setTimeout(() => void poll(), 2500);\n }\n };\n timer = setTimeout(() => void poll(), 1000);\n return () => { live = false; if (timer) clearTimeout(timer); };\n }, [state, loadResume]);\n}\n","import type { JSX } from \"preact\";\nimport { Markdown } from \"@odla-ai/ui/components\";\nimport {\n MEMBERSHIP_PAGE_RENDERER,\n membershipPageDocument,\n type MembershipPageDocument,\n type MembershipTierPresentation,\n} from \"../membership-page.js\";\nimport { fmtMoney } from \"./datetime.js\";\nimport type { JoinTier } from \"./join-tiers.js\";\n\n/** Link on public pages, select inside JoinIsland, or remain inert in a CMS preview. */\nexport type MembershipCardsMode = \"link\" | \"select\" | \"preview\";\n\n/** Inputs for the canonical membership-card renderer. */\nexport interface MembershipCardsProps {\n /** Server-authoritative tiers, including the exact amount checkout charges. */\n tiers: readonly JoinTier[];\n /** Reviewed presentation only; it cannot override tier price or identity. */\n document: MembershipPageDocument;\n /** Link to the Chapter application flow. Only the tier query is appended. */\n applicationPath?: string;\n /** Links for a marketing page, buttons for JoinIsland, inert actions in CMS preview. */\n mode?: MembershipCardsMode;\n selectedTierId?: string | null;\n onSelectTier?: (tierId: string) => void;\n className?: string;\n ariaLabel?: string;\n}\n\n/** Editable renderer defaults. A CMS can expose these exact tokens without duplicating the contract. */\nexport const MEMBERSHIP_CARD_TOKEN_DEFAULTS = Object.freeze({\n \"--ui-membership-grid-gap\": \"1.4rem\",\n \"--ui-membership-card-padding\": \"2rem 1.7rem 1.8rem\",\n \"--ui-membership-card-radius\": \"1rem\",\n \"--ui-membership-badge-size\": \".66rem\",\n \"--ui-membership-name-size\": \"1.5rem\",\n \"--ui-membership-price-size\": \"1.85rem\",\n \"--ui-membership-summary-size\": \".83rem\",\n \"--ui-membership-body-size\": \".93rem\",\n \"--ui-membership-line-height\": \"1.5\",\n \"--ui-membership-capacity-size\": \"3.625rem\",\n} as const);\n\n/** One of the supported Chapter membership renderer design-token names. */\nexport type MembershipCardTokenName = keyof typeof MEMBERSHIP_CARD_TOKEN_DEFAULTS;\n\nconst MEMBERSHIP_CARDS_CSS = `\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}]{font-family:var(--ui-font-sans,ui-sans-serif,system-ui,sans-serif);color:var(--ui-text,#17252d)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-grid{display:grid;grid-template-columns:1fr;gap:var(--ui-membership-grid-gap,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-grid-gap\"]});align-items:stretch}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-card{position:relative;display:flex;min-width:0;flex-direction:column;padding:var(--ui-membership-card-padding,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-card-padding\"]});border:1px solid var(--ui-border,#d9e1e1);border-radius:var(--ui-membership-card-radius,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-card-radius\"]});background:var(--ui-surface,#fff);color:var(--ui-membership-body,var(--ui-text-muted,#66777f));box-shadow:var(--ui-membership-card-shadow,0 1px 2px rgb(13 40 66 / .05))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-card[data-variant=featured]{border-color:var(--ui-membership-featured-border,var(--ui-accent,#168c84));box-shadow:var(--ui-membership-featured-shadow,0 2px 8px rgb(13 40 66 / .08),0 18px 40px rgb(13 40 66 / .13))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-badge{position:absolute;top:-.75rem;left:1.25rem;padding:.4rem .85rem;border-radius:999px;background:var(--ui-membership-featured-badge,var(--ui-accent,#168c84));color:var(--ui-on-accent,#fff);font-family:var(--ui-font-mono,ui-monospace,monospace);font-size:var(--ui-membership-badge-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-badge-size\"]});font-weight:700;letter-spacing:.1em;text-transform:uppercase}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] [data-variant=supporting] .chapter-membership-badge{background:var(--ui-accent-strong,#0d3b52)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-name{margin:.3rem 0 0;font-family:var(--ui-font-display,ui-serif,Georgia,serif);font-size:var(--ui-membership-name-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-name-size\"]});font-weight:var(--ui-font-weight-display,400);letter-spacing:-.01em;line-height:1.08;color:var(--ui-membership-heading,var(--ui-text,#17252d))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-offer{margin:.7rem 0 0}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-offer[data-with-capacity=true]{display:flex;align-items:center;gap:.9rem;margin-top:1rem}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-price-stack{min-width:0}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-price-row{display:flex;flex-wrap:wrap;align-items:end;gap:.4rem;margin:0}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-price{font-family:var(--ui-font-numeral,var(--ui-font-display,ui-serif,Georgia,serif));font-size:var(--ui-membership-price-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-price-size\"]});font-variant-numeric:tabular-nums;line-height:1;color:var(--ui-membership-heading,var(--ui-text,#17252d))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] [data-variant=featured] .chapter-membership-price{font-size:var(--ui-membership-featured-price-size,1.75rem)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-compare{font-size:var(--ui-membership-compare-size,1.05rem);color:var(--ui-membership-summary,var(--ui-text-muted,#66777f));text-decoration:line-through}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-billing{padding-bottom:.1rem;color:var(--ui-membership-body,var(--ui-text-muted,#66777f));font-size:var(--ui-membership-billing-size,.85rem)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-price-eyebrow{margin:0 0 .3rem;font-family:var(--ui-font-mono,ui-monospace,monospace);font-size:var(--ui-membership-badge-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-badge-size\"]});font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--ui-accent-strong,#0d3b52)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-summary{margin:.6rem 0 0;color:var(--ui-membership-summary,var(--ui-text-muted,#66777f));font-size:var(--ui-membership-summary-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-summary-size\"]});line-height:var(--ui-membership-line-height,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-line-height\"]})}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-benefit.ui-markdown,[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-callout .ui-markdown{font:inherit;color:inherit}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-price-note{margin:.7rem 0 0;font-family:var(--ui-font-display,ui-serif,Georgia,serif);font-size:var(--ui-membership-price-note-size,.9rem);font-style:italic;line-height:1.45;color:var(--ui-membership-body,var(--ui-text-muted,#66777f))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-price-note strong{font-style:normal;font-weight:500;color:var(--ui-membership-action,var(--ui-accent,#168c84))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-capacity{display:grid;place-items:center;flex:0 0 auto;width:var(--ui-membership-capacity-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-capacity-size\"]});height:var(--ui-membership-capacity-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-capacity-size\"]});border:2px solid var(--ui-membership-capacity-border,var(--ui-accent,#168c84));border-radius:50%;background:var(--ui-membership-capacity-bg,var(--ui-surface-2,#f1f6fa));color:var(--ui-membership-action,var(--ui-accent-strong,#0d3b52))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-capacity strong{font-family:var(--ui-font-numeral,var(--ui-font-display,ui-serif,Georgia,serif));font-size:1.35rem;font-weight:400;line-height:1}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-capacity small{font-family:var(--ui-font-mono,ui-monospace,monospace);font-size:.55rem;letter-spacing:.1em;text-transform:uppercase}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-benefits{display:grid;gap:0;margin:1.3rem 0 0;padding:0;list-style:none;font-size:var(--ui-membership-body-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-body-size\"]});line-height:var(--ui-membership-line-height,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-line-height\"]})}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-benefits li{display:grid;grid-template-columns:15px minmax(0,1fr);gap:.6rem;align-items:start;padding:.36rem 0}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-check{display:grid;place-items:center;width:15px;height:15px;margin-top:.24rem;border-radius:50%;background:var(--ui-accent-soft,#edf7fa);color:var(--ui-membership-check,var(--ui-accent-strong,#0d3b52));font-size:.62rem;font-weight:800}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-callout{margin:1.3rem 0 0;padding:1rem 1.1rem;border-radius:var(--ui-radius-md,.75rem);background:var(--ui-membership-callout-bg,var(--ui-surface-2,#f1f6fa));color:var(--ui-membership-body,var(--ui-text-muted,#66777f));font-size:var(--ui-membership-callout-body-size,.87rem);line-height:1.5}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-callout-label{margin:0;font-family:var(--ui-font-mono,ui-monospace,monospace);font-size:var(--ui-membership-badge-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-badge-size\"]});font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--ui-membership-action,var(--ui-accent,#168c84))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-callout .ui-markdown>:first-child{margin:.45rem 0 0;font-family:var(--ui-font-display,ui-serif,Georgia,serif);font-size:var(--ui-membership-callout-quote-size,1.05rem);font-style:italic;line-height:1.35;color:var(--ui-membership-heading,var(--ui-text,#17252d))}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-callout .ui-markdown>:last-child:not(:first-child){margin:.5rem 0 0}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-callout strong{color:var(--ui-membership-heading,var(--ui-text,#17252d));font-weight:500}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-action{display:inline-flex;align-items:center;justify-content:flex-start;gap:.4rem;margin-top:auto;padding:1.6rem 0 0;border:0;background:transparent;color:var(--ui-membership-action,var(--ui-accent,#168c84));font:inherit;font-size:var(--ui-membership-action-size,.95rem);font-weight:500;text-decoration:none;cursor:pointer}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-action[aria-current=true]{color:var(--ui-accent,#168c84)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-action:focus-visible{outline:none;box-shadow:var(--ui-focus,0 0 0 3px var(--ui-accent-soft,#dff5f1));border-radius:var(--ui-radius-sm,.2rem)}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-footnote{margin:1.5rem auto 0;max-width:70ch;color:var(--ui-text-muted,#66777f);font-size:var(--ui-membership-summary-size,${MEMBERSHIP_CARD_TOKEN_DEFAULTS[\"--ui-membership-summary-size\"]});text-align:center}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .ui-markdown>:first-child{margin-top:0}\n[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .ui-markdown>:last-child{margin-bottom:0}\n@media (min-width:56rem){[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-grid{grid-template-columns:repeat(var(--chapter-membership-columns,3),minmax(0,1fr))}}\n@media (prefers-reduced-motion:no-preference){[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-action{transition:color .16s ease,transform .16s ease}[data-chapter-membership=${MEMBERSHIP_PAGE_RENDERER}] .chapter-membership-action:hover{transform:translateX(.2rem)}}\n`;\n\nconst safeApplicationPath = (value: string | undefined): string => {\n if (typeof value !== \"string\" || !/^\\/(?!\\/)[^\\s#\\\\]*$/.test(value)) return \"/apply\";\n try {\n const resolved = new URL(value, \"https://chapter.invalid\");\n return resolved.origin === \"https://chapter.invalid\" ? `${resolved.pathname}${resolved.search}` : \"/apply\";\n } catch {\n return \"/apply\";\n }\n};\n\n/** Derive a safe same-origin application link for one authoritative tier id. */\nexport function membershipApplicationHref(applicationPath: string | undefined, tierId: string): string {\n const path = safeApplicationPath(applicationPath);\n return `${path}${path.includes(\"?\") ? \"&\" : \"?\"}tier=${encodeURIComponent(tierId)}`;\n}\n\nfunction TierAction(props: {\n tierId: string;\n label: string;\n mode: MembershipCardsMode;\n selected: boolean;\n applicationPath?: string;\n onSelectTier?: (tierId: string) => void;\n}): JSX.Element {\n if (props.mode === \"select\") {\n return <button type=\"button\" className=\"chapter-membership-action\" aria-current={props.selected ? \"true\" : undefined} onClick={() => props.onSelectTier?.(props.tierId)}>{props.label}<span aria-hidden=\"true\">→</span></button>;\n }\n if (props.mode === \"preview\") {\n return <span className=\"chapter-membership-action\" aria-disabled=\"true\">{props.label}<span aria-hidden=\"true\">→</span></span>;\n }\n return <a className=\"chapter-membership-action\" href={membershipApplicationHref(props.applicationPath, props.tierId)}>{props.label}<span aria-hidden=\"true\">→</span></a>;\n}\n\nfunction TierCard(props: {\n tier: JoinTier;\n presentation: MembershipTierPresentation;\n mode: MembershipCardsMode;\n selected: boolean;\n applicationPath?: string;\n onSelectTier?: (tierId: string) => void;\n}): JSX.Element {\n const { tier, presentation } = props;\n const summary = presentation.summaryMarkdown ?? tier.blurb;\n const action = presentation.ctaLabel ?? (tier.free ? \"Join for free\" : `Choose ${tier.name}`);\n return (\n <article className=\"chapter-membership-card\" data-tier-id={tier.id} data-variant={presentation.variant ?? \"standard\"}>\n {presentation.badge ? <div className=\"chapter-membership-badge\">{presentation.badge}</div> : null}\n <h3 className=\"chapter-membership-name\">{tier.name}</h3>\n <div className=\"chapter-membership-offer\" data-with-capacity={presentation.capacity ? \"true\" : undefined}>\n {presentation.capacity ? <div className=\"chapter-membership-capacity\" aria-label={`${presentation.capacity.total} ${presentation.capacity.label ?? \"available\"}`}><strong>{presentation.capacity.total.toLocaleString(\"en-US\")}</strong><small>{presentation.capacity.label ?? \"available\"}</small></div> : null}\n <div className=\"chapter-membership-price-stack\">\n {presentation.priceEyebrow ? <p className=\"chapter-membership-price-eyebrow\">{presentation.priceEyebrow}</p>\n : tier.founding ? <p className=\"chapter-membership-price-eyebrow\">Founding member rate</p> : null}\n <div className=\"chapter-membership-price-row\">\n {tier.founding ? <span className=\"chapter-membership-compare\">{fmtMoney(tier.priceCents)}</span>\n : presentation.compareAtPriceCents !== undefined ? <span className=\"chapter-membership-compare\">{fmtMoney(presentation.compareAtPriceCents)}</span> : null}\n <span className=\"chapter-membership-price\">{tier.free ? \"Free\" : fmtMoney(tier.founding ? tier.founding.dueTodayCents : tier.priceCents)}</span>\n {!tier.free && presentation.billingLabel ? <span className=\"chapter-membership-billing\">{presentation.billingLabel}</span> : null}\n </div>\n </div>\n </div>\n {presentation.priceNoteMarkdown ? <Markdown className=\"chapter-membership-price-note\" source={presentation.priceNoteMarkdown} /> : null}\n {summary ? <Markdown className=\"chapter-membership-summary\" source={summary} /> : null}\n {presentation.benefits?.length ? <ul className=\"chapter-membership-benefits\">{presentation.benefits.map((benefit, index) => <li key={`${tier.id}-benefit-${index}`}><span className=\"chapter-membership-check\" aria-hidden=\"true\">✓</span><Markdown className=\"chapter-membership-benefit\" source={benefit} /></li>)}</ul> : null}\n {presentation.callout ? <aside className=\"chapter-membership-callout\">{presentation.callout.label ? <p className=\"chapter-membership-callout-label\">{presentation.callout.label}</p> : null}<Markdown source={presentation.callout.bodyMarkdown} /></aside> : null}\n <TierAction tierId={tier.id} label={action} mode={props.mode} selected={props.selected} applicationPath={props.applicationPath} onSelectTier={props.onSelectTier} />\n </article>\n );\n}\n\n/**\n * Render the reviewed membership document against live Chapter tiers.\n *\n * The document controls order and bounded presentation. Names, prices,\n * free/paid state, and application tier ids always come from `tiers`, making\n * the component safe for both a follower's live page and a hub's exact preview.\n */\nexport function MembershipCards(props: MembershipCardsProps): JSX.Element {\n const document = membershipPageDocument(props.document, { tiers: props.tiers });\n const byId = new Map(props.tiers.map((tier) => [tier.id, tier]));\n const mode = props.mode ?? \"link\";\n return (\n <section className={[\"chapter-membership\", props.className].filter(Boolean).join(\" \")} data-chapter-membership={MEMBERSHIP_PAGE_RENDERER} aria-label={props.ariaLabel ?? \"Membership options\"}>\n <style>{MEMBERSHIP_CARDS_CSS}</style>\n <div className=\"chapter-membership-grid\" style={{ \"--chapter-membership-columns\": String(Math.min(document.tiers.length, 3)) }}>\n {document.tiers.map((presentation) => {\n const tier = byId.get(presentation.tierId)!;\n return <TierCard key={tier.id} tier={tier} presentation={presentation} mode={mode} selected={props.selectedTierId === tier.id} applicationPath={props.applicationPath} onSelectTier={props.onSelectTier} />;\n })}\n </div>\n {document.footnoteMarkdown ? <Markdown className=\"chapter-membership-footnote\" source={document.footnoteMarkdown} /> : null}\n </section>\n );\n}\n","/** The first stable, shared Chapter membership-page renderer contract. */\nexport const MEMBERSHIP_PAGE_RENDERER = \"membership-cards-v1\" as const;\n\n/** Fixed visual emphasis choices supported by the versioned card renderer. */\nexport type MembershipTierVariant = \"standard\" | \"featured\" | \"supporting\";\n\n/** A bounded, token-rendered aside within one membership card. */\nexport interface MembershipTierCallout {\n label?: string;\n bodyMarkdown: string;\n}\n\n/** Scarcity copy displayed without changing tier availability or checkout. */\nexport interface MembershipTierCapacity {\n total: number;\n label?: string;\n}\n\n/**\n * Presentation attached to one server-authoritative membership tier.\n *\n * Price, free/paid state, identity, and application targeting deliberately do\n * not live here. They are resolved from the public Chapter join config so\n * authored marketing copy can never change what checkout charges.\n */\nexport interface MembershipTierPresentation {\n tierId: string;\n variant?: MembershipTierVariant;\n badge?: string;\n summaryMarkdown?: string;\n priceEyebrow?: string;\n compareAtPriceCents?: number;\n billingLabel?: string;\n priceNoteMarkdown?: string;\n capacity?: MembershipTierCapacity;\n benefits?: readonly string[];\n callout?: MembershipTierCallout;\n ctaLabel?: string;\n}\n\n/** A bounded document that can be reviewed once and rendered by any Chapter host. */\nexport interface MembershipPageDocument {\n schemaVersion: 1;\n renderer: typeof MEMBERSHIP_PAGE_RENDERER;\n tiers: readonly MembershipTierPresentation[];\n footnoteMarkdown?: string;\n}\n\n/** Minimal server-authoritative tier identity and charged amount used during validation. */\nexport interface MembershipTierAuthority {\n id: string;\n priceCents: number;\n}\n\n/** Live tier authority used to reject missing, unknown, or misleading presentation. */\nexport interface MembershipPageValidationOptions {\n /** When supplied, every live tier must occur exactly once in the document. */\n tiers?: readonly MembershipTierAuthority[];\n}\n\n/** A normalized document or the complete actionable list of validation failures. */\nexport type MembershipPageValidationResult =\n | { ok: true; value: MembershipPageDocument }\n | { ok: false; errors: readonly string[] };\n\nconst TIER_ID = /^[a-z][a-z0-9-]{0,79}$/;\nconst VARIANTS = new Set<MembershipTierVariant>([\"standard\", \"featured\", \"supporting\"]);\nconst ROOT_KEYS = new Set([\"schemaVersion\", \"renderer\", \"tiers\", \"footnoteMarkdown\"]);\nconst TIER_KEYS = new Set([\n \"tierId\", \"variant\", \"badge\", \"summaryMarkdown\", \"priceEyebrow\",\n \"compareAtPriceCents\", \"billingLabel\", \"priceNoteMarkdown\", \"capacity\",\n \"benefits\", \"callout\", \"ctaLabel\",\n]);\nconst CALLOUT_KEYS = new Set([\"label\", \"bodyMarkdown\"]);\nconst CAPACITY_KEYS = new Set([\"total\", \"label\"]);\nconst MAX_TIERS = 20;\nconst MAX_BENEFITS = 24;\nconst MAX_MARKDOWN = 65_536;\nconst MAX_LABEL = 160;\n\nconst objectRecord = (value: unknown): Record<string, unknown> | null =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null;\n\nfunction rejectUnknownKeys(\n value: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n path: string,\n errors: string[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) errors.push(`${path}.${key} is not supported`);\n }\n}\n\nfunction boundedString(\n value: unknown,\n path: string,\n errors: string[],\n max: number,\n required = false,\n): string | undefined {\n if (value === undefined) {\n if (required) errors.push(`${path} is required`);\n return undefined;\n }\n if (typeof value !== \"string\") {\n errors.push(`${path} must be a string`);\n return undefined;\n }\n const text = value.trim();\n if (required && !text) errors.push(`${path} is required`);\n if (text.length > max) errors.push(`${path} must be at most ${max.toLocaleString(\"en-US\")} characters`);\n return text;\n}\n\n/**\n * Validate and normalize a membership-page document without evaluating code,\n * accepting HTML, or allowing authored links/styles. Markdown slots are later\n * rendered by @odla-ai/ui's bounded safe Markdown component.\n */\nexport function validateMembershipPageDocument(\n input: unknown,\n options: MembershipPageValidationOptions = {},\n): MembershipPageValidationResult {\n const errors: string[] = [];\n const root = objectRecord(input);\n if (!root) return { ok: false, errors: [\"document must be an object\"] };\n rejectUnknownKeys(root, ROOT_KEYS, \"document\", errors);\n if (root.schemaVersion !== 1) errors.push(\"document.schemaVersion must be 1\");\n if (root.renderer !== MEMBERSHIP_PAGE_RENDERER) {\n errors.push(`document.renderer must be \\\"${MEMBERSHIP_PAGE_RENDERER}\\\"`);\n }\n if (!Array.isArray(root.tiers)) errors.push(\"document.tiers must be an array\");\n const rawTiers = Array.isArray(root.tiers) ? root.tiers : [];\n if (Array.isArray(root.tiers) && rawTiers.length === 0) errors.push(\"document.tiers must include at least one tier\");\n if (rawTiers.length > MAX_TIERS) errors.push(`document.tiers supports at most ${MAX_TIERS} entries`);\n\n const authority = new Map((options.tiers ?? []).map((tier) => [tier.id, tier]));\n const seen = new Set<string>();\n const tiers: MembershipTierPresentation[] = [];\n for (const [index, raw] of rawTiers.slice(0, MAX_TIERS).entries()) {\n const path = `document.tiers[${index}]`;\n const item = objectRecord(raw);\n if (!item) {\n errors.push(`${path} must be an object`);\n continue;\n }\n rejectUnknownKeys(item, TIER_KEYS, path, errors);\n const tierId = boundedString(item.tierId, `${path}.tierId`, errors, 80, true) ?? \"\";\n if (tierId && !TIER_ID.test(tierId)) errors.push(`${path}.tierId must be a lowercase kebab-case id`);\n if (seen.has(tierId)) errors.push(`${path}.tierId duplicates \\\"${tierId}\\\"`);\n seen.add(tierId);\n if (authority.size && !authority.has(tierId)) errors.push(`${path}.tierId \\\"${tierId}\\\" is not an offered tier`);\n\n const variant = item.variant;\n if (variant !== undefined && (typeof variant !== \"string\" || !VARIANTS.has(variant as MembershipTierVariant))) {\n errors.push(`${path}.variant must be standard, featured, or supporting`);\n }\n const compareAt = item.compareAtPriceCents;\n if (compareAt !== undefined && (!Number.isInteger(compareAt) || Number(compareAt) < 0 || Number(compareAt) > 100_000_000)) {\n errors.push(`${path}.compareAtPriceCents must be an integer from 0 to 100,000,000`);\n }\n const actual = authority.get(tierId)?.priceCents;\n if (Number.isInteger(compareAt) && actual !== undefined && Number(compareAt) <= actual) {\n errors.push(`${path}.compareAtPriceCents must be greater than the authoritative tier price`);\n }\n\n let benefits: string[] | undefined;\n if (item.benefits !== undefined) {\n if (!Array.isArray(item.benefits)) errors.push(`${path}.benefits must be an array`);\n else {\n if (item.benefits.length > MAX_BENEFITS) errors.push(`${path}.benefits supports at most ${MAX_BENEFITS} entries`);\n benefits = item.benefits.slice(0, MAX_BENEFITS).flatMap((benefit, benefitIndex) => {\n const text = boundedString(benefit, `${path}.benefits[${benefitIndex}]`, errors, 2_000, true);\n return text ? [text] : [];\n });\n }\n }\n\n let callout: MembershipTierCallout | undefined;\n if (item.callout !== undefined) {\n const rawCallout = objectRecord(item.callout);\n if (!rawCallout) errors.push(`${path}.callout must be an object`);\n else {\n rejectUnknownKeys(rawCallout, CALLOUT_KEYS, `${path}.callout`, errors);\n const bodyMarkdown = boundedString(rawCallout.bodyMarkdown, `${path}.callout.bodyMarkdown`, errors, MAX_MARKDOWN, true);\n const label = boundedString(rawCallout.label, `${path}.callout.label`, errors, MAX_LABEL);\n if (bodyMarkdown) callout = { ...(label ? { label } : {}), bodyMarkdown };\n }\n }\n\n let capacity: MembershipTierCapacity | undefined;\n if (item.capacity !== undefined) {\n const rawCapacity = objectRecord(item.capacity);\n if (!rawCapacity) errors.push(`${path}.capacity must be an object`);\n else {\n rejectUnknownKeys(rawCapacity, CAPACITY_KEYS, `${path}.capacity`, errors);\n const total = rawCapacity.total;\n if (!Number.isInteger(total) || Number(total) < 1 || Number(total) > 1_000_000) {\n errors.push(`${path}.capacity.total must be an integer from 1 to 1,000,000`);\n }\n const label = boundedString(rawCapacity.label, `${path}.capacity.label`, errors, MAX_LABEL);\n if (Number.isInteger(total) && Number(total) >= 1 && Number(total) <= 1_000_000) {\n capacity = { total: Number(total), ...(label ? { label } : {}) };\n }\n }\n }\n\n const badge = boundedString(item.badge, `${path}.badge`, errors, MAX_LABEL);\n const summaryMarkdown = boundedString(item.summaryMarkdown, `${path}.summaryMarkdown`, errors, MAX_MARKDOWN);\n const priceEyebrow = boundedString(item.priceEyebrow, `${path}.priceEyebrow`, errors, MAX_LABEL);\n const billingLabel = boundedString(item.billingLabel, `${path}.billingLabel`, errors, MAX_LABEL);\n const priceNoteMarkdown = boundedString(item.priceNoteMarkdown, `${path}.priceNoteMarkdown`, errors, MAX_MARKDOWN);\n const ctaLabel = boundedString(item.ctaLabel, `${path}.ctaLabel`, errors, MAX_LABEL);\n tiers.push({\n tierId,\n ...(typeof variant === \"string\" && VARIANTS.has(variant as MembershipTierVariant) ? { variant: variant as MembershipTierVariant } : {}),\n ...(badge ? { badge } : {}),\n ...(summaryMarkdown ? { summaryMarkdown } : {}),\n ...(priceEyebrow ? { priceEyebrow } : {}),\n ...(Number.isInteger(compareAt) ? { compareAtPriceCents: Number(compareAt) } : {}),\n ...(billingLabel ? { billingLabel } : {}),\n ...(priceNoteMarkdown ? { priceNoteMarkdown } : {}),\n ...(capacity ? { capacity } : {}),\n ...(benefits ? { benefits } : {}),\n ...(callout ? { callout } : {}),\n ...(ctaLabel ? { ctaLabel } : {}),\n });\n }\n if (authority.size) {\n for (const tierId of authority.keys()) {\n if (!seen.has(tierId)) errors.push(`document.tiers is missing offered tier \\\"${tierId}\\\"`);\n }\n }\n const footnoteMarkdown = boundedString(root.footnoteMarkdown, \"document.footnoteMarkdown\", errors, MAX_MARKDOWN);\n if (errors.length) return { ok: false, errors };\n return {\n ok: true,\n value: {\n schemaVersion: 1,\n renderer: MEMBERSHIP_PAGE_RENDERER,\n tiers,\n ...(footnoteMarkdown ? { footnoteMarkdown } : {}),\n },\n };\n}\n\n/** Validate a document or fail closed with all actionable validation errors. */\nexport function membershipPageDocument(\n input: unknown,\n options: MembershipPageValidationOptions = {},\n): MembershipPageDocument {\n const result = validateMembershipPageDocument(input, options);\n if (!result.ok) throw new TypeError(`Invalid membership page document: ${result.errors.join(\"; \")}`);\n return result.value;\n}\n"],"mappings":"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","names":["useEffect","useState","useState","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","useEffect","useEffect","useState","useState","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","useEffect","useMemo","useState","Fragment","jsx","jsxs","useState","useEffect","useMemo","Fragment","jsx","jsxs","useState","useEffect","useEffect","useRef","useState","useEffect","useState","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","jsx","jsxs","useState","Fragment","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","error","useEffect","useState","jsx","jsxs","useState","useEffect","error","useEffect","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","Markdown","jsx","jsxs","Markdown","document"]}