dating-schema 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  export { type AgeRange, ageRangeSchema, emptyStringToUndefined, type Gender, genderSchema, type InterestedIn, interestedInSchema, type LookingFor, lookingForSchema, type MaritalStatus, type MatchStatus, type MessageType, maritalStatusSchema, matchStatusSchema, messageTypeSchema, optionalTrimmedString, type Pagination, type Photo, paginationSchema, photoSchema, type SwipeAction, swipeActionSchema, } from './common.js';
10
10
  export { getFieldOptions } from './field-helpers.js';
11
11
  export { type BoostBody, boostBodySchema, type ComplimentBody, complimentBodySchema, type ImageLikeBody, type InteractionListQuery, type InteractionType, imageLikeBodySchema, interactionListQuerySchema, interactionTypeSchema, type RewindBody, rewindBodySchema, type SwipeBody, type SwipeResponse, swipeBodySchema, swipeResponseSchema, } from './interactions.js';
12
- export { type BooleanFeatureKey, type EnumFeatureKey, type ExploreAccessLevel, type FeatureKey, type FilterLevel, getMinPlanForFeature, getPlanLimit, getPlanLimits, hasRemainingQuota, isFeatureEnabled, isPaidPlan, type NumericFeatureKey, PAID_PLANS, PLAN_IDS, PLAN_LIMITS, type PlanId, type PlanLimits, PREMIUM_EXPLORE_CATEGORIES, PREMIUM_PLANS, type ScoreBreakdownLevel, TOP_PLANS, type WhoLikedYouLevel, } from './plan-limits.js';
12
+ export { type BooleanFeatureKey, type EnumFeatureKey, type ExploreAccessLevel, type FeatureKey, type FilterLevel, getMinPlanForFeature, getPlanLimit, getPlanLimits, hasRemainingQuota, isFeatureEnabled, isPaidPlan, type NumericFeatureKey, PAID_PLANS, PLAN_IDS, PLAN_LIMITS, type PlanId, type PlanLimits, PREMIUM_EXPLORE_CATEGORIES, PREMIUM_PLANS, type ScoreBreakdownLevel, TOP_PLANS, type FeatureDisplayItem, getPlanFeatureDisplay, PLAN_FEATURE_DISPLAY, type WhoLikedYouLevel, } from './plan-limits.js';
13
13
  export { type CreateProfileInput, createProfileSchema, type FullProfileData, fullProfileSchema, getCognitiveBandRank, type OnboardingFormData, onboardingFormSchema, type UpdateProfileInput, updateProfileSchema, } from './profile.js';
14
14
  export { allFieldGroups, basics, career, cognitive, type FieldGroup, type FieldOption, familyHome, favourites, financeLegal, healthWellness, heroIdentity, interestCategories, interests, lifestyle, lookingFor, type MultiSelectField, type OptionCategory, type ProfileField, personality, relationshipIntimacy, type SelectField, selfAssessment, storyPrompts, values, } from './profile-fields/index.js';
15
15
  export { type BlockBody, blockBodySchema, type ReportBody, type ReportReason, type ReportStatus, reportBodySchema, reportReasonSchema, reportStatusSchema, } from './safety.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,KAAK,QAAQ,EAEb,cAAc,EACd,sBAAsB,EACtB,KAAK,MAAM,EAEX,YAAY,EACZ,KAAK,YAAY,EACjB,kBAAkB,EAClB,KAAK,UAAU,EACf,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,UAAU,EACf,KAAK,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,KAAK,WAAW,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,KAAK,SAAS,EACd,eAAe,EACf,KAAK,cAAc,EACnB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,KAAK,UAAU,EACf,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,KAAK,iBAAiB,EACtB,UAAU,EACV,QAAQ,EACR,WAAW,EACX,KAAK,MAAM,EACX,KAAK,UAAU,EACf,0BAA0B,EAC1B,aAAa,EACb,KAAK,mBAAmB,EACxB,SAAS,EACT,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,eAAe,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,WAAW,EACX,oBAAoB,EACpB,KAAK,WAAW,EAChB,cAAc,EACd,YAAY,EACZ,MAAM,GACP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,KAAK,SAAS,EACd,eAAe,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,KAAK,MAAM,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,KAAK,QAAQ,EAEb,cAAc,EACd,sBAAsB,EACtB,KAAK,MAAM,EAEX,YAAY,EACZ,KAAK,YAAY,EACjB,kBAAkB,EAClB,KAAK,UAAU,EACf,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,KAAK,UAAU,EACf,KAAK,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,KAAK,WAAW,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,KAAK,SAAS,EACd,eAAe,EACf,KAAK,cAAc,EACnB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,KAAK,UAAU,EACf,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,KAAK,iBAAiB,EACtB,UAAU,EACV,QAAQ,EACR,WAAW,EACX,KAAK,MAAM,EACX,KAAK,UAAU,EACf,0BAA0B,EAC1B,aAAa,EACb,KAAK,mBAAmB,EACxB,SAAS,EACT,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,kBAAkB,EACvB,mBAAmB,EACnB,KAAK,eAAe,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,cAAc,EACd,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,WAAW,EACX,oBAAoB,EACpB,KAAK,WAAW,EAChB,cAAc,EACd,YAAY,EACZ,MAAM,GACP,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,KAAK,SAAS,EACd,eAAe,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,KAAK,MAAM,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ export { getFieldOptions } from './field-helpers.js';
16
16
  // ─── Interaction schemas ─────────────────────────────────────────────────────
17
17
  export { boostBodySchema, complimentBodySchema, imageLikeBodySchema, interactionListQuerySchema, interactionTypeSchema, rewindBodySchema, swipeBodySchema, swipeResponseSchema, } from './interactions.js';
18
18
  // ─── Plan limits ─────────────────────────────────────────────────────────────
19
- export { getMinPlanForFeature, getPlanLimit, getPlanLimits, hasRemainingQuota, isFeatureEnabled, isPaidPlan, PAID_PLANS, PLAN_IDS, PLAN_LIMITS, PREMIUM_EXPLORE_CATEGORIES, PREMIUM_PLANS, TOP_PLANS, } from './plan-limits.js';
19
+ export { getMinPlanForFeature, getPlanLimit, getPlanLimits, hasRemainingQuota, isFeatureEnabled, isPaidPlan, PAID_PLANS, PLAN_IDS, PLAN_LIMITS, PREMIUM_EXPLORE_CATEGORIES, PREMIUM_PLANS, TOP_PLANS, getPlanFeatureDisplay, PLAN_FEATURE_DISPLAY, } from './plan-limits.js';
20
20
  // ─── Profile schemas ─────────────────────────────────────────────────────────
21
21
  export { createProfileSchema, fullProfileSchema, getCognitiveBandRank, onboardingFormSchema, updateProfileSchema, } from './profile.js';
