@aforoai/storefront-widgets 1.0.5 → 1.0.6

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/CHANGELOG.md CHANGED
@@ -8,6 +8,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [1.0.6] — 2026-08-26
12
+
13
+ ### Fixed
14
+
15
+ - **PricingCard's published "Card border radius" setting (Embed Studio →
16
+ Appearance) was never applied.** `borderRadius` is a valid field on the
17
+ fetched `embeddableWidget` tenant-defaults object — the tenant config API
18
+ correctly returned it — but `extractTenantDefaults()` only extracted its
19
+ sibling fields (`layout`, `theme`, `maxPlans`, `showFeatures`, `ctaText`)
20
+ and silently dropped `borderRadius`. The plan card's corner radius was
21
+ also hardcoded (`borderRadius: 12`) rather than reading any dynamic value.
22
+ `AforoPricingCardProps` now accepts an explicit `borderRadius` prop,
23
+ `extractTenantDefaults()` reads it from the tenant's published config, and
24
+ the resolved value (prop → tenant default → built-in 12px) is applied to
25
+ the plan card and its loading-skeleton twin. `pricingCardConfigToProps()`
26
+ also maps a `data-border-radius`/`borderRadius` mount-config override for
27
+ Script Tag integrations.
28
+
11
29
  ## [1.0.5] — 2026-08-26
12
30
 
13
31
  ### Fixed
