@namiml/sdk-core 3.5.0-dev.202610312243 → 3.5.0-dev.202611011529

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.cjs CHANGED
@@ -106,7 +106,7 @@ const {
106
106
  // version — stamped by scripts/version.sh
107
107
  NAMI_SDK_VERSION: exports.NAMI_SDK_VERSION = "3.5.0",
108
108
  // full package version including dev suffix — stamped by scripts/version.sh
109
- NAMI_SDK_PACKAGE_VERSION: exports.NAMI_SDK_PACKAGE_VERSION = "3.5.0-dev.202610312243",
109
+ NAMI_SDK_PACKAGE_VERSION: exports.NAMI_SDK_PACKAGE_VERSION = "3.5.0-dev.202611011529",
110
110
  // environments
111
111
  PRODUCTION: exports.PRODUCTION = "production", DEVELOPMENT: exports.DEVELOPMENT = "development",
112
112
  // error messages
@@ -64652,33 +64652,60 @@ let NamiFlowManager$2 = class NamiFlowManager {
64652
64652
  getCurrentFlowProgress(key) {
64653
64653
  if (!this.currentFlow)
64654
64654
  return 1;
64655
- if (!this.currentFlow.currentFlowStep)
64655
+ const position = this.getCurrentFlowStepPosition();
64656
+ if (!position)
64657
+ return 0;
64658
+ let progress = position.index / position.total;
64659
+ progress = Math.max(0, Math.min(1, progress));
64660
+ if (key) {
64661
+ this.setLastAnimatedFlowProgress(key, progress);
64662
+ }
64663
+ return progress;
64664
+ }
64665
+ /**
64666
+ * Gets the 1-based position of the current screen within the flow, using the
64667
+ * same step math as {@link getCurrentFlowProgress}.
64668
+ * @returns The current step index (1-based), or 0 when unknown
64669
+ */
64670
+ getCurrentFlowStepIndex() {
64671
+ const position = this.getCurrentFlowStepPosition();
64672
+ if (!position)
64656
64673
  return 0;
64674
+ return Math.max(0, Math.min(position.total, position.index));
64675
+ }
64676
+ /**
64677
+ * Gets the total number of screen steps the current flow's progress is measured against.
64678
+ * @returns The total step count, or 0 when unknown (no open flow, no current step, no screens)
64679
+ */
64680
+ getTotalFlowSteps() {
64681
+ return this.getCurrentFlowStepPosition()?.total ?? 0;
64682
+ }
64683
+ /**
64684
+ * Resolves the current flow position as an integer pair. `index / total` is the
64685
+ * flow progress. Returns null when the position is unknown.
64686
+ */
64687
+ getCurrentFlowStepPosition() {
64688
+ if (!this.currentFlow)
64689
+ return null;
64690
+ if (!this.currentFlow.currentFlowStep)
64691
+ return null;
64657
64692
  const allScreens = this.currentFlow.steps.filter(step => step.type === NamiFlowStepType.SCREEN);
64658
64693
  if (allScreens.length === 0)
64659
- return 0;
64694
+ return null;
64660
64695
  const visitedScreens = this.currentFlow.stepcrumbs.filter(step => step.type === NamiFlowStepType.SCREEN);
64661
64696
  if (visitedScreens.length === 0)
64662
- return 0;
64697
+ return null;
64663
64698
  const navGraph = this.buildNavGraph(this.currentFlow);
64664
64699
  const currentStep = this.currentFlow.currentFlowStep;
64665
64700
  // Find the branch point (first screen with multiple forward paths)
64666
64701
  const branchPoint = this.findBranchPoint(allScreens, navGraph);
64667
- let progress = 0;
64668
64702
  if (branchPoint) {
64669
64703
  // Branching flow
64670
- progress = this.calculateBranchingProgress(visitedScreens, allScreens, currentStep, branchPoint, navGraph);
64671
- }
64672
- else {
64673
- // Linear flow
64674
- const currentIndex = allScreens.findIndex(s => s.id === currentStep.id);
64675
- progress = currentIndex >= 0 ? (currentIndex + 1) / allScreens.length : 0;
64676
- }
64677
- progress = Math.max(0, Math.min(1, progress));
64678
- if (key) {
64679
- this.setLastAnimatedFlowProgress(key, progress);
64704
+ return this.calculateBranchingProgress(visitedScreens, allScreens, currentStep, branchPoint, navGraph);
64680
64705
  }
64681
- return progress;
64706
+ // Linear flow
64707
+ const currentIndex = allScreens.findIndex(s => s.id === currentStep.id);
64708
+ return { index: currentIndex >= 0 ? currentIndex + 1 : 0, total: allScreens.length };
64682
64709
  }
64683
64710
  /**
64684
64711
  * Find the first screen that has branching (multiple forward navigation targets)
@@ -64692,7 +64719,8 @@ let NamiFlowManager$2 = class NamiFlowManager {
64692
64719
  return null;
64693
64720
  }
64694
64721
  /**
64695
- * Calculate progress for flows with branching (supports 2+ branches)
64722
+ * Calculate the step position for flows with branching (supports 2+ branches).
64723
+ * Progress is `index / total`.
64696
64724
  */
64697
64725
  calculateBranchingProgress(visitedScreens, allScreens, currentStep, branchPoint, navGraph) {
64698
64726
  const visitedCount = visitedScreens.length;
@@ -64706,14 +64734,14 @@ let NamiFlowManager$2 = class NamiFlowManager {
64706
64734
  // - visitedScreens = currentPosition + 1 (0-indexed)
64707
64735
  // - minimumTotalPathLength = branchPosition + 2
64708
64736
  // (all screens before branch + branch itself + at least 1 screen after)
64709
- return (currentIndexInAll + 1) / (branchPointIndexInAll + 2);
64737
+ return { index: currentIndexInAll + 1, total: branchPointIndexInAll + 2 };
64710
64738
  }
64711
64739
  // Case 2: Past the branch point (entered a specific branch)
64712
64740
  // Calculate based on: visitedScreens / (visitedScreens + remainingInThisBranch)
64713
64741
  const remainingInBranch = this.countForwardScreens(currentStep, allScreens, navGraph);
64714
64742
  const totalPathLength = visitedCount + remainingInBranch;
64715
64743
  logger.debug(`Branching progress: visited=${visitedCount}, remaining=${remainingInBranch}, total=${totalPathLength}, step=${currentStep.id}`);
64716
- return visitedCount / totalPathLength;
64744
+ return { index: visitedCount, total: totalPathLength };
64717
64745
  }
64718
64746
  /**
64719
64747
  * Count how many screens are forward-reachable from the current step
@@ -64811,6 +64839,12 @@ let NamiFlowManager$2 = class NamiFlowManager {
64811
64839
  static getCurrentFlowProgress(key) {
64812
64840
  return this.instance.getCurrentFlowProgress(key);
64813
64841
  }
64842
+ static getCurrentFlowStepIndex() {
64843
+ return this.instance.getCurrentFlowStepIndex();
64844
+ }
64845
+ static getTotalFlowSteps() {
64846
+ return this.instance.getTotalFlowSteps();
64847
+ }
64814
64848
  /**
64815
64849
  * Gets the current flow step's auto-advance delay (in seconds)
64816
64850
  * Parses __appear__ actions to find flowNav/flowNext with a delay parameter
@@ -67015,6 +67049,111 @@ function aggregateScreenreaderText(page, focusedButtonLabel = '') {
67015
67049
  return joinFragments(fragments);
67016
67050
  }
67017
67051
 
67052
+ /**
67053
+ * Step model for the stepped `progressIndicator` (`style: "steps"`).
67054
+ *
67055
+ * Pure helpers shared by every TypeScript renderer (Web, Expo). Apple and
67056
+ * Android mirror these rules natively, so keep the behaviour in sync with
67057
+ * them when changing anything here.
67058
+ */
67059
+ /** Smallest step count a fixed (non-"auto") `stepCount` resolves to. */
67060
+ const MIN_FIXED_STEP_COUNT = 2;
67061
+ /** Largest step count a fixed (non-"auto") `stepCount` resolves to. */
67062
+ const MAX_FIXED_STEP_COUNT = 12;
67063
+ /**
67064
+ * Parses a numeric field that may arrive as a number or as a numeric string
67065
+ * (for example from smart text). Returns NaN for "auto", missing, empty or
67066
+ * unparseable values.
67067
+ */
67068
+ function parseStepNumber(value) {
67069
+ if (typeof value === "number")
67070
+ return Number.isFinite(value) ? value : NaN;
67071
+ if (typeof value === "string") {
67072
+ const trimmed = value.trim();
67073
+ if (trimmed === "")
67074
+ return NaN;
67075
+ const parsed = Number(trimmed);
67076
+ return Number.isFinite(parsed) ? parsed : NaN;
67077
+ }
67078
+ return NaN;
67079
+ }
67080
+ /** True when the component asks for the stepped style; anything else renders the bar. */
67081
+ function isStepsStyle(c) {
67082
+ return c.style === "steps";
67083
+ }
67084
+ /**
67085
+ * Resolves the number of segments to draw.
67086
+ *
67087
+ * "auto", missing or unparseable values use `autoTotal` as is (not clamped).
67088
+ * A number or numeric string is rounded and clamped to
67089
+ * [MIN_FIXED_STEP_COUNT, MAX_FIXED_STEP_COUNT].
67090
+ */
67091
+ function resolveStepCount(stepCount, autoTotal) {
67092
+ const parsed = parseStepNumber(stepCount);
67093
+ if (Number.isNaN(parsed))
67094
+ return autoTotal;
67095
+ return Math.min(MAX_FIXED_STEP_COUNT, Math.max(MIN_FIXED_STEP_COUNT, Math.round(parsed)));
67096
+ }
67097
+ /**
67098
+ * Resolves the 1-based current step.
67099
+ *
67100
+ * "auto", missing or unparseable values use `autoIndex`. A number or numeric
67101
+ * string is rounded but not clamped: out-of-range values are handled by
67102
+ * {@link stepSegmentState}.
67103
+ */
67104
+ function resolveCurrentStep(currentStep, autoIndex) {
67105
+ const parsed = parseStepNumber(currentStep);
67106
+ if (Number.isNaN(parsed))
67107
+ return autoIndex;
67108
+ return Math.round(parsed);
67109
+ }
67110
+ /**
67111
+ * State of the segment at 1-based `index1` given the 1-based `current` step.
67112
+ *
67113
+ * `currentStep` mode marks only the matching segment as current. Any other
67114
+ * `fillMode` (including unknown or missing) behaves as `fillUp`, which marks
67115
+ * every segment up to and including `current` as active.
67116
+ */
67117
+ function stepSegmentState(index1, current, fillMode) {
67118
+ if (fillMode === "currentStep") {
67119
+ return index1 === current ? "current" : "inactive";
67120
+ }
67121
+ return index1 <= current ? "active" : "inactive";
67122
+ }
67123
+ /**
67124
+ * Width of one segment when `count` segments separated by `spacing` share
67125
+ * `available` width evenly. Never negative; 0 when `count <= 0`.
67126
+ */
67127
+ function evenSegmentWidth(available, count, spacing) {
67128
+ if (count <= 0)
67129
+ return 0;
67130
+ return Math.max(0, (available - (count - 1) * spacing) / count);
67131
+ }
67132
+ /** Resolves `stepSizing`; unknown or missing values fall back to "even". */
67133
+ function resolveStepSizing(v) {
67134
+ return v === "fixed" ? "fixed" : "even";
67135
+ }
67136
+ /** Resolves `alignment`; unknown or missing values fall back to "center". */
67137
+ function resolveStepAlignment(v) {
67138
+ return v === "left" || v === "right" ? v : "center";
67139
+ }
67140
+ /**
67141
+ * First value that is actually set: skips `undefined`, `null`, `""` and
67142
+ * whitespace-only strings, so an empty `current*` field falls back to the
67143
+ * next candidate (for example `active*`) the way Apple and Android do.
67144
+ * `0`, `false` and other falsy non-string values count as set.
67145
+ */
67146
+ function firstSet(...values) {
67147
+ for (const v of values) {
67148
+ if (v === undefined || v === null)
67149
+ continue;
67150
+ if (typeof v === "string" && v.trim() === "")
67151
+ continue;
67152
+ return v;
67153
+ }
67154
+ return undefined;
67155
+ }
67156
+
67018
67157
  function namiBuySKU(skuRefId) {
67019
67158
  if (!hasPurchaseManagement("NamiPurchaseManager.buySKU")) {
67020
67159
  return;
@@ -67101,6 +67240,8 @@ exports.ExternalIDRequiredError = ExternalIDRequiredError;
67101
67240
  exports.FlowScreensNotAvailableError = FlowScreensNotAvailableError;
67102
67241
  exports.InternalServerError = InternalServerError;
67103
67242
  exports.LaunchContextResolver = LaunchContextResolver;
67243
+ exports.MAX_FIXED_STEP_COUNT = MAX_FIXED_STEP_COUNT;
67244
+ exports.MIN_FIXED_STEP_COUNT = MIN_FIXED_STEP_COUNT;
67104
67245
  exports.NAMI_STORAGE_KEYS = NAMI_STORAGE_KEYS;
67105
67246
  exports.Nami = Nami;
67106
67247
  exports.NamiAPI = NamiAPI;
@@ -67155,7 +67296,9 @@ exports.didReceiveResponse = didReceiveResponse;
67155
67296
  exports.empty = empty;
67156
67297
  exports.evaluateSystemTimeAssertion = evaluateSystemTimeAssertion;
67157
67298
  exports.evaluateSystemTimeCondition = evaluateSystemTimeCondition;
67299
+ exports.evenSegmentWidth = evenSegmentWidth;
67158
67300
  exports.extractStandardPricingPhases = extractStandardPricingPhases;
67301
+ exports.firstSet = firstSet;
67159
67302
  exports.formatDate = formatDate;
67160
67303
  exports.formattedPrice = formattedPrice;
67161
67304
  exports.generateUUID = generateUUID;
@@ -67201,6 +67344,7 @@ exports.invokeHandler = invokeHandler;
67201
67344
  exports.isAnonymousMode = isAnonymousMode;
67202
67345
  exports.isInitialConfigCompressed = isInitialConfigCompressed;
67203
67346
  exports.isNamiFlowCampaign = isNamiFlowCampaign;
67347
+ exports.isStepsStyle = isStepsStyle;
67204
67348
  exports.isSubscription = isSubscription;
67205
67349
  exports.isSystemTimeAssertion = isSystemTimeAssertion;
67206
67350
  exports.isValidISODate = isValidISODate;
@@ -67216,12 +67360,17 @@ exports.productDetail = productDetail;
67216
67360
  exports.registerAPITrafficObserver = registerAPITrafficObserver;
67217
67361
  exports.registerPlatformAdapters = registerPlatformAdapters;
67218
67362
  exports.registerPurchaseAdapter = registerPurchaseAdapter;
67363
+ exports.resolveCurrentStep = resolveCurrentStep;
67219
67364
  exports.resolveLoopSource = resolveLoopSource;
67365
+ exports.resolveStepAlignment = resolveStepAlignment;
67366
+ exports.resolveStepCount = resolveStepCount;
67367
+ exports.resolveStepSizing = resolveStepSizing;
67220
67368
  exports.selectSegment = selectSegment;
67221
67369
  exports.setActiveNamiEntitlements = setActiveNamiEntitlements;
67222
67370
  exports.shouldValidateProductGroups = shouldValidateProductGroups;
67223
67371
  exports.skuItems = skuItems;
67224
67372
  exports.skuMapFromEntitlements = skuMapFromEntitlements;
67373
+ exports.stepSegmentState = stepSegmentState;
67225
67374
  exports.storageService = storageService;
67226
67375
  exports.toDouble = toDouble;
67227
67376
  exports.toNamiEntitlements = toNamiEntitlements;
package/dist/index.d.ts CHANGED
@@ -1274,6 +1274,20 @@ type TProgressIndicatorComponent = TBaseComponent & {
1274
1274
  innerPadding?: number;
1275
1275
  activeDropShadow?: string;
1276
1276
  inactiveDropShadow?: string;
1277
+ style?: "bar" | "steps";
1278
+ stepSizing?: "even" | "fixed";
1279
+ fillMode?: "fillUp" | "currentStep";
1280
+ stepCount?: "auto" | number | string;
1281
+ currentStep?: "auto" | number | string;
1282
+ indicatorSpacing?: number;
1283
+ alignment?: "left" | "center" | "right";
1284
+ activeSize?: number;
1285
+ currentSize?: number;
1286
+ inactiveSize?: number;
1287
+ currentFillColor?: string;
1288
+ currentFillColorFallback?: string;
1289
+ currentBorderRadius?: number;
1290
+ currentDropShadow?: string;
1277
1291
  };
1278
1292
  type TProgressBarComponent = TBaseComponent & {
1279
1293
  component: "progressBar";
@@ -2270,12 +2284,29 @@ declare class NamiFlowManager$2 {
2270
2284
  * @returns Progress as a percentage (0-1)
2271
2285
  */
2272
2286
  getCurrentFlowProgress(key?: string): number;
2287
+ /**
2288
+ * Gets the 1-based position of the current screen within the flow, using the
2289
+ * same step math as {@link getCurrentFlowProgress}.
2290
+ * @returns The current step index (1-based), or 0 when unknown
2291
+ */
2292
+ getCurrentFlowStepIndex(): number;
2293
+ /**
2294
+ * Gets the total number of screen steps the current flow's progress is measured against.
2295
+ * @returns The total step count, or 0 when unknown (no open flow, no current step, no screens)
2296
+ */
2297
+ getTotalFlowSteps(): number;
2298
+ /**
2299
+ * Resolves the current flow position as an integer pair. `index / total` is the
2300
+ * flow progress. Returns null when the position is unknown.
2301
+ */
2302
+ private getCurrentFlowStepPosition;
2273
2303
  /**
2274
2304
  * Find the first screen that has branching (multiple forward navigation targets)
2275
2305
  */
2276
2306
  private findBranchPoint;
2277
2307
  /**
2278
- * Calculate progress for flows with branching (supports 2+ branches)
2308
+ * Calculate the step position for flows with branching (supports 2+ branches).
2309
+ * Progress is `index / total`.
2279
2310
  */
2280
2311
  private calculateBranchingProgress;
2281
2312
  /**
@@ -2296,6 +2327,8 @@ declare class NamiFlowManager$2 {
2296
2327
  static getLastAnimatedFlowProgress(key: string): number;
2297
2328
  static setLastAnimatedFlowProgress(key: string, value: number): void;
2298
2329
  static getCurrentFlowProgress(key?: string): number;
2330
+ static getCurrentFlowStepIndex(): number;
2331
+ static getTotalFlowSteps(): number;
2299
2332
  /**
2300
2333
  * Gets the current flow step's auto-advance delay (in seconds)
2301
2334
  * Parses __appear__ actions to find flowNav/flowNext with a delay parameter
@@ -3434,6 +3467,64 @@ declare function isAnonymousMode(): boolean;
3434
3467
  */
3435
3468
  declare function aggregateScreenreaderText(page: TPages, focusedButtonLabel?: string): string;
3436
3469
 
3470
+ /**
3471
+ * Step model for the stepped `progressIndicator` (`style: "steps"`).
3472
+ *
3473
+ * Pure helpers shared by every TypeScript renderer (Web, Expo). Apple and
3474
+ * Android mirror these rules natively, so keep the behaviour in sync with
3475
+ * them when changing anything here.
3476
+ */
3477
+ /** Smallest step count a fixed (non-"auto") `stepCount` resolves to. */
3478
+ declare const MIN_FIXED_STEP_COUNT = 2;
3479
+ /** Largest step count a fixed (non-"auto") `stepCount` resolves to. */
3480
+ declare const MAX_FIXED_STEP_COUNT = 12;
3481
+ /** Visual state of one step segment. */
3482
+ type TStepState = "active" | "current" | "inactive";
3483
+ /** True when the component asks for the stepped style; anything else renders the bar. */
3484
+ declare function isStepsStyle(c: {
3485
+ style?: string;
3486
+ }): boolean;
3487
+ /**
3488
+ * Resolves the number of segments to draw.
3489
+ *
3490
+ * "auto", missing or unparseable values use `autoTotal` as is (not clamped).
3491
+ * A number or numeric string is rounded and clamped to
3492
+ * [MIN_FIXED_STEP_COUNT, MAX_FIXED_STEP_COUNT].
3493
+ */
3494
+ declare function resolveStepCount(stepCount: unknown, autoTotal: number): number;
3495
+ /**
3496
+ * Resolves the 1-based current step.
3497
+ *
3498
+ * "auto", missing or unparseable values use `autoIndex`. A number or numeric
3499
+ * string is rounded but not clamped: out-of-range values are handled by
3500
+ * {@link stepSegmentState}.
3501
+ */
3502
+ declare function resolveCurrentStep(currentStep: unknown, autoIndex: number): number;
3503
+ /**
3504
+ * State of the segment at 1-based `index1` given the 1-based `current` step.
3505
+ *
3506
+ * `currentStep` mode marks only the matching segment as current. Any other
3507
+ * `fillMode` (including unknown or missing) behaves as `fillUp`, which marks
3508
+ * every segment up to and including `current` as active.
3509
+ */
3510
+ declare function stepSegmentState(index1: number, current: number, fillMode?: string): TStepState;
3511
+ /**
3512
+ * Width of one segment when `count` segments separated by `spacing` share
3513
+ * `available` width evenly. Never negative; 0 when `count <= 0`.
3514
+ */
3515
+ declare function evenSegmentWidth(available: number, count: number, spacing: number): number;
3516
+ /** Resolves `stepSizing`; unknown or missing values fall back to "even". */
3517
+ declare function resolveStepSizing(v?: string): "even" | "fixed";
3518
+ /** Resolves `alignment`; unknown or missing values fall back to "center". */
3519
+ declare function resolveStepAlignment(v?: string): "left" | "center" | "right";
3520
+ /**
3521
+ * First value that is actually set: skips `undefined`, `null`, `""` and
3522
+ * whitespace-only strings, so an empty `current*` field falls back to the
3523
+ * next candidate (for example `active*`) the way Apple and Android do.
3524
+ * `0`, `false` and other falsy non-string values count as set.
3525
+ */
3526
+ declare function firstSet<T>(...values: T[]): Exclude<T, "" | null | undefined> | undefined;
3527
+
3437
3528
  /**
3438
3529
  * Returns the translated string for the given key in the current SDK language.
3439
3530
  * Uses Nami language code from storage (set via Nami.configure({ namiLanguageCode })).
@@ -4451,5 +4542,5 @@ declare namespace internal {
4451
4542
  };
4452
4543
  }
4453
4544
 
4454
- export { ALREADY_CONFIGURED, ANONYMOUS_MODE, ANONYMOUS_MODE_ALREADY_OFF, ANONYMOUS_MODE_ALREADY_ON, ANONYMOUS_MODE_LOGIN_NOT_ALLOWED, ANONYMOUS_UUID, APIError, API_ACTIVE_ENTITLEMENTS, API_CAMPAIGN_RULES, API_CAMPAIGN_SESSION_TIMESTAMP, API_CONFIG, API_MAX_CALLS_LIMIT, API_PAYWALLS, API_PRODUCTS, API_RETRY_DELAY_SEC, API_TIMEOUT_LIMIT, API_TRAFFIC_OBSERVER, API_VERSION, AUTH_DEVICE, AVAILABLE_ACTIVE_ENTITLEMENTS_CHANGED, AVAILABLE_CAMPAIGNS_CHANGED, AccountStateAction, AnonymousCDPError, AnonymousLoginError, AnonymousModeAlreadyOffError, AnonymousModeAlreadyOnError, BASE_STAGING_URL, BASE_URL, BASE_URL_PATH, BadRequestError, BasicNamiFlow, BorderMap, BorderSideMap, CAMPAIGN_CACHE_TTL_PREFIX, CAMPAIGN_NOT_AVAILABLE, CONFIG_API_TIMEOUT_LIMIT, CONFIG_MAX_ATTEMPTS, CUSTOMER_ATTRIBUTES_KEY_PREFIX, CUSTOMER_JOURNEY_STATE_CHANGED, CUSTOM_HOST_PREFIX, CampaignNotAvailableError, CampaignRuleConversionEventType, CampaignRuleRepository, Capabilities, ClientError, ConfigRepository, ConflictError, CustomerJourneyRepository, DEFAULT_JOURNEY_SETTINGS, DEVELOPMENT, DEVICE_API_TIMEOUT_LIMIT, DEVICE_ID_NOT_SET, DEVICE_ID_REQUIRED, DISABLE_ASYNC_LOGIN_LOGOUT, DeviceIDRequiredError, DeviceRepository, EXTENDED_CLIENT_INFO_DELIMITER, EXTENDED_CLIENT_INFO_PREFIX, EXTENDED_PLATFORM, EXTENDED_PLATFORM_VERSION, EXTERNAL_ID_REQUIRED, EntitlementRepository, EntitlementUtils, ExternalIDRequiredError, FLOW_SCREENS_NOT_AVAILABLE, FlowScreensNotAvailableError, HTML_REGEX, INITIAL_APP_CONFIG, INITIAL_CAMPAIGN_RULES, INITIAL_PAYWALLS, INITIAL_PRODUCTS, INITIAL_SESSION_COUNTER_VALUE, INITIAL_SUCCESS, InternalServerError, KEY_SESSION_COUNTER, LIQUID_VARIABLE_REGEX, LOCAL_NAMI_ENTITLEMENTS, LOG_HTTP_REQUESTS, LOG_HTTP_TRAFFIC, LaunchCampaignError, LaunchContextResolver, LogLevel, NAMI_CONFIGURATION, NAMI_CUSTOMER_JOURNEY_STATE, NAMI_LANGUAGE_CODE, NAMI_LAST_IMPRESSION_ID, NAMI_LAUNCH_ID, NAMI_PROFILE, NAMI_PURCHASE_CHANNEL, NAMI_PURCHASE_IMPRESSION_ID, NAMI_SDK_PACKAGE_VERSION, NAMI_SDK_VERSION, NAMI_SESSION_ID, NAMI_STORAGE_KEYS, Nami, NamiAPI, NamiAnimationType, NamiCampaignManager$2 as NamiCampaignManager, NamiCampaignRuleType, NamiConditionEvaluator, NamiCustomerManager$2 as NamiCustomerManager, NamiEntitlementManager$2 as NamiEntitlementManager, NamiEventEmitter, NamiFlow, NamiFlowActionFunction, NamiFlowManager$1 as NamiFlowManager, NamiFlowStepType, NamiHandoffTag, NamiPaywallAction, NamiPaywallManager$2 as NamiPaywallManager, PaywallManagerEvents as NamiPaywallManagerEvents, NamiPermissionOutcome, NamiPurchaseManager$2 as NamiPurchaseManager, NamiRefs, NamiReservedActions, NotFoundError, PAYWALL_ACTION_EVENT, PLATFORM_ID_REQUIRED, PRODUCTION, PaywallManagerEvents, PaywallRepository, PaywallState, PlacementLabelResolver, PlatformIDRequiredError, ProductRepository, RECONFIG_SUCCESS, RESUME_THROTTLE_MS, RetryLimitExceededError, SDKNotInitializedError, SDK_NOT_INITIALIZED, SERVER_NAMI_ENTITLEMENTS, SESSION_REQUIRED, SHOULD_SHOW_LOADING_INDICATOR, SIMULATE_CONFIG_FETCH_FAILURE, SIMULATE_PAYWALL_FETCH_FAILURE, SKU_TEXT_REGEX, SMART_TEXT_PATTERN, STARTUP_TELEMETRY, STATUS_BAD_REQUEST, STATUS_CONFLICT, STATUS_INTERNAL_SERVER_ERROR, STATUS_NOT_FOUND, STATUS_SUCCESS, SYSTEM_TIME_FILTER_PREFIX, SYSTEM_TIME_TOKEN_PREFIX, SessionService, SimpleEventTarget, StorageService, TIME_OVERRIDE_PREFIX, TRANSPORT_FAILURE_STATUS, UNABLE_TO_UPDATE_CDP_ID, USE_STAGING_API, VALIDATE_PRODUCT_GROUPS, VAR_REGEX, NamiProfileManager$1 as _NamiProfileManager, internal as _internal, activateEntitlementByPurchase, activeEntitlements, aggregateScreenreaderText, allCampaigns, allPaywalls, applyEntitlementActivation, audienceSplitPosition, bestUrlCampaignMatch, bigintToUuid, checkAnySkuHasPromoOffer, checkAnySkuHasTrialOffer, convertISO8601PeriodToText, convertLocale, convertOfferToPricingPhase, createNamiEntitlements, currentSku, didReceiveResponse, empty, evaluateSystemTimeAssertion, evaluateSystemTimeCondition, extractStandardPricingPhases, formatDate, formattedPrice, generateUUID, getApiCampaigns, getApiPaywalls, getBaseUrl, getBillingPeriodNumber, getCurrencyFormat, getDeviceData, getDeviceFormFactor, getDeviceScaleFactor, getEffectiveWebStyle, getEntitlementRefIdsForSku, getExtendedClientInfo, getFreeTrialPeriod, getInitialCampaigns, getInitialPaywalls, getJourneySettings, getPaywall, getPaywallDataFromLabel, getPercentagePriceDifference, getPeriodNumberInDays, getPeriodNumberInWeeks, getPlatformAdapters, getPriceDifference, getPricePerMonth, getProductDetail, getPurchaseAdapter, getReferenceSku, getSkuProductDetailKeys, getSkuSmartTextValue, getSlideSmartTextValue, getStandardBillingPeriod, getSystemTimeNow, getTranslate, getUrlParams, handleErrors, hasAllPaywalls, hasCapability, hasPurchaseManagement, initialState, invokeHandler, isAnonymousMode, isInitialConfigCompressed, isNamiFlowCampaign, isSubscription, isSystemTimeAssertion, isValidISODate, isValidUrl, logger, mapAnonymousCampaigns, namiBuySKU, normalizeLaunchContext, parseTimeOverride, parseToSemver, postConversion, productDetail, registerAPITrafficObserver, registerPlatformAdapters, registerPurchaseAdapter, resolveLoopSource, selectSegment, setActiveNamiEntitlements, shouldValidateProductGroups, skuItems, skuMapFromEntitlements, storageService, toDouble, toNamiEntitlements, toNamiSKU, tryParseB64Gzip, tryParseJson, updateRelatedSKUsForNamiEntitlement, uuidFromSplitPosition, validateForm, validateMinSDKVersion, validateTextInput };
4455
- export type { AccountStateHandler$1 as AccountStateHandler, AlignmentType, AmazonProduct, ApiResponse, AppleProduct, AvailableCampaignsResponseHandler, BorderLocationType, BorderSideType, Callback$1 as Callback, CloseHandler, CustomerJourneyState, DeepLinkUrlHandler, Device, DevicePayload, DeviceProfile, DirectionType, ExtendedPlatformInfo, FlexDirectionObject, FlowNavigationOptions, FontCollection, FontDetails, FormFactor, FormFieldValidator, GoogleProduct, IConfig, IDeviceAdapter, IEntitlements$1 as IEntitlements, IPaywall, IPlatformAdapters, IProductsWithComponents, IPurchaseAdapter, ISkuMenu, IStorageAdapter, IUIAdapter, Impression, InitialConfig, InitialConfigCompressed, InitiateStateGroup, JourneySettings, LoginResponse, NamiAPITrafficKind, NamiAPITrafficObserver, NamiAPITrafficRecord, NamiAnimation, NamiAnimationObjectSpec, NamiAnimationSpec, NamiAnonymousCampaign, NamiAppSuppliedVideoDetails, NamiCampaign, NamiCampaignManagerStatic, NamiCampaignSegment, NamiCompletionResult, NamiConfiguration, NamiConfigurationState, NamiCustomAttributeValue, NamiCustomerManagerStatic, NamiEntitlement$1 as NamiEntitlement, NamiEntitlementManagerStatic, NamiFlowAction, NamiFlowAnimation, NamiFlowCampaign, NamiFlowCompletionCondition, NamiFlowDTO, NamiFlowEventHandler, NamiFlowHandoffStepHandler, NamiFlowManagerStatic, NamiFlowObjectDTO, NamiFlowOn, NamiFlowStep, NamiFlowTransition, NamiFlowTransitionDirection, NamiFlowWithObject, NamiHandoffAttributeValue, NamiHandoffComplete, NamiHandoffOutcome, NamiHandoffTagValue, NamiInitialConfig, NamiKnownHandoffTag, NamiLanguageCodes, NamiLogLevel, NamiLoginSuccess, NamiPaywallActionHandler, NamiPaywallComponentChange, NamiPaywallEvent, NamiPaywallEventVideoMetadata, NamiPaywallLaunchContext, NamiPaywallManagerStatic, NamiPresentationStyle, NamiProductDetails, NamiProductOffer, NamiProfile, NamiPurchase, NamiPurchaseCompleteResult, NamiPurchaseDetails, NamiPurchaseManagerStatic, NamiPurchaseSuccess, NamiPurchasesState, NamiSKU, NamiSKUType, NamiSubscriptionInterval, NamiSubscriptionPeriod, NamiUserDataEnvelope, None, NoneSpec, PaywallActionEvent, PaywallHandle, PaywallResultHandler, PaywallSKU, PricingPhase, ProductGroup, Pulse, PulseSpec, PurchaseContext, PurchaseResult, PurchaseValidationRequest, SKU, SKUActionHandler, ScreenInfo, Session, TBaseComponent, TButtonContainer, TCarouselContainer, TCarouselSlide, TCarouselSlidesState, TCollapseContainer, TComponent, TConditionalAttributes, TConditionalComponent, TContainer, TContainerPosition, TCountdownTimerTextComponent, TDevice, TDisabledButton, TField, TFieldSettings, TFlexProductContainer, THeaderFooter, TImageComponent, TInitialState, TMediaTypes, TOffer, TPages, TPaywallContext, TPaywallLaunchContext, TPaywallMedia, TPaywallTemplate, TPlayPauseButton, TProductContainer, TProductGroup, TProgressBarComponent, TProgressIndicatorComponent, TQRCodeComponent, TRadioButton, TRepeatingGrid, TResponsiveGrid, TSegmentPicker, TSegmentPickerItem, TSemverObj, TSlot, TSlotGroupSelector, TSpacerComponent, TStack, TSvgImageComponent, TSymbolComponent, TTestObject, TTextComponent, TTextInputComponent, TTextInputType, TTextLikeComponent, TTextListComponent, TTimelineRail, TToggleButtonComponent, TToggleSwitch, TVariablePattern, TVideoComponent, TVolumeButton, TimerState, TransactionRequest, UserAction, UserActionParameters, Wave, WaveSpec };
4545
+ export { ALREADY_CONFIGURED, ANONYMOUS_MODE, ANONYMOUS_MODE_ALREADY_OFF, ANONYMOUS_MODE_ALREADY_ON, ANONYMOUS_MODE_LOGIN_NOT_ALLOWED, ANONYMOUS_UUID, APIError, API_ACTIVE_ENTITLEMENTS, API_CAMPAIGN_RULES, API_CAMPAIGN_SESSION_TIMESTAMP, API_CONFIG, API_MAX_CALLS_LIMIT, API_PAYWALLS, API_PRODUCTS, API_RETRY_DELAY_SEC, API_TIMEOUT_LIMIT, API_TRAFFIC_OBSERVER, API_VERSION, AUTH_DEVICE, AVAILABLE_ACTIVE_ENTITLEMENTS_CHANGED, AVAILABLE_CAMPAIGNS_CHANGED, AccountStateAction, AnonymousCDPError, AnonymousLoginError, AnonymousModeAlreadyOffError, AnonymousModeAlreadyOnError, BASE_STAGING_URL, BASE_URL, BASE_URL_PATH, BadRequestError, BasicNamiFlow, BorderMap, BorderSideMap, CAMPAIGN_CACHE_TTL_PREFIX, CAMPAIGN_NOT_AVAILABLE, CONFIG_API_TIMEOUT_LIMIT, CONFIG_MAX_ATTEMPTS, CUSTOMER_ATTRIBUTES_KEY_PREFIX, CUSTOMER_JOURNEY_STATE_CHANGED, CUSTOM_HOST_PREFIX, CampaignNotAvailableError, CampaignRuleConversionEventType, CampaignRuleRepository, Capabilities, ClientError, ConfigRepository, ConflictError, CustomerJourneyRepository, DEFAULT_JOURNEY_SETTINGS, DEVELOPMENT, DEVICE_API_TIMEOUT_LIMIT, DEVICE_ID_NOT_SET, DEVICE_ID_REQUIRED, DISABLE_ASYNC_LOGIN_LOGOUT, DeviceIDRequiredError, DeviceRepository, EXTENDED_CLIENT_INFO_DELIMITER, EXTENDED_CLIENT_INFO_PREFIX, EXTENDED_PLATFORM, EXTENDED_PLATFORM_VERSION, EXTERNAL_ID_REQUIRED, EntitlementRepository, EntitlementUtils, ExternalIDRequiredError, FLOW_SCREENS_NOT_AVAILABLE, FlowScreensNotAvailableError, HTML_REGEX, INITIAL_APP_CONFIG, INITIAL_CAMPAIGN_RULES, INITIAL_PAYWALLS, INITIAL_PRODUCTS, INITIAL_SESSION_COUNTER_VALUE, INITIAL_SUCCESS, InternalServerError, KEY_SESSION_COUNTER, LIQUID_VARIABLE_REGEX, LOCAL_NAMI_ENTITLEMENTS, LOG_HTTP_REQUESTS, LOG_HTTP_TRAFFIC, LaunchCampaignError, LaunchContextResolver, LogLevel, MAX_FIXED_STEP_COUNT, MIN_FIXED_STEP_COUNT, NAMI_CONFIGURATION, NAMI_CUSTOMER_JOURNEY_STATE, NAMI_LANGUAGE_CODE, NAMI_LAST_IMPRESSION_ID, NAMI_LAUNCH_ID, NAMI_PROFILE, NAMI_PURCHASE_CHANNEL, NAMI_PURCHASE_IMPRESSION_ID, NAMI_SDK_PACKAGE_VERSION, NAMI_SDK_VERSION, NAMI_SESSION_ID, NAMI_STORAGE_KEYS, Nami, NamiAPI, NamiAnimationType, NamiCampaignManager$2 as NamiCampaignManager, NamiCampaignRuleType, NamiConditionEvaluator, NamiCustomerManager$2 as NamiCustomerManager, NamiEntitlementManager$2 as NamiEntitlementManager, NamiEventEmitter, NamiFlow, NamiFlowActionFunction, NamiFlowManager$1 as NamiFlowManager, NamiFlowStepType, NamiHandoffTag, NamiPaywallAction, NamiPaywallManager$2 as NamiPaywallManager, PaywallManagerEvents as NamiPaywallManagerEvents, NamiPermissionOutcome, NamiPurchaseManager$2 as NamiPurchaseManager, NamiRefs, NamiReservedActions, NotFoundError, PAYWALL_ACTION_EVENT, PLATFORM_ID_REQUIRED, PRODUCTION, PaywallManagerEvents, PaywallRepository, PaywallState, PlacementLabelResolver, PlatformIDRequiredError, ProductRepository, RECONFIG_SUCCESS, RESUME_THROTTLE_MS, RetryLimitExceededError, SDKNotInitializedError, SDK_NOT_INITIALIZED, SERVER_NAMI_ENTITLEMENTS, SESSION_REQUIRED, SHOULD_SHOW_LOADING_INDICATOR, SIMULATE_CONFIG_FETCH_FAILURE, SIMULATE_PAYWALL_FETCH_FAILURE, SKU_TEXT_REGEX, SMART_TEXT_PATTERN, STARTUP_TELEMETRY, STATUS_BAD_REQUEST, STATUS_CONFLICT, STATUS_INTERNAL_SERVER_ERROR, STATUS_NOT_FOUND, STATUS_SUCCESS, SYSTEM_TIME_FILTER_PREFIX, SYSTEM_TIME_TOKEN_PREFIX, SessionService, SimpleEventTarget, StorageService, TIME_OVERRIDE_PREFIX, TRANSPORT_FAILURE_STATUS, UNABLE_TO_UPDATE_CDP_ID, USE_STAGING_API, VALIDATE_PRODUCT_GROUPS, VAR_REGEX, NamiProfileManager$1 as _NamiProfileManager, internal as _internal, activateEntitlementByPurchase, activeEntitlements, aggregateScreenreaderText, allCampaigns, allPaywalls, applyEntitlementActivation, audienceSplitPosition, bestUrlCampaignMatch, bigintToUuid, checkAnySkuHasPromoOffer, checkAnySkuHasTrialOffer, convertISO8601PeriodToText, convertLocale, convertOfferToPricingPhase, createNamiEntitlements, currentSku, didReceiveResponse, empty, evaluateSystemTimeAssertion, evaluateSystemTimeCondition, evenSegmentWidth, extractStandardPricingPhases, firstSet, formatDate, formattedPrice, generateUUID, getApiCampaigns, getApiPaywalls, getBaseUrl, getBillingPeriodNumber, getCurrencyFormat, getDeviceData, getDeviceFormFactor, getDeviceScaleFactor, getEffectiveWebStyle, getEntitlementRefIdsForSku, getExtendedClientInfo, getFreeTrialPeriod, getInitialCampaigns, getInitialPaywalls, getJourneySettings, getPaywall, getPaywallDataFromLabel, getPercentagePriceDifference, getPeriodNumberInDays, getPeriodNumberInWeeks, getPlatformAdapters, getPriceDifference, getPricePerMonth, getProductDetail, getPurchaseAdapter, getReferenceSku, getSkuProductDetailKeys, getSkuSmartTextValue, getSlideSmartTextValue, getStandardBillingPeriod, getSystemTimeNow, getTranslate, getUrlParams, handleErrors, hasAllPaywalls, hasCapability, hasPurchaseManagement, initialState, invokeHandler, isAnonymousMode, isInitialConfigCompressed, isNamiFlowCampaign, isStepsStyle, isSubscription, isSystemTimeAssertion, isValidISODate, isValidUrl, logger, mapAnonymousCampaigns, namiBuySKU, normalizeLaunchContext, parseTimeOverride, parseToSemver, postConversion, productDetail, registerAPITrafficObserver, registerPlatformAdapters, registerPurchaseAdapter, resolveCurrentStep, resolveLoopSource, resolveStepAlignment, resolveStepCount, resolveStepSizing, selectSegment, setActiveNamiEntitlements, shouldValidateProductGroups, skuItems, skuMapFromEntitlements, stepSegmentState, storageService, toDouble, toNamiEntitlements, toNamiSKU, tryParseB64Gzip, tryParseJson, updateRelatedSKUsForNamiEntitlement, uuidFromSplitPosition, validateForm, validateMinSDKVersion, validateTextInput };
4546
+ export type { AccountStateHandler$1 as AccountStateHandler, AlignmentType, AmazonProduct, ApiResponse, AppleProduct, AvailableCampaignsResponseHandler, BorderLocationType, BorderSideType, Callback$1 as Callback, CloseHandler, CustomerJourneyState, DeepLinkUrlHandler, Device, DevicePayload, DeviceProfile, DirectionType, ExtendedPlatformInfo, FlexDirectionObject, FlowNavigationOptions, FontCollection, FontDetails, FormFactor, FormFieldValidator, GoogleProduct, IConfig, IDeviceAdapter, IEntitlements$1 as IEntitlements, IPaywall, IPlatformAdapters, IProductsWithComponents, IPurchaseAdapter, ISkuMenu, IStorageAdapter, IUIAdapter, Impression, InitialConfig, InitialConfigCompressed, InitiateStateGroup, JourneySettings, LoginResponse, NamiAPITrafficKind, NamiAPITrafficObserver, NamiAPITrafficRecord, NamiAnimation, NamiAnimationObjectSpec, NamiAnimationSpec, NamiAnonymousCampaign, NamiAppSuppliedVideoDetails, NamiCampaign, NamiCampaignManagerStatic, NamiCampaignSegment, NamiCompletionResult, NamiConfiguration, NamiConfigurationState, NamiCustomAttributeValue, NamiCustomerManagerStatic, NamiEntitlement$1 as NamiEntitlement, NamiEntitlementManagerStatic, NamiFlowAction, NamiFlowAnimation, NamiFlowCampaign, NamiFlowCompletionCondition, NamiFlowDTO, NamiFlowEventHandler, NamiFlowHandoffStepHandler, NamiFlowManagerStatic, NamiFlowObjectDTO, NamiFlowOn, NamiFlowStep, NamiFlowTransition, NamiFlowTransitionDirection, NamiFlowWithObject, NamiHandoffAttributeValue, NamiHandoffComplete, NamiHandoffOutcome, NamiHandoffTagValue, NamiInitialConfig, NamiKnownHandoffTag, NamiLanguageCodes, NamiLogLevel, NamiLoginSuccess, NamiPaywallActionHandler, NamiPaywallComponentChange, NamiPaywallEvent, NamiPaywallEventVideoMetadata, NamiPaywallLaunchContext, NamiPaywallManagerStatic, NamiPresentationStyle, NamiProductDetails, NamiProductOffer, NamiProfile, NamiPurchase, NamiPurchaseCompleteResult, NamiPurchaseDetails, NamiPurchaseManagerStatic, NamiPurchaseSuccess, NamiPurchasesState, NamiSKU, NamiSKUType, NamiSubscriptionInterval, NamiSubscriptionPeriod, NamiUserDataEnvelope, None, NoneSpec, PaywallActionEvent, PaywallHandle, PaywallResultHandler, PaywallSKU, PricingPhase, ProductGroup, Pulse, PulseSpec, PurchaseContext, PurchaseResult, PurchaseValidationRequest, SKU, SKUActionHandler, ScreenInfo, Session, TBaseComponent, TButtonContainer, TCarouselContainer, TCarouselSlide, TCarouselSlidesState, TCollapseContainer, TComponent, TConditionalAttributes, TConditionalComponent, TContainer, TContainerPosition, TCountdownTimerTextComponent, TDevice, TDisabledButton, TField, TFieldSettings, TFlexProductContainer, THeaderFooter, TImageComponent, TInitialState, TMediaTypes, TOffer, TPages, TPaywallContext, TPaywallLaunchContext, TPaywallMedia, TPaywallTemplate, TPlayPauseButton, TProductContainer, TProductGroup, TProgressBarComponent, TProgressIndicatorComponent, TQRCodeComponent, TRadioButton, TRepeatingGrid, TResponsiveGrid, TSegmentPicker, TSegmentPickerItem, TSemverObj, TSlot, TSlotGroupSelector, TSpacerComponent, TStack, TStepState, TSvgImageComponent, TSymbolComponent, TTestObject, TTextComponent, TTextInputComponent, TTextInputType, TTextLikeComponent, TTextListComponent, TTimelineRail, TToggleButtonComponent, TToggleSwitch, TVariablePattern, TVideoComponent, TVolumeButton, TimerState, TransactionRequest, UserAction, UserActionParameters, Wave, WaveSpec };
package/dist/index.mjs CHANGED
@@ -104,7 +104,7 @@ const {
104
104
  // version — stamped by scripts/version.sh
105
105
  NAMI_SDK_VERSION = "3.5.0",
106
106
  // full package version including dev suffix — stamped by scripts/version.sh
107
- NAMI_SDK_PACKAGE_VERSION = "3.5.0-dev.202610312243",
107
+ NAMI_SDK_PACKAGE_VERSION = "3.5.0-dev.202611011529",
108
108
  // environments
109
109
  PRODUCTION = "production", DEVELOPMENT = "development",
110
110
  // error messages
@@ -64650,33 +64650,60 @@ let NamiFlowManager$2 = class NamiFlowManager {
64650
64650
  getCurrentFlowProgress(key) {
64651
64651
  if (!this.currentFlow)
64652
64652
  return 1;
64653
- if (!this.currentFlow.currentFlowStep)
64653
+ const position = this.getCurrentFlowStepPosition();
64654
+ if (!position)
64655
+ return 0;
64656
+ let progress = position.index / position.total;
64657
+ progress = Math.max(0, Math.min(1, progress));
64658
+ if (key) {
64659
+ this.setLastAnimatedFlowProgress(key, progress);
64660
+ }
64661
+ return progress;
64662
+ }
64663
+ /**
64664
+ * Gets the 1-based position of the current screen within the flow, using the
64665
+ * same step math as {@link getCurrentFlowProgress}.
64666
+ * @returns The current step index (1-based), or 0 when unknown
64667
+ */
64668
+ getCurrentFlowStepIndex() {
64669
+ const position = this.getCurrentFlowStepPosition();
64670
+ if (!position)
64654
64671
  return 0;
64672
+ return Math.max(0, Math.min(position.total, position.index));
64673
+ }
64674
+ /**
64675
+ * Gets the total number of screen steps the current flow's progress is measured against.
64676
+ * @returns The total step count, or 0 when unknown (no open flow, no current step, no screens)
64677
+ */
64678
+ getTotalFlowSteps() {
64679
+ return this.getCurrentFlowStepPosition()?.total ?? 0;
64680
+ }
64681
+ /**
64682
+ * Resolves the current flow position as an integer pair. `index / total` is the
64683
+ * flow progress. Returns null when the position is unknown.
64684
+ */
64685
+ getCurrentFlowStepPosition() {
64686
+ if (!this.currentFlow)
64687
+ return null;
64688
+ if (!this.currentFlow.currentFlowStep)
64689
+ return null;
64655
64690
  const allScreens = this.currentFlow.steps.filter(step => step.type === NamiFlowStepType.SCREEN);
64656
64691
  if (allScreens.length === 0)
64657
- return 0;
64692
+ return null;
64658
64693
  const visitedScreens = this.currentFlow.stepcrumbs.filter(step => step.type === NamiFlowStepType.SCREEN);
64659
64694
  if (visitedScreens.length === 0)
64660
- return 0;
64695
+ return null;
64661
64696
  const navGraph = this.buildNavGraph(this.currentFlow);
64662
64697
  const currentStep = this.currentFlow.currentFlowStep;
64663
64698
  // Find the branch point (first screen with multiple forward paths)
64664
64699
  const branchPoint = this.findBranchPoint(allScreens, navGraph);
64665
- let progress = 0;
64666
64700
  if (branchPoint) {
64667
64701
  // Branching flow
64668
- progress = this.calculateBranchingProgress(visitedScreens, allScreens, currentStep, branchPoint, navGraph);
64669
- }
64670
- else {
64671
- // Linear flow
64672
- const currentIndex = allScreens.findIndex(s => s.id === currentStep.id);
64673
- progress = currentIndex >= 0 ? (currentIndex + 1) / allScreens.length : 0;
64674
- }
64675
- progress = Math.max(0, Math.min(1, progress));
64676
- if (key) {
64677
- this.setLastAnimatedFlowProgress(key, progress);
64702
+ return this.calculateBranchingProgress(visitedScreens, allScreens, currentStep, branchPoint, navGraph);
64678
64703
  }
64679
- return progress;
64704
+ // Linear flow
64705
+ const currentIndex = allScreens.findIndex(s => s.id === currentStep.id);
64706
+ return { index: currentIndex >= 0 ? currentIndex + 1 : 0, total: allScreens.length };
64680
64707
  }
64681
64708
  /**
64682
64709
  * Find the first screen that has branching (multiple forward navigation targets)
@@ -64690,7 +64717,8 @@ let NamiFlowManager$2 = class NamiFlowManager {
64690
64717
  return null;
64691
64718
  }
64692
64719
  /**
64693
- * Calculate progress for flows with branching (supports 2+ branches)
64720
+ * Calculate the step position for flows with branching (supports 2+ branches).
64721
+ * Progress is `index / total`.
64694
64722
  */
64695
64723
  calculateBranchingProgress(visitedScreens, allScreens, currentStep, branchPoint, navGraph) {
64696
64724
  const visitedCount = visitedScreens.length;
@@ -64704,14 +64732,14 @@ let NamiFlowManager$2 = class NamiFlowManager {
64704
64732
  // - visitedScreens = currentPosition + 1 (0-indexed)
64705
64733
  // - minimumTotalPathLength = branchPosition + 2
64706
64734
  // (all screens before branch + branch itself + at least 1 screen after)
64707
- return (currentIndexInAll + 1) / (branchPointIndexInAll + 2);
64735
+ return { index: currentIndexInAll + 1, total: branchPointIndexInAll + 2 };
64708
64736
  }
64709
64737
  // Case 2: Past the branch point (entered a specific branch)
64710
64738
  // Calculate based on: visitedScreens / (visitedScreens + remainingInThisBranch)
64711
64739
  const remainingInBranch = this.countForwardScreens(currentStep, allScreens, navGraph);
64712
64740
  const totalPathLength = visitedCount + remainingInBranch;
64713
64741
  logger.debug(`Branching progress: visited=${visitedCount}, remaining=${remainingInBranch}, total=${totalPathLength}, step=${currentStep.id}`);
64714
- return visitedCount / totalPathLength;
64742
+ return { index: visitedCount, total: totalPathLength };
64715
64743
  }
64716
64744
  /**
64717
64745
  * Count how many screens are forward-reachable from the current step
@@ -64809,6 +64837,12 @@ let NamiFlowManager$2 = class NamiFlowManager {
64809
64837
  static getCurrentFlowProgress(key) {
64810
64838
  return this.instance.getCurrentFlowProgress(key);
64811
64839
  }
64840
+ static getCurrentFlowStepIndex() {
64841
+ return this.instance.getCurrentFlowStepIndex();
64842
+ }
64843
+ static getTotalFlowSteps() {
64844
+ return this.instance.getTotalFlowSteps();
64845
+ }
64812
64846
  /**
64813
64847
  * Gets the current flow step's auto-advance delay (in seconds)
64814
64848
  * Parses __appear__ actions to find flowNav/flowNext with a delay parameter
@@ -67013,6 +67047,111 @@ function aggregateScreenreaderText(page, focusedButtonLabel = '') {
67013
67047
  return joinFragments(fragments);
67014
67048
  }
67015
67049
 
67050
+ /**
67051
+ * Step model for the stepped `progressIndicator` (`style: "steps"`).
67052
+ *
67053
+ * Pure helpers shared by every TypeScript renderer (Web, Expo). Apple and
67054
+ * Android mirror these rules natively, so keep the behaviour in sync with
67055
+ * them when changing anything here.
67056
+ */
67057
+ /** Smallest step count a fixed (non-"auto") `stepCount` resolves to. */
67058
+ const MIN_FIXED_STEP_COUNT = 2;
67059
+ /** Largest step count a fixed (non-"auto") `stepCount` resolves to. */
67060
+ const MAX_FIXED_STEP_COUNT = 12;
67061
+ /**
67062
+ * Parses a numeric field that may arrive as a number or as a numeric string
67063
+ * (for example from smart text). Returns NaN for "auto", missing, empty or
67064
+ * unparseable values.
67065
+ */
67066
+ function parseStepNumber(value) {
67067
+ if (typeof value === "number")
67068
+ return Number.isFinite(value) ? value : NaN;
67069
+ if (typeof value === "string") {
67070
+ const trimmed = value.trim();
67071
+ if (trimmed === "")
67072
+ return NaN;
67073
+ const parsed = Number(trimmed);
67074
+ return Number.isFinite(parsed) ? parsed : NaN;
67075
+ }
67076
+ return NaN;
67077
+ }
67078
+ /** True when the component asks for the stepped style; anything else renders the bar. */
67079
+ function isStepsStyle(c) {
67080
+ return c.style === "steps";
67081
+ }
67082
+ /**
67083
+ * Resolves the number of segments to draw.
67084
+ *
67085
+ * "auto", missing or unparseable values use `autoTotal` as is (not clamped).
67086
+ * A number or numeric string is rounded and clamped to
67087
+ * [MIN_FIXED_STEP_COUNT, MAX_FIXED_STEP_COUNT].
67088
+ */
67089
+ function resolveStepCount(stepCount, autoTotal) {
67090
+ const parsed = parseStepNumber(stepCount);
67091
+ if (Number.isNaN(parsed))
67092
+ return autoTotal;
67093
+ return Math.min(MAX_FIXED_STEP_COUNT, Math.max(MIN_FIXED_STEP_COUNT, Math.round(parsed)));
67094
+ }
67095
+ /**
67096
+ * Resolves the 1-based current step.
67097
+ *
67098
+ * "auto", missing or unparseable values use `autoIndex`. A number or numeric
67099
+ * string is rounded but not clamped: out-of-range values are handled by
67100
+ * {@link stepSegmentState}.
67101
+ */
67102
+ function resolveCurrentStep(currentStep, autoIndex) {
67103
+ const parsed = parseStepNumber(currentStep);
67104
+ if (Number.isNaN(parsed))
67105
+ return autoIndex;
67106
+ return Math.round(parsed);
67107
+ }
67108
+ /**
67109
+ * State of the segment at 1-based `index1` given the 1-based `current` step.
67110
+ *
67111
+ * `currentStep` mode marks only the matching segment as current. Any other
67112
+ * `fillMode` (including unknown or missing) behaves as `fillUp`, which marks
67113
+ * every segment up to and including `current` as active.
67114
+ */
67115
+ function stepSegmentState(index1, current, fillMode) {
67116
+ if (fillMode === "currentStep") {
67117
+ return index1 === current ? "current" : "inactive";
67118
+ }
67119
+ return index1 <= current ? "active" : "inactive";
67120
+ }
67121
+ /**
67122
+ * Width of one segment when `count` segments separated by `spacing` share
67123
+ * `available` width evenly. Never negative; 0 when `count <= 0`.
67124
+ */
67125
+ function evenSegmentWidth(available, count, spacing) {
67126
+ if (count <= 0)
67127
+ return 0;
67128
+ return Math.max(0, (available - (count - 1) * spacing) / count);
67129
+ }
67130
+ /** Resolves `stepSizing`; unknown or missing values fall back to "even". */
67131
+ function resolveStepSizing(v) {
67132
+ return v === "fixed" ? "fixed" : "even";
67133
+ }
67134
+ /** Resolves `alignment`; unknown or missing values fall back to "center". */
67135
+ function resolveStepAlignment(v) {
67136
+ return v === "left" || v === "right" ? v : "center";
67137
+ }
67138
+ /**
67139
+ * First value that is actually set: skips `undefined`, `null`, `""` and
67140
+ * whitespace-only strings, so an empty `current*` field falls back to the
67141
+ * next candidate (for example `active*`) the way Apple and Android do.
67142
+ * `0`, `false` and other falsy non-string values count as set.
67143
+ */
67144
+ function firstSet(...values) {
67145
+ for (const v of values) {
67146
+ if (v === undefined || v === null)
67147
+ continue;
67148
+ if (typeof v === "string" && v.trim() === "")
67149
+ continue;
67150
+ return v;
67151
+ }
67152
+ return undefined;
67153
+ }
67154
+
67016
67155
  function namiBuySKU(skuRefId) {
67017
67156
  if (!hasPurchaseManagement("NamiPurchaseManager.buySKU")) {
67018
67157
  return;
@@ -67074,4 +67213,4 @@ var internal = /*#__PURE__*/Object.freeze({
67074
67213
  NamiPurchaseManager: NamiPurchaseManager
67075
67214
  });
67076
67215
 
67077
- export { ALREADY_CONFIGURED, ANONYMOUS_MODE, ANONYMOUS_MODE_ALREADY_OFF, ANONYMOUS_MODE_ALREADY_ON, ANONYMOUS_MODE_LOGIN_NOT_ALLOWED, ANONYMOUS_UUID, APIError, API_ACTIVE_ENTITLEMENTS, API_CAMPAIGN_RULES, API_CAMPAIGN_SESSION_TIMESTAMP, API_CONFIG, API_MAX_CALLS_LIMIT, API_PAYWALLS, API_PRODUCTS, API_RETRY_DELAY_SEC, API_TIMEOUT_LIMIT, API_TRAFFIC_OBSERVER, API_VERSION, AUTH_DEVICE, AVAILABLE_ACTIVE_ENTITLEMENTS_CHANGED, AVAILABLE_CAMPAIGNS_CHANGED, AccountStateAction, AnonymousCDPError, AnonymousLoginError, AnonymousModeAlreadyOffError, AnonymousModeAlreadyOnError, BASE_STAGING_URL, BASE_URL, BASE_URL_PATH, BadRequestError, BasicNamiFlow, BorderMap, BorderSideMap, CAMPAIGN_CACHE_TTL_PREFIX, CAMPAIGN_NOT_AVAILABLE, CONFIG_API_TIMEOUT_LIMIT, CONFIG_MAX_ATTEMPTS, CUSTOMER_ATTRIBUTES_KEY_PREFIX, CUSTOMER_JOURNEY_STATE_CHANGED, CUSTOM_HOST_PREFIX, CampaignNotAvailableError, CampaignRuleConversionEventType, CampaignRuleRepository, Capabilities, ClientError, ConfigRepository, ConflictError, CustomerJourneyRepository, DEFAULT_JOURNEY_SETTINGS, DEVELOPMENT, DEVICE_API_TIMEOUT_LIMIT, DEVICE_ID_NOT_SET, DEVICE_ID_REQUIRED, DISABLE_ASYNC_LOGIN_LOGOUT, DeviceIDRequiredError, DeviceRepository, EXTENDED_CLIENT_INFO_DELIMITER, EXTENDED_CLIENT_INFO_PREFIX, EXTENDED_PLATFORM, EXTENDED_PLATFORM_VERSION, EXTERNAL_ID_REQUIRED, EntitlementRepository, EntitlementUtils, ExternalIDRequiredError, FLOW_SCREENS_NOT_AVAILABLE, FlowScreensNotAvailableError, HTML_REGEX, INITIAL_APP_CONFIG, INITIAL_CAMPAIGN_RULES, INITIAL_PAYWALLS, INITIAL_PRODUCTS, INITIAL_SESSION_COUNTER_VALUE, INITIAL_SUCCESS, InternalServerError, KEY_SESSION_COUNTER, LIQUID_VARIABLE_REGEX, LOCAL_NAMI_ENTITLEMENTS, LOG_HTTP_REQUESTS, LOG_HTTP_TRAFFIC, LaunchCampaignError, LaunchContextResolver, LogLevel, NAMI_CONFIGURATION, NAMI_CUSTOMER_JOURNEY_STATE, NAMI_LANGUAGE_CODE, NAMI_LAST_IMPRESSION_ID, NAMI_LAUNCH_ID, NAMI_PROFILE, NAMI_PURCHASE_CHANNEL, NAMI_PURCHASE_IMPRESSION_ID, NAMI_SDK_PACKAGE_VERSION, NAMI_SDK_VERSION, NAMI_SESSION_ID, NAMI_STORAGE_KEYS, Nami, NamiAPI, NamiAnimationType, NamiCampaignManager$1 as NamiCampaignManager, NamiCampaignRuleType, NamiConditionEvaluator, NamiCustomerManager$1 as NamiCustomerManager, NamiEntitlementManager$1 as NamiEntitlementManager, NamiEventEmitter, NamiFlow, NamiFlowActionFunction, NamiFlowManager$1 as NamiFlowManager, NamiFlowStepType, NamiHandoffTag, NamiPaywallAction, NamiPaywallManager$1 as NamiPaywallManager, PaywallManagerEvents as NamiPaywallManagerEvents, NamiPermissionOutcome, NamiPurchaseManager$1 as NamiPurchaseManager, NamiRefs, NamiReservedActions, NotFoundError, PAYWALL_ACTION_EVENT, PLATFORM_ID_REQUIRED, PRODUCTION, PaywallManagerEvents, PaywallRepository, PaywallState, PlacementLabelResolver, PlatformIDRequiredError, ProductRepository, RECONFIG_SUCCESS, RESUME_THROTTLE_MS, RetryLimitExceededError, SDKNotInitializedError, SDK_NOT_INITIALIZED, SERVER_NAMI_ENTITLEMENTS, SESSION_REQUIRED, SHOULD_SHOW_LOADING_INDICATOR, SIMULATE_CONFIG_FETCH_FAILURE, SIMULATE_PAYWALL_FETCH_FAILURE, SKU_TEXT_REGEX, SMART_TEXT_PATTERN, STARTUP_TELEMETRY, STATUS_BAD_REQUEST, STATUS_CONFLICT, STATUS_INTERNAL_SERVER_ERROR, STATUS_NOT_FOUND, STATUS_SUCCESS, SYSTEM_TIME_FILTER_PREFIX, SYSTEM_TIME_TOKEN_PREFIX, SessionService, SimpleEventTarget, StorageService, TIME_OVERRIDE_PREFIX, TRANSPORT_FAILURE_STATUS, UNABLE_TO_UPDATE_CDP_ID, USE_STAGING_API, VALIDATE_PRODUCT_GROUPS, VAR_REGEX, NamiProfileManager$1 as _NamiProfileManager, internal as _internal, activateEntitlementByPurchase, activeEntitlements, aggregateScreenreaderText, allCampaigns, allPaywalls, applyEntitlementActivation, audienceSplitPosition, bestUrlCampaignMatch, bigintToUuid, checkAnySkuHasPromoOffer, checkAnySkuHasTrialOffer, convertISO8601PeriodToText, convertLocale, convertOfferToPricingPhase, createNamiEntitlements, currentSku, didReceiveResponse, empty, evaluateSystemTimeAssertion, evaluateSystemTimeCondition, extractStandardPricingPhases, formatDate, formattedPrice, generateUUID, getApiCampaigns, getApiPaywalls, getBaseUrl, getBillingPeriodNumber, getCurrencyFormat, getDeviceData, getDeviceFormFactor, getDeviceScaleFactor, getEffectiveWebStyle, getEntitlementRefIdsForSku, getExtendedClientInfo, getFreeTrialPeriod, getInitialCampaigns, getInitialPaywalls, getJourneySettings, getPaywall, getPaywallDataFromLabel, getPercentagePriceDifference, getPeriodNumberInDays, getPeriodNumberInWeeks, getPlatformAdapters, getPriceDifference, getPricePerMonth, getProductDetail, getPurchaseAdapter, getReferenceSku, getSkuProductDetailKeys, getSkuSmartTextValue, getSlideSmartTextValue, getStandardBillingPeriod, getSystemTimeNow, getTranslate, getUrlParams, handleErrors, hasAllPaywalls, hasCapability, hasPurchaseManagement, initialState, invokeHandler, isAnonymousMode, isInitialConfigCompressed, isNamiFlowCampaign, isSubscription, isSystemTimeAssertion, isValidISODate, isValidUrl, logger, mapAnonymousCampaigns, namiBuySKU, normalizeLaunchContext, parseTimeOverride, parseToSemver, postConversion, productDetail, registerAPITrafficObserver, registerPlatformAdapters, registerPurchaseAdapter, resolveLoopSource, selectSegment, setActiveNamiEntitlements, shouldValidateProductGroups, skuItems, skuMapFromEntitlements, storageService, toDouble, toNamiEntitlements, toNamiSKU, tryParseB64Gzip, tryParseJson, updateRelatedSKUsForNamiEntitlement, uuidFromSplitPosition, validateForm, validateMinSDKVersion, validateTextInput };
67216
+ export { ALREADY_CONFIGURED, ANONYMOUS_MODE, ANONYMOUS_MODE_ALREADY_OFF, ANONYMOUS_MODE_ALREADY_ON, ANONYMOUS_MODE_LOGIN_NOT_ALLOWED, ANONYMOUS_UUID, APIError, API_ACTIVE_ENTITLEMENTS, API_CAMPAIGN_RULES, API_CAMPAIGN_SESSION_TIMESTAMP, API_CONFIG, API_MAX_CALLS_LIMIT, API_PAYWALLS, API_PRODUCTS, API_RETRY_DELAY_SEC, API_TIMEOUT_LIMIT, API_TRAFFIC_OBSERVER, API_VERSION, AUTH_DEVICE, AVAILABLE_ACTIVE_ENTITLEMENTS_CHANGED, AVAILABLE_CAMPAIGNS_CHANGED, AccountStateAction, AnonymousCDPError, AnonymousLoginError, AnonymousModeAlreadyOffError, AnonymousModeAlreadyOnError, BASE_STAGING_URL, BASE_URL, BASE_URL_PATH, BadRequestError, BasicNamiFlow, BorderMap, BorderSideMap, CAMPAIGN_CACHE_TTL_PREFIX, CAMPAIGN_NOT_AVAILABLE, CONFIG_API_TIMEOUT_LIMIT, CONFIG_MAX_ATTEMPTS, CUSTOMER_ATTRIBUTES_KEY_PREFIX, CUSTOMER_JOURNEY_STATE_CHANGED, CUSTOM_HOST_PREFIX, CampaignNotAvailableError, CampaignRuleConversionEventType, CampaignRuleRepository, Capabilities, ClientError, ConfigRepository, ConflictError, CustomerJourneyRepository, DEFAULT_JOURNEY_SETTINGS, DEVELOPMENT, DEVICE_API_TIMEOUT_LIMIT, DEVICE_ID_NOT_SET, DEVICE_ID_REQUIRED, DISABLE_ASYNC_LOGIN_LOGOUT, DeviceIDRequiredError, DeviceRepository, EXTENDED_CLIENT_INFO_DELIMITER, EXTENDED_CLIENT_INFO_PREFIX, EXTENDED_PLATFORM, EXTENDED_PLATFORM_VERSION, EXTERNAL_ID_REQUIRED, EntitlementRepository, EntitlementUtils, ExternalIDRequiredError, FLOW_SCREENS_NOT_AVAILABLE, FlowScreensNotAvailableError, HTML_REGEX, INITIAL_APP_CONFIG, INITIAL_CAMPAIGN_RULES, INITIAL_PAYWALLS, INITIAL_PRODUCTS, INITIAL_SESSION_COUNTER_VALUE, INITIAL_SUCCESS, InternalServerError, KEY_SESSION_COUNTER, LIQUID_VARIABLE_REGEX, LOCAL_NAMI_ENTITLEMENTS, LOG_HTTP_REQUESTS, LOG_HTTP_TRAFFIC, LaunchCampaignError, LaunchContextResolver, LogLevel, MAX_FIXED_STEP_COUNT, MIN_FIXED_STEP_COUNT, NAMI_CONFIGURATION, NAMI_CUSTOMER_JOURNEY_STATE, NAMI_LANGUAGE_CODE, NAMI_LAST_IMPRESSION_ID, NAMI_LAUNCH_ID, NAMI_PROFILE, NAMI_PURCHASE_CHANNEL, NAMI_PURCHASE_IMPRESSION_ID, NAMI_SDK_PACKAGE_VERSION, NAMI_SDK_VERSION, NAMI_SESSION_ID, NAMI_STORAGE_KEYS, Nami, NamiAPI, NamiAnimationType, NamiCampaignManager$1 as NamiCampaignManager, NamiCampaignRuleType, NamiConditionEvaluator, NamiCustomerManager$1 as NamiCustomerManager, NamiEntitlementManager$1 as NamiEntitlementManager, NamiEventEmitter, NamiFlow, NamiFlowActionFunction, NamiFlowManager$1 as NamiFlowManager, NamiFlowStepType, NamiHandoffTag, NamiPaywallAction, NamiPaywallManager$1 as NamiPaywallManager, PaywallManagerEvents as NamiPaywallManagerEvents, NamiPermissionOutcome, NamiPurchaseManager$1 as NamiPurchaseManager, NamiRefs, NamiReservedActions, NotFoundError, PAYWALL_ACTION_EVENT, PLATFORM_ID_REQUIRED, PRODUCTION, PaywallManagerEvents, PaywallRepository, PaywallState, PlacementLabelResolver, PlatformIDRequiredError, ProductRepository, RECONFIG_SUCCESS, RESUME_THROTTLE_MS, RetryLimitExceededError, SDKNotInitializedError, SDK_NOT_INITIALIZED, SERVER_NAMI_ENTITLEMENTS, SESSION_REQUIRED, SHOULD_SHOW_LOADING_INDICATOR, SIMULATE_CONFIG_FETCH_FAILURE, SIMULATE_PAYWALL_FETCH_FAILURE, SKU_TEXT_REGEX, SMART_TEXT_PATTERN, STARTUP_TELEMETRY, STATUS_BAD_REQUEST, STATUS_CONFLICT, STATUS_INTERNAL_SERVER_ERROR, STATUS_NOT_FOUND, STATUS_SUCCESS, SYSTEM_TIME_FILTER_PREFIX, SYSTEM_TIME_TOKEN_PREFIX, SessionService, SimpleEventTarget, StorageService, TIME_OVERRIDE_PREFIX, TRANSPORT_FAILURE_STATUS, UNABLE_TO_UPDATE_CDP_ID, USE_STAGING_API, VALIDATE_PRODUCT_GROUPS, VAR_REGEX, NamiProfileManager$1 as _NamiProfileManager, internal as _internal, activateEntitlementByPurchase, activeEntitlements, aggregateScreenreaderText, allCampaigns, allPaywalls, applyEntitlementActivation, audienceSplitPosition, bestUrlCampaignMatch, bigintToUuid, checkAnySkuHasPromoOffer, checkAnySkuHasTrialOffer, convertISO8601PeriodToText, convertLocale, convertOfferToPricingPhase, createNamiEntitlements, currentSku, didReceiveResponse, empty, evaluateSystemTimeAssertion, evaluateSystemTimeCondition, evenSegmentWidth, extractStandardPricingPhases, firstSet, formatDate, formattedPrice, generateUUID, getApiCampaigns, getApiPaywalls, getBaseUrl, getBillingPeriodNumber, getCurrencyFormat, getDeviceData, getDeviceFormFactor, getDeviceScaleFactor, getEffectiveWebStyle, getEntitlementRefIdsForSku, getExtendedClientInfo, getFreeTrialPeriod, getInitialCampaigns, getInitialPaywalls, getJourneySettings, getPaywall, getPaywallDataFromLabel, getPercentagePriceDifference, getPeriodNumberInDays, getPeriodNumberInWeeks, getPlatformAdapters, getPriceDifference, getPricePerMonth, getProductDetail, getPurchaseAdapter, getReferenceSku, getSkuProductDetailKeys, getSkuSmartTextValue, getSlideSmartTextValue, getStandardBillingPeriod, getSystemTimeNow, getTranslate, getUrlParams, handleErrors, hasAllPaywalls, hasCapability, hasPurchaseManagement, initialState, invokeHandler, isAnonymousMode, isInitialConfigCompressed, isNamiFlowCampaign, isStepsStyle, isSubscription, isSystemTimeAssertion, isValidISODate, isValidUrl, logger, mapAnonymousCampaigns, namiBuySKU, normalizeLaunchContext, parseTimeOverride, parseToSemver, postConversion, productDetail, registerAPITrafficObserver, registerPlatformAdapters, registerPurchaseAdapter, resolveCurrentStep, resolveLoopSource, resolveStepAlignment, resolveStepCount, resolveStepSizing, selectSegment, setActiveNamiEntitlements, shouldValidateProductGroups, skuItems, skuMapFromEntitlements, stepSegmentState, storageService, toDouble, toNamiEntitlements, toNamiSKU, tryParseB64Gzip, tryParseJson, updateRelatedSKUsForNamiEntitlement, uuidFromSplitPosition, validateForm, validateMinSDKVersion, validateTextInput };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@namiml/sdk-core",
3
- "version": "3.5.0-dev.202610312243",
3
+ "version": "3.5.0-dev.202611011529",
4
4
  "description": "Platform-agnostic core for the Nami SDK — business logic, API, types, and state management",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",