@xapps-platform/marketplace-ui 0.1.15 → 0.1.16

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.js CHANGED
@@ -118,7 +118,7 @@ function buildMarketplaceXmsCatalog(locale) {
118
118
  "xapp.current_plan_active": "Plan activ",
119
119
  "xapp.checkout_starting": "Se porne\u0219te checkout-ul...",
120
120
  "xapp.additive_unlock_action": "Cump\u0103r\u0103 suplimentul",
121
- "xapp.checkout_action": "Continu\u0103 spre checkout",
121
+ "xapp.checkout_action": "\xCEncepe checkout-ul",
122
122
  "xapp.subscription_status_label": "Stare abonament",
123
123
  "xapp.subscription_coverage_label": "Acoperire",
124
124
  "xapp.subscription_reason_label": "Motiv stare",
@@ -126,7 +126,9 @@ function buildMarketplaceXmsCatalog(locale) {
126
126
  "xapp.subscription_expiry_boundary_label": "Limit\u0103 expirare",
127
127
  "xapp.current_period_ends_label": "Perioada curent\u0103 se \xEEncheie la",
128
128
  "xapp.cancelled_at_label": "Anulat la",
129
- "xapp.credits_remaining_label": "Credite r\u0103mase",
129
+ "xapp.virtual_currency_label": "Moned\u0103 virtual\u0103",
130
+ "xapp.current_balances_label": "Solduri acum",
131
+ "xapp.credits_remaining_label": "Sold",
130
132
  "xapp.add_on_unlocks_label": "Unlock-uri suplimentare",
131
133
  "xapp.subscription_refresh_action": "Actualizeaz\u0103 starea",
132
134
  "xapp.subscription_refreshing": "Se actualizeaz\u0103...",
@@ -148,7 +150,18 @@ function buildMarketplaceXmsCatalog(locale) {
148
150
  "xapp.subscription_management_hint_owner": "Administrarea avansat\u0103 a abonamentului este gestionat\u0103 de proprietarul aplica\u021Biei.",
149
151
  "xapp.subscription_management_open_action": "Deschide administrarea",
150
152
  "xapp.lifecycle_preview_at_label": "Previzualizare la",
151
- "xapp.lifecycle_preview_hint": "Ciclul de via\u021B\u0103 al abonamentului este previzualizat pentru momentul selectat."
153
+ "xapp.lifecycle_preview_hint": "Starea abonamentului este previzualizat\u0103 pentru momentul selectat.",
154
+ "xapp.history_route_subtitle": "Solduri, activitate recent\u0103 \u0219i cump\u0103r\u0103ri pentru {title}.",
155
+ "xapp.history_route_subtitle_default": "Solduri, activitate recent\u0103 \u0219i cump\u0103r\u0103ri pentru aceast\u0103 aplica\u021Bie.",
156
+ "xapp.plans_route_subtitle": "Acces, planuri \u0219i solduri pentru {title}.",
157
+ "xapp.plans_route_subtitle_default": "Acces, planuri \u0219i solduri pentru aceast\u0103 aplica\u021Bie.",
158
+ "xapp.plans_loading_title": "Se \xEEncarc\u0103 planurile",
159
+ "xapp.plans_loading_desc": "Se preg\u0103tesc planurile publicate, soldurile \u0219i accesul curent pentru aceast\u0103 aplica\u021Bie.",
160
+ "xapp.no_plans_available": "Momentan nu exist\u0103 planuri disponibile.",
161
+ "xapp.no_plans_available_desc": "Planurile publicate vor ap\u0103rea aici atunci c\xE2nd aceast\u0103 aplica\u021Bie expune un paywall.",
162
+ "xapp.checkout_hint": "Checkout-ul se deschide \xEEntr-o pagin\u0103 securizat\u0103 de plat\u0103 administrat\u0103 de platform\u0103.",
163
+ "xapp.current_plan_note": "Acest plan este deja activ pentru aceast\u0103 aplica\u021Bie.",
164
+ "xapp.owned_unlock_note": "Acest supliment este deja inclus \xEEn accesul curent."
152
165
  };
153
166
  }
154
167
  return {
@@ -161,15 +174,17 @@ function buildMarketplaceXmsCatalog(locale) {
161
174
  "xapp.current_plan_active": "Current plan active",
162
175
  "xapp.checkout_starting": "Starting checkout...",
163
176
  "xapp.additive_unlock_action": "Purchase add-on unlock",
164
- "xapp.checkout_action": "Continue to checkout",
165
- "xapp.subscription_status_label": "Subscription status",
177
+ "xapp.checkout_action": "Start checkout",
178
+ "xapp.subscription_status_label": "Subscription state",
166
179
  "xapp.subscription_coverage_label": "Coverage",
167
180
  "xapp.subscription_reason_label": "Status reason",
168
181
  "xapp.subscription_overdue_since_label": "Overdue since",
169
182
  "xapp.subscription_expiry_boundary_label": "Expiry boundary",
170
183
  "xapp.current_period_ends_label": "Current period ends",
171
184
  "xapp.cancelled_at_label": "Cancelled at",
172
- "xapp.credits_remaining_label": "Credits remaining",
185
+ "xapp.virtual_currency_label": "Currency",
186
+ "xapp.current_balances_label": "Balances now",
187
+ "xapp.credits_remaining_label": "Balance",
173
188
  "xapp.add_on_unlocks_label": "Add-on unlocks",
174
189
  "xapp.subscription_refresh_action": "Refresh status",
175
190
  "xapp.subscription_refreshing": "Refreshing...",
@@ -191,7 +206,18 @@ function buildMarketplaceXmsCatalog(locale) {
191
206
  "xapp.subscription_management_hint_owner": "Advanced subscription management is handled by the app owner.",
192
207
  "xapp.subscription_management_open_action": "Open management",
193
208
  "xapp.lifecycle_preview_at_label": "Preview as of",
194
- "xapp.lifecycle_preview_hint": "Subscription lifecycle is being previewed for the selected time."
209
+ "xapp.lifecycle_preview_hint": "Subscription state is being previewed for the selected time.",
210
+ "xapp.history_route_subtitle": "Balances, recent activity, and purchases for {title}.",
211
+ "xapp.history_route_subtitle_default": "Balances, recent activity, and purchases for this app.",
212
+ "xapp.plans_route_subtitle": "Access, plans, and balances for {title}.",
213
+ "xapp.plans_route_subtitle_default": "Access, plans, and balances for this app.",
214
+ "xapp.plans_loading_title": "Loading plans",
215
+ "xapp.plans_loading_desc": "Preparing published plans, balances, and current access for this app.",
216
+ "xapp.no_plans_available": "No plans are currently available.",
217
+ "xapp.no_plans_available_desc": "Published plans will appear here when this app exposes a paywall.",
218
+ "xapp.checkout_hint": "Checkout opens in a secure hosted payment page managed by the platform.",
219
+ "xapp.current_plan_note": "This plan is already active for this app.",
220
+ "xapp.owned_unlock_note": "This add-on is already included in the current access."
195
221
  };
196
222
  }
197
223
  var MARKETPLACE_CATALOGS = {
@@ -280,7 +306,7 @@ var MARKETPLACE_CATALOGS = {
280
306
  "activity.invoices_title": "Invoices",
281
307
  "activity.notifications_title": "Notifications",
282
308
  "activity.unavailable_requests_title": "Requests are unavailable",
283
- "activity.unavailable_monetization_title": "Monetization is unavailable in this host.",
309
+ "activity.unavailable_monetization_title": "Plans and balances are unavailable in this host.",
284
310
  "activity.unavailable_requests_desc": "This public catalog does not support viewing personal requests.",
285
311
  "activity.unavailable_payments_title": "Payments are unavailable in this host.",
286
312
  "activity.unavailable_invoices_title": "Invoices are unavailable in this host.",
@@ -289,8 +315,8 @@ var MARKETPLACE_CATALOGS = {
289
315
  "activity.subject_required_desc": "This host session is not associated with a user. Ask your host to create a catalog session with a subjectId.",
290
316
  "activity.showing_requests_for": "Showing requests for {title}",
291
317
  "activity.showing_requests_for_prefix": "Showing requests for",
292
- "activity.showing_monetization_for": "Showing XMS state for {title}",
293
- "activity.showing_monetization_for_prefix": "Showing XMS state for",
318
+ "activity.showing_monetization_for": "Showing plans and balances for {title}",
319
+ "activity.showing_monetization_for_prefix": "Showing plans and balances for",
294
320
  "activity.showing_payments_for": "Showing payment activity for {title}",
295
321
  "activity.showing_payments_for_prefix": "Showing payment activity for",
296
322
  "activity.showing_invoices_for": "Showing invoice records for {title}",
@@ -306,11 +332,11 @@ var MARKETPLACE_CATALOGS = {
306
332
  "activity.mark_read": "Mark read",
307
333
  "activity.unread_count": "{count} unread item{suffix}",
308
334
  "activity.loading_requests": "Loading requests...",
309
- "activity.loading_monetization": "Loading monetization state...",
335
+ "activity.loading_monetization": "Loading plans, balances, and recent activity...",
310
336
  "activity.no_requests": "No requests yet.",
311
- "activity.no_monetization": "No XMS-enabled apps are currently installed for this subject.",
312
- "activity.no_monetization_current": "No current monetization coverage was found for this subject.",
313
- "activity.no_monetization_history": "No monetization history was found for this subject.",
337
+ "activity.no_monetization": "No monetized apps are currently installed for this subject.",
338
+ "activity.no_monetization_current": "No current plans or balances were found for this subject.",
339
+ "activity.no_monetization_history": "No plan or balance history was found for this subject.",
314
340
  "activity.loading_payments": "Loading payments...",
315
341
  "activity.no_payments": "No payment activity found.",
316
342
  "activity.loading_payment_detail": "Loading payment details...",
@@ -325,21 +351,30 @@ var MARKETPLACE_CATALOGS = {
325
351
  "activity.loading_notifications": "Loading notifications...",
326
352
  "activity.no_notifications": "No notification activity found.",
327
353
  "activity.loading_notification_detail": "Loading notification details...",
328
- "activity.monetization_overview_hint": "Review current XMS access, subscriptions, and credits across the apps linked to this subject.",
329
- "activity.monetization_overview_hint_with_past": "Review current and past XMS access, subscriptions, and credits across this subject's apps.",
330
- "activity.monetization_card_subtitle": "Current XMS state, active access, subscriptions, and credits for this app.",
331
- "activity.monetization_focus_xapp": "Focus this app",
332
- "activity.monetization_show_past": "Show past apps",
333
- "activity.monetization_show_current_only": "Show current only",
334
- "activity.monetization_open_plans": "Open plans",
335
- "activity.monetization_access_label": "Current access",
336
- "activity.monetization_plan_label": "Current plan",
337
- "activity.monetization_credits_label": "Credits remaining",
354
+ "activity.monetization_overview_hint": "Review current plans, subscriptions, and balances across this subject's apps.",
355
+ "activity.monetization_overview_hint_with_past": "Review current and past plans, subscriptions, and balances across this subject's apps.",
356
+ "activity.monetization_summary_title": "Plans and balances",
357
+ "activity.monetization_summary_subtitle": "Review active plans, subscriptions, and balances before opening app details or history.",
358
+ "activity.monetization_summary_apps": "Apps",
359
+ "activity.monetization_summary_subscriptions": "Subscriptions",
360
+ "activity.monetization_summary_balances": "Balances",
361
+ "activity.monetization_summary_currencies": "Named currencies",
362
+ "activity.monetization_card_subtitle": "Current plans, balances, and subscription state for this app.",
363
+ "activity.monetization_focus_xapp": "Only this app",
364
+ "activity.monetization_show_past": "Include past apps",
365
+ "activity.monetization_show_current_only": "Only current apps",
366
+ "activity.monetization_open_plans": "View plans",
367
+ "activity.monetization_open_history": "View history",
368
+ "activity.monetization_access_label": "Access",
369
+ "activity.monetization_plan_label": "Plan",
370
+ "activity.monetization_credits_label": "Balance",
338
371
  "activity.monetization_subscription_label": "Subscription",
339
- "activity.monetization_coverage_label": "Coverage",
372
+ "activity.monetization_coverage_label": "Renewal state",
340
373
  "activity.monetization_renews_at": "Renews at",
341
- "activity.monetization_balance_state": "Balance state",
342
- "activity.monetization_source_label": "Source",
374
+ "activity.monetization_balance_state": "Balance status",
375
+ "activity.monetization_balances_label": "Balances",
376
+ "activity.monetization_source_label": "Origin",
377
+ "activity.monetization_no_currency": "No named currency",
343
378
  "activity.monetization_unknown": "Unknown",
344
379
  "activity.monetization_none": "None",
345
380
  "activity.monetization_no_source": "No source",
@@ -415,7 +450,9 @@ var MARKETPLACE_CATALOGS = {
415
450
  "xapp.update_available": "Update available",
416
451
  "xapp.about_title": "About",
417
452
  "xapp.available_views_title": "Available Views",
453
+ "xapp.open_to_access_views": "Open this app to start and install it automatically for your workspace.",
418
454
  "xapp.add_to_access_views": "Add this app to your workspace to access its available views.",
455
+ "xapp.update_to_access_views_auto": "Open a view to update the app automatically for your workspace.",
419
456
  "xapp.update_to_access_views": "An update is available. Please update the app to access its available views.",
420
457
  "xapp.load_as_user_to_access": "Load the catalog as a user to access this app.",
421
458
  "xapp.no_views_available": "No app views are currently available.",
@@ -439,10 +476,10 @@ var MARKETPLACE_CATALOGS = {
439
476
  "xapp.screenshots_title": "Screenshots",
440
477
  "xapp.screenshot_alt": "Screenshot {index}",
441
478
  "xapp.usage_credits_title": "Usage Credits",
442
- "xapp.current_access_title": "Current Access",
479
+ "xapp.current_access_title": "Current access",
443
480
  "xapp.access_state_label": "Access state",
444
481
  "xapp.access_state_available": "available",
445
- "xapp.subscription_status_label": "Subscription status",
482
+ "xapp.subscription_status_label": "Subscription state",
446
483
  "xapp.subscription_coverage_label": "Coverage",
447
484
  "xapp.subscription_reason_label": "Status reason",
448
485
  "xapp.subscription_overdue_since_label": "Overdue since",
@@ -465,8 +502,10 @@ var MARKETPLACE_CATALOGS = {
465
502
  "xapp.subscription_cancel_description": "The subscription will stop renewing. Current access remains available until the current period ends.",
466
503
  "xapp.subscription_cancel_failed": "Unable to cancel this subscription.",
467
504
  "xapp.lifecycle_preview_at_label": "Preview as of",
468
- "xapp.lifecycle_preview_hint": "Subscription lifecycle is being previewed for the selected time.",
469
- "xapp.credits_remaining_label": "Credits remaining",
505
+ "xapp.lifecycle_preview_hint": "Subscription state is being previewed for the selected time.",
506
+ "xapp.virtual_currency_label": "Currency",
507
+ "xapp.current_balances_label": "Balances now",
508
+ "xapp.credits_remaining_label": "Balance",
470
509
  "xapp.available_label": "Available",
471
510
  "xapp.ready_to_use": "{count} ready to use",
472
511
  "xapp.source_label": "Source",
@@ -608,8 +647,8 @@ var MARKETPLACE_CATALOGS = {
608
647
  "activity.subject_required_desc": "Aceast\u0103 sesiune de host nu este asociat\u0103 cu un utilizator. Cere hostului s\u0103 creeze o sesiune de catalog cu un subjectId.",
609
648
  "activity.showing_requests_for": "Se afi\u0219eaz\u0103 cererile pentru {title}",
610
649
  "activity.showing_requests_for_prefix": "Se afi\u0219eaz\u0103 cererile pentru",
611
- "activity.showing_monetization_for": "Se afi\u0219eaz\u0103 starea XMS pentru {title}",
612
- "activity.showing_monetization_for_prefix": "Se afi\u0219eaz\u0103 starea XMS pentru",
650
+ "activity.showing_monetization_for": "Se afi\u0219eaz\u0103 planurile \u0219i soldurile pentru {title}",
651
+ "activity.showing_monetization_for_prefix": "Se afi\u0219eaz\u0103 planurile \u0219i soldurile pentru",
613
652
  "activity.showing_payments_for": "Se afi\u0219eaz\u0103 activitatea pl\u0103\u021Bilor pentru {title}",
614
653
  "activity.showing_payments_for_prefix": "Se afi\u0219eaz\u0103 activitatea pl\u0103\u021Bilor pentru",
615
654
  "activity.showing_invoices_for": "Se afi\u0219eaz\u0103 facturile pentru {title}",
@@ -625,11 +664,11 @@ var MARKETPLACE_CATALOGS = {
625
664
  "activity.mark_read": "Marcheaz\u0103 ca citit",
626
665
  "activity.unread_count": "{count} notific{suffix} necitit{suffix2}",
627
666
  "activity.loading_requests": "Se \xEEncarc\u0103 cererile...",
628
- "activity.loading_monetization": "Se \xEEncarc\u0103 starea monetiz\u0103rii...",
667
+ "activity.loading_monetization": "Se \xEEncarc\u0103 planurile, soldurile \u0219i activitatea recent\u0103...",
629
668
  "activity.no_requests": "Nu exist\u0103 \xEEnc\u0103 cereri.",
630
- "activity.no_monetization": "Nu exist\u0103 \xEEnc\u0103 aplica\u021Bii cu XMS instalate pentru acest subiect.",
631
- "activity.no_monetization_current": "Nu a fost g\u0103sit\u0103 nicio acoperire curent\u0103 de monetizare pentru acest subiect.",
632
- "activity.no_monetization_history": "Nu a fost g\u0103sit niciun istoric de monetizare pentru acest subiect.",
669
+ "activity.no_monetization": "Nu exist\u0103 \xEEnc\u0103 aplica\u021Bii monetizate instalate pentru acest subiect.",
670
+ "activity.no_monetization_current": "Nu au fost g\u0103site planuri sau solduri curente pentru acest subiect.",
671
+ "activity.no_monetization_history": "Nu a fost g\u0103sit niciun istoric de planuri sau solduri pentru acest subiect.",
633
672
  "activity.loading_payments": "Se \xEEncarc\u0103 pl\u0103\u021Bile...",
634
673
  "activity.no_payments": "Nu a fost g\u0103sit\u0103 activitate de plat\u0103.",
635
674
  "activity.loading_payment_detail": "Se \xEEncarc\u0103 detaliile pl\u0103\u021Bii...",
@@ -644,21 +683,30 @@ var MARKETPLACE_CATALOGS = {
644
683
  "activity.loading_notifications": "Se \xEEncarc\u0103 notific\u0103rile...",
645
684
  "activity.no_notifications": "Nu a fost g\u0103sit\u0103 activitate de notificare.",
646
685
  "activity.loading_notification_detail": "Se \xEEncarc\u0103 detaliile notific\u0103rii...",
647
- "activity.monetization_overview_hint": "Revizuie\u0219te accesul XMS curent, abonamentele \u0219i creditele pentru aplica\u021Biile legate de acest subiect.",
648
- "activity.monetization_overview_hint_with_past": "Revizuie\u0219te accesul XMS curent \u0219i trecut, abonamentele \u0219i creditele pentru aplica\u021Biile acestui subiect.",
649
- "activity.monetization_card_subtitle": "Starea XMS curent\u0103, accesul activ, abonamentele \u0219i creditele pentru aceast\u0103 aplica\u021Bie.",
650
- "activity.monetization_focus_xapp": "Focalizeaz\u0103 aplica\u021Bia",
651
- "activity.monetization_show_past": "Arat\u0103 aplica\u021Biile anterioare",
652
- "activity.monetization_show_current_only": "Arat\u0103 doar aplica\u021Biile curente",
653
- "activity.monetization_open_plans": "Deschide planurile",
654
- "activity.monetization_access_label": "Acces curent",
655
- "activity.monetization_plan_label": "Plan curent",
656
- "activity.monetization_credits_label": "Credite r\u0103mase",
686
+ "activity.monetization_overview_hint": "Revizuie\u0219te planurile, abonamentele \u0219i soldurile curente pentru aplica\u021Biile legate de acest subiect.",
687
+ "activity.monetization_overview_hint_with_past": "Revizuie\u0219te planurile, abonamentele \u0219i soldurile curente \u0219i trecute pentru aplica\u021Biile acestui subiect.",
688
+ "activity.monetization_summary_title": "Planuri \u0219i solduri",
689
+ "activity.monetization_summary_subtitle": "Revizuie\u0219te planurile active, abonamentele \u0219i soldurile \xEEnainte s\u0103 deschizi detaliile aplica\u021Biei sau istoricul.",
690
+ "activity.monetization_summary_apps": "Aplica\u021Bii",
691
+ "activity.monetization_summary_subscriptions": "Abonamente",
692
+ "activity.monetization_summary_balances": "Solduri",
693
+ "activity.monetization_summary_currencies": "Monede nominale",
694
+ "activity.monetization_card_subtitle": "Planurile curente, soldurile \u0219i starea abonamentului pentru aceast\u0103 aplica\u021Bie.",
695
+ "activity.monetization_focus_xapp": "Doar aceast\u0103 aplica\u021Bie",
696
+ "activity.monetization_show_past": "Include aplica\u021Biile anterioare",
697
+ "activity.monetization_show_current_only": "Doar aplica\u021Biile curente",
698
+ "activity.monetization_open_plans": "Vezi planurile",
699
+ "activity.monetization_open_history": "Vezi istoricul",
700
+ "activity.monetization_access_label": "Acces",
701
+ "activity.monetization_plan_label": "Plan",
702
+ "activity.monetization_credits_label": "Sold",
657
703
  "activity.monetization_subscription_label": "Abonament",
658
- "activity.monetization_coverage_label": "Acoperire",
704
+ "activity.monetization_coverage_label": "Stare re\xEEnnoire",
659
705
  "activity.monetization_renews_at": "Se re\xEEnnoie\u0219te la",
660
- "activity.monetization_balance_state": "Stare sold",
661
- "activity.monetization_source_label": "Surs\u0103",
706
+ "activity.monetization_balance_state": "Status sold",
707
+ "activity.monetization_balances_label": "Solduri",
708
+ "activity.monetization_source_label": "Origine",
709
+ "activity.monetization_no_currency": "F\u0103r\u0103 moned\u0103 nominal\u0103",
662
710
  "activity.monetization_unknown": "Necunoscut",
663
711
  "activity.monetization_none": "Niciunul",
664
712
  "activity.monetization_no_source": "F\u0103r\u0103 surs\u0103",
@@ -734,7 +782,9 @@ var MARKETPLACE_CATALOGS = {
734
782
  "xapp.update_available": "Actualizare disponibil\u0103",
735
783
  "xapp.about_title": "Despre",
736
784
  "xapp.available_views_title": "Vizualiz\u0103ri disponibile",
785
+ "xapp.open_to_access_views": "Deschide aceast\u0103 aplica\u021Bie pentru a o porni \u0219i instala automat \xEEn spa\u021Biul t\u0103u de lucru.",
737
786
  "xapp.add_to_access_views": "Adaug\u0103 aceast\u0103 aplica\u021Bie \xEEn spa\u021Biul t\u0103u de lucru pentru a-i accesa vizualiz\u0103rile disponibile.",
787
+ "xapp.update_to_access_views_auto": "Deschide o vizualizare pentru a actualiza automat aplica\u021Bia \xEEn spa\u021Biul t\u0103u de lucru.",
738
788
  "xapp.update_to_access_views": "Este disponibil\u0103 o actualizare. Actualizeaz\u0103 aplica\u021Bia pentru a-i accesa vizualiz\u0103rile disponibile.",
739
789
  "xapp.load_as_user_to_access": "\xCEncarc\u0103 catalogul ca utilizator pentru a accesa aceast\u0103 aplica\u021Bie.",
740
790
  "xapp.no_views_available": "Nu exist\u0103 \xEEn prezent vizualiz\u0103ri disponibile pentru aplica\u021Bie.",
@@ -785,7 +835,9 @@ var MARKETPLACE_CATALOGS = {
785
835
  "xapp.subscription_cancel_failed": "Abonamentul nu a putut fi anulat.",
786
836
  "xapp.lifecycle_preview_at_label": "Previzualizare la",
787
837
  "xapp.lifecycle_preview_hint": "Ciclul de via\u021B\u0103 al abonamentului este previzualizat pentru momentul selectat.",
788
- "xapp.credits_remaining_label": "Credite r\u0103mase",
838
+ "xapp.virtual_currency_label": "Moned\u0103 virtual\u0103",
839
+ "xapp.current_balances_label": "Solduri curente",
840
+ "xapp.credits_remaining_label": "Sold",
789
841
  "xapp.available_label": "Disponibile",
790
842
  "xapp.ready_to_use": "{count} gata de utilizare",
791
843
  "xapp.source_label": "Surs\u0103",
@@ -2130,17 +2182,54 @@ var XMS_COPY_CATALOG = {
2130
2182
  currentPlanActiveLabel: "Current plan active",
2131
2183
  startingCheckoutLabel: "Starting checkout...",
2132
2184
  purchaseAddOnUnlockLabel: "Purchase add-on unlock",
2133
- continueToCheckoutLabel: "Continue to checkout"
2185
+ continueToCheckoutLabel: "Continue to checkout",
2186
+ generalUpgradeFitLabel: "Flexible option",
2187
+ generalUpgradeSummary: "A general plan option for this app.",
2188
+ durableUnlockFitLabel: "One-time unlock",
2189
+ durableUnlockSummary: "Best when you want access without an ongoing subscription.",
2190
+ recurringMembershipFitLabel: "Subscription",
2191
+ recurringMembershipSummary: "Best when this app is meant to stay active through recurring coverage.",
2192
+ creditTopUpFitLabel: "Balance top-up",
2193
+ hybridUpgradeFitLabel: "Access + balance",
2194
+ creditPackFitSummary: (unitLabel) => `Best when the feature spends ${unitLabel} for each advanced action.`,
2195
+ hybridPackFitSummary: (unitLabel) => `Blends access coverage with bundled ${unitLabel} for mixed workflows.`,
2196
+ packageCurrencySignalLabel: (unitLabel) => `currency ${unitLabel}`,
2197
+ billedSignalLabel: (periodLabel) => `billed ${periodLabel}`,
2198
+ generalOfferingSummary: "Available plans for this app.",
2199
+ featurePaywallOfferingSummary: "Shown when this app needs extra access or balance.",
2200
+ defaultPaywallOfferingSummary: "Main plan selection for this app.",
2201
+ checkoutOfferingSummary: "Direct purchase flow for this app.",
2202
+ upgradeOfferingSummary: "Best for switching or upgrading your current plan.",
2203
+ featureDurableUnlockReason: "Aligned with one-time unlock access.",
2204
+ featureRecurringAccessReason: "Recurring membership also grants current access.",
2205
+ featureHybridAccessReason: "Hybrid package contributes to current access coverage.",
2206
+ featureSubscriptionDirectReason: "Matches the subscription requirement directly.",
2207
+ featureHybridSubscriptionReason: "Hybrid package can also cover part of the subscription shape.",
2208
+ creditRequirementCoveredLabel: (amountLabel) => `Covers the ${amountLabel} requirement.`,
2209
+ creditRequirementAddedLabel: (amountLabel) => `Adds ${amountLabel} toward the requirement.`,
2210
+ hybridCreditsSupportLabel: (unitLabel) => `Hybrid package can add bundled ${unitLabel} for this flow.`
2134
2211
  },
2135
2212
  surface: {
2136
2213
  plansTitle: "Plans",
2137
2214
  historyTitle: "History",
2138
- plansSubtitle: "Current access and published plans for this app",
2215
+ plansSubtitle: "Access, plans, and balances for this app",
2139
2216
  historySubtitle: "Recent monetization events, invoices, subscriptions, and wallet activity",
2217
+ offeringFallbackLabel: "Offering",
2218
+ packageFallbackLabel: "Package",
2219
+ paywallFallbackLabel: "Plans",
2220
+ availableLabel: "Available",
2221
+ unavailableLabel: "Unavailable",
2222
+ unknownLabel: "Unknown",
2223
+ yesLabel: "Yes",
2224
+ noLabel: "No",
2225
+ defaultBadgeLabel: "default",
2226
+ choosePackageActionLabel: "Choose package",
2227
+ noPaywallPackagesLabel: "No plans are currently available.",
2228
+ priceUnavailableLabel: "Price unavailable",
2140
2229
  plansLabel: "Plans",
2141
2230
  historyLabel: "History",
2142
2231
  closeLabel: "Close",
2143
- tabsAriaLabel: "XMS view",
2232
+ tabsAriaLabel: "Plans and history view",
2144
2233
  loadingLabel: "Loading plans...",
2145
2234
  subjectRequiredNotice: "Checkout requires a subject-bound catalog session. Start from a signed host session to purchase plans.",
2146
2235
  paymentCompletedNotice: "Payment completed and access was refreshed.",
@@ -2154,7 +2243,7 @@ var XMS_COPY_CATALOG = {
2154
2243
  subscriptionCancelConfirmMessage: "Cancel renewal for this subscription?",
2155
2244
  subscriptionCancelConfirmLabel: "Cancel subscription",
2156
2245
  subscriptionCancelDismissLabel: "Keep subscription",
2157
- missingPackageMetadataMessage: "This package is missing purchase metadata in the published paywall.",
2246
+ missingPackageMetadataMessage: "This package is missing purchase metadata in the published plans configuration.",
2158
2247
  missingIntentMessage: "Purchase intent was created without an identifier.",
2159
2248
  missingPaymentPageMessage: "Payment page is not available for this package.",
2160
2249
  startCheckoutFailedMessage: "Unable to start checkout for this package.",
@@ -2162,7 +2251,7 @@ var XMS_COPY_CATALOG = {
2162
2251
  currentCoverageTitle: "Current coverage",
2163
2252
  currentPlanLabel: "Current plan",
2164
2253
  membershipAccessLabel: "Membership access",
2165
- subscriptionStatusLabel: "Subscription status",
2254
+ subscriptionStatusLabel: "Subscription state",
2166
2255
  subscriptionCoverageLabel: "Coverage",
2167
2256
  subscriptionReasonLabel: "Status reason",
2168
2257
  currentPeriodEndsLabel: "Current period ends",
@@ -2186,7 +2275,8 @@ var XMS_COPY_CATALOG = {
2186
2275
  managementDestinationHintPublisherLabel: "Advanced subscription management is handled in the publisher app.",
2187
2276
  managementDestinationHintOwnerLabel: "Advanced subscription management is handled by the app owner.",
2188
2277
  openManagementDestinationActionLabel: "Open management",
2189
- creditsRemainingLabel: "Credits remaining",
2278
+ virtualCurrencyLabel: "Currency",
2279
+ creditsRemainingLabel: "Balance",
2190
2280
  addOnUnlocksLabel: "Add-on unlocks",
2191
2281
  coverageActiveLabel: "Still covered",
2192
2282
  coverageInactiveLabel: "Not covered",
@@ -2198,11 +2288,13 @@ var XMS_COPY_CATALOG = {
2198
2288
  refreshingStatusActionLabel: "Refreshing...",
2199
2289
  cancelSubscriptionActionLabel: "Cancel subscription",
2200
2290
  cancellingSubscriptionActionLabel: "Cancelling...",
2201
- noPublishedPlansLabel: "No published plans are currently available.",
2202
- recentTimelineTitle: "Recent timeline",
2203
- recentTimelineSubtitle: "Latest monetization events correlated for this subject and app.",
2204
- historyAuditTitle: "History and audit",
2205
- historyAuditSubtitle: "Recent monetization records for this subject and app.",
2291
+ noPublishedPlansLabel: "No plans are currently available.",
2292
+ recentTimelineTitle: "Recent activity",
2293
+ recentTimelineSubtitle: "Latest subscription, balance, purchase, and invoice activity for this app.",
2294
+ historyAuditTitle: "Detailed history",
2295
+ historyAuditSubtitle: "Recent records grouped by subscriptions, balances, purchases, and invoices.",
2296
+ historyBalanceSummaryTitle: "Balances now",
2297
+ historyBalanceSummarySubtitle: "Latest visible wallet balances grouped by virtual currency for this app.",
2206
2298
  noHistoryAvailableLabel: "No monetization history is available for this app yet.",
2207
2299
  historyGenericLabel: "History",
2208
2300
  historyPurchaseIntentsTitle: "Purchase intents",
@@ -2227,7 +2319,33 @@ var XMS_COPY_CATALOG = {
2227
2319
  historyAccessSnapshotsTitle: "Access snapshots",
2228
2320
  historyAccessSnapshotLabel: "Access snapshot",
2229
2321
  historyInvoicesTitle: "Invoices",
2230
- historyInvoiceLabel: "Invoice"
2322
+ historyInvoiceLabel: "Invoice",
2323
+ featureCurrentAccessMissingLabel: "Current access coverage is not active on this scope.",
2324
+ featureSubscriptionMissingLabel: "No active subscription is visible for this scope.",
2325
+ featureCreditsMissingLabel: (requiredLabel, availableLabel) => `This action needs ${requiredLabel}, but only ${availableLabel} are visible right now.`,
2326
+ featureBlockedSummary: (title) => `${title || "Feature"} is blocked on the current scope.`,
2327
+ featureReadySummary: (title) => `${title || "Feature"} can be unlocked from the current plan options.`,
2328
+ featureNeedMixedAccessLabel: "needs mixed access",
2329
+ featureNeedMembershipAndCreditsLabel: (unitLabel) => `needs membership + ${unitLabel}`,
2330
+ featureNeedMembershipLabel: "needs membership",
2331
+ featureNeedCreditsLabel: (unitLabel) => `needs ${unitLabel}`,
2332
+ featureNeedAccessLabel: "needs access",
2333
+ featureLockedLabel: "locked",
2334
+ featureGapShortLabel: (amountLabel) => `${amountLabel} short`,
2335
+ featureCurrentAccessMissingBadge: "current access missing",
2336
+ featureMembershipNotActiveBadge: "membership not active",
2337
+ featureCandidateLead: (selectedPackageTitle) => `${selectedPackageTitle || "Selected package"} is one package candidate for this access gap.`,
2338
+ featureCandidateFallbackLead: "Choose a plan option that covers the current access gap.",
2339
+ featureViewHybridOptionsLabel: "View hybrid options",
2340
+ featureViewMembershipOptionsLabel: "View membership options",
2341
+ featureViewCreditOptionsLabel: (unitLabel) => `View ${unitLabel} options`,
2342
+ featureViewUnlockOptionsLabel: "View unlock options",
2343
+ featureOpenPaywallLabel: "Open plans",
2344
+ featureUnlockCheckoutLabel: "Unlock with hosted checkout",
2345
+ featureStartMembershipCheckoutLabel: "Start membership checkout",
2346
+ featureBuyCreditsCheckoutLabel: (unitLabel) => `Buy ${unitLabel} with hosted checkout`,
2347
+ featureStartHybridCheckoutLabel: "Start hybrid checkout",
2348
+ featureCreatePaymentSessionLabel: "Create payment session"
2231
2349
  }
2232
2350
  },
2233
2351
  ro: {
@@ -2242,17 +2360,54 @@ var XMS_COPY_CATALOG = {
2242
2360
  currentPlanActiveLabel: "Plan activ",
2243
2361
  startingCheckoutLabel: "Se porne\u0219te checkout-ul...",
2244
2362
  purchaseAddOnUnlockLabel: "Cump\u0103r\u0103 suplimentul",
2245
- continueToCheckoutLabel: "Continu\u0103 spre checkout"
2363
+ continueToCheckoutLabel: "Continu\u0103 spre checkout",
2364
+ generalUpgradeFitLabel: "Op\u021Biune flexibil\u0103",
2365
+ generalUpgradeSummary: "O op\u021Biune general\u0103 de plan pentru aceast\u0103 aplica\u021Bie.",
2366
+ durableUnlockFitLabel: "Unlock unic",
2367
+ durableUnlockSummary: "Potrivit c\xE2nd vrei acces f\u0103r\u0103 un abonament recurent.",
2368
+ recurringMembershipFitLabel: "Abonament",
2369
+ recurringMembershipSummary: "Potrivit c\xE2nd aceast\u0103 aplica\u021Bie trebuie s\u0103 r\u0103m\xE2n\u0103 activ\u0103 prin acoperire recurent\u0103.",
2370
+ creditTopUpFitLabel: "Top-up sold",
2371
+ hybridUpgradeFitLabel: "Acces + sold",
2372
+ creditPackFitSummary: (unitLabel) => `Potrivit c\xE2nd func\u021Bia consum\u0103 ${unitLabel} pentru fiecare ac\u021Biune avansat\u0103.`,
2373
+ hybridPackFitSummary: (unitLabel) => `Combin\u0103 acoperirea accesului cu ${unitLabel} incluse pentru fluxuri mixte.`,
2374
+ packageCurrencySignalLabel: (unitLabel) => `moned\u0103 ${unitLabel}`,
2375
+ billedSignalLabel: (periodLabel) => `facturat ${periodLabel}`,
2376
+ generalOfferingSummary: "Planuri disponibile pentru aceast\u0103 aplica\u021Bie.",
2377
+ featurePaywallOfferingSummary: "Afi\u0219at c\xE2nd aceast\u0103 aplica\u021Bie are nevoie de acces sau sold suplimentar.",
2378
+ defaultPaywallOfferingSummary: "Selec\u021Bia principal\u0103 de planuri pentru aceast\u0103 aplica\u021Bie.",
2379
+ checkoutOfferingSummary: "Flux de cump\u0103rare direct pentru aceast\u0103 aplica\u021Bie.",
2380
+ upgradeOfferingSummary: "Potrivit pentru schimbarea sau \xEEmbun\u0103t\u0103\u021Birea planului curent.",
2381
+ featureDurableUnlockReason: "Se potrive\u0219te cu accesul de tip unlock unic.",
2382
+ featureRecurringAccessReason: "Abonamentul recurent ofer\u0103 \u0219i acces curent pentru acest flux.",
2383
+ featureHybridAccessReason: "Pachetul hibrid contribuie la acoperirea accesului curent.",
2384
+ featureSubscriptionDirectReason: "Se potrive\u0219te direct cu cerin\u021Ba de abonament.",
2385
+ featureHybridSubscriptionReason: "Pachetul hibrid poate acoperi \u0219i o parte din forma de abonament.",
2386
+ creditRequirementCoveredLabel: (amountLabel) => `Acoper\u0103 cerin\u021Ba de ${amountLabel}.`,
2387
+ creditRequirementAddedLabel: (amountLabel) => `Adaug\u0103 ${amountLabel} c\u0103tre cerin\u021B\u0103.`,
2388
+ hybridCreditsSupportLabel: (unitLabel) => `Pachetul hibrid poate ad\u0103uga ${unitLabel} incluse pentru acest flux.`
2246
2389
  },
2247
2390
  surface: {
2248
2391
  plansTitle: "Planuri",
2249
2392
  historyTitle: "Istoric",
2250
- plansSubtitle: "Accesul curent \u0219i planurile publicate pentru aceast\u0103 aplica\u021Bie",
2393
+ plansSubtitle: "Acces, planuri \u0219i solduri pentru aceast\u0103 aplica\u021Bie",
2251
2394
  historySubtitle: "Evenimente recente de monetizare, facturi, abonamente \u0219i activitate din portofel",
2395
+ offeringFallbackLabel: "Ofert\u0103",
2396
+ packageFallbackLabel: "Pachet",
2397
+ paywallFallbackLabel: "Planuri",
2398
+ availableLabel: "Disponibil",
2399
+ unavailableLabel: "Indisponibil",
2400
+ unknownLabel: "Necunoscut",
2401
+ yesLabel: "Da",
2402
+ noLabel: "Nu",
2403
+ defaultBadgeLabel: "implicit",
2404
+ choosePackageActionLabel: "Alege pachetul",
2405
+ noPaywallPackagesLabel: "Nu exist\u0103 momentan planuri disponibile.",
2406
+ priceUnavailableLabel: "Pre\u021B indisponibil",
2252
2407
  plansLabel: "Planuri",
2253
2408
  historyLabel: "Istoric",
2254
2409
  closeLabel: "\xCEnchide",
2255
- tabsAriaLabel: "Vizualizare XMS",
2410
+ tabsAriaLabel: "Vizualizare planuri \u0219i istoric",
2256
2411
  loadingLabel: "Se \xEEncarc\u0103 planurile...",
2257
2412
  subjectRequiredNotice: "Checkout-ul necesit\u0103 o sesiune de catalog asociat\u0103 unui subiect. Porne\u0219te dintr-o sesiune gazd\u0103 autentificat\u0103 pentru a cump\u0103ra planuri.",
2258
2413
  paymentCompletedNotice: "Plata a fost finalizat\u0103 \u0219i accesul a fost actualizat.",
@@ -2266,7 +2421,7 @@ var XMS_COPY_CATALOG = {
2266
2421
  subscriptionCancelConfirmMessage: "Anulezi re\xEEnnoirea acestui abonament?",
2267
2422
  subscriptionCancelConfirmLabel: "Anuleaz\u0103 abonamentul",
2268
2423
  subscriptionCancelDismissLabel: "P\u0103streaz\u0103 abonamentul",
2269
- missingPackageMetadataMessage: "Acest pachet nu are metadatele de cump\u0103rare necesare \xEEn paywall-ul publicat.",
2424
+ missingPackageMetadataMessage: "Acest pachet nu are metadatele de cump\u0103rare necesare \xEEn configura\u021Bia publicat\u0103 a planurilor.",
2270
2425
  missingIntentMessage: "Intentul de cump\u0103rare a fost creat f\u0103r\u0103 identificator.",
2271
2426
  missingPaymentPageMessage: "Pagina de plat\u0103 nu este disponibil\u0103 pentru acest pachet.",
2272
2427
  startCheckoutFailedMessage: "Nu s-a putut porni checkout-ul pentru acest pachet.",
@@ -2298,7 +2453,8 @@ var XMS_COPY_CATALOG = {
2298
2453
  managementDestinationHintPublisherLabel: "Administrarea avansat\u0103 a abonamentului se face \xEEn aplica\u021Bia publisherului.",
2299
2454
  managementDestinationHintOwnerLabel: "Administrarea avansat\u0103 a abonamentului este gestionat\u0103 de proprietarul aplica\u021Biei.",
2300
2455
  openManagementDestinationActionLabel: "Deschide administrarea",
2301
- creditsRemainingLabel: "Credite r\u0103mase",
2456
+ virtualCurrencyLabel: "Moned\u0103 virtual\u0103",
2457
+ creditsRemainingLabel: "Sold",
2302
2458
  addOnUnlocksLabel: "Unlock-uri suplimentare",
2303
2459
  coverageActiveLabel: "\xCEnc\u0103 activ",
2304
2460
  coverageInactiveLabel: "Neacoperit",
@@ -2310,11 +2466,13 @@ var XMS_COPY_CATALOG = {
2310
2466
  refreshingStatusActionLabel: "Se actualizeaz\u0103...",
2311
2467
  cancelSubscriptionActionLabel: "Anuleaz\u0103 abonamentul",
2312
2468
  cancellingSubscriptionActionLabel: "Se anuleaz\u0103...",
2313
- noPublishedPlansLabel: "Nu exist\u0103 planuri publicate disponibile \xEEn acest moment.",
2314
- recentTimelineTitle: "Cronologie recent\u0103",
2315
- recentTimelineSubtitle: "Cele mai recente evenimente de monetizare corelate pentru acest subiect \u0219i aceast\u0103 aplica\u021Bie.",
2316
- historyAuditTitle: "Istoric \u0219i audit",
2317
- historyAuditSubtitle: "\xCEnregistr\u0103ri recente de monetizare pentru acest subiect \u0219i aceast\u0103 aplica\u021Bie.",
2469
+ noPublishedPlansLabel: "Nu exist\u0103 planuri disponibile \xEEn acest moment.",
2470
+ recentTimelineTitle: "Activitate recent\u0103",
2471
+ recentTimelineSubtitle: "Cele mai recente actualiz\u0103ri pentru abonamente, solduri, cump\u0103r\u0103ri \u0219i facturi pentru aceast\u0103 aplica\u021Bie.",
2472
+ historyAuditTitle: "Istoric detaliat",
2473
+ historyAuditSubtitle: "\xCEnregistr\u0103ri recente grupate dup\u0103 abonamente, solduri, cump\u0103r\u0103ri \u0219i facturi.",
2474
+ historyBalanceSummaryTitle: "Solduri acum",
2475
+ historyBalanceSummarySubtitle: "Cele mai recente solduri vizibile din portofel, grupate dup\u0103 moneda virtual\u0103 pentru aceast\u0103 aplica\u021Bie.",
2318
2476
  noHistoryAvailableLabel: "Nu exist\u0103 \xEEnc\u0103 istoric de monetizare disponibil pentru aceast\u0103 aplica\u021Bie.",
2319
2477
  historyGenericLabel: "Istoric",
2320
2478
  historyPurchaseIntentsTitle: "Inten\u021Bii de cump\u0103rare",
@@ -2339,7 +2497,33 @@ var XMS_COPY_CATALOG = {
2339
2497
  historyAccessSnapshotsTitle: "Instantanee acces",
2340
2498
  historyAccessSnapshotLabel: "Instantaneu acces",
2341
2499
  historyInvoicesTitle: "Facturi",
2342
- historyInvoiceLabel: "Factur\u0103"
2500
+ historyInvoiceLabel: "Factur\u0103",
2501
+ featureCurrentAccessMissingLabel: "Acoperirea de acces curent nu este activ\u0103 pe acest scope.",
2502
+ featureSubscriptionMissingLabel: "Nu este vizibil niciun abonament activ pentru acest scope.",
2503
+ featureCreditsMissingLabel: (requiredLabel, availableLabel) => `Aceast\u0103 ac\u021Biune are nevoie de ${requiredLabel}, dar acum sunt vizibile doar ${availableLabel}.`,
2504
+ featureBlockedSummary: (title) => `${title || "Func\u021Bia"} este blocat\u0103 pe scope-ul curent.`,
2505
+ featureReadySummary: (title) => `${title || "Func\u021Bia"} poate fi deblocat\u0103 din op\u021Biunile curente de plan.`,
2506
+ featureNeedMixedAccessLabel: "necesit\u0103 acces mixt",
2507
+ featureNeedMembershipAndCreditsLabel: (unitLabel) => `necesit\u0103 abonament + ${unitLabel}`,
2508
+ featureNeedMembershipLabel: "necesit\u0103 abonament",
2509
+ featureNeedCreditsLabel: (unitLabel) => `necesit\u0103 ${unitLabel}`,
2510
+ featureNeedAccessLabel: "necesit\u0103 acces",
2511
+ featureLockedLabel: "blocat",
2512
+ featureGapShortLabel: (amountLabel) => `lipse\u0219te ${amountLabel}`,
2513
+ featureCurrentAccessMissingBadge: "lipse\u0219te accesul curent",
2514
+ featureMembershipNotActiveBadge: "abonamentul nu este activ",
2515
+ featureCandidateLead: (selectedPackageTitle) => `${selectedPackageTitle || "Pachetul selectat"} este un pachet candidat pentru acest gol de acces.`,
2516
+ featureCandidateFallbackLead: "Alege o op\u021Biune de plan care acoper\u0103 golul curent de acces.",
2517
+ featureViewHybridOptionsLabel: "Vezi op\u021Biunile hibride",
2518
+ featureViewMembershipOptionsLabel: "Vezi op\u021Biunile de abonament",
2519
+ featureViewCreditOptionsLabel: (unitLabel) => `Vezi op\u021Biunile ${unitLabel}`,
2520
+ featureViewUnlockOptionsLabel: "Vezi op\u021Biunile de unlock",
2521
+ featureOpenPaywallLabel: "Deschide planurile",
2522
+ featureUnlockCheckoutLabel: "Deblocheaz\u0103 prin checkout g\u0103zduit",
2523
+ featureStartMembershipCheckoutLabel: "Porne\u0219te checkout-ul de abonament",
2524
+ featureBuyCreditsCheckoutLabel: (unitLabel) => `Cump\u0103r\u0103 ${unitLabel} prin checkout g\u0103zduit`,
2525
+ featureStartHybridCheckoutLabel: "Porne\u0219te checkout-ul hibrid",
2526
+ featureCreatePaymentSessionLabel: "Creeaz\u0103 sesiunea de plat\u0103"
2343
2527
  }
2344
2528
  }
2345
2529
  };
@@ -2377,6 +2561,38 @@ function readLocalizedText(value, fallback = "") {
2377
2561
  const record = value;
2378
2562
  return readString4(record.en) || readString4(record.ro) || Object.values(record).map((item) => readString4(item)).find(Boolean) || fallback;
2379
2563
  }
2564
+ function readVirtualCurrencyDefinition(value) {
2565
+ const record = readRecord(value);
2566
+ if (!record) return null;
2567
+ const code = readString4(record.code);
2568
+ const name = readString4(record.name);
2569
+ if (!code && !name) return null;
2570
+ return record;
2571
+ }
2572
+ function formatVirtualCurrencyLabel(value, options) {
2573
+ const record = readVirtualCurrencyDefinition(value);
2574
+ if (!record) return "";
2575
+ const code = readString4(record.code);
2576
+ const name = readString4(record.name);
2577
+ if (options?.preferCode && code) return code;
2578
+ if (options?.includeCode && name && code && readLower2(name) !== readLower2(code)) {
2579
+ return `${name} (${code})`;
2580
+ }
2581
+ return name || code;
2582
+ }
2583
+ function formatVirtualCurrencyAmountLabel(input) {
2584
+ const amount = readString4(input.amount);
2585
+ if (!amount) return "";
2586
+ const currencyLabel = formatVirtualCurrencyLabel(input.virtualCurrency);
2587
+ if (currencyLabel) return `${amount} ${currencyLabel}`;
2588
+ const fallbackUnit = readString4(input.fallbackUnit);
2589
+ return fallbackUnit ? `${amount} ${fallbackUnit}` : amount;
2590
+ }
2591
+ function normalizeVirtualCurrencyDisplayLabel(label) {
2592
+ const normalized = readString4(label);
2593
+ if (!normalized) return "";
2594
+ return normalized.replace(/\s+\([^)]+\)\s*$/, "").trim() || normalized;
2595
+ }
2380
2596
  function escapeHtml(value) {
2381
2597
  return String(value ?? "").replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
2382
2598
  }
@@ -2402,11 +2618,12 @@ function hasEffectiveCoverage(input) {
2402
2618
  return Boolean(input.accessProjection?.has_current_access);
2403
2619
  }
2404
2620
  function formatCoverageLabel(input) {
2621
+ const copy = buildXmsSurfaceCopy({ locale: input.locale });
2405
2622
  if (isExhaustedIncludedCreditAccess(input)) {
2406
2623
  return buildXmsPackageCopy(input.locale).consumedLabel;
2407
2624
  }
2408
- if (hasEffectiveCoverage(input)) return "Available";
2409
- return formatStateLabel(input.accessProjection?.entitlement_state, "Unavailable");
2625
+ if (hasEffectiveCoverage(input)) return copy.coverageActiveLabel;
2626
+ return copy.coverageInactiveLabel;
2410
2627
  }
2411
2628
  function resolveSubscriptionCoverageLabel(input) {
2412
2629
  const copy = buildXmsSurfaceCopy({ locale: input.locale });
@@ -2518,17 +2735,20 @@ function flattenXappMonetizationPaywallPackages(paywall) {
2518
2735
  out.push({
2519
2736
  offeringId: readString4(packageRecord.offering_id),
2520
2737
  offeringSlug: readString4(packageRecord.offering_slug),
2521
- offeringTitle: readString4(packageRecord.offering_slug) || "Offering",
2738
+ offeringTitle: readString4(packageRecord.offering_slug) || buildXmsSurfaceCopy().offeringFallbackLabel,
2522
2739
  offeringPlacement: readString4(packageRecord.offering_placement) || null,
2523
2740
  packageId: readString4(packageRecord.id),
2524
2741
  packageSlug: readString4(packageRecord.slug),
2525
- packageTitle: readString4(packageRecord.slug) || "Package",
2742
+ packageTitle: readString4(packageRecord.slug) || buildXmsSurfaceCopy().packageFallbackLabel,
2526
2743
  packageKind: readString4(packageRecord.package_kind) || "standard",
2527
2744
  productId: readString4(packageRecord.product?.id),
2528
2745
  productSlug: readString4(packageRecord.product?.slug),
2529
2746
  productFamily: readString4(
2530
2747
  packageRecord.product?.product_family
2531
2748
  ),
2749
+ virtualCurrency: readVirtualCurrencyDefinition(
2750
+ packageRecord.product?.virtual_currency
2751
+ ) ?? null,
2532
2752
  productMetadata: packageRecord.product?.metadata && typeof packageRecord.product.metadata === "object" ? packageRecord.product.metadata : {},
2533
2753
  priceId: readString4(price?.id),
2534
2754
  amount: readString4(price?.amount),
@@ -2555,18 +2775,20 @@ function readPackageCredits(item) {
2555
2775
  }
2556
2776
  function buildMonetizationOfferingPresentation(input) {
2557
2777
  const record = input && typeof input === "object" && !Array.isArray(input) ? input : {};
2558
- const offeringLabel = readString4(record.offeringTitle) || formatStateLabel(record.offeringSlug, "Offering");
2778
+ const surfaceCopy = buildXmsSurfaceCopy({ locale: record.locale });
2779
+ const offeringLabel = readString4(record.offeringTitle) || formatStateLabel(record.offeringSlug, surfaceCopy.offeringFallbackLabel);
2559
2780
  const placementRaw = readLower2(record.offeringPlacement);
2560
2781
  const placementLabel = formatPlacementLabel(record.offeringPlacement);
2561
- let summary = "General offering surface for this xapp.";
2782
+ const copy = buildXmsPackageCopy(record.locale);
2783
+ let summary = copy.generalOfferingSummary;
2562
2784
  if (placementRaw.includes("feature") && placementRaw.includes("paywall")) {
2563
- summary = "Feature-paywall placement for gated in-app flows.";
2785
+ summary = copy.featurePaywallOfferingSummary;
2564
2786
  } else if (placementRaw.includes("paywall")) {
2565
- summary = "Default paywall placement for monetized upgrade prompts.";
2787
+ summary = copy.defaultPaywallOfferingSummary;
2566
2788
  } else if (placementRaw.includes("checkout")) {
2567
- summary = "Direct checkout placement for purchase-driven flows.";
2789
+ summary = copy.checkoutOfferingSummary;
2568
2790
  } else if (placementRaw.includes("upgrade")) {
2569
- summary = "Upgrade-oriented placement for membership and package switching.";
2791
+ summary = copy.upgradeOfferingSummary;
2570
2792
  }
2571
2793
  return {
2572
2794
  offeringLabel,
@@ -2576,7 +2798,13 @@ function buildMonetizationOfferingPresentation(input) {
2576
2798
  }
2577
2799
  function buildMonetizationPaywallPresentation(input) {
2578
2800
  const record = input && typeof input === "object" && !Array.isArray(input) ? input : {};
2579
- const paywallLabel = readLocalizedText(record.title, formatStateLabel(record.slug, "Paywall")) || "Paywall";
2801
+ const paywallLabel = readLocalizedText(
2802
+ record.title,
2803
+ formatStateLabel(
2804
+ record.slug,
2805
+ buildXmsSurfaceCopy({ locale: record.locale }).paywallFallbackLabel
2806
+ )
2807
+ ) || buildXmsSurfaceCopy({ locale: record.locale }).paywallFallbackLabel;
2580
2808
  const placementLabel = formatPlacementLabel(record.placement);
2581
2809
  const packages = flattenXappMonetizationPaywallPackages(record);
2582
2810
  const defaultPackageRef = readString4(record.default_package_ref);
@@ -2599,10 +2827,13 @@ function buildMonetizationPaywallRenderModel(input) {
2599
2827
  return {
2600
2828
  packageId: readString4(item.packageId),
2601
2829
  packageSlug: readString4(item.packageSlug),
2602
- packageTitle: readString4(item.packageTitle) || "Package",
2830
+ packageTitle: readString4(item.packageTitle) || buildXmsSurfaceCopy().packageFallbackLabel,
2603
2831
  productId: readString4(item.productId),
2604
2832
  productSlug: readString4(item.productSlug),
2605
2833
  productFamily: readString4(item.productFamily),
2834
+ virtualCurrencyCode: formatVirtualCurrencyLabel(item.virtualCurrency, { preferCode: true }),
2835
+ virtualCurrencyName: formatVirtualCurrencyLabel(item.virtualCurrency),
2836
+ virtualCurrencyLabel: formatVirtualCurrencyLabel(item.virtualCurrency, { includeCode: true }),
2606
2837
  productMetadata: item.productMetadata && typeof item.productMetadata === "object" && !Array.isArray(item.productMetadata) ? item.productMetadata : {},
2607
2838
  metadata: item.metadata && typeof item.metadata === "object" && !Array.isArray(item.metadata) ? item.metadata : {},
2608
2839
  description: readString4(item.description) || packagePresentation.summary,
@@ -2978,9 +3209,98 @@ function readHistoryBucket(history, key) {
2978
3209
  items
2979
3210
  };
2980
3211
  }
3212
+ function formatBalanceQuantity(value) {
3213
+ if (!Number.isFinite(value)) return "";
3214
+ const normalized = Math.round(value * 1e4) / 1e4;
3215
+ if (Number.isInteger(normalized)) return String(normalized);
3216
+ return normalized.toFixed(4).replace(/\.?0+$/, "");
3217
+ }
3218
+ function summarizeVirtualCurrencyBalances(input) {
3219
+ const record = readRecord(input) ?? {};
3220
+ const history = readRecord(record.history) ?? record;
3221
+ const walletAccounts = readHistoryBucket(history, "wallet_accounts").items;
3222
+ const accessSnapshots = readHistoryBucket(history, "access_snapshots").items;
3223
+ const aggregates = /* @__PURE__ */ new Map();
3224
+ const upsertBalance = (inputValue) => {
3225
+ const amount = readNumber(inputValue.amount, Number.NaN);
3226
+ if (!Number.isFinite(amount) || Math.abs(amount) < 1e-7) return;
3227
+ const label = formatVirtualCurrencyLabel(inputValue.virtualCurrency, {
3228
+ includeCode: true
3229
+ }) || readString4(inputValue.fallbackUnit) || readString4(inputValue.fallbackKey) || "Balance";
3230
+ const key = formatVirtualCurrencyLabel(inputValue.virtualCurrency, {
3231
+ preferCode: true
3232
+ }) || readString4(inputValue.fallbackKey) || label.toLowerCase();
3233
+ const existing = aggregates.get(key);
3234
+ if (existing) {
3235
+ existing.amount += amount;
3236
+ existing.accountCount += 1;
3237
+ return;
3238
+ }
3239
+ aggregates.set(key, {
3240
+ label,
3241
+ amount,
3242
+ accountCount: 1,
3243
+ virtualCurrency: inputValue.virtualCurrency ?? null,
3244
+ fallbackUnit: readString4(inputValue.fallbackUnit)
3245
+ });
3246
+ };
3247
+ for (const item of walletAccounts) {
3248
+ upsertBalance({
3249
+ amount: item.balance_remaining,
3250
+ virtualCurrency: item.virtual_currency,
3251
+ fallbackUnit: item.currency,
3252
+ fallbackKey: item.product_slug || item.id
3253
+ });
3254
+ }
3255
+ if (aggregates.size === 0 && accessSnapshots.length > 0) {
3256
+ for (const item of accessSnapshots) {
3257
+ upsertBalance({
3258
+ amount: item.credits_remaining,
3259
+ virtualCurrency: item.virtual_currency,
3260
+ fallbackUnit: "credits",
3261
+ fallbackKey: item.tier || item.id
3262
+ });
3263
+ }
3264
+ }
3265
+ const balances = Array.from(aggregates.entries()).map(([key, item]) => {
3266
+ const amount = formatBalanceQuantity(item.amount);
3267
+ return {
3268
+ key,
3269
+ label: item.label,
3270
+ amount,
3271
+ amountLabel: formatVirtualCurrencyAmountLabel({
3272
+ amount,
3273
+ virtualCurrency: item.virtualCurrency,
3274
+ fallbackUnit: item.fallbackUnit
3275
+ }) || amount,
3276
+ accountCount: item.accountCount
3277
+ };
3278
+ }).sort((left, right) => {
3279
+ const amountDiff = readNumber(right.amount) - readNumber(left.amount);
3280
+ if (Math.abs(amountDiff) > 1e-7) return amountDiff > 0 ? 1 : -1;
3281
+ return left.label.localeCompare(right.label);
3282
+ });
3283
+ return {
3284
+ balances,
3285
+ totalAccounts: walletAccounts.length,
3286
+ totalCurrencies: balances.length
3287
+ };
3288
+ }
2981
3289
  function readHistoryTitle(item, keys, fallback) {
2982
3290
  for (const key of keys) {
2983
- const value = readString4(item[key]);
3291
+ const segments = key.split(".");
3292
+ let current = item;
3293
+ for (const segment of segments) {
3294
+ const record = readRecord(current);
3295
+ current = record ? record[segment] : void 0;
3296
+ }
3297
+ if (key.startsWith("virtual_currency.")) {
3298
+ const value2 = formatVirtualCurrencyLabel(item.virtual_currency ?? current, {
3299
+ includeCode: true
3300
+ });
3301
+ if (value2) return value2;
3302
+ }
3303
+ const value = readString4(current);
2984
3304
  if (value) return value;
2985
3305
  }
2986
3306
  return fallback;
@@ -2988,7 +3308,25 @@ function readHistoryTitle(item, keys, fallback) {
2988
3308
  function readHistoryMeta(item, keys, locale) {
2989
3309
  const out = [];
2990
3310
  for (const key of keys) {
2991
- const value = key === "settlement_effect_detail" ? formatSettlementEffectDetailLabel(item.settlement_effect, item[key], locale) : key.endsWith("_at") ? formatPlansDateTime(item[key], locale) : readString4(item[key]);
3311
+ const segments = key.split(".");
3312
+ let current = item;
3313
+ for (const segment of segments) {
3314
+ const record = readRecord(current);
3315
+ current = record ? record[segment] : void 0;
3316
+ }
3317
+ const value = key === "settlement_effect_detail" ? formatSettlementEffectDetailLabel(item.settlement_effect, current, locale) : key === "balance_remaining" ? formatVirtualCurrencyAmountLabel({
3318
+ amount: current,
3319
+ virtualCurrency: item.virtual_currency,
3320
+ fallbackUnit: readString4(item.currency)
3321
+ }) : key === "amount" ? formatVirtualCurrencyAmountLabel({
3322
+ amount: current,
3323
+ virtualCurrency: item.virtual_currency,
3324
+ fallbackUnit: readString4(item.currency)
3325
+ }) : key === "credits_remaining" ? formatVirtualCurrencyAmountLabel({
3326
+ amount: current,
3327
+ virtualCurrency: item.virtual_currency,
3328
+ fallbackUnit: "credits"
3329
+ }) : key.endsWith("_at") ? formatPlansDateTime(current, locale) : readString4(current);
2992
3330
  if (value) out.push(formatStateLabel(value, value));
2993
3331
  }
2994
3332
  return out;
@@ -3040,9 +3378,17 @@ function formatSettlementEffectDetailLabel(effect, detail, locale) {
3040
3378
  }
3041
3379
  function buildTimelineHtml(input) {
3042
3380
  if (!input.total) return "";
3381
+ const items = [...input.items].sort((left, right) => {
3382
+ const leftAt = Date.parse(readString4(left.occurred_at));
3383
+ const rightAt = Date.parse(readString4(right.occurred_at));
3384
+ if (Number.isFinite(leftAt) && Number.isFinite(rightAt) && leftAt !== rightAt) {
3385
+ return rightAt - leftAt;
3386
+ }
3387
+ return readString4(right.id).localeCompare(readString4(left.id));
3388
+ });
3043
3389
  return `
3044
3390
  <div class="xapps-xms-plans__timeline">
3045
- ${input.items.map((item) => {
3391
+ ${items.map((item) => {
3046
3392
  const title = readString4(item.title) || readString4(item.id) || formatTimelineBucketLabel(item.bucket, input.locale);
3047
3393
  const when = formatPlansDateTime(item.occurred_at, input.locale);
3048
3394
  const meta = [
@@ -3056,7 +3402,11 @@ function buildTimelineHtml(input) {
3056
3402
  ),
3057
3403
  readString4(item.scope),
3058
3404
  readString4(item.correlation),
3059
- readString4(item.amount) && readString4(item.currency) ? `${readString4(item.amount)} ${readString4(item.currency)}` : readString4(item.amount),
3405
+ formatVirtualCurrencyAmountLabel({
3406
+ amount: item.amount,
3407
+ virtualCurrency: item.virtual_currency,
3408
+ fallbackUnit: readString4(item.currency)
3409
+ }),
3060
3410
  readString4(item.note)
3061
3411
  ].filter(Boolean);
3062
3412
  return `
@@ -3108,32 +3458,6 @@ function buildMonetizationHistorySections(input) {
3108
3458
  const { history, locale } = input;
3109
3459
  const copy = buildXmsSurfaceCopy({ locale });
3110
3460
  return [
3111
- buildHistorySectionHtml({
3112
- title: copy.historyPurchaseIntentsTitle,
3113
- total: readHistoryBucket(history, "purchase_intents").total,
3114
- items: readHistoryBucket(history, "purchase_intents").items,
3115
- locale,
3116
- itemTitleKeys: ["package_slug", "product_slug", "id"],
3117
- itemFallbackTitle: copy.historyPurchaseIntentLabel,
3118
- itemStatusKeys: ["status"],
3119
- itemMetaKeys: ["amount", "currency", "payment_lane", "updated_at"]
3120
- }),
3121
- buildHistorySectionHtml({
3122
- title: copy.historyTransactionsTitle,
3123
- total: readHistoryBucket(history, "transactions").total,
3124
- items: readHistoryBucket(history, "transactions").items,
3125
- locale,
3126
- itemTitleKeys: ["package_slug", "product_slug", "id"],
3127
- itemFallbackTitle: copy.historyTransactionLabel,
3128
- itemStatusKeys: ["status"],
3129
- itemMetaKeys: [
3130
- "amount",
3131
- "currency",
3132
- "settlement_effect",
3133
- "payment_session_id",
3134
- "occurred_at"
3135
- ]
3136
- }),
3137
3461
  buildHistorySectionHtml({
3138
3462
  title: copy.historySubscriptionsTitle,
3139
3463
  total: readHistoryBucket(history, "subscriptions").total,
@@ -3159,30 +3483,46 @@ function buildMonetizationHistorySections(input) {
3159
3483
  total: readHistoryBucket(history, "wallet_accounts").total,
3160
3484
  items: readHistoryBucket(history, "wallet_accounts").items,
3161
3485
  locale,
3162
- itemTitleKeys: ["product_slug", "id"],
3486
+ itemTitleKeys: ["virtual_currency.code", "product_slug", "id"],
3163
3487
  itemFallbackTitle: copy.historyWalletAccountLabel,
3164
3488
  itemStatusKeys: ["status"],
3165
- itemMetaKeys: ["currency", "balance_remaining", "updated_at"]
3489
+ itemMetaKeys: ["balance_remaining", "updated_at"]
3166
3490
  }),
3167
3491
  buildHistorySectionHtml({
3168
3492
  title: copy.historyWalletLedgerTitle,
3169
3493
  total: readHistoryBucket(history, "wallet_ledger").total,
3170
3494
  items: readHistoryBucket(history, "wallet_ledger").items,
3171
3495
  locale,
3172
- itemTitleKeys: ["event_kind", "wallet_product_slug", "id"],
3496
+ itemTitleKeys: ["event_kind", "virtual_currency.code", "wallet_product_slug", "id"],
3173
3497
  itemFallbackTitle: copy.historyWalletLedgerEntryLabel,
3174
3498
  itemStatusKeys: [],
3175
- itemMetaKeys: ["amount", "currency", "settlement_effect", "source_kind", "occurred_at"]
3499
+ itemMetaKeys: ["amount", "settlement_effect", "source_kind", "occurred_at"]
3176
3500
  }),
3177
3501
  buildHistorySectionHtml({
3178
- title: copy.historyAccessSnapshotsTitle,
3179
- total: readHistoryBucket(history, "access_snapshots").total,
3180
- items: readHistoryBucket(history, "access_snapshots").items,
3502
+ title: copy.historyTransactionsTitle,
3503
+ total: readHistoryBucket(history, "transactions").total,
3504
+ items: readHistoryBucket(history, "transactions").items,
3181
3505
  locale,
3182
- itemTitleKeys: ["tier", "id"],
3183
- itemFallbackTitle: copy.historyAccessSnapshotLabel,
3184
- itemStatusKeys: ["entitlement_state"],
3185
- itemMetaKeys: ["balance_state", "credits_remaining", "updated_at"]
3506
+ itemTitleKeys: ["package_slug", "product_slug", "id"],
3507
+ itemFallbackTitle: copy.historyTransactionLabel,
3508
+ itemStatusKeys: ["status"],
3509
+ itemMetaKeys: [
3510
+ "amount",
3511
+ "currency",
3512
+ "settlement_effect",
3513
+ "payment_session_id",
3514
+ "occurred_at"
3515
+ ]
3516
+ }),
3517
+ buildHistorySectionHtml({
3518
+ title: copy.historyPurchaseIntentsTitle,
3519
+ total: readHistoryBucket(history, "purchase_intents").total,
3520
+ items: readHistoryBucket(history, "purchase_intents").items,
3521
+ locale,
3522
+ itemTitleKeys: ["package_slug", "product_slug", "id"],
3523
+ itemFallbackTitle: copy.historyPurchaseIntentLabel,
3524
+ itemStatusKeys: ["status"],
3525
+ itemMetaKeys: ["amount", "currency", "payment_lane", "updated_at"]
3186
3526
  }),
3187
3527
  buildHistorySectionHtml({
3188
3528
  title: copy.historyInvoicesTitle,
@@ -3199,9 +3539,36 @@ function buildMonetizationHistorySections(input) {
3199
3539
  "owner_scope",
3200
3540
  "created_at"
3201
3541
  ]
3542
+ }),
3543
+ buildHistorySectionHtml({
3544
+ title: copy.historyAccessSnapshotsTitle,
3545
+ total: readHistoryBucket(history, "access_snapshots").total,
3546
+ items: readHistoryBucket(history, "access_snapshots").items,
3547
+ locale,
3548
+ itemTitleKeys: ["tier", "id"],
3549
+ itemFallbackTitle: copy.historyAccessSnapshotLabel,
3550
+ itemStatusKeys: ["entitlement_state"],
3551
+ itemMetaKeys: ["balance_state", "credits_remaining", "updated_at"]
3202
3552
  })
3203
3553
  ].filter(Boolean);
3204
3554
  }
3555
+ function buildMonetizationHistoryBalanceSummaryHtml(input) {
3556
+ const { history, locale } = input;
3557
+ const copy = buildXmsSurfaceCopy({ locale });
3558
+ const summary = summarizeVirtualCurrencyBalances(history);
3559
+ if (!summary.balances.length) return "";
3560
+ return `
3561
+ <section class="xapps-xms-plans__card">
3562
+ <h4 class="xapps-xms-plans__section-title">${escapeHtml(copy.historyBalanceSummaryTitle)}</h4>
3563
+ <div class="xapps-xms-plans__subtitle">${escapeHtml(copy.historyBalanceSummarySubtitle)}</div>
3564
+ <div class="xapps-xms-plans__badges">
3565
+ ${summary.balances.map(
3566
+ (item) => `<span class="xapps-xms-plans__badge">${escapeHtml(item.amountLabel)}</span>`
3567
+ ).join("")}
3568
+ </div>
3569
+ </section>
3570
+ `;
3571
+ }
3205
3572
  function buildMonetizationHistorySurfaceHtml(input, options = {}) {
3206
3573
  const record = readRecord(input) ?? {};
3207
3574
  const history = readRecord(record.history) ?? record;
@@ -3210,8 +3577,9 @@ function buildMonetizationHistorySurfaceHtml(input, options = {}) {
3210
3577
  const showHeader = options.showHeader !== false;
3211
3578
  const surfaceCopy = buildXmsSurfaceCopy({ locale });
3212
3579
  const historySections = buildMonetizationHistorySections({ history, locale });
3580
+ const balanceSummaryHtml = buildMonetizationHistoryBalanceSummaryHtml({ history, locale });
3213
3581
  const timeline = readHistoryBucket(history, "timeline");
3214
- const hasHistory = timeline.total || historySections.length;
3582
+ const hasHistory = Boolean(timeline.total || historySections.length || balanceSummaryHtml);
3215
3583
  return `
3216
3584
  ${includeStyles ? `<style>${monetizationPlansSurfaceStyles}</style>` : ""}
3217
3585
  <section class="xapps-xms-plans">
@@ -3225,6 +3593,7 @@ function buildMonetizationHistorySurfaceHtml(input, options = {}) {
3225
3593
  </div>` : ""}
3226
3594
  ${readString4(options.notice) ? `<div class="xapps-xms-plans__notice">${escapeHtml(readString4(options.notice))}</div>` : ""}
3227
3595
  ${readString4(options.error) ? `<div class="xapps-xms-plans__error">${escapeHtml(readString4(options.error))}</div>` : ""}
3596
+ ${balanceSummaryHtml}
3228
3597
  ${timeline.total ? `<section class="xapps-xms-plans__card">
3229
3598
  <h4 class="xapps-xms-plans__section-title">${escapeHtml(surfaceCopy.recentTimelineTitle)}</h4>
3230
3599
  <div class="xapps-xms-plans__subtitle">${escapeHtml(surfaceCopy.recentTimelineSubtitle)}</div>
@@ -3247,43 +3616,64 @@ function buildMonetizationHistorySurfaceHtml(input, options = {}) {
3247
3616
  }
3248
3617
  function buildMonetizationPackagePresentation(input) {
3249
3618
  const item = input && typeof input === "object" && !Array.isArray(input) ? input : {};
3619
+ const copy = buildXmsPackageCopy(item.locale);
3250
3620
  const packageKind = readString4(item.packageKind);
3251
3621
  const packageSlug = readLower2(item.packageSlug);
3252
3622
  const metadata = item.metadata && typeof item.metadata === "object" && !Array.isArray(item.metadata) ? item.metadata : {};
3253
3623
  const credits = readPackageCredits(item);
3624
+ const virtualCurrency = readVirtualCurrencyDefinition(item.virtualCurrency) ?? readVirtualCurrencyDefinition(
3625
+ item.productMetadata && typeof item.productMetadata === "object" ? item.productMetadata.virtual_currency : null
3626
+ );
3254
3627
  const moneyLabel = normalizeMoneyLabel(item);
3255
3628
  const offeringPresentation = buildMonetizationOfferingPresentation(item);
3256
- let fitLabel = "General upgrade";
3257
- let summary = "Useful as a general monetization upgrade for this creator scope.";
3629
+ let fitLabel = copy.generalUpgradeFitLabel;
3630
+ let summary = copy.generalUpgradeSummary;
3258
3631
  if (packageKind === "one_time_unlock") {
3259
- fitLabel = "Durable unlock";
3260
- summary = "Best when the feature mainly needs current access without ongoing membership.";
3632
+ fitLabel = copy.durableUnlockFitLabel;
3633
+ summary = copy.durableUnlockSummary;
3261
3634
  } else if (packageKind === "subscription") {
3262
- fitLabel = "Recurring membership";
3263
- summary = "Best when the feature depends on ongoing membership coverage.";
3635
+ fitLabel = copy.recurringMembershipFitLabel;
3636
+ summary = copy.recurringMembershipSummary;
3264
3637
  } else if (packageKind === "credit_pack") {
3265
- fitLabel = "Credit top-up";
3266
- summary = "Best when the feature spends credits for each advanced action.";
3638
+ const unitLabel = normalizeVirtualCurrencyDisplayLabel(
3639
+ formatVirtualCurrencyLabel(virtualCurrency, { includeCode: true })
3640
+ );
3641
+ fitLabel = copy.creditTopUpFitLabel;
3642
+ summary = copy.creditPackFitSummary(unitLabel || "credits");
3267
3643
  } else if (packageSlug.includes("hybrid")) {
3268
- fitLabel = "Hybrid upgrade";
3269
- summary = "Blends access coverage with bundled credits for mixed workflows.";
3644
+ const unitLabel = normalizeVirtualCurrencyDisplayLabel(
3645
+ formatVirtualCurrencyLabel(virtualCurrency, { includeCode: true })
3646
+ );
3647
+ fitLabel = copy.hybridUpgradeFitLabel;
3648
+ summary = copy.hybridPackFitSummary(unitLabel || "credits");
3270
3649
  }
3271
3650
  const signals = [];
3272
3651
  if (readString4(metadata.badge)) {
3273
3652
  signals.push(readString4(metadata.badge));
3274
3653
  }
3275
- if (credits > 0) {
3654
+ if (credits > 0 && virtualCurrency) {
3655
+ signals.push(
3656
+ formatVirtualCurrencyAmountLabel({
3657
+ amount: String(credits),
3658
+ virtualCurrency,
3659
+ fallbackUnit: "credits"
3660
+ })
3661
+ );
3662
+ } else if (credits > 0) {
3276
3663
  signals.push(`${credits} credits`);
3664
+ } else if (virtualCurrency) {
3665
+ signals.push(
3666
+ copy.packageCurrencySignalLabel(
3667
+ formatVirtualCurrencyLabel(virtualCurrency, { includeCode: true })
3668
+ )
3669
+ );
3277
3670
  }
3278
3671
  if (readString4(item.billingPeriod)) {
3279
- signals.push(`billed ${readString4(item.billingPeriod)}`);
3672
+ signals.push(copy.billedSignalLabel(readString4(item.billingPeriod)));
3280
3673
  }
3281
3674
  if (offeringPresentation.offeringLabel) {
3282
3675
  signals.push(offeringPresentation.offeringLabel);
3283
3676
  }
3284
- if (offeringPresentation.placementLabel && offeringPresentation.placementLabel !== "General placement") {
3285
- signals.push(offeringPresentation.placementLabel);
3286
- }
3287
3677
  return {
3288
3678
  fitLabel,
3289
3679
  summary,
@@ -3448,7 +3838,9 @@ function normalizeMoneyLabel(item) {
3448
3838
  const amount = readString4(item.amount);
3449
3839
  const currency = readString4(item.currency);
3450
3840
  const billingPeriod = readString4(item.billingPeriod);
3451
- if (!amount && !currency) return "Price unavailable";
3841
+ if (!amount && !currency) {
3842
+ return buildXmsSurfaceCopy({ locale: item.locale }).priceUnavailableLabel;
3843
+ }
3452
3844
  return `${amount} ${currency}${billingPeriod ? ` / ${billingPeriod}` : ""}`.trim();
3453
3845
  }
3454
3846
  function summarizeXappMonetizationSnapshot(input) {
@@ -3468,7 +3860,7 @@ function summarizeXappMonetizationSnapshot(input) {
3468
3860
  present: lifecycle.present,
3469
3861
  statusLabel: lifecycle.statusLabel || formatStateLabel(currentSubscription?.status),
3470
3862
  tierLabel: formatStateLabel(currentSubscription?.tier),
3471
- coverageLabel: lifecycle.coverageLabel || "Unknown",
3863
+ coverageLabel: lifecycle.coverageLabel || buildXmsSurfaceCopy().unknownLabel,
3472
3864
  coverageReasonLabel: lifecycle.reasonLabel || buildXmsSurfaceCopy().noOverdueRestrictionLabel,
3473
3865
  renewsAt: lifecycle.renewsAt,
3474
3866
  expiresAt: lifecycle.expiresAt || lifecycle.currentPeriodEndsAt,
@@ -3476,8 +3868,11 @@ function summarizeXappMonetizationSnapshot(input) {
3476
3868
  },
3477
3869
  wallet: {
3478
3870
  creditsRemaining: readString4(accessProjection?.credits_remaining) || "0",
3871
+ virtualCurrencyLabel: formatVirtualCurrencyLabel(accessProjection?.virtual_currency, {
3872
+ includeCode: true
3873
+ }),
3479
3874
  balanceStateLabel: formatStateLabel(accessProjection?.balance_state, "unknown"),
3480
- currentAccessLabel: hasEffectiveCoverage({ accessProjection, currentSubscription }) ? "Yes" : "No"
3875
+ currentAccessLabel: hasEffectiveCoverage({ accessProjection, currentSubscription }) ? buildXmsSurfaceCopy().yesLabel : buildXmsSurfaceCopy().noLabel
3481
3876
  }
3482
3877
  };
3483
3878
  }
@@ -3486,6 +3881,19 @@ function summarizeXappMonetizationSnapshot(input) {
3486
3881
  import { useCallback, useEffect as useEffect5, useMemo as useMemo4, useRef, useState as useState3 } from "react";
3487
3882
  import { Link as Link5, useLocation as useLocation3 } from "react-router-dom";
3488
3883
  import { Fragment as Fragment4, jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
3884
+ function formatVirtualCurrencyLabel2(input, options) {
3885
+ const record = asRecord(input);
3886
+ const code = readString(record.code);
3887
+ const name = readString(record.name);
3888
+ if (name && code && options?.includeCode) return `${name} (${code})`;
3889
+ return name || code || "";
3890
+ }
3891
+ function formatVirtualCurrencyAmount(value, virtualCurrency) {
3892
+ const amount = readString(value);
3893
+ if (!amount) return "";
3894
+ const currencyLabel = formatVirtualCurrencyLabel2(virtualCurrency);
3895
+ return currencyLabel ? `${amount} ${currencyLabel}` : amount;
3896
+ }
3489
3897
  function useQueryToken3() {
3490
3898
  const loc = useLocation3();
3491
3899
  const qs = new URLSearchParams(loc.search);
@@ -3539,13 +3947,22 @@ function MonetizationPage() {
3539
3947
  const [xappTitle, setXappTitle] = useState3("");
3540
3948
  const visibilityRefreshRef = useRef(0);
3541
3949
  const isEmbedded = typeof window !== "undefined" && window.location.pathname.startsWith("/embed");
3950
+ const overview = useMemo4(
3951
+ () => ({
3952
+ apps: items.length,
3953
+ subscriptions: items.filter((item) => item.hasSubscription).length,
3954
+ namedCurrencies: items.filter((item) => item.hasNamedCurrency).length,
3955
+ balances: items.filter((item) => item.hasBalance).length
3956
+ }),
3957
+ [items]
3958
+ );
3542
3959
  const refresh = useCallback(async () => {
3543
3960
  if (!client.getMyXappMonetization) {
3544
3961
  setError(
3545
3962
  t(
3546
3963
  "activity.unavailable_monetization_title",
3547
3964
  void 0,
3548
- "Monetization is unavailable in this host."
3965
+ "Plans and balances are unavailable in this host."
3549
3966
  )
3550
3967
  );
3551
3968
  setItems([]);
@@ -3593,21 +4010,41 @@ function MonetizationPage() {
3593
4010
  try {
3594
4011
  const next = await Promise.all(
3595
4012
  deduped.map(async (item) => {
3596
- const detail = await client.getCatalogXapp(item.xappId, {
3597
- installationId: item.installationId || null
3598
- });
4013
+ const [detail, state, history] = await Promise.all([
4014
+ client.getCatalogXapp(item.xappId, {
4015
+ installationId: item.installationId || null
4016
+ }),
4017
+ client.getMyXappMonetization(item.xappId, {
4018
+ installationId: item.installationId || null,
4019
+ locale
4020
+ }),
4021
+ typeof client.getMyXappMonetizationHistory === "function" ? client.getMyXappMonetizationHistory(item.xappId, {
4022
+ installationId: item.installationId || null,
4023
+ limit: 20
4024
+ }) : Promise.resolve(null)
4025
+ ]);
3599
4026
  if (!xappIdFilter && !isMonetizationCandidate(detail)) return null;
3600
- const state = await client.getMyXappMonetization(item.xappId, {
3601
- installationId: item.installationId || null,
3602
- locale
3603
- });
3604
4027
  const summary = summarizeXappMonetizationSnapshot(state);
4028
+ const balanceSummary = summarizeVirtualCurrencyBalances(history).balances.map(
4029
+ (entry) => entry.amountLabel
4030
+ );
3605
4031
  const detailRecord = asRecord(detail);
4032
+ const accessProjection = asRecord(asRecord(state).access_projection);
4033
+ const virtualCurrencyLabel = formatVirtualCurrencyLabel2(
4034
+ accessProjection.virtual_currency,
4035
+ {
4036
+ includeCode: true
4037
+ }
4038
+ );
4039
+ const creditsRemainingLabel = formatVirtualCurrencyAmount(
4040
+ accessProjection.credits_remaining,
4041
+ accessProjection.virtual_currency
4042
+ ) || summary.wallet.creditsRemaining || "0";
3606
4043
  const title = resolveMarketplaceText(asRecord(detailRecord.manifest).title, locale) || readFirstString(asRecord(detailRecord.xapp).name) || item.xappId;
3607
4044
  const subtitle = resolveMarketplaceText(asRecord(detailRecord.manifest).summary, locale) || resolveMarketplaceText(asRecord(detailRecord.manifest).description, locale) || t(
3608
4045
  "activity.monetization_card_subtitle",
3609
4046
  void 0,
3610
- "Current XMS state, active access, subscriptions, and credits for this app."
4047
+ "Access, plans, and balances for this app."
3611
4048
  );
3612
4049
  return {
3613
4050
  xappId: item.xappId,
@@ -3643,8 +4080,13 @@ function MonetizationPage() {
3643
4080
  "No recurring coverage"
3644
4081
  ),
3645
4082
  renewsAt: summary.currentSubscription.renewsAt || t("activity.monetization_not_scheduled", void 0, "Not scheduled"),
3646
- creditsRemaining: summary.wallet.creditsRemaining || "0",
3647
- balanceState: summary.wallet.balanceStateLabel || t("activity.monetization_balance_unknown", void 0, "unknown")
4083
+ virtualCurrencyLabel,
4084
+ creditsRemaining: creditsRemainingLabel,
4085
+ balanceState: summary.wallet.balanceStateLabel || t("activity.monetization_balance_unknown", void 0, "unknown"),
4086
+ balanceSummary,
4087
+ hasSubscription: summary.currentSubscription.present,
4088
+ hasNamedCurrency: Boolean(virtualCurrencyLabel),
4089
+ hasBalance: Boolean(balanceSummary.length || creditsRemainingLabel)
3648
4090
  };
3649
4091
  })
3650
4092
  );
@@ -3742,7 +4184,7 @@ function MonetizationPage() {
3742
4184
  return suffix ? `?${suffix}` : "";
3743
4185
  })()
3744
4186
  } : null;
3745
- return /* @__PURE__ */ jsxs5("div", { className: `mx-catalog-container ${isEmbedded ? "is-embedded" : ""}`, children: [
4187
+ return /* @__PURE__ */ jsxs5("div", { className: `mx-catalog-container mx-monetization-page ${isEmbedded ? "is-embedded" : ""}`, children: [
3746
4188
  /* @__PURE__ */ jsxs5("div", { className: "mx-breadcrumb", children: [
3747
4189
  /* @__PURE__ */ jsx9(Link5, { to: isEmbedded ? "/" : "/marketplace", children: t("common.marketplace", void 0, "Marketplace") }),
3748
4190
  xappLink && /* @__PURE__ */ jsxs5(Fragment4, { children: [
@@ -3811,40 +4253,100 @@ function MonetizationPage() {
3811
4253
  "."
3812
4254
  ] })
3813
4255
  ] }) : error ? /* @__PURE__ */ jsx9("div", { className: "mx-table-container mx-alert mx-alert-error", children: error }) : null,
3814
- xappIdFilter ? /* @__PURE__ */ jsxs5("div", { className: "mx-subtle-note", children: [
3815
- t("activity.showing_monetization_for_prefix", void 0, "Showing XMS state for"),
4256
+ xappIdFilter ? /* @__PURE__ */ jsx9("div", { className: "mx-table-container mx-subtle-note-card", children: /* @__PURE__ */ jsxs5("div", { className: "mx-subtle-note mx-subtle-note-compact", children: [
4257
+ t(
4258
+ "activity.showing_monetization_for_prefix",
4259
+ void 0,
4260
+ "Showing plans and balances for"
4261
+ ),
3816
4262
  " ",
3817
4263
  /* @__PURE__ */ jsx9("span", { className: "mx-subtle-note-strong", children: xappIdFilter })
3818
- ] }) : /* @__PURE__ */ jsx9("div", { className: "mx-subtle-note", children: showPast ? t(
4264
+ ] }) }) : /* @__PURE__ */ jsx9("div", { className: "mx-table-container mx-subtle-note-card", children: /* @__PURE__ */ jsx9("div", { className: "mx-subtle-note mx-subtle-note-compact", children: showPast ? t(
3819
4265
  "activity.monetization_overview_hint_with_past",
3820
4266
  void 0,
3821
- "Review current and past XMS access, subscriptions, and credits across this subject's apps."
4267
+ "Review current and past plans, subscriptions, and balances across this subject's apps."
3822
4268
  ) : t(
3823
4269
  "activity.monetization_overview_hint",
3824
4270
  void 0,
3825
- "Review current XMS access, subscriptions, and credits across the apps linked to this subject."
3826
- ) }),
3827
- busy ? /* @__PURE__ */ jsx9("div", { className: "mx-table-container", children: t("activity.loading_monetization", void 0, "Loading monetization state...") }) : null,
3828
- !busy && !error && items.length === 0 ? /* @__PURE__ */ jsx9("div", { className: "mx-table-container", children: showPast ? t(
3829
- "activity.no_monetization_history",
3830
- void 0,
3831
- "No monetization history was found for this subject."
3832
- ) : t(
3833
- "activity.no_monetization_current",
4271
+ "Review current plans, subscriptions, and balances across this subject's apps."
4272
+ ) }) }),
4273
+ /* @__PURE__ */ jsx9("section", { className: "mx-table-container mx-monetization-summary-card", children: /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-body", children: [
4274
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-head", children: /* @__PURE__ */ jsxs5("div", { children: [
4275
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-kicker", children: t("activity.monetization_title", void 0, "Monetization") }),
4276
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-id", children: t("activity.monetization_summary_title", void 0, "Plans and balances") }),
4277
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-subtitle", children: t(
4278
+ "activity.monetization_summary_subtitle",
4279
+ void 0,
4280
+ "Review active plans, subscriptions, and balances before opening app details or history."
4281
+ ) })
4282
+ ] }) }),
4283
+ /* @__PURE__ */ jsxs5("div", { className: "mx-record-grid", children: [
4284
+ /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
4285
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_summary_apps", void 0, "Apps") }),
4286
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: overview.apps })
4287
+ ] }),
4288
+ /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
4289
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_summary_subscriptions", void 0, "Subscriptions") }),
4290
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: overview.subscriptions })
4291
+ ] }),
4292
+ /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
4293
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_summary_balances", void 0, "Balances") }),
4294
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: overview.balances })
4295
+ ] }),
4296
+ /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
4297
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_summary_currencies", void 0, "Named currencies") }),
4298
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: overview.namedCurrencies })
4299
+ ] })
4300
+ ] })
4301
+ ] }) }),
4302
+ busy ? /* @__PURE__ */ jsx9("div", { className: "mx-table-container", children: /* @__PURE__ */ jsx9("div", { className: "mx-loading-center mx-loading-table", children: t(
4303
+ "activity.loading_monetization",
3834
4304
  void 0,
3835
- "No current monetization coverage was found for this subject."
3836
- ) }) : null,
3837
- !busy && items.length > 0 ? /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-stack", children: items.map((item) => /* @__PURE__ */ jsxs5("section", { className: "mx-record-panel mx-record-panel-monetization", children: [
4305
+ "Loading plans, balances, and recent activity..."
4306
+ ) }) }) : null,
4307
+ !busy && !error && items.length === 0 ? /* @__PURE__ */ jsx9("div", { className: "mx-table-container", children: /* @__PURE__ */ jsxs5("div", { className: "mx-empty-catalog", children: [
4308
+ /* @__PURE__ */ jsx9("div", { className: "mx-empty-catalog-icon", children: "\u25CE" }),
4309
+ /* @__PURE__ */ jsx9("div", { className: "mx-empty-catalog-title", children: showPast ? t(
4310
+ "activity.no_monetization_history",
4311
+ void 0,
4312
+ "No plan or balance history was found for this subject."
4313
+ ) : t(
4314
+ "activity.no_monetization_current",
4315
+ void 0,
4316
+ "No current plans or balances were found for this subject."
4317
+ ) }),
4318
+ /* @__PURE__ */ jsx9("div", { className: "mx-empty-catalog-desc", children: showPast ? t(
4319
+ "activity.monetization_overview_hint_with_past",
4320
+ void 0,
4321
+ "Review current and past plans, subscriptions, and balances across this subject's apps."
4322
+ ) : t(
4323
+ "activity.monetization_overview_hint",
4324
+ void 0,
4325
+ "Review current plans, subscriptions, and balances across this subject's apps."
4326
+ ) })
4327
+ ] }) }) : null,
4328
+ !busy && items.length > 0 ? /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-stack", children: items.map((item) => /* @__PURE__ */ jsx9("section", { className: "mx-table-container mx-monetization-activity-card", children: /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-body", children: [
3838
4329
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-panel-head", children: [
3839
4330
  /* @__PURE__ */ jsxs5("div", { children: [
3840
4331
  /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-kicker", children: t("activity.monetization", void 0, "Monetization") }),
3841
4332
  /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-id", children: item.title }),
3842
- /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-subtitle", children: item.subtitle })
4333
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-panel-subtitle", children: item.subtitle }),
4334
+ /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-badges", children: [
4335
+ /* @__PURE__ */ jsx9("span", { className: "mx-badge mx-badge-warning", children: item.accessLabel }),
4336
+ /* @__PURE__ */ jsx9(
4337
+ "span",
4338
+ {
4339
+ className: `mx-badge ${item.hasSubscription ? "mx-badge-success" : "mx-badge-warning"}`,
4340
+ children: item.subscriptionStatus
4341
+ }
4342
+ ),
4343
+ /* @__PURE__ */ jsx9("span", { className: "mx-tag", children: item.virtualCurrencyLabel || t("activity.monetization_no_currency", void 0, "No named currency") })
4344
+ ] })
3843
4345
  ] }),
3844
4346
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-actions mx-record-actions-monetization", children: [
3845
4347
  /* @__PURE__ */ jsxs5("div", { className: "mx-action-group", children: [
3846
- /* @__PURE__ */ jsx9(Link5, { to: item.plansHref, className: "mx-btn mx-btn-primary", children: t("activity.monetization_open_plans", void 0, "Open plans") }),
3847
- /* @__PURE__ */ jsx9(Link5, { to: item.historyHref, className: "mx-btn mx-btn-secondary", children: t("activity.monetization_open_history", void 0, "Open history") })
4348
+ /* @__PURE__ */ jsx9(Link5, { to: item.plansHref, className: "mx-btn mx-btn-primary", children: t("activity.monetization_open_plans", void 0, "View plans") }),
4349
+ /* @__PURE__ */ jsx9(Link5, { to: item.historyHref, className: "mx-btn mx-btn-secondary", children: t("activity.monetization_open_history", void 0, "View history") })
3848
4350
  ] }),
3849
4351
  /* @__PURE__ */ jsxs5("div", { className: "mx-action-group", children: [
3850
4352
  /* @__PURE__ */ jsx9(Link5, { to: item.detailHref, className: "mx-btn mx-btn-ghost", children: t("common.view_app_details", void 0, "View app details") }),
@@ -3864,47 +4366,57 @@ function MonetizationPage() {
3864
4366
  })()
3865
4367
  },
3866
4368
  className: "mx-btn mx-btn-ghost",
3867
- children: t("activity.monetization_focus_xapp", void 0, "Focus this app")
4369
+ children: t("activity.monetization_focus_xapp", void 0, "Only this app")
3868
4370
  }
3869
4371
  ) : null
3870
4372
  ] })
3871
4373
  ] })
3872
4374
  ] }),
3873
- /* @__PURE__ */ jsxs5("div", { className: "mx-record-grid", children: [
4375
+ /* @__PURE__ */ jsxs5("div", { className: "mx-record-grid mx-monetization-card-primary-grid", children: [
3874
4376
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3875
- /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_access_label", void 0, "Current access") }),
4377
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_access_label", void 0, "Access") }),
3876
4378
  /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: item.accessLabel })
3877
4379
  ] }),
3878
4380
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3879
- /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_plan_label", void 0, "Current plan") }),
4381
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_plan_label", void 0, "Plan") }),
3880
4382
  /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: item.tierLabel })
3881
4383
  ] }),
3882
- /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3883
- /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_credits_label", void 0, "Credits remaining") }),
3884
- /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: item.creditsRemaining })
3885
- ] }),
3886
4384
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3887
4385
  /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_subscription_label", void 0, "Subscription") }),
3888
4386
  /* @__PURE__ */ jsx9("div", { className: "mx-record-value", children: item.subscriptionStatus })
3889
4387
  ] }),
3890
4388
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3891
- /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_coverage_label", void 0, "Coverage") }),
3892
- /* @__PURE__ */ jsx9("div", { className: "mx-record-value", children: item.subscriptionCoverage })
4389
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_credits_label", void 0, "Balance") }),
4390
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-value is-strong", children: item.creditsRemaining })
3893
4391
  ] }),
3894
4392
  /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3895
4393
  /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_renews_at", void 0, "Renews at") }),
3896
4394
  /* @__PURE__ */ jsx9("div", { className: "mx-record-value", children: item.renewsAt })
4395
+ ] })
4396
+ ] }),
4397
+ /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-secondary", children: [
4398
+ /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-secondary-row", children: [
4399
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-label", children: t("xapp.virtual_currency_label", void 0, "Currency") }),
4400
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-value", children: item.virtualCurrencyLabel || "\u2014" })
3897
4401
  ] }),
3898
- /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3899
- /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_balance_state", void 0, "Balance state") }),
3900
- /* @__PURE__ */ jsx9("div", { className: "mx-record-value", children: item.balanceState })
4402
+ /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-secondary-row", children: [
4403
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-label", children: t("activity.monetization_coverage_label", void 0, "Renewal state") }),
4404
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-value", children: item.subscriptionCoverage })
3901
4405
  ] }),
3902
- /* @__PURE__ */ jsxs5("div", { className: "mx-record-field", children: [
3903
- /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_source_label", void 0, "Source") }),
3904
- /* @__PURE__ */ jsx9("div", { className: "mx-record-value", children: item.sourceLabel })
4406
+ /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-secondary-row", children: [
4407
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-label", children: t("activity.monetization_balance_state", void 0, "Balance status") }),
4408
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-value", children: item.balanceState })
4409
+ ] }),
4410
+ /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-secondary-row", children: [
4411
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-label", children: t("activity.monetization_source_label", void 0, "Origin") }),
4412
+ /* @__PURE__ */ jsx9("span", { className: "mx-monetization-card-secondary-value", children: item.sourceLabel })
3905
4413
  ] })
3906
- ] })
3907
- ] }, item.xappId)) }) : null
4414
+ ] }),
4415
+ item.balanceSummary.length > 0 ? /* @__PURE__ */ jsxs5("div", { className: "mx-monetization-card-balance-strip", children: [
4416
+ /* @__PURE__ */ jsx9("div", { className: "mx-record-label", children: t("activity.monetization_balances_label", void 0, "Balances") }),
4417
+ /* @__PURE__ */ jsx9("div", { className: "mx-tag-list", children: item.balanceSummary.map((entry) => /* @__PURE__ */ jsx9("span", { className: "mx-tag", children: entry }, `${item.xappId}:${entry}`)) })
4418
+ ] }) : null
4419
+ ] }) }, item.xappId)) }) : null
3908
4420
  ] });
3909
4421
  }
3910
4422
 
@@ -6456,6 +6968,30 @@ function formatDateTime2(value, locale) {
6456
6968
  return parsed.toISOString();
6457
6969
  }
6458
6970
  }
6971
+ function readVirtualCurrencyDefinition2(value) {
6972
+ const record = asRecord6(value);
6973
+ if (!record) return null;
6974
+ const code = readString6(record.code);
6975
+ const name = readString6(record.name);
6976
+ if (!code && !name) return null;
6977
+ return record;
6978
+ }
6979
+ function formatVirtualCurrencyLabel3(value, options) {
6980
+ const record = readVirtualCurrencyDefinition2(value);
6981
+ if (!record) return "";
6982
+ const code = readString6(record.code);
6983
+ const name = readString6(record.name);
6984
+ if (options?.includeCode && name && code && name.toLowerCase() !== code.toLowerCase()) {
6985
+ return `${name} (${code})`;
6986
+ }
6987
+ return name || code;
6988
+ }
6989
+ function formatVirtualCurrencyAmount2(value, virtualCurrency) {
6990
+ const amount = readString6(value);
6991
+ if (!amount) return "";
6992
+ const currencyLabel = formatVirtualCurrencyLabel3(virtualCurrency);
6993
+ return currencyLabel ? `${amount} ${currencyLabel}` : amount;
6994
+ }
6459
6995
  function normalizeUsageCreditSummary(value) {
6460
6996
  const summary = asRecord6(value);
6461
6997
  if (!summary) return null;
@@ -6527,7 +7063,7 @@ function buildMonetizationHookSummaryItems(manifest) {
6527
7063
  );
6528
7064
  baseItems.push({
6529
7065
  slug: "xms_after_payment_completed",
6530
- label: defaultInvoiceRef ? `XMS payment completed \xB7 ${defaultInvoiceRef}` : "XMS payment completed",
7066
+ label: defaultInvoiceRef ? `Payment completed \xB7 ${defaultInvoiceRef}` : "Payment completed",
6531
7067
  trigger: "after:payment_completed",
6532
7068
  headless: true,
6533
7069
  blocking: false,
@@ -6543,7 +7079,7 @@ function buildMonetizationHookSummaryItems(manifest) {
6543
7079
  const invoiceRef = readString6(config.invoice_ref ?? config.invoiceRef);
6544
7080
  baseItems.push({
6545
7081
  slug: `xms_after_payment_completed_${paymentGuardRef}`,
6546
- label: invoiceRef ? `XMS payment completed \xB7 ${paymentGuardRef} \xB7 ${invoiceRef}` : `XMS payment completed \xB7 ${paymentGuardRef}`,
7082
+ label: invoiceRef ? `Payment completed \xB7 ${paymentGuardRef} \xB7 ${invoiceRef}` : `Payment completed \xB7 ${paymentGuardRef}`,
6547
7083
  trigger: "after:payment_completed",
6548
7084
  headless: true,
6549
7085
  blocking: false,
@@ -7343,13 +7879,34 @@ function XappDetailPageContent(props) {
7343
7879
  const expiresAt = formatDateTime2(subscriptionLifecycle.expiresAt, locale);
7344
7880
  const lifecyclePreviewAt = lifecyclePreviewEnabled ? formatDateTime2(routePreviewAt, locale) : "";
7345
7881
  const creditsRemaining = readString6(monetizationAccess?.credits_remaining);
7882
+ const accessVirtualCurrencyLabel = formatVirtualCurrencyLabel3(
7883
+ monetizationAccess?.virtual_currency,
7884
+ {
7885
+ includeCode: true
7886
+ }
7887
+ );
7888
+ const creditsRemainingLabel = formatVirtualCurrencyAmount2(
7889
+ monetizationAccess?.credits_remaining,
7890
+ monetizationAccess?.virtual_currency
7891
+ );
7892
+ const currentBalanceSummary = useMemo9(() => {
7893
+ const historySource = asRecord6(monetizationHistory)?.history ?? monetizationHistory;
7894
+ const summarized = summarizeVirtualCurrencyBalances({
7895
+ history: historySource
7896
+ }).balances;
7897
+ if (summarized.length > 0) {
7898
+ return summarized.map((item) => item.amountLabel).filter(Boolean);
7899
+ }
7900
+ if (creditsRemainingLabel) return [creditsRemainingLabel];
7901
+ return [];
7902
+ }, [creditsRemainingLabel, monetizationHistory]);
7346
7903
  const accessState = resolveMarketplaceDefaultAccessState({
7347
7904
  projection: monetizationAccessProjection,
7348
7905
  hasCatalogMonetization,
7349
7906
  availableLabel: t("xapp.access_state_available", void 0, "available")
7350
7907
  });
7351
7908
  const hasMonetizationState = Boolean(
7352
- currentTier || accessState || subscriptionStatus || subscriptionCoverage || subscriptionReason || overdueSince || expiryBoundaryAt || renewsAt || currentPeriodEndsAt || cancelledAt || expiresAt || lifecyclePreviewAt || creditsRemaining || additiveUnlockLabels.length > 0
7909
+ currentTier || accessState || subscriptionStatus || subscriptionCoverage || subscriptionReason || overdueSince || expiryBoundaryAt || renewsAt || currentPeriodEndsAt || cancelledAt || expiresAt || lifecyclePreviewAt || accessVirtualCurrencyLabel || currentBalanceSummary.length > 0 || creditsRemaining || additiveUnlockLabels.length > 0
7353
7910
  );
7354
7911
  const manifestScreenshots = Array.isArray(manifest?.screenshots) ? manifest.screenshots.map((shot) => readString6(shot)).filter(Boolean) : [];
7355
7912
  const manifestTags = Array.isArray(manifest?.tags) ? manifest.tags.map((tag) => readString6(tag)).filter(Boolean) : [];
@@ -7362,7 +7919,7 @@ function XappDetailPageContent(props) {
7362
7919
  });
7363
7920
  }
7364
7921
  const currentAccessCard = hasMonetizationState ? /* @__PURE__ */ jsxs11("div", { className: "mx-sidebar-card", children: [
7365
- /* @__PURE__ */ jsx15("h3", { className: "mx-section-title mx-detail-sidebar-title", children: t("xapp.current_access_title", void 0, "Current Access") }),
7922
+ /* @__PURE__ */ jsx15("h3", { className: "mx-section-title mx-detail-sidebar-title", children: t("xapp.current_access_title", void 0, "Current access") }),
7366
7923
  currentTier ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item", children: [
7367
7924
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.current_plan_label", void 0, "Current plan") }),
7368
7925
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: currentTier })
@@ -7372,7 +7929,7 @@ function XappDetailPageContent(props) {
7372
7929
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: accessState })
7373
7930
  ] }) : null,
7374
7931
  subscriptionStatus ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item", children: [
7375
- /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.subscription_status_label", void 0, "Subscription status") }),
7932
+ /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.subscription_status_label", void 0, "Subscription state") }),
7376
7933
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: subscriptionStatus })
7377
7934
  ] }) : null,
7378
7935
  subscriptionCoverage ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item", children: [
@@ -7411,9 +7968,17 @@ function XappDetailPageContent(props) {
7411
7968
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.lifecycle_preview_at_label", void 0, "Preview as of") }),
7412
7969
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: lifecyclePreviewAt })
7413
7970
  ] }) : null,
7971
+ accessVirtualCurrencyLabel ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item", children: [
7972
+ /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.virtual_currency_label", void 0, "Currency") }),
7973
+ /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: accessVirtualCurrencyLabel })
7974
+ ] }) : null,
7975
+ currentBalanceSummary.length > 0 ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item mx-meta-item-top", children: [
7976
+ /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.current_balances_label", void 0, "Balances now") }),
7977
+ /* @__PURE__ */ jsx15("div", { className: "mx-meta-value mx-meta-stack-sm", children: currentBalanceSummary.map((label, index) => /* @__PURE__ */ jsx15("div", { children: label }, `${label}:${index}`)) })
7978
+ ] }) : null,
7414
7979
  creditsRemaining ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item", children: [
7415
- /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.credits_remaining_label", void 0, "Credits remaining") }),
7416
- /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: creditsRemaining })
7980
+ /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.credits_remaining_label", void 0, "Balance") }),
7981
+ /* @__PURE__ */ jsx15("span", { className: "mx-meta-value", children: creditsRemainingLabel || creditsRemaining })
7417
7982
  ] }) : null,
7418
7983
  additiveUnlockLabels.length > 0 ? /* @__PURE__ */ jsxs11("div", { className: "mx-meta-item mx-meta-item-top", children: [
7419
7984
  /* @__PURE__ */ jsx15("span", { className: "mx-meta-label", children: t("xapp.add_on_unlocks_label", void 0, "Add-on unlocks") }),
@@ -7422,7 +7987,7 @@ function XappDetailPageContent(props) {
7422
7987
  lifecyclePreviewAt ? /* @__PURE__ */ jsx15("div", { className: "mx-subtle-note", children: t(
7423
7988
  "xapp.lifecycle_preview_hint",
7424
7989
  void 0,
7425
- "Subscription lifecycle is being previewed for the selected time."
7990
+ "Subscription state is being previewed for the selected time."
7426
7991
  ) }) : null,
7427
7992
  subscriptionActionError ? /* @__PURE__ */ jsx15("div", { className: "mx-subtle-note", children: subscriptionActionError }) : null,
7428
7993
  monetizationSubscription?.id && (canRefreshSubscriptionAction && typeof client.refreshMyXappSubscriptionContractState === "function" || canCancelSubscriptionAction && subscriptionLifecycle.canCancel && typeof client.cancelMyXappSubscriptionContract === "function") ? /* @__PURE__ */ jsxs11("div", { className: "mx-detail-actions", children: [
@@ -7452,6 +8017,7 @@ function XappDetailPageContent(props) {
7452
8017
  const plansCard = selectedPaywallRenderModel ? /* @__PURE__ */ jsxs11("div", { className: "mx-sidebar-card", ref: plansSectionRef, children: [
7453
8018
  /* @__PURE__ */ jsx15("h3", { className: "mx-section-title mx-detail-sidebar-title", children: t("xapp.plan_options_title", void 0, "Plans") }),
7454
8019
  /* @__PURE__ */ jsxs11("div", { className: "mx-paywall-card-head", children: [
8020
+ /* @__PURE__ */ jsx15("div", { className: "mx-paywall-card-kicker", children: t("xapp.plan_options_title", void 0, "Plans") }),
7455
8021
  /* @__PURE__ */ jsx15("div", { className: "mx-paywall-card-title", children: selectedPaywallRenderModel.paywallLabel }),
7456
8022
  selectedPaywallRenderModel.summary ? /* @__PURE__ */ jsx15("div", { className: "mx-paywall-card-summary", children: selectedPaywallRenderModel.summary }) : null
7457
8023
  ] }),
@@ -7466,6 +8032,19 @@ function XappDetailPageContent(props) {
7466
8032
  const isCurrentPackage = purchasePolicy.status === "current_recurring_plan";
7467
8033
  const isOwnedAdditive = purchasePolicy.status === "owned_additive_unlock";
7468
8034
  const isAdditiveCompanion = purchasePolicy.transitionKind === "buy_additive_unlock" && subscriptionStatus === "active";
8035
+ const packageActionNote = isOwnedAdditive ? t(
8036
+ "xapp.owned_unlock_note",
8037
+ void 0,
8038
+ "This add-on is already included in the current access."
8039
+ ) : isCurrentPackage ? t(
8040
+ "xapp.current_plan_note",
8041
+ void 0,
8042
+ "This plan is already active for this app."
8043
+ ) : t(
8044
+ "xapp.checkout_hint",
8045
+ void 0,
8046
+ "Checkout opens in a secure hosted payment page managed by the platform."
8047
+ );
7469
8048
  return /* @__PURE__ */ jsxs11(
7470
8049
  "div",
7471
8050
  {
@@ -7490,17 +8069,24 @@ function XappDetailPageContent(props) {
7490
8069
  isAdditiveCompanion ? /* @__PURE__ */ jsx15("div", { className: "mx-paywall-card-summary", children: t(
7491
8070
  "xapp.additive_unlock_message",
7492
8071
  void 0,
7493
- "This one-time unlock is additive. It adds access on top of the active recurring membership instead of replacing it."
8072
+ "This one-time unlock is additive. It adds access on top of the active subscription instead of replacing it."
7494
8073
  ) }) : null,
7495
- typeof client.prepareMyXappPurchaseIntent === "function" && typeof client.createMyXappPurchasePaymentSession === "function" && hasSubject && canMutate ? /* @__PURE__ */ jsx15(
7496
- "button",
7497
- {
7498
- className: "mx-btn mx-btn-secondary",
7499
- disabled: !purchasePolicy.canPurchase || checkoutBusyPackageSlug === normalizedPackageSlug,
7500
- onClick: () => void startPackageCheckout(item.packageSlug),
7501
- children: isOwnedAdditive ? t("xapp.owned_unlock_active", void 0, "Owned unlock active") : isCurrentPackage ? t("xapp.current_plan_active", void 0, "Current plan active") : checkoutBusyPackageSlug === normalizedPackageSlug ? t("xapp.checkout_starting", void 0, "Starting checkout...") : isAdditiveCompanion ? t("xapp.additive_unlock_action", void 0, "Purchase add-on unlock") : t("xapp.checkout_action", void 0, "Continue to checkout")
7502
- }
7503
- ) : null
8074
+ /* @__PURE__ */ jsxs11("div", { className: "mx-paywall-card-package-actions", children: [
8075
+ typeof client.prepareMyXappPurchaseIntent === "function" && typeof client.createMyXappPurchasePaymentSession === "function" && hasSubject && canMutate ? /* @__PURE__ */ jsx15(
8076
+ "button",
8077
+ {
8078
+ className: `mx-btn ${purchasePolicy.canPurchase && !checkoutBusyPackageSlug && !isOwnedAdditive && !isCurrentPackage ? "mx-btn-primary" : "mx-btn-secondary"}`,
8079
+ disabled: !purchasePolicy.canPurchase || checkoutBusyPackageSlug === normalizedPackageSlug,
8080
+ onClick: () => void startPackageCheckout(item.packageSlug),
8081
+ children: isOwnedAdditive ? t("xapp.owned_unlock_active", void 0, "Owned unlock active") : isCurrentPackage ? t("xapp.current_plan_active", void 0, "Current plan active") : checkoutBusyPackageSlug === normalizedPackageSlug ? t("xapp.checkout_starting", void 0, "Starting checkout...") : isAdditiveCompanion ? t(
8082
+ "xapp.additive_unlock_action",
8083
+ void 0,
8084
+ "Purchase add-on unlock"
8085
+ ) : t("xapp.checkout_action", void 0, "Start checkout")
8086
+ }
8087
+ ) : null,
8088
+ /* @__PURE__ */ jsx15("div", { className: "mx-paywall-card-package-note", children: packageActionNote })
8089
+ ] })
7504
8090
  ]
7505
8091
  },
7506
8092
  `${item.packageId || item.packageSlug || normalizedPackageSlug}:${index}`
@@ -7520,11 +8106,11 @@ function XappDetailPageContent(props) {
7520
8106
  subtitle: title ? t(
7521
8107
  "xapp.history_route_subtitle",
7522
8108
  { title },
7523
- `Recent purchases, invoices, subscriptions, and credit activity for ${title}.`
8109
+ `Balances, recent activity, and purchases for ${title}.`
7524
8110
  ) : t(
7525
8111
  "xapp.history_route_subtitle_default",
7526
8112
  void 0,
7527
- "Recent purchases, invoices, subscriptions, and credit activity for this app."
8113
+ "Balances, recent activity, and purchases for this app."
7528
8114
  ),
7529
8115
  locale,
7530
8116
  showHeader: false
@@ -7535,7 +8121,15 @@ function XappDetailPageContent(props) {
7535
8121
  if (plansOnlyMode) {
7536
8122
  return /* @__PURE__ */ jsxs11("div", { className: `mx-detail-container ${isEmbedded ? "is-embedded" : ""}`, children: [
7537
8123
  error && /* @__PURE__ */ jsx15("div", { className: "mx-detail-error", children: error }),
7538
- busy && !data ? /* @__PURE__ */ jsx15("div", { className: "mx-sidebar-card mx-detail-empty", "aria-busy": "true", children: t("common.loading", void 0, "Loading...") }) : /* @__PURE__ */ jsxs11("div", { className: `mx-plans-route ${widgetHostedPlansMode ? "is-widget-hosted" : ""}`, children: [
8124
+ busy && !data ? /* @__PURE__ */ jsx15("div", { className: "mx-sidebar-card mx-detail-empty mx-plans-route-empty", "aria-busy": "true", children: /* @__PURE__ */ jsxs11("div", { className: "mx-empty-catalog", children: [
8125
+ /* @__PURE__ */ jsx15("div", { className: "mx-empty-catalog-icon", children: "\u25CE" }),
8126
+ /* @__PURE__ */ jsx15("div", { className: "mx-empty-catalog-title", children: t("xapp.plans_loading_title", void 0, "Loading plans") }),
8127
+ /* @__PURE__ */ jsx15("div", { className: "mx-empty-catalog-desc", children: t(
8128
+ "xapp.plans_loading_desc",
8129
+ void 0,
8130
+ "Preparing published plans, balances, and current access for this app."
8131
+ ) })
8132
+ ] }) }) : /* @__PURE__ */ jsxs11("div", { className: `mx-plans-route ${widgetHostedPlansMode ? "is-widget-hosted" : ""}`, children: [
7539
8133
  !widgetHostedPlansMode ? /* @__PURE__ */ jsxs11("div", { className: "mx-breadcrumb", children: [
7540
8134
  /* @__PURE__ */ jsx15(Link10, { to: marketplaceRootHref, children: t("common.marketplace", void 0, "Marketplace") }),
7541
8135
  /* @__PURE__ */ jsx15("span", { className: "mx-breadcrumb-sep", children: "/" }),
@@ -7548,19 +8142,19 @@ function XappDetailPageContent(props) {
7548
8142
  /* @__PURE__ */ jsx15("div", { className: "mx-plans-route-subtitle", children: routeSurfaceView === "history" ? title ? t(
7549
8143
  "xapp.history_route_subtitle",
7550
8144
  { title },
7551
- `Recent purchases, invoices, subscriptions, and credit activity for ${title}.`
8145
+ `Balances, recent activity, and purchases for ${title}.`
7552
8146
  ) : t(
7553
8147
  "xapp.history_route_subtitle_default",
7554
8148
  void 0,
7555
- "Recent purchases, invoices, subscriptions, and credit activity for this app."
8149
+ "Balances, recent activity, and purchases for this app."
7556
8150
  ) : title ? t(
7557
8151
  "xapp.plans_route_subtitle",
7558
8152
  { title },
7559
- `Current access and published plans for ${title}.`
8153
+ `Access, plans, and balances for ${title}.`
7560
8154
  ) : t(
7561
8155
  "xapp.plans_route_subtitle_default",
7562
8156
  void 0,
7563
- "Current access and published plans for this app."
8157
+ "Access, plans, and balances for this app."
7564
8158
  ) })
7565
8159
  ] }) : null,
7566
8160
  /* @__PURE__ */ jsx15("div", { className: "mx-plans-route-grid", children: /* @__PURE__ */ jsxs11("div", { className: "mx-plans-route-main", children: [
@@ -7571,11 +8165,15 @@ function XappDetailPageContent(props) {
7571
8165
  className: "mx-history-route-surface",
7572
8166
  dangerouslySetInnerHTML: { __html: historySurfaceHtml }
7573
8167
  }
7574
- ) : plansCard || /* @__PURE__ */ jsx15("div", { className: "mx-sidebar-card mx-detail-empty", children: t(
7575
- "xapp.no_plans_available",
7576
- void 0,
7577
- "No published plans are currently available."
7578
- ) })
8168
+ ) : plansCard || /* @__PURE__ */ jsx15("div", { className: "mx-sidebar-card mx-detail-empty mx-plans-route-empty", children: /* @__PURE__ */ jsxs11("div", { className: "mx-empty-catalog", children: [
8169
+ /* @__PURE__ */ jsx15("div", { className: "mx-empty-catalog-icon", children: "\u25CE" }),
8170
+ /* @__PURE__ */ jsx15("div", { className: "mx-empty-catalog-title", children: t("xapp.no_plans_available", void 0, "No plans are currently available.") }),
8171
+ /* @__PURE__ */ jsx15("div", { className: "mx-empty-catalog-desc", children: t(
8172
+ "xapp.no_plans_available_desc",
8173
+ void 0,
8174
+ "Published plans will appear here when this app exposes a paywall."
8175
+ ) })
8176
+ ] }) })
7579
8177
  ] }) })
7580
8178
  ] })
7581
8179
  ] });
@@ -9620,7 +10218,7 @@ function PublisherDetailPage() {
9620
10218
  {
9621
10219
  to: detailTo,
9622
10220
  className: "mx-btn mx-btn-ghost mx-btn-sm mx-card-footer-link",
9623
- children: "View details"
10221
+ children: t("catalog.view_details", void 0, "View details")
9624
10222
  }
9625
10223
  ) })
9626
10224
  ] }, x.id);