22
22
  // ─── Profile field configs (option arrays with labels for UI rendering) ──────
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gFAAgF;AAChF,OAAO;AAEL,cAAc;AACd,cAAc,EACd,sBAAsB;AAEtB,QAAQ;AACR,YAAY,EAEZ,kBAAkB,EAElB,gBAAgB,EAIhB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EAGrB,gBAAgB,EAChB,WAAW,EAEX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,gFAAgF;AAChF,OAAO,EAEL,eAAe,EAEf,oBAAoB,EAIpB,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EAErB,gBAAgB,EAGhB,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,gFAAgF;AAChF,OAAO,EAML,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EAEV,UAAU,EACV,QAAQ,EACR,WAAW,EAGX,0BAA0B,EAC1B,aAAa,EAEb,SAAS,GAEV,MAAM,kBAAkB,CAAC;AAC1B,gFAAgF;AAChF,OAAO,EAEL,mBAAmB,EAEnB,iBAAiB,EACjB,oBAAoB,EAEpB,oBAAoB,EAEpB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,gFAAgF;AAChF,OAAO,EACL,cAAc,EACd,MAAM,EACN,MAAM,EACN,SAAS,EAGT,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EAIV,WAAW,EACX,oBAAoB,EAEpB,cAAc,EACd,YAAY,EACZ,MAAM,GACP,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,OAAO,EAEL,eAAe,EAIf,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAChF,OAAO,EAEL,4BAA4B,EAE5B,wBAAwB,EAExB,YAAY,GACb,MAAM,mBAAmB,CAAC","sourcesContent":["/**\n * dating-schema — Shared Zod schemas for the Dating feature\n *\n * Single source of truth consumed by both jansathi-frontend and reform-backend.\n * Guarantees identical validation logic and TypeScript types on both sides.\n *\n * @module dating-schema\n */\n\n// ─── Common helpers and enums ────────────────────────────────────────────────\nexport {\n type AgeRange,\n // sub-schemas\n ageRangeSchema,\n emptyStringToUndefined,\n type Gender,\n // enums\n genderSchema,\n type InterestedIn,\n interestedInSchema,\n type LookingFor,\n lookingForSchema,\n type MaritalStatus,\n type MatchStatus,\n type MessageType,\n maritalStatusSchema,\n matchStatusSchema,\n messageTypeSchema,\n optionalTrimmedString,\n type Pagination,\n type Photo,\n paginationSchema,\n photoSchema,\n type SwipeAction,\n swipeActionSchema,\n} from './common.js';\nexport { getFieldOptions } from './field-helpers.js';\n// ─── Interaction schemas ─────────────────────────────────────────────────────\nexport {\n type BoostBody,\n boostBodySchema,\n type ComplimentBody,\n complimentBodySchema,\n type ImageLikeBody,\n type InteractionListQuery,\n type InteractionType,\n imageLikeBodySchema,\n interactionListQuerySchema,\n interactionTypeSchema,\n type RewindBody,\n rewindBodySchema,\n type SwipeBody,\n type SwipeResponse,\n swipeBodySchema,\n swipeResponseSchema,\n} from './interactions.js';\n// ─── Plan limits ─────────────────────────────────────────────────────────────\nexport {\n type BooleanFeatureKey,\n type EnumFeatureKey,\n type ExploreAccessLevel,\n type FeatureKey,\n type FilterLevel,\n getMinPlanForFeature,\n getPlanLimit,\n getPlanLimits,\n hasRemainingQuota,\n isFeatureEnabled,\n isPaidPlan,\n type NumericFeatureKey,\n PAID_PLANS,\n PLAN_IDS,\n PLAN_LIMITS,\n type PlanId,\n type PlanLimits,\n PREMIUM_EXPLORE_CATEGORIES,\n PREMIUM_PLANS,\n type ScoreBreakdownLevel,\n TOP_PLANS,\n type WhoLikedYouLevel,\n} from './plan-limits.js';\n// ─── Profile schemas ─────────────────────────────────────────────────────────\nexport {\n type CreateProfileInput,\n createProfileSchema,\n type FullProfileData,\n fullProfileSchema,\n getCognitiveBandRank,\n type OnboardingFormData,\n onboardingFormSchema,\n type UpdateProfileInput,\n updateProfileSchema,\n} from './profile.js';\n// ─── Profile field configs (option arrays with labels for UI rendering) ──────\nexport {\n allFieldGroups,\n basics,\n career,\n cognitive,\n type FieldGroup,\n type FieldOption,\n familyHome,\n favourites,\n financeLegal,\n healthWellness,\n heroIdentity,\n interestCategories,\n interests,\n lifestyle,\n lookingFor,\n type MultiSelectField,\n type OptionCategory,\n type ProfileField,\n personality,\n relationshipIntimacy,\n type SelectField,\n selfAssessment,\n storyPrompts,\n values,\n} from './profile-fields/index.js';\n\n// ─── Safety schemas ──────────────────────────────────────────────────────────\nexport {\n type BlockBody,\n blockBodySchema,\n type ReportBody,\n type ReportReason,\n type ReportStatus,\n reportBodySchema,\n reportReasonSchema,\n reportStatusSchema,\n} from './safety.js';\n\n// ─── Subscription schemas ────────────────────────────────────────────────────\nexport {\n type CreateSubscriptionBody,\n createSubscriptionBodySchema,\n type SubscriptionStatus,\n subscriptionStatusSchema,\n type Tenure,\n tenureSchema,\n} from './subscription.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gFAAgF;AAChF,OAAO;AAEL,cAAc;AACd,cAAc,EACd,sBAAsB;AAEtB,QAAQ;AACR,YAAY,EAEZ,kBAAkB,EAElB,gBAAgB,EAIhB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EAGrB,gBAAgB,EAChB,WAAW,EAEX,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,gFAAgF;AAChF,OAAO,EAEL,eAAe,EAEf,oBAAoB,EAIpB,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EAErB,gBAAgB,EAGhB,eAAe,EACf,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,gFAAgF;AAChF,OAAO,EAML,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EAEV,UAAU,EACV,QAAQ,EACR,WAAW,EAGX,0BAA0B,EAC1B,aAAa,EAEb,SAAS,EAET,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAC1B,gFAAgF;AAChF,OAAO,EAEL,mBAAmB,EAEnB,iBAAiB,EACjB,oBAAoB,EAEpB,oBAAoB,EAEpB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,gFAAgF;AAChF,OAAO,EACL,cAAc,EACd,MAAM,EACN,MAAM,EACN,SAAS,EAGT,UAAU,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,UAAU,EAIV,WAAW,EACX,oBAAoB,EAEpB,cAAc,EACd,YAAY,EACZ,MAAM,GACP,MAAM,2BAA2B,CAAC;AAEnC,gFAAgF;AAChF,OAAO,EAEL,eAAe,EAIf,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,gFAAgF;AAChF,OAAO,EAEL,4BAA4B,EAE5B,wBAAwB,EAExB,YAAY,GACb,MAAM,mBAAmB,CAAC","sourcesContent":["/**\n * dating-schema — Shared Zod schemas for the Dating feature\n *\n * Single source of truth consumed by both jansathi-frontend and reform-backend.\n * Guarantees identical validation logic and TypeScript types on both sides.\n *\n * @module dating-schema\n */\n\n// ─── Common helpers and enums ────────────────────────────────────────────────\nexport {\n type AgeRange,\n // sub-schemas\n ageRangeSchema,\n emptyStringToUndefined,\n type Gender,\n // enums\n genderSchema,\n type InterestedIn,\n interestedInSchema,\n type LookingFor,\n lookingForSchema,\n type MaritalStatus,\n type MatchStatus,\n type MessageType,\n maritalStatusSchema,\n matchStatusSchema,\n messageTypeSchema,\n optionalTrimmedString,\n type Pagination,\n type Photo,\n paginationSchema,\n photoSchema,\n type SwipeAction,\n swipeActionSchema,\n} from './common.js';\nexport { getFieldOptions } from './field-helpers.js';\n// ─── Interaction schemas ─────────────────────────────────────────────────────\nexport {\n type BoostBody,\n boostBodySchema,\n type ComplimentBody,\n complimentBodySchema,\n type ImageLikeBody,\n type InteractionListQuery,\n type InteractionType,\n imageLikeBodySchema,\n interactionListQuerySchema,\n interactionTypeSchema,\n type RewindBody,\n rewindBodySchema,\n type SwipeBody,\n type SwipeResponse,\n swipeBodySchema,\n swipeResponseSchema,\n} from './interactions.js';\n// ─── Plan limits ─────────────────────────────────────────────────────────────\nexport {\n type BooleanFeatureKey,\n type EnumFeatureKey,\n type ExploreAccessLevel,\n type FeatureKey,\n type FilterLevel,\n getMinPlanForFeature,\n getPlanLimit,\n getPlanLimits,\n hasRemainingQuota,\n isFeatureEnabled,\n isPaidPlan,\n type NumericFeatureKey,\n PAID_PLANS,\n PLAN_IDS,\n PLAN_LIMITS,\n type PlanId,\n type PlanLimits,\n PREMIUM_EXPLORE_CATEGORIES,\n PREMIUM_PLANS,\n type ScoreBreakdownLevel,\n TOP_PLANS,\n type FeatureDisplayItem,\n getPlanFeatureDisplay,\n PLAN_FEATURE_DISPLAY,\n type WhoLikedYouLevel,\n} from './plan-limits.js';\n// ─── Profile schemas ─────────────────────────────────────────────────────────\nexport {\n type CreateProfileInput,\n createProfileSchema,\n type FullProfileData,\n fullProfileSchema,\n getCognitiveBandRank,\n type OnboardingFormData,\n onboardingFormSchema,\n type UpdateProfileInput,\n updateProfileSchema,\n} from './profile.js';\n// ─── Profile field configs (option arrays with labels for UI rendering) ──────\nexport {\n allFieldGroups,\n basics,\n career,\n cognitive,\n type FieldGroup,\n type FieldOption,\n familyHome,\n favourites,\n financeLegal,\n healthWellness,\n heroIdentity,\n interestCategories,\n interests,\n lifestyle,\n lookingFor,\n type MultiSelectField,\n type OptionCategory,\n type ProfileField,\n personality,\n relationshipIntimacy,\n type SelectField,\n selfAssessment,\n storyPrompts,\n values,\n} from './profile-fields/index.js';\n\n// ─── Safety schemas ──────────────────────────────────────────────────────────\nexport {\n type BlockBody,\n blockBodySchema,\n type ReportBody,\n type ReportReason,\n type ReportStatus,\n reportBodySchema,\n reportReasonSchema,\n reportStatusSchema,\n} from './safety.js';\n\n// ─── Subscription schemas ────────────────────────────────────────────────────\nexport {\n type CreateSubscriptionBody,\n createSubscriptionBodySchema,\n type SubscriptionStatus,\n subscriptionStatusSchema,\n type Tenure,\n tenureSchema,\n} from './subscription.js';\n"]}
@@ -77,6 +77,36 @@ export declare const TOP_PLANS: PlanId[];
77
77
  export declare function isPaidPlan(planId: PlanId): boolean;
78
78
  /** Premium explore categories that require Gold+ to access. */
79
79
  export declare const PREMIUM_EXPLORE_CATEGORIES: readonly ["high-iq", "elite-institute", "wealth-dating", "casual", "nri-dating", "senior-dating", "lgbtq", "second-innings"];
