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.
Files changed (101) hide show
  1. package/dist/components/CustomModal/index.d.ts +16 -0
  2. package/dist/components/MenuList/index.d.ts +3 -2
  3. package/dist/components/Modal/index.d.ts +1 -0
  4. package/dist/components/Popover/index.d.ts +2 -2
  5. package/dist/index11.js +53 -38
  6. package/dist/index11.js.map +1 -1
  7. package/dist/index12.js +30 -18
  8. package/dist/index12.js.map +1 -1
  9. package/dist/index15.js +1 -1
  10. package/dist/index17.js +36 -33
  11. package/dist/index17.js.map +1 -1
  12. package/dist/index18.js +129 -124
  13. package/dist/index18.js.map +1 -1
  14. package/dist/index188.js +5 -5
  15. package/dist/index192.js +43 -0
  16. package/dist/index192.js.map +1 -0
  17. package/dist/index193.js +62 -0
  18. package/dist/index193.js.map +1 -0
  19. package/dist/index194.js +20 -21
  20. package/dist/index194.js.map +1 -1
  21. package/dist/index197.js +27 -0
  22. package/dist/index197.js.map +1 -0
  23. package/dist/{index196.js → index199.js} +3 -3
  24. package/dist/{index196.js.map → index199.js.map} +1 -1
  25. package/dist/{index206.js → index208.js} +1 -1
  26. package/dist/{index206.js.map → index208.js.map} +1 -1
  27. package/dist/{index214.js → index216.js} +1 -1
  28. package/dist/{index214.js.map → index216.js.map} +1 -1
  29. package/dist/{index217.js → index219.js} +1 -1
  30. package/dist/{index217.js.map → index219.js.map} +1 -1
  31. package/dist/index228.js +3 -58
  32. package/dist/index228.js.map +1 -1
  33. package/dist/index230.js +20 -52
  34. package/dist/index230.js.map +1 -1
  35. package/dist/index231.js +51 -16
  36. package/dist/index231.js.map +1 -1
  37. package/dist/index232.js +18 -9
  38. package/dist/index232.js.map +1 -1
  39. package/dist/index233.js +9 -9
  40. package/dist/index233.js.map +1 -1
  41. package/dist/index234.js +9 -4
  42. package/dist/index234.js.map +1 -1
  43. package/dist/index235.js +5 -170
  44. package/dist/index235.js.map +1 -1
  45. package/dist/index236.js +170 -11
  46. package/dist/index236.js.map +1 -1
  47. package/dist/index237.js +11 -6
  48. package/dist/index237.js.map +1 -1
  49. package/dist/index238.js +5 -5
  50. package/dist/index238.js.map +1 -1
  51. package/dist/index239.js +5 -37
  52. package/dist/index239.js.map +1 -1
  53. package/dist/index24.js +1 -1
  54. package/dist/index240.js +38 -2
  55. package/dist/index240.js.map +1 -1
  56. package/dist/index241.js +2 -8
  57. package/dist/index241.js.map +1 -1
  58. package/dist/index242.js +7 -326
  59. package/dist/index242.js.map +1 -1
  60. package/dist/index243.js +324 -47
  61. package/dist/index243.js.map +1 -1
  62. package/dist/index244.js +50 -2
  63. package/dist/index244.js.map +1 -1
  64. package/dist/index245.js +2 -76
  65. package/dist/index245.js.map +1 -1
  66. package/dist/index246.js +65 -82
  67. package/dist/index246.js.map +1 -1
  68. package/dist/index247.js +89 -48
  69. package/dist/index247.js.map +1 -1
  70. package/dist/index248.js +51 -7
  71. package/dist/index248.js.map +1 -1
  72. package/dist/index249.js +7 -4
  73. package/dist/index249.js.map +1 -1
  74. package/dist/index250.js +4 -51
  75. package/dist/index250.js.map +1 -1
  76. package/dist/index251.js +52 -2
  77. package/dist/index251.js.map +1 -1
  78. package/dist/index252.js +2 -2
  79. package/dist/index253.js +5 -0
  80. package/dist/index253.js.map +1 -0
  81. package/dist/index27.js +1 -1
  82. package/dist/index28.js +94 -90
  83. package/dist/index28.js.map +1 -1
  84. package/dist/index32.js +42 -44
  85. package/dist/index32.js.map +1 -1
  86. package/dist/index37.js +1 -1
  87. package/dist/index39.js +1 -1
  88. package/dist/index44.js +1 -1
  89. package/dist/index45.js +2 -2
  90. package/dist/index48.js +1 -1
  91. package/dist/index52.js +1 -1
  92. package/dist/index62.js +1 -1
  93. package/dist/index64.js +52 -60
  94. package/dist/index64.js.map +1 -1
  95. package/package.json +1 -1
  96. package/dist/index198.js +0 -26
  97. package/dist/index198.js.map +0 -1
  98. package/dist/index226.js +0 -7
  99. package/dist/index226.js.map +0 -1
  100. package/dist/index229.js +0 -25
  101. 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 "./index214.js";
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 "./index196.js";
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 "./index217.js";
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
@@ -1,5 +1,5 @@
1
1
  import e, { useEffect as d } from "react";
