@odla-ai/chapter 0.34.0 → 0.35.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/dist/index.d.cts CHANGED
@@ -2068,6 +2068,59 @@ declare function createSignupControlEnvelope(document: SignupControlDocument): P
2068
2068
  /** Validate and normalize one complete desired signup state. */
2069
2069
  declare function validateSignupControlDocument(input: unknown): SignupControlValidation;
2070
2070
 
2071
+ /** Stable marker a static document can place where managed signup tokens belong. */
2072
+ declare const SIGNUP_CONTROL_THEME_MARKER: "<!--odla:signup-control-theme-->";
2073
+ /** Stable id shared by the server renderer and browser hydration helper. */
2074
+ declare const SIGNUP_CONTROL_THEME_STYLE_ID: "odla-signup-control-theme";
2075
+ /** The active revision shape exposed by `GET /api/join-config`. */
2076
+ interface SignupControlThemeRevision {
2077
+ revision: number;
2078
+ digest: string;
2079
+ theme?: SignupControlTheme;
2080
+ }
2081
+ /** Identity shared by initial HTML, response caching, and client hydration. */
2082
+ interface SignupControlThemeMetadata {
2083
+ source: "active" | "bootstrap";
2084
+ revision: number | null;
2085
+ digest: string | null;
2086
+ /** Include this value in any host-owned cache key for transformed HTML. */
2087
+ cacheKey: string;
2088
+ }
2089
+ /** A validated style block ready to place in an HTML head. */
2090
+ interface SignupControlThemeHead {
2091
+ css: string;
2092
+ head: string;
2093
+ metadata: SignupControlThemeMetadata;
2094
+ }
2095
+ /** Minimal DOM surface required by {@link hydrateSignupControlTheme}. */
2096
+ interface SignupControlThemeStyleTarget {
2097
+ textContent: string | null;
2098
+ getAttribute(name: string): string | null;
2099
+ setAttribute(name: string, value: string): void;
2100
+ removeAttribute(name: string): void;
2101
+ }
2102
+ /** Host-owned fallback inputs shared by server rendering and hydration. */
2103
+ interface SignupControlThemeOptions {
2104
+ /** Local site-owned tokens used only when no active managed revision exists. */
2105
+ bootstrapTokens?: Readonly<Record<string, string | number>>;
2106
+ }
2107
+ /**
2108
+ * Render validated signup-control tokens for the initial HTML head. Passing
2109
+ * `null` emits the deterministic local bootstrap state; it never performs I/O.
2110
+ */
2111
+ declare function renderSignupControlThemeHead(revision: SignupControlThemeRevision | null, options?: SignupControlThemeOptions): SignupControlThemeHead;
2112
+ /**
2113
+ * Replace the stable marker (preferred), an earlier Chapter style block, or the
2114
+ * closing head tag. The returned HTML always contains exactly one managed block.
2115
+ */
2116
+ declare function injectSignupControlThemeHead(html: string, rendered: SignupControlThemeHead, marker?: string): string;
2117
+ /**
2118
+ * Apply a newly fetched revision to the server-rendered style element. When the
2119
+ * revision and digest already match, this performs no writes and returns false,
2120
+ * so hydration cannot cause a visual token change.
2121
+ */
2122
+ declare function hydrateSignupControlTheme(target: SignupControlThemeStyleTarget, revision: SignupControlThemeRevision | null, options?: SignupControlThemeOptions): boolean;
2123
+
2071
2124
  /** A presentation overlay parsed from the constrained membership Markdown convention. */