80
+ /** How a feature appears in UI — per-plan value can be a string (quantity), true (check), or false (locked). */
81
+ export interface FeatureDisplayItem {
82
+ /** Unique key matching a FeatureKey or custom display key */
83
+ key: string;
84
+ /** Human-readable label */
85
+ label: string;
86
+ /** Per-plan display value: string = show text, true = checkmark, false = locked/unavailable */
87
+ plans: Record<PlanId, string | boolean>;
88
+ }
89
+ /**
90
+ * Master feature list for plan comparison UI.
91
+ * Derived from PLAN_LIMITS but with human-readable labels and display values.
92
+ * This is the single source of truth for what features each plan shows.
93
+ */
94
+ export declare const PLAN_FEATURE_DISPLAY: FeatureDisplayItem[];
95
+ /**
96
+ * Get features for a plan, split into included (with values) and locked.
97
+ * Included features come first, locked features last.
98
+ */
99
+ export declare function getPlanFeatureDisplay(planId: PlanId): {
100
+ included: {
101
+ key: string;
102
+ label: string;
103
+ value: string | true;
104
+ }[];
105
+ locked: {
106
+ key: string;
107
+ label: string;
108
+ }[];
109
+ };
80
110
  /** Get the limits object for a plan. */
81
111
  export declare function getPlanLimits(planId: PlanId): PlanLimits;
82
112
  /** Get a specific limit value for a plan + feature. */