2
- import { delay as m } from "./index226.js";
2
+ import { delay as m } from "./index228.js";
3
3
  import { Icon as i } from "./index5.js";
4
4
  const g = (r) => {
5
5
  const {
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 "./index206.js";
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, { useRef as G } from "react";
2
- import { Button as u } from "./index3.js";
3
- import { Badge as J } from "./index9.js";
4
- import { Icon as K } from "./index5.js";
5
- import { Link as E } from "./index63.js";
6
- import { CustomModal as O } from "./index12.js";
7
- import { useFocusTrap as Q } from "./index228.js";
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 U = {
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
- }, ca = ({
20
- isOpen: n,
21
- onClose: N,
18
+ }, ea = ({
19
+ isOpen: N,
20
+ onClose: n,
22
21
  trigger: c,
23
- modalWidth: b,
24
- modalHeight: g,
25
- variant: x,
22
+ modalWidth: u,
23
+ modalHeight: b,
24
+ variant: g,
26
25
  size: t = "lg",
27
- availabilityLabel: C = "Available on ",
26
+ availabilityLabel: x = "Available on ",
28
27
  availabilityBadgeText: k,
29
- title: v,
30
- description: F,
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: R,
38
- laterButtonText: S,
39
- purchaseButtonText: _,
40
- onLaterClick: A,
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 = G(null), p = T(D, "paywall-title");
48
- Q({
49
- enabled: n,
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
- }), Y = w && h.length > 0, Z = L ?? /* @__PURE__ */ a.createElement(K, {
56
+ }), R = y && w.length > 0, W = L ?? /* @__PURE__ */ a.createElement(q, {
65
57
  name: "info",
66
58
  rotation: "180"
67
- }), j = /* @__PURE__ */ a.createElement("section", {
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
- }, C), /* @__PURE__ */ a.createElement(J, {
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: p,
76
+ id: m,
85
77
  className: "paywall-card-title"
86
- }, v), /* @__PURE__ */ a.createElement("p", {
78
+ }, C), /* @__PURE__ */ a.createElement("p", {
87
79
  className: "paywall-card-description"
88
- }, F, r && (l || o) && /* @__PURE__ */ a.createElement(E, {
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
- })), w && s && /* @__PURE__ */ a.createElement("p", {
88
+ })), y && s && /* @__PURE__ */ a.createElement("p", {
97
89
  className: "paywall-card-features-intro"
98
- }, s), Y && /* @__PURE__ */ a.createElement("ul", {
90
+ }, s), R && /* @__PURE__ */ a.createElement("ul", {
99
91
  className: "paywall-card-features-list"
100
- }, h.map((e) => /* @__PURE__ */ a.createElement("li", {
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 ?? Z), /* @__PURE__ */ a.createElement("span", null, e.href || e.onLinkClick ? /* @__PURE__ */ a.createElement(E, {
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: (f) => {
111
- e.href || f.preventDefault(), e.onLinkClick?.(f);
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(u, {
107
+ }, /* @__PURE__ */ a.createElement(E, {
116
108
  type: "ghost",
117
109
  size: "md",
118
- label: S,
110
+ label: _,
119
111
  onClick: z,
120
112
  className: "paywall-card-btn-later"
121
- }), /* @__PURE__ */ a.createElement(u, {
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
- }, R))), q = /* @__PURE__ */ a.createElement("div", {
130
- ref: m,
121
+ }, S))), Z = /* @__PURE__ */ a.createElement("div", {
131
122
  role: "dialog",
132
123
  "aria-modal": "true",
133
- "aria-labelledby": p,
124
+ "aria-labelledby": m,
134
125
  className: `paywall-modal-content ${B}`,
135
126
  style: {
136
- height: y,
137
- minHeight: y
127
+ height: d,
128
+ minHeight: d
138
129
  }
139
- }, j);
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(O, {
143
- isOpen: n,
133
+ }, c), /* @__PURE__ */ a.createElement(G, {
134
+ isOpen: N,
135
+ onClose: n,
144
136
  onModalClick: () => {
145
137
  },
146
- renderModalContent: () => q,
147
- width: W,
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
- ca as Paywall,
154
- ca as default
145
+ ea as Paywall,
146
+ ea as default
155
147
  };
156
148
  //# sourceMappingURL=index64.js.map
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "se-design",
3
- "version": "1.0.73-dev2",
3
+ "version": "1.0.73-dev6",
4
4
  "type": "module",
5
5
  "module": "dist/index.js",
6
6
  "exports": {
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
@@ -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
@@ -1,7 +0,0 @@
1
- function n(e) {
2
- return new Promise((t) => setTimeout(t, e));
3
- }
4
- export {
5
- n as delay
6
- };
7
- //# sourceMappingURL=index226.js.map
@@ -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
@@ -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;"}