{"version":3,"file":"signup-tJwC4lSq.js","sources":["../../../frontend/src/services/FunnelSessionService.ts","../../../frontend/src/services/PromoCodeService.ts","../../../frontend/src/features/signup/api.ts","../../../frontend/src/features/signup/pages/PlanEmailScreen.styles.ts","../../../frontend/src/features/signup/pages/DetailsScreen.styles.ts","../../../frontend/src/features/signup/pages/PlanEmailScreen.tsx","../../../frontend/src/features/signup/pages/DetailsScreen.tsx","../../../frontend/src/services/ScholarshipTierService.ts","../../../frontend/src/features/signup/pages/ScholarshipDiscountPage.styles.ts","../../../frontend/src/features/signup/pages/ScholarshipDiscountPage.tsx","../../../frontend/src/features/signup/pages/ScholarshipIntroPage.styles.ts","../../../frontend/src/features/signup/pages/ScholarshipIntroPage.tsx","../../../frontend/src/services/ScholarshipRequestService.ts","../../../frontend/src/features/signup/funnel.ts","../../../frontend/src/features/signup/pages/ScholarshipRequestPage.styles.ts","../../../frontend/src/features/signup/pages/ScholarshipRequestPage.tsx","../../../frontend/src/features/signup/SignupApp.styles.ts","../../../frontend/src/features/signup/SignupApp.tsx","../../../frontend/src/features/signup/index.tsx"],"sourcesContent":["import { Api } from '@/utils/api';\n\nexport interface FunnelSessionResponse {\n  uuid: string;\n  variant_price: string;\n  variant_copy: string;\n}\n\nexport interface FunnelMintParams {\n  utm_source?: string;\n  utm_medium?: string;\n  utm_campaign?: string;\n  referrer?: string;\n  /** Raw promo code from the landing URL (valid or not), captured for\n   * attribution even when the visitor bounces before signup. */\n  promo_code?: string;\n  /** Sanitized snapshot of the landing URL's query params (see funnel.ts). */\n  landing_query_params?: Record<string, string>;\n}\n\nexport interface FunnelPatch {\n  email?: string;\n  reached_details_at?: string;\n  checkout_canceled_at?: string;\n  consent_text?: string;\n  /** Snapshot of the prices shown on the plan cards, in dollars. Sent once\n   * prices have rendered (deferred from mint). Discounted fields are omitted\n   * when no promo is applied. */\n  price_currency?: string;\n  price_monthly?: number;\n  price_annual?: number;\n  price_monthly_discounted?: number;\n  price_annual_discounted?: number;\n}\n\nexport const FunnelSessionService = {\n  mint(params: FunnelMintParams): Promise<FunnelSessionResponse> {\n    return Api.post<FunnelSessionResponse>('/api/public/b2c/funnel-sessions', params);\n  },\n  update(uuid: string, patch: FunnelPatch): Promise<void> {\n    return Api.patch<void>(`/api/public/b2c/funnel-sessions/${uuid}`, patch);\n  },\n};\n","import { Api } from '@/utils/api';\n\nexport interface PromoPlanDiscount {\n  resulting_price: number | null;\n  amount_off: number | null;\n  percent_off: number | null;\n}\n\n/** Mirrors the backend's PromoCodeResolveSchema. Money fields are dollars. */\nexport interface PromoCodeResolveSchema {\n  valid: boolean;\n  code: string;\n  coupon_name: string | null;\n  monthly: PromoPlanDiscount | null;\n  annual: PromoPlanDiscount | null;\n  is_approved_scholarship: boolean;\n}\n\nexport const PromoCodeService = {\n  resolve(code: string): Promise<PromoCodeResolveSchema> {\n    const query = new URLSearchParams({ code });\n    return Api.get<PromoCodeResolveSchema>(`/api/public/b2c/promo-code?${query.toString()}`);\n  },\n};\n","import { Api } from '@/utils/api';\nimport { CreateAccountResponse, CreateCheckoutSessionResponse, SignupRequest } from './types';\n\nexport function createAccount(data: SignupRequest): Promise<CreateAccountResponse> {\n  return Api.post<CreateAccountResponse>('/api/public/b2c/signup', data);\n}\n\nexport function createCheckoutSession(\n  subscription_uuid: string,\n): Promise<CreateCheckoutSessionResponse> {\n  return Api.post<CreateCheckoutSessionResponse>('/api/public/b2c/checkout', {\n    subscription_uuid,\n  });\n}\n","import { css } from '@/styles/emotion';\n\nconst ACCENT = '#e8836a';\nconst BORDER = '#ece0d8';\nconst INK = '#3b322e';\n\nexport const progressBar = css`\n  display: flex;\n  align-items: center;\n  gap: 7px;\n  margin-bottom: 18px;\n`;\n\nexport const progressSegmentFilled = css`\n  height: 6px;\n  flex: 1;\n  border-radius: 99px;\n  background: ${ACCENT};\n`;\n\nexport const progressSegmentEmpty = css`\n  height: 6px;\n  flex: 1;\n  border-radius: 99px;\n  background: ${BORDER};\n`;\n\nexport const heroPanel = css`\n  position: relative;\n  border-radius: 24px;\n  background: linear-gradient(160deg, #e4f2ef 0%, #fceae2 100%);\n  padding: 18px 18px 0;\n  overflow: hidden;\n  margin-bottom: 22px;\n`;\n\nexport const heroPill = css`\n  position: absolute;\n  top: 14px;\n  left: 14px;\n  background: #fff;\n  color: ${ACCENT};\n  font-weight: 800;\n  font-size: 11.5px;\n  letter-spacing: 0.03em;\n  padding: 6px 11px;\n  border-radius: 99px;\n  box-shadow: 0 2px 8px rgba(59, 50, 46, 0.1);\n  z-index: 2;\n`;\n\nexport const heroImage = css`\n  display: block;\n  width: 78%;\n  max-width: 280px;\n  margin: 6px auto -4px;\n  height: auto;\n`;\n\nexport const heading = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 28px;\n  line-height: 1.15;\n  margin: 0 0 9px;\n  letter-spacing: -0.6px;\n`;\n\nexport const subtext = css`\n  font-size: 15.5px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0 0 22px;\n`;\n\nexport const valuePropCard = css`\n  position: relative;\n  background: #fff;\n  border-radius: 20px;\n  padding: 18px 18px 26px;\n  margin-bottom: 34px;\n  text-align: left;\n`;\n\nexport const valuePropHeadline = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 700;\n  font-size: 16px;\n  margin: 0 0 8px;\n  line-height: 1.3;\n`;\n\nexport const valuePropText = css`\n  font-size: 14px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0;\n`;\n\nexport const valuePropBadge = css`\n  display: flex;\n  align-items: left;\n  gap: 8px;\n  background: #fff;\n  margin-top: 12px;\n`;\n\nexport const valuePropBadgeIcon = css`\n  width: 40px;\n  height: 40px;\n  border-radius: 50%;\n  object-fit: cover;\n  flex-shrink: 0;\n`;\n\nexport const valuePropBadgeText = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-style: italic;\n  font-size: 13px;\n  color: #8a7e76;\n  padding-top: 12px;\n`;\n\nexport const planCardList = css`\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  margin-bottom: 18px;\n`;\n\nconst planCardBase = css`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  padding: 15px 16px;\n  border-radius: 16px;\n  cursor: pointer;\n  transition:\n    background 0.15s,\n    border-color 0.15s,\n    box-shadow 0.15s;\n  color: ${INK};\n  font-family: inherit;\n`;\n\nexport const planCardSelected = css`\n  ${planCardBase};\n  background: #fff7f3;\n  border: 2px solid ${ACCENT};\n  box-shadow: 0 6px 18px rgba(232, 131, 106, 0.16);\n`;\n\nexport const planCardUnselected = css`\n  ${planCardBase};\n  background: #fff;\n  border: 2px solid ${BORDER};\n  box-shadow: 0 1px 2px rgba(59, 50, 46, 0.04);\n`;\n\nexport const planCardWithAnchor = css`\n  flex-direction: column;\n  align-items: stretch;\n  padding-bottom: 12px;\n`;\n\nexport const priceAnchorLine = css`\n  font-size: 12.5px;\n  color: #8a7e76;\n  margin-top: 10px;\n  text-align: left;\n`;\n\nexport const planPriceStrike = css`\n  font-size: 13px;\n  color: #b0a59d;\n  text-decoration: line-through;\n`;\n\nexport const planCardRow = css`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n`;\n\nexport const planCardLeft = css`\n  display: flex;\n  align-items: center;\n  gap: 13px;\n  text-align: left;\n`;\n\nconst radioOuterBase = css`\n  width: 22px;\n  height: 22px;\n  border-radius: 50%;\n  flex-shrink: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: all 0.15s;\n`;\n\nexport const radioOuterSelected = css`\n  ${radioOuterBase};\n  border: 2px solid ${ACCENT};\n  background: ${ACCENT};\n`;\n\nexport const radioOuterUnselected = css`\n  ${radioOuterBase};\n  border: 2px solid #d8ccc3;\n  background: #fff;\n`;\n\nexport const radioDot = css`\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: #fff;\n`;\n\nexport const radioDotVisible = css`\n  ${radioDot};\n  opacity: 1;\n`;\n\nexport const radioDotHidden = css`\n  ${radioDot};\n  opacity: 0;\n`;\n\nexport const planNameRow = css`\n  display: flex;\n  align-items: center;\n  gap: 7px;\n  flex-wrap: wrap;\n`;\n\nexport const planNameText = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 18px;\n`;\n\nexport const saveBadge = css`\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: 0.04em;\n  color: #fff;\n  background: ${ACCENT};\n  padding: 3px 7px;\n  border-radius: 6px;\n`;\n\nexport const saveBadgeDim = css`\n  ${saveBadge};\n  background: #d8ccc3;\n`;\n\nexport const planSubtext = css`\n  font-size: 13px;\n  color: #8a7e76;\n  margin-top: 3px;\n`;\n\nexport const planPriceRight = css`\n  text-align: right;\n  flex-shrink: 0;\n`;\n\nexport const planPriceAmount = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 20px;\n  line-height: 1;\n`;\n\nexport const planPriceUnit = css`\n  font-size: 12px;\n  color: #8a7e76;\n  margin-top: 2px;\n`;\n\nexport const continueButton = css`\n  width: 100%;\n  padding: 16px;\n  border: none;\n  border-radius: 15px;\n  background: ${ACCENT};\n  color: #fff;\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 17px;\n  cursor: pointer;\n  margin-top: 18px;\n  box-shadow: 0 8px 20px rgba(232, 131, 106, 0.28);\n  &:hover {\n    filter: brightness(1.05);\n  }\n`;\n\nexport const continueLegalText = css`\n  text-align: center;\n  font-size: 12.5px;\n  color: #9a8f87;\n  margin-top: 11px;\n`;\n\nexport const scholarshipLine = css`\n  text-align: center;\n  font-size: 12.5px;\n  color: #b0a59d;\n  margin: 14px auto 0;\n`;\n\nexport const scholarshipLink = css`\n  display: inline;\n  background: none;\n  border: none;\n  padding: 0;\n  margin: 0;\n  font-size: inherit;\n  color: inherit;\n  text-decoration: underline;\n  cursor: pointer;\n  font-family: inherit;\n`;\n\nexport const testimonialCard = css`\n  margin-top: 26px;\n  background: #fff;\n  border-radius: 18px;\n  padding: 18px 18px 16px;\n  box-shadow: 0 1px 2px rgba(59, 50, 46, 0.05);\n`;\n\nexport const stars = css`\n  color: #f5b300;\n  font-size: 15px;\n  letter-spacing: 2px;\n  margin-bottom: 7px;\n`;\n\nexport const testimonialText = css`\n  font-size: 14.5px;\n  line-height: 1.55;\n  margin: 0 0 10px;\n  color: #4d453f;\n`;\n\nexport const testimonialAuthor = css`\n  font-size: 12.5px;\n  font-weight: 700;\n  color: #8a7e76;\n`;\n\nexport const trustLine = css`\n  margin-top: 18px;\n  text-align: center;\n  font-size: 12px;\n  color: #b0a59d;\n  letter-spacing: 0.02em;\n`;\n","import { css } from '@/styles/emotion';\n\nconst ACCENT = '#e8836a';\nconst BORDER = '#ece0d8';\nconst INK = '#3b322e';\n\nexport const headerRow = css`\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  margin-bottom: 18px;\n`;\n\nexport const backButton = css`\n  width: 34px;\n  height: 34px;\n  flex-shrink: 0;\n  border-radius: 11px;\n  border: 1.5px solid ${BORDER};\n  background: #fff;\n  color: #5c534d;\n  font-size: 17px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  line-height: 1;\n`;\n\nexport const progressBar = css`\n  display: flex;\n  align-items: center;\n  gap: 7px;\n  flex: 1;\n`;\n\nexport const progressSegmentFilled = css`\n  height: 6px;\n  flex: 1;\n  border-radius: 99px;\n  background: ${ACCENT};\n`;\n\nexport const heading = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 26px;\n  line-height: 1.18;\n  margin: 0 0 7px;\n  letter-spacing: -0.5px;\n`;\n\nexport const subtext = css`\n  font-size: 15px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0 0 24px;\n`;\n\nexport const familyFocusGroup = css`\n  margin-bottom: 22px;\n`;\n\nexport const familyFocusCards = css`\n  display: flex;\n  gap: 11px;\n`;\n\nconst familyFocusCardBase = css`\n  flex: 1;\n  padding: 16px 10px;\n  border-radius: 16px;\n  cursor: pointer;\n  text-align: center;\n  transition: all 0.15s;\n  color: ${INK};\n  font-family: inherit;\n`;\n\nexport const familyFocusCardSelected = css`\n  ${familyFocusCardBase};\n  background: #fff7f3;\n  border: 2px solid ${ACCENT};\n  box-shadow: 0 6px 18px rgba(232, 131, 106, 0.16);\n`;\n\nexport const familyFocusCardUnselected = css`\n  ${familyFocusCardBase};\n  background: #fff;\n  border: 2px solid ${BORDER};\n  box-shadow: 0 1px 2px rgba(59, 50, 46, 0.04);\n`;\n\nexport const familyFocusIconTile = css`\n  width: 48px;\n  height: 48px;\n  border-radius: 15px;\n  background: #fceae2;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin: 0 auto 8px;\n`;\n\nexport const familyFocusIcon = css`\n  width: 27px;\n  height: 27px;\n`;\n\nexport const familyFocusTitle = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 500;\n  font-size: 15.5px;\n`;\n\nexport const familyFocusSubtext = css`\n  font-size: 11.5px;\n  color: #8a7e76;\n  margin-top: 2px;\n  line-height: 1.35;\n`;\n\nexport const familyFocusError = css`\n  font-size: 12.5px;\n  color: #d9694e;\n  margin-top: 8px;\n  font-weight: 600;\n`;\n\nexport const submitButton = css`\n  width: 100%;\n  padding: 16px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  border: none;\n  border-radius: 15px;\n  background: ${ACCENT};\n  color: #fff;\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 17px;\n  cursor: pointer;\n  margin-top: 16px;\n  box-shadow: 0 8px 20px rgba(232, 131, 106, 0.28);\n  &:hover:not(:disabled) {\n    filter: brightness(1.05);\n  }\n`;\n\nexport const submitButtonDisabled = css`\n  ${submitButton};\n  cursor: default;\n  opacity: 0.7;\n`;\n\nexport const legalText = css`\n  text-align: center;\n  font-size: 12px;\n  color: #9a8f87;\n  margin-top: 11px;\n  line-height: 1.5;\n`;\n\nexport const priceStrike = css`\n  text-decoration: line-through;\n  color: #b0a59d;\n`;\n\nexport const checkoutText = css`\n  text-align: center;\n  font-size: 11.5px;\n  color: #b0a59d;\n  margin-top: 7px;\n`;\n\nexport const resumeBanner = css`\n  background: #fff3cd;\n  border: 1px solid #f5c842;\n  border-radius: 10px;\n  padding: 12px 16px;\n  font-size: 13.5px;\n  color: #7a5f00;\n  margin-bottom: 20px;\n  line-height: 1.45;\n`;\n\nexport const apiErrorBanner = css`\n  background: #fdecea;\n  border: 1px solid #f5a7a0;\n  border-radius: 10px;\n  padding: 12px 16px;\n  font-size: 13.5px;\n  color: #c0392b;\n  margin-bottom: 20px;\n  line-height: 1.45;\n`;\n","import React, { useState } from 'react';\nimport { Trans } from '@lingui/react/macro';\nimport { t } from '@lingui/core/macro';\nimport { staticUrl } from '@/utils/staticUrl';\nimport { PromoCodeResolveSchema } from '@/services/PromoCodeService';\nimport { EmailField } from '@/components/SignupFields';\nimport { BillingCycle, PriceMap } from '../types';\nimport { calculateSavePercent, formatAnnualMonthlyEquivalent, formatPrice } from '../pricing';\nimport {\n  heroPanel,\n  heroPill,\n  heroImage,\n  heading,\n  subtext,\n  valuePropCard,\n  valuePropHeadline,\n  valuePropText,\n  valuePropBadge,\n  valuePropBadgeIcon,\n  valuePropBadgeText,\n  planCardList,\n  planCardSelected,\n  planCardUnselected,\n  planCardWithAnchor,\n  planCardRow,\n  planCardLeft,\n  radioOuterSelected,\n  radioOuterUnselected,\n  radioDotVisible,\n  radioDotHidden,\n  planNameRow,\n  planNameText,\n  saveBadge,\n  saveBadgeDim,\n  planSubtext,\n  planPriceRight,\n  planPriceAmount,\n  planPriceUnit,\n  planPriceStrike,\n  continueButton,\n  continueLegalText,\n  scholarshipLine,\n  scholarshipLink,\n  testimonialCard,\n  stars,\n  testimonialText,\n  testimonialAuthor,\n  trustLine,\n} from './PlanEmailScreen.styles';\nimport { resumeBanner } from './DetailsScreen.styles';\n\ninterface Props {\n  plan: BillingCycle;\n  email: string;\n  priceMap: PriceMap;\n  promoDiscount?: PromoCodeResolveSchema | null;\n  onContinue: (plan: BillingCycle, email: string) => void;\n  onScholarship?: (plan: BillingCycle, email: string) => void;\n}\n\nexport const PlanEmailScreen = ({\n  plan,\n  email: initialEmail,\n  priceMap,\n  promoDiscount,\n  onContinue,\n  onScholarship,\n}: Props) => {\n  const [localPlan, setLocalPlan] = useState<BillingCycle>(plan);\n  const [localEmail, setLocalEmail] = useState(initialEmail);\n  const [emailError, setEmailError] = useState(false);\n\n  const hasPromo = promoDiscount?.valid === true;\n  const monthlyPromo = hasPromo ? promoDiscount?.monthly : null;\n  const annualPromo = hasPromo ? promoDiscount?.annual : null;\n\n  const promoMonthlyAmount =\n    monthlyPromo?.resulting_price != null ? formatPrice(monthlyPromo.resulting_price, null) : null;\n  const promoMonthlyPriceLine =\n    monthlyPromo?.resulting_price != null\n      ? formatPrice(monthlyPromo.resulting_price, 'month')\n      : null;\n  const promoAnnualMonthlyAmount =\n    annualPromo?.resulting_price != null\n      ? formatAnnualMonthlyEquivalent(annualPromo.resulting_price)\n      : null;\n  const promoAnnualPriceLine =\n    annualPromo?.resulting_price != null ? formatPrice(annualPromo.resulting_price, 'year') : null;\n\n  const annualSavePercent =\n    monthlyPromo?.resulting_price != null && annualPromo?.resulting_price != null\n      ? calculateSavePercent(monthlyPromo.resulting_price, annualPromo.resulting_price) ?? undefined\n      : hasPromo\n        ? undefined\n        : priceMap.annual.savePercent;\n\n  const localPriceLine =\n    localPlan === 'monthly' && promoMonthlyPriceLine\n      ? promoMonthlyPriceLine\n      : localPlan === 'annual' && promoAnnualPriceLine\n        ? promoAnnualPriceLine\n        : priceMap[localPlan].priceLine;\n\n  const validEmail = (e: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(e.trim());\n\n  const handleContinue = () => {\n    if (!validEmail(localEmail)) {\n      setEmailError(true);\n      return;\n    }\n    onContinue(localPlan, localEmail.trim());\n  };\n\n  const handleScholarship = () => {\n    onScholarship?.(localPlan, localEmail.trim());\n  };\n\n  return (\n    <div>\n      {promoDiscount?.is_approved_scholarship && (\n        <div className={resumeBanner}>\n          <Trans>Congrats! Your scholarship application has been approved.</Trans>\n        </div>\n      )}\n      <div className={heroPanel}>\n        <div className={heroPill}>\n          <Trans>★ 7 DAYS FREE</Trans>\n        </div>\n        <img\n          src={staticUrl('palomita-family.png')}\n          alt={t`A parent and child reading together`}\n          className={heroImage}\n        />\n      </div>\n\n      <h1 className={heading}>\n        <Trans>\n          Read together.\n          <br />\n          Watch them soar.\n        </Trans>\n      </h1>\n      <p className={subtext}>\n        <Trans>\n          Just 15 joyful minutes a day, personalized to your child. Try it free for a week.\n        </Trans>\n      </p>\n\n      <div className={valuePropCard}>\n        <p className={valuePropHeadline}>\n          <Trans>A full month for less than many tutors charge for one hour.</Trans>\n        </p>\n        <p className={valuePropText}>\n          <Trans>\n            Private tutoring can cost $30 per hour or more. Paloma gives your child personalized\n            reading practice all month for $29.99.\n          </Trans>\n        </p>\n        <div className={valuePropBadge}>\n          <img src={staticUrl('plan/palomita-apple.png')} alt=\"\" className={valuePropBadgeIcon} />\n          <span className={valuePropBadgeText}>\n            <Trans>A dollar a day keeps the tutor away!</Trans>\n          </span>\n        </div>\n      </div>\n\n      <div className={planCardList}>\n        <button\n          type=\"button\"\n          onClick={() => setLocalPlan('monthly')}\n          className={`${\n            localPlan === 'monthly' ? planCardSelected : planCardUnselected\n          } ${planCardWithAnchor}`}\n          aria-pressed={localPlan === 'monthly'}\n        >\n          <div className={planCardRow}>\n            <div className={planCardLeft}>\n              <span className={localPlan === 'monthly' ? radioOuterSelected : radioOuterUnselected}>\n                <span className={localPlan === 'monthly' ? radioDotVisible : radioDotHidden} />\n              </span>\n              <div>\n                <div className={planNameText}>\n                  <Trans>Monthly</Trans>\n                </div>\n                <div className={planSubtext}>\n                  {promoMonthlyPriceLine ? (\n                    <Trans>\n                      Free for 7 days, then{' '}\n                      <span className={planPriceStrike}>{priceMap.monthly.priceLine}</span>{' '}\n                      {promoMonthlyPriceLine}\n                    </Trans>\n                  ) : (\n                    <Trans>Free for 7 days, then {priceMap.monthly.priceLine}</Trans>\n                  )}\n                </div>\n              </div>\n            </div>\n            <div className={planPriceRight}>\n              <div className={planPriceAmount}>\n                {promoMonthlyAmount ?? priceMap.monthly.monthlyAmount}\n              </div>\n              <div className={planPriceUnit}>\n                <Trans>/mo</Trans>\n              </div>\n            </div>\n          </div>\n        </button>\n\n        <button\n          type=\"button\"\n          onClick={() => setLocalPlan('annual')}\n          className={localPlan === 'annual' ? planCardSelected : planCardUnselected}\n          aria-pressed={localPlan === 'annual'}\n        >\n          <div className={planCardLeft}>\n            <span className={localPlan === 'annual' ? radioOuterSelected : radioOuterUnselected}>\n              <span className={localPlan === 'annual' ? radioDotVisible : radioDotHidden} />\n            </span>\n            <div>\n              <div className={planNameRow}>\n                <span className={planNameText}>\n                  <Trans>Annual</Trans>\n                </span>\n                {annualSavePercent != null && (\n                  <span className={localPlan === 'annual' ? saveBadge : saveBadgeDim}>\n                    <Trans>SAVE {annualSavePercent}%</Trans>\n                  </span>\n                )}\n              </div>\n              <div className={planSubtext}>\n                {promoAnnualPriceLine ? (\n                  <Trans>\n                    Free for 7 days, then{' '}\n                    <span className={planPriceStrike}>{priceMap.annual.priceLine}</span>{' '}\n                    {promoAnnualPriceLine}\n                  </Trans>\n                ) : (\n                  <Trans>Free for 7 days, then {priceMap.annual.priceLine}</Trans>\n                )}\n              </div>\n            </div>\n          </div>\n          <div className={planPriceRight}>\n            <div className={planPriceAmount}>\n              {promoAnnualMonthlyAmount ?? priceMap.annual.monthlyAmount}\n            </div>\n            <div className={planPriceUnit}>\n              <Trans>/mo</Trans>\n            </div>\n          </div>\n        </button>\n      </div>\n\n      <EmailField\n        value={localEmail}\n        showError={emailError}\n        onChange={(value) => {\n          setLocalEmail(value);\n          setEmailError(false);\n        }}\n      />\n\n      <button type=\"button\" onClick={handleContinue} className={continueButton}>\n        <Trans>Get started today</Trans>\n      </button>\n      <div className={continueLegalText}>\n        <Trans>7 days free, then {localPriceLine} · Cancel anytime</Trans>\n      </div>\n      {onScholarship && (\n        <div className={scholarshipLine}>\n          <span>\n            <Trans>Paloma is free for all families that can't afford it.</Trans>{' '}\n          </span>\n          <button type=\"button\" onClick={handleScholarship} className={scholarshipLink}>\n            <Trans>Request a scholarship.</Trans>\n          </button>\n        </div>\n      )}\n\n      <div className={testimonialCard}>\n        <div className={stars}>★★★★★</div>\n        <p className={testimonialText}>\n          <Trans>\n            &ldquo;My daughter sees herself in the stories — she was so excited to read them.\n            It&apos;s amazing.&rdquo;\n          </Trans>\n        </p>\n        <div className={testimonialAuthor}>\n          <Trans>Paloma parent, NYC</Trans>\n        </div>\n      </div>\n\n      <div className={trustLine}>\n        <Trans>Trusted by families and schools across the country</Trans>\n      </div>\n    </div>\n  );\n};\n","import React, { useState } from 'react';\nimport { Trans } from '@lingui/react/macro';\nimport { staticUrl } from '@/utils/staticUrl';\nimport { PromoCodeResolveSchema } from '@/services/PromoCodeService';\nimport {\n  ChildFields,\n  ParentNameFields,\n  PhoneField,\n  SmsConsentCheckbox,\n  fieldLabel,\n} from '@/components/SignupFields';\nimport { BillingCycle, FamilyFocus, SignupState } from '../types';\nimport { formatPrice } from '../pricing';\nimport {\n  heading,\n  subtext,\n  familyFocusGroup,\n  familyFocusCards,\n  familyFocusCardSelected,\n  familyFocusCardUnselected,\n  familyFocusIconTile,\n  familyFocusIcon,\n  familyFocusTitle,\n  familyFocusSubtext,\n  familyFocusError,\n  submitButton,\n  submitButtonDisabled,\n  legalText,\n  priceStrike,\n  checkoutText,\n  resumeBanner,\n  apiErrorBanner,\n} from './DetailsScreen.styles';\n\ninterface Props {\n  plan: BillingCycle;\n  firstName: string;\n  lastName: string;\n  phoneNumber: string;\n  childName: string;\n  grade: string;\n  familyFocus: FamilyFocus | null;\n  tos: boolean;\n  priceLine: string;\n  trialEnd: string;\n  /** Resolved discount for a `?promo_code=` URL param (see `SignupApp`).\n   * Only ever discounts the monthly base price (mirrors how the backend\n   * resolves it) — null/invalid renders the normal full-price confirmation. */\n  promoDiscount?: PromoCodeResolveSchema | null;\n  isScholarshipPromoEntry?: boolean;\n  /** Selected scholarship coupon from `/scholarship/discounts`. */\n  scholarshipDiscount?: { label: string; resultingPrice: number; basePriceLine: string } | null;\n  submitting: boolean;\n  isResuming?: boolean;\n  apiError?: string | null;\n  onChange: <K extends keyof SignupState>(key: K, val: SignupState[K]) => void;\n  onSubmit: () => void;\n}\n\nexport const DetailsScreen = ({\n  plan,\n  firstName,\n  lastName,\n  phoneNumber,\n  childName,\n  grade,\n  familyFocus,\n  tos,\n  priceLine,\n  trialEnd,\n  promoDiscount,\n  scholarshipDiscount,\n  isScholarshipPromoEntry = false,\n  submitting,\n  isResuming = false,\n  apiError = null,\n  onChange,\n  onSubmit,\n}: Props) => {\n  const [tried, setTried] = useState(false);\n\n  const planPromo = plan === 'annual' ? promoDiscount?.annual : promoDiscount?.monthly;\n  const promoDiscountedPriceLine =\n    promoDiscount?.valid && planPromo?.resulting_price != null\n      ? formatPrice(planPromo.resulting_price, plan === 'annual' ? 'year' : 'month')\n      : null;\n  const scholarshipDiscountedPriceLine =\n    scholarshipDiscount != null ? formatPrice(scholarshipDiscount.resultingPrice, 'month') : null;\n\n  const handleSubmit = () => {\n    const ok =\n      firstName.trim() &&\n      lastName.trim() &&\n      phoneNumber.trim() &&\n      childName.trim() &&\n      grade &&\n      familyFocus &&\n      tos;\n    if (!ok) {\n      setTried(true);\n      return;\n    }\n    onSubmit();\n  };\n\n  return (\n    <div>\n      {isScholarshipPromoEntry && (\n        <div className={resumeBanner}>\n          <Trans>Congrats! Your scholarship application has been approved.</Trans>\n        </div>\n      )}\n      {isResuming && (\n        <div className={resumeBanner}>\n          <Trans>Payment wasn&apos;t completed — please try again.</Trans>\n        </div>\n      )}\n      {apiError && <div className={apiErrorBanner}>{apiError}</div>}\n      <h1 className={heading}>\n        <Trans>Tell us about your learner</Trans>\n      </h1>\n      <p className={subtext}>\n        <Trans>We&apos;ll personalize every session to your child.</Trans>\n      </p>\n\n      {/* Child name + grade row */}\n      <ChildFields\n        firstName={childName}\n        grade={grade}\n        showErrors={tried}\n        onChange={(field, value) => {\n          // Explicit, exhaustive mapping rather than a catch-all ternary: a\n          // `lastName === undefined` prop above means this screen never\n          // renders a last-name input, but ChildFields' onChange type still\n          // includes 'childLastName'. A ternary that maps \"anything that\n          // isn't grade\" to childName would silently overwrite the child's\n          // first name if a last-name field were ever wired in here later.\n          switch (field) {\n            case 'grade':\n              onChange('grade', value);\n              return;\n            case 'childFirstName':\n              onChange('childName', value);\n              return;\n            case 'childLastName':\n              // No last-name input is rendered on this screen (no `lastName`\n              // prop passed above), so this can't fire today — handled\n              // explicitly instead of falling through so it can't silently\n              // land in the wrong field.\n              return;\n            default: {\n              const unhandled: never = field;\n              return unhandled;\n            }\n          }\n        }}\n      />\n\n      {/* Parent name row */}\n      <ParentNameFields\n        firstName={firstName}\n        lastName={lastName}\n        showErrors={tried}\n        onChange={onChange}\n      />\n\n      {/* Phone number */}\n      <PhoneField\n        value={phoneNumber}\n        showError={tried}\n        onChange={(value) => onChange('phoneNumber', value)}\n      />\n\n      {/* Family focus */}\n      <div className={familyFocusGroup}>\n        <label className={fieldLabel}>\n          <Trans>What should we focus on?</Trans>\n        </label>\n        <div className={familyFocusCards}>\n          <button\n            type=\"button\"\n            onClick={() => onChange('familyFocus', 'reading')}\n            className={\n              familyFocus === 'reading' ? familyFocusCardSelected : familyFocusCardUnselected\n            }\n            aria-pressed={familyFocus === 'reading'}\n          >\n            <div className={familyFocusIconTile}>\n              <img src={staticUrl('family-focus-reading.svg')} alt=\"\" className={familyFocusIcon} />\n            </div>\n            <div className={familyFocusTitle}>\n              <Trans>Reading</Trans>\n            </div>\n            <div className={familyFocusSubtext}>\n              <Trans>Phonics &amp; decodable books</Trans>\n            </div>\n          </button>\n          <button\n            type=\"button\"\n            onClick={() => onChange('familyFocus', 'reading+math')}\n            className={\n              familyFocus === 'reading+math' ? familyFocusCardSelected : familyFocusCardUnselected\n            }\n            aria-pressed={familyFocus === 'reading+math'}\n          >\n            <div className={familyFocusIconTile}>\n              <img src={staticUrl('family-focus-math.svg')} alt=\"\" className={familyFocusIcon} />\n            </div>\n            <div className={familyFocusTitle}>\n              <Trans>Reading &amp; Math</Trans>\n            </div>\n            <div className={familyFocusSubtext}>\n              <Trans>Both skills weekly</Trans>\n            </div>\n          </button>\n        </div>\n        {tried && !familyFocus && (\n          <div className={familyFocusError}>\n            <Trans>Please choose a focus.</Trans>\n          </div>\n        )}\n      </div>\n\n      <SmsConsentCheckbox checked={tos} showError={tried} onToggle={() => onChange('tos', !tos)} />\n\n      {/* Submit */}\n      <button\n        type=\"button\"\n        onClick={handleSubmit}\n        disabled={submitting}\n        aria-busy={submitting}\n        className={submitting ? submitButtonDisabled : submitButton}\n      >\n        <Trans>Start my free week</Trans>\n        {submitting && (\n          <svg\n            className=\"h-4 w-4 animate-spin\"\n            fill=\"none\"\n            viewBox=\"0 0 24 24\"\n            aria-hidden=\"true\"\n            data-testid=\"submit-spinner\"\n          >\n            <circle\n              className=\"opacity-25\"\n              cx=\"12\"\n              cy=\"12\"\n              r=\"10\"\n              stroke=\"currentColor\"\n              strokeWidth=\"4\"\n            />\n            <path\n              className=\"opacity-75\"\n              fill=\"currentColor\"\n              d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n            />\n          </svg>\n        )}\n      </button>\n      <div className={legalText}>\n        {promoDiscountedPriceLine ? (\n          <Trans>\n            Free until {trialEnd} · <span className={priceStrike}>{priceLine}</span>{' '}\n            {promoDiscountedPriceLine} after · Cancel anytime\n          </Trans>\n        ) : scholarshipDiscountedPriceLine ? (\n          <Trans>\n            Free until {trialEnd} ·{' '}\n            <span className={priceStrike}>{scholarshipDiscount!.basePriceLine}</span>{' '}\n            {scholarshipDiscountedPriceLine} after ({scholarshipDiscount!.label}) · Cancel anytime\n          </Trans>\n        ) : (\n          <Trans>\n            Free until {trialEnd} · {priceLine} after · Cancel anytime\n          </Trans>\n        )}\n      </div>\n      <div className={checkoutText}>\n        <Trans>🔒 Next: secure checkout — no charge today</Trans>\n      </div>\n    </div>\n  );\n};\n","import { Api } from '@/utils/api';\n\n/** Mirrors the backend's ScholarshipTierSchema. Money fields are dollars. */\nexport interface ScholarshipTierSchema {\n  key: string;\n  label: string;\n  amount_off: number | null;\n  percent_off: number | null;\n  discount_label: string;\n  variant: string;\n}\n\nexport const ScholarshipTierService = {\n  list(variant?: string): Promise<ScholarshipTierSchema[]> {\n    const query = new URLSearchParams();\n    if (variant) query.set('variant', variant);\n    const qs = query.toString();\n    return Api.get<ScholarshipTierSchema[]>(\n      `/api/public/b2c/scholarship-tiers${qs ? `?${qs}` : ''}`,\n    );\n  },\n};\n","import { css } from '@/styles/emotion';\n\nconst ACCENT = '#e8836a';\nconst BORDER = '#ece0d8';\nconst INK = '#3b322e';\n\nexport const container = css`\n  padding-bottom: 12px;\n`;\n\nexport const heading = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 26px;\n  line-height: 1.18;\n  margin: 0 0 7px;\n  letter-spacing: -0.5px;\n`;\n\nexport const subtext = css`\n  font-size: 15px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0 0 18px;\n`;\n\nexport const anchorLine = css`\n  font-size: 14px;\n  color: #8a7e76;\n  margin: 0 0 16px;\n`;\n\nexport const anchorStrike = css`\n  text-decoration: line-through;\n  color: #b0a59d;\n`;\n\nexport const tierList = css`\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  margin-bottom: 22px;\n`;\n\nconst tierCardBase = css`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  padding: 16px 18px;\n  border-radius: 16px;\n  cursor: pointer;\n  text-align: left;\n  transition:\n    background 0.15s,\n    border-color 0.15s,\n    box-shadow 0.15s;\n  color: ${INK};\n  font-family: inherit;\n`;\n\nexport const tierCardSelected = css`\n  ${tierCardBase};\n  background: #fff7f3;\n  border: 2px solid ${ACCENT};\n  box-shadow: 0 6px 18px rgba(232, 131, 106, 0.16);\n`;\n\nexport const tierCardUnselected = css`\n  ${tierCardBase};\n  background: #fff;\n  border: 2px solid ${BORDER};\n  box-shadow: 0 1px 2px rgba(59, 50, 46, 0.04);\n`;\n\nexport const tierPill = css`\n  display: inline-block;\n  font-size: 11px;\n  font-weight: 800;\n  letter-spacing: 0.03em;\n  color: ${ACCENT};\n  background: #fff0ea;\n  padding: 5px 10px;\n  border-radius: 99px;\n`;\n\nexport const tierPriceGroup = css`\n  display: flex;\n  align-items: baseline;\n  gap: 4px;\n  flex-shrink: 0;\n`;\n\nexport const tierPriceColumn = css`\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n  gap: 4px;\n  flex-shrink: 0;\n`;\n\nexport const tierPriceStrike = css`\n  font-size: 12px;\n  line-height: 1;\n  color: #b0a59d;\n  text-decoration: line-through;\n`;\n\nexport const tierPriceAmount = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 20px;\n  line-height: 1;\n`;\n\nexport const tierPriceUnit = css`\n  font-size: 12px;\n  color: #8a7e76;\n`;\n\nexport const emailLabel = css`\n  display: block;\n  font-size: 13.5px;\n  font-weight: 700;\n  margin-bottom: 7px;\n  color: #5c534d;\n`;\n\nexport const emailInput = css`\n  width: 100%;\n  padding: 14px 15px;\n  border-radius: 13px;\n  border: 1.5px solid ${BORDER};\n  background: #fff;\n  font-size: 15px;\n  color: ${INK};\n  transition: border-color 0.15s;\n  outline: none;\n  font-family: inherit;\n  margin-bottom: 18px;\n  &:focus {\n    border-color: ${ACCENT};\n  }\n`;\n\nexport const emailInputError = css`\n  ${emailInput};\n  border-color: #d9694e;\n`;\n\nexport const emailErrorMsg = css`\n  font-size: 12.5px;\n  color: #d9694e;\n  margin: -12px 0 18px;\n  font-weight: 600;\n`;\n\nexport const continueButton = css`\n  width: 100%;\n  padding: 16px;\n  border: none;\n  border-radius: 15px;\n  background: ${ACCENT};\n  color: #fff;\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 17px;\n  cursor: pointer;\n  box-shadow: 0 8px 20px rgba(232, 131, 106, 0.28);\n  &:hover:not(:disabled) {\n    filter: brightness(1.05);\n  }\n`;\n\nexport const continueButtonDisabled = css`\n  ${continueButton};\n  cursor: default;\n  opacity: 0.5;\n  box-shadow: none;\n`;\n\nexport const contactLine = css`\n  text-align: center;\n  margin-top: 16px;\n`;\n\nexport const contactLink = css`\n  background: none;\n  border: none;\n  padding: 0;\n  margin: 0;\n  font-size: 12.5px;\n  color: #9a8f87;\n  text-decoration: underline;\n  cursor: pointer;\n  font-family: inherit;\n`;\n\nexport const emptyState = css`\n  font-size: 15px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0 0 18px;\n`;\n\nexport const emailConsentText = css`\n  font-size: 12px;\n  line-height: 1.5;\n  color: #9a8f87;\n  margin-top: 8px;\n`;\n","import React, { useEffect, useState } from 'react';\nimport { Trans } from '@lingui/react/macro';\nimport { t } from '@lingui/core/macro';\nimport { ScholarshipTierService, ScholarshipTierSchema } from '@/services/ScholarshipTierService';\nimport { PriceTierService } from '@/services/PriceTierService';\nimport { marketingConsentText } from '@/components/SignupFields';\nimport { formatPrice, scholarshipResultingPrice } from '../pricing';\nimport {\n  container,\n  heading,\n  subtext,\n  tierList,\n  tierCardSelected,\n  tierCardUnselected,\n  tierPill,\n  tierPriceColumn,\n  tierPriceGroup,\n  tierPriceAmount,\n  tierPriceStrike,\n  tierPriceUnit,\n  emailLabel,\n  emailInput,\n  emailInputError,\n  emailErrorMsg,\n  emailConsentText,\n  continueButton,\n  continueButtonDisabled,\n  contactLine,\n  contactLink,\n  emptyState,\n} from './ScholarshipDiscountPage.styles';\n\ninterface Props {\n  /** Email already captured on the plan/email step, carried over so the\n   * family doesn't have to retype it here. */\n  email: string;\n  /** Sets scholarship tier state + `email` into signup form state and\n   * navigates to `/details`. */\n  onContinue: (tierKey: string, email: string, tierLabel: string, resultingPrice: number) => void;\n  /** Navigates to the full-scholarship request screen (`/scholarship/request`). */\n  onContactUs: () => void;\n}\n\nconst MONTHLY_TIER_KEY = 'b2c_default_monthly';\n\nconst validEmail = (email: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n\nexport const ScholarshipDiscountPage = ({\n  email: initialEmail,\n  onContinue,\n  onContactUs,\n}: Props) => {\n  // null = still loading; [] = loaded but nothing configured.\n  const [tiers, setTiers] = useState<ScholarshipTierSchema[] | null>(null);\n  const [basePrice, setBasePrice] = useState<number | null>(null);\n  const [selectedKey, setSelectedKey] = useState<string | null>(null);\n  const [localEmail, setLocalEmail] = useState(initialEmail);\n  const [emailError, setEmailError] = useState(false);\n\n  useEffect(() => {\n    let cancelled = false;\n    ScholarshipTierService.list()\n      .then((fetched) => {\n        if (!cancelled) setTiers(fetched);\n      })\n      .catch(() => {\n        // Not configured yet (or request failed) — show the empty state\n        // rather than crashing the screen.\n        if (!cancelled) setTiers([]);\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, []);\n\n  useEffect(() => {\n    let cancelled = false;\n    PriceTierService.list()\n      .then((all) => {\n        if (cancelled) return;\n        const monthly = all.find((tier) => tier.key === MONTHLY_TIER_KEY);\n        // A live default tier with unit_amount <= 0 means the Stripe sync\n        // hasn't overwritten the seed migration's placeholder yet — treat\n        // that as \"not ready\" rather than anchoring against $0.00.\n        if (monthly && monthly.unit_amount > 0) setBasePrice(monthly.unit_amount);\n      })\n      .catch(() => {\n        // Keep basePrice null; resulting prices render blank until it's known.\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, []);\n\n  const canContinue = selectedKey !== null && validEmail(localEmail);\n  const anchorPrice = basePrice ?? 29.99;\n\n  const handleContinue = () => {\n    if (selectedKey === null) return;\n    if (!validEmail(localEmail)) {\n      setEmailError(true);\n      return;\n    }\n    const selectedTier = tiers?.find((tier) => tier.key === selectedKey);\n    if (!selectedTier) return;\n    onContinue(\n      selectedKey,\n      localEmail.trim(),\n      selectedTier.label,\n      scholarshipResultingPrice(anchorPrice, selectedTier),\n    );\n  };\n\n  if (tiers !== null && tiers.length === 0) {\n    return (\n      <div className={container}>\n        <h1 className={heading}>\n          <Trans>Choose your rate</Trans>\n        </h1>\n        <p className={emptyState}>\n          <Trans>\n            Discounted rates aren&apos;t available right now. If cost is a barrier, contact us and\n            we&apos;ll work something out.\n          </Trans>\n        </p>\n        <div className={contactLine}>\n          <button type=\"button\" onClick={onContactUs} className={contactLink}>\n            <Trans>Need up to a full scholarship? Contact Us</Trans>\n          </button>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div className={container}>\n      <h1 className={heading}>\n        <Trans>Choose your rate</Trans>\n      </h1>\n      <p className={subtext}>\n        <Trans>\n          Get immediate access today — pick a discounted rate and start your child&apos;s free week\n          right now.\n        </Trans>\n      </p>\n\n      <div className={tierList}>\n        {(tiers ?? []).map((tier) => {\n          const resulting = scholarshipResultingPrice(anchorPrice, tier);\n          return (\n            <button\n              key={tier.key}\n              type=\"button\"\n              onClick={() => setSelectedKey(tier.key)}\n              className={selectedKey === tier.key ? tierCardSelected : tierCardUnselected}\n              aria-pressed={selectedKey === tier.key}\n            >\n              <span className={tierPill}>{tier.label}</span>\n              <span className={tierPriceColumn}>\n                <span className={tierPriceGroup}>\n                  <span className={tierPriceAmount}>{formatPrice(resulting, null)}</span>\n                  <span className={tierPriceUnit}>\n                    <Trans>/mo</Trans>\n                  </span>\n                </span>\n                <span className={tierPriceStrike}>{formatPrice(anchorPrice, 'month')}</span>\n              </span>\n            </button>\n          );\n        })}\n      </div>\n\n      <label htmlFor=\"scholarship-email\" className={emailLabel}>\n        <Trans>Email address</Trans>\n      </label>\n      <input\n        id=\"scholarship-email\"\n        type=\"email\"\n        autoComplete=\"email\"\n        placeholder={t`you@email.com`}\n        value={localEmail}\n        onChange={(e) => {\n          setLocalEmail(e.target.value);\n          setEmailError(false);\n        }}\n        className={emailError ? emailInputError : emailInput}\n      />\n      {emailError && (\n        <div className={emailErrorMsg}>\n          <Trans>Please enter a valid email address.</Trans>\n        </div>\n      )}\n      <div className={emailConsentText}>{marketingConsentText()}</div>\n\n      <button\n        type=\"button\"\n        onClick={handleContinue}\n        disabled={!canContinue}\n        aria-disabled={!canContinue}\n        className={canContinue ? continueButton : continueButtonDisabled}\n      >\n        <Trans>Get started today</Trans>\n      </button>\n\n      <div className={contactLine}>\n        <button type=\"button\" onClick={onContactUs} className={contactLink}>\n          <Trans>Need up to a full scholarship? Contact Us</Trans>\n        </button>\n      </div>\n    </div>\n  );\n};\n","import { css } from '@/styles/emotion';\n\nconst ACCENT = '#e8836a';\nconst INK = '#3b322e';\n\nexport const container = css`\n  padding-bottom: 12px;\n`;\n\nexport const paragraph = css`\n  font-size: 16px;\n  line-height: 1.6;\n  color: ${INK};\n  margin: 0 0 18px;\n`;\n\nexport const signature = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-size: 16px;\n  color: ${INK};\n  margin: 0 0 28px;\n`;\n\nexport const requestButton = css`\n  width: 100%;\n  padding: 16px;\n  border: none;\n  border-radius: 15px;\n  background: ${ACCENT};\n  color: #fff;\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 17px;\n  cursor: pointer;\n  box-shadow: 0 8px 20px rgba(232, 131, 106, 0.28);\n  &:hover {\n    filter: brightness(1.05);\n  }\n`;\n","import React from 'react';\nimport { Trans } from '@lingui/react/macro';\nimport { container, paragraph, signature, requestButton } from './ScholarshipIntroPage.styles';\n\ninterface Props {\n  /** Navigates to the discounts step (`/scholarship/discounts`). */\n  onRequestScholarship: () => void;\n}\n\n// Founder letter shown before a family picks a discounted rate. Copy is\n// verbatim per the runbook — do not alter wording/punctuation, including the\n// em dash in paragraph two (\"doing so—if\").\nexport const ScholarshipIntroPage = ({ onRequestScholarship }: Props) => {\n  return (\n    <div className={container}>\n      <p className={paragraph}>\n        <Trans>\n          Paloma's founders grew up in low-income families, and we care deeply about ensuring our\n          product is available to everyone, regardless of financial circumstance.\n        </Trans>\n      </p>\n      <p className={paragraph}>\n        <Trans>\n          Most families pay Paloma's default subscription as an affordable alternative to tutoring.\n          If your family needs financial aid, we're here for you--just choose the subscription level\n          that works for your financial reality.\n        </Trans>\n      </p>\n      <p className={paragraph}>\n        <Trans>\n          Thanks for making a careful choice! Paloma's pricing relies on the honor system so that we\n          can pursue our mission of creating a world in which every caregiver is enabled to help\n          their children thrive.\n        </Trans>\n      </p>\n      <p className={signature}>\n        <Trans>With gratitude,</Trans>\n        <br />\n        Alejandro Gibes de Gac, CEO\n      </p>\n      <button type=\"button\" onClick={onRequestScholarship} className={requestButton}>\n        <Trans>Request a Scholarship</Trans>\n      </button>\n    </div>\n  );\n};\n","import { Api } from '@/utils/api';\n\n/** Request payload for creating a scholarship request. */\nexport interface ScholarshipRequestCreatePayload {\n  phone_number: string;\n  first_name: string;\n  last_name: string;\n  email?: string | null;\n  referral_source: string;\n  story: string;\n  accepted_terms: boolean;\n  requested_price: number;\n  funnel_session_uuid?: string | null;\n}\n\n/** Mirrors the backend's response to POST /b2c/scholarship-requests. */\nexport interface ScholarshipRequestCreatedResponse {\n  uuid: string;\n}\n\nexport const ScholarshipRequestService = {\n  create(payload: ScholarshipRequestCreatePayload): Promise<ScholarshipRequestCreatedResponse> {\n    return Api.post<ScholarshipRequestCreatedResponse>(\n      '/api/public/b2c/scholarship-requests',\n      payload,\n    );\n  },\n};\n","import { FunnelMintParams } from '@/services/FunnelSessionService';\n\nconst TOKEN_KEY = 'b2c_funnel_token';\n\nexport function getFunnelToken(): string | null {\n  return sessionStorage.getItem(TOKEN_KEY);\n}\n\nexport function setFunnelToken(uuid: string): void {\n  sessionStorage.setItem(TOKEN_KEY, uuid);\n}\n\nexport function readUtmParams(): FunnelMintParams {\n  const p = new URLSearchParams(window.location.search);\n  return {\n    utm_source: p.get('utm_source') ?? undefined,\n    utm_medium: p.get('utm_medium') ?? undefined,\n    utm_campaign: p.get('utm_campaign') ?? undefined,\n    referrer: document.referrer || undefined,\n  };\n}\n\n// Query params are attacker/marketer-influenced and land in a long-lived,\n// pghistory-tracked column, so sanitize before persisting: drop keys that\n// commonly carry credentials/PII, cap each value's length, and cap the\n// number of keys.\n// Dropped when the lowercased key CONTAINS any of these stems — catches\n// credential-bearing variants (access_token, id_token, authorization,\n// sessionid, api_key, ...) not just exact keys.\nconst SENSITIVE_KEY_SUBSTRINGS = [\n  'token',\n  'secret',\n  'password',\n  'passwd',\n  'pwd',\n  'session',\n  'oauth',\n  'authorization',\n  'apikey',\n  'api_key',\n  'accesskey',\n  'access_key',\n  'private',\n  'signature',\n  'jwt',\n  'ssn',\n  'cvv',\n];\n// Dropped only on an EXACT (lowercased) match — short/ambiguous keys that\n// would over-match as substrings (e.g. 'key' in 'keyword', 'auth' in 'author').\nconst SENSITIVE_KEY_EXACT = new Set([\n  'email',\n  'phone',\n  'card',\n  'auth',\n  'key',\n  'sig',\n  'resume', // internal Stripe subscription uuid, not marketing attribution\n]);\n\nfunction isSensitiveKey(key: string): boolean {\n  const k = key.toLowerCase();\n  if (SENSITIVE_KEY_EXACT.has(k)) return true;\n  return SENSITIVE_KEY_SUBSTRINGS.some((stem) => k.includes(stem));\n}\n\nconst MAX_PARAM_VALUE_LENGTH = 512;\nconst MAX_PARAMS = 25;\n\nfunction sanitizeQueryParams(search: string): Record<string, string> | undefined {\n  const p = new URLSearchParams(search);\n  const out: Record<string, string> = {};\n  let count = 0;\n  for (const [key, value] of p.entries()) {\n    if (isSensitiveKey(key)) continue;\n    if (key.length > 128) continue;\n    if (count >= MAX_PARAMS) break;\n    out[key] = value.slice(0, MAX_PARAM_VALUE_LENGTH);\n    count += 1;\n  }\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function readLandingParams(): FunnelMintParams {\n  const p = new URLSearchParams(window.location.search);\n  return {\n    ...readUtmParams(),\n    promo_code: p.get('promo_code')?.trim() || undefined,\n    landing_query_params: sanitizeQueryParams(window.location.search),\n  };\n}\n","import { css } from '@/styles/emotion';\n\nconst ACCENT = '#e8836a';\nconst BORDER = '#ece0d8';\nconst INK = '#3b322e';\nconst FIELD_GAP = '12px';\n\nexport const container = css`\n  padding-bottom: 12px;\n`;\n\nexport const heading = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 28px;\n  line-height: 1.18;\n  margin: 0 0 12px;\n  letter-spacing: -0.5px;\n  color: ${INK};\n`;\n\nexport const subtext = css`\n  font-size: 15px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0 0 24px;\n`;\n\nexport const formStack = css`\n  display: flex;\n  flex-direction: column;\n  gap: ${FIELD_GAP};\n`;\n\nexport const nameRow = css`\n  display: flex;\n  gap: ${FIELD_GAP};\n`;\n\nexport const nameField = css`\n  flex: 1;\n  min-width: 0;\n`;\n\nconst fieldBase = css`\n  width: 100%;\n  box-sizing: border-box;\n  padding: 16px;\n  border-radius: 16px;\n  border: 1.5px solid ${BORDER};\n  background: #fff;\n  font-size: 16px;\n  color: ${INK};\n  transition: border-color 0.15s;\n  outline: none;\n  font-family: inherit;\n  margin: 0;\n  &:focus {\n    border-color: ${ACCENT};\n  }\n`;\n\nexport const textInput = fieldBase;\n\nexport const textInputError = css`\n  ${fieldBase};\n  border-color: #d9694e;\n`;\n\nexport const emailFieldGroup = css`\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n`;\n\nexport const emailMicrotext = css`\n  font-size: 12px;\n  line-height: 1.5;\n  color: #9a8f87;\n  margin: 0;\n`;\n\nexport const selectInput = css`\n  ${fieldBase};\n  appearance: none;\n  background-image: linear-gradient(45deg, transparent 50%, #9a8f87 50%),\n    linear-gradient(135deg, #9a8f87 50%, transparent 50%);\n  background-position:\n    calc(100% - 20px) calc(50% + 2px),\n    calc(100% - 14px) calc(50% + 2px);\n  background-size:\n    6px 6px,\n    6px 6px;\n  background-repeat: no-repeat;\n`;\n\nexport const selectPlaceholder = css`\n  ${selectInput};\n  color: #9a8f87;\n`;\n\nexport const selectInputError = css`\n  ${selectInput};\n  border-color: #d9694e;\n`;\n\nexport const sectionBlock = css`\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  margin-top: 12px;\n`;\n\nexport const sectionHeading = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 700;\n  font-size: 16px;\n  line-height: 1.3;\n  color: ${INK};\n  margin: 0;\n`;\n\nexport const sectionSubtext = css`\n  font-size: 13px;\n  line-height: 1.4;\n  color: #8a7e76;\n  margin: 0;\n`;\n\nexport const textareaInput = css`\n  ${fieldBase};\n  resize: vertical;\n  min-height: 120px;\n`;\n\nexport const textareaInputError = css`\n  ${textareaInput};\n  border-color: #d9694e;\n`;\n\nexport const sliderCard = css`\n  margin-top: 8px;\n  margin-bottom: 8px;\n  padding: 24px 18px;\n  border-radius: 18px;\n  border: 2px solid ${ACCENT};\n  background: rgba(232, 131, 106, 0.08);\n`;\n\nexport const sliderRow = css`\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 18px;\n`;\n\nexport const sliderPriceDisplay = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 700;\n  font-size: 32px;\n  line-height: 1;\n  color: ${INK};\n`;\n\nexport const sliderBadge = css`\n  font-size: 12px;\n  font-weight: 700;\n  letter-spacing: 0.03em;\n  color: ${INK};\n  background: #fdf1c8;\n  padding: 4px 10px;\n  border-radius: 100px;\n`;\n\nexport const sliderInput = css`\n  width: 100%;\n  height: 24px;\n  margin: 6px 0;\n  appearance: none;\n  outline: none;\n  cursor: pointer;\n  background: transparent;\n\n  &:focus-visible {\n    outline: 2px solid ${ACCENT};\n    outline-offset: 3px;\n  }\n\n  &::-webkit-slider-runnable-track {\n    height: 6px;\n    border-radius: 99px;\n    background: linear-gradient(\n      to right,\n      ${ACCENT} 0%,\n      ${ACCENT} var(--slider-fill, 0%),\n      ${BORDER} var(--slider-fill, 0%),\n      ${BORDER} 100%\n    );\n  }\n\n  &::-webkit-slider-thumb {\n    appearance: none;\n    width: 24px;\n    height: 24px;\n    margin-top: -9px;\n    border-radius: 50%;\n    background: ${ACCENT};\n    box-shadow: 0 2px 8px rgba(232, 131, 106, 0.4);\n    cursor: pointer;\n  }\n\n  &:focus-visible::-webkit-slider-thumb {\n    box-shadow:\n      0 2px 8px rgba(232, 131, 106, 0.4),\n      0 0 0 4px rgba(232, 131, 106, 0.45);\n  }\n\n  &::-moz-range-track {\n    height: 6px;\n    border-radius: 99px;\n    background: ${BORDER};\n  }\n\n  &::-moz-range-progress {\n    height: 6px;\n    border-radius: 99px;\n    background: ${ACCENT};\n  }\n\n  &::-moz-range-thumb {\n    width: 24px;\n    height: 24px;\n    border-radius: 50%;\n    border: none;\n    background: ${ACCENT};\n    box-shadow: 0 2px 8px rgba(232, 131, 106, 0.4);\n    cursor: pointer;\n  }\n\n  &:focus-visible::-moz-range-thumb {\n    box-shadow:\n      0 2px 8px rgba(232, 131, 106, 0.4),\n      0 0 0 4px rgba(232, 131, 106, 0.45);\n  }\n`;\n\nexport const sliderInputWithFill = (fillPercent: number) => css`\n  ${sliderInput}\n  --slider-fill: ${fillPercent}%;\n`;\n\nexport const sliderScaleRow = css`\n  display: flex;\n  justify-content: space-between;\n  font-size: 12px;\n  color: #9a8f87;\n  margin-top: 10px;\n`;\n\nexport const errorMsg = css`\n  font-size: 12.5px;\n  color: #d9694e;\n  margin: -4px 0 0;\n  font-weight: 600;\n`;\n\nexport const submitBanner = css`\n  font-size: 13.5px;\n  color: #d9694e;\n  background: #fff2ee;\n  border-radius: 12px;\n  padding: 12px 14px;\n`;\n\nexport const submitButton = css`\n  width: 100%;\n  padding: 16px;\n  border: none;\n  border-radius: 15px;\n  background: ${ACCENT};\n  color: #fff;\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 17px;\n  cursor: pointer;\n  box-shadow: 0 8px 20px rgba(232, 131, 106, 0.28);\n  &:hover:not(:disabled) {\n    filter: brightness(1.05);\n  }\n`;\n\nexport const submitButtonDisabled = css`\n  ${submitButton};\n  cursor: default;\n  opacity: 0.5;\n  box-shadow: none;\n`;\n\nexport const confirmationHeading = css`\n  font-family: 'Sofia Pro', sans-serif;\n  font-weight: 600;\n  font-size: 22px;\n  line-height: 1.25;\n  margin: 0 0 10px;\n`;\n\nexport const confirmationText = css`\n  font-size: 15px;\n  line-height: 1.5;\n  color: #8a7e76;\n  margin: 0;\n`;\n","import React, { useEffect, useState } from 'react';\nimport { Trans } from '@lingui/react/macro';\nimport { t } from '@lingui/core/macro';\nimport { ScholarshipRequestService } from '@/services/ScholarshipRequestService';\nimport { PriceTierService } from '@/services/PriceTierService';\nimport { SmsConsentCheckbox } from '@/components/SignupFields';\nimport { getFunnelToken } from '../funnel';\nimport {\n  formatPrice,\n  scholarshipDiscountPercent,\n  scholarshipSliderMaxIndex,\n  scholarshipSliderPrice,\n} from '../pricing';\nimport {\n  container,\n  heading,\n  subtext,\n  formStack,\n  nameRow,\n  nameField,\n  textInput,\n  textInputError,\n  emailFieldGroup,\n  emailMicrotext,\n  selectInput,\n  selectInputError,\n  selectPlaceholder,\n  sectionBlock,\n  textareaInput,\n  textareaInputError,\n  sectionHeading,\n  sectionSubtext,\n  sliderCard,\n  sliderRow,\n  sliderPriceDisplay,\n  sliderBadge,\n  sliderInputWithFill,\n  sliderScaleRow,\n  errorMsg,\n  submitBanner,\n  submitButton,\n  submitButtonDisabled,\n  confirmationHeading,\n  confirmationText,\n} from './ScholarshipRequestPage.styles';\n\nconst MONTHLY_TIER_KEY = 'b2c_default_monthly';\nconst DEFAULT_BASE_PRICE = 29.99;\n\nconst REFERRAL_OTHER_VALUE = 'other';\nconst REFERRAL_OTHER_PREFIX = 'other: ';\nconst REFERRAL_OTHER_DETAIL_MAX = 64 - REFERRAL_OTHER_PREFIX.length;\n\nconst validPhone = (phone: string) => /^[+]?[\\d\\s().-]{7,}$/.test(phone.trim());\nconst validEmail = (email: string) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim());\n\nfunction resolvedReferralSource(source: string, otherDetail: string): string {\n  if (source === REFERRAL_OTHER_VALUE) {\n    return `${REFERRAL_OTHER_PREFIX}${otherDetail.trim()}`;\n  }\n  return source;\n}\n\nfunction referralIsComplete(source: string, otherDetail: string): boolean {\n  if (!source) return false;\n  if (source === REFERRAL_OTHER_VALUE) return otherDetail.trim().length > 0;\n  return true;\n}\n\nconst REFERRAL_OPTIONS = [\n  { label: () => t`Select an option`, value: '' },\n  { label: () => t`Friend or family`, value: 'friend_or_family' },\n  { label: () => t`Social media`, value: 'social_media' },\n  { label: () => t`School or teacher`, value: 'school_or_teacher' },\n  { label: () => t`Search engine`, value: 'search_engine' },\n  { label: () => t`Other`, value: REFERRAL_OTHER_VALUE },\n];\n\ninterface Props {\n  initialEmail?: string;\n}\n\n/** Full-scholarship request screen, reached from the discount-tier picker's\n * \"Contact Us\" link (`/scholarship/request`). Lets a family who can't afford\n * even the cheapest instant tier name any monthly price from the base rate\n * down to $0, then submits a scholarship request for manual review. */\nexport const ScholarshipRequestPage = ({ initialEmail = '' }: Props) => {\n  const [basePrice, setBasePrice] = useState(DEFAULT_BASE_PRICE);\n  const sliderMax = scholarshipSliderMaxIndex(basePrice);\n  const [sliderValue, setSliderValue] = useState(sliderMax);\n  const [sliderTouched, setSliderTouched] = useState(false);\n\n  const [firstName, setFirstName] = useState('');\n  const [lastName, setLastName] = useState('');\n  const [phone, setPhone] = useState('');\n  const [email, setEmail] = useState(initialEmail);\n  const [referralSource, setReferralSource] = useState('');\n  const [referralSourceOther, setReferralSourceOther] = useState('');\n  const [story, setStory] = useState('');\n  const [tos, setTos] = useState(false);\n  const [tried, setTried] = useState(false);\n\n  const [phoneError, setPhoneError] = useState(false);\n  const [submitting, setSubmitting] = useState(false);\n  const [submitError, setSubmitError] = useState<string | null>(null);\n  const [submitted, setSubmitted] = useState(false);\n\n  useEffect(() => {\n    let cancelled = false;\n    PriceTierService.list()\n      .then((tiers) => {\n        if (cancelled) return;\n        const monthly = tiers.find((tier) => tier.key === MONTHLY_TIER_KEY);\n        if (monthly && monthly.unit_amount > 0) {\n          setBasePrice(monthly.unit_amount);\n        }\n      })\n      .catch(() => {\n        // Best-effort: keep the DEFAULT_BASE_PRICE fallback so the page still works.\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, []);\n\n  const effectiveSliderValue = sliderTouched ? sliderValue : sliderMax;\n\n  const requestedPrice = scholarshipSliderPrice(effectiveSliderValue, basePrice);\n  const discountPercent = scholarshipDiscountPercent(requestedPrice, basePrice);\n  const sliderPriceText = requestedPrice <= 0 ? t`Free` : formatPrice(requestedPrice, 'month');\n\n  const sliderFillPercent = sliderMax > 0 ? (effectiveSliderValue / sliderMax) * 100 : 0;\n\n  const formValid =\n    firstName.trim() &&\n    lastName.trim() &&\n    validPhone(phone) &&\n    referralIsComplete(referralSource, referralSourceOther) &&\n    story.trim() &&\n    tos &&\n    (!email.trim() || validEmail(email));\n\n  const handleSubmit = () => {\n    const ok =\n      firstName.trim() &&\n      lastName.trim() &&\n      validPhone(phone) &&\n      referralIsComplete(referralSource, referralSourceOther) &&\n      story.trim() &&\n      tos &&\n      (!email.trim() || validEmail(email));\n    if (!ok) {\n      setTried(true);\n      if (!validPhone(phone)) setPhoneError(true);\n      return;\n    }\n\n    setSubmitting(true);\n    setSubmitError(null);\n    ScholarshipRequestService.create({\n      first_name: firstName.trim(),\n      last_name: lastName.trim(),\n      phone_number: phone.trim(),\n      email: email.trim() || null,\n      referral_source: resolvedReferralSource(referralSource, referralSourceOther),\n      story: story.trim(),\n      accepted_terms: tos,\n      requested_price: requestedPrice,\n      funnel_session_uuid: getFunnelToken(),\n    })\n      .then(() => {\n        setSubmitted(true);\n      })\n      .catch(() => {\n        setSubmitError(t`Something went wrong submitting your request. Please try again.`);\n      })\n      .finally(() => {\n        setSubmitting(false);\n      });\n  };\n\n  if (submitted) {\n    return (\n      <div className={container}>\n        <h1 className={confirmationHeading}>\n          <Trans>Request received</Trans>\n        </h1>\n        <p className={confirmationText}>\n          <Trans>\n            We&apos;ve received your request — we&apos;ll text you when it&apos;s approved.\n          </Trans>\n        </p>\n      </div>\n    );\n  }\n\n  return (\n    <div className={container}>\n      <h1 className={heading}>\n        <Trans>Scholarship Application</Trans>\n      </h1>\n      <p className={subtext}>\n        <Trans>\n          Fill out the form below and someone from the Paloma team will reach out within 10 days if\n          we need more information.\n        </Trans>\n      </p>\n\n      <div className={formStack}>\n        <div className={nameRow}>\n          <div className={nameField}>\n            <input\n              id=\"scholarship-first-name\"\n              aria-label={t`First name`}\n              autoComplete=\"given-name\"\n              placeholder={t`First name *`}\n              value={firstName}\n              onChange={(e) => setFirstName(e.target.value)}\n              className={tried && !firstName.trim() ? textInputError : textInput}\n            />\n          </div>\n          <div className={nameField}>\n            <input\n              id=\"scholarship-last-name\"\n              aria-label={t`Last name`}\n              autoComplete=\"family-name\"\n              placeholder={t`Last name *`}\n              value={lastName}\n              onChange={(e) => setLastName(e.target.value)}\n              className={tried && !lastName.trim() ? textInputError : textInput}\n            />\n          </div>\n        </div>\n\n        <input\n          id=\"scholarship-request-phone\"\n          aria-label={t`Phone number`}\n          type=\"tel\"\n          autoComplete=\"tel\"\n          placeholder={t`Phone number *`}\n          value={phone}\n          onChange={(e) => {\n            setPhone(e.target.value);\n            setPhoneError(false);\n          }}\n          className={tried && !validPhone(phone) ? textInputError : textInput}\n        />\n        {phoneError && (\n          <div className={errorMsg}>\n            <Trans>Please enter a valid phone number.</Trans>\n          </div>\n        )}\n\n        <div className={emailFieldGroup}>\n          <input\n            id=\"scholarship-request-email\"\n            aria-label={t`Email`}\n            type=\"email\"\n            autoComplete=\"email\"\n            placeholder={t`Email`}\n            value={email}\n            onChange={(e) => setEmail(e.target.value)}\n            className={tried && email.trim() && !validEmail(email) ? textInputError : textInput}\n          />\n          <div className={emailMicrotext}>\n            <Trans>\n              By entering your email, you agree to receive account updates and learning tips from\n              Paloma. Unsubscribe anytime.\n            </Trans>\n          </div>\n        </div>\n\n        <select\n          id=\"scholarship-referral\"\n          aria-label={t`Where did you hear about Paloma?`}\n          value={referralSource}\n          onChange={(e) => {\n            const value = e.target.value;\n            setReferralSource(value);\n            if (value !== REFERRAL_OTHER_VALUE) setReferralSourceOther('');\n          }}\n          className={\n            tried && !referralIsComplete(referralSource, referralSourceOther)\n              ? selectInputError\n              : !referralSource\n                ? selectPlaceholder\n                : selectInput\n          }\n        >\n          {REFERRAL_OPTIONS.map(({ label, value }) => (\n            <option key={value || 'placeholder'} value={value}>\n              {value ? label() : t`Where did you hear about Paloma? *`}\n            </option>\n          ))}\n        </select>\n\n        {referralSource === REFERRAL_OTHER_VALUE && (\n          <input\n            id=\"scholarship-referral-other\"\n            aria-label={t`Please tell us more`}\n            type=\"text\"\n            placeholder={t`Please tell us more *`}\n            value={referralSourceOther}\n            maxLength={REFERRAL_OTHER_DETAIL_MAX}\n            onChange={(e) => setReferralSourceOther(e.target.value)}\n            className={tried && !referralSourceOther.trim() ? textInputError : textInput}\n          />\n        )}\n\n        <div className={sectionBlock}>\n          <div className={sectionHeading}>\n            <Trans>We have a limited scholarship fund.</Trans>\n          </div>\n          <div className={sectionSubtext}>\n            <Trans>\n              Tell us a bit about your family and what you&apos;re hoping to get out of Paloma. *\n            </Trans>\n          </div>\n          <textarea\n            id=\"scholarship-story\"\n            aria-label={t`Share your story with us`}\n            rows={4}\n            placeholder={t`Share your story with us...`}\n            value={story}\n            onChange={(e) => setStory(e.target.value)}\n            className={tried && !story.trim() ? textareaInputError : textareaInput}\n          />\n        </div>\n\n        <div className={sectionBlock}>\n          <div className={sectionHeading}>\n            <Trans>Choose a membership cost that works for you.</Trans>\n          </div>\n          <div className={sectionSubtext}>\n            <Trans>Your choice will not affect the likelihood of approving your scholarship.</Trans>\n          </div>\n\n          <div className={sliderCard}>\n            <div className={sliderRow}>\n              <div className={sliderPriceDisplay}>{sliderPriceText}</div>\n              {requestedPrice > 0 && discountPercent > 0 ? (\n                <div className={sliderBadge}>\n                  <Trans>{discountPercent}% DISCOUNT</Trans>\n                </div>\n              ) : null}\n            </div>\n            <input\n              type=\"range\"\n              aria-label={t`What can you afford per month?`}\n              min={0}\n              max={sliderMax}\n              step={1}\n              value={effectiveSliderValue}\n              onChange={(e) => {\n                setSliderTouched(true);\n                setSliderValue(Number(e.target.value));\n              }}\n              className={sliderInputWithFill(sliderFillPercent)}\n            />\n            <div className={sliderScaleRow}>\n              <span>\n                <Trans>Free</Trans>\n              </span>\n              <span>{formatPrice(basePrice, 'month')}</span>\n            </div>\n          </div>\n        </div>\n\n        <SmsConsentCheckbox checked={tos} showError={tried} onToggle={() => setTos(!tos)} />\n\n        {submitError && <div className={submitBanner}>{submitError}</div>}\n\n        <button\n          type=\"button\"\n          onClick={handleSubmit}\n          disabled={!formValid || submitting}\n          aria-disabled={!formValid || submitting}\n          aria-busy={submitting}\n          className={formValid && !submitting ? submitButton : submitButtonDisabled}\n        >\n          <Trans>Submit application</Trans>\n        </button>\n      </div>\n    </div>\n  );\n};\n","import { css } from '@/styles/emotion';\n\nexport const pageRoot = css`\n  min-height: 100vh;\n  background: #fbf4ee;\n  font-family: 'Sofia Pro', sans-serif;\n  color: #3b322e;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  padding: 24px 18px 44px;\n`;\n\nexport const brandHeader = css`\n  display: flex;\n  align-items: center;\n  gap: 9px;\n  margin-bottom: 18px;\n`;\n\nexport const brandName = css`\n  height: 32px;\n  width: auto;\n`;\n\nexport const screenContainer = css`\n  width: 100%;\n  max-width: 430px;\n`;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport {\n  createBrowserRouter,\n  Navigate,\n  Outlet,\n  RouterProvider,\n  ScrollRestoration,\n  useLocation,\n  useNavigate,\n  useOutletContext,\n} from 'react-router-dom';\nimport { I18nProvider } from '@/components/I18nProvider';\nimport { ErrorBoundary } from '@/components';\nimport { useLangStore } from '@/stores';\nimport { staticUrl } from '@/utils/staticUrl';\nimport { t } from '@lingui/core/macro';\nimport { PriceTierService, PriceTierSchema } from '@/services/PriceTierService';\nimport { FunnelSessionService } from '@/services/FunnelSessionService';\nimport { marketingConsentText } from '@/components/SignupFields';\nimport { PromoCodeService, PromoCodeResolveSchema } from '@/services/PromoCodeService';\nimport { createAccount, createCheckoutSession } from './api';\nimport { calculateSavePercent, formatAnnualMonthlyEquivalent, formatPrice } from './pricing';\nimport { BillingCycle, PriceMap, SignupState } from './types';\nimport { PlanEmailScreen } from './pages/PlanEmailScreen';\nimport { DetailsScreen } from './pages/DetailsScreen';\nimport { ScholarshipDiscountPage } from './pages/ScholarshipDiscountPage';\nimport { ScholarshipIntroPage } from './pages/ScholarshipIntroPage';\nimport { ScholarshipRequestPage } from './pages/ScholarshipRequestPage';\nimport { pageRoot, brandHeader, brandName, screenContainer } from './SignupApp.styles';\nimport { getFunnelToken, setFunnelToken, readLandingParams } from './funnel';\n\nconst queryClient = new QueryClient();\n\nexport interface SignupAppProps {\n  lang?: string;\n}\n\nconst MONTHLY_TIER_KEY = 'b2c_default_monthly';\nconst ANNUAL_TIER_KEY = 'b2c_default_annual';\n\n// Rendered until PriceTierService.list() resolves (or if it fails) so the\n// screen never crashes on a missing price and can still submit with the\n// right default tier key.\nconst FALLBACK_PRICE_MAP: PriceMap = {\n  annual: { tierKey: ANNUAL_TIER_KEY, priceLine: '', monthlyAmount: '' },\n  monthly: { tierKey: MONTHLY_TIER_KEY, priceLine: '', monthlyAmount: '' },\n};\n\nexport { formatPrice } from './pricing';\n\n// Default tiers are always paid; a live default tier with unit_amount <= 0\n// means the seed migration's placeholder hasn't been overwritten by the\n// Stripe sync yet. Treat that as \"not ready\" (blank fallback) rather than\n// rendering \"$0.00\" — only discount tiers (not shown on the plan cards) can\n// legitimately be free.\nfunction isReadyDefaultTier(tier: PriceTierSchema | undefined): tier is PriceTierSchema {\n  return !!tier && tier.unit_amount > 0;\n}\n\nfunction buildPriceMap(tiers: PriceTierSchema[]): PriceMap {\n  const byKey = new Map(tiers.map((tier) => [tier.key, tier]));\n  const monthly = byKey.get(MONTHLY_TIER_KEY);\n  const annual = byKey.get(ANNUAL_TIER_KEY);\n\n  const monthlyPlan = isReadyDefaultTier(monthly)\n    ? {\n        tierKey: monthly.key,\n        priceLine: formatPrice(monthly.unit_amount, monthly.recurring_interval),\n        monthlyAmount: formatPrice(monthly.unit_amount, null),\n        unitAmount: monthly.unit_amount,\n        currency: monthly.currency,\n      }\n    : FALLBACK_PRICE_MAP.monthly;\n\n  const annualPlan = isReadyDefaultTier(annual)\n    ? {\n        tierKey: annual.key,\n        priceLine: formatPrice(annual.unit_amount, annual.recurring_interval),\n        monthlyAmount: formatAnnualMonthlyEquivalent(annual.unit_amount),\n        unitAmount: annual.unit_amount,\n        currency: annual.currency,\n        savePercent: isReadyDefaultTier(monthly)\n          ? calculateSavePercent(monthly.unit_amount, annual.unit_amount) ?? undefined\n          : undefined,\n      }\n    : FALLBACK_PRICE_MAP.annual;\n\n  return {\n    monthly: monthlyPlan,\n    annual: annualPlan,\n  };\n}\n\nfunction getTrialEnd() {\n  const d = new Date(Date.now() + 7 * 86400000);\n  return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n\nconst INITIAL_STATE: SignupState = {\n  plan: 'monthly',\n  email: '',\n  firstName: '',\n  lastName: '',\n  phoneNumber: '',\n  childName: '',\n  grade: 'K',\n  familyFocus: 'reading',\n  tos: false,\n  scholarshipTierKey: null,\n  scholarshipLabel: null,\n  scholarshipResultingPrice: null,\n  promoCode: null,\n  promoDiscount: null,\n};\n\nconst FORM_STORAGE_KEY = 'b2c_signup_form';\n\ninterface SignupFlowContext {\n  form: SignupState;\n  setField: <K extends keyof SignupState>(key: K, val: SignupState[K]) => void;\n  isResuming: boolean;\n  submitting: boolean;\n  apiError: string | null;\n  priceMap: PriceMap;\n  priceLine: string;\n  trialEnd: string;\n  promoDiscount: PromoCodeResolveSchema | null;\n  scholarshipDiscount: { label: string; resultingPrice: number; basePriceLine: string } | null;\n  handleSubmit: () => Promise<void>;\n}\n\nconst useSignupFlow = () => useOutletContext<SignupFlowContext>();\n\n// Layout route: owns the form state shared by both steps and renders the\n// brand chrome around them. ScrollRestoration resets scroll to the top on\n// each forward navigation and restores the position on back/forward.\nconst SignupFlow = () => {\n  // Stripe Checkout's cancel_url points back to /join?resume=<uuid>; when\n  // present we skip account creation and go straight to the details step,\n  // restoring the form the user filled in before the redirect.\n  const [subscriptionUuid, setSubscriptionUuid] = useState<string | null>(\n    () => new URLSearchParams(window.location.search).get('resume')?.trim() || null,\n  );\n  const [isResuming] = useState(subscriptionUuid !== null);\n  const [form, setForm] = useState<SignupState>(() => {\n    if (isResuming) {\n      const saved = sessionStorage.getItem(FORM_STORAGE_KEY);\n      if (saved) {\n        try {\n          return JSON.parse(saved) as SignupState;\n        } catch {\n          // ignore malformed storage\n        }\n      }\n    }\n    return INITIAL_STATE;\n  });\n  const [submitting, setSubmitting] = useState(false);\n  const [apiError, setApiError] = useState<string | null>(null);\n  const [priceMap, setPriceMap] = useState<PriceMap>(FALLBACK_PRICE_MAP);\n  // Reactive mirror of the funnel token (minted asynchronously) so the\n  // deferred price-snapshot effect below can depend on it.\n  const [funnelToken, setFunnelTokenState] = useState<string | null>(() => getFunnelToken());\n  // True immediately when there's no `?promo_code=` to wait on; otherwise\n  // flips true once the promo-resolve effect below settles (success,\n  // invalid, or error) so the price-snapshot effect doesn't wait forever.\n  const [promoResolveSettled, setPromoResolveSettled] = useState<boolean>(\n    () => !new URLSearchParams(window.location.search).get('promo_code')?.trim(),\n  );\n\n  // Fetch live price tiers once on mount; fall back to FALLBACK_PRICE_MAP\n  // (blank price lines, default tier keys) if the request fails so the\n  // screen never crashes and signup can still proceed.\n  useEffect(() => {\n    let cancelled = false;\n    PriceTierService.list()\n      .then((fetchedTiers) => {\n        if (!cancelled) {\n          setPriceMap(buildPriceMap(fetchedTiers));\n        }\n      })\n      .catch(() => {\n        // Keep the fallback map; nothing else to do.\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, []);\n\n  // Cookieless funnel tracking: mint a session token on first visit (best\n  // effort — a mint failure must never block signup), or if we're returning\n  // from a canceled Stripe Checkout (`?resume=`) with an existing token,\n  // record the cancellation. Both calls are fire-and-forget.\n  useEffect(() => {\n    if (!getFunnelToken()) {\n      FunnelSessionService.mint(readLandingParams())\n        .then((res) => {\n          setFunnelToken(res.uuid);\n          setFunnelTokenState(res.uuid);\n        })\n        .catch(() => {\n          // Best-effort: funnel tracking must never block signup.\n        });\n      return;\n    }\n\n    if (isResuming) {\n      const token = getFunnelToken();\n      if (token) {\n        FunnelSessionService.update(token, {\n          checkout_canceled_at: new Date().toISOString(),\n        }).catch(() => {\n          // Best-effort: funnel tracking must never block signup.\n        });\n      }\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Sales/outreach flyers link parents to `/join?promo_code=<code>`. Resolve\n  // it once on load (best-effort — a failed/rejected resolve or an invalid\n  // code must never block or crash signup, it just falls back to the normal\n  // full-price flow with no code stored).\n  useEffect(() => {\n    const code = new URLSearchParams(window.location.search).get('promo_code')?.trim();\n    if (!code) return;\n\n    let cancelled = false;\n    PromoCodeService.resolve(code)\n      .then((result) => {\n        if (cancelled || !result.valid) return;\n        setForm((f) => ({\n          ...f,\n          promoCode: code,\n          promoDiscount: result,\n          // Approved scholarship coupons are monthly-only.\n          plan: result.is_approved_scholarship ? 'monthly' : f.plan,\n        }));\n      })\n      .catch(() => {\n        // Best-effort: an invalid/failed resolve must never block signup.\n      })\n      .finally(() => {\n        if (!cancelled) setPromoResolveSettled(true);\n      });\n    return () => {\n      cancelled = true;\n    };\n  }, []);\n\n  // Deferred, best-effort price snapshot: record what the plan cards actually\n  // showed (list + promo-adjusted). Fires once, after the token is minted,\n  // prices have rendered, and promo resolution has settled. Never blocks\n  // signup. Also re-fires on the `?resume=` path (returning from a canceled\n  // Stripe Checkout with an existing token) since priceSnapshotSentRef resets\n  // per mount; that's fine — the update is idempotent and best-effort.\n  const priceSnapshotSentRef = useRef(false);\n  useEffect(() => {\n    if (priceSnapshotSentRef.current) return;\n    if (!funnelToken) return;\n    if (!promoResolveSettled) return;\n    const monthly = priceMap.monthly.unitAmount;\n    const annual = priceMap.annual.unitAmount;\n    if (monthly == null || annual == null) return;\n\n    priceSnapshotSentRef.current = true;\n    FunnelSessionService.update(funnelToken, {\n      price_currency: priceMap.monthly.currency,\n      price_monthly: monthly,\n      price_annual: annual,\n      price_monthly_discounted: form.promoDiscount?.monthly?.resulting_price ?? undefined,\n      price_annual_discounted: form.promoDiscount?.annual?.resulting_price ?? undefined,\n    }).catch(() => {\n      // Best-effort: funnel tracking must never block signup.\n    });\n  }, [funnelToken, promoResolveSettled, priceMap, form.promoDiscount]);\n\n  const setField = <K extends keyof SignupState>(key: K, val: SignupState[K]) =>\n    setForm((f) => ({ ...f, [key]: val }));\n\n  const handleSubmit = async () => {\n    setSubmitting(true);\n    setApiError(null);\n\n    try {\n      let uuid = subscriptionUuid;\n\n      if (!isResuming) {\n        const accountResult = await createAccount({\n          plan: {\n            billing_cycle: form.plan,\n            // The base plan-card tier is always sent as-is; a scholarship\n            // selection (from `/scholarship/discounts`) does NOT override it.\n            // Instead it's threaded through as its own field, and the\n            // backend applies the corresponding Stripe coupon at checkout.\n            price_tier_key: priceMap[form.plan].tierKey,\n            scholarship_tier_key: form.scholarshipTierKey ?? undefined,\n          },\n          parent: {\n            first_name: form.firstName,\n            last_name: form.lastName,\n            email: form.email,\n            phone_number: form.phoneNumber,\n            timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n            preferred_language: navigator.language,\n            accepted_terms: form.tos,\n          },\n          child: {\n            first_name: form.childName,\n            grade: form.grade,\n            focus: form.familyFocus ?? 'reading',\n          },\n          funnel_session_uuid: getFunnelToken() ?? undefined,\n          // Best-effort resolved promo code (see the load-time effect above);\n          // checkout (backend) auto-applies it when present.\n          promo_code: form.promoCode ?? undefined,\n        });\n\n        if ('status' in accountResult && accountResult.status === 'existing_account') {\n          setApiError(\n            t`This email is already registered. We've sent you a sign-in link — check your inbox.`,\n          );\n          return;\n        }\n\n        uuid = (accountResult as { subscription_uuid: string }).subscription_uuid;\n        setSubscriptionUuid(uuid);\n      }\n\n      const { checkout_url } = await createCheckoutSession(uuid!);\n      sessionStorage.setItem(FORM_STORAGE_KEY, JSON.stringify(form));\n      window.location.assign(checkout_url);\n    } catch (e: unknown) {\n      setApiError(e instanceof Error ? e.message : t`Something went wrong. Please try again.`);\n    } finally {\n      setSubmitting(false);\n    }\n  };\n\n  const context: SignupFlowContext = {\n    form,\n    setField,\n    isResuming,\n    submitting,\n    apiError,\n    priceMap,\n    // Confirmation line at the bottom of /details. Promo codes and\n    // scholarship coupons both show the discounted monthly price here.\n    priceLine: priceMap[form.plan].priceLine,\n    trialEnd: getTrialEnd(),\n    promoDiscount: form.promoDiscount,\n    scholarshipDiscount:\n      form.scholarshipResultingPrice != null && form.scholarshipLabel\n        ? {\n            label: form.scholarshipLabel,\n            resultingPrice: form.scholarshipResultingPrice,\n            basePriceLine: priceMap.monthly.priceLine,\n          }\n        : null,\n    handleSubmit,\n  };\n\n  return (\n    <div className={pageRoot}>\n      {/* Brand header */}\n      <div className={brandHeader}>\n        <img src={staticUrl('paloma-logo.svg')} alt=\"Paloma\" className={brandName} />\n      </div>\n\n      <div className={screenContainer}>\n        <Outlet context={context} />\n      </div>\n      <ScrollRestoration />\n    </div>\n  );\n};\n\nconst PlanEmailStep = () => {\n  const { form, setField, isResuming, priceMap, promoDiscount } = useSignupFlow();\n  const navigate = useNavigate();\n  const location = useLocation();\n\n  if (isResuming) {\n    return <Navigate to={{ pathname: '/details', search: location.search }} replace />;\n  }\n\n  const handleContinue = (plan: BillingCycle, email: string) => {\n    setField('plan', plan);\n    setField('email', email);\n    // Clear any prior scholarship selection: a normal continue must submit\n    // the plan-derived default tier, not a stale scholarship tier picked on\n    // an earlier visit to /scholarship before navigating back here.\n    setField('scholarshipTierKey', null);\n    setField('scholarshipLabel', null);\n    setField('scholarshipResultingPrice', null);\n\n    const token = getFunnelToken();\n    if (token) {\n      // Best-effort/fire-and-forget: must never block navigation.\n      FunnelSessionService.update(token, {\n        email,\n        reached_details_at: new Date().toISOString(),\n        consent_text: marketingConsentText(),\n      }).catch(() => {\n        // Best-effort: funnel tracking must never block signup.\n      });\n    }\n\n    void navigate('/details');\n  };\n\n  // Captures plan + email into form state exactly like handleContinue does\n  // (so /details finds the email it needs on the way back), then routes to\n  // the scholarship picker instead of straight to /details. Also records the\n  // same funnel event handleContinue does, so scholarship leads still get\n  // email/reached_details_at tracked.\n  const handleScholarship = (plan: BillingCycle, email: string) => {\n    setField('plan', plan);\n    setField('email', email);\n    setField('scholarshipTierKey', null);\n    setField('scholarshipLabel', null);\n    setField('scholarshipResultingPrice', null);\n\n    const token = getFunnelToken();\n    if (token && email) {\n      // Best-effort/fire-and-forget: must never block navigation.\n      FunnelSessionService.update(token, {\n        email,\n        reached_details_at: new Date().toISOString(),\n        consent_text: marketingConsentText(),\n      }).catch(() => {\n        // Best-effort: funnel tracking must never block signup.\n      });\n    }\n\n    void navigate('/scholarship');\n  };\n\n  return (\n    <PlanEmailScreen\n      plan={form.plan}\n      email={form.email}\n      priceMap={priceMap}\n      promoDiscount={promoDiscount}\n      onContinue={handleContinue}\n      onScholarship={handleScholarship}\n    />\n  );\n};\n\n// Founder-letter intro, reached from the plan/email screen's \"Request a\n// scholarship\" link. \"Becoming a member\" is a real <Link> rendered inside\n// ScholarshipIntroPage itself (routes to the plan/email root); the \"Request a\n// Scholarship\" button is wired here to move to the discount-tier picker.\nconst ScholarshipIntroStep = () => {\n  const navigate = useNavigate();\n\n  const handleRequestScholarship = () => {\n    void navigate('/scholarship/discounts');\n  };\n\n  return <ScholarshipIntroPage onRequestScholarship={handleRequestScholarship} />;\n};\n\n// Discount-tier picker (formerly reached directly at `/scholarship`; now the\n// second step of the scholarship flow, after the founder-letter intro).\n// Each tier is a coupon layered on the base plan price — it does not change\n// the price tier submitted to createAccount (see handleSubmit above).\nconst ScholarshipDiscountStep = () => {\n  const { form, setField } = useSignupFlow();\n  const navigate = useNavigate();\n\n  const handleContinue = (\n    tierKey: string,\n    email: string,\n    tierLabel: string,\n    resultingPrice: number,\n  ) => {\n    // Scholarship tiers are monthly-only; force the monthly plan so an annual\n    // selection from the plan screen can't submit an annual price_tier_key with\n    // a monthly scholarship coupon (which would mischarge at checkout).\n    setField('plan', 'monthly');\n    setField('scholarshipTierKey', tierKey);\n    setField('scholarshipLabel', tierLabel);\n    setField('scholarshipResultingPrice', resultingPrice);\n    setField('email', email);\n\n    const token = getFunnelToken();\n    if (token) {\n      // Best-effort/fire-and-forget: must never block navigation.\n      FunnelSessionService.update(token, {\n        email,\n        reached_details_at: new Date().toISOString(),\n        consent_text: marketingConsentText(),\n      }).catch(() => {\n        // Best-effort: funnel tracking must never block signup.\n      });\n    }\n\n    void navigate('/details');\n  };\n\n  const handleContactUs = () => {\n    void navigate('/scholarship/request');\n  };\n\n  return (\n    <ScholarshipDiscountPage\n      email={form.email}\n      onContinue={handleContinue}\n      onContactUs={handleContactUs}\n    />\n  );\n};\n\n// Full-scholarship request screen, reached from the discount-tier picker's\n// \"Contact Us\" link. Terminal step of the scholarship flow -- it manages its\n// own submission + confirmation state and doesn't navigate onward.\nconst ScholarshipRequestStep = () => {\n  const { form } = useSignupFlow();\n  return <ScholarshipRequestPage initialEmail={form.email} />;\n};\n\nconst DetailsStep = () => {\n  const {\n    form,\n    setField,\n    isResuming,\n    submitting,\n    apiError,\n    priceLine,\n    trialEnd,\n    promoDiscount,\n    scholarshipDiscount,\n    handleSubmit,\n  } = useSignupFlow();\n\n  if (!form.email && !form.phoneNumber && !isResuming) {\n    return <Navigate to=\"/\" replace />;\n  }\n\n  return (\n    <DetailsScreen\n      plan={form.plan}\n      firstName={form.firstName}\n      lastName={form.lastName}\n      phoneNumber={form.phoneNumber}\n      childName={form.childName}\n      grade={form.grade}\n      familyFocus={form.familyFocus}\n      tos={form.tos}\n      priceLine={priceLine}\n      trialEnd={trialEnd}\n      promoDiscount={promoDiscount}\n      scholarshipDiscount={scholarshipDiscount}\n      submitting={submitting}\n      isResuming={isResuming}\n      apiError={apiError}\n      onChange={setField}\n      onSubmit={() => void handleSubmit()}\n    />\n  );\n};\n\nconst SignupApp = ({ lang }: SignupAppProps) => {\n  const initialize = useLangStore((state) => state.initialize);\n  useEffect(() => {\n    if (lang) initialize(lang);\n  }, [lang, initialize]);\n\n  // Each step is a real route so the browser back button moves between\n  // steps instead of leaving the flow. The SPA is served at /join/ (and\n  // /join/details for refresh/deep-links); default to '/' so tests can\n  // render at any URL.\n  const [router] = useState(() =>\n    createBrowserRouter(\n      [\n        {\n          element: <SignupFlow />,\n          children: [\n            { index: true, element: <PlanEmailStep /> },\n            { path: 'scholarship', element: <ScholarshipIntroStep /> },\n            { path: 'scholarship/discounts', element: <ScholarshipDiscountStep /> },\n            { path: 'scholarship/request', element: <ScholarshipRequestStep /> },\n            { path: 'details', element: <DetailsStep /> },\n            { path: '*', element: <Navigate to=\"/\" replace /> },\n          ],\n        },\n      ],\n      { basename: window.location.pathname.startsWith('/join') ? '/join' : '/' },\n    ),\n  );\n\n  return (\n    <ErrorBoundary>\n      <QueryClientProvider client={queryClient}>\n        <I18nProvider>\n          <RouterProvider router={router} />\n        </I18nProvider>\n      </QueryClientProvider>\n    </ErrorBoundary>\n  );\n};\n\nexport default SignupApp;\n","import { createReactEntryPoint } from '@/utils/createReactEntryPoint';\nimport SignupApp from './SignupApp';\nimport '@/styles/tailwind.css';\nimport '@/styles/fonts.css';\n\ncreateReactEntryPoint({\n  mountId: 'signup-root',\n  Component: SignupApp,\n});\n"],"names":["FunnelSessionService","mint","params","Api","post","update","uuid","patch","PromoCodeService","resolve","code","query","URLSearchParams","get","toString","createAccount","data","createCheckoutSession","subscription_uuid","ACCENT","BORDER","INK","css","heroPanel","heroPill","heroImage","heading","subtext","valuePropCard","valuePropHeadline","valuePropText","valuePropBadge","valuePropBadgeIcon","valuePropBadgeText","planCardList","planCardBase","planCardSelected","planCardUnselected","planCardWithAnchor","planPriceStrike","planCardRow","planCardLeft","radioOuterBase","radioOuterSelected","radioOuterUnselected","radioDot","radioDotVisible","radioDotHidden","planNameRow","planNameText","saveBadge","saveBadgeDim","planSubtext","planPriceRight","planPriceAmount","planPriceUnit","continueButton","continueLegalText","scholarshipLine","scholarshipLink","testimonialCard","stars","testimonialText","testimonialAuthor","trustLine","familyFocusGroup","familyFocusCards","familyFocusCardBase","familyFocusCardSelected","familyFocusCardUnselected","familyFocusIconTile","familyFocusIcon","familyFocusTitle","familyFocusSubtext","familyFocusError","submitButton","submitButtonDisabled","legalText","priceStrike","checkoutText","resumeBanner","apiErrorBanner","PlanEmailScreen","plan","email","initialEmail","priceMap","promoDiscount","onContinue","onScholarship","localPlan","setLocalPlan","useState","localEmail","setLocalEmail","emailError","setEmailError","hasPromo","valid","monthlyPromo","monthly","annualPromo","annual","promoMonthlyAmount","resulting_price","formatPrice","promoMonthlyPriceLine","promoAnnualMonthlyAmount","formatAnnualMonthlyEquivalent","promoAnnualPriceLine","annualSavePercent","calculateSavePercent","undefined","savePercent","localPriceLine","priceLine","validEmail","e","test","trim","handleContinue","handleScholarship","is_approved_scholarship","jsx","_Trans","id","jsxs","staticUrl","_i18n","_","components","0","values","monthlyAmount","EmailField","value","DetailsScreen","firstName","lastName","phoneNumber","childName","grade","familyFocus","tos","trialEnd","scholarshipDiscount","isScholarshipPromoEntry","submitting","isResuming","apiError","onChange","onSubmit","tried","setTried","planPromo","promoDiscountedPriceLine","scholarshipDiscountedPriceLine","resultingPrice","handleSubmit","ChildFields","field","ParentNameFields","PhoneField","fieldLabel","SmsConsentCheckbox","basePriceLine","1","label","ScholarshipTierService","list","variant","set","qs","container","tierList","tierCardBase","tierCardSelected","tierCardUnselected","tierPill","tierPriceGroup","tierPriceColumn","tierPriceStrike","tierPriceAmount","tierPriceUnit","emailLabel","emailInput","emailInputError","emailErrorMsg","continueButtonDisabled","contactLine","contactLink","emptyState","emailConsentText","MONTHLY_TIER_KEY","ScholarshipDiscountPage","onContactUs","tiers","setTiers","basePrice","setBasePrice","selectedKey","setSelectedKey","useEffect","cancelled","then","fetched","catch","PriceTierService","all","find","tier","key","unit_amount","canContinue","anchorPrice","selectedTier","scholarshipResultingPrice","length","map","resulting","target","marketingConsentText","paragraph","signature","requestButton","ScholarshipIntroPage","onRequestScholarship","ScholarshipRequestService","create","payload","TOKEN_KEY","getFunnelToken","sessionStorage","getItem","setFunnelToken","setItem","readUtmParams","p","window","location","search","utm_source","utm_medium","utm_campaign","referrer","document","SENSITIVE_KEY_SUBSTRINGS","SENSITIVE_KEY_EXACT","Set","isSensitiveKey","k","toLowerCase","has","some","stem","includes","MAX_PARAM_VALUE_LENGTH","MAX_PARAMS","sanitizeQueryParams","out","count","entries","slice","Object","keys","readLandingParams","__spreadProps","__spreadValues","promo_code","landing_query_params","FIELD_GAP","formStack","nameRow","nameField","fieldBase","textInput","textInputError","emailFieldGroup","emailMicrotext","selectInput","selectPlaceholder","selectInputError","sectionBlock","sectionHeading","sectionSubtext","textareaInput","textareaInputError","sliderCard","sliderRow","sliderPriceDisplay","sliderBadge","sliderInput","sliderInputWithFill","fillPercent","sliderScaleRow","errorMsg","submitBanner","confirmationHeading","confirmationText","DEFAULT_BASE_PRICE","REFERRAL_OTHER_VALUE","REFERRAL_OTHER_PREFIX","REFERRAL_OTHER_DETAIL_MAX","validPhone","phone","resolvedReferralSource","source","otherDetail","referralIsComplete","REFERRAL_OPTIONS","ScholarshipRequestPage","sliderMax","scholarshipSliderMaxIndex","sliderValue","setSliderValue","sliderTouched","setSliderTouched","setFirstName","setLastName","setPhone","setEmail","referralSource","setReferralSource","referralSourceOther","setReferralSourceOther","story","setStory","setTos","phoneError","setPhoneError","setSubmitting","submitError","setSubmitError","submitted","setSubmitted","effectiveSliderValue","requestedPrice","scholarshipSliderPrice","discountPercent","scholarshipDiscountPercent","sliderPriceText","sliderFillPercent","formValid","first_name","last_name","phone_number","referral_source","accepted_terms","requested_price","funnel_session_uuid","finally","Number","pageRoot","brandHeader","brandName","screenContainer","queryClient","QueryClient","ANNUAL_TIER_KEY","FALLBACK_PRICE_MAP","tierKey","isReadyDefaultTier","buildPriceMap","byKey","Map","monthlyPlan","recurring_interval","unitAmount","currency","annualPlan","getTrialEnd","Date","now","toLocaleDateString","month","day","INITIAL_STATE","scholarshipTierKey","scholarshipLabel","promoCode","FORM_STORAGE_KEY","useSignupFlow","useOutletContext","SignupFlow","subscriptionUuid","setSubscriptionUuid","_a","form","setForm","saved","JSON","parse","setApiError","setPriceMap","funnelToken","setFunnelTokenState","promoResolveSettled","setPromoResolveSettled","fetchedTiers","res","token","checkout_canceled_at","toISOString","result","f","priceSnapshotSentRef","useRef","current","price_currency","price_monthly","price_annual","price_monthly_discounted","price_annual_discounted","setField","val","__async","accountResult","billing_cycle","price_tier_key","scholarship_tier_key","parent","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","preferred_language","navigator","language","child","focus","status","checkout_url","stringify","assign","Error","message","context","Outlet","ScrollRestoration","PlanEmailStep","navigate","useNavigate","useLocation","Navigate","pathname","reached_details_at","consent_text","ScholarshipIntroStep","handleRequestScholarship","ScholarshipDiscountStep","tierLabel","handleContactUs","ScholarshipRequestStep","DetailsStep","SignupApp","lang","initialize","useLangStore","state","router","createBrowserRouter","element","children","index","path","basename","startsWith","ErrorBoundary","QueryClientProvider","I18nProvider","RouterProvider","createReactEntryPoint","mountId","Component"],"mappings":"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"}