@@ -1 +1 @@
1
- {"version":3,"file":"plan-limits.d.ts","sourceRoot":"","sources":["../src/plan-limits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan-limits.d.ts","sourceRoot":"","sources":["../src/plan-limits.ts"],"names":[],"mappings":"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"}
@@ -210,6 +210,53 @@ export const PREMIUM_EXPLORE_CATEGORIES = [
210
210
  'lgbtq',
211
211
  'second-innings',
212
212
  ];
213
+ /**
214
+ * Master feature list for plan comparison UI.
215
+ * Derived from PLAN_LIMITS but with human-readable labels and display values.
216
+ * This is the single source of truth for what features each plan shows.
217
+ */
218
+ export const PLAN_FEATURE_DISPLAY = [
219
+ { key: 'dailySwipes', label: 'Daily swipes', plans: { spark: '20/day', gold: '80/day', diamond: '200/day', platinum: 'Unlimited', black: 'Unlimited' } },
220
+ { key: 'dailyCompliments', label: 'Daily compliments', plans: { spark: '1/day', gold: '5/day', diamond: '15/day', platinum: 'Unlimited', black: 'Unlimited' } },
221
+ { key: 'dailyRewinds', label: 'Rewinds', plans: { spark: false, gold: '3/day', diamond: '10/day', platinum: 'Unlimited', black: 'Unlimited' } },
222
+ { key: 'calls', label: 'Voice & video calls', plans: { spark: false, gold: 'Limited', diamond: 'Limited', platinum: 'Unlimited', black: 'Unlimited' } },
223
+ { key: 'whoLikedYou', label: 'Who Liked You', plans: { spark: false, gold: 'Blurred', diamond: 'Full list', platinum: 'Real-time', black: 'Real-time' } },
224
+ { key: 'filterLevel', label: 'Filters', plans: { spark: 'Basic', gold: 'Advanced', diamond: 'Full (147)', platinum: 'Full (147)', black: 'Full (147)' } },
225
+ { key: 'monthlyBoosts', label: 'Monthly boosts', plans: { spark: false, gold: '1/month', diamond: '3/month', platinum: '7/month', black: '7/month' } },
226
+ { key: 'monthlyNewChatThreads', label: 'New chat threads', plans: { spark: '5/month', gold: '15/month', diamond: '50/month', platinum: 'Unlimited', black: 'Unlimited' } },
227
+ { key: 'readReceipts', label: 'Read receipts', plans: { spark: false, gold: false, diamond: true, platinum: true, black: true } },
228
+ { key: 'seeProfileViewers', label: 'Profile viewers', plans: { spark: false, gold: true, diamond: true, platinum: true, black: true } },
229
+ { key: 'photoInsights', label: 'Photo insights', plans: { spark: false, gold: false, diamond: true, platinum: true, black: true } },
230
+ { key: 'priorityVisibility', label: 'Priority visibility', plans: { spark: false, gold: false, diamond: true, platinum: true, black: true } },
231
+ { key: 'autoBoost', label: 'Auto-boost weekly', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },
232
+ { key: 'incognitoMode', label: 'Incognito mode', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },
233
+ { key: 'travelMode', label: 'Travel mode', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },
234
+ { key: 'messageBeforeMatch', label: 'Message before match', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },
235
+ { key: 'exclusiveLeague', label: 'Exclusive League', plans: { spark: false, gold: false, diamond: false, platinum: false, black: true } },
236
+ { key: 'vipSupport', label: 'VIP support', plans: { spark: false, gold: false, diamond: false, platinum: false, black: true } },
237
+ { key: 'showAds', label: 'Ad-free', plans: { spark: false, gold: true, diamond: true, platinum: true, black: true } },
238
+ ];
239
+ /**
240
+ * Get features for a plan, split into included (with values) and locked.
241
+ * Included features come first, locked features last.
242
+ */
243
+ export function getPlanFeatureDisplay(planId) {
244
+ const included = [];
245
+ const locked = [];
246
+ for (const f of PLAN_FEATURE_DISPLAY) {
247
+ const val = f.plans[planId];
248
+ if (val === false) {
249
+ locked.push({ key: f.key, label: f.label });
250
+ }
251
+ else if (val === true) {
252
+ included.push({ key: f.key, label: f.label, value: true });
253
+ }
254
+ else {
255
+ included.push({ key: f.key, label: f.label, value: val });
256
+ }
257
+ }
258
+ return { included, locked };
259
+ }
213
260
  // ─── Helpers ─────────────────────────────────────────────────────────────────
214
261
  /** Get the limits object for a plan. */
215
262
  export function getPlanLimits(planId) {
@@ -1 +1 @@
1
- {"version":3,"file":"plan-limits.js","sourceRoot":"","sources":["../src/plan-limits.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dating-schema — Plan limits configuration\n *\n * Single source of truth for feature gating by pricing plan.\n * Both backend middleware and frontend UI read from this config.\n *\n * To add/remove a gated feature:\n * 1. Add/remove the key in PlanLimits interface\n * 2. Set values for each plan in PLAN_LIMITS\n * 3. Backend: add enforceDatingPlanLimit('featureKey') middleware to the route\n * That's it — no scattered if-checks needed.\n *\n * @module dating-schema/plan-limits\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** The 5 pricing plans. Black is the exclusive celebrity/HNI tier. */\nexport type PlanId = 'spark' | 'gold' | 'diamond' | 'platinum' | 'black';\n\n/** Filter capability levels by plan. */\nexport type FilterLevel = 'basic' | 'advanced' | 'full';\n\n/** \"Who liked you\" visibility levels by plan. */\nexport type WhoLikedYouLevel = 'none' | 'blurred' | 'full' | 'realtime';\n\n/** Explore category access levels by plan. */\nexport type ExploreAccessLevel = 'basic' | 'premium';\n\n/** Compatibility score breakdown visibility by plan. */\nexport type ScoreBreakdownLevel = 'none' | 'score' | 'breakdown';\n\n/** All numeric limit keys (daily/periodic counters enforced server-side). */\nexport type NumericFeatureKey =\n | 'dailySwipes'\n | 'dailyCompliments'\n | 'dailyRewinds'\n | 'dailyProfileVisits'\n | 'monthlyNewChatThreads'\n | 'monthlyBoosts'\n | 'weeklyAutoBoost'\n | 'dailyVoiceCalls'\n | 'dailyVideoCalls'\n | 'voiceCallDurationMin'\n | 'videoCallDurationMin'\n | 'monthlyIntentChanges'\n | 'scoreVisibleProfiles';\n\n/** All boolean feature keys (on/off per plan). */\nexport type BooleanFeatureKey =\n | 'readReceipts'\n | 'incognitoMode'\n | 'voiceMessages'\n | 'voiceCalls'\n | 'videoCalls'\n | 'showAds'\n | 'priorityVisibility'\n | 'autoBoost'\n | 'seeProfileViewers'\n | 'messageBeforeMatch'\n | 'travelMode'\n | 'profileContentUnlock'\n | 'photoInsights'\n | 'exclusiveLeague';\n\n/** All string-enum feature keys. */\nexport type EnumFeatureKey = 'filterLevel' | 'whoLikedYou' | 'exploreAccess' | 'scoreBreakdown';\n\n/** Union of all feature keys that can be gated. */\nexport type FeatureKey = NumericFeatureKey | BooleanFeatureKey | EnumFeatureKey;\n\n/** Complete plan limits definition. */\nexport interface PlanLimits {\n // ── Numeric limits (daily/periodic) ──\n dailySwipes: number;\n dailyCompliments: number;\n dailyRewinds: number;\n dailyProfileVisits: number;\n monthlyNewChatThreads: number;\n monthlyBoosts: number;\n weeklyAutoBoost: number;\n dailyVoiceCalls: number;\n dailyVideoCalls: number;\n voiceCallDurationMin: number;\n videoCallDurationMin: number;\n monthlyIntentChanges: number;\n scoreVisibleProfiles: number;\n\n // ── Enum limits ──\n filterLevel: FilterLevel;\n whoLikedYou: WhoLikedYouLevel;\n exploreAccess: ExploreAccessLevel;\n scoreBreakdown: ScoreBreakdownLevel;\n\n // ── Boolean flags ──\n readReceipts: boolean;\n incognitoMode: boolean;\n voiceMessages: boolean;\n voiceCalls: boolean;\n videoCalls: boolean;\n showAds: boolean;\n priorityVisibility: boolean;\n autoBoost: boolean;\n seeProfileViewers: boolean;\n messageBeforeMatch: boolean;\n travelMode: boolean;\n profileContentUnlock: boolean;\n photoInsights: boolean;\n exclusiveLeague: boolean;\n}\n\n// ─── Plan Limits Config ──────────────────────────────────────────────────────\n\nexport const PLAN_LIMITS: Record<PlanId, PlanLimits> = {\n // ── Spark (Free) — Enough to hook, heavily limited ──\n spark: {\n dailySwipes: 20,\n dailyCompliments: 1,\n dailyRewinds: 0,\n dailyProfileVisits: 10,\n monthlyNewChatThreads: 5,\n monthlyBoosts: 0,\n weeklyAutoBoost: 0,\n dailyVoiceCalls: 0,\n dailyVideoCalls: 0,\n voiceCallDurationMin: 0,\n videoCallDurationMin: 0,\n monthlyIntentChanges: 2,\n scoreVisibleProfiles: 3,\n filterLevel: 'basic',\n whoLikedYou: 'none',\n exploreAccess: 'basic',\n scoreBreakdown: 'none',\n readReceipts: false,\n incognitoMode: false,\n voiceMessages: false,\n voiceCalls: false,\n videoCalls: false,\n showAds: true,\n priorityVisibility: false,\n autoBoost: false,\n seeProfileViewers: false,\n messageBeforeMatch: false,\n travelMode: false,\n profileContentUnlock: false,\n photoInsights: false,\n exclusiveLeague: false,\n },\n\n // ── Gold — Good value, removes major pain points ──\n gold: {\n dailySwipes: 80,\n dailyCompliments: 5,\n dailyRewinds: 3,\n dailyProfileVisits: 30,\n monthlyNewChatThreads: 15,\n monthlyBoosts: 1,\n weeklyAutoBoost: 0,\n dailyVoiceCalls: 2,\n dailyVideoCalls: 1,\n voiceCallDurationMin: 10,\n videoCallDurationMin: 10,\n monthlyIntentChanges: 4,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'advanced',\n whoLikedYou: 'blurred',\n exploreAccess: 'premium',\n scoreBreakdown: 'score',\n readReceipts: false,\n incognitoMode: false,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: false,\n autoBoost: false,\n seeProfileViewers: true,\n messageBeforeMatch: false,\n travelMode: false,\n profileContentUnlock: true,\n photoInsights: false,\n exclusiveLeague: false,\n },\n\n // ── Diamond (DECOY) — Generous but capped, pushes to Platinum ──\n diamond: {\n dailySwipes: 200,\n dailyCompliments: 15,\n dailyRewinds: 10,\n dailyProfileVisits: 100,\n monthlyNewChatThreads: 50,\n monthlyBoosts: 3,\n weeklyAutoBoost: 0,\n dailyVoiceCalls: 5,\n dailyVideoCalls: 3,\n voiceCallDurationMin: 20,\n videoCallDurationMin: 15,\n monthlyIntentChanges: 8,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'full',\n whoLikedYou: 'full',\n exploreAccess: 'premium',\n scoreBreakdown: 'score',\n readReceipts: true,\n incognitoMode: false,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: true,\n autoBoost: false,\n seeProfileViewers: true,\n messageBeforeMatch: false,\n travelMode: false,\n profileContentUnlock: true,\n photoInsights: true,\n exclusiveLeague: false,\n },\n\n // ── Platinum — Unlimited everything, the aspirational tier ──\n platinum: {\n dailySwipes: Infinity,\n dailyCompliments: Infinity,\n dailyRewinds: Infinity,\n dailyProfileVisits: Infinity,\n monthlyNewChatThreads: Infinity,\n monthlyBoosts: 7,\n weeklyAutoBoost: 1,\n dailyVoiceCalls: Infinity,\n dailyVideoCalls: Infinity,\n voiceCallDurationMin: Infinity,\n videoCallDurationMin: Infinity,\n monthlyIntentChanges: Infinity,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'full',\n whoLikedYou: 'realtime',\n exploreAccess: 'premium',\n scoreBreakdown: 'breakdown',\n readReceipts: true,\n incognitoMode: true,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: true,\n autoBoost: true,\n seeProfileViewers: true,\n messageBeforeMatch: true,\n travelMode: true,\n profileContentUnlock: true,\n photoInsights: true,\n exclusiveLeague: false,\n },\n\n // ── Black — Exclusive league for celebrities & HNIs ──\n // All Platinum features + exclusive league (only Black users see each other)\n black: {\n dailySwipes: Infinity,\n dailyCompliments: Infinity,\n dailyRewinds: Infinity,\n dailyProfileVisits: Infinity,\n monthlyNewChatThreads: Infinity,\n monthlyBoosts: 7,\n weeklyAutoBoost: 1,\n dailyVoiceCalls: Infinity,\n dailyVideoCalls: Infinity,\n voiceCallDurationMin: Infinity,\n videoCallDurationMin: Infinity,\n monthlyIntentChanges: Infinity,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'full',\n whoLikedYou: 'realtime',\n exploreAccess: 'premium',\n scoreBreakdown: 'breakdown',\n readReceipts: true,\n incognitoMode: true,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: true,\n autoBoost: true,\n seeProfileViewers: true,\n messageBeforeMatch: true,\n travelMode: true,\n profileContentUnlock: true,\n photoInsights: true,\n exclusiveLeague: true,\n },\n} as const;\n\n// ─── Plan Tier Helpers ──────────────────────────────────────────────────────\n\n/** All valid plan IDs in tier order. */\nexport const PLAN_IDS: PlanId[] = ['spark', 'gold', 'diamond', 'platinum', 'black'];\n\n/** Paid plans (Gold and above). */\nexport const PAID_PLANS: PlanId[] = ['gold', 'diamond', 'platinum', 'black'];\n\n/** Premium plans (Diamond and above). */\nexport const PREMIUM_PLANS: PlanId[] = ['diamond', 'platinum', 'black'];\n\n/** Top-tier plans (Platinum and Black). */\nexport const TOP_PLANS: PlanId[] = ['platinum', 'black'];\n\n/** Check if a plan is paid (not Spark). */\nexport function isPaidPlan(planId: PlanId): boolean {\n return planId !== 'spark';\n}\n\n/** Premium explore categories that require Gold+ to access. */\nexport const PREMIUM_EXPLORE_CATEGORIES = [\n 'high-iq',\n 'elite-institute',\n 'wealth-dating',\n 'casual',\n 'nri-dating',\n 'senior-dating',\n 'lgbtq',\n 'second-innings',\n] as const;\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Get the limits object for a plan. */\nexport function getPlanLimits(planId: PlanId): PlanLimits {\n return PLAN_LIMITS[planId];\n}\n\n/** Get a specific limit value for a plan + feature. */\nexport function getPlanLimit<K extends FeatureKey>(planId: PlanId, feature: K): PlanLimits[K] {\n return PLAN_LIMITS[planId][feature];\n}\n\n/**\n * Check if a boolean feature is enabled for a plan.\n * Returns `false` for non-boolean features.\n */\nexport function isFeatureEnabled(planId: PlanId, feature: BooleanFeatureKey): boolean {\n return PLAN_LIMITS[planId][feature];\n}\n\n/**\n * Check if a numeric feature has remaining capacity.\n * Returns `true` if the limit is Infinity or greater than current usage.\n */\nexport function hasRemainingQuota(\n planId: PlanId,\n feature: NumericFeatureKey,\n currentUsage: number,\n): boolean {\n const limit = PLAN_LIMITS[planId][feature];\n return limit === Infinity || currentUsage < limit;\n}\n\n/**\n * Get the minimum plan required for a boolean feature.\n * Returns undefined if no plan enables it.\n */\nexport function getMinPlanForFeature(feature: BooleanFeatureKey): PlanId | undefined {\n return PLAN_IDS.find((id) => PLAN_LIMITS[id][feature] === true);\n}\n"]}
1
+ {"version":3,"file":"plan-limits.js","sourceRoot":"","sources":["../src/plan-limits.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * dating-schema — Plan limits configuration\n *\n * Single source of truth for feature gating by pricing plan.\n * Both backend middleware and frontend UI read from this config.\n *\n * To add/remove a gated feature:\n * 1. Add/remove the key in PlanLimits interface\n * 2. Set values for each plan in PLAN_LIMITS\n * 3. Backend: add enforceDatingPlanLimit('featureKey') middleware to the route\n * That's it — no scattered if-checks needed.\n *\n * @module dating-schema/plan-limits\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** The 5 pricing plans. Black is the exclusive celebrity/HNI tier. */\nexport type PlanId = 'spark' | 'gold' | 'diamond' | 'platinum' | 'black';\n\n/** Filter capability levels by plan. */\nexport type FilterLevel = 'basic' | 'advanced' | 'full';\n\n/** \"Who liked you\" visibility levels by plan. */\nexport type WhoLikedYouLevel = 'none' | 'blurred' | 'full' | 'realtime';\n\n/** Explore category access levels by plan. */\nexport type ExploreAccessLevel = 'basic' | 'premium';\n\n/** Compatibility score breakdown visibility by plan. */\nexport type ScoreBreakdownLevel = 'none' | 'score' | 'breakdown';\n\n/** All numeric limit keys (daily/periodic counters enforced server-side). */\nexport type NumericFeatureKey =\n | 'dailySwipes'\n | 'dailyCompliments'\n | 'dailyRewinds'\n | 'dailyProfileVisits'\n | 'monthlyNewChatThreads'\n | 'monthlyBoosts'\n | 'weeklyAutoBoost'\n | 'dailyVoiceCalls'\n | 'dailyVideoCalls'\n | 'voiceCallDurationMin'\n | 'videoCallDurationMin'\n | 'monthlyIntentChanges'\n | 'scoreVisibleProfiles';\n\n/** All boolean feature keys (on/off per plan). */\nexport type BooleanFeatureKey =\n | 'readReceipts'\n | 'incognitoMode'\n | 'voiceMessages'\n | 'voiceCalls'\n | 'videoCalls'\n | 'showAds'\n | 'priorityVisibility'\n | 'autoBoost'\n | 'seeProfileViewers'\n | 'messageBeforeMatch'\n | 'travelMode'\n | 'profileContentUnlock'\n | 'photoInsights'\n | 'exclusiveLeague';\n\n/** All string-enum feature keys. */\nexport type EnumFeatureKey = 'filterLevel' | 'whoLikedYou' | 'exploreAccess' | 'scoreBreakdown';\n\n/** Union of all feature keys that can be gated. */\nexport type FeatureKey = NumericFeatureKey | BooleanFeatureKey | EnumFeatureKey;\n\n/** Complete plan limits definition. */\nexport interface PlanLimits {\n // ── Numeric limits (daily/periodic) ──\n dailySwipes: number;\n dailyCompliments: number;\n dailyRewinds: number;\n dailyProfileVisits: number;\n monthlyNewChatThreads: number;\n monthlyBoosts: number;\n weeklyAutoBoost: number;\n dailyVoiceCalls: number;\n dailyVideoCalls: number;\n voiceCallDurationMin: number;\n videoCallDurationMin: number;\n monthlyIntentChanges: number;\n scoreVisibleProfiles: number;\n\n // ── Enum limits ──\n filterLevel: FilterLevel;\n whoLikedYou: WhoLikedYouLevel;\n exploreAccess: ExploreAccessLevel;\n scoreBreakdown: ScoreBreakdownLevel;\n\n // ── Boolean flags ──\n readReceipts: boolean;\n incognitoMode: boolean;\n voiceMessages: boolean;\n voiceCalls: boolean;\n videoCalls: boolean;\n showAds: boolean;\n priorityVisibility: boolean;\n autoBoost: boolean;\n seeProfileViewers: boolean;\n messageBeforeMatch: boolean;\n travelMode: boolean;\n profileContentUnlock: boolean;\n photoInsights: boolean;\n exclusiveLeague: boolean;\n}\n\n// ─── Plan Limits Config ──────────────────────────────────────────────────────\n\nexport const PLAN_LIMITS: Record<PlanId, PlanLimits> = {\n // ── Spark (Free) — Enough to hook, heavily limited ──\n spark: {\n dailySwipes: 20,\n dailyCompliments: 1,\n dailyRewinds: 0,\n dailyProfileVisits: 10,\n monthlyNewChatThreads: 5,\n monthlyBoosts: 0,\n weeklyAutoBoost: 0,\n dailyVoiceCalls: 0,\n dailyVideoCalls: 0,\n voiceCallDurationMin: 0,\n videoCallDurationMin: 0,\n monthlyIntentChanges: 2,\n scoreVisibleProfiles: 3,\n filterLevel: 'basic',\n whoLikedYou: 'none',\n exploreAccess: 'basic',\n scoreBreakdown: 'none',\n readReceipts: false,\n incognitoMode: false,\n voiceMessages: false,\n voiceCalls: false,\n videoCalls: false,\n showAds: true,\n priorityVisibility: false,\n autoBoost: false,\n seeProfileViewers: false,\n messageBeforeMatch: false,\n travelMode: false,\n profileContentUnlock: false,\n photoInsights: false,\n exclusiveLeague: false,\n },\n\n // ── Gold — Good value, removes major pain points ──\n gold: {\n dailySwipes: 80,\n dailyCompliments: 5,\n dailyRewinds: 3,\n dailyProfileVisits: 30,\n monthlyNewChatThreads: 15,\n monthlyBoosts: 1,\n weeklyAutoBoost: 0,\n dailyVoiceCalls: 2,\n dailyVideoCalls: 1,\n voiceCallDurationMin: 10,\n videoCallDurationMin: 10,\n monthlyIntentChanges: 4,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'advanced',\n whoLikedYou: 'blurred',\n exploreAccess: 'premium',\n scoreBreakdown: 'score',\n readReceipts: false,\n incognitoMode: false,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: false,\n autoBoost: false,\n seeProfileViewers: true,\n messageBeforeMatch: false,\n travelMode: false,\n profileContentUnlock: true,\n photoInsights: false,\n exclusiveLeague: false,\n },\n\n // ── Diamond (DECOY) — Generous but capped, pushes to Platinum ──\n diamond: {\n dailySwipes: 200,\n dailyCompliments: 15,\n dailyRewinds: 10,\n dailyProfileVisits: 100,\n monthlyNewChatThreads: 50,\n monthlyBoosts: 3,\n weeklyAutoBoost: 0,\n dailyVoiceCalls: 5,\n dailyVideoCalls: 3,\n voiceCallDurationMin: 20,\n videoCallDurationMin: 15,\n monthlyIntentChanges: 8,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'full',\n whoLikedYou: 'full',\n exploreAccess: 'premium',\n scoreBreakdown: 'score',\n readReceipts: true,\n incognitoMode: false,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: true,\n autoBoost: false,\n seeProfileViewers: true,\n messageBeforeMatch: false,\n travelMode: false,\n profileContentUnlock: true,\n photoInsights: true,\n exclusiveLeague: false,\n },\n\n // ── Platinum — Unlimited everything, the aspirational tier ──\n platinum: {\n dailySwipes: Infinity,\n dailyCompliments: Infinity,\n dailyRewinds: Infinity,\n dailyProfileVisits: Infinity,\n monthlyNewChatThreads: Infinity,\n monthlyBoosts: 7,\n weeklyAutoBoost: 1,\n dailyVoiceCalls: Infinity,\n dailyVideoCalls: Infinity,\n voiceCallDurationMin: Infinity,\n videoCallDurationMin: Infinity,\n monthlyIntentChanges: Infinity,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'full',\n whoLikedYou: 'realtime',\n exploreAccess: 'premium',\n scoreBreakdown: 'breakdown',\n readReceipts: true,\n incognitoMode: true,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: true,\n autoBoost: true,\n seeProfileViewers: true,\n messageBeforeMatch: true,\n travelMode: true,\n profileContentUnlock: true,\n photoInsights: true,\n exclusiveLeague: false,\n },\n\n // ── Black — Exclusive league for celebrities & HNIs ──\n // All Platinum features + exclusive league (only Black users see each other)\n black: {\n dailySwipes: Infinity,\n dailyCompliments: Infinity,\n dailyRewinds: Infinity,\n dailyProfileVisits: Infinity,\n monthlyNewChatThreads: Infinity,\n monthlyBoosts: 7,\n weeklyAutoBoost: 1,\n dailyVoiceCalls: Infinity,\n dailyVideoCalls: Infinity,\n voiceCallDurationMin: Infinity,\n videoCallDurationMin: Infinity,\n monthlyIntentChanges: Infinity,\n scoreVisibleProfiles: Infinity,\n filterLevel: 'full',\n whoLikedYou: 'realtime',\n exploreAccess: 'premium',\n scoreBreakdown: 'breakdown',\n readReceipts: true,\n incognitoMode: true,\n voiceMessages: true,\n voiceCalls: true,\n videoCalls: true,\n showAds: false,\n priorityVisibility: true,\n autoBoost: true,\n seeProfileViewers: true,\n messageBeforeMatch: true,\n travelMode: true,\n profileContentUnlock: true,\n photoInsights: true,\n exclusiveLeague: true,\n },\n} as const;\n\n// ─── Plan Tier Helpers ──────────────────────────────────────────────────────\n\n/** All valid plan IDs in tier order. */\nexport const PLAN_IDS: PlanId[] = ['spark', 'gold', 'diamond', 'platinum', 'black'];\n\n/** Paid plans (Gold and above). */\nexport const PAID_PLANS: PlanId[] = ['gold', 'diamond', 'platinum', 'black'];\n\n/** Premium plans (Diamond and above). */\nexport const PREMIUM_PLANS: PlanId[] = ['diamond', 'platinum', 'black'];\n\n/** Top-tier plans (Platinum and Black). */\nexport const TOP_PLANS: PlanId[] = ['platinum', 'black'];\n\n/** Check if a plan is paid (not Spark). */\nexport function isPaidPlan(planId: PlanId): boolean {\n return planId !== 'spark';\n}\n\n/** Premium explore categories that require Gold+ to access. */\nexport const PREMIUM_EXPLORE_CATEGORIES = [\n 'high-iq',\n 'elite-institute',\n 'wealth-dating',\n 'casual',\n 'nri-dating',\n 'senior-dating',\n 'lgbtq',\n 'second-innings',\n] as const;\n\n// ─── Feature Display Config (UI source of truth) ────────────────────────────\n\n/** How a feature appears in UI — per-plan value can be a string (quantity), true (check), or false (locked). */\nexport interface FeatureDisplayItem {\n /** Unique key matching a FeatureKey or custom display key */\n key: string;\n /** Human-readable label */\n label: string;\n /** Per-plan display value: string = show text, true = checkmark, false = locked/unavailable */\n plans: Record<PlanId, string | boolean>;\n}\n\n/**\n * Master feature list for plan comparison UI.\n * Derived from PLAN_LIMITS but with human-readable labels and display values.\n * This is the single source of truth for what features each plan shows.\n */\nexport const PLAN_FEATURE_DISPLAY: FeatureDisplayItem[] = [\n { key: 'dailySwipes', label: 'Daily swipes', plans: { spark: '20/day', gold: '80/day', diamond: '200/day', platinum: 'Unlimited', black: 'Unlimited' } },\n { key: 'dailyCompliments', label: 'Daily compliments', plans: { spark: '1/day', gold: '5/day', diamond: '15/day', platinum: 'Unlimited', black: 'Unlimited' } },\n { key: 'dailyRewinds', label: 'Rewinds', plans: { spark: false, gold: '3/day', diamond: '10/day', platinum: 'Unlimited', black: 'Unlimited' } },\n { key: 'calls', label: 'Voice & video calls', plans: { spark: false, gold: 'Limited', diamond: 'Limited', platinum: 'Unlimited', black: 'Unlimited' } },\n { key: 'whoLikedYou', label: 'Who Liked You', plans: { spark: false, gold: 'Blurred', diamond: 'Full list', platinum: 'Real-time', black: 'Real-time' } },\n { key: 'filterLevel', label: 'Filters', plans: { spark: 'Basic', gold: 'Advanced', diamond: 'Full (147)', platinum: 'Full (147)', black: 'Full (147)' } },\n { key: 'monthlyBoosts', label: 'Monthly boosts', plans: { spark: false, gold: '1/month', diamond: '3/month', platinum: '7/month', black: '7/month' } },\n { key: 'monthlyNewChatThreads', label: 'New chat threads', plans: { spark: '5/month', gold: '15/month', diamond: '50/month', platinum: 'Unlimited', black: 'Unlimited' } },\n { key: 'readReceipts', label: 'Read receipts', plans: { spark: false, gold: false, diamond: true, platinum: true, black: true } },\n { key: 'seeProfileViewers', label: 'Profile viewers', plans: { spark: false, gold: true, diamond: true, platinum: true, black: true } },\n { key: 'photoInsights', label: 'Photo insights', plans: { spark: false, gold: false, diamond: true, platinum: true, black: true } },\n { key: 'priorityVisibility', label: 'Priority visibility', plans: { spark: false, gold: false, diamond: true, platinum: true, black: true } },\n { key: 'autoBoost', label: 'Auto-boost weekly', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },\n { key: 'incognitoMode', label: 'Incognito mode', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },\n { key: 'travelMode', label: 'Travel mode', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },\n { key: 'messageBeforeMatch', label: 'Message before match', plans: { spark: false, gold: false, diamond: false, platinum: true, black: true } },\n { key: 'exclusiveLeague', label: 'Exclusive League', plans: { spark: false, gold: false, diamond: false, platinum: false, black: true } },\n { key: 'vipSupport', label: 'VIP support', plans: { spark: false, gold: false, diamond: false, platinum: false, black: true } },\n { key: 'showAds', label: 'Ad-free', plans: { spark: false, gold: true, diamond: true, platinum: true, black: true } },\n];\n\n/**\n * Get features for a plan, split into included (with values) and locked.\n * Included features come first, locked features last.\n */\nexport function getPlanFeatureDisplay(planId: PlanId): {\n included: { key: string; label: string; value: string | true }[];\n locked: { key: string; label: string }[];\n} {\n const included: { key: string; label: string; value: string | true }[] = [];\n const locked: { key: string; label: string }[] = [];\n\n for (const f of PLAN_FEATURE_DISPLAY) {\n const val = f.plans[planId];\n if (val === false) {\n locked.push({ key: f.key, label: f.label });\n } else if (val === true) {\n included.push({ key: f.key, label: f.label, value: true });\n } else {\n included.push({ key: f.key, label: f.label, value: val });\n }\n }\n\n return { included, locked };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Get the limits object for a plan. */\nexport function getPlanLimits(planId: PlanId): PlanLimits {\n return PLAN_LIMITS[planId];\n}\n\n/** Get a specific limit value for a plan + feature. */\nexport function getPlanLimit<K extends FeatureKey>(planId: PlanId, feature: K): PlanLimits[K] {\n return PLAN_LIMITS[planId][feature];\n}\n\n/**\n * Check if a boolean feature is enabled for a plan.\n * Returns `false` for non-boolean features.\n */\nexport function isFeatureEnabled(planId: PlanId, feature: BooleanFeatureKey): boolean {\n return PLAN_LIMITS[planId][feature];\n}\n\n/**\n * Check if a numeric feature has remaining capacity.\n * Returns `true` if the limit is Infinity or greater than current usage.\n */\nexport function hasRemainingQuota(\n planId: PlanId,\n feature: NumericFeatureKey,\n currentUsage: number,\n): boolean {\n const limit = PLAN_LIMITS[planId][feature];\n return limit === Infinity || currentUsage < limit;\n}\n\n/**\n * Get the minimum plan required for a boolean feature.\n * Returns undefined if no plan enables it.\n */\nexport function getMinPlanForFeature(feature: BooleanFeatureKey): PlanId | undefined {\n return PLAN_IDS.find((id) => PLAN_LIMITS[id][feature] === true);\n}\n"]}
@@ -152,8 +152,8 @@ export const heroIdentity = {
152
152
  },
153
153
  {
154
154
  order: 6,
155
- key: 'currentCity',
156
- label: 'Current City',
155
+ key: 'currentLocation',
156
+ label: 'Current Location',
157
157
  type: 'location',
158
158
  tier: 1,
159
159
  isFilter: true,
@@ -1 +1 @@
1
- {"version":3,"file":"01-hero-identity.js","sourceRoot":"","sources":["../../src/profile-fields/01-hero-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FieldGroup } from './types.js';\n\nexport const heroIdentity: FieldGroup = {\n key: 'hero_identity',\n label: 'Hero & Identity',\n description: 'Core identity shown in the hero section of your profile.',\n tier: 1,\n fields: [\n {\n order: 1,\n key: 'photos',\n label: 'Photos',\n type: 'image_upload',\n min: 2,\n max: 6,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n description: 'Upload 2-6 photos. Your first photo is your first impression.',\n },\n {\n order: 2,\n key: 'displayName',\n label: 'Display Name',\n type: 'text',\n maxLength: 50,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n prefillFrom: 'user.firstName + user.lastName',\n description: 'Your name as shown to others.',\n },\n {\n order: 3,\n key: 'dateOfBirth',\n label: 'Date of Birth',\n type: 'date',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.dateOfBirth',\n description: 'Your age is computed from this. Only age is shown, not the date.',\n },\n {\n order: 4,\n key: 'gender',\n label: 'Gender',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.gender',\n options: [\n { value: 'man', label: 'Man', description: 'Identify as male' },\n { value: 'woman', label: 'Woman', description: 'Identify as female' },\n {\n value: 'non_binary',\n label: 'Non-binary',\n description: 'Neither exclusively male nor female',\n },\n {\n value: 'trans_man',\n label: 'Trans Man',\n description: 'Assigned female at birth, identify as male',\n },\n {\n value: 'trans_woman',\n label: 'Trans Woman',\n description: 'Assigned male at birth, identify as female',\n },\n {\n value: 'genderfluid',\n label: 'Genderfluid',\n description: 'Gender identity shifts over time',\n },\n {\n value: 'genderqueer',\n label: 'Genderqueer',\n description: 'Outside the traditional gender binary',\n },\n { value: 'agender', label: 'Agender', description: 'No gender identity or gender-neutral' },\n {\n value: 'bigender',\n label: 'Bigender',\n description: 'Identify as two genders simultaneously or alternating',\n },\n {\n value: 'pangender',\n label: 'Pangender',\n description: 'Identify with all genders or many gender identities',\n },\n {\n value: 'androgynous',\n label: 'Androgynous',\n description: 'Blend of masculine and feminine expression',\n },\n {\n value: 'intersex',\n label: 'Intersex',\n description: \"Born with sex characteristics that don't fit typical male/female\",\n },\n {\n value: 'gender_nonconforming',\n label: 'Gender Non-conforming',\n description: \"Expression doesn't align with conventional expectations\",\n },\n {\n value: 'two_spirit',\n label: 'Two-Spirit',\n description: 'Indigenous identity encompassing multiple genders',\n },\n {\n value: 'hijra',\n label: 'Hijra',\n description: 'South Asian third-gender identity — legally recognized in India',\n },\n { value: 'other', label: 'Other', description: 'Another identity not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 5,\n key: 'pronouns',\n label: 'Pronouns',\n type: 'single_select',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n options: [\n { value: 'he_him', label: 'He/Him', description: 'Masculine pronouns' },\n { value: 'she_her', label: 'She/Her', description: 'Feminine pronouns' },\n { value: 'they_them', label: 'They/Them', description: 'Gender-neutral pronouns' },\n { value: 'he_they', label: 'He/They', description: 'Use either he/him or they/them' },\n { value: 'she_they', label: 'She/They', description: 'Use either she/her or they/them' },\n { value: 'ze_zir', label: 'Ze/Zir', description: 'Neopronouns — ze laughed, I called zir' },\n { value: 'xe_xem', label: 'Xe/Xem', description: 'Neopronouns — xe laughed, I called xem' },\n {\n value: 'any_pronouns',\n label: 'Any Pronouns',\n description: 'Comfortable with all pronouns',\n },\n { value: 'ask_me', label: 'Ask Me', description: 'Prefer to be asked in person' },\n { value: 'other', label: 'Other', description: 'Pronouns not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 6,\n key: 'currentCity',\n label: 'Current City',\n type: 'location',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.currentLocationDisplay',\n description: 'Where you currently live.',\n },\n {\n order: 7,\n key: 'hometown',\n label: 'Hometown / Native Place',\n type: 'text',\n maxLength: 100,\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.hometown',\n description: \"Where you're originally from.\",\n },\n {\n order: 8,\n key: 'searchRadius',\n label: 'Search Radius',\n type: 'range_slider',\n min: 1,\n max: 500,\n unit: 'km',\n default: 50,\n tier: 'internal',\n isFilter: true,\n isOnboarding: false,\n description: 'How far to search for matches.',\n },\n {\n order: 9,\n key: 'relationshipIntent',\n label: 'Relationship Intent',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n {\n value: 'life_partner',\n label: 'Life Partner / Marriage',\n description: 'Ready to settle down — looking for a spouse or lifelong commitment',\n },\n {\n value: 'long_term',\n label: 'Long-term Relationship',\n description: 'Serious & committed, but not necessarily leading to marriage',\n },\n {\n value: 'long_term_open_to_short',\n label: 'Long-term, Open to Short',\n description: 'Ideally something serious, but open to seeing where things go',\n },\n {\n value: 'short_term_open_to_long',\n label: 'Short-term, Open to Long',\n description: \"Keeping it light for now, but won't say no if it turns serious\",\n },\n {\n value: 'casual_dating',\n label: 'Casual Dating',\n description: 'Going on dates & having fun — no commitment pressure',\n },\n {\n value: 'hookup',\n label: 'Hookups / Physical Intimacy',\n description: 'Purely physical connection — no strings attached',\n },\n {\n value: 'companionship',\n label: 'Companionship',\n description: 'Emotional connection & company — without traditional relationship labels',\n },\n {\n value: 'ethical_non_monogamy',\n label: 'ENM / Poly Partner',\n description: 'Looking for additional partner(s) in an ethically non-monogamous setup',\n },\n {\n value: 'activity_partner',\n label: 'Activity Partner',\n description:\n 'Someone to share hobbies & experiences with — hiking, travel, concerts etc.',\n },\n {\n value: 'new_friends',\n label: 'New Friends',\n description: 'Platonic friendships — no romantic expectations',\n },\n {\n value: 'figuring_out',\n label: 'Still Figuring It Out',\n description: 'Not sure yet — just exploring and seeing what clicks',\n },\n ],\n },\n {\n order: 10,\n key: 'sexualOrientation',\n label: 'Sexual Orientation',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'straight', label: 'Straight', description: 'Attracted to the opposite gender' },\n { value: 'gay', label: 'Gay', description: 'Men attracted to men' },\n { value: 'lesbian', label: 'Lesbian', description: 'Women attracted to women' },\n { value: 'bisexual', label: 'Bisexual', description: 'Attracted to both men and women' },\n {\n value: 'pansexual',\n label: 'Pansexual',\n description: 'Attracted to people regardless of gender',\n },\n {\n value: 'asexual',\n label: 'Asexual',\n description: 'Little or no sexual attraction to anyone',\n },\n {\n value: 'demisexual',\n label: 'Demisexual',\n description: 'Sexual attraction only after emotional bond',\n },\n {\n value: 'aromantic',\n label: 'Aromantic',\n description: 'Little or no romantic attraction — may still feel sexual attraction',\n },\n {\n value: 'graysexual',\n label: 'Graysexual',\n description: 'Rarely experiences sexual attraction — between asexual and sexual',\n },\n {\n value: 'omnisexual',\n label: 'Omnisexual',\n description: 'Attracted to all genders, but gender plays a role in attraction',\n },\n {\n value: 'fluid',\n label: 'Fluid',\n description: 'Sexual orientation shifts over time or context',\n },\n {\n value: 'queer',\n label: 'Queer',\n description: 'Umbrella term for non-straight identities',\n },\n {\n value: 'questioning',\n label: 'Questioning',\n description: 'Still exploring your orientation',\n },\n {\n value: 'homoflexible',\n label: 'Homoflexible',\n description: 'Mostly same-gender attracted, occasionally not',\n },\n {\n value: 'heteroflexible',\n label: 'Heteroflexible',\n description: 'Mostly opposite-gender attracted, occasionally not',\n },\n {\n value: 'sapiosexual',\n label: 'Sapiosexual',\n description: 'Attracted primarily to intelligence',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 11,\n key: 'relationshipStructure',\n label: 'Relationship Structure',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'monogamy', label: 'Monogamy', description: 'One committed partner' },\n {\n value: 'ethical_non_monogamy',\n label: 'Ethical non-monogamy',\n description: 'Open with honesty and consent',\n },\n {\n value: 'open_relationship',\n label: 'Open relationship',\n description: 'Committed primary partner, open to others',\n },\n { value: 'polyamory', label: 'Polyamory', description: 'Multiple loving relationships' },\n {\n value: 'relationship_anarchy',\n label: 'Relationship Anarchy',\n description: 'No hierarchy — each relationship defined on its own terms',\n },\n {\n value: 'open_to_exploring',\n label: 'Open to exploring',\n description: 'Flexible, willing to discuss',\n },\n {\n value: 'figuring_out',\n label: 'Figuring out my relationship type',\n description: 'Still learning what works for you',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 12,\n key: 'mbtiType',\n label: 'MBTI Personality Type',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n isOnboardingOptional: true,\n options: [\n { value: 'INTJ', label: 'INTJ — The Architect' },\n { value: 'INTP', label: 'INTP — The Logician' },\n { value: 'ENTJ', label: 'ENTJ — The Commander' },\n { value: 'ENTP', label: 'ENTP — The Debater' },\n { value: 'INFJ', label: 'INFJ — The Advocate' },\n { value: 'INFP', label: 'INFP — The Mediator' },\n { value: 'ENFJ', label: 'ENFJ — The Protagonist' },\n { value: 'ENFP', label: 'ENFP — The Campaigner' },\n { value: 'ISTJ', label: 'ISTJ — The Logistician' },\n { value: 'ISFJ', label: 'ISFJ — The Defender' },\n { value: 'ESTJ', label: 'ESTJ — The Executive' },\n { value: 'ESFJ', label: 'ESFJ — The Consul' },\n { value: 'ISTP', label: 'ISTP — The Virtuoso' },\n { value: 'ISFP', label: 'ISFP — The Adventurer' },\n { value: 'ESTP', label: 'ESTP — The Entrepreneur' },\n { value: 'ESFP', label: 'ESFP — The Entertainer' },\n { value: 'dont_know', label: \"Don't know yet\" },\n { value: 'prefer_not_to_say', label: 'Prefer not to say' },\n ],\n },\n ],\n};\n"]}
1
+ {"version":3,"file":"01-hero-identity.js","sourceRoot":"","sources":["../../src/profile-fields/01-hero-identity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FieldGroup } from './types.js';\n\nexport const heroIdentity: FieldGroup = {\n key: 'hero_identity',\n label: 'Hero & Identity',\n description: 'Core identity shown in the hero section of your profile.',\n tier: 1,\n fields: [\n {\n order: 1,\n key: 'photos',\n label: 'Photos',\n type: 'image_upload',\n min: 2,\n max: 6,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n description: 'Upload 2-6 photos. Your first photo is your first impression.',\n },\n {\n order: 2,\n key: 'displayName',\n label: 'Display Name',\n type: 'text',\n maxLength: 50,\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n prefillFrom: 'user.firstName + user.lastName',\n description: 'Your name as shown to others.',\n },\n {\n order: 3,\n key: 'dateOfBirth',\n label: 'Date of Birth',\n type: 'date',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.dateOfBirth',\n description: 'Your age is computed from this. Only age is shown, not the date.',\n },\n {\n order: 4,\n key: 'gender',\n label: 'Gender',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.gender',\n options: [\n { value: 'man', label: 'Man', description: 'Identify as male' },\n { value: 'woman', label: 'Woman', description: 'Identify as female' },\n {\n value: 'non_binary',\n label: 'Non-binary',\n description: 'Neither exclusively male nor female',\n },\n {\n value: 'trans_man',\n label: 'Trans Man',\n description: 'Assigned female at birth, identify as male',\n },\n {\n value: 'trans_woman',\n label: 'Trans Woman',\n description: 'Assigned male at birth, identify as female',\n },\n {\n value: 'genderfluid',\n label: 'Genderfluid',\n description: 'Gender identity shifts over time',\n },\n {\n value: 'genderqueer',\n label: 'Genderqueer',\n description: 'Outside the traditional gender binary',\n },\n { value: 'agender', label: 'Agender', description: 'No gender identity or gender-neutral' },\n {\n value: 'bigender',\n label: 'Bigender',\n description: 'Identify as two genders simultaneously or alternating',\n },\n {\n value: 'pangender',\n label: 'Pangender',\n description: 'Identify with all genders or many gender identities',\n },\n {\n value: 'androgynous',\n label: 'Androgynous',\n description: 'Blend of masculine and feminine expression',\n },\n {\n value: 'intersex',\n label: 'Intersex',\n description: \"Born with sex characteristics that don't fit typical male/female\",\n },\n {\n value: 'gender_nonconforming',\n label: 'Gender Non-conforming',\n description: \"Expression doesn't align with conventional expectations\",\n },\n {\n value: 'two_spirit',\n label: 'Two-Spirit',\n description: 'Indigenous identity encompassing multiple genders',\n },\n {\n value: 'hijra',\n label: 'Hijra',\n description: 'South Asian third-gender identity — legally recognized in India',\n },\n { value: 'other', label: 'Other', description: 'Another identity not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 5,\n key: 'pronouns',\n label: 'Pronouns',\n type: 'single_select',\n tier: 1,\n isFilter: false,\n isOnboarding: true,\n options: [\n { value: 'he_him', label: 'He/Him', description: 'Masculine pronouns' },\n { value: 'she_her', label: 'She/Her', description: 'Feminine pronouns' },\n { value: 'they_them', label: 'They/Them', description: 'Gender-neutral pronouns' },\n { value: 'he_they', label: 'He/They', description: 'Use either he/him or they/them' },\n { value: 'she_they', label: 'She/They', description: 'Use either she/her or they/them' },\n { value: 'ze_zir', label: 'Ze/Zir', description: 'Neopronouns — ze laughed, I called zir' },\n { value: 'xe_xem', label: 'Xe/Xem', description: 'Neopronouns — xe laughed, I called xem' },\n {\n value: 'any_pronouns',\n label: 'Any Pronouns',\n description: 'Comfortable with all pronouns',\n },\n { value: 'ask_me', label: 'Ask Me', description: 'Prefer to be asked in person' },\n { value: 'other', label: 'Other', description: 'Pronouns not listed here' },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 6,\n key: 'currentLocation',\n label: 'Current Location',\n type: 'location',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.currentLocationDisplay',\n description: 'Where you currently live.',\n },\n {\n order: 7,\n key: 'hometown',\n label: 'Hometown / Native Place',\n type: 'text',\n maxLength: 100,\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n prefillFrom: 'user.hometown',\n description: \"Where you're originally from.\",\n },\n {\n order: 8,\n key: 'searchRadius',\n label: 'Search Radius',\n type: 'range_slider',\n min: 1,\n max: 500,\n unit: 'km',\n default: 50,\n tier: 'internal',\n isFilter: true,\n isOnboarding: false,\n description: 'How far to search for matches.',\n },\n {\n order: 9,\n key: 'relationshipIntent',\n label: 'Relationship Intent',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n {\n value: 'life_partner',\n label: 'Life Partner / Marriage',\n description: 'Ready to settle down — looking for a spouse or lifelong commitment',\n },\n {\n value: 'long_term',\n label: 'Long-term Relationship',\n description: 'Serious & committed, but not necessarily leading to marriage',\n },\n {\n value: 'long_term_open_to_short',\n label: 'Long-term, Open to Short',\n description: 'Ideally something serious, but open to seeing where things go',\n },\n {\n value: 'short_term_open_to_long',\n label: 'Short-term, Open to Long',\n description: \"Keeping it light for now, but won't say no if it turns serious\",\n },\n {\n value: 'casual_dating',\n label: 'Casual Dating',\n description: 'Going on dates & having fun — no commitment pressure',\n },\n {\n value: 'hookup',\n label: 'Hookups / Physical Intimacy',\n description: 'Purely physical connection — no strings attached',\n },\n {\n value: 'companionship',\n label: 'Companionship',\n description: 'Emotional connection & company — without traditional relationship labels',\n },\n {\n value: 'ethical_non_monogamy',\n label: 'ENM / Poly Partner',\n description: 'Looking for additional partner(s) in an ethically non-monogamous setup',\n },\n {\n value: 'activity_partner',\n label: 'Activity Partner',\n description:\n 'Someone to share hobbies & experiences with — hiking, travel, concerts etc.',\n },\n {\n value: 'new_friends',\n label: 'New Friends',\n description: 'Platonic friendships — no romantic expectations',\n },\n {\n value: 'figuring_out',\n label: 'Still Figuring It Out',\n description: 'Not sure yet — just exploring and seeing what clicks',\n },\n ],\n },\n {\n order: 10,\n key: 'sexualOrientation',\n label: 'Sexual Orientation',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'straight', label: 'Straight', description: 'Attracted to the opposite gender' },\n { value: 'gay', label: 'Gay', description: 'Men attracted to men' },\n { value: 'lesbian', label: 'Lesbian', description: 'Women attracted to women' },\n { value: 'bisexual', label: 'Bisexual', description: 'Attracted to both men and women' },\n {\n value: 'pansexual',\n label: 'Pansexual',\n description: 'Attracted to people regardless of gender',\n },\n {\n value: 'asexual',\n label: 'Asexual',\n description: 'Little or no sexual attraction to anyone',\n },\n {\n value: 'demisexual',\n label: 'Demisexual',\n description: 'Sexual attraction only after emotional bond',\n },\n {\n value: 'aromantic',\n label: 'Aromantic',\n description: 'Little or no romantic attraction — may still feel sexual attraction',\n },\n {\n value: 'graysexual',\n label: 'Graysexual',\n description: 'Rarely experiences sexual attraction — between asexual and sexual',\n },\n {\n value: 'omnisexual',\n label: 'Omnisexual',\n description: 'Attracted to all genders, but gender plays a role in attraction',\n },\n {\n value: 'fluid',\n label: 'Fluid',\n description: 'Sexual orientation shifts over time or context',\n },\n {\n value: 'queer',\n label: 'Queer',\n description: 'Umbrella term for non-straight identities',\n },\n {\n value: 'questioning',\n label: 'Questioning',\n description: 'Still exploring your orientation',\n },\n {\n value: 'homoflexible',\n label: 'Homoflexible',\n description: 'Mostly same-gender attracted, occasionally not',\n },\n {\n value: 'heteroflexible',\n label: 'Heteroflexible',\n description: 'Mostly opposite-gender attracted, occasionally not',\n },\n {\n value: 'sapiosexual',\n label: 'Sapiosexual',\n description: 'Attracted primarily to intelligence',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 11,\n key: 'relationshipStructure',\n label: 'Relationship Structure',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n options: [\n { value: 'monogamy', label: 'Monogamy', description: 'One committed partner' },\n {\n value: 'ethical_non_monogamy',\n label: 'Ethical non-monogamy',\n description: 'Open with honesty and consent',\n },\n {\n value: 'open_relationship',\n label: 'Open relationship',\n description: 'Committed primary partner, open to others',\n },\n { value: 'polyamory', label: 'Polyamory', description: 'Multiple loving relationships' },\n {\n value: 'relationship_anarchy',\n label: 'Relationship Anarchy',\n description: 'No hierarchy — each relationship defined on its own terms',\n },\n {\n value: 'open_to_exploring',\n label: 'Open to exploring',\n description: 'Flexible, willing to discuss',\n },\n {\n value: 'figuring_out',\n label: 'Figuring out my relationship type',\n description: 'Still learning what works for you',\n },\n {\n value: 'prefer_not_to_say',\n label: 'Prefer not to say',\n description: 'Keep this private',\n },\n ],\n },\n {\n order: 12,\n key: 'mbtiType',\n label: 'MBTI Personality Type',\n type: 'single_select',\n tier: 1,\n isFilter: true,\n isOnboarding: true,\n isOnboardingOptional: true,\n options: [\n { value: 'INTJ', label: 'INTJ — The Architect' },\n { value: 'INTP', label: 'INTP — The Logician' },\n { value: 'ENTJ', label: 'ENTJ — The Commander' },\n { value: 'ENTP', label: 'ENTP — The Debater' },\n { value: 'INFJ', label: 'INFJ — The Advocate' },\n { value: 'INFP', label: 'INFP — The Mediator' },\n { value: 'ENFJ', label: 'ENFJ — The Protagonist' },\n { value: 'ENFP', label: 'ENFP — The Campaigner' },\n { value: 'ISTJ', label: 'ISTJ — The Logistician' },\n { value: 'ISFJ', label: 'ISFJ — The Defender' },\n { value: 'ESTJ', label: 'ESTJ — The Executive' },\n { value: 'ESFJ', label: 'ESFJ — The Consul' },\n { value: 'ISTP', label: 'ISTP — The Virtuoso' },\n { value: 'ISFP', label: 'ISFP — The Adventurer' },\n { value: 'ESTP', label: 'ESTP — The Entrepreneur' },\n { value: 'ESFP', label: 'ESFP — The Entertainer' },\n { value: 'dont_know', label: \"Don't know yet\" },\n { value: 'prefer_not_to_say', label: 'Prefer not to say' },\n ],\n },\n ],\n};\n"]}