package/dist/index.cjs CHANGED
@@ -2672,6 +2672,7 @@ function WidgetShell(props) {
2672
2672
  var DEFAULT_LAYOUT = "horizontal";
2673
2673
  var DEFAULT_MAX_PLANS = 4;
2674
2674
  var DEFAULT_CTA_TEXT = "Get Started";
2675
+ var DEFAULT_CARD_RADIUS = 12;
2675
2676
  function clampLayout(raw) {
2676
2677
  return raw === "horizontal" || raw === "vertical" || raw === "table" ? raw : void 0;
2677
2678
  }
@@ -2682,7 +2683,7 @@ function setTenantDefaultsIdempotent(setter, next) {
2682
2683
  setter((prev) => {
2683
2684
  if (prev === next) return prev;
2684
2685
  if (!prev && !next) return prev;
2685
- if (prev && next && prev.layout === next.layout && prev.theme === next.theme && prev.maxPlans === next.maxPlans && prev.showFeatures === next.showFeatures && prev.ctaText === next.ctaText) {
2686
+ if (prev && next && prev.layout === next.layout && prev.theme === next.theme && prev.maxPlans === next.maxPlans && prev.showFeatures === next.showFeatures && prev.ctaText === next.ctaText && prev.borderRadius === next.borderRadius) {
2686
2687
  return prev;
2687
2688
  }
2688
2689
  return next;
@@ -2697,7 +2698,8 @@ function extractTenantDefaults(config) {
2697
2698
  theme: typeof raw.theme === "string" ? raw.theme : void 0,
2698
2699
  maxPlans: typeof raw.maxPlans === "number" && Number.isFinite(raw.maxPlans) ? raw.maxPlans : void 0,
2699
2700
  showFeatures: typeof raw.showFeatures === "boolean" ? raw.showFeatures : void 0,
2700
- ctaText: typeof raw.ctaText === "string" && raw.ctaText.length > 0 ? raw.ctaText : void 0
2701
+ ctaText: typeof raw.ctaText === "string" && raw.ctaText.length > 0 ? raw.ctaText : void 0,
2702
+ borderRadius: typeof raw.borderRadius === "number" && Number.isFinite(raw.borderRadius) ? raw.borderRadius : void 0
2701
2703
  };
2702
2704
  }
2703
2705
  var DARK_TOKEN_OVERLAY = {
@@ -2819,6 +2821,7 @@ function PricingCardBody(props) {
2819
2821
  theme: themeProp,
2820
2822
  locale: localeProp,
2821
2823
  maxPlans: maxPlansProp,
2824
+ borderRadius: borderRadiusProp,
2822
2825
  showFeatures: showFeaturesProp,
2823
2826
  ctaText: ctaTextProp,
2824
2827
  ctaUrl: ctaUrlProp,
@@ -2832,6 +2835,7 @@ function PricingCardBody(props) {
2832
2835
  const maxPlans = typeof maxPlansProp === "number" && Number.isFinite(maxPlansProp) ? maxPlansProp : typeof tenantDefaults?.maxPlans === "number" && Number.isFinite(tenantDefaults.maxPlans) ? tenantDefaults.maxPlans : DEFAULT_MAX_PLANS;
2833
2836
  const showFeatures = typeof showFeaturesProp === "boolean" ? showFeaturesProp : typeof tenantDefaults?.showFeatures === "boolean" ? tenantDefaults.showFeatures : true;
2834
2837
  const ctaTextEffective = ctaTextProp ?? tenantDefaults?.ctaText ?? void 0;
2838
+ const cardRadius = typeof borderRadiusProp === "number" && Number.isFinite(borderRadiusProp) ? borderRadiusProp : typeof tenantDefaults?.borderRadius === "number" && Number.isFinite(tenantDefaults.borderRadius) ? tenantDefaults.borderRadius : DEFAULT_CARD_RADIUS;
2835
2839
  const shell = useWidgetShell();
2836
2840
  const { tokens: shellTokens, bridgeClient, telemetry, bus, tenantSlug } = shell;
2837
2841
  const isDark = React7__namespace.useMemo(() => {
@@ -3049,7 +3053,8 @@ function PricingCardBody(props) {
3049
3053
  {
3050
3054
  layout,
3051
3055
  tokens,
3052
- prefersReducedMotion
3056
+ prefersReducedMotion,
3057
+ cardRadius
3053
3058
  }
3054
3059
  )
3055
3060
  }
@@ -3121,7 +3126,8 @@ function PricingCardBody(props) {
3121
3126
  ctaTextProp: ctaTextEffective,
3122
3127
  featuredOverride: featuredOfferingId,
3123
3128
  onCtaClick: handleCtaClick,
3124
- intlOverride
3129
+ intlOverride,
3130
+ cardRadius
3125
3131
  }
3126
3132
  )
3127
3133
  }
@@ -3136,7 +3142,8 @@ function PlanGrid({
3136
3142
  ctaTextProp,
3137
3143
  featuredOverride,
3138
3144
  onCtaClick,
3139
- intlOverride
3145
+ intlOverride,
3146
+ cardRadius
3140
3147
  }) {
3141
3148
  const isHorizontal = layout === "horizontal";
3142
3149
  const gridStyle2 = isHorizontal ? {
@@ -3159,7 +3166,8 @@ function PlanGrid({
3159
3166
  ctaTextProp,
3160
3167
  featured: offeringIsFeatured(o, featuredOverride),
3161
3168
  onCtaClick,
3162
- intlOverride
3169
+ intlOverride,
3170
+ cardRadius
3163
3171
  },
3164
3172
  o.offeringId
3165
3173
  )) });
@@ -3172,7 +3180,8 @@ function PlanCard({
3172
3180
  ctaTextProp,
3173
3181
  featured,
3174
3182
  onCtaClick,
3175
- intlOverride
3183
+ intlOverride,
3184
+ cardRadius
3176
3185
  }) {
3177
3186
  const { text: price, unitSuffix } = resolveDisplayPrice(offering, locale, intlOverride);
3178
3187
  const isContactSales = price === "\u2014";
@@ -3183,7 +3192,7 @@ function PlanCard({
3183
3192
  display: "flex",
3184
3193
  flexDirection: "column",
3185
3194
  padding: 24,
3186
- borderRadius: 12,
3195
+ borderRadius: cardRadius,
3187
3196
  border: featured ? `2px solid ${tokens.primary}` : `1px solid ${tokens.border}`,
3188
3197
  background: tokens.bg,
3189
3198
  color: tokens.text,
@@ -3533,7 +3542,8 @@ function cellAria(label, feature) {
3533
3542
  function LoadingSkeleton({
3534
3543
  layout,
3535
3544
  tokens,
3536
- prefersReducedMotion
3545
+ prefersReducedMotion,
3546
+ cardRadius
3537
3547
  }) {
3538
3548
  const shimmerStyle = prefersReducedMotion ? { background: tokens.border, opacity: 0.6 } : {
3539
3549
  background: `linear-gradient(90deg, ${tokens.border} 0%, ${tokens.bg} 50%, ${tokens.border} 100%)`,
@@ -3566,7 +3576,7 @@ function LoadingSkeleton({
3566
3576
  "aria-hidden": "true",
3567
3577
  style: {
3568
3578
  padding: 24,
3569
- borderRadius: 12,
3579
+ borderRadius: cardRadius,
3570
3580
  border: `1px solid ${tokens.border}`,
3571
3581
  background: tokens.bg,
3572
3582
  minHeight: 280,
@@ -12198,7 +12208,7 @@ function ResultPanel({
12198
12208
  }
12199
12209
 
12200
12210
  // src/core/version.ts
12201
- var VERSION = "1.0.5";
12211
+ var VERSION = "1.0.6";
12202
12212
 
12203
12213
  // src/core/AforoEmbed.ts
12204
12214
  var mountedElements = /* @__PURE__ */ new WeakMap();
package/dist/index.d.cts CHANGED
@@ -43,6 +43,8 @@ interface AforoPricingCardProps {
43
43
  locale?: string;
44
44
  /** Max plans to render — operator-set per FR-EMB-02. Default 4. */
45
45
  maxPlans?: number;
46
+ /** Card corner radius in px — operator-set per Embed Studio Appearance (0–32px). Default 12. */
47
+ borderRadius?: number;
46
48
  /** Whether to show the per-plan features list. Default `true`. */
47
49
  showFeatures?: boolean;
48
50
  /** Default CTA label when not overridden per-offering. Default `Get Started` (FR-EMB-03). */
package/dist/index.d.ts CHANGED
@@ -43,6 +43,8 @@ interface AforoPricingCardProps {
43
43
  locale?: string;
44
44
  /** Max plans to render — operator-set per FR-EMB-02. Default 4. */
45
45
  maxPlans?: number;
46
+ /** Card corner radius in px — operator-set per Embed Studio Appearance (0–32px). Default 12. */
47
+ borderRadius?: number;
46
48
  /** Whether to show the per-plan features list. Default `true`. */
47
49
  showFeatures?: boolean;
48
50
  /** Default CTA label when not overridden per-offering. Default `Get Started` (FR-EMB-03). */
package/dist/index.mjs CHANGED
@@ -2650,6 +2650,7 @@ function WidgetShell(props) {
2650
2650
  var DEFAULT_LAYOUT = "horizontal";
2651
2651
  var DEFAULT_MAX_PLANS = 4;
2652
2652
  var DEFAULT_CTA_TEXT = "Get Started";
2653
+ var DEFAULT_CARD_RADIUS = 12;
2653
2654
  function clampLayout(raw) {
2654
2655
  return raw === "horizontal" || raw === "vertical" || raw === "table" ? raw : void 0;
2655
2656
  }
@@ -2660,7 +2661,7 @@ function setTenantDefaultsIdempotent(setter, next) {
2660
2661
  setter((prev) => {
2661
2662
  if (prev === next) return prev;
2662
2663
  if (!prev && !next) return prev;
2663
- if (prev && next && prev.layout === next.layout && prev.theme === next.theme && prev.maxPlans === next.maxPlans && prev.showFeatures === next.showFeatures && prev.ctaText === next.ctaText) {
2664
+ if (prev && next && prev.layout === next.layout && prev.theme === next.theme && prev.maxPlans === next.maxPlans && prev.showFeatures === next.showFeatures && prev.ctaText === next.ctaText && prev.borderRadius === next.borderRadius) {
2664
2665
  return prev;
2665
2666
  }
2666
2667
  return next;
@@ -2675,7 +2676,8 @@ function extractTenantDefaults(config) {
2675
2676
  theme: typeof raw.theme === "string" ? raw.theme : void 0,
2676
2677
  maxPlans: typeof raw.maxPlans === "number" && Number.isFinite(raw.maxPlans) ? raw.maxPlans : void 0,
2677
2678
  showFeatures: typeof raw.showFeatures === "boolean" ? raw.showFeatures : void 0,
2678
- ctaText: typeof raw.ctaText === "string" && raw.ctaText.length > 0 ? raw.ctaText : void 0
2679
+ ctaText: typeof raw.ctaText === "string" && raw.ctaText.length > 0 ? raw.ctaText : void 0,
2680
+ borderRadius: typeof raw.borderRadius === "number" && Number.isFinite(raw.borderRadius) ? raw.borderRadius : void 0
2679
2681
  };
2680
2682
  }
2681
2683
  var DARK_TOKEN_OVERLAY = {
@@ -2797,6 +2799,7 @@ function PricingCardBody(props) {
2797
2799
  theme: themeProp,
2798
2800
  locale: localeProp,
2799
2801
  maxPlans: maxPlansProp,
2802
+ borderRadius: borderRadiusProp,
2800
2803
  showFeatures: showFeaturesProp,
2801
2804
  ctaText: ctaTextProp,
2802
2805
  ctaUrl: ctaUrlProp,
@@ -2810,6 +2813,7 @@ function PricingCardBody(props) {
2810
2813
  const maxPlans = typeof maxPlansProp === "number" && Number.isFinite(maxPlansProp) ? maxPlansProp : typeof tenantDefaults?.maxPlans === "number" && Number.isFinite(tenantDefaults.maxPlans) ? tenantDefaults.maxPlans : DEFAULT_MAX_PLANS;
2811
2814
  const showFeatures = typeof showFeaturesProp === "boolean" ? showFeaturesProp : typeof tenantDefaults?.showFeatures === "boolean" ? tenantDefaults.showFeatures : true;
2812
2815
  const ctaTextEffective = ctaTextProp ?? tenantDefaults?.ctaText ?? void 0;
2816
+ const cardRadius = typeof borderRadiusProp === "number" && Number.isFinite(borderRadiusProp) ? borderRadiusProp : typeof tenantDefaults?.borderRadius === "number" && Number.isFinite(tenantDefaults.borderRadius) ? tenantDefaults.borderRadius : DEFAULT_CARD_RADIUS;
2813
2817
  const shell = useWidgetShell();
2814
2818
  const { tokens: shellTokens, bridgeClient, telemetry, bus, tenantSlug } = shell;
2815
2819
  const isDark = React7.useMemo(() => {
@@ -3027,7 +3031,8 @@ function PricingCardBody(props) {
3027
3031
  {
3028
3032
  layout,
3029
3033
  tokens,
3030
- prefersReducedMotion
3034
+ prefersReducedMotion,
3035
+ cardRadius
3031
3036
  }
3032
3037
  )
3033
3038
  }
@@ -3099,7 +3104,8 @@ function PricingCardBody(props) {
3099
3104
  ctaTextProp: ctaTextEffective,
3100
3105
  featuredOverride: featuredOfferingId,
3101
3106
  onCtaClick: handleCtaClick,
3102
- intlOverride
3107
+ intlOverride,
3108
+ cardRadius
3103
3109
  }
3104
3110
  )
3105
3111
  }
@@ -3114,7 +3120,8 @@ function PlanGrid({
3114
3120
  ctaTextProp,
3115
3121
  featuredOverride,
3116
3122
  onCtaClick,
3117
- intlOverride
3123
+ intlOverride,
3124
+ cardRadius
3118
3125
  }) {
3119
3126
  const isHorizontal = layout === "horizontal";
3120
3127
  const gridStyle2 = isHorizontal ? {
@@ -3137,7 +3144,8 @@ function PlanGrid({
3137
3144
  ctaTextProp,
3138
3145
  featured: offeringIsFeatured(o, featuredOverride),
3139
3146
  onCtaClick,
3140
- intlOverride
3147
+ intlOverride,
3148
+ cardRadius
3141
3149
  },
3142
3150
  o.offeringId
3143
3151
  )) });
@@ -3150,7 +3158,8 @@ function PlanCard({
3150
3158
  ctaTextProp,
3151
3159
  featured,
3152
3160
  onCtaClick,
3153
- intlOverride
3161
+ intlOverride,
3162
+ cardRadius
3154
3163
  }) {
3155
3164
  const { text: price, unitSuffix } = resolveDisplayPrice(offering, locale, intlOverride);
3156
3165
  const isContactSales = price === "\u2014";
@@ -3161,7 +3170,7 @@ function PlanCard({
3161
3170
  display: "flex",
3162
3171
  flexDirection: "column",
3163
3172
  padding: 24,
3164
- borderRadius: 12,
3173
+ borderRadius: cardRadius,
3165
3174
  border: featured ? `2px solid ${tokens.primary}` : `1px solid ${tokens.border}`,
3166
3175
  background: tokens.bg,
3167
3176
  color: tokens.text,
@@ -3511,7 +3520,8 @@ function cellAria(label, feature) {
3511
3520
  function LoadingSkeleton({
3512
3521
  layout,
3513
3522
  tokens,
3514
- prefersReducedMotion
3523
+ prefersReducedMotion,
3524
+ cardRadius
3515
3525
  }) {
3516
3526
  const shimmerStyle = prefersReducedMotion ? { background: tokens.border, opacity: 0.6 } : {
3517
3527
  background: `linear-gradient(90deg, ${tokens.border} 0%, ${tokens.bg} 50%, ${tokens.border} 100%)`,
@@ -3544,7 +3554,7 @@ function LoadingSkeleton({
3544
3554
  "aria-hidden": "true",
3545
3555
  style: {
3546
3556
  padding: 24,
3547
- borderRadius: 12,
3557
+ borderRadius: cardRadius,
3548
3558
  border: `1px solid ${tokens.border}`,
3549
3559
  background: tokens.bg,
3550
3560
  minHeight: 280,
@@ -12176,7 +12186,7 @@ function ResultPanel({
12176
12186
  }
12177
12187
 
12178
12188
  // src/core/version.ts
12179
- var VERSION = "1.0.5";
12189
+ var VERSION = "1.0.6";
12180
12190
 
12181
12191
  // src/core/AforoEmbed.ts
12182
12192
  var mountedElements = /* @__PURE__ */ new WeakMap();
package/dist/loader.js CHANGED
@@ -1,3 +1,3 @@
1
- var AforoEmbedLoader=(function(exports){'use strict';var T="1.0.5";var y=new WeakMap,c=new Map,f={},A=false;function h(){A||typeof window!="undefined"&&(window.addEventListener("message",e=>{let t=e.data;!t||typeof t!="object"||typeof t.type!="string"||t.type.startsWith("aforo.")&&$(t);}),A=true);}function $(e){let t=c.get(e.type);if(t)for(let o of t)try{o(e);}catch(i){}let n=c.get("*");if(n)for(let o of n)try{o(e);}catch(i){}}var p=new Map;function N(e,t){p.set(e,t);}function w(e){return typeof e=="object"&&e!==null&&typeof e.tagName=="string"}var b={version:T,configure(e){f={...f,...e};},getConfig(){return {...f}},mount(e,t){var r,l,u,s,d;if(!w(e)||y.has(e))return false;let n=t.widget,o=p.get(n);if(!o)return typeof console!="undefined"&&console.warn(`[aforo:embed] No mount handler registered for widget "${n}". Loader bundle may not have finished loading.`),false;let i={widget:n,tenantSlug:(l=(r=t.tenantSlug)!=null?r:f.tenantSlug)!=null?l:"",embedKey:(s=(u=t.embedKey)!=null?u:f.embedKey)!=null?s:"",bridgeToken:(d=t.bridgeToken)!=null?d:f.bridgeToken,layout:t.layout,themeOverrides:t.themeOverrides,config:t.config};if(!i.tenantSlug||!i.embedKey)return typeof console!="undefined"&&console.error(`[aforo:embed] Widget "${n}" requires tenantSlug + embedKey. Provide via AforoEmbed.configure() or data-* attributes.`),false;h();let a=o(e,i);return y.set(e,{element:e,widget:n,teardown:a}),true},unmount(e){if(!w(e))return false;let t=y.get(e);if(!t)return false;try{t.teardown();}catch(n){}return y.delete(e),true},on(e,t){h();let n=c.get(e);return n||(n=new Set,c.set(e,n)),n.add(t),()=>{let o=c.get(e);o&&(o.delete(t),o.size===0&&c.delete(e));}},_registerWidget:N,_registeredWidgetsForTesting(){return Array.from(p.keys())},_resetForTesting(){p.clear(),c.clear(),f={};}};function k(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let n={},o=["primary","primaryContrast","text","textMuted","bg","border","radius","fontFamily"],i=t;for(let a of o){let r=i[a];typeof r=="string"&&r.length>0&&(n[a]=r);}return n}}catch(t){}return {}}var U=new Set(["pricing-card","subscribe-button","checkout-flow","subscription-manager","invoice-list","usage-meter","payment-method","upgrade-cancel"]),B="https://embed.aforo.ai/v1/widgets",g="[aforo:loader]";function D(){let e=typeof document!="undefined"?document.currentScript:null;if(e&&e.tagName==="SCRIPT")return e;if(typeof document!="undefined"){let t=document.getElementsByTagName("script");for(let n=t.length-1;n>=0;n--){let o=t[n];if(!o)continue;let i=o.getAttribute("src")||"";if(/(\/v1)?\/loader(\.umd)?\.js$/.test(i))return o}}return null}function G(e){let t=e==null?void 0:e.getAttribute("src");if(!t)return null;try{let n=typeof location!="undefined"?location.href:void 0,o=new URL(t,n),i=o.pathname.replace(/\/loader(\.umd)?\.js$/,"");return `${o.origin}${i}/widgets`}catch(n){return null}}function v(e,t){let n=e.getAttribute(t);if(n==null||n.trim()==="")return;let o=Number(n);return Number.isFinite(o)?o:void 0}function j(e,t){let n=e.getAttribute(t);if(n==null)return;let o=n.trim().toLowerCase();if(o==="true")return true;if(o==="false")return false}function V(e){let t=(e.getAttribute("data-aforo-widget")||"").trim(),n=e.getAttribute("data-tenant-slug")||e.getAttribute("data-tenant")||"",o=e.getAttribute("data-embed-key")||"",i=e.getAttribute("data-bridge-token")||void 0,a=e.getAttribute("data-layout")||void 0,r=k(e.getAttribute("data-theme-overrides")),l=e.getAttribute("data-offering-id")||void 0,u=e.getAttribute("data-subscription-id")||void 0,s=e.getAttribute("data-metric")||void 0,d=e.getAttribute("data-featured-offering-id")||void 0,m=e.getAttribute("data-mode")||void 0,M=e.getAttribute("data-return-url")||void 0,S=e.getAttribute("data-default-status")||void 0,F=e.getAttribute("data-render-mode")||void 0,_=e.getAttribute("data-locale")||void 0,C=v(e,"data-page-size"),O=v(e,"data-poll-interval-ms"),I=e.getAttribute("data-theme")||void 0,R=e.getAttribute("data-cart-type")||void 0,W=e.getAttribute("data-target-id")||void 0,H=e.getAttribute("data-cta-text")||void 0,x=e.getAttribute("data-cta-url")||void 0,P=v(e,"data-max-plans"),K=j(e,"data-show-features");return {widget:t,tenantSlug:n,embedKey:o,bridgeToken:i,layout:a,themeOverrides:r,config:{offeringId:l,subscriptionId:u,metricName:s,featuredOfferingId:d,mode:m,returnUrl:M,defaultStatus:S,renderMode:F,locale:_,pageSize:C,pollIntervalMs:O,theme:I,cartType:R,targetId:W,ctaText:H,ctaUrl:x,maxPlans:P,showFeatures:K}}}function z(e,t,n){return new Promise((o,i)=>{if(typeof document=="undefined")return i(new Error("no document"));let a=document.querySelector(`script[data-aforo-bundle="${e}"]`);if(a){if(a.dataset.aforoLoaded==="1")return o();a.addEventListener("load",()=>o()),a.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`)));return}let r=document.createElement("script");r.src=`${t}/${e}.js`,r.async=true,r.crossOrigin="anonymous",r.dataset.aforoBundle=e,n&&r.setAttribute("nonce",n),r.addEventListener("load",()=>{r.dataset.aforoLoaded="1",o();}),r.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`))),document.head.appendChild(r);})}function L(e){if(!e.__aforoEmbedReadyFired){e.__aforoEmbedReadyFired=true;try{typeof e.aforoEmbedReady=="function"&&e.aforoEmbedReady();}catch(t){typeof console!="undefined"&&console.error(`${g} aforoEmbedReady callback threw`,t);}if(typeof document!="undefined"&&typeof CustomEvent!="undefined")try{document.dispatchEvent(new CustomEvent("aforoEmbedReady"));}catch(t){}}}async function E(e){if(typeof window=="undefined"||typeof document=="undefined")return;let t=window;if(window.location.protocol!=="https:"&&window.location.hostname!=="localhost"){typeof console!="undefined"&&console.error(`${g} Refusing to mount Aforo widgets on a non-HTTPS page. Embed Plugin requires HTTPS (FR-TIER-12). Current origin: ${window.location.origin}`);return}if(t.__aforoEmbedLoaderInitialized){typeof console!="undefined"&&console.warn(`${g} Loader already initialised on this page \u2014 skipping duplicate run.`);return}t.__aforoEmbedLoaderInitialized=true,t.aforoEmbed||(t.aforoEmbed=b);let n=D(),o=(n==null?void 0:n.getAttribute("nonce"))||null,i=(e==null?void 0:e.bundleBaseUrl)||G(n)||B,a=Array.from(document.querySelectorAll("[data-aforo-widget]"));if(a.length===0){L(t);return}let r=new Map;for(let u of a){let s=(u.getAttribute("data-aforo-widget")||"").trim();if(!U.has(s)){typeof console!="undefined"&&console.warn(`${g} Unknown widget id "${s}" \u2014 skipping`);continue}let d=r.get(s);d||(d=[],r.set(s,d)),d.push(u);}let l=Array.from(r.entries()).map(async([u,s])=>{try{await z(u,i,o);for(let d of s){let m=V(d);if(!m.widget||!m.tenantSlug||!m.embedKey){typeof console!="undefined"&&console.error(`${g} Placeholder missing required attributes (data-tenant-slug + data-embed-key). Skipping element.`,d);continue}b.mount(d,m);}}catch(d){typeof console!="undefined"&&console.error(`${g} Failed to load bundle for "${u}"`,d);}});await Promise.all(l).catch(()=>{}),L(t);}typeof document!="undefined"&&document.readyState!=="loading"?Promise.resolve().then(()=>{E();}):typeof document!="undefined"&&document.addEventListener("DOMContentLoaded",()=>{E();});b._loader={bootstrap:E};
1
+ var AforoEmbedLoader=(function(exports){'use strict';var T="1.0.6";var y=new WeakMap,c=new Map,f={},A=false;function h(){A||typeof window!="undefined"&&(window.addEventListener("message",e=>{let t=e.data;!t||typeof t!="object"||typeof t.type!="string"||t.type.startsWith("aforo.")&&$(t);}),A=true);}function $(e){let t=c.get(e.type);if(t)for(let o of t)try{o(e);}catch(i){}let n=c.get("*");if(n)for(let o of n)try{o(e);}catch(i){}}var p=new Map;function N(e,t){p.set(e,t);}function w(e){return typeof e=="object"&&e!==null&&typeof e.tagName=="string"}var b={version:T,configure(e){f={...f,...e};},getConfig(){return {...f}},mount(e,t){var r,l,u,s,d;if(!w(e)||y.has(e))return false;let n=t.widget,o=p.get(n);if(!o)return typeof console!="undefined"&&console.warn(`[aforo:embed] No mount handler registered for widget "${n}". Loader bundle may not have finished loading.`),false;let i={widget:n,tenantSlug:(l=(r=t.tenantSlug)!=null?r:f.tenantSlug)!=null?l:"",embedKey:(s=(u=t.embedKey)!=null?u:f.embedKey)!=null?s:"",bridgeToken:(d=t.bridgeToken)!=null?d:f.bridgeToken,layout:t.layout,themeOverrides:t.themeOverrides,config:t.config};if(!i.tenantSlug||!i.embedKey)return typeof console!="undefined"&&console.error(`[aforo:embed] Widget "${n}" requires tenantSlug + embedKey. Provide via AforoEmbed.configure() or data-* attributes.`),false;h();let a=o(e,i);return y.set(e,{element:e,widget:n,teardown:a}),true},unmount(e){if(!w(e))return false;let t=y.get(e);if(!t)return false;try{t.teardown();}catch(n){}return y.delete(e),true},on(e,t){h();let n=c.get(e);return n||(n=new Set,c.set(e,n)),n.add(t),()=>{let o=c.get(e);o&&(o.delete(t),o.size===0&&c.delete(e));}},_registerWidget:N,_registeredWidgetsForTesting(){return Array.from(p.keys())},_resetForTesting(){p.clear(),c.clear(),f={};}};function k(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let n={},o=["primary","primaryContrast","text","textMuted","bg","border","radius","fontFamily"],i=t;for(let a of o){let r=i[a];typeof r=="string"&&r.length>0&&(n[a]=r);}return n}}catch(t){}return {}}var U=new Set(["pricing-card","subscribe-button","checkout-flow","subscription-manager","invoice-list","usage-meter","payment-method","upgrade-cancel"]),B="https://embed.aforo.ai/v1/widgets",g="[aforo:loader]";function D(){let e=typeof document!="undefined"?document.currentScript:null;if(e&&e.tagName==="SCRIPT")return e;if(typeof document!="undefined"){let t=document.getElementsByTagName("script");for(let n=t.length-1;n>=0;n--){let o=t[n];if(!o)continue;let i=o.getAttribute("src")||"";if(/(\/v1)?\/loader(\.umd)?\.js$/.test(i))return o}}return null}function G(e){let t=e==null?void 0:e.getAttribute("src");if(!t)return null;try{let n=typeof location!="undefined"?location.href:void 0,o=new URL(t,n),i=o.pathname.replace(/\/loader(\.umd)?\.js$/,"");return `${o.origin}${i}/widgets`}catch(n){return null}}function v(e,t){let n=e.getAttribute(t);if(n==null||n.trim()==="")return;let o=Number(n);return Number.isFinite(o)?o:void 0}function j(e,t){let n=e.getAttribute(t);if(n==null)return;let o=n.trim().toLowerCase();if(o==="true")return true;if(o==="false")return false}function V(e){let t=(e.getAttribute("data-aforo-widget")||"").trim(),n=e.getAttribute("data-tenant-slug")||e.getAttribute("data-tenant")||"",o=e.getAttribute("data-embed-key")||"",i=e.getAttribute("data-bridge-token")||void 0,a=e.getAttribute("data-layout")||void 0,r=k(e.getAttribute("data-theme-overrides")),l=e.getAttribute("data-offering-id")||void 0,u=e.getAttribute("data-subscription-id")||void 0,s=e.getAttribute("data-metric")||void 0,d=e.getAttribute("data-featured-offering-id")||void 0,m=e.getAttribute("data-mode")||void 0,M=e.getAttribute("data-return-url")||void 0,S=e.getAttribute("data-default-status")||void 0,F=e.getAttribute("data-render-mode")||void 0,_=e.getAttribute("data-locale")||void 0,C=v(e,"data-page-size"),O=v(e,"data-poll-interval-ms"),I=e.getAttribute("data-theme")||void 0,R=e.getAttribute("data-cart-type")||void 0,W=e.getAttribute("data-target-id")||void 0,H=e.getAttribute("data-cta-text")||void 0,x=e.getAttribute("data-cta-url")||void 0,P=v(e,"data-max-plans"),K=j(e,"data-show-features");return {widget:t,tenantSlug:n,embedKey:o,bridgeToken:i,layout:a,themeOverrides:r,config:{offeringId:l,subscriptionId:u,metricName:s,featuredOfferingId:d,mode:m,returnUrl:M,defaultStatus:S,renderMode:F,locale:_,pageSize:C,pollIntervalMs:O,theme:I,cartType:R,targetId:W,ctaText:H,ctaUrl:x,maxPlans:P,showFeatures:K}}}function z(e,t,n){return new Promise((o,i)=>{if(typeof document=="undefined")return i(new Error("no document"));let a=document.querySelector(`script[data-aforo-bundle="${e}"]`);if(a){if(a.dataset.aforoLoaded==="1")return o();a.addEventListener("load",()=>o()),a.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`)));return}let r=document.createElement("script");r.src=`${t}/${e}.js`,r.async=true,r.crossOrigin="anonymous",r.dataset.aforoBundle=e,n&&r.setAttribute("nonce",n),r.addEventListener("load",()=>{r.dataset.aforoLoaded="1",o();}),r.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`))),document.head.appendChild(r);})}function L(e){if(!e.__aforoEmbedReadyFired){e.__aforoEmbedReadyFired=true;try{typeof e.aforoEmbedReady=="function"&&e.aforoEmbedReady();}catch(t){typeof console!="undefined"&&console.error(`${g} aforoEmbedReady callback threw`,t);}if(typeof document!="undefined"&&typeof CustomEvent!="undefined")try{document.dispatchEvent(new CustomEvent("aforoEmbedReady"));}catch(t){}}}async function E(e){if(typeof window=="undefined"||typeof document=="undefined")return;let t=window;if(window.location.protocol!=="https:"&&window.location.hostname!=="localhost"){typeof console!="undefined"&&console.error(`${g} Refusing to mount Aforo widgets on a non-HTTPS page. Embed Plugin requires HTTPS (FR-TIER-12). Current origin: ${window.location.origin}`);return}if(t.__aforoEmbedLoaderInitialized){typeof console!="undefined"&&console.warn(`${g} Loader already initialised on this page \u2014 skipping duplicate run.`);return}t.__aforoEmbedLoaderInitialized=true,t.aforoEmbed||(t.aforoEmbed=b);let n=D(),o=(n==null?void 0:n.getAttribute("nonce"))||null,i=(e==null?void 0:e.bundleBaseUrl)||G(n)||B,a=Array.from(document.querySelectorAll("[data-aforo-widget]"));if(a.length===0){L(t);return}let r=new Map;for(let u of a){let s=(u.getAttribute("data-aforo-widget")||"").trim();if(!U.has(s)){typeof console!="undefined"&&console.warn(`${g} Unknown widget id "${s}" \u2014 skipping`);continue}let d=r.get(s);d||(d=[],r.set(s,d)),d.push(u);}let l=Array.from(r.entries()).map(async([u,s])=>{try{await z(u,i,o);for(let d of s){let m=V(d);if(!m.widget||!m.tenantSlug||!m.embedKey){typeof console!="undefined"&&console.error(`${g} Placeholder missing required attributes (data-tenant-slug + data-embed-key). Skipping element.`,d);continue}b.mount(d,m);}}catch(d){typeof console!="undefined"&&console.error(`${g} Failed to load bundle for "${u}"`,d);}});await Promise.all(l).catch(()=>{}),L(t);}typeof document!="undefined"&&document.readyState!=="loading"?Promise.resolve().then(()=>{E();}):typeof document!="undefined"&&document.addEventListener("DOMContentLoaded",()=>{E();});b._loader={bootstrap:E};
2
2
  exports.AforoEmbed=b;exports.bootstrap=E;return exports;})({});//# sourceMappingURL=loader.js.map
3
3
  //# sourceMappingURL=loader.js.map
package/dist/loader.mjs CHANGED
@@ -1,3 +1,3 @@
1
- var T="1.0.5";var y=new WeakMap,c=new Map,f={},A=false;function h(){A||typeof window!="undefined"&&(window.addEventListener("message",e=>{let t=e.data;!t||typeof t!="object"||typeof t.type!="string"||t.type.startsWith("aforo.")&&$(t);}),A=true);}function $(e){let t=c.get(e.type);if(t)for(let o of t)try{o(e);}catch(i){}let n=c.get("*");if(n)for(let o of n)try{o(e);}catch(i){}}var p=new Map;function N(e,t){p.set(e,t);}function w(e){return typeof e=="object"&&e!==null&&typeof e.tagName=="string"}var b={version:T,configure(e){f={...f,...e};},getConfig(){return {...f}},mount(e,t){var r,l,u,s,d;if(!w(e)||y.has(e))return false;let n=t.widget,o=p.get(n);if(!o)return typeof console!="undefined"&&console.warn(`[aforo:embed] No mount handler registered for widget "${n}". Loader bundle may not have finished loading.`),false;let i={widget:n,tenantSlug:(l=(r=t.tenantSlug)!=null?r:f.tenantSlug)!=null?l:"",embedKey:(s=(u=t.embedKey)!=null?u:f.embedKey)!=null?s:"",bridgeToken:(d=t.bridgeToken)!=null?d:f.bridgeToken,layout:t.layout,themeOverrides:t.themeOverrides,config:t.config};if(!i.tenantSlug||!i.embedKey)return typeof console!="undefined"&&console.error(`[aforo:embed] Widget "${n}" requires tenantSlug + embedKey. Provide via AforoEmbed.configure() or data-* attributes.`),false;h();let a=o(e,i);return y.set(e,{element:e,widget:n,teardown:a}),true},unmount(e){if(!w(e))return false;let t=y.get(e);if(!t)return false;try{t.teardown();}catch(n){}return y.delete(e),true},on(e,t){h();let n=c.get(e);return n||(n=new Set,c.set(e,n)),n.add(t),()=>{let o=c.get(e);o&&(o.delete(t),o.size===0&&c.delete(e));}},_registerWidget:N,_registeredWidgetsForTesting(){return Array.from(p.keys())},_resetForTesting(){p.clear(),c.clear(),f={};}};function k(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let n={},o=["primary","primaryContrast","text","textMuted","bg","border","radius","fontFamily"],i=t;for(let a of o){let r=i[a];typeof r=="string"&&r.length>0&&(n[a]=r);}return n}}catch(t){}return {}}var U=new Set(["pricing-card","subscribe-button","checkout-flow","subscription-manager","invoice-list","usage-meter","payment-method","upgrade-cancel"]),B="https://embed.aforo.ai/v1/widgets",g="[aforo:loader]";function D(){let e=typeof document!="undefined"?document.currentScript:null;if(e&&e.tagName==="SCRIPT")return e;if(typeof document!="undefined"){let t=document.getElementsByTagName("script");for(let n=t.length-1;n>=0;n--){let o=t[n];if(!o)continue;let i=o.getAttribute("src")||"";if(/(\/v1)?\/loader(\.umd)?\.js$/.test(i))return o}}return null}function G(e){let t=e==null?void 0:e.getAttribute("src");if(!t)return null;try{let n=typeof location!="undefined"?location.href:void 0,o=new URL(t,n),i=o.pathname.replace(/\/loader(\.umd)?\.js$/,"");return `${o.origin}${i}/widgets`}catch(n){return null}}function v(e,t){let n=e.getAttribute(t);if(n==null||n.trim()==="")return;let o=Number(n);return Number.isFinite(o)?o:void 0}function j(e,t){let n=e.getAttribute(t);if(n==null)return;let o=n.trim().toLowerCase();if(o==="true")return true;if(o==="false")return false}function V(e){let t=(e.getAttribute("data-aforo-widget")||"").trim(),n=e.getAttribute("data-tenant-slug")||e.getAttribute("data-tenant")||"",o=e.getAttribute("data-embed-key")||"",i=e.getAttribute("data-bridge-token")||void 0,a=e.getAttribute("data-layout")||void 0,r=k(e.getAttribute("data-theme-overrides")),l=e.getAttribute("data-offering-id")||void 0,u=e.getAttribute("data-subscription-id")||void 0,s=e.getAttribute("data-metric")||void 0,d=e.getAttribute("data-featured-offering-id")||void 0,m=e.getAttribute("data-mode")||void 0,M=e.getAttribute("data-return-url")||void 0,S=e.getAttribute("data-default-status")||void 0,F=e.getAttribute("data-render-mode")||void 0,_=e.getAttribute("data-locale")||void 0,C=v(e,"data-page-size"),O=v(e,"data-poll-interval-ms"),I=e.getAttribute("data-theme")||void 0,R=e.getAttribute("data-cart-type")||void 0,W=e.getAttribute("data-target-id")||void 0,H=e.getAttribute("data-cta-text")||void 0,x=e.getAttribute("data-cta-url")||void 0,P=v(e,"data-max-plans"),K=j(e,"data-show-features");return {widget:t,tenantSlug:n,embedKey:o,bridgeToken:i,layout:a,themeOverrides:r,config:{offeringId:l,subscriptionId:u,metricName:s,featuredOfferingId:d,mode:m,returnUrl:M,defaultStatus:S,renderMode:F,locale:_,pageSize:C,pollIntervalMs:O,theme:I,cartType:R,targetId:W,ctaText:H,ctaUrl:x,maxPlans:P,showFeatures:K}}}function z(e,t,n){return new Promise((o,i)=>{if(typeof document=="undefined")return i(new Error("no document"));let a=document.querySelector(`script[data-aforo-bundle="${e}"]`);if(a){if(a.dataset.aforoLoaded==="1")return o();a.addEventListener("load",()=>o()),a.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`)));return}let r=document.createElement("script");r.src=`${t}/${e}.js`,r.async=true,r.crossOrigin="anonymous",r.dataset.aforoBundle=e,n&&r.setAttribute("nonce",n),r.addEventListener("load",()=>{r.dataset.aforoLoaded="1",o();}),r.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`))),document.head.appendChild(r);})}function L(e){if(!e.__aforoEmbedReadyFired){e.__aforoEmbedReadyFired=true;try{typeof e.aforoEmbedReady=="function"&&e.aforoEmbedReady();}catch(t){typeof console!="undefined"&&console.error(`${g} aforoEmbedReady callback threw`,t);}if(typeof document!="undefined"&&typeof CustomEvent!="undefined")try{document.dispatchEvent(new CustomEvent("aforoEmbedReady"));}catch(t){}}}async function E(e){if(typeof window=="undefined"||typeof document=="undefined")return;let t=window;if(window.location.protocol!=="https:"&&window.location.hostname!=="localhost"){typeof console!="undefined"&&console.error(`${g} Refusing to mount Aforo widgets on a non-HTTPS page. Embed Plugin requires HTTPS (FR-TIER-12). Current origin: ${window.location.origin}`);return}if(t.__aforoEmbedLoaderInitialized){typeof console!="undefined"&&console.warn(`${g} Loader already initialised on this page \u2014 skipping duplicate run.`);return}t.__aforoEmbedLoaderInitialized=true,t.aforoEmbed||(t.aforoEmbed=b);let n=D(),o=(n==null?void 0:n.getAttribute("nonce"))||null,i=(e==null?void 0:e.bundleBaseUrl)||G(n)||B,a=Array.from(document.querySelectorAll("[data-aforo-widget]"));if(a.length===0){L(t);return}let r=new Map;for(let u of a){let s=(u.getAttribute("data-aforo-widget")||"").trim();if(!U.has(s)){typeof console!="undefined"&&console.warn(`${g} Unknown widget id "${s}" \u2014 skipping`);continue}let d=r.get(s);d||(d=[],r.set(s,d)),d.push(u);}let l=Array.from(r.entries()).map(async([u,s])=>{try{await z(u,i,o);for(let d of s){let m=V(d);if(!m.widget||!m.tenantSlug||!m.embedKey){typeof console!="undefined"&&console.error(`${g} Placeholder missing required attributes (data-tenant-slug + data-embed-key). Skipping element.`,d);continue}b.mount(d,m);}}catch(d){typeof console!="undefined"&&console.error(`${g} Failed to load bundle for "${u}"`,d);}});await Promise.all(l).catch(()=>{}),L(t);}typeof document!="undefined"&&document.readyState!=="loading"?Promise.resolve().then(()=>{E();}):typeof document!="undefined"&&document.addEventListener("DOMContentLoaded",()=>{E();});b._loader={bootstrap:E};
1
+ var T="1.0.6";var y=new WeakMap,c=new Map,f={},A=false;function h(){A||typeof window!="undefined"&&(window.addEventListener("message",e=>{let t=e.data;!t||typeof t!="object"||typeof t.type!="string"||t.type.startsWith("aforo.")&&$(t);}),A=true);}function $(e){let t=c.get(e.type);if(t)for(let o of t)try{o(e);}catch(i){}let n=c.get("*");if(n)for(let o of n)try{o(e);}catch(i){}}var p=new Map;function N(e,t){p.set(e,t);}function w(e){return typeof e=="object"&&e!==null&&typeof e.tagName=="string"}var b={version:T,configure(e){f={...f,...e};},getConfig(){return {...f}},mount(e,t){var r,l,u,s,d;if(!w(e)||y.has(e))return false;let n=t.widget,o=p.get(n);if(!o)return typeof console!="undefined"&&console.warn(`[aforo:embed] No mount handler registered for widget "${n}". Loader bundle may not have finished loading.`),false;let i={widget:n,tenantSlug:(l=(r=t.tenantSlug)!=null?r:f.tenantSlug)!=null?l:"",embedKey:(s=(u=t.embedKey)!=null?u:f.embedKey)!=null?s:"",bridgeToken:(d=t.bridgeToken)!=null?d:f.bridgeToken,layout:t.layout,themeOverrides:t.themeOverrides,config:t.config};if(!i.tenantSlug||!i.embedKey)return typeof console!="undefined"&&console.error(`[aforo:embed] Widget "${n}" requires tenantSlug + embedKey. Provide via AforoEmbed.configure() or data-* attributes.`),false;h();let a=o(e,i);return y.set(e,{element:e,widget:n,teardown:a}),true},unmount(e){if(!w(e))return false;let t=y.get(e);if(!t)return false;try{t.teardown();}catch(n){}return y.delete(e),true},on(e,t){h();let n=c.get(e);return n||(n=new Set,c.set(e,n)),n.add(t),()=>{let o=c.get(e);o&&(o.delete(t),o.size===0&&c.delete(e));}},_registerWidget:N,_registeredWidgetsForTesting(){return Array.from(p.keys())},_resetForTesting(){p.clear(),c.clear(),f={};}};function k(e){if(!e)return {};try{let t=JSON.parse(e);if(t&&typeof t=="object"&&!Array.isArray(t)){let n={},o=["primary","primaryContrast","text","textMuted","bg","border","radius","fontFamily"],i=t;for(let a of o){let r=i[a];typeof r=="string"&&r.length>0&&(n[a]=r);}return n}}catch(t){}return {}}var U=new Set(["pricing-card","subscribe-button","checkout-flow","subscription-manager","invoice-list","usage-meter","payment-method","upgrade-cancel"]),B="https://embed.aforo.ai/v1/widgets",g="[aforo:loader]";function D(){let e=typeof document!="undefined"?document.currentScript:null;if(e&&e.tagName==="SCRIPT")return e;if(typeof document!="undefined"){let t=document.getElementsByTagName("script");for(let n=t.length-1;n>=0;n--){let o=t[n];if(!o)continue;let i=o.getAttribute("src")||"";if(/(\/v1)?\/loader(\.umd)?\.js$/.test(i))return o}}return null}function G(e){let t=e==null?void 0:e.getAttribute("src");if(!t)return null;try{let n=typeof location!="undefined"?location.href:void 0,o=new URL(t,n),i=o.pathname.replace(/\/loader(\.umd)?\.js$/,"");return `${o.origin}${i}/widgets`}catch(n){return null}}function v(e,t){let n=e.getAttribute(t);if(n==null||n.trim()==="")return;let o=Number(n);return Number.isFinite(o)?o:void 0}function j(e,t){let n=e.getAttribute(t);if(n==null)return;let o=n.trim().toLowerCase();if(o==="true")return true;if(o==="false")return false}function V(e){let t=(e.getAttribute("data-aforo-widget")||"").trim(),n=e.getAttribute("data-tenant-slug")||e.getAttribute("data-tenant")||"",o=e.getAttribute("data-embed-key")||"",i=e.getAttribute("data-bridge-token")||void 0,a=e.getAttribute("data-layout")||void 0,r=k(e.getAttribute("data-theme-overrides")),l=e.getAttribute("data-offering-id")||void 0,u=e.getAttribute("data-subscription-id")||void 0,s=e.getAttribute("data-metric")||void 0,d=e.getAttribute("data-featured-offering-id")||void 0,m=e.getAttribute("data-mode")||void 0,M=e.getAttribute("data-return-url")||void 0,S=e.getAttribute("data-default-status")||void 0,F=e.getAttribute("data-render-mode")||void 0,_=e.getAttribute("data-locale")||void 0,C=v(e,"data-page-size"),O=v(e,"data-poll-interval-ms"),I=e.getAttribute("data-theme")||void 0,R=e.getAttribute("data-cart-type")||void 0,W=e.getAttribute("data-target-id")||void 0,H=e.getAttribute("data-cta-text")||void 0,x=e.getAttribute("data-cta-url")||void 0,P=v(e,"data-max-plans"),K=j(e,"data-show-features");return {widget:t,tenantSlug:n,embedKey:o,bridgeToken:i,layout:a,themeOverrides:r,config:{offeringId:l,subscriptionId:u,metricName:s,featuredOfferingId:d,mode:m,returnUrl:M,defaultStatus:S,renderMode:F,locale:_,pageSize:C,pollIntervalMs:O,theme:I,cartType:R,targetId:W,ctaText:H,ctaUrl:x,maxPlans:P,showFeatures:K}}}function z(e,t,n){return new Promise((o,i)=>{if(typeof document=="undefined")return i(new Error("no document"));let a=document.querySelector(`script[data-aforo-bundle="${e}"]`);if(a){if(a.dataset.aforoLoaded==="1")return o();a.addEventListener("load",()=>o()),a.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`)));return}let r=document.createElement("script");r.src=`${t}/${e}.js`,r.async=true,r.crossOrigin="anonymous",r.dataset.aforoBundle=e,n&&r.setAttribute("nonce",n),r.addEventListener("load",()=>{r.dataset.aforoLoaded="1",o();}),r.addEventListener("error",()=>i(new Error(`bundle load failed: ${e}`))),document.head.appendChild(r);})}function L(e){if(!e.__aforoEmbedReadyFired){e.__aforoEmbedReadyFired=true;try{typeof e.aforoEmbedReady=="function"&&e.aforoEmbedReady();}catch(t){typeof console!="undefined"&&console.error(`${g} aforoEmbedReady callback threw`,t);}if(typeof document!="undefined"&&typeof CustomEvent!="undefined")try{document.dispatchEvent(new CustomEvent("aforoEmbedReady"));}catch(t){}}}async function E(e){if(typeof window=="undefined"||typeof document=="undefined")return;let t=window;if(window.location.protocol!=="https:"&&window.location.hostname!=="localhost"){typeof console!="undefined"&&console.error(`${g} Refusing to mount Aforo widgets on a non-HTTPS page. Embed Plugin requires HTTPS (FR-TIER-12). Current origin: ${window.location.origin}`);return}if(t.__aforoEmbedLoaderInitialized){typeof console!="undefined"&&console.warn(`${g} Loader already initialised on this page \u2014 skipping duplicate run.`);return}t.__aforoEmbedLoaderInitialized=true,t.aforoEmbed||(t.aforoEmbed=b);let n=D(),o=(n==null?void 0:n.getAttribute("nonce"))||null,i=(e==null?void 0:e.bundleBaseUrl)||G(n)||B,a=Array.from(document.querySelectorAll("[data-aforo-widget]"));if(a.length===0){L(t);return}let r=new Map;for(let u of a){let s=(u.getAttribute("data-aforo-widget")||"").trim();if(!U.has(s)){typeof console!="undefined"&&console.warn(`${g} Unknown widget id "${s}" \u2014 skipping`);continue}let d=r.get(s);d||(d=[],r.set(s,d)),d.push(u);}let l=Array.from(r.entries()).map(async([u,s])=>{try{await z(u,i,o);for(let d of s){let m=V(d);if(!m.widget||!m.tenantSlug||!m.embedKey){typeof console!="undefined"&&console.error(`${g} Placeholder missing required attributes (data-tenant-slug + data-embed-key). Skipping element.`,d);continue}b.mount(d,m);}}catch(d){typeof console!="undefined"&&console.error(`${g} Failed to load bundle for "${u}"`,d);}});await Promise.all(l).catch(()=>{}),L(t);}typeof document!="undefined"&&document.readyState!=="loading"?Promise.resolve().then(()=>{E();}):typeof document!="undefined"&&document.addEventListener("DOMContentLoaded",()=>{E();});b._loader={bootstrap:E};
2
2
  export{b as AforoEmbed,E as bootstrap};//# sourceMappingURL=loader.mjs.map
3
3
  //# sourceMappingURL=loader.mjs.map
package/dist/sri.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
- "version": "1.0.5",
3
- "generatedAt": "2026-08-26T07:52:12.266Z",
2
+ "version": "1.0.6",
3
+ "generatedAt": "2026-08-26T08:25:03.608Z",
4
4
  "bundles": {
5
- "loader.js": "sha384-dSFfjDiOhFwuhOq6QaJlGLJq05Fl3yau3wPc5kuYnO+OmN/MKp91+AwOpG0zFAJ7",
6
- "widgets/checkout-flow.js": "sha384-ABsG5M7QXhYJUmB81gURADHt98yRZaJpMxw5qDXiUs7LHa34LGXgfGEzSZrMC2Lr",
7
- "widgets/invoice-list.js": "sha384-Dk5I2atCFalMIClYl6NkhZo3rrQNsfxq64y+geG+Lm3vZ1rZSg3xeVfY4tVMl0mD",
8
- "widgets/payment-method.js": "sha384-xkM3m6gLJBhs0aK/A+/tcEQIWjz5Fj/h5dl4X/aEXmu6Dc0fVfxIV2ZQ1NDKDfsa",
9
- "widgets/pricing-card.js": "sha384-F0ZraASZJCoL/E3v2tCQAAilNm6BndFRYsH5CFAYlWizibZyrNCVddq/pZ4ZQeP6",
10
- "widgets/subscribe-button.js": "sha384-85KTFUAYOsDkedU1SKInEn0V0iAMUX4hokvn7ve69Q2Ouh9dvJoPY9OEYuWsDvfF",
11
- "widgets/subscription-manager.js": "sha384-3BNZFvMphX9jAsmzrE09tnPBIKbXsxLhVSv1KynXrJK217OmFekbdHLzkPtGphcw",
12
- "widgets/upgrade-cancel.js": "sha384-ZvFGSCqU3+MoAeXeytEbYzpDZInRDP0YJ9AUl6yoMdwQ4p4W7stLLgdM3l3dNIxZ",
13
- "widgets/usage-meter.js": "sha384-2g3qNlSZMkw6sTHKsXbsupaWQbdQzE+4U8jbFlRUaV0qpMKeptV4po98z0PpSM61"
5
+ "loader.js": "sha384-rX5O1gvlt56peSNtNEJduwPfDsM5oLSlw6AFh0nBuysuBTup7dH3cqK9aKLzewWN",
6
+ "widgets/checkout-flow.js": "sha384-3Rb+nizUBhxFhOh2VUu+i2l1QzX5bNJwjVdxG+VTnWrRzPGeU+8znz/I83Uqo6Lo",
7
+ "widgets/invoice-list.js": "sha384-R7ugqnPN9QzMwuv41eyYVIHvhWXT1l9MUqv3/lkwpWqeBimUGj4Jum97jgL6HwXA",
8
+ "widgets/payment-method.js": "sha384-gAMorea0TI66Sv1ygVCqyKriR+mDNgNNeHyTuTJADzSJi4wATSTzcAAUqz1JPEVK",
9
+ "widgets/pricing-card.js": "sha384-O0pOl4rPkd915RHmoW63fs1B4zng9WL1gtoJVb06qBC2QnTL6NO1aYNWBsDKLkql",
10
+ "widgets/subscribe-button.js": "sha384-rmG1ib5UoYVby5fSBNB6Omyu8j9beLzZSxmc97vaWrHhzsK/OKy8NM73URpS9wuF",
11
+ "widgets/subscription-manager.js": "sha384-Brhr0eLy2khBWGC1IWjmHdqMHlu5ul+TNEjk5iIJ+iwRf7qPWkcLU3Qw2+u3x2WT",
12
+ "widgets/upgrade-cancel.js": "sha384-9as15ROb0lsazumcF0NbPpAzCjWDE7NUFACSKzl5XC3bzzK7y1kNQukuqsNzlcaX",
13
+ "widgets/usage-meter.js": "sha384-vA74x194TdKa54vMuxJzdc/TWMNkLG+XGohe873qqFFILos6LaJVLG2iRZzcULEP"
14
14
  }
15
15
  }
@@ -27,7 +27,7 @@ var React7__namespace = /*#__PURE__*/_interopNamespace(React7);
27
27
  // src/vanilla/index.ts
28
28
 
29
29
  // src/core/version.ts
30
- var VERSION = "1.0.5";
30
+ var VERSION = "1.0.6";
31
31
 
32
32
  // src/core/AforoEmbed.ts
33
33
  var mountedElements = /* @__PURE__ */ new WeakMap();
@@ -182,6 +182,7 @@ function pricingCardConfigToProps(config) {
182
182
  const theme = readEnum(extra.theme, ["light", "dark", "auto"], "auto");
183
183
  const locale = typeof extra.locale === "string" ? extra.locale : void 0;
184
184
  const maxPlans = typeof extra.maxPlans === "number" && Number.isFinite(extra.maxPlans) ? extra.maxPlans : void 0;
185
+ const borderRadius = typeof extra.borderRadius === "number" && Number.isFinite(extra.borderRadius) ? extra.borderRadius : void 0;
185
186
  const ctaText = typeof extra.ctaText === "string" ? extra.ctaText : void 0;
186
187
  const ctaUrl = typeof extra.ctaUrl === "string" ? extra.ctaUrl : void 0;
187
188
  const showFeatures = typeof extra.showFeatures === "boolean" ? extra.showFeatures : void 0;
@@ -195,6 +196,7 @@ function pricingCardConfigToProps(config) {
195
196
  theme,
196
197
  locale,
197
198
  maxPlans,
199
+ borderRadius,
198
200
  showFeatures,
199
201
  ctaText,
200
202
  ctaUrl,
@@ -3048,6 +3050,7 @@ function WidgetShell(props) {
3048
3050
  var DEFAULT_LAYOUT = "horizontal";
3049
3051
  var DEFAULT_MAX_PLANS = 4;
3050
3052
  var DEFAULT_CTA_TEXT = "Get Started";
3053
+ var DEFAULT_CARD_RADIUS = 12;
3051
3054
  function clampLayout(raw) {
3052
3055
  return raw === "horizontal" || raw === "vertical" || raw === "table" ? raw : void 0;
3053
3056
  }
@@ -3058,7 +3061,7 @@ function setTenantDefaultsIdempotent(setter, next) {
3058
3061
  setter((prev) => {
3059
3062
  if (prev === next) return prev;
3060
3063
  if (!prev && !next) return prev;
3061
- if (prev && next && prev.layout === next.layout && prev.theme === next.theme && prev.maxPlans === next.maxPlans && prev.showFeatures === next.showFeatures && prev.ctaText === next.ctaText) {
3064
+ if (prev && next && prev.layout === next.layout && prev.theme === next.theme && prev.maxPlans === next.maxPlans && prev.showFeatures === next.showFeatures && prev.ctaText === next.ctaText && prev.borderRadius === next.borderRadius) {
3062
3065
  return prev;
3063
3066
  }
3064
3067
  return next;
@@ -3073,7 +3076,8 @@ function extractTenantDefaults(config) {
3073
3076
  theme: typeof raw.theme === "string" ? raw.theme : void 0,
3074
3077
  maxPlans: typeof raw.maxPlans === "number" && Number.isFinite(raw.maxPlans) ? raw.maxPlans : void 0,
3075
3078
  showFeatures: typeof raw.showFeatures === "boolean" ? raw.showFeatures : void 0,
3076
- ctaText: typeof raw.ctaText === "string" && raw.ctaText.length > 0 ? raw.ctaText : void 0
3079
+ ctaText: typeof raw.ctaText === "string" && raw.ctaText.length > 0 ? raw.ctaText : void 0,
3080
+ borderRadius: typeof raw.borderRadius === "number" && Number.isFinite(raw.borderRadius) ? raw.borderRadius : void 0
3077
3081
  };
3078
3082
  }
3079
3083
  var DARK_TOKEN_OVERLAY = {
@@ -3195,6 +3199,7 @@ function PricingCardBody(props) {
3195
3199
  theme: themeProp,
3196
3200
  locale: localeProp,
3197
3201
  maxPlans: maxPlansProp,
3202
+ borderRadius: borderRadiusProp,
3198
3203
  showFeatures: showFeaturesProp,
3199
3204
  ctaText: ctaTextProp,
3200
3205
  ctaUrl: ctaUrlProp,
@@ -3208,6 +3213,7 @@ function PricingCardBody(props) {
3208
3213
  const maxPlans = typeof maxPlansProp === "number" && Number.isFinite(maxPlansProp) ? maxPlansProp : typeof tenantDefaults?.maxPlans === "number" && Number.isFinite(tenantDefaults.maxPlans) ? tenantDefaults.maxPlans : DEFAULT_MAX_PLANS;
3209
3214
  const showFeatures = typeof showFeaturesProp === "boolean" ? showFeaturesProp : typeof tenantDefaults?.showFeatures === "boolean" ? tenantDefaults.showFeatures : true;
3210
3215
  const ctaTextEffective = ctaTextProp ?? tenantDefaults?.ctaText ?? void 0;
3216
+ const cardRadius = typeof borderRadiusProp === "number" && Number.isFinite(borderRadiusProp) ? borderRadiusProp : typeof tenantDefaults?.borderRadius === "number" && Number.isFinite(tenantDefaults.borderRadius) ? tenantDefaults.borderRadius : DEFAULT_CARD_RADIUS;
3211
3217
  const shell = useWidgetShell();
3212
3218
  const { tokens: shellTokens, bridgeClient, telemetry, bus, tenantSlug } = shell;
3213
3219
  const isDark = React7__namespace.useMemo(() => {
@@ -3425,7 +3431,8 @@ function PricingCardBody(props) {
3425
3431
  {
3426
3432
  layout,
3427
3433
  tokens,
3428
- prefersReducedMotion
3434
+ prefersReducedMotion,
3435
+ cardRadius
3429
3436
  }
3430
3437
  )
3431
3438
  }
@@ -3497,7 +3504,8 @@ function PricingCardBody(props) {
3497
3504
  ctaTextProp: ctaTextEffective,
3498
3505
  featuredOverride: featuredOfferingId,
3499
3506
  onCtaClick: handleCtaClick,
3500
- intlOverride
3507
+ intlOverride,
3508
+ cardRadius
3501
3509
  }
3502
3510
  )
3503
3511
  }
@@ -3512,7 +3520,8 @@ function PlanGrid({
3512
3520
  ctaTextProp,
3513
3521
  featuredOverride,
3514
3522
  onCtaClick,
3515
- intlOverride
3523
+ intlOverride,
3524
+ cardRadius
3516
3525
  }) {
3517
3526
  const isHorizontal = layout === "horizontal";
3518
3527
  const gridStyle2 = isHorizontal ? {
@@ -3535,7 +3544,8 @@ function PlanGrid({
3535
3544
  ctaTextProp,
3536
3545
  featured: offeringIsFeatured(o, featuredOverride),
3537
3546
  onCtaClick,
3538
- intlOverride
3547
+ intlOverride,
3548
+ cardRadius
3539
3549
  },
3540
3550
  o.offeringId
3541
3551
  )) });
@@ -3548,7 +3558,8 @@ function PlanCard({
3548
3558
  ctaTextProp,
3549
3559
  featured,
3550
3560
  onCtaClick,
3551
- intlOverride
3561
+ intlOverride,
3562
+ cardRadius
3552
3563
  }) {
3553
3564
  const { text: price, unitSuffix } = resolveDisplayPrice(offering, locale, intlOverride);
3554
3565
  const isContactSales = price === "\u2014";
@@ -3559,7 +3570,7 @@ function PlanCard({
3559
3570
  display: "flex",
3560
3571
  flexDirection: "column",
3561
3572
  padding: 24,
3562
- borderRadius: 12,
3573
+ borderRadius: cardRadius,
3563
3574
  border: featured ? `2px solid ${tokens.primary}` : `1px solid ${tokens.border}`,
3564
3575
  background: tokens.bg,
3565
3576
  color: tokens.text,
@@ -3909,7 +3920,8 @@ function cellAria(label, feature) {
3909
3920
  function LoadingSkeleton({
3910
3921
  layout,
3911
3922
  tokens,
3912
- prefersReducedMotion
3923
+ prefersReducedMotion,
3924
+ cardRadius
3913
3925
  }) {
3914
3926
  const shimmerStyle = prefersReducedMotion ? { background: tokens.border, opacity: 0.6 } : {
3915
3927
  background: `linear-gradient(90deg, ${tokens.border} 0%, ${tokens.bg} 50%, ${tokens.border} 100%)`,
@@ -3942,7 +3954,7 @@ function LoadingSkeleton({
3942
3954
  "aria-hidden": "true",
3943
3955
  style: {
3944
3956
  padding: 24,
3945
- borderRadius: 12,
3957
+ borderRadius: cardRadius,
3946
3958
  border: `1px solid ${tokens.border}`,
3947
3959
  background: tokens.bg,
3948
3960
  minHeight: 280,