2072
2125
  type MembershipTierMarkdownResult = {
2073
2126
  ok: true;
@@ -2101,4 +2154,4 @@ interface ChapterPromotionInput {
2101
2154
  /** Export the provider-independent pieces of one exact active signup revision. */
2102
2155
  declare function exportChapterPromotion(input: ChapterPromotionInput): Promise<PromotionAdapterResult>;
2103
2156
 
2104
- export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterSignupControl, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type ResolvedSignupControl, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, SIGNUP_CONTROL_PATH, SIGNUP_CONTROL_SCHEMA_VERSION, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type SignupControlApplication, type SignupControlDocument, type SignupControlEnvelope, type SignupControlPolicy, type SignupControlReceipt, type SignupControlRejection, type SignupControlTheme, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, canonicalSignupControl, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
2157
+ export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterSignupControl, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type ResolvedSignupControl, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, SIGNUP_CONTROL_PATH, SIGNUP_CONTROL_SCHEMA_VERSION, SIGNUP_CONTROL_THEME_MARKER, SIGNUP_CONTROL_THEME_STYLE_ID, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type SignupControlApplication, type SignupControlDocument, type SignupControlEnvelope, type SignupControlPolicy, type SignupControlReceipt, type SignupControlRejection, type SignupControlTheme, type SignupControlThemeHead, type SignupControlThemeMetadata, type SignupControlThemeOptions, type SignupControlThemeRevision, type SignupControlThemeStyleTarget, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, canonicalSignupControl, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, hydrateSignupControlTheme, injectSignupControlThemeHead, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSignupControlThemeHead, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
package/dist/index.d.ts CHANGED
@@ -2068,6 +2068,59 @@ declare function createSignupControlEnvelope(document: SignupControlDocument): P
2068
2068
  /** Validate and normalize one complete desired signup state. */
2069
2069
  declare function validateSignupControlDocument(input: unknown): SignupControlValidation;
2070
2070
 
2071
+ /** Stable marker a static document can place where managed signup tokens belong. */
2072
+ declare const SIGNUP_CONTROL_THEME_MARKER: "<!--odla:signup-control-theme-->";
2073
+ /** Stable id shared by the server renderer and browser hydration helper. */
2074
+ declare const SIGNUP_CONTROL_THEME_STYLE_ID: "odla-signup-control-theme";
2075
+ /** The active revision shape exposed by `GET /api/join-config`. */
2076
+ interface SignupControlThemeRevision {
2077
+ revision: number;
2078
+ digest: string;
2079
+ theme?: SignupControlTheme;
2080
+ }
2081
+ /** Identity shared by initial HTML, response caching, and client hydration. */
2082
+ interface SignupControlThemeMetadata {
2083
+ source: "active" | "bootstrap";
2084
+ revision: number | null;
2085
+ digest: string | null;
2086
+ /** Include this value in any host-owned cache key for transformed HTML. */
2087
+ cacheKey: string;
2088
+ }
2089
+ /** A validated style block ready to place in an HTML head. */
2090
+ interface SignupControlThemeHead {
2091
+ css: string;
2092
+ head: string;
2093
+ metadata: SignupControlThemeMetadata;
2094
+ }
2095
+ /** Minimal DOM surface required by {@link hydrateSignupControlTheme}. */
2096
+ interface SignupControlThemeStyleTarget {
2097
+ textContent: string | null;
2098
+ getAttribute(name: string): string | null;
2099
+ setAttribute(name: string, value: string): void;
2100
+ removeAttribute(name: string): void;
2101
+ }
2102
+ /** Host-owned fallback inputs shared by server rendering and hydration. */
2103
+ interface SignupControlThemeOptions {
2104
+ /** Local site-owned tokens used only when no active managed revision exists. */
2105
+ bootstrapTokens?: Readonly<Record<string, string | number>>;
2106
+ }
2107
+ /**
2108
+ * Render validated signup-control tokens for the initial HTML head. Passing
2109
+ * `null` emits the deterministic local bootstrap state; it never performs I/O.
2110
+ */
2111
+ declare function renderSignupControlThemeHead(revision: SignupControlThemeRevision | null, options?: SignupControlThemeOptions): SignupControlThemeHead;
2112
+ /**
2113
+ * Replace the stable marker (preferred), an earlier Chapter style block, or the
2114
+ * closing head tag. The returned HTML always contains exactly one managed block.
2115
+ */
2116
+ declare function injectSignupControlThemeHead(html: string, rendered: SignupControlThemeHead, marker?: string): string;
2117
+ /**
2118
+ * Apply a newly fetched revision to the server-rendered style element. When the
2119
+ * revision and digest already match, this performs no writes and returns false,
2120
+ * so hydration cannot cause a visual token change.
2121
+ */
2122
+ declare function hydrateSignupControlTheme(target: SignupControlThemeStyleTarget, revision: SignupControlThemeRevision | null, options?: SignupControlThemeOptions): boolean;
2123
+
2071
2124
  /** A presentation overlay parsed from the constrained membership Markdown convention. */
2072
2125
  type MembershipTierMarkdownResult = {
2073
2126
  ok: true;
@@ -2101,4 +2154,4 @@ interface ChapterPromotionInput {
2101
2154
  /** Export the provider-independent pieces of one exact active signup revision. */
2102
2155
  declare function exportChapterPromotion(input: ChapterPromotionInput): Promise<PromotionAdapterResult>;
2103
2156
 
2104
- export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterSignupControl, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type ResolvedSignupControl, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, SIGNUP_CONTROL_PATH, SIGNUP_CONTROL_SCHEMA_VERSION, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type SignupControlApplication, type SignupControlDocument, type SignupControlEnvelope, type SignupControlPolicy, type SignupControlReceipt, type SignupControlRejection, type SignupControlTheme, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, canonicalSignupControl, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
2157
+ export { type AccountModel, type AdminNotificationTrigger, type Applicant, type ApplicationBookingPatch, type ApplicationRecord, type ApplicationSummary, type Attr, type AttrType, CHAPTER_PROMOTION_ADAPTER, type Chapter, type ChapterApplication, type ChapterAuth, type ChapterBrand, type ChapterConfig, type ChapterCopy, type ChapterCopyInput, type ChapterDb, type ChapterEmails, type ChapterIntegrationDescriptor, type ChapterIntegrationOptions, type ChapterMode, type ChapterNetwork, type ChapterNetworkReader, type ChapterNetworkTarget, type ChapterOperations, type ChapterPipeline, type ChapterPolicy, type ChapterPrices, type ChapterPromotionInput, type ChapterRunbookHints, type ChapterScheduling, type ChapterSends, type ChapterSignupControl, type ChapterTier, type ChapterTierConfig, type ClerkInviteInput, type ClerkMetadataInput, type ClerkResult, type ClerkUserInput, type ClerkUserRecord, type CompiledChapterBrandTokens, DEFAULT_CHAPTER_COPY, DEFAULT_SHARE_FIELDS, type DashboardMetricData, type DashboardMetricSeries, type DbOp, type DbRules, type DbSchema, type DeliveryDecision, type EmailGroup, type EmailTemplate, type EmailTemplateRow, type Entity, type ExistingMeeting, type GuardResult, type IntegrationDescriptor, type IntegrationProvision, type IntegrationSecret, type IntegrationSetting, type IntegrationSync, type JoinConfigGroup, type JoinConfigTier, type LeaderCrmOptions, type LeaderFormationConfig, type LiveEvent, MEMBERSHIP_PAGE_RENDERER, type MailSender, type MeetingForReconcile, type MeetingRecord, type MeetingReschedulePatch, type MemberApplication, type MemberSession, type MembershipPageDocument, type MembershipPageValidationOptions, type MembershipPageValidationResult, type MembershipTierAuthority, type MembershipTierCallout, type MembershipTierCapacity, type MembershipTierMarkdownResult, type MembershipTierPresentation, type MembershipTierVariant, type NetworkRecord, type NetworkRecordNote, type NetworkRecordPage, type NetworkRollup, type NetworkRollupTarget, type NetworkSharedNote, type NetworkSnapshot, type NewMeetingRow, type NotifyDeps, type NotifyInput, type NotifyResult, type PaymentsGroup, type ProjectionDeps, type ReconcileDecision, type ResolvedApplication, type ResolvedAuth, type ResolvedLeaderFormation, type ResolvedNetwork, type ResolvedNetworkReader, type ResolvedNetworkTarget, type ResolvedOperations, type ResolvedPipeline, type ResolvedScheduling, type ResolvedSends, type ResolvedSignupControl, type RoleChangeContext, type Rule, SCHEDULING_DEFAULTS, SIGNUP_CONTROL_PATH, SIGNUP_CONTROL_SCHEMA_VERSION, SIGNUP_CONTROL_THEME_MARKER, SIGNUP_CONTROL_THEME_STYLE_ID, type SchedulingErrors, type SecretMode, type SecretStore, type SessionUser, type SharedBusiness, type SharedPerson, type SharedRecord, type SharedRecordV1, type SharedRecordV2, type SignupControlApplication, type SignupControlDocument, type SignupControlEnvelope, type SignupControlPolicy, type SignupControlReceipt, type SignupControlRejection, type SignupControlTheme, type SignupControlThemeHead, type SignupControlThemeMetadata, type SignupControlThemeOptions, type SignupControlThemeRevision, type SignupControlThemeStyleTarget, type SignupControlTier, type SignupControlValidation, type StripeEvent, type StripeResult, type SubmitResult, type TierGroup, type TierGroupRow, type WebhookEvent, applicantProfile, applicationBookingUpdate, applicationSummary, applyMembershipTierMarkdown, backfillCrm, bookingDecision, brandTokens, bucketSeries, buildGroupSeed, buildTierSeeds, canApprove, canBook, canChangeRole, canTransition, canceledPatch, canonicalSignupControl, chapterBrandFromTokens, chapterDb, clampArray, clerkGetUser, clerkGetUserByEmail, clerkIntegration, clerkInviteRequest, clerkListUsers, clerkSetRole, clerkUserRequest, createChapterIntegration, createClerkInvitation, createClerkUser, createSignupControlEnvelope, dashboardMetricData, defaultCrm, defineChapter, emailGroupFrom, endForSlot, exportChapterPromotion, findApplicationRef, findTier, firstPaymentPatch, formatChapterCopy, formationFields, getVaultSecret, hasDisclaimerAck, hydrateSignupControlTheme, injectSignupControlThemeHead, introIdempotencyKey, isAdminRole, isAlreadySent, isReconcilable, isSlotAvailable, isValidEmail, joinConfig, joinConfigTiers, leaderCrmConfig, loadOfferableTiers, loadTiers, meetingCreateRow, meetingRescheduleUpdate, memberApplication, memberSession, membershipPageDocument, membershipTierPresentationFromMarkdown, networkSourceTag, normalizeSharedRecord, normalizeWebhookEvent, offerableTiers, paymentsReady, personInputFromApp, planDelivery, projectApplicant, projectSharedRecord, reconcileMeetings, refundedPatch, render, renderSignupControlThemeHead, renderSummary, renderTemplateBody, renewalPatch, resolveApplication, resolveAuth, resolveChapterCopy, resolveLeaderFormation, resolvePipeline, resolveScheduling, resolveSignupControl, resolveTiers, roleFromClaim, sendTemplated, sharedPersonInput, sharedRecordFromCrm, signupControlDigest, slotWindow, stageIndex, stripeCall, subAnnualCents, submitApplication, subscriptionIdempotencyKey, syncApplicationToCrm, tierIsFree, tierPayable, updateClerkUserMetadata, updateClerkUserMetadataByEmail, validateMembershipPageDocument, validateScheduling, validateSignupControlDocument, webhookMutationId };
package/dist/index.js CHANGED
@@ -2894,12 +2894,18 @@ function themeOf(value, errors) {
2894
2894
  }
2895
2895
  unknownKeys(input, /* @__PURE__ */ new Set(["tokens"]), "document.theme", errors);
2896
2896
  if (Object.keys(tokens).length > 256) errors.push("document.theme.tokens supports at most 256 entries");
2897
+ let serializedLength = 0;
2897
2898
  for (const [key, token] of Object.entries(tokens)) {
2898
- if (!/^--[a-z0-9-]{1,100}$/.test(key)) errors.push(`document.theme.tokens.${key} must be a CSS custom-property name`);
2899
- if (typeof token !== "string" && typeof token !== "number" || String(token).length > 1e3) {
2900
- errors.push(`document.theme.tokens.${key} must be a bounded string or number`);
2899
+ if (!/^--ui-[a-z0-9][a-z0-9-]{0,94}$/.test(key)) {
2900
+ errors.push(`document.theme.tokens.${key} must be an allowlisted --ui-* custom property`);
2901
+ }
2902
+ const rendered = String(token).trim();
2903
+ serializedLength += key.length + rendered.length + 4;
2904
+ if (typeof token !== "string" && typeof token !== "number" || typeof token === "number" && !Number.isFinite(token) || !rendered || rendered.length > 1e3 || /[\u0000-\u001f\u007f\\<>{};]|\/\*|\*\/|(?:^|[^a-z])(?:url|expression)\s*\(|@import/i.test(rendered)) {
2905
+ errors.push(`document.theme.tokens.${key} must be a bounded breakout-safe CSS value`);
2901
2906
  }
2902
2907
  }
2908
+ if (serializedLength > 65536) errors.push("document.theme.tokens exceeds the serialized size bound");
2903
2909
  return { tokens };
2904
2910
  }
2905
2911
  function validateSignupControlDocument(input) {
@@ -2951,6 +2957,116 @@ function validateSignupControlDocument(input) {
2951
2957
  } };
2952
2958
  }
2953
2959
 
2960
+ // src/signup-control-theme.ts
2961
+ var SIGNUP_CONTROL_THEME_MARKER = "<!--odla:signup-control-theme-->";
2962
+ var SIGNUP_CONTROL_THEME_STYLE_ID = "odla-signup-control-theme";
2963
+ var TOKEN_NAME = /^--ui-[a-z0-9][a-z0-9-]{0,94}$/;
2964
+ var DIGEST = /^sha256:[0-9a-f]{64}$/;
2965
+ var UNSAFE_VALUE = /[\u0000-\u001f\u007f\\<>{};]|\/\*|\*\/|(?:^|[^a-z])(?:url|expression)\s*\(|@import/i;
2966
+ var MAX_TOKENS = 256;
2967
+ var MAX_VALUE_LENGTH = 1e3;
2968
+ var MAX_SERIALIZED_LENGTH = 65536;
2969
+ function validatedTokens(input) {
2970
+ const entries = Object.entries(input ?? {});
2971
+ if (entries.length > MAX_TOKENS) {
2972
+ throw new TypeError(`signup-control theme supports at most ${MAX_TOKENS} tokens`);
2973
+ }
2974
+ const tokens = {};
2975
+ let serializedLength = 0;
2976
+ for (const [name, raw] of entries.sort(([left], [right]) => left.localeCompare(right))) {
2977
+ if (!TOKEN_NAME.test(name)) {
2978
+ throw new TypeError(`signup-control theme token "${name}" must be an allowlisted --ui-* property`);
2979
+ }
2980
+ if (typeof raw !== "string" && typeof raw !== "number" || typeof raw === "number" && !Number.isFinite(raw)) {
2981
+ throw new TypeError(`signup-control theme token "${name}" must be a finite string or number`);
2982
+ }
2983
+ const value = String(raw).trim();
2984
+ if (!value || value.length > MAX_VALUE_LENGTH || UNSAFE_VALUE.test(value)) {
2985
+ throw new TypeError(`signup-control theme token "${name}" has an unsafe or oversized value`);
2986
+ }
2987
+ serializedLength += name.length + value.length + 4;
2988
+ if (serializedLength > MAX_SERIALIZED_LENGTH) {
2989
+ throw new TypeError("signup-control theme exceeds the serialized size bound");
2990
+ }
2991
+ tokens[name] = value;
2992
+ }
2993
+ return tokens;
2994
+ }
2995
+ function cssFor(tokens) {
2996
+ const declarations = Object.entries(tokens).map(([name, value]) => ` ${name}: ${value};`);
2997
+ return declarations.length ? `:root {
2998
+ ${declarations.join("\n")}
2999
+ }` : "";
3000
+ }
3001
+ function stateFor(revision, options) {
3002
+ if (!revision) {
3003
+ return {
3004
+ css: cssFor(validatedTokens(options.bootstrapTokens)),
3005
+ metadata: { source: "bootstrap", revision: null, digest: null, cacheKey: "signup-control:bootstrap" }
3006
+ };
3007
+ }
3008
+ if (!Number.isSafeInteger(revision.revision) || revision.revision < 1 || !DIGEST.test(revision.digest)) {
3009
+ throw new TypeError("signup-control theme revision metadata is invalid");
3010
+ }
3011
+ return {
3012
+ css: cssFor(validatedTokens(revision.theme?.tokens)),
3013
+ metadata: {
3014
+ source: "active",
3015
+ revision: revision.revision,
3016
+ digest: revision.digest,
3017
+ cacheKey: `signup-control:${revision.digest}`
3018
+ }
3019
+ };
3020
+ }
3021
+ function attributes(metadata) {
3022
+ return [
3023
+ `id="${SIGNUP_CONTROL_THEME_STYLE_ID}"`,
3024
+ `data-signup-control-source="${metadata.source}"`,
3025
+ `data-signup-control-cache-key="${metadata.cacheKey}"`,
3026
+ ...metadata.revision === null ? [] : [`data-signup-control-revision="${metadata.revision}"`],
3027
+ ...metadata.digest === null ? [] : [`data-signup-control-digest="${metadata.digest}"`]
3028
+ ].join(" ");
3029
+ }
3030
+ function renderSignupControlThemeHead(revision, options = {}) {
3031
+ const { css, metadata } = stateFor(revision, options);
3032
+ return { css, metadata, head: `<style ${attributes(metadata)}>${css}</style>` };
3033
+ }
3034
+ function injectSignupControlThemeHead(html, rendered, marker = SIGNUP_CONTROL_THEME_MARKER) {
3035
+ const existing = /<style\b(?=[^>]*\bid\s*=\s*["']odla-signup-control-theme["'])[^>]*>[\s\S]*?<\/style>/gi;
3036
+ const existingBlocks = html.match(existing) ?? [];
3037
+ if (existingBlocks.length > 1) {
3038
+ throw new TypeError("signup-control theme style block must appear at most once");
3039
+ }
3040
+ if (existingBlocks.length === 1) return html.replace(existing, rendered.head);
3041
+ const markerIndex = html.indexOf(marker);
3042
+ if (markerIndex >= 0) {
3043
+ if (html.indexOf(marker, markerIndex + marker.length) >= 0) {
3044
+ throw new TypeError("signup-control theme marker must appear exactly once");
3045
+ }
3046
+ return `${html.slice(0, markerIndex)}${rendered.head}${html.slice(markerIndex + marker.length)}`;
3047
+ }
3048
+ const closingHead = html.search(/<\/head\s*>/i);
3049
+ if (closingHead < 0) throw new TypeError("signup-control theme requires an HTML head");
3050
+ return `${html.slice(0, closingHead)}${rendered.head}${html.slice(closingHead)}`;
3051
+ }
3052
+ function hydrateSignupControlTheme(target, revision, options = {}) {
3053
+ const next = stateFor(revision, options);
3054
+ const currentSource = target.getAttribute("data-signup-control-source");
3055
+ const currentRevision = target.getAttribute("data-signup-control-revision");
3056
+ const currentDigest = target.getAttribute("data-signup-control-digest");
3057
+ if (currentSource === next.metadata.source && currentRevision === (next.metadata.revision === null ? null : String(next.metadata.revision)) && currentDigest === next.metadata.digest) {
3058
+ return false;
3059
+ }
3060
+ target.textContent = next.css;
3061
+ target.setAttribute("data-signup-control-source", next.metadata.source);
3062
+ target.setAttribute("data-signup-control-cache-key", next.metadata.cacheKey);
3063
+ if (next.metadata.revision === null) target.removeAttribute("data-signup-control-revision");
3064
+ else target.setAttribute("data-signup-control-revision", String(next.metadata.revision));
3065
+ if (next.metadata.digest === null) target.removeAttribute("data-signup-control-digest");
3066
+ else target.setAttribute("data-signup-control-digest", next.metadata.digest);
3067
+ return true;
3068
+ }
3069
+
2954
3070
  // src/membership-markdown.ts
2955
3071
  var MAX_BENEFITS2 = 24;
2956
3072
  var MAX_MARKDOWN2 = 65536;
@@ -3171,6 +3287,8 @@ export {
3171
3287
  SCHEDULING_DEFAULTS,
3172
3288
  SIGNUP_CONTROL_PATH,
3173
3289
  SIGNUP_CONTROL_SCHEMA_VERSION,
3290
+ SIGNUP_CONTROL_THEME_MARKER,
3291
+ SIGNUP_CONTROL_THEME_STYLE_ID,
3174
3292
  applicantProfile,
3175
3293
  applicationBookingUpdate,
3176
3294
  applicationSummary,
@@ -3214,6 +3332,8 @@ export {
3214
3332
  formationFields,
3215
3333
  getVaultSecret,
3216
3334
  hasDisclaimerAck,
3335
+ hydrateSignupControlTheme,
3336
+ injectSignupControlThemeHead,
3217
3337
  introIdempotencyKey,
3218
3338
  isAdminRole,
3219
3339
  isAlreadySent,
@@ -3243,6 +3363,7 @@ export {
3243
3363
  reconcileMeetings,
3244
3364
  refundedPatch,
3245
3365
  render,
3366
+ renderSignupControlThemeHead,
3246
3367
  renderSummary,
3247
3368
  renderTemplateBody,
3248
3369
  renewalPatch,