@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 +18 -0
- package/dist/index.cjs +21 -11
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.mjs +21 -11
- package/dist/loader.js +1 -1
- package/dist/loader.mjs +1 -1
- package/dist/sri.json +11 -11
- package/dist/vanilla/index.cjs +23 -11
- package/dist/vanilla/index.mjs +23 -11
- package/dist/vue/index.cjs +23 -11
- package/dist/vue/index.mjs +23 -11
- package/dist/widgets/checkout-flow.js +5 -5
- package/dist/widgets/invoice-list.js +1 -1
- package/dist/widgets/payment-method.js +1 -1
- package/dist/widgets/pricing-card.js +8 -8
- package/dist/widgets/subscribe-button.js +1 -1
- package/dist/widgets/subscription-manager.js +1 -1
- package/dist/widgets/upgrade-cancel.js +5 -5
- package/dist/widgets/usage-meter.js +5 -5
- package/loader.sri.txt +1 -1
- package/package.json +1 -1
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:
|
|
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:
|
|
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.
|
|
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:
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
3
|
-
"generatedAt": "2026-08-
|
|
2
|
+
"version": "1.0.6",
|
|
3
|
+
"generatedAt": "2026-08-26T08:25:03.608Z",
|
|
4
4
|
"bundles": {
|
|
5
|
-
"loader.js": "sha384-
|
|
6
|
-
"widgets/checkout-flow.js": "sha384-
|
|
7
|
-
"widgets/invoice-list.js": "sha384-
|
|
8
|
-
"widgets/payment-method.js": "sha384-
|
|
9
|
-
"widgets/pricing-card.js": "sha384-
|
|
10
|
-
"widgets/subscribe-button.js": "sha384-
|
|
11
|
-
"widgets/subscription-manager.js": "sha384-
|
|
12
|
-
"widgets/upgrade-cancel.js": "sha384-
|
|
13
|
-
"widgets/usage-meter.js": "sha384-
|
|
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
|
}
|
package/dist/vanilla/index.cjs
CHANGED
|
@@ -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.
|
|
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:
|
|
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:
|
|
3957
|
+
borderRadius: cardRadius,
|
|
3946
3958
|
border: `1px solid ${tokens.border}`,
|
|
3947
3959
|
background: tokens.bg,
|
|
3948
3960
|
minHeight: 280,
|