se-design 1.0.73-dev2 → 1.0.73-dev6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CustomModal/index.d.ts +16 -0
- package/dist/components/MenuList/index.d.ts +3 -2
- package/dist/components/Modal/index.d.ts +1 -0
- package/dist/components/Popover/index.d.ts +2 -2
- package/dist/index11.js +53 -38
- package/dist/index11.js.map +1 -1
- package/dist/index12.js +30 -18
- package/dist/index12.js.map +1 -1
- package/dist/index15.js +1 -1
- package/dist/index17.js +36 -33
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +129 -124
- package/dist/index18.js.map +1 -1
- package/dist/index188.js +5 -5
- package/dist/index192.js +43 -0
- package/dist/index192.js.map +1 -0
- package/dist/index193.js +62 -0
- package/dist/index193.js.map +1 -0
- package/dist/index194.js +20 -21
- package/dist/index194.js.map +1 -1
- package/dist/index197.js +27 -0
- package/dist/index197.js.map +1 -0
- package/dist/{index196.js → index199.js} +3 -3
- package/dist/{index196.js.map → index199.js.map} +1 -1
- package/dist/{index206.js → index208.js} +1 -1
- package/dist/{index206.js.map → index208.js.map} +1 -1
- package/dist/{index214.js → index216.js} +1 -1
- package/dist/{index214.js.map → index216.js.map} +1 -1
- package/dist/{index217.js → index219.js} +1 -1
- package/dist/{index217.js.map → index219.js.map} +1 -1
- package/dist/index228.js +3 -58
- package/dist/index228.js.map +1 -1
- package/dist/index230.js +20 -52
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +51 -16
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +18 -9
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +9 -9
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +9 -4
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +5 -170
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +170 -11
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +11 -6
- package/dist/index237.js.map +1 -1
- package/dist/index238.js +5 -5
- package/dist/index238.js.map +1 -1
- package/dist/index239.js +5 -37
- package/dist/index239.js.map +1 -1
- package/dist/index24.js +1 -1
- package/dist/index240.js +38 -2
- package/dist/index240.js.map +1 -1
- package/dist/index241.js +2 -8
- package/dist/index241.js.map +1 -1
- package/dist/index242.js +7 -326
- package/dist/index242.js.map +1 -1
- package/dist/index243.js +324 -47
- package/dist/index243.js.map +1 -1
- package/dist/index244.js +50 -2
- package/dist/index244.js.map +1 -1
- package/dist/index245.js +2 -76
- package/dist/index245.js.map +1 -1
- package/dist/index246.js +65 -82
- package/dist/index246.js.map +1 -1
- package/dist/index247.js +89 -48
- package/dist/index247.js.map +1 -1
- package/dist/index248.js +51 -7
- package/dist/index248.js.map +1 -1
- package/dist/index249.js +7 -4
- package/dist/index249.js.map +1 -1
- package/dist/index250.js +4 -51
- package/dist/index250.js.map +1 -1
- package/dist/index251.js +52 -2
- package/dist/index251.js.map +1 -1
- package/dist/index252.js +2 -2
- package/dist/index253.js +5 -0
- package/dist/index253.js.map +1 -0
- package/dist/index27.js +1 -1
- package/dist/index28.js +94 -90
- package/dist/index28.js.map +1 -1
- package/dist/index32.js +42 -44
- package/dist/index32.js.map +1 -1
- package/dist/index37.js +1 -1
- package/dist/index39.js +1 -1
- package/dist/index44.js +1 -1
- package/dist/index45.js +2 -2
- package/dist/index48.js +1 -1
- package/dist/index52.js +1 -1
- package/dist/index62.js +1 -1
- package/dist/index64.js +52 -60
- package/dist/index64.js.map +1 -1
- package/package.json +1 -1
- package/dist/index198.js +0 -26
- package/dist/index198.js.map +0 -1
- package/dist/index226.js +0 -7
- package/dist/index226.js.map +0 -1
- package/dist/index229.js +0 -25
- package/dist/index229.js.map +0 -1
package/dist/index45.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import t, { useState as m, useRef as h, useCallback as f, useEffect as x } from "react";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import g from "./
|
|
3
|
+
import g from "./index216.js";
|
|
4
4
|
import { Icon as T } from "./index5.js";
|
|
5
5
|
import { useStableId as E } from "./index190.js";
|
|
6
6
|
import { getA11yNameAttributes as ce } from "./index71.js";
|
|
7
|
-
import { useCombobox as se } from "./
|
|
7
|
+
import { useCombobox as se } from "./index199.js";
|
|
8
8
|
function c() {
|
|
9
9
|
return c = Object.assign ? Object.assign.bind() : function(s) {
|
|
10
10
|
for (var i = 1; i < arguments.length; i++) {
|
package/dist/index48.js
CHANGED
|
@@ -28,7 +28,7 @@ import { Popover as $ } from "./index18.js";
|
|
|
28
28
|
/* empty css */
|
|
29
29
|
/* empty css */
|
|
30
30
|
/* empty css */
|
|
31
|
-
import { TabButton as j } from "./
|
|
31
|
+
import { TabButton as j } from "./index219.js";
|
|
32
32
|
/* empty css */
|
|
33
33
|
/* empty css */
|
|
34
34
|
/* empty css */
|
package/dist/index52.js
CHANGED
package/dist/index62.js
CHANGED
|
@@ -2,7 +2,7 @@ import F, { useState as ot, useRef as X, useEffect as $ } from "react";
|
|
|
2
2
|
import { createPortal as nt } from "react-dom";
|
|
3
3
|
import { Icon as it } from "./index5.js";
|
|
4
4
|
import { Button as rt } from "./index3.js";
|
|
5
|
-
import { debounce as lt } from "./
|
|
5
|
+
import { debounce as lt } from "./index208.js";
|
|
6
6
|
const q = 500, S = 50, U = 150, st = {
|
|
7
7
|
"top-left": {
|
|
8
8
|
rotate: "315",
|
package/dist/index64.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import a
|
|
2
|
-
import { Button as
|
|
3
|
-
import { Badge as
|
|
4
|
-
import { Icon as
|
|
5
|
-
import { Link as
|
|
6
|
-
import { CustomModal as
|
|
7
|
-
import {
|
|
8
|
-
import { useStableId as T } from "./index190.js";
|
|
1
|
+
import a from "react";
|
|
2
|
+
import { Button as E } from "./index3.js";
|
|
3
|
+
import { Badge as j } from "./index9.js";
|
|
4
|
+
import { Icon as q } from "./index5.js";
|
|
5
|
+
import { Link as f } from "./index63.js";
|
|
6
|
+
import { CustomModal as G } from "./index12.js";
|
|
7
|
+
import { useStableId as J } from "./index190.js";
|
|
9
8
|
/* empty css */
|
|
10
|
-
const
|
|
9
|
+
const K = {
|
|
11
10
|
lg: {
|
|
12
11
|
width: "768px",
|
|
13
12
|
height: "500px"
|
|
@@ -16,44 +15,37 @@ const U = {
|
|
|
16
15
|
width: "656px",
|
|
17
16
|
height: "384px"
|
|
18
17
|
}
|
|
19
|
-
},
|
|
20
|
-
isOpen:
|
|
21
|
-
onClose:
|
|
18
|
+
}, ea = ({
|
|
19
|
+
isOpen: N,
|
|
20
|
+
onClose: n,
|
|
22
21
|
trigger: c,
|
|
23
|
-
modalWidth:
|
|
24
|
-
modalHeight:
|
|
25
|
-
variant:
|
|
22
|
+
modalWidth: u,
|
|
23
|
+
modalHeight: b,
|
|
24
|
+
variant: g,
|
|
26
25
|
size: t = "lg",
|
|
27
|
-
availabilityLabel:
|
|
26
|
+
availabilityLabel: x = "Available on ",
|
|
28
27
|
availabilityBadgeText: k,
|
|
29
|
-
title:
|
|
30
|
-
description:
|
|
28
|
+
title: C,
|
|
29
|
+
description: v,
|
|
31
30
|
learnMoreLinkText: r,
|
|
32
31
|
learnMoreHref: l,
|
|
33
32
|
onLearnMoreClick: o,
|
|
34
33
|
featureListDesc: s,
|
|
35
34
|
featuresList: I = [],
|
|
36
35
|
featureItemIcon: L,
|
|
37
|
-
mediaContent:
|
|
38
|
-
laterButtonText:
|
|
39
|
-
purchaseButtonText:
|
|
40
|
-
onLaterClick:
|
|
36
|
+
mediaContent: S,
|
|
37
|
+
laterButtonText: _,
|
|
38
|
+
purchaseButtonText: A,
|
|
39
|
+
onLaterClick: F,
|
|
41
40
|
onPurchaseClick: P,
|
|
42
41
|
className: $ = "",
|
|
43
42
|
modalContentClassName: B = "",
|
|
44
43
|
automationId: i = "",
|
|
45
44
|
id: D
|
|
46
45
|
}) => {
|
|
47
|
-
const m =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
containerRef: m,
|
|
51
|
-
restoreFocus: !0,
|
|
52
|
-
initialFocus: ".paywall-card-btn-later"
|
|
53
|
-
});
|
|
54
|
-
const z = () => {
|
|
55
|
-
A?.(), N();
|
|
56
|
-
}, d = U[t], W = b ?? d.width, y = g ?? d.height, w = x === "with-points" && t === "lg", h = I.map((e) => typeof e == "string" ? {
|
|
46
|
+
const m = J(D, "paywall-title"), z = () => {
|
|
47
|
+
F?.(), n();
|
|
48
|
+
}, p = K[t], O = u ?? p.width, d = b ?? p.height, y = g === "with-points" && t === "lg", w = I.map((e) => typeof e == "string" ? {
|
|
57
49
|
text: e
|
|
58
50
|
} : {
|
|
59
51
|
text: e.text,
|
|
@@ -61,10 +53,10 @@ const U = {
|
|
|
61
53
|
href: e.href,
|
|
62
54
|
external: e.external,
|
|
63
55
|
onLinkClick: e.onLinkClick
|
|
64
|
-
}),
|
|
56
|
+
}), R = y && w.length > 0, W = L ?? /* @__PURE__ */ a.createElement(q, {
|
|
65
57
|
name: "info",
|
|
66
58
|
rotation: "180"
|
|
67
|
-
}),
|
|
59
|
+
}), Y = /* @__PURE__ */ a.createElement("section", {
|
|
68
60
|
className: `paywall paywall-ctn paywall-ctn--${t} ${$}`,
|
|
69
61
|
"data-automation-id": i
|
|
70
62
|
}, /* @__PURE__ */ a.createElement("div", {
|
|
@@ -75,17 +67,17 @@ const U = {
|
|
|
75
67
|
className: "paywall-card-availability"
|
|
76
68
|
}, /* @__PURE__ */ a.createElement("span", {
|
|
77
69
|
className: "paywall-card-availability-label"
|
|
78
|
-
},
|
|
70
|
+
}, x), /* @__PURE__ */ a.createElement(j, {
|
|
79
71
|
label: k,
|
|
80
72
|
className: "paywall-card-badge",
|
|
81
73
|
bgColor: "var(--color-yellow-100)",
|
|
82
74
|
textColor: "var(--color-yellow-700)"
|
|
83
75
|
})), /* @__PURE__ */ a.createElement("h3", {
|
|
84
|
-
id:
|
|
76
|
+
id: m,
|
|
85
77
|
className: "paywall-card-title"
|
|
86
|
-
},
|
|
78
|
+
}, C), /* @__PURE__ */ a.createElement("p", {
|
|
87
79
|
className: "paywall-card-description"
|
|
88
|
-
},
|
|
80
|
+
}, v, r && (l || o) && /* @__PURE__ */ a.createElement(f, {
|
|
89
81
|
href: l ?? "#",
|
|
90
82
|
label: r,
|
|
91
83
|
external: !!l,
|
|
@@ -93,64 +85,64 @@ const U = {
|
|
|
93
85
|
onClick: (e) => {
|
|
94
86
|
l || e.preventDefault(), o?.(e);
|
|
95
87
|
}
|
|
96
|
-
})),
|
|
88
|
+
})), y && s && /* @__PURE__ */ a.createElement("p", {
|
|
97
89
|
className: "paywall-card-features-intro"
|
|
98
|
-
}, s),
|
|
90
|
+
}, s), R && /* @__PURE__ */ a.createElement("ul", {
|
|
99
91
|
className: "paywall-card-features-list"
|
|
100
|
-
},
|
|
92
|
+
}, w.map((e) => /* @__PURE__ */ a.createElement("li", {
|
|
101
93
|
key: e.text,
|
|
102
94
|
className: "paywall-card-feature-item"
|
|
103
95
|
}, /* @__PURE__ */ a.createElement("span", {
|
|
104
96
|
className: "paywall-card-feature-icon",
|
|
105
97
|
"aria-hidden": !0
|
|
106
|
-
}, e.icon ??
|
|
98
|
+
}, e.icon ?? W), /* @__PURE__ */ a.createElement("span", null, e.href || e.onLinkClick ? /* @__PURE__ */ a.createElement(f, {
|
|
107
99
|
href: e.href ?? "#",
|
|
108
100
|
label: e.text,
|
|
109
101
|
external: e.external,
|
|
110
|
-
onClick: (
|
|
111
|
-
e.href ||
|
|
102
|
+
onClick: (h) => {
|
|
103
|
+
e.href || h.preventDefault(), e.onLinkClick?.(h);
|
|
112
104
|
}
|
|
113
105
|
}) : e.text)))), /* @__PURE__ */ a.createElement("div", {
|
|
114
106
|
className: "paywall-card-actions"
|
|
115
|
-
}, /* @__PURE__ */ a.createElement(
|
|
107
|
+
}, /* @__PURE__ */ a.createElement(E, {
|
|
116
108
|
type: "ghost",
|
|
117
109
|
size: "md",
|
|
118
|
-
label:
|
|
110
|
+
label: _,
|
|
119
111
|
onClick: z,
|
|
120
112
|
className: "paywall-card-btn-later"
|
|
121
|
-
}), /* @__PURE__ */ a.createElement(
|
|
113
|
+
}), /* @__PURE__ */ a.createElement(E, {
|
|
122
114
|
type: "primary",
|
|
123
115
|
size: "md",
|
|
124
|
-
label:
|
|
116
|
+
label: A,
|
|
125
117
|
onClick: P,
|
|
126
118
|
className: "paywall-card-btn-purchase"
|
|
127
119
|
}))), /* @__PURE__ */ a.createElement("div", {
|
|
128
120
|
className: "paywall-card-media"
|
|
129
|
-
},
|
|
130
|
-
ref: m,
|
|
121
|
+
}, S))), Z = /* @__PURE__ */ a.createElement("div", {
|
|
131
122
|
role: "dialog",
|
|
132
123
|
"aria-modal": "true",
|
|
133
|
-
"aria-labelledby":
|
|
124
|
+
"aria-labelledby": m,
|
|
134
125
|
className: `paywall-modal-content ${B}`,
|
|
135
126
|
style: {
|
|
136
|
-
height:
|
|
137
|
-
minHeight:
|
|
127
|
+
height: d,
|
|
128
|
+
minHeight: d
|
|
138
129
|
}
|
|
139
|
-
},
|
|
130
|
+
}, Y);
|
|
140
131
|
return /* @__PURE__ */ a.createElement(a.Fragment, null, c && /* @__PURE__ */ a.createElement("span", {
|
|
141
132
|
className: "paywall-trigger"
|
|
142
|
-
}, c), /* @__PURE__ */ a.createElement(
|
|
143
|
-
isOpen:
|
|
133
|
+
}, c), /* @__PURE__ */ a.createElement(G, {
|
|
134
|
+
isOpen: N,
|
|
135
|
+
onClose: n,
|
|
144
136
|
onModalClick: () => {
|
|
145
137
|
},
|
|
146
|
-
renderModalContent: () =>
|
|
147
|
-
width:
|
|
138
|
+
renderModalContent: () => Z,
|
|
139
|
+
width: O,
|
|
148
140
|
contentClassName: "paywall-modal-content-wrapper",
|
|
149
141
|
automationId: i
|
|
150
142
|
}));
|
|
151
143
|
};
|
|
152
144
|
export {
|
|
153
|
-
|
|
154
|
-
|
|
145
|
+
ea as Paywall,
|
|
146
|
+
ea as default
|
|
155
147
|
};
|
|
156
148
|
//# sourceMappingURL=index64.js.map
|
package/dist/index64.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index64.js","sources":["../src/components/Paywall/index.tsx"],"sourcesContent":["import React, { FC, ReactNode, useRef } from 'react';\nimport { Button } from 'src/components/Button';\nimport { Badge } from 'src/components/Badge';\nimport { Icon } from 'src/components/Icon';\nimport { Link } from 'src/components/Link';\nimport { CustomModal } from 'src/components/CustomModal';\nimport { useFocusTrap } from 'src/utils/a11y';\nimport { useStableId } from 'src/utils/useStableId';\nimport './style.scss';\n\n/** Variant: with bullet points list, or description only */\nexport type PaywallVariant = 'with-points' | 'description-only';\n\n/** Size: small (656×384) or large (768×500) – sets modal dimensions and media panel proportion */\nexport type PaywallSize = 'sm' | 'lg';\n\n/** Feature list item: plain string (uses default/list icon) or object with text, optional per-item icon, and optional link/action */\nexport type PaywallFeatureItem =\n | string\n | {\n text: string;\n icon?: ReactNode;\n /** If provided, the feature text becomes a hyperlink navigating to this URL */\n href?: string;\n /** If true, opens the href in a new tab (only applicable when href is set) */\n external?: boolean;\n /** Click handler — use with href for analytics, or alone for SPA actions */\n onLinkClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n };\n\nconst PAYWALL_SIZE_DIMENSIONS: Record<PaywallSize, { width: string; height: string }> = {\n lg: { width: '768px', height: '500px' },\n sm: { width: '656px', height: '384px' },\n};\n\nexport interface PaywallProps {\n isOpen: boolean;\n onClose: () => void;\n trigger?: ReactNode;\n modalWidth?: string;\n modalHeight?: string;\n variant: PaywallVariant;\n size?: PaywallSize;\n availabilityLabel?: string;\n availabilityBadgeText: string;\n title: string;\n description: string;\n learnMoreLinkText?: string;\n learnMoreHref?: string;\n onLearnMoreClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n featureListDesc?: string;\n featuresList?: PaywallFeatureItem[];\n featureItemIcon?: ReactNode;\n mediaContent?: ReactNode;\n laterButtonText: string;\n purchaseButtonText: string;\n onLaterClick?: () => void;\n onPurchaseClick?: () => void;\n className?: string;\n modalContentClassName?: string;\n automationId?: string;\n id?: string;\n}\n\n/** Paywall – always shown in a modal. Pass isOpen/onClose and optionally a trigger. */\nexport const Paywall: FC<PaywallProps> = ({\n isOpen,\n onClose,\n trigger,\n modalWidth,\n modalHeight,\n variant,\n size = 'lg',\n availabilityLabel = 'Available on ',\n availabilityBadgeText,\n title,\n description,\n learnMoreLinkText,\n learnMoreHref,\n onLearnMoreClick,\n featureListDesc,\n featuresList = [],\n featureItemIcon,\n mediaContent,\n laterButtonText,\n purchaseButtonText,\n onLaterClick,\n onPurchaseClick,\n className = '',\n modalContentClassName = '',\n automationId = '',\n id: providedId,\n}) => {\n const modalRef = useRef<HTMLDivElement>(null);\n const titleId = useStableId(providedId, 'paywall-title');\n\n useFocusTrap({\n enabled: isOpen,\n containerRef: modalRef,\n restoreFocus: true,\n initialFocus: '.paywall-card-btn-later',\n });\n\n const handleLaterClick = () => {\n onLaterClick?.();\n onClose();\n };\n\n const dimensions = PAYWALL_SIZE_DIMENSIONS[size];\n const width = modalWidth ?? dimensions.width;\n const height = modalHeight ?? dimensions.height;\n\n const withPoints = variant === 'with-points' && size === 'lg';\n const normalizedFeatures = featuresList.map((item): { text: string; icon?: ReactNode; href?: string; external?: boolean; onLinkClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void } =>\n typeof item === 'string'\n ? { text: item }\n : { text: item.text, icon: item.icon, href: item.href, external: item.external, onLinkClick: item.onLinkClick }\n );\n const showFeatures = withPoints && normalizedFeatures.length > 0;\n const defaultIcon = featureItemIcon ?? <Icon name=\"info\" rotation='180'/>;\n\n const content = (\n <section\n className={`paywall paywall-ctn paywall-ctn--${size} ${className}`}\n data-automation-id={automationId}\n >\n <div className=\"paywall-card\">\n <div className=\"paywall-card-content\">\n <span className=\"paywall-card-availability\">\n <span className=\"paywall-card-availability-label\">{availabilityLabel}</span>\n <Badge\n label={availabilityBadgeText}\n className=\"paywall-card-badge\"\n bgColor=\"var(--color-yellow-100)\"\n textColor=\"var(--color-yellow-700)\"\n />\n </span>\n <h3 id={titleId} className=\"paywall-card-title\">{title}</h3>\n <p className=\"paywall-card-description\">\n {description}\n {learnMoreLinkText && (learnMoreHref || onLearnMoreClick) && (\n <Link\n href={learnMoreHref ?? '#'}\n label={learnMoreLinkText}\n external={!!learnMoreHref}\n className=\"paywall-card-learn-more\"\n onClick={(e) => { if (!learnMoreHref) { e.preventDefault(); } onLearnMoreClick?.(e); }}\n />\n )}\n </p>\n {withPoints && featureListDesc && (\n <p className=\"paywall-card-features-intro\">{featureListDesc}</p>\n )}\n {showFeatures && (\n <ul className=\"paywall-card-features-list\">\n {normalizedFeatures.map((item) => (\n <li key={item.text} className=\"paywall-card-feature-item\">\n <span className=\"paywall-card-feature-icon\" aria-hidden>\n {item.icon ?? defaultIcon}\n </span>\n <span>\n {item.href || item.onLinkClick ? (\n <Link\n href={item.href ?? '#'}\n label={item.text}\n external={item.external}\n onClick={(e) => { if (!item.href) { e.preventDefault(); } item.onLinkClick?.(e); }}\n />\n ) : (\n item.text\n )}\n </span>\n </li>\n ))}\n </ul>\n )}\n <div className=\"paywall-card-actions\">\n <Button\n type=\"ghost\"\n size=\"md\"\n label={laterButtonText}\n onClick={handleLaterClick}\n className=\"paywall-card-btn-later\"\n />\n <Button\n type=\"primary\"\n size=\"md\"\n label={purchaseButtonText}\n onClick={onPurchaseClick}\n className=\"paywall-card-btn-purchase\"\n />\n </div>\n </div>\n <div className=\"paywall-card-media\">\n {mediaContent}\n </div>\n </div>\n </section>\n );\n\n const modalContent = (\n <div\n ref={modalRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={`paywall-modal-content ${modalContentClassName}`}\n style={{ height, minHeight: height }}\n >\n {content}\n </div>\n );\n\n return (\n <>\n {trigger && <span className=\"paywall-trigger\">{trigger}</span>}\n <CustomModal\n isOpen={isOpen}\n onModalClick={() => {}}\n renderModalContent={() => modalContent}\n width={width}\n contentClassName=\"paywall-modal-content-wrapper\"\n automationId={automationId}\n />\n </>\n );\n};\n\nexport default Paywall;\n"],"names":["React__default","useRef","Button","Badge","Icon","Link","CustomModal","useFocusTrap","useStableId","PAYWALL_SIZE_DIMENSIONS","lg","width","height","sm","Paywall","isOpen","onClose","trigger","modalWidth","modalHeight","variant","size","availabilityLabel","availabilityBadgeText","title","description","learnMoreLinkText","learnMoreHref","onLearnMoreClick","featureListDesc","featuresList","featureItemIcon","mediaContent","laterButtonText","purchaseButtonText","onLaterClick","onPurchaseClick","className","modalContentClassName","automationId","id","providedId","modalRef","titleId","enabled","containerRef","restoreFocus","initialFocus","handleLaterClick","dimensions","withPoints","normalizedFeatures","map","item","text","icon","href","external","onLinkClick","showFeatures","length","defaultIcon","React","createElement","name","rotation","content","label","bgColor","textColor","onClick","e","preventDefault","key","type","modalContent","ref","role","style","minHeight","Fragment","onModalClick","renderModalContent","contentClassName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index64.js","sources":["../src/components/Paywall/index.tsx"],"sourcesContent":["import React, { FC, ReactNode } from 'react';\nimport { Button } from 'src/components/Button';\nimport { Badge } from 'src/components/Badge';\nimport { Icon } from 'src/components/Icon';\nimport { Link } from 'src/components/Link';\nimport { CustomModal } from 'src/components/CustomModal';\nimport { useStableId } from 'src/utils/useStableId';\nimport './style.scss';\n\n/** Variant: with bullet points list, or description only */\nexport type PaywallVariant = 'with-points' | 'description-only';\n\n/** Size: small (656×384) or large (768×500) – sets modal dimensions and media panel proportion */\nexport type PaywallSize = 'sm' | 'lg';\n\n/** Feature list item: plain string (uses default/list icon) or object with text, optional per-item icon, and optional link/action */\nexport type PaywallFeatureItem =\n | string\n | {\n text: string;\n icon?: ReactNode;\n /** If provided, the feature text becomes a hyperlink navigating to this URL */\n href?: string;\n /** If true, opens the href in a new tab (only applicable when href is set) */\n external?: boolean;\n /** Click handler — use with href for analytics, or alone for SPA actions */\n onLinkClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n };\n\nconst PAYWALL_SIZE_DIMENSIONS: Record<PaywallSize, { width: string; height: string }> = {\n lg: { width: '768px', height: '500px' },\n sm: { width: '656px', height: '384px' },\n};\n\nexport interface PaywallProps {\n isOpen: boolean;\n onClose: () => void;\n trigger?: ReactNode;\n modalWidth?: string;\n modalHeight?: string;\n variant: PaywallVariant;\n size?: PaywallSize;\n availabilityLabel?: string;\n availabilityBadgeText: string;\n title: string;\n description: string;\n learnMoreLinkText?: string;\n learnMoreHref?: string;\n onLearnMoreClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n featureListDesc?: string;\n featuresList?: PaywallFeatureItem[];\n featureItemIcon?: ReactNode;\n mediaContent?: ReactNode;\n laterButtonText: string;\n purchaseButtonText: string;\n onLaterClick?: () => void;\n onPurchaseClick?: () => void;\n className?: string;\n modalContentClassName?: string;\n automationId?: string;\n id?: string;\n}\n\n/** Paywall – always shown in a modal. Pass isOpen/onClose and optionally a trigger. */\nexport const Paywall: FC<PaywallProps> = ({\n isOpen,\n onClose,\n trigger,\n modalWidth,\n modalHeight,\n variant,\n size = 'lg',\n availabilityLabel = 'Available on ',\n availabilityBadgeText,\n title,\n description,\n learnMoreLinkText,\n learnMoreHref,\n onLearnMoreClick,\n featureListDesc,\n featuresList = [],\n featureItemIcon,\n mediaContent,\n laterButtonText,\n purchaseButtonText,\n onLaterClick,\n onPurchaseClick,\n className = '',\n modalContentClassName = '',\n automationId = '',\n id: providedId,\n}) => {\n const titleId = useStableId(providedId, 'paywall-title');\n\n const handleLaterClick = () => {\n onLaterClick?.();\n onClose();\n };\n\n const dimensions = PAYWALL_SIZE_DIMENSIONS[size];\n const width = modalWidth ?? dimensions.width;\n const height = modalHeight ?? dimensions.height;\n\n const withPoints = variant === 'with-points' && size === 'lg';\n const normalizedFeatures = featuresList.map((item): { text: string; icon?: ReactNode; href?: string; external?: boolean; onLinkClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void } =>\n typeof item === 'string'\n ? { text: item }\n : { text: item.text, icon: item.icon, href: item.href, external: item.external, onLinkClick: item.onLinkClick }\n );\n const showFeatures = withPoints && normalizedFeatures.length > 0;\n const defaultIcon = featureItemIcon ?? <Icon name=\"info\" rotation='180'/>;\n\n const content = (\n <section\n className={`paywall paywall-ctn paywall-ctn--${size} ${className}`}\n data-automation-id={automationId}\n >\n <div className=\"paywall-card\">\n <div className=\"paywall-card-content\">\n <span className=\"paywall-card-availability\">\n <span className=\"paywall-card-availability-label\">{availabilityLabel}</span>\n <Badge\n label={availabilityBadgeText}\n className=\"paywall-card-badge\"\n bgColor=\"var(--color-yellow-100)\"\n textColor=\"var(--color-yellow-700)\"\n />\n </span>\n <h3 id={titleId} className=\"paywall-card-title\">{title}</h3>\n <p className=\"paywall-card-description\">\n {description}\n {learnMoreLinkText && (learnMoreHref || onLearnMoreClick) && (\n <Link\n href={learnMoreHref ?? '#'}\n label={learnMoreLinkText}\n external={!!learnMoreHref}\n className=\"paywall-card-learn-more\"\n onClick={(e) => { if (!learnMoreHref) { e.preventDefault(); } onLearnMoreClick?.(e); }}\n />\n )}\n </p>\n {withPoints && featureListDesc && (\n <p className=\"paywall-card-features-intro\">{featureListDesc}</p>\n )}\n {showFeatures && (\n <ul className=\"paywall-card-features-list\">\n {normalizedFeatures.map((item) => (\n <li key={item.text} className=\"paywall-card-feature-item\">\n <span className=\"paywall-card-feature-icon\" aria-hidden>\n {item.icon ?? defaultIcon}\n </span>\n <span>\n {item.href || item.onLinkClick ? (\n <Link\n href={item.href ?? '#'}\n label={item.text}\n external={item.external}\n onClick={(e) => { if (!item.href) { e.preventDefault(); } item.onLinkClick?.(e); }}\n />\n ) : (\n item.text\n )}\n </span>\n </li>\n ))}\n </ul>\n )}\n <div className=\"paywall-card-actions\">\n <Button\n type=\"ghost\"\n size=\"md\"\n label={laterButtonText}\n onClick={handleLaterClick}\n className=\"paywall-card-btn-later\"\n />\n <Button\n type=\"primary\"\n size=\"md\"\n label={purchaseButtonText}\n onClick={onPurchaseClick}\n className=\"paywall-card-btn-purchase\"\n />\n </div>\n </div>\n <div className=\"paywall-card-media\">\n {mediaContent}\n </div>\n </div>\n </section>\n );\n\n const modalContent = (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={`paywall-modal-content ${modalContentClassName}`}\n style={{ height, minHeight: height }}\n >\n {content}\n </div>\n );\n\n return (\n <>\n {trigger && <span className=\"paywall-trigger\">{trigger}</span>}\n <CustomModal\n isOpen={isOpen}\n onClose={onClose}\n onModalClick={() => {}}\n renderModalContent={() => modalContent}\n width={width}\n contentClassName=\"paywall-modal-content-wrapper\"\n automationId={automationId}\n />\n </>\n );\n};\n\nexport default Paywall;\n"],"names":["React__default","Button","Badge","Icon","Link","CustomModal","useStableId","PAYWALL_SIZE_DIMENSIONS","lg","width","height","sm","Paywall","isOpen","onClose","trigger","modalWidth","modalHeight","variant","size","availabilityLabel","availabilityBadgeText","title","description","learnMoreLinkText","learnMoreHref","onLearnMoreClick","featureListDesc","featuresList","featureItemIcon","mediaContent","laterButtonText","purchaseButtonText","onLaterClick","onPurchaseClick","className","modalContentClassName","automationId","id","providedId","titleId","handleLaterClick","dimensions","withPoints","normalizedFeatures","map","item","text","icon","href","external","onLinkClick","showFeatures","length","defaultIcon","React","createElement","name","rotation","content","label","bgColor","textColor","onClick","e","preventDefault","key","type","modalContent","role","style","minHeight","Fragment","onModalClick","renderModalContent","contentClassName"],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/index198.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { useEffect as d } from "react";
|
|
2
|
-
function p({
|
|
3
|
-
containerRef: r,
|
|
4
|
-
onDismiss: e,
|
|
5
|
-
enabled: n = !0,
|
|
6
|
-
preventDefault: u = !0,
|
|
7
|
-
stopPropagation: c = !0
|
|
8
|
-
}) {
|
|
9
|
-
d(() => {
|
|
10
|
-
if (!n || !e) return;
|
|
11
|
-
const o = r.current;
|
|
12
|
-
if (!o) return;
|
|
13
|
-
const a = (t) => {
|
|
14
|
-
t.key === "Escape" && o.contains(document.activeElement) && (u && t.preventDefault(), c && t.stopPropagation(), e());
|
|
15
|
-
};
|
|
16
|
-
return document.addEventListener("keydown", a, {
|
|
17
|
-
capture: !0
|
|
18
|
-
}), () => document.removeEventListener("keydown", a, {
|
|
19
|
-
capture: !0
|
|
20
|
-
});
|
|
21
|
-
}, [n, e, r, u, c]);
|
|
22
|
-
}
|
|
23
|
-
export {
|
|
24
|
-
p as useDismissOnEscape
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=index198.js.map
|
package/dist/index198.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index198.js","sources":["../src/utils/a11y/useDismissOnEscape.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { RefObject } from 'react';\n\nexport interface UseDismissOnEscapeOptions<T extends HTMLElement = HTMLElement> {\n /**\n * Container element ref to check if focus is within.\n * Escape will only trigger if focus is within this container.\n */\n containerRef: RefObject<T | null>;\n /**\n * Callback when Escape key is pressed and focus is within container.\n */\n onDismiss?: () => void;\n /**\n * Whether the Escape handler is active.\n * Default: true\n */\n enabled?: boolean;\n /**\n * Whether to call preventDefault() when handling Escape.\n * Default: true\n */\n preventDefault?: boolean;\n /**\n * Whether to call stopPropagation() when handling Escape.\n * Default: true\n */\n stopPropagation?: boolean;\n}\n\n/**\n * Hook to handle Escape key dismissal when focus is within a container.\n * \n * This is a UX pattern: if user is interacting with an overlay/sidebar\n * (indicated by focus being within it), Escape should close it.\n * \n * @example\n * ```tsx\n * const MySidebar = ({ isOpen, onClose }) => {\n * const containerRef = useRef<HTMLDivElement>(null);\n * \n * useDismissOnEscape({\n * containerRef,\n * onDismiss: onClose,\n * enabled: isOpen\n * });\n * \n * return <div ref={containerRef}>...</div>;\n * };\n * ```\n */\nexport function useDismissOnEscape<T extends HTMLElement = HTMLElement>({\n containerRef,\n onDismiss,\n enabled = true,\n preventDefault = true,\n stopPropagation = true\n}: UseDismissOnEscapeOptions<T>): void {\n useEffect(() => {\n if (!enabled || !onDismiss) return;\n \n const container = containerRef.current;\n if (!container) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && container.contains(document.activeElement)) {\n preventDefault && e.preventDefault();\n stopPropagation && e.stopPropagation();\n onDismiss();\n }\n };\n\n document.addEventListener('keydown', handleEscape, { capture: true });\n return () => document.removeEventListener('keydown', handleEscape, { capture: true });\n }, [enabled, onDismiss, containerRef, preventDefault, stopPropagation]);\n}\n"],"names":["useEffect","useDismissOnEscape","containerRef","onDismiss","enabled","preventDefault","stopPropagation","container","current","handleEscape","e","key","contains","document","activeElement","addEventListener","capture","removeEventListener"],"mappings":"AAmDO,SAAA,aAAAA,SAAA;AAAA,SAASC,EAAwD;AAAA,EACtEC,cAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,SAAAA,IAAU;AAAA,EACVC,gBAAAA,IAAiB;AAAA,EACjBC,iBAAAA,IAAkB;AACU,GAAS;AACrCN,EAAAA,EAAU,MAAM;AACd,QAAI,CAACI,KAAW,CAACD,EAAW;AAE5B,UAAMI,IAAYL,EAAaM;AAC/B,QAAI,CAACD,EAAW;AAEhB,UAAME,IAAeA,CAACC,MAAqB;AACzC,MAAIA,EAAEC,QAAQ,YAAYJ,EAAUK,SAASC,SAASC,aAAa,MACjET,KAAkBK,EAAEL,eAAAA,GACpBC,KAAmBI,EAAEJ,gBAAAA,GACrBH,EAAAA;AAAAA,IAEJ;AAEAU,oBAASE,iBAAiB,WAAWN,GAAc;AAAA,MAAEO,SAAS;AAAA,IAAA,CAAM,GAC7D,MAAMH,SAASI,oBAAoB,WAAWR,GAAc;AAAA,MAAEO,SAAS;AAAA,IAAA,CAAM;AAAA,EACtF,GAAG,CAACZ,GAASD,GAAWD,GAAcG,GAAgBC,CAAe,CAAC;AACxE;"}
|
package/dist/index226.js
DELETED
package/dist/index226.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index226.js","sources":["../src/utils/delay.ts"],"sourcesContent":["/**\n * Delays execution by the specified number of milliseconds\n * @param ms - The number of milliseconds to delay\n * @returns A Promise that resolves after the specified delay\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n} "],"names":["delay","ms","Promise","resolve","setTimeout"],"mappings":"AAKO,SAASA,EAAMC,GAA2B;AAC7C,SAAO,IAAIC,QAAQC,CAAAA,MAAWC,WAAWD,GAASF,CAAE,CAAC;AACzD;"}
|
package/dist/index229.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const l = ["button:not([disabled])", "[href]", "input:not([disabled])", "select:not([disabled])", "textarea:not([disabled])", '[tabindex]:not([tabindex="-1"]):not([disabled])', '[contenteditable="true"]'].join(", "), a = [l, '[role="menuitem"]', '[role="option"]', '[role="menuitemcheckbox"]', '[role="menuitemradio"]'].join(", ");
|
|
2
|
-
function u({
|
|
3
|
-
container: e,
|
|
4
|
-
includeRoles: t = !1,
|
|
5
|
-
additionalSelectors: r = [],
|
|
6
|
-
filterHidden: s = !1
|
|
7
|
-
}) {
|
|
8
|
-
if (!e) return [];
|
|
9
|
-
const d = [t ? a : l, ...r].filter(Boolean).join(", "), i = Array.from(e.querySelectorAll(d));
|
|
10
|
-
return s ? i.filter((n) => {
|
|
11
|
-
const o = window.getComputedStyle(n);
|
|
12
|
-
return o.display !== "none" && o.visibility !== "hidden" && o.opacity !== "0" && !n.hasAttribute("hidden") && n.offsetWidth > 0 && n.offsetHeight > 0;
|
|
13
|
-
}) : i;
|
|
14
|
-
}
|
|
15
|
-
function c(e) {
|
|
16
|
-
const t = u(e);
|
|
17
|
-
return t.length > 0 ? t[0] : null;
|
|
18
|
-
}
|
|
19
|
-
export {
|
|
20
|
-
l as FOCUSABLE_SELECTOR,
|
|
21
|
-
a as FOCUSABLE_WITH_ROLES_SELECTOR,
|
|
22
|
-
c as getFirstFocusableElement,
|
|
23
|
-
u as getFocusableElements
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=index229.js.map
|
package/dist/index229.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index229.js","sources":["../src/utils/a11y/focusableElements.ts"],"sourcesContent":["/**\n * Utilities for finding focusable elements within a container.\n * \n * Used for focus management in modals, popovers, and other interactive overlays.\n */\n\n/**\n * Base selector for standard focusable elements.\n * Matches: buttons, links, inputs, selects, textareas, elements with tabindex >= 0, contenteditable.\n */\nexport const FOCUSABLE_SELECTOR = [\n 'button:not([disabled])',\n '[href]',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])',\n '[contenteditable=\"true\"]'\n].join(', ');\n\n/**\n * Extended selector that includes ARIA role-based focusable elements.\n * Useful for composite widgets like menus, listboxes, etc.\n */\nexport const FOCUSABLE_WITH_ROLES_SELECTOR = [\n FOCUSABLE_SELECTOR,\n '[role=\"menuitem\"]',\n '[role=\"option\"]',\n '[role=\"menuitemcheckbox\"]',\n '[role=\"menuitemradio\"]'\n].join(', ');\n\n/**\n * Options for getFocusableElements\n */\nexport interface GetFocusableElementsOptions {\n /**\n * Container element to search within. If null/undefined, returns empty array.\n */\n container: HTMLElement | null;\n /**\n * Whether to include role-based focusable elements (menuitem, option, etc.).\n * Default: false (uses base selector only)\n */\n includeRoles?: boolean;\n /**\n * Additional custom selectors to include.\n */\n additionalSelectors?: string[];\n /**\n * Whether to filter out hidden/invisible elements.\n * Default: false (returns all matching elements regardless of visibility)\n */\n filterHidden?: boolean;\n}\n\n/**\n * Get all focusable elements within a container.\n * \n * @example Basic usage (standard focusable elements)\n * ```ts\n * const focusables = getFocusableElements({ container: dialogRef.current });\n * focusables[0]?.focus(); // Focus first element\n * ```\n * \n * @example With role-based elements (for menus/listboxes)\n * ```ts\n * const focusables = getFocusableElements({ \n * container: menuRef.current,\n * includeRoles: true \n * });\n * ```\n * \n * @example With custom selectors\n * ```ts\n * const focusables = getFocusableElements({ \n * container: customWidgetRef.current,\n * additionalSelectors: ['[data-focusable=\"true\"]']\n * });\n * ```\n */\nexport function getFocusableElements({\n container,\n includeRoles = false,\n additionalSelectors = [],\n filterHidden = false\n}: GetFocusableElementsOptions): HTMLElement[] {\n if (!container) return [];\n\n const selector = [\n includeRoles ? FOCUSABLE_WITH_ROLES_SELECTOR : FOCUSABLE_SELECTOR,\n ...additionalSelectors\n ].filter(Boolean).join(', ');\n\n const elements = Array.from(container.querySelectorAll<HTMLElement>(selector));\n\n if (!filterHidden) return elements;\n\n // Filter out hidden/invisible elements\n return elements.filter((el) => {\n const style = window.getComputedStyle(el);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0' &&\n !el.hasAttribute('hidden') &&\n el.offsetWidth > 0 &&\n el.offsetHeight > 0\n );\n });\n}\n\n/**\n * Get the first focusable element in a container.\n * Returns null if none found.\n */\nexport function getFirstFocusableElement(\n options: GetFocusableElementsOptions\n): HTMLElement | null {\n const focusables = getFocusableElements(options);\n return focusables.length > 0 ? focusables[0] : null;\n}\n\n/**\n * Get the last focusable element in a container.\n * Returns null if none found.\n */\nexport function getLastFocusableElement(\n options: GetFocusableElementsOptions\n): HTMLElement | null {\n const focusables = getFocusableElements(options);\n return focusables.length > 0 ? focusables[focusables.length - 1] : null;\n}\n"],"names":["FOCUSABLE_SELECTOR","join","FOCUSABLE_WITH_ROLES_SELECTOR","getFocusableElements","container","includeRoles","additionalSelectors","filterHidden","selector","filter","Boolean","elements","Array","from","querySelectorAll","el","style","window","getComputedStyle","display","visibility","opacity","hasAttribute","offsetWidth","offsetHeight","getFirstFocusableElement","options","focusables","length"],"mappings":"AAUO,MAAMA,IAAqB,CAChC,0BACA,UACA,yBACA,0BACA,4BACA,mDACA,0BAA0B,EAC1BC,KAAK,IAAI,GAMEC,IAAgC,CAC3CF,GACA,qBACA,mBACA,6BACA,wBAAwB,EACxBC,KAAK,IAAI;AAmDJ,SAASE,EAAqB;AAAA,EACnCC,WAAAA;AAAAA,EACAC,cAAAA,IAAe;AAAA,EACfC,qBAAAA,IAAsB,CAAA;AAAA,EACtBC,cAAAA,IAAe;AACY,GAAkB;AAC7C,MAAI,CAACH,EAAW,QAAO,CAAA;AAEvB,QAAMI,IAAW,CACfH,IAAeH,IAAgCF,GAC/C,GAAGM,CAAmB,EACtBG,OAAOC,OAAO,EAAET,KAAK,IAAI,GAErBU,IAAWC,MAAMC,KAAKT,EAAUU,iBAA8BN,CAAQ,CAAC;AAE7E,SAAKD,IAGEI,EAASF,OAAQM,CAAAA,MAAO;AAC7B,UAAMC,IAAQC,OAAOC,iBAAiBH,CAAE;AACxC,WACEC,EAAMG,YAAY,UAClBH,EAAMI,eAAe,YACrBJ,EAAMK,YAAY,OAClB,CAACN,EAAGO,aAAa,QAAQ,KACzBP,EAAGQ,cAAc,KACjBR,EAAGS,eAAe;AAAA,EAEtB,CAAC,IAbyBb;AAc5B;AAMO,SAASc,EACdC,GACoB;AACpB,QAAMC,IAAaxB,EAAqBuB,CAAO;AAC/C,SAAOC,EAAWC,SAAS,IAAID,EAAW,CAAC,IAAI;AACjD;"}
|