@monetize.software/sdk-extension 3.0.0-alpha.10 → 3.0.0-alpha.12
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/chunks/{chrome-port-DptrBLez.js → chrome-port-BXK5myXz.js} +2 -2
- package/dist/chunks/chrome-port-BXK5myXz.js.map +1 -0
- package/dist/chunks/{chrome-port-CB1NEZOC.js → chrome-port-KYVwww_u.js} +10 -1
- package/dist/chunks/chrome-port-KYVwww_u.js.map +1 -0
- package/dist/content/RemoteAuthClient.d.ts +1 -1
- package/dist/content/RemoteBillingClient.d.ts +7 -3
- package/dist/content/RemoteBillingClient.d.ts.map +1 -1
- package/dist/content/RemoteTrialStore.d.ts +2 -2
- package/dist/content.cjs +3 -3
- package/dist/content.cjs.map +1 -1
- package/dist/content.js +735 -666
- package/dist/content.js.map +1 -1
- package/dist/offscreen/server.d.ts +3 -3
- package/dist/offscreen.cjs +1 -1
- package/dist/offscreen.js +1 -1
- package/dist/shared/messages.d.ts +2 -2
- package/package.json +3 -3
- package/dist/chunks/chrome-port-CB1NEZOC.js.map +0 -1
- package/dist/chunks/chrome-port-DptrBLez.js.map +0 -1
package/dist/content.js
CHANGED
|
@@ -1,40 +1,82 @@
|
|
|
1
|
-
import { P as T, B as je, E as Re, c as
|
|
1
|
+
import { P as T, B as je, E as Re, c as De, A as ce, w as ze, a as X, r as Ne, b as qe } from "./chunks/chrome-port-KYVwww_u.js";
|
|
2
2
|
import { render as J, h as ue, createContext as Fe } from "preact";
|
|
3
3
|
import { jsx as o, jsxs as u, Fragment as se } from "preact/jsx-runtime";
|
|
4
|
-
import { useState as x, useEffect as B, useContext as
|
|
4
|
+
import { useState as x, useEffect as B, useContext as $e, useRef as R, useMemo as Ve, useLayoutEffect as He } from "preact/hooks";
|
|
5
5
|
import { P as Ge } from "./chunks/port-name-ervLBWAQ.js";
|
|
6
|
+
function We(t) {
|
|
7
|
+
return `pw-offer-${t}-start`;
|
|
8
|
+
}
|
|
9
|
+
function $(t, e) {
|
|
10
|
+
if (!t || t.length === 0) return null;
|
|
11
|
+
const r = t.find(
|
|
12
|
+
(i) => i.price_id === e && (i.discount_percent ?? 0) > 0
|
|
13
|
+
);
|
|
14
|
+
return r || (t.find(
|
|
15
|
+
(i) => i.price_id == null && (i.discount_percent ?? 0) > 0
|
|
16
|
+
) ?? null);
|
|
17
|
+
}
|
|
18
|
+
function Ze(t, e = {}) {
|
|
19
|
+
const r = t.discount_percent ?? 0;
|
|
20
|
+
if (r <= 0) return null;
|
|
21
|
+
const n = e.now ?? Date.now(), i = Ye(t, e.readStart), s = Ke(t, i), a = i !== null ? Math.max(0, i - n) : null;
|
|
22
|
+
return i !== null && i <= n ? null : { offer: t, discountPercent: r, remainingMs: a, totalMs: s, expiresAt: i };
|
|
23
|
+
}
|
|
24
|
+
function Ye(t, e) {
|
|
25
|
+
if (t.expires_at) {
|
|
26
|
+
const r = Date.parse(t.expires_at);
|
|
27
|
+
return Number.isFinite(r) ? r : null;
|
|
28
|
+
}
|
|
29
|
+
if (t.duration_minutes && t.duration_minutes > 0 && e) {
|
|
30
|
+
const r = e(t.id);
|
|
31
|
+
if (!r) return null;
|
|
32
|
+
const n = Date.parse(r);
|
|
33
|
+
return Number.isFinite(n) ? n + t.duration_minutes * 6e4 : null;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function Ke(t, e) {
|
|
38
|
+
return t.duration_minutes && t.duration_minutes > 0 ? t.duration_minutes * 6e4 : e !== null ? e - Date.now() : null;
|
|
39
|
+
}
|
|
40
|
+
function Xe(t) {
|
|
41
|
+
if (typeof window > "u") return null;
|
|
42
|
+
try {
|
|
43
|
+
return window.localStorage.getItem(We(t));
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
6
48
|
const _e = '@layer theme,base,components,utilities;@layer theme{@theme default{ --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --color-red-50: oklch(97.1% .013 17.38); --color-red-100: oklch(93.6% .032 17.717); --color-red-200: oklch(88.5% .062 18.334); --color-red-300: oklch(80.8% .114 19.571); --color-red-400: oklch(70.4% .191 22.216); --color-red-500: oklch(63.7% .237 25.331); --color-red-600: oklch(57.7% .245 27.325); --color-red-700: oklch(50.5% .213 27.518); --color-red-800: oklch(44.4% .177 26.899); --color-red-900: oklch(39.6% .141 25.723); --color-red-950: oklch(25.8% .092 26.042); --color-orange-50: oklch(98% .016 73.684); --color-orange-100: oklch(95.4% .038 75.164); --color-orange-200: oklch(90.1% .076 70.697); --color-orange-300: oklch(83.7% .128 66.29); --color-orange-400: oklch(75% .183 55.934); --color-orange-500: oklch(70.5% .213 47.604); --color-orange-600: oklch(64.6% .222 41.116); --color-orange-700: oklch(55.3% .195 38.402); --color-orange-800: oklch(47% .157 37.304); --color-orange-900: oklch(40.8% .123 38.172); --color-orange-950: oklch(26.6% .079 36.259); --color-amber-50: oklch(98.7% .022 95.277); --color-amber-100: oklch(96.2% .059 95.617); --color-amber-200: oklch(92.4% .12 95.746); --color-amber-300: oklch(87.9% .169 91.605); --color-amber-400: oklch(82.8% .189 84.429); --color-amber-500: oklch(76.9% .188 70.08); --color-amber-600: oklch(66.6% .179 58.318); --color-amber-700: oklch(55.5% .163 48.998); --color-amber-800: oklch(47.3% .137 46.201); --color-amber-900: oklch(41.4% .112 45.904); --color-amber-950: oklch(27.9% .077 45.635); --color-yellow-50: oklch(98.7% .026 102.212); --color-yellow-100: oklch(97.3% .071 103.193); --color-yellow-200: oklch(94.5% .129 101.54); --color-yellow-300: oklch(90.5% .182 98.111); --color-yellow-400: oklch(85.2% .199 91.936); --color-yellow-500: oklch(79.5% .184 86.047); --color-yellow-600: oklch(68.1% .162 75.834); --color-yellow-700: oklch(55.4% .135 66.442); --color-yellow-800: oklch(47.6% .114 61.907); --color-yellow-900: oklch(42.1% .095 57.708); --color-yellow-950: oklch(28.6% .066 53.813); --color-lime-50: oklch(98.6% .031 120.757); --color-lime-100: oklch(96.7% .067 122.328); --color-lime-200: oklch(93.8% .127 124.321); --color-lime-300: oklch(89.7% .196 126.665); --color-lime-400: oklch(84.1% .238 128.85); --color-lime-500: oklch(76.8% .233 130.85); --color-lime-600: oklch(64.8% .2 131.684); --color-lime-700: oklch(53.2% .157 131.589); --color-lime-800: oklch(45.3% .124 130.933); --color-lime-900: oklch(40.5% .101 131.063); --color-lime-950: oklch(27.4% .072 132.109); --color-green-50: oklch(98.2% .018 155.826); --color-green-100: oklch(96.2% .044 156.743); --color-green-200: oklch(92.5% .084 155.995); --color-green-300: oklch(87.1% .15 154.449); --color-green-400: oklch(79.2% .209 151.711); --color-green-500: oklch(72.3% .219 149.579); --color-green-600: oklch(62.7% .194 149.214); --color-green-700: oklch(52.7% .154 150.069); --color-green-800: oklch(44.8% .119 151.328); --color-green-900: oklch(39.3% .095 152.535); --color-green-950: oklch(26.6% .065 152.934); --color-emerald-50: oklch(97.9% .021 166.113); --color-emerald-100: oklch(95% .052 163.051); --color-emerald-200: oklch(90.5% .093 164.15); --color-emerald-300: oklch(84.5% .143 164.978); --color-emerald-400: oklch(76.5% .177 163.223); --color-emerald-500: oklch(69.6% .17 162.48); --color-emerald-600: oklch(59.6% .145 163.225); --color-emerald-700: oklch(50.8% .118 165.612); --color-emerald-800: oklch(43.2% .095 166.913); --color-emerald-900: oklch(37.8% .077 168.94); --color-emerald-950: oklch(26.2% .051 172.552); --color-teal-50: oklch(98.4% .014 180.72); --color-teal-100: oklch(95.3% .051 180.801); --color-teal-200: oklch(91% .096 180.426); --color-teal-300: oklch(85.5% .138 181.071); --color-teal-400: oklch(77.7% .152 181.912); --color-teal-500: oklch(70.4% .14 182.503); --color-teal-600: oklch(60% .118 184.704); --color-teal-700: oklch(51.1% .096 186.391); --color-teal-800: oklch(43.7% .078 188.216); --color-teal-900: oklch(38.6% .063 188.416); --color-teal-950: oklch(27.7% .046 192.524); --color-cyan-50: oklch(98.4% .019 200.873); --color-cyan-100: oklch(95.6% .045 203.388); --color-cyan-200: oklch(91.7% .08 205.041); --color-cyan-300: oklch(86.5% .127 207.078); --color-cyan-400: oklch(78.9% .154 211.53); --color-cyan-500: oklch(71.5% .143 215.221); --color-cyan-600: oklch(60.9% .126 221.723); --color-cyan-700: oklch(52% .105 223.128); --color-cyan-800: oklch(45% .085 224.283); --color-cyan-900: oklch(39.8% .07 227.392); --color-cyan-950: oklch(30.2% .056 229.695); --color-sky-50: oklch(97.7% .013 236.62); --color-sky-100: oklch(95.1% .026 236.824); --color-sky-200: oklch(90.1% .058 230.902); --color-sky-300: oklch(82.8% .111 230.318); --color-sky-400: oklch(74.6% .16 232.661); --color-sky-500: oklch(68.5% .169 237.323); --color-sky-600: oklch(58.8% .158 241.966); --color-sky-700: oklch(50% .134 242.749); --color-sky-800: oklch(44.3% .11 240.79); --color-sky-900: oklch(39.1% .09 240.876); --color-sky-950: oklch(29.3% .066 243.157); --color-blue-50: oklch(97% .014 254.604); --color-blue-100: oklch(93.2% .032 255.585); --color-blue-200: oklch(88.2% .059 254.128); --color-blue-300: oklch(80.9% .105 251.813); --color-blue-400: oklch(70.7% .165 254.624); --color-blue-500: oklch(62.3% .214 259.815); --color-blue-600: oklch(54.6% .245 262.881); --color-blue-700: oklch(48.8% .243 264.376); --color-blue-800: oklch(42.4% .199 265.638); --color-blue-900: oklch(37.9% .146 265.522); --color-blue-950: oklch(28.2% .091 267.935); --color-indigo-50: oklch(96.2% .018 272.314); --color-indigo-100: oklch(93% .034 272.788); --color-indigo-200: oklch(87% .065 274.039); --color-indigo-300: oklch(78.5% .115 274.713); --color-indigo-400: oklch(67.3% .182 276.935); --color-indigo-500: oklch(58.5% .233 277.117); --color-indigo-600: oklch(51.1% .262 276.966); --color-indigo-700: oklch(45.7% .24 277.023); --color-indigo-800: oklch(39.8% .195 277.366); --color-indigo-900: oklch(35.9% .144 278.697); --color-indigo-950: oklch(25.7% .09 281.288); --color-violet-50: oklch(96.9% .016 293.756); --color-violet-100: oklch(94.3% .029 294.588); --color-violet-200: oklch(89.4% .057 293.283); --color-violet-300: oklch(81.1% .111 293.571); --color-violet-400: oklch(70.2% .183 293.541); --color-violet-500: oklch(60.6% .25 292.717); --color-violet-600: oklch(54.1% .281 293.009); --color-violet-700: oklch(49.1% .27 292.581); --color-violet-800: oklch(43.2% .232 292.759); --color-violet-900: oklch(38% .189 293.745); --color-violet-950: oklch(28.3% .141 291.089); --color-purple-50: oklch(97.7% .014 308.299); --color-purple-100: oklch(94.6% .033 307.174); --color-purple-200: oklch(90.2% .063 306.703); --color-purple-300: oklch(82.7% .119 306.383); --color-purple-400: oklch(71.4% .203 305.504); --color-purple-500: oklch(62.7% .265 303.9); --color-purple-600: oklch(55.8% .288 302.321); --color-purple-700: oklch(49.6% .265 301.924); --color-purple-800: oklch(43.8% .218 303.724); --color-purple-900: oklch(38.1% .176 304.987); --color-purple-950: oklch(29.1% .149 302.717); --color-fuchsia-50: oklch(97.7% .017 320.058); --color-fuchsia-100: oklch(95.2% .037 318.852); --color-fuchsia-200: oklch(90.3% .076 319.62); --color-fuchsia-300: oklch(83.3% .145 321.434); --color-fuchsia-400: oklch(74% .238 322.16); --color-fuchsia-500: oklch(66.7% .295 322.15); --color-fuchsia-600: oklch(59.1% .293 322.896); --color-fuchsia-700: oklch(51.8% .253 323.949); --color-fuchsia-800: oklch(45.2% .211 324.591); --color-fuchsia-900: oklch(40.1% .17 325.612); --color-fuchsia-950: oklch(29.3% .136 325.661); --color-pink-50: oklch(97.1% .014 343.198); --color-pink-100: oklch(94.8% .028 342.258); --color-pink-200: oklch(89.9% .061 343.231); --color-pink-300: oklch(82.3% .12 346.018); --color-pink-400: oklch(71.8% .202 349.761); --color-pink-500: oklch(65.6% .241 354.308); --color-pink-600: oklch(59.2% .249 .584); --color-pink-700: oklch(52.5% .223 3.958); --color-pink-800: oklch(45.9% .187 3.815); --color-pink-900: oklch(40.8% .153 2.432); --color-pink-950: oklch(28.4% .109 3.907); --color-rose-50: oklch(96.9% .015 12.422); --color-rose-100: oklch(94.1% .03 12.58); --color-rose-200: oklch(89.2% .058 10.001); --color-rose-300: oklch(81% .117 11.638); --color-rose-400: oklch(71.2% .194 13.428); --color-rose-500: oklch(64.5% .246 16.439); --color-rose-600: oklch(58.6% .253 17.585); --color-rose-700: oklch(51.4% .222 16.935); --color-rose-800: oklch(45.5% .188 13.697); --color-rose-900: oklch(41% .159 10.272); --color-rose-950: oklch(27.1% .105 12.094); --color-slate-50: oklch(98.4% .003 247.858); --color-slate-100: oklch(96.8% .007 247.896); --color-slate-200: oklch(92.9% .013 255.508); --color-slate-300: oklch(86.9% .022 252.894); --color-slate-400: oklch(70.4% .04 256.788); --color-slate-500: oklch(55.4% .046 257.417); --color-slate-600: oklch(44.6% .043 257.281); --color-slate-700: oklch(37.2% .044 257.287); --color-slate-800: oklch(27.9% .041 260.031); --color-slate-900: oklch(20.8% .042 265.755); --color-slate-950: oklch(12.9% .042 264.695); --color-gray-50: oklch(98.5% .002 247.839); --color-gray-100: oklch(96.7% .003 264.542); --color-gray-200: oklch(92.8% .006 264.531); --color-gray-300: oklch(87.2% .01 258.338); --color-gray-400: oklch(70.7% .022 261.325); --color-gray-500: oklch(55.1% .027 264.364); --color-gray-600: oklch(44.6% .03 256.802); --color-gray-700: oklch(37.3% .034 259.733); --color-gray-800: oklch(27.8% .033 256.848); --color-gray-900: oklch(21% .034 264.665); --color-gray-950: oklch(13% .028 261.692); --color-zinc-50: oklch(98.5% 0 0); --color-zinc-100: oklch(96.7% .001 286.375); --color-zinc-200: oklch(92% .004 286.32); --color-zinc-300: oklch(87.1% .006 286.286); --color-zinc-400: oklch(70.5% .015 286.067); --color-zinc-500: oklch(55.2% .016 285.938); --color-zinc-600: oklch(44.2% .017 285.786); --color-zinc-700: oklch(37% .013 285.805); --color-zinc-800: oklch(27.4% .006 286.033); --color-zinc-900: oklch(21% .006 285.885); --color-zinc-950: oklch(14.1% .005 285.823); --color-neutral-50: oklch(98.5% 0 0); --color-neutral-100: oklch(97% 0 0); --color-neutral-200: oklch(92.2% 0 0); --color-neutral-300: oklch(87% 0 0); --color-neutral-400: oklch(70.8% 0 0); --color-neutral-500: oklch(55.6% 0 0); --color-neutral-600: oklch(43.9% 0 0); --color-neutral-700: oklch(37.1% 0 0); --color-neutral-800: oklch(26.9% 0 0); --color-neutral-900: oklch(20.5% 0 0); --color-neutral-950: oklch(14.5% 0 0); --color-stone-50: oklch(98.5% .001 106.423); --color-stone-100: oklch(97% .001 106.424); --color-stone-200: oklch(92.3% .003 48.717); --color-stone-300: oklch(86.9% .005 56.366); --color-stone-400: oklch(70.9% .01 56.259); --color-stone-500: oklch(55.3% .013 58.071); --color-stone-600: oklch(44.4% .011 73.639); --color-stone-700: oklch(37.4% .01 67.558); --color-stone-800: oklch(26.8% .007 34.298); --color-stone-900: oklch(21.6% .006 56.043); --color-stone-950: oklch(14.7% .004 49.25); --color-mauve-50: oklch(98.5% 0 0); --color-mauve-100: oklch(96% .003 325.6); --color-mauve-200: oklch(92.2% .005 325.62); --color-mauve-300: oklch(86.5% .012 325.68); --color-mauve-400: oklch(71.1% .019 323.02); --color-mauve-500: oklch(54.2% .034 322.5); --color-mauve-600: oklch(43.5% .029 321.78); --color-mauve-700: oklch(36.4% .029 323.89); --color-mauve-800: oklch(26.3% .024 320.12); --color-mauve-900: oklch(21.2% .019 322.12); --color-mauve-950: oklch(14.5% .008 326); --color-olive-50: oklch(98.8% .003 106.5); --color-olive-100: oklch(96.6% .005 106.5); --color-olive-200: oklch(93% .007 106.5); --color-olive-300: oklch(88% .011 106.6); --color-olive-400: oklch(73.7% .021 106.9); --color-olive-500: oklch(58% .031 107.3); --color-olive-600: oklch(46.6% .025 107.3); --color-olive-700: oklch(39.4% .023 107.4); --color-olive-800: oklch(28.6% .016 107.4); --color-olive-900: oklch(22.8% .013 107.4); --color-olive-950: oklch(15.3% .006 107.1); --color-mist-50: oklch(98.7% .002 197.1); --color-mist-100: oklch(96.3% .002 197.1); --color-mist-200: oklch(92.5% .005 214.3); --color-mist-300: oklch(87.2% .007 219.6); --color-mist-400: oklch(72.3% .014 214.4); --color-mist-500: oklch(56% .021 213.5); --color-mist-600: oklch(45% .017 213.2); --color-mist-700: oklch(37.8% .015 216); --color-mist-800: oklch(27.5% .011 216.9); --color-mist-900: oklch(21.8% .008 223.9); --color-mist-950: oklch(14.8% .004 228.8); --color-taupe-50: oklch(98.6% .002 67.8); --color-taupe-100: oklch(96% .002 17.2); --color-taupe-200: oklch(92.2% .005 34.3); --color-taupe-300: oklch(86.8% .007 39.5); --color-taupe-400: oklch(71.4% .014 41.2); --color-taupe-500: oklch(54.7% .021 43.1); --color-taupe-600: oklch(43.8% .017 39.3); --color-taupe-700: oklch(36.7% .016 35.7); --color-taupe-800: oklch(26.8% .011 36.5); --color-taupe-900: oklch(21.4% .009 43.1); --color-taupe-950: oklch(14.7% .004 49.3); --color-black: #000; --color-white: #fff; --spacing: .25rem; --breakpoint-sm: 40rem; --breakpoint-md: 48rem; --breakpoint-lg: 64rem; --breakpoint-xl: 80rem; --breakpoint-2xl: 96rem; --container-3xs: 16rem; --container-2xs: 18rem; --container-xs: 20rem; --container-sm: 24rem; --container-md: 28rem; --container-lg: 32rem; --container-xl: 36rem; --container-2xl: 42rem; --container-3xl: 48rem; --container-4xl: 56rem; --container-5xl: 64rem; --container-6xl: 72rem; --container-7xl: 80rem; --text-xs: .75rem; --text-xs--line-height: calc(1 / .75); --text-sm: .875rem; --text-sm--line-height: calc(1.25 / .875); --text-base: 1rem; --text-base--line-height: 1.5 ; --text-lg: 1.125rem; --text-lg--line-height: calc(1.75 / 1.125); --text-xl: 1.25rem; --text-xl--line-height: calc(1.75 / 1.25); --text-2xl: 1.5rem; --text-2xl--line-height: calc(2 / 1.5); --text-3xl: 1.875rem; --text-3xl--line-height: 1.2 ; --text-4xl: 2.25rem; --text-4xl--line-height: calc(2.5 / 2.25); --text-5xl: 3rem; --text-5xl--line-height: 1; --text-6xl: 3.75rem; --text-6xl--line-height: 1; --text-7xl: 4.5rem; --text-7xl--line-height: 1; --text-8xl: 6rem; --text-8xl--line-height: 1; --text-9xl: 8rem; --text-9xl--line-height: 1; --font-weight-thin: 100; --font-weight-extralight: 200; --font-weight-light: 300; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --font-weight-extrabold: 800; --font-weight-black: 900; --tracking-tighter: -.05em; --tracking-tight: -.025em; --tracking-normal: 0em; --tracking-wide: .025em; --tracking-wider: .05em; --tracking-widest: .1em; --leading-tight: 1.25; --leading-snug: 1.375; --leading-normal: 1.5; --leading-relaxed: 1.625; --leading-loose: 2; --radius-xs: .125rem; --radius-sm: .25rem; --radius-md: .375rem; --radius-lg: .5rem; --radius-xl: .75rem; --radius-2xl: 1rem; --radius-3xl: 1.5rem; --radius-4xl: 2rem; --shadow-2xs: 0 1px rgb(0 0 0 / .05); --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / .05); --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1); --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / .25); --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / .05); --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / .05); --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / .05); --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / .05); --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / .15); --drop-shadow-md: 0 3px 3px rgb(0 0 0 / .12); --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / .15); --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / .1); --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / .15); --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / .15); --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / .2); --text-shadow-sm: 0px 1px 0px rgb(0 0 0 / .075), 0px 1px 1px rgb(0 0 0 / .075), 0px 2px 2px rgb(0 0 0 / .075); --text-shadow-md: 0px 1px 1px rgb(0 0 0 / .1), 0px 1px 2px rgb(0 0 0 / .1), 0px 2px 4px rgb(0 0 0 / .1); --text-shadow-lg: 0px 1px 2px rgb(0 0 0 / .1), 0px 3px 2px rgb(0 0 0 / .1), 0px 4px 8px rgb(0 0 0 / .1); --ease-in: cubic-bezier(.4, 0, 1, 1); --ease-out: cubic-bezier(0, 0, .2, 1); --ease-in-out: cubic-bezier(.4, 0, .2, 1); --animate-spin: spin 1s linear infinite; --animate-ping: ping 1s cubic-bezier(0, 0, .2, 1) infinite; --animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; --animate-bounce: bounce 1s infinite; @keyframes spin { to { transform: rotate(360deg); } } @keyframes ping { 75%, 100% { transform: scale(2); opacity: 0; } } @keyframes pulse { 50% { opacity: .5; } } @keyframes bounce { 0%, 100% { transform: translateY(-25%); animation-timing-function: cubic-bezier(.8, 0, 1, 1); } 50% { transform: none; animation-timing-function: cubic-bezier(0, 0, .2, 1); } } --blur-xs: 4px; --blur-sm: 8px; --blur-md: 12px; --blur-lg: 16px; --blur-xl: 24px; --blur-2xl: 40px; --blur-3xl: 64px; --perspective-dramatic: 100px; --perspective-near: 300px; --perspective-normal: 500px; --perspective-midrange: 800px; --perspective-distant: 1200px; --aspect-video: 16 / 9; --default-transition-duration: .15s; --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1); --default-font-family: --theme(--font-sans, initial); --default-font-feature-settings: --theme( --font-sans--font-feature-settings, initial ); --default-font-variation-settings: --theme( --font-sans--font-variation-settings, initial ); --default-mono-font-family: --theme(--font-mono, initial); --default-mono-font-feature-settings: --theme( --font-mono--font-feature-settings, initial ); --default-mono-font-variation-settings: --theme( --font-mono--font-variation-settings, initial ); }@theme default inline reference{ --blur: 8px; --shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1); --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / .05); --drop-shadow: 0 1px 2px rgb(0 0 0 / .1), 0 1px 1px rgb(0 0 0 / .06); --radius: .25rem; --max-width-prose: 65ch; }}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:--theme(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:--theme(--default-font-feature-settings,normal);font-variation-settings:--theme(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:--theme(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:--theme(--default-mono-font-feature-settings,normal);font-variation-settings:--theme(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{@tailwind utilities;}@source "../**/*.{ts,tsx,js,jsx}";@layer base{:host{all:initial;color-scheme:light;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}*,*:before,*:after{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*,*:before,*:after{box-sizing:border-box}button{font-family:inherit;cursor:pointer}button:disabled{cursor:not-allowed}[role=button],[role=radio]{cursor:pointer}}.pw-cta-shimmer:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.35) 50%,transparent);animation:pw-cta-shimmer 3s infinite;z-index:1}@keyframes pw-cta-shimmer{0%{left:-100%}to{left:100%}}';
|
|
7
49
|
let de = !1;
|
|
8
|
-
function
|
|
50
|
+
function Je() {
|
|
9
51
|
if (de || (de = !0, typeof CSS > "u" || typeof CSS.registerProperty != "function")) return;
|
|
10
|
-
let
|
|
52
|
+
let t;
|
|
11
53
|
try {
|
|
12
54
|
const e = new CSSStyleSheet();
|
|
13
|
-
e.replaceSync(_e),
|
|
55
|
+
e.replaceSync(_e), t = e.cssRules;
|
|
14
56
|
} catch {
|
|
15
57
|
return;
|
|
16
58
|
}
|
|
17
|
-
for (const e of
|
|
59
|
+
for (const e of t) {
|
|
18
60
|
if (e.constructor.name !== "CSSPropertyRule") continue;
|
|
19
|
-
const
|
|
61
|
+
const r = e;
|
|
20
62
|
try {
|
|
21
63
|
CSS.registerProperty({
|
|
22
|
-
name:
|
|
23
|
-
syntax:
|
|
24
|
-
inherits:
|
|
25
|
-
...
|
|
64
|
+
name: r.name,
|
|
65
|
+
syntax: r.syntax,
|
|
66
|
+
inherits: r.inherits,
|
|
67
|
+
...r.initialValue != null ? { initialValue: r.initialValue } : {}
|
|
26
68
|
});
|
|
27
69
|
} catch {
|
|
28
70
|
}
|
|
29
71
|
}
|
|
30
72
|
}
|
|
31
|
-
function
|
|
73
|
+
function Qe(t, e, r = {}) {
|
|
32
74
|
if (typeof document > "u")
|
|
33
75
|
throw new Error("mountShadow called in non-DOM environment");
|
|
34
|
-
|
|
35
|
-
const n =
|
|
36
|
-
n.setAttribute("data-paywall-host", ""), n.style.cssText =
|
|
37
|
-
const i = n.attachShadow({ mode:
|
|
76
|
+
Je();
|
|
77
|
+
const n = r.host ?? document.createElement("div");
|
|
78
|
+
n.setAttribute("data-paywall-host", ""), n.style.cssText = r.inline ? "all: initial; position: absolute; inset: 0; z-index: 1; pointer-events: none;" : "all: initial; position: fixed; inset: 0; z-index: 2147483647; pointer-events: none;", !n.isConnected && !r.inline && document.body.appendChild(n);
|
|
79
|
+
const i = n.attachShadow({ mode: r.shadowMode ?? "closed" }), s = `
|
|
38
80
|
:host {
|
|
39
81
|
all: initial !important;
|
|
40
82
|
display: block !important;
|
|
@@ -53,33 +95,33 @@ function Ze(r, e, t = {}) {
|
|
|
53
95
|
visibility: visible !important;
|
|
54
96
|
}
|
|
55
97
|
`, a = document.createElement("style");
|
|
56
|
-
a.textContent = s + _e + (
|
|
98
|
+
a.textContent = s + _e + (r.injectCss ?? ""), i.appendChild(a);
|
|
57
99
|
const c = document.createElement("div");
|
|
58
100
|
c.style.pointerEvents = "auto", i.appendChild(c);
|
|
59
101
|
let l = e;
|
|
60
|
-
return J(ue(
|
|
102
|
+
return J(ue(t, l), c), {
|
|
61
103
|
shadowRoot: i,
|
|
62
104
|
update(f) {
|
|
63
|
-
l = { ...l, ...f }, J(ue(
|
|
105
|
+
l = { ...l, ...f }, J(ue(t, l), c);
|
|
64
106
|
},
|
|
65
107
|
unmount() {
|
|
66
108
|
J(null, c), n.remove();
|
|
67
109
|
}
|
|
68
110
|
};
|
|
69
111
|
}
|
|
70
|
-
const
|
|
71
|
-
const n =
|
|
112
|
+
const et = (t, e, r) => {
|
|
113
|
+
const n = t[e];
|
|
72
114
|
return n ? typeof n == "function" ? n() : Promise.resolve(n) : new Promise((i, s) => {
|
|
73
115
|
(typeof queueMicrotask == "function" ? queueMicrotask : setTimeout)(
|
|
74
116
|
s.bind(
|
|
75
117
|
null,
|
|
76
118
|
new Error(
|
|
77
|
-
"Unknown variable dynamic import: " + e + (e.split("/").length !==
|
|
119
|
+
"Unknown variable dynamic import: " + e + (e.split("/").length !== r ? ". Note that variables only represent file names one level deep." : "")
|
|
78
120
|
)
|
|
79
121
|
)
|
|
80
122
|
);
|
|
81
123
|
});
|
|
82
|
-
},
|
|
124
|
+
}, tt = [
|
|
83
125
|
"ru",
|
|
84
126
|
"uk",
|
|
85
127
|
"de",
|
|
@@ -107,62 +149,62 @@ const Ye = (r, e, t) => {
|
|
|
107
149
|
"th",
|
|
108
150
|
"vi",
|
|
109
151
|
"he"
|
|
110
|
-
], Se = (
|
|
111
|
-
function Ie(
|
|
112
|
-
if (!e) return
|
|
113
|
-
let
|
|
152
|
+
], Se = (t, e, r) => Ie(e, r), Ce = Fe({ t: Se, locale: "en" });
|
|
153
|
+
function Ie(t, e) {
|
|
154
|
+
if (!e) return t;
|
|
155
|
+
let r = t;
|
|
114
156
|
for (const [n, i] of Object.entries(e))
|
|
115
|
-
|
|
116
|
-
return
|
|
157
|
+
r = r.split(`{${n}}`).join(String(i));
|
|
158
|
+
return r;
|
|
117
159
|
}
|
|
118
160
|
const Q = /* @__PURE__ */ new Map(), ee = /* @__PURE__ */ new Map();
|
|
119
|
-
function Ae(
|
|
120
|
-
return
|
|
161
|
+
function Ae(t) {
|
|
162
|
+
return tt.includes(t);
|
|
121
163
|
}
|
|
122
|
-
function
|
|
164
|
+
function rt(t) {
|
|
123
165
|
const e = [];
|
|
124
166
|
if (typeof navigator < "u" && navigator.language) {
|
|
125
167
|
e.push(navigator.language);
|
|
126
168
|
const n = navigator.language.split("-")[0];
|
|
127
169
|
n && n !== navigator.language && e.push(n);
|
|
128
170
|
}
|
|
129
|
-
const
|
|
130
|
-
if (
|
|
131
|
-
e.push(
|
|
132
|
-
const n =
|
|
133
|
-
n && n !==
|
|
171
|
+
const r = t.settings.locale_default;
|
|
172
|
+
if (r) {
|
|
173
|
+
e.push(r);
|
|
174
|
+
const n = r.split("-")[0];
|
|
175
|
+
n && n !== r && e.push(n);
|
|
134
176
|
}
|
|
135
177
|
for (const n of e)
|
|
136
178
|
if (Ae(n)) return n;
|
|
137
179
|
return null;
|
|
138
180
|
}
|
|
139
|
-
function
|
|
140
|
-
return !!
|
|
181
|
+
function nt(t, e) {
|
|
182
|
+
return !!t.locales && t.locales[e] !== void 0;
|
|
141
183
|
}
|
|
142
|
-
async function
|
|
143
|
-
const e = Q.get(
|
|
184
|
+
async function it(t) {
|
|
185
|
+
const e = Q.get(t);
|
|
144
186
|
if (e) return e;
|
|
145
|
-
const
|
|
146
|
-
if (
|
|
147
|
-
const n =
|
|
187
|
+
const r = ee.get(t);
|
|
188
|
+
if (r) return r;
|
|
189
|
+
const n = et(/* @__PURE__ */ Object.assign({ "./locales/ar.ts": () => import("./chunks/ar-B2Wg_IrC.js"), "./locales/cs.ts": () => import("./chunks/cs-BNo9Dx0Q.js"), "./locales/da.ts": () => import("./chunks/da-Do9Lq6En.js"), "./locales/de.ts": () => import("./chunks/de-C8pDZNvx.js"), "./locales/el.ts": () => import("./chunks/el-DzMNX-_P.js"), "./locales/es.ts": () => import("./chunks/es-YrKt-q4w.js"), "./locales/fi.ts": () => import("./chunks/fi-Bh44pwZ4.js"), "./locales/fr.ts": () => import("./chunks/fr-Bc0pw4ws.js"), "./locales/he.ts": () => import("./chunks/he-Bfm-bhe3.js"), "./locales/hi.ts": () => import("./chunks/hi-D-O-B9Dn.js"), "./locales/hu.ts": () => import("./chunks/hu-CmIuAbLL.js"), "./locales/id.ts": () => import("./chunks/id-DN7IES-A.js"), "./locales/it.ts": () => import("./chunks/it-Cz5Nmqx5.js"), "./locales/ja.ts": () => import("./chunks/ja-BH9BlBh2.js"), "./locales/ko.ts": () => import("./chunks/ko-CYV9QuYs.js"), "./locales/nl.ts": () => import("./chunks/nl-BvkB900D.js"), "./locales/no.ts": () => import("./chunks/no-3s9_ormb.js"), "./locales/pl.ts": () => import("./chunks/pl-C9WTGQtb.js"), "./locales/pt.ts": () => import("./chunks/pt-uFVUv_Op.js"), "./locales/ro.ts": () => import("./chunks/ro-BrqQ8Au-.js"), "./locales/ru.ts": () => import("./chunks/ru-DK594dA8.js"), "./locales/sv.ts": () => import("./chunks/sv-CHNH8-mq.js"), "./locales/th.ts": () => import("./chunks/th-l24Pm5q-.js"), "./locales/tr.ts": () => import("./chunks/tr-ADpigSY5.js"), "./locales/uk.ts": () => import("./chunks/uk-CGqo4jek.js"), "./locales/vi.ts": () => import("./chunks/vi-Dk9bTu6f.js"), "./locales/zh.ts": () => import("./chunks/zh-LDkEV2D9.js") }), `./locales/${t}.ts`, 3).then((i) => {
|
|
148
190
|
const s = i.default ?? {};
|
|
149
|
-
return Q.set(
|
|
191
|
+
return Q.set(t, s), s;
|
|
150
192
|
}).catch((i) => {
|
|
151
|
-
console.warn(`[paywall] failed to load locale chunk "${
|
|
193
|
+
console.warn(`[paywall] failed to load locale chunk "${t}"`, i);
|
|
152
194
|
const s = {};
|
|
153
|
-
return Q.set(
|
|
195
|
+
return Q.set(t, s), s;
|
|
154
196
|
}).finally(() => {
|
|
155
|
-
ee.delete(
|
|
197
|
+
ee.delete(t);
|
|
156
198
|
});
|
|
157
|
-
return ee.set(
|
|
199
|
+
return ee.set(t, n), n;
|
|
158
200
|
}
|
|
159
|
-
function
|
|
201
|
+
function ot({ bootstrap: t, forceLocale: e, children: r }) {
|
|
160
202
|
const [n, i] = x("en"), [s, a] = x(null);
|
|
161
203
|
B(() => {
|
|
162
204
|
const f = (e && Ae(e) ? e : null) ?? (() => {
|
|
163
|
-
if (!
|
|
164
|
-
const d =
|
|
165
|
-
return !d || !
|
|
205
|
+
if (!t) return null;
|
|
206
|
+
const d = rt(t);
|
|
207
|
+
return !d || !nt(t, d) ? null : d;
|
|
166
208
|
})();
|
|
167
209
|
if (!f) {
|
|
168
210
|
(s !== null || n !== "en") && (i("en"), a(null));
|
|
@@ -170,26 +212,26 @@ function et({ bootstrap: r, forceLocale: e, children: t }) {
|
|
|
170
212
|
}
|
|
171
213
|
if (f === n && s) return;
|
|
172
214
|
let h = !1;
|
|
173
|
-
return
|
|
215
|
+
return it(f).then((d) => {
|
|
174
216
|
h || (i(f), a(d));
|
|
175
217
|
}), () => {
|
|
176
218
|
h = !0;
|
|
177
219
|
};
|
|
178
|
-
}, [
|
|
220
|
+
}, [t, e]);
|
|
179
221
|
const c = {
|
|
180
222
|
locale: n,
|
|
181
223
|
t: s ? (l, f, h) => Ie(s[l] ?? f, h) : Se
|
|
182
224
|
};
|
|
183
|
-
return /* @__PURE__ */ o(Ce.Provider, { value: c, children:
|
|
225
|
+
return /* @__PURE__ */ o(Ce.Provider, { value: c, children: r });
|
|
184
226
|
}
|
|
185
227
|
function k() {
|
|
186
|
-
return
|
|
228
|
+
return $e(Ce);
|
|
187
229
|
}
|
|
188
230
|
const he = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
189
|
-
function
|
|
190
|
-
open:
|
|
231
|
+
function st({
|
|
232
|
+
open: t,
|
|
191
233
|
onClose: e,
|
|
192
|
-
labelledBy:
|
|
234
|
+
labelledBy: r,
|
|
193
235
|
brandColor: n,
|
|
194
236
|
topBanner: i,
|
|
195
237
|
allowClose: s = !0,
|
|
@@ -199,7 +241,7 @@ function tt({
|
|
|
199
241
|
}) {
|
|
200
242
|
const { t: f } = k(), h = R(null), d = R(null);
|
|
201
243
|
return B(() => {
|
|
202
|
-
if (!
|
|
244
|
+
if (!t) return;
|
|
203
245
|
d.current = document.activeElement ?? null;
|
|
204
246
|
const p = h.current;
|
|
205
247
|
p && (p.querySelector(he) ?? p).focus({ preventScroll: !0 });
|
|
@@ -217,15 +259,15 @@ function tt({
|
|
|
217
259
|
_.preventDefault();
|
|
218
260
|
return;
|
|
219
261
|
}
|
|
220
|
-
const A = S[0],
|
|
221
|
-
_.shiftKey && E === A ? (_.preventDefault(),
|
|
262
|
+
const A = S[0], D = S[S.length - 1], E = document.activeElement;
|
|
263
|
+
_.shiftKey && E === A ? (_.preventDefault(), D.focus()) : !_.shiftKey && E === D && (_.preventDefault(), A.focus());
|
|
222
264
|
};
|
|
223
265
|
document.addEventListener("keydown", y, !0);
|
|
224
266
|
const O = document.body.style.overflow;
|
|
225
267
|
return c || (document.body.style.overflow = "hidden"), () => {
|
|
226
268
|
document.removeEventListener("keydown", y, !0), c || (document.body.style.overflow = O), d.current?.focus?.({ preventScroll: !0 });
|
|
227
269
|
};
|
|
228
|
-
}, [
|
|
270
|
+
}, [t, e, s, c]), t ? /* @__PURE__ */ u(
|
|
229
271
|
"div",
|
|
230
272
|
{
|
|
231
273
|
class: `${c ? "absolute z-[1]" : "fixed z-[2147483647]"} inset-0 flex items-center justify-center bg-slate-950/50 p-2 sm:p-4 backdrop-blur-md animate-[pw-fade-in_180ms_ease-out]`,
|
|
@@ -247,7 +289,7 @@ function tt({
|
|
|
247
289
|
ref: h,
|
|
248
290
|
role: "dialog",
|
|
249
291
|
"aria-modal": "true",
|
|
250
|
-
"aria-labelledby":
|
|
292
|
+
"aria-labelledby": r,
|
|
251
293
|
tabIndex: -1,
|
|
252
294
|
class: "relative flex max-h-[calc(100dvh-1rem)] sm:max-h-[calc(100dvh-2rem)] w-full flex-col overflow-hidden rounded-xl bg-white outline-none",
|
|
253
295
|
style: {
|
|
@@ -290,8 +332,8 @@ function tt({
|
|
|
290
332
|
}
|
|
291
333
|
) : null;
|
|
292
334
|
}
|
|
293
|
-
function
|
|
294
|
-
switch (
|
|
335
|
+
function at(t, e) {
|
|
336
|
+
switch (t) {
|
|
295
337
|
case "google":
|
|
296
338
|
return e("auth.continue_with_google", "Continue with Google");
|
|
297
339
|
case "apple":
|
|
@@ -302,62 +344,62 @@ function rt(r, e) {
|
|
|
302
344
|
return e("auth.continue_with_facebook", "Continue with Facebook");
|
|
303
345
|
}
|
|
304
346
|
}
|
|
305
|
-
function pe(
|
|
306
|
-
const n = e === "signup" ?
|
|
307
|
-
if (!(
|
|
308
|
-
switch (
|
|
347
|
+
function pe(t, e, r) {
|
|
348
|
+
const n = e === "signup" ? r("auth.signup_failed", "Sign-up failed") : r("auth.signin_failed", "Sign-in failed");
|
|
349
|
+
if (!(t instanceof T)) return n;
|
|
350
|
+
switch (t.code) {
|
|
309
351
|
case "invalid_credentials":
|
|
310
|
-
return
|
|
352
|
+
return r("auth.invalid_credentials", "Invalid email or password");
|
|
311
353
|
case "email_not_confirmed":
|
|
312
|
-
return
|
|
354
|
+
return r("auth.email_not_confirmed", "Please confirm your email before signing in.");
|
|
313
355
|
case "email_exists":
|
|
314
356
|
case "user_already_exists":
|
|
315
|
-
return
|
|
357
|
+
return r("auth.email_exists", "An account with this email already exists.");
|
|
316
358
|
case "weak_password":
|
|
317
|
-
return
|
|
359
|
+
return r("auth.weak_password", "Password is too weak.");
|
|
318
360
|
case "invalid_otp":
|
|
319
361
|
case "otp_expired":
|
|
320
362
|
case "token_expired":
|
|
321
|
-
return
|
|
363
|
+
return r("auth.invalid_otp", "The code is invalid or has expired.");
|
|
322
364
|
case "over_email_send_rate_limit":
|
|
323
365
|
case "over_request_rate_limit":
|
|
324
366
|
case "rate_limited":
|
|
325
367
|
case "http_429":
|
|
326
|
-
return
|
|
368
|
+
return r("auth.rate_limited", "Too many requests. Please try again later.");
|
|
327
369
|
case "network_error":
|
|
328
|
-
return
|
|
370
|
+
return r("auth.network_error", "Network error. Please check your connection and try again.");
|
|
329
371
|
case "upstream":
|
|
330
372
|
case "upstream_error":
|
|
331
373
|
case "http_502":
|
|
332
374
|
case "http_503":
|
|
333
375
|
case "http_504":
|
|
334
|
-
return
|
|
376
|
+
return r("auth.service_unavailable", "Service is temporarily unavailable. Please try again.");
|
|
335
377
|
default:
|
|
336
378
|
return n;
|
|
337
379
|
}
|
|
338
380
|
}
|
|
339
|
-
function Le({ block:
|
|
340
|
-
const
|
|
341
|
-
if (!
|
|
381
|
+
function Le({ block: t, ctx: e }) {
|
|
382
|
+
const r = e.auth, n = e.authSession, i = t.allow_signup !== !1, s = t.allow_password_reset !== !1, a = t.hide_when_authenticated !== !1;
|
|
383
|
+
if (!r)
|
|
342
384
|
return typeof console < "u" && console.warn("[paywall] auth_panel rendered without AuthClient — pass `auth: true` to PaywallUI"), null;
|
|
343
385
|
const c = n && !n.user.is_anonymous ? n : null;
|
|
344
|
-
return c && a ? null : c ? /* @__PURE__ */ o(
|
|
386
|
+
return c && a ? null : c ? /* @__PURE__ */ o(lt, { email: c.user.email ?? "", onSignOut: () => r.signOut().catch(() => {
|
|
345
387
|
}) }) : /* @__PURE__ */ o(
|
|
346
|
-
|
|
388
|
+
ct,
|
|
347
389
|
{
|
|
348
|
-
block:
|
|
390
|
+
block: t,
|
|
349
391
|
allowSignup: i,
|
|
350
392
|
allowReset: s,
|
|
351
393
|
ctx: e
|
|
352
394
|
}
|
|
353
395
|
);
|
|
354
396
|
}
|
|
355
|
-
function
|
|
356
|
-
const { t } = k();
|
|
397
|
+
function lt({ email: t, onSignOut: e }) {
|
|
398
|
+
const { t: r } = k();
|
|
357
399
|
return /* @__PURE__ */ u("div", { class: "flex items-center justify-between gap-3 rounded-2xl bg-gray-100 px-4 py-3", children: [
|
|
358
400
|
/* @__PURE__ */ u("div", { class: "flex flex-col", children: [
|
|
359
|
-
/* @__PURE__ */ o("span", { class: "text-[10px] font-semibold uppercase tracking-wider text-gray-500", children:
|
|
360
|
-
/* @__PURE__ */ o("span", { class: "text-sm font-medium text-gray-900", children:
|
|
401
|
+
/* @__PURE__ */ o("span", { class: "text-[10px] font-semibold uppercase tracking-wider text-gray-500", children: r("auth.signed_in", "Signed in") }),
|
|
402
|
+
/* @__PURE__ */ o("span", { class: "text-sm font-medium text-gray-900", children: t })
|
|
361
403
|
] }),
|
|
362
404
|
/* @__PURE__ */ o(
|
|
363
405
|
"button",
|
|
@@ -365,19 +407,19 @@ function nt({ email: r, onSignOut: e }) {
|
|
|
365
407
|
type: "button",
|
|
366
408
|
onClick: e,
|
|
367
409
|
class: "rounded-md px-1.5 py-0.5 text-xs font-medium text-gray-600 transition-colors hover:bg-white hover:text-gray-900 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
368
|
-
children:
|
|
410
|
+
children: r("auth.sign_out", "Sign out")
|
|
369
411
|
}
|
|
370
412
|
)
|
|
371
413
|
] });
|
|
372
414
|
}
|
|
373
|
-
function
|
|
374
|
-
const { t: i } = k(), s = n.auth, a =
|
|
415
|
+
function ct({ block: t, allowSignup: e, allowReset: r, ctx: n }) {
|
|
416
|
+
const { t: i } = k(), s = n.auth, a = t.providers ?? [], c = n.initialAuthMode === "signup" && e ? "signup" : "signin", [l, f] = x(c), [h, d] = x(""), [b, w] = x(""), [v, p] = x(""), [y, O] = x(""), [_, S] = x(null), A = R(!1), [D, E] = x(null), [U, z] = x(null), [j, P] = x(!1), [L, N] = x(null);
|
|
375
417
|
B(() => {
|
|
376
418
|
if (typeof s.getLastLogin != "function") return;
|
|
377
419
|
let I = !1;
|
|
378
420
|
return s.getLastLogin().then(
|
|
379
421
|
(M) => {
|
|
380
|
-
I || !M || (
|
|
422
|
+
I || !M || (N(M), M.email && d((V) => V === "" ? M.email : V));
|
|
381
423
|
},
|
|
382
424
|
() => {
|
|
383
425
|
}
|
|
@@ -385,13 +427,13 @@ function it({ block: r, allowSignup: e, allowReset: t, ctx: n }) {
|
|
|
385
427
|
I = !0;
|
|
386
428
|
};
|
|
387
429
|
}, [s]);
|
|
388
|
-
const
|
|
389
|
-
f(I), E(null),
|
|
430
|
+
const q = (I) => {
|
|
431
|
+
f(I), E(null), z(null), P(!1);
|
|
390
432
|
}, Y = async (I) => {
|
|
391
433
|
if (I.preventDefault(), !(A.current || _)) {
|
|
392
434
|
A.current = !0;
|
|
393
435
|
try {
|
|
394
|
-
if (E(null),
|
|
436
|
+
if (E(null), z(null), l === "signup" && !j) {
|
|
395
437
|
if (!h.trim()) return;
|
|
396
438
|
P(!0);
|
|
397
439
|
return;
|
|
@@ -402,7 +444,7 @@ function it({ block: r, allowSignup: e, allowReset: t, ctx: n }) {
|
|
|
402
444
|
}
|
|
403
445
|
S("email");
|
|
404
446
|
try {
|
|
405
|
-
l === "signin" ? await s.signInWithEmail({ email: h, password: b }) : l === "signup" ? (await s.signUp({ email: h, password: b })).kind === "confirmation_required" && (w(""), f("signup_verify"),
|
|
447
|
+
l === "signin" ? await s.signInWithEmail({ email: h, password: b }) : l === "signup" ? (await s.signUp({ email: h, password: b })).kind === "confirmation_required" && (w(""), f("signup_verify"), z(i("auth.check_email_message", "Check your email for a confirmation code."))) : l === "forgot" ? (await s.requestPasswordReset({ email: h }), f("reset_sent"), z(
|
|
406
448
|
i("auth.reset_sent_message", "If that email exists, a reset code has been sent.")
|
|
407
449
|
)) : l === "signup_verify" ? await s.verifyOtp({ email: h, token: y, type: "email" }) : l === "reset_verify" && (await s.verifyOtp({
|
|
408
450
|
email: h,
|
|
@@ -420,7 +462,7 @@ function it({ block: r, allowSignup: e, allowReset: t, ctx: n }) {
|
|
|
420
462
|
}
|
|
421
463
|
}, m = async (I) => {
|
|
422
464
|
if (!(A.current || _)) {
|
|
423
|
-
A.current = !0, S(I), E(null),
|
|
465
|
+
A.current = !0, S(I), E(null), z(null);
|
|
424
466
|
try {
|
|
425
467
|
await s.signInWithOAuth({
|
|
426
468
|
provider: I,
|
|
@@ -436,7 +478,7 @@ function it({ block: r, allowSignup: e, allowReset: t, ctx: n }) {
|
|
|
436
478
|
}
|
|
437
479
|
}, g = a.length > 0 && (l === "signin" || l === "signup"), C = l === "signin" || l === "signup" || l === "forgot", K = l === "signin" || l === "signup" && j;
|
|
438
480
|
return /* @__PURE__ */ u("div", { class: "flex flex-col gap-5", children: [
|
|
439
|
-
/* @__PURE__ */ o(
|
|
481
|
+
/* @__PURE__ */ o(ut, { mode: l, customHeading: t.heading, customSubheading: t.subheading }),
|
|
440
482
|
g ? /* @__PURE__ */ u("div", { class: "flex flex-col gap-2.5", children: [
|
|
441
483
|
a.map((I) => /* @__PURE__ */ u("div", { class: "relative", children: [
|
|
442
484
|
/* @__PURE__ */ u(
|
|
@@ -447,14 +489,14 @@ function it({ block: r, allowSignup: e, allowReset: t, ctx: n }) {
|
|
|
447
489
|
disabled: _ !== null,
|
|
448
490
|
class: "flex h-12 w-full items-center justify-center gap-2.5 rounded-full border-1 border-gray-200 bg-white px-5 text-base font-medium text-gray-900 transition-all hover:border-gray-300 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-60 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
449
491
|
children: [
|
|
450
|
-
_ === I ? /* @__PURE__ */ o("span", { class: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-gray-700" }) : /* @__PURE__ */ o(
|
|
451
|
-
/* @__PURE__ */ o("span", { children:
|
|
492
|
+
_ === I ? /* @__PURE__ */ o("span", { class: "inline-block h-4 w-4 animate-spin rounded-full border-2 border-gray-300 border-t-gray-700" }) : /* @__PURE__ */ o(wt, { provider: I }),
|
|
493
|
+
/* @__PURE__ */ o("span", { children: at(I, i) })
|
|
452
494
|
]
|
|
453
495
|
}
|
|
454
496
|
),
|
|
455
|
-
L?.method === I ? /* @__PURE__ */ o(
|
|
497
|
+
L?.method === I ? /* @__PURE__ */ o(yt, { email: L.email }) : null
|
|
456
498
|
] }, I)),
|
|
457
|
-
/* @__PURE__ */ o(
|
|
499
|
+
/* @__PURE__ */ o(bt, {})
|
|
458
500
|
] }) : null,
|
|
459
501
|
/* @__PURE__ */ u("form", { onSubmit: Y, class: "flex flex-col gap-3", children: [
|
|
460
502
|
C && /* @__PURE__ */ o(
|
|
@@ -513,40 +555,40 @@ function it({ block: r, allowSignup: e, allowReset: t, ctx: n }) {
|
|
|
513
555
|
}
|
|
514
556
|
),
|
|
515
557
|
l === "reset_sent" && U && /* @__PURE__ */ o("p", { class: "rounded-2xl bg-gray-100 px-4 py-3 text-sm text-gray-600", children: U }),
|
|
516
|
-
l === "signin" &&
|
|
517
|
-
|
|
558
|
+
l === "signin" && r && /* @__PURE__ */ o("div", { class: "flex justify-end text-sm", children: /* @__PURE__ */ o(Z, { onClick: () => q("forgot"), children: i("auth.forgot_password", "Forgot password?") }) }),
|
|
559
|
+
D && /* @__PURE__ */ o("p", { class: "text-sm text-red-600", children: D }),
|
|
518
560
|
U && l !== "reset_sent" && /* @__PURE__ */ o("p", { class: "text-sm text-gray-500", children: U }),
|
|
519
561
|
l !== "reset_sent" && /* @__PURE__ */ o(
|
|
520
|
-
|
|
562
|
+
ft,
|
|
521
563
|
{
|
|
522
564
|
busy: _ === "email",
|
|
523
|
-
label:
|
|
565
|
+
label: ht(l, j, t.submit_label ?? t.heading, i)
|
|
524
566
|
}
|
|
525
567
|
)
|
|
526
568
|
] }),
|
|
527
569
|
/* @__PURE__ */ o(
|
|
528
|
-
|
|
570
|
+
pt,
|
|
529
571
|
{
|
|
530
572
|
mode: l,
|
|
531
573
|
allowSignup: e,
|
|
532
|
-
onSwitch:
|
|
574
|
+
onSwitch: q
|
|
533
575
|
}
|
|
534
576
|
)
|
|
535
577
|
] });
|
|
536
578
|
}
|
|
537
|
-
function
|
|
538
|
-
mode:
|
|
579
|
+
function ut({
|
|
580
|
+
mode: t,
|
|
539
581
|
customHeading: e,
|
|
540
|
-
customSubheading:
|
|
582
|
+
customSubheading: r
|
|
541
583
|
}) {
|
|
542
|
-
const { t: n } = k(), i =
|
|
584
|
+
const { t: n } = k(), i = dt(t, n), s = t === "signin" || t === "signup", a = s && e ? e : i.title, c = s && r !== void 0 ? r || null : i.subtitle;
|
|
543
585
|
return /* @__PURE__ */ u("div", { class: "flex flex-col gap-2", children: [
|
|
544
586
|
/* @__PURE__ */ o("h2", { class: "text-3xl font-bold tracking-tight text-gray-900", children: a }),
|
|
545
587
|
c ? /* @__PURE__ */ o("p", { class: "text-base leading-relaxed text-gray-600", children: c }) : null
|
|
546
588
|
] });
|
|
547
589
|
}
|
|
548
|
-
function
|
|
549
|
-
switch (
|
|
590
|
+
function dt(t, e) {
|
|
591
|
+
switch (t) {
|
|
550
592
|
case "signin":
|
|
551
593
|
return {
|
|
552
594
|
title: e("auth.welcome", "Welcome back!"),
|
|
@@ -588,9 +630,9 @@ function st(r, e) {
|
|
|
588
630
|
};
|
|
589
631
|
}
|
|
590
632
|
}
|
|
591
|
-
function
|
|
592
|
-
if (
|
|
593
|
-
switch (
|
|
633
|
+
function ht(t, e, r, n) {
|
|
634
|
+
if (t === "signin" && r) return r;
|
|
635
|
+
switch (t) {
|
|
594
636
|
case "signin":
|
|
595
637
|
return n("auth.log_in", "Sign In");
|
|
596
638
|
case "signup":
|
|
@@ -604,62 +646,62 @@ function at(r, e, t, n) {
|
|
|
604
646
|
return n("cta.continue", "Continue");
|
|
605
647
|
}
|
|
606
648
|
}
|
|
607
|
-
function
|
|
608
|
-
mode:
|
|
649
|
+
function pt({
|
|
650
|
+
mode: t,
|
|
609
651
|
allowSignup: e,
|
|
610
|
-
onSwitch:
|
|
652
|
+
onSwitch: r
|
|
611
653
|
}) {
|
|
612
654
|
const { t: n } = k();
|
|
613
|
-
return
|
|
655
|
+
return t === "signin" && e ? /* @__PURE__ */ u("p", { class: "text-center text-sm text-gray-600", children: [
|
|
614
656
|
n("auth.no_account", "Don't have an account?"),
|
|
615
657
|
" ",
|
|
616
|
-
/* @__PURE__ */ o(Z, { onClick: () =>
|
|
617
|
-
] }) :
|
|
658
|
+
/* @__PURE__ */ o(Z, { onClick: () => r("signup"), children: n("auth.sign_up_link", "Sign Up") })
|
|
659
|
+
] }) : t === "signup" || t === "signup_verify" ? /* @__PURE__ */ u("p", { class: "text-center text-sm text-gray-600", children: [
|
|
618
660
|
n("auth.have_account", "Already have an account?"),
|
|
619
661
|
" ",
|
|
620
|
-
/* @__PURE__ */ o(Z, { onClick: () =>
|
|
621
|
-
] }) :
|
|
662
|
+
/* @__PURE__ */ o(Z, { onClick: () => r("signin"), children: n("auth.log_in_link", "Log In") })
|
|
663
|
+
] }) : t === "forgot" || t === "reset_sent" || t === "reset_verify" ? /* @__PURE__ */ u("p", { class: "text-center text-sm text-gray-600", children: [
|
|
622
664
|
n("auth.no_account", "Don't have an account?"),
|
|
623
665
|
" ",
|
|
624
|
-
/* @__PURE__ */ o(Z, { onClick: () =>
|
|
666
|
+
/* @__PURE__ */ o(Z, { onClick: () => r("signup"), children: n("auth.sign_up_link", "Sign Up") })
|
|
625
667
|
] }) : null;
|
|
626
668
|
}
|
|
627
669
|
function Z({
|
|
628
|
-
onClick:
|
|
670
|
+
onClick: t,
|
|
629
671
|
children: e
|
|
630
672
|
}) {
|
|
631
673
|
return /* @__PURE__ */ o(
|
|
632
674
|
"button",
|
|
633
675
|
{
|
|
634
676
|
type: "button",
|
|
635
|
-
onClick:
|
|
677
|
+
onClick: t,
|
|
636
678
|
class: "font-semibold transition-opacity hover:opacity-80 focus:outline-none focus-visible:opacity-80",
|
|
637
679
|
style: { color: "var(--pw-accent)" },
|
|
638
680
|
children: e
|
|
639
681
|
}
|
|
640
682
|
);
|
|
641
683
|
}
|
|
642
|
-
function
|
|
684
|
+
function ft({ busy: t, label: e }) {
|
|
643
685
|
return /* @__PURE__ */ o(
|
|
644
686
|
"button",
|
|
645
687
|
{
|
|
646
688
|
type: "submit",
|
|
647
|
-
disabled:
|
|
689
|
+
disabled: t,
|
|
648
690
|
class: "pw-cta-shimmer relative mt-1 flex min-h-12 w-full items-center justify-center overflow-hidden rounded-3xl px-5 py-2 text-center text-base font-semibold leading-tight text-white transition-transform duration-150 active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-60 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--pw-accent)]",
|
|
649
691
|
style: {
|
|
650
692
|
background: "linear-gradient(135deg, color-mix(in srgb, var(--pw-accent) 55%, white) 0%, var(--pw-accent) 55%, color-mix(in srgb, var(--pw-accent) 90%, black) 100%)",
|
|
651
693
|
boxShadow: "0 0 20px 0 color-mix(in srgb, var(--pw-accent) 25%, transparent), inset 0 0 8px 0 color-mix(in srgb, white 25%, transparent)"
|
|
652
694
|
},
|
|
653
|
-
children:
|
|
695
|
+
children: t ? /* @__PURE__ */ o("span", { class: "relative z-10 inline-block h-4 w-4 animate-spin rounded-full border-2 border-white/40 border-t-white" }) : /* @__PURE__ */ o("span", { class: "relative z-10", children: e })
|
|
654
696
|
}
|
|
655
697
|
);
|
|
656
698
|
}
|
|
657
|
-
function fe({ type:
|
|
699
|
+
function fe({ type: t, placeholder: e, value: r, onInput: n, autocomplete: i, inputMode: s, required: a }) {
|
|
658
700
|
return /* @__PURE__ */ o(
|
|
659
701
|
"input",
|
|
660
702
|
{
|
|
661
|
-
type:
|
|
662
|
-
value:
|
|
703
|
+
type: t,
|
|
704
|
+
value: r,
|
|
663
705
|
placeholder: e,
|
|
664
706
|
onInput: (c) => n(c.target.value),
|
|
665
707
|
autocomplete: i,
|
|
@@ -669,7 +711,7 @@ function fe({ type: r, placeholder: e, value: t, onInput: n, autocomplete: i, in
|
|
|
669
711
|
}
|
|
670
712
|
);
|
|
671
713
|
}
|
|
672
|
-
function te({ placeholder:
|
|
714
|
+
function te({ placeholder: t, value: e, onInput: r, autocomplete: n, required: i }) {
|
|
673
715
|
const { t: s } = k(), [a, c] = x(!1), l = R(null);
|
|
674
716
|
B(() => {
|
|
675
717
|
const d = l.current;
|
|
@@ -683,8 +725,8 @@ function te({ placeholder: r, value: e, onInput: t, autocomplete: n, required: i
|
|
|
683
725
|
ref: l,
|
|
684
726
|
type: a ? "text" : "password",
|
|
685
727
|
value: e,
|
|
686
|
-
placeholder:
|
|
687
|
-
onInput: (d) =>
|
|
728
|
+
placeholder: t,
|
|
729
|
+
onInput: (d) => r(d.target.value),
|
|
688
730
|
autocomplete: n,
|
|
689
731
|
required: i,
|
|
690
732
|
class: "h-14 w-full rounded-2xl bg-gray-100 pl-5 pr-12 text-base text-gray-900 outline-none transition-all placeholder:text-gray-500 hover:bg-gray-200/60 focus:bg-gray-200/60 focus:shadow-[0_0_0_2px_color-mix(in_srgb,var(--pw-accent)_30%,transparent)]"
|
|
@@ -698,12 +740,12 @@ function te({ placeholder: r, value: e, onInput: t, autocomplete: n, required: i
|
|
|
698
740
|
"aria-label": a ? h : f,
|
|
699
741
|
tabIndex: -1,
|
|
700
742
|
class: "absolute right-4 top-1/2 -translate-y-1/2 flex h-6 w-6 items-center justify-center rounded text-gray-500 transition-colors hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
701
|
-
children: a ? /* @__PURE__ */ o(
|
|
743
|
+
children: a ? /* @__PURE__ */ o(mt, {}) : /* @__PURE__ */ o(gt, {})
|
|
702
744
|
}
|
|
703
745
|
)
|
|
704
746
|
] });
|
|
705
747
|
}
|
|
706
|
-
function
|
|
748
|
+
function gt() {
|
|
707
749
|
return /* @__PURE__ */ u("svg", { width: "18", height: "18", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: [
|
|
708
750
|
/* @__PURE__ */ o(
|
|
709
751
|
"path",
|
|
@@ -718,7 +760,7 @@ function ut() {
|
|
|
718
760
|
/* @__PURE__ */ o("circle", { cx: "10", cy: "10", r: "2.5", stroke: "currentColor", "stroke-width": "1.5" })
|
|
719
761
|
] });
|
|
720
762
|
}
|
|
721
|
-
function
|
|
763
|
+
function mt() {
|
|
722
764
|
return /* @__PURE__ */ u("svg", { width: "18", height: "18", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: [
|
|
723
765
|
/* @__PURE__ */ o(
|
|
724
766
|
"path",
|
|
@@ -742,39 +784,39 @@ function dt() {
|
|
|
742
784
|
)
|
|
743
785
|
] });
|
|
744
786
|
}
|
|
745
|
-
function
|
|
746
|
-
const { t: e } = k(),
|
|
747
|
-
return /* @__PURE__ */ o("span", { class: "pointer-events-none absolute -top-2 right-3 max-w-[75%] truncate rounded-full bg-gray-900 px-2 py-0.5 text-[10px] font-semibold tracking-wide text-white shadow-sm", children:
|
|
787
|
+
function yt({ email: t }) {
|
|
788
|
+
const { t: e } = k(), r = t ? e("auth.last_used", "Last · {email}", { email: xt(t) }) : e("auth.last_used_no_email", "Last");
|
|
789
|
+
return /* @__PURE__ */ o("span", { class: "pointer-events-none absolute -top-2 right-3 max-w-[75%] truncate rounded-full bg-gray-900 px-2 py-0.5 text-[10px] font-semibold tracking-wide text-white shadow-sm", children: r });
|
|
748
790
|
}
|
|
749
|
-
function
|
|
750
|
-
const [e,
|
|
751
|
-
return
|
|
791
|
+
function xt(t) {
|
|
792
|
+
const [e, r] = t.split("@");
|
|
793
|
+
return r ? `${e.slice(0, 3)}*****@${r}` : t;
|
|
752
794
|
}
|
|
753
|
-
function
|
|
754
|
-
const { t
|
|
795
|
+
function bt() {
|
|
796
|
+
const { t } = k();
|
|
755
797
|
return /* @__PURE__ */ u("div", { class: "flex items-center gap-3 py-1 text-sm text-gray-400", children: [
|
|
756
798
|
/* @__PURE__ */ o("div", { class: "h-px flex-1 bg-gray-200" }),
|
|
757
|
-
/* @__PURE__ */ o("span", { children:
|
|
799
|
+
/* @__PURE__ */ o("span", { children: t("auth.or", "or") }),
|
|
758
800
|
/* @__PURE__ */ o("div", { class: "h-px flex-1 bg-gray-200" })
|
|
759
801
|
] });
|
|
760
802
|
}
|
|
761
|
-
function
|
|
762
|
-
return
|
|
803
|
+
function wt({ provider: t }) {
|
|
804
|
+
return t === "google" ? /* @__PURE__ */ u("svg", { width: "20", height: "20", viewBox: "0 0 18 18", "aria-hidden": "true", children: [
|
|
763
805
|
/* @__PURE__ */ o("path", { fill: "#4285F4", d: "M17.64 9.2c0-.64-.06-1.25-.16-1.84H9v3.49h4.84a4.14 4.14 0 0 1-1.79 2.71v2.26h2.9c1.7-1.56 2.69-3.87 2.69-6.62Z" }),
|
|
764
806
|
/* @__PURE__ */ o("path", { fill: "#34A853", d: "M9 18c2.43 0 4.47-.8 5.96-2.18l-2.9-2.26c-.8.54-1.83.86-3.06.86-2.36 0-4.36-1.59-5.07-3.74H.92v2.33A9 9 0 0 0 9 18Z" }),
|
|
765
807
|
/* @__PURE__ */ o("path", { fill: "#FBBC05", d: "M3.93 10.68a5.4 5.4 0 0 1 0-3.36V4.99H.92a9 9 0 0 0 0 8.02l3-2.33Z" }),
|
|
766
808
|
/* @__PURE__ */ o("path", { fill: "#EA4335", d: "M9 3.58c1.32 0 2.5.45 3.44 1.34l2.58-2.58A9 9 0 0 0 .92 4.99l3.01 2.33C4.64 5.17 6.64 3.58 9 3.58Z" })
|
|
767
|
-
] }) :
|
|
809
|
+
] }) : t === "apple" ? (
|
|
768
810
|
// viewBox 0 0 24 24 даёт воздух сверху/снизу пути, поэтому визуально
|
|
769
811
|
// Apple-яблоко выглядит меньше Google. Компенсируем увеличенным
|
|
770
812
|
// width/height — 26×26 даёт примерно equal optical size с Google 20×20.
|
|
771
813
|
/* @__PURE__ */ o("svg", { width: "26", height: "26", viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ o("path", { d: "M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09zM12 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z" }) })
|
|
772
|
-
) :
|
|
814
|
+
) : t === "github" ? /* @__PURE__ */ o("svg", { width: "20", height: "20", viewBox: "0 0 16 16", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ o("path", { d: "M8 0C3.6 0 0 3.6 0 8a8 8 0 0 0 5.5 7.6c.4.1.5-.2.5-.4v-1.5c-2.2.5-2.7-1-2.7-1-.4-.9-.9-1.2-.9-1.2-.7-.5.1-.5.1-.5.8.1 1.2.8 1.2.8.7 1.2 1.9.9 2.4.7 0-.5.3-.9.5-1.1-1.8-.2-3.6-.9-3.6-4 0-.9.3-1.6.8-2.1-.1-.2-.4-1 .1-2.1 0 0 .7-.2 2.2.8a7.6 7.6 0 0 1 4 0c1.5-1 2.2-.8 2.2-.8.4 1.1.2 1.9.1 2.1.5.5.8 1.2.8 2.1 0 3.1-1.9 3.7-3.6 3.9.3.3.6.8.6 1.6V15c0 .2.1.5.6.4A8 8 0 0 0 16 8c0-4.4-3.6-8-8-8Z" }) }) : /* @__PURE__ */ o("svg", { width: "18", height: "20", viewBox: "0 0 14 16", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ o("path", { d: "M14 2.7C14 1.2 12.8 0 11.3 0H2.7C1.2 0 0 1.2 0 2.7v10.6C0 14.8 1.2 16 2.7 16h4V9.8H4.7v-2H6.7V6.4c0-2 1.2-3.1 3-3.1.9 0 1.7.1 2 .2V5h-1.4c-.8 0-1 .4-1 1v1.5h2.4l-.3 2H9.3V16h2c1.5 0 2.7-1.2 2.7-2.7V2.7Z" }) });
|
|
773
815
|
}
|
|
774
|
-
function
|
|
775
|
-
block:
|
|
816
|
+
function kt({
|
|
817
|
+
block: t,
|
|
776
818
|
bootstrap: e,
|
|
777
|
-
auth:
|
|
819
|
+
auth: r,
|
|
778
820
|
authSession: n,
|
|
779
821
|
onBack: i,
|
|
780
822
|
showBack: s = !0,
|
|
@@ -788,18 +830,18 @@ function mt({
|
|
|
788
830
|
},
|
|
789
831
|
onAction: () => {
|
|
790
832
|
},
|
|
791
|
-
auth:
|
|
833
|
+
auth: r,
|
|
792
834
|
authSession: n,
|
|
793
835
|
initialAuthMode: c
|
|
794
836
|
}, h = a === "restore" ? {
|
|
795
|
-
...
|
|
837
|
+
...t,
|
|
796
838
|
heading: l("auth.restore_purchases_heading", "Restore Purchases"),
|
|
797
839
|
subheading: l(
|
|
798
840
|
"auth.restore_purchases_subheading",
|
|
799
841
|
"Please sign in to restore your purchases."
|
|
800
842
|
)
|
|
801
843
|
} : a === "preauth" ? {
|
|
802
|
-
...
|
|
844
|
+
...t,
|
|
803
845
|
heading: l("auth.login_continue_purchase", "Log in to continue your purchase"),
|
|
804
846
|
subheading: l(
|
|
805
847
|
"auth.link_purchase_subheading",
|
|
@@ -810,18 +852,18 @@ function mt({
|
|
|
810
852
|
// чтобы продолжить покупку") в pill-кнопку h-12 не помещаются и
|
|
811
853
|
// переносятся на 2 строки. Явный короткий submit_label решает.
|
|
812
854
|
submit_label: l("auth.log_in", "Sign In")
|
|
813
|
-
} :
|
|
855
|
+
} : t;
|
|
814
856
|
return /* @__PURE__ */ u("div", { class: "relative flex-1 min-h-0 overflow-y-auto p-6 sm:p-8", children: [
|
|
815
|
-
s ? /* @__PURE__ */ o(
|
|
857
|
+
s ? /* @__PURE__ */ o(vt, { onClick: i, ariaLabel: l("nav.back_aria", "Back") }) : null,
|
|
816
858
|
/* @__PURE__ */ o(Le, { block: h, ctx: f })
|
|
817
859
|
] });
|
|
818
860
|
}
|
|
819
|
-
function
|
|
861
|
+
function vt({ onClick: t, ariaLabel: e }) {
|
|
820
862
|
return /* @__PURE__ */ o(
|
|
821
863
|
"button",
|
|
822
864
|
{
|
|
823
865
|
type: "button",
|
|
824
|
-
onClick:
|
|
866
|
+
onClick: t,
|
|
825
867
|
"aria-label": e,
|
|
826
868
|
class: "absolute right-4 top-4 z-10 flex h-8 w-8 items-center justify-center rounded-full text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
827
869
|
children: /* @__PURE__ */ u("svg", { width: "18", height: "18", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: [
|
|
@@ -849,9 +891,9 @@ function yt({ onClick: r, ariaLabel: e }) {
|
|
|
849
891
|
}
|
|
850
892
|
);
|
|
851
893
|
}
|
|
852
|
-
const Me = (
|
|
853
|
-
function re(
|
|
854
|
-
const e =
|
|
894
|
+
const Me = (t) => `pw-offer-${t}-start`;
|
|
895
|
+
function re(t) {
|
|
896
|
+
const e = t - Date.now();
|
|
855
897
|
return e <= 0 ? { days: 0, hours: 0, minutes: 0, seconds: 0, expired: !0 } : {
|
|
856
898
|
days: Math.floor(e / (1e3 * 60 * 60 * 24)),
|
|
857
899
|
hours: Math.floor(e % (1e3 * 60 * 60 * 24) / (1e3 * 60 * 60)),
|
|
@@ -860,33 +902,33 @@ function re(r) {
|
|
|
860
902
|
expired: !1
|
|
861
903
|
};
|
|
862
904
|
}
|
|
863
|
-
function
|
|
864
|
-
if (
|
|
865
|
-
const e = Date.parse(
|
|
905
|
+
function _t(t) {
|
|
906
|
+
if (t.expires_at) {
|
|
907
|
+
const e = Date.parse(t.expires_at);
|
|
866
908
|
return Number.isFinite(e) ? e : null;
|
|
867
909
|
}
|
|
868
|
-
if (
|
|
910
|
+
if (t.duration_minutes && t.duration_minutes > 0) {
|
|
869
911
|
if (typeof window > "u") return null;
|
|
870
912
|
try {
|
|
871
|
-
const e = Me(
|
|
872
|
-
let
|
|
873
|
-
return
|
|
913
|
+
const e = Me(t.id);
|
|
914
|
+
let r = window.localStorage.getItem(e);
|
|
915
|
+
return r || (r = (/* @__PURE__ */ new Date()).toISOString(), window.localStorage.setItem(e, r)), Date.parse(r) + t.duration_minutes * 6e4;
|
|
874
916
|
} catch {
|
|
875
917
|
return null;
|
|
876
918
|
}
|
|
877
919
|
}
|
|
878
920
|
return null;
|
|
879
921
|
}
|
|
880
|
-
function Ee(
|
|
881
|
-
if (!
|
|
922
|
+
function Ee(t, e) {
|
|
923
|
+
if (!t || t.length === 0) return null;
|
|
882
924
|
if (e) {
|
|
883
|
-
const
|
|
884
|
-
if (
|
|
925
|
+
const r = t.find((n) => n.id === e);
|
|
926
|
+
if (r) return r;
|
|
885
927
|
}
|
|
886
|
-
return
|
|
928
|
+
return t.find((r) => r.expires_at || r.duration_minutes) ?? null;
|
|
887
929
|
}
|
|
888
|
-
function Pe(
|
|
889
|
-
const e =
|
|
930
|
+
function Pe(t) {
|
|
931
|
+
const e = t ? _t(t) : null, [r, n] = x(
|
|
890
932
|
() => e !== null ? re(e) : null
|
|
891
933
|
), i = R(e);
|
|
892
934
|
return i.current = e, B(() => {
|
|
@@ -897,19 +939,19 @@ function Pe(r) {
|
|
|
897
939
|
n(re(e));
|
|
898
940
|
const s = setInterval(() => {
|
|
899
941
|
const a = re(i.current ?? 0);
|
|
900
|
-
if (n(a), a.expired && (clearInterval(s),
|
|
942
|
+
if (n(a), a.expired && (clearInterval(s), t?.duration_minutes && typeof window < "u"))
|
|
901
943
|
try {
|
|
902
|
-
window.localStorage.removeItem(Me(
|
|
944
|
+
window.localStorage.removeItem(Me(t.id));
|
|
903
945
|
} catch {
|
|
904
946
|
}
|
|
905
947
|
}, 1e3);
|
|
906
948
|
return () => clearInterval(s);
|
|
907
|
-
}, [e,
|
|
949
|
+
}, [e, t?.duration_minutes, t?.id]), r;
|
|
908
950
|
}
|
|
909
|
-
function
|
|
910
|
-
const { t } = k(), n = Ee(e.bootstrap.offers,
|
|
911
|
-
if (!n || i === null || i.expired && !
|
|
912
|
-
const s =
|
|
951
|
+
function St({ block: t, ctx: e }) {
|
|
952
|
+
const { t: r } = k(), n = Ee(e.bootstrap.offers, t.offer_id), i = Pe(n);
|
|
953
|
+
if (!n || i === null || i.expired && !t.force) return null;
|
|
954
|
+
const s = t.title ?? n.label ?? r("offer.limited_time", "Limited-time offer"), a = n.discount_percent ? `${s} ${n.discount_percent}%` : s;
|
|
913
955
|
return /* @__PURE__ */ u(
|
|
914
956
|
"div",
|
|
915
957
|
{
|
|
@@ -922,32 +964,32 @@ function bt({ block: r, ctx: e }) {
|
|
|
922
964
|
children: [
|
|
923
965
|
/* @__PURE__ */ o(Be, {}),
|
|
924
966
|
/* @__PURE__ */ o("span", { children: a }),
|
|
925
|
-
/* @__PURE__ */ o(Te, { value: i, t })
|
|
967
|
+
/* @__PURE__ */ o(Te, { value: i, t: r })
|
|
926
968
|
]
|
|
927
969
|
}
|
|
928
970
|
);
|
|
929
971
|
}
|
|
930
|
-
function Te({ value:
|
|
972
|
+
function Te({ value: t, t: e }) {
|
|
931
973
|
return /* @__PURE__ */ u("div", { class: "flex items-center gap-1 font-mono text-sm", children: [
|
|
932
|
-
|
|
933
|
-
/* @__PURE__ */ o(
|
|
974
|
+
t.days > 0 ? /* @__PURE__ */ u(se, { children: [
|
|
975
|
+
/* @__PURE__ */ o(H, { children: String(t.days) }),
|
|
934
976
|
/* @__PURE__ */ o("span", { class: "text-xs", children: e("countdown.d", "d") })
|
|
935
977
|
] }) : null,
|
|
936
|
-
/* @__PURE__ */ o(
|
|
978
|
+
/* @__PURE__ */ o(H, { children: String(t.hours).padStart(2, "0") }),
|
|
937
979
|
/* @__PURE__ */ o("span", { class: "text-xs", children: e("countdown.h", "h") }),
|
|
938
|
-
/* @__PURE__ */ o(
|
|
980
|
+
/* @__PURE__ */ o(H, { children: String(t.minutes).padStart(2, "0") }),
|
|
939
981
|
/* @__PURE__ */ o("span", { class: "text-xs", children: e("countdown.m", "m") }),
|
|
940
|
-
/* @__PURE__ */ o(
|
|
982
|
+
/* @__PURE__ */ o(H, { children: String(t.seconds).padStart(2, "0") }),
|
|
941
983
|
/* @__PURE__ */ o("span", { class: "text-xs", children: e("countdown.s", "s") })
|
|
942
984
|
] });
|
|
943
985
|
}
|
|
944
|
-
function
|
|
945
|
-
return /* @__PURE__ */ o("span", { class: "rounded bg-black/20 px-1.5 py-0.5 text-xs font-bold", children:
|
|
986
|
+
function H({ children: t }) {
|
|
987
|
+
return /* @__PURE__ */ o("span", { class: "rounded bg-black/20 px-1.5 py-0.5 text-xs font-bold", children: t });
|
|
946
988
|
}
|
|
947
|
-
function
|
|
948
|
-
const { t: e } = k(),
|
|
949
|
-
if (
|
|
950
|
-
const n =
|
|
989
|
+
function Ct({ offer: t }) {
|
|
990
|
+
const { t: e } = k(), r = Pe(t);
|
|
991
|
+
if (r === null || r.expired) return null;
|
|
992
|
+
const n = t.label ?? e("offer.limited_time", "Limited-time offer"), i = t.discount_percent ? `${n} ${t.discount_percent}%` : n;
|
|
951
993
|
return /* @__PURE__ */ u(
|
|
952
994
|
"div",
|
|
953
995
|
{
|
|
@@ -960,7 +1002,7 @@ function wt({ offer: r }) {
|
|
|
960
1002
|
children: [
|
|
961
1003
|
/* @__PURE__ */ o(Be, {}),
|
|
962
1004
|
/* @__PURE__ */ o("span", { children: i }),
|
|
963
|
-
/* @__PURE__ */ o(Te, { value:
|
|
1005
|
+
/* @__PURE__ */ o(Te, { value: r, t: e })
|
|
964
1006
|
]
|
|
965
1007
|
}
|
|
966
1008
|
);
|
|
@@ -984,38 +1026,38 @@ function Be() {
|
|
|
984
1026
|
}
|
|
985
1027
|
);
|
|
986
1028
|
}
|
|
987
|
-
const ge = 3, me = 200, ye = 5e3, ne = 5,
|
|
988
|
-
function
|
|
989
|
-
const { t: i } = k(), s = e?.user.email ?? "", a = s || null, [c, l] = x(s), [f, h] = x(""), [d, b] = x(""), [w, v] = x([]), [p, y] = x(!1), [O, _] = x(null), [S, A] = x({}),
|
|
990
|
-
const P = {}, L = (a ?? c).trim(),
|
|
991
|
-
return L ?
|
|
1029
|
+
const ge = 3, me = 200, ye = 5e3, ne = 5, It = 10 * 1024 * 1024, xe = ["image/jpeg", "image/png", "image/webp"], At = /.+@.+\..+/;
|
|
1030
|
+
function Lt({ client: t, authSession: e, origin: r, onBack: n }) {
|
|
1031
|
+
const { t: i } = k(), s = e?.user.email ?? "", a = s || null, [c, l] = x(s), [f, h] = x(""), [d, b] = x(""), [w, v] = x([]), [p, y] = x(!1), [O, _] = x(null), [S, A] = x({}), D = () => {
|
|
1032
|
+
const P = {}, L = (a ?? c).trim(), N = f.trim(), q = d.trim();
|
|
1033
|
+
return L ? At.test(L.toLowerCase()) || (P.email = i("support.invalid_email", "Invalid email")) : P.email = i("support.required", "Required"), (N.length < ge || N.length > me) && (P.subject = i("support.subject_length", "{min}–{max} characters", {
|
|
992
1034
|
min: ge,
|
|
993
1035
|
max: me
|
|
994
|
-
})), (
|
|
1036
|
+
})), (q.length < 1 || q.length > ye) && (P.message = i("support.message_length", "{min}–{max} characters", {
|
|
995
1037
|
min: 1,
|
|
996
1038
|
max: ye
|
|
997
1039
|
})), A(P), Object.keys(P).length === 0;
|
|
998
1040
|
}, E = async (P) => {
|
|
999
|
-
if (P.preventDefault(), !p &&
|
|
1041
|
+
if (P.preventDefault(), !p && D()) {
|
|
1000
1042
|
y(!0), A((L) => ({ ...L, submit: void 0 }));
|
|
1001
1043
|
try {
|
|
1002
1044
|
const L = (a ?? c).trim();
|
|
1003
|
-
await
|
|
1045
|
+
await t.createSupportTicket({
|
|
1004
1046
|
subject: f.trim(),
|
|
1005
1047
|
content: d.trim(),
|
|
1006
1048
|
email: L || void 0,
|
|
1007
1049
|
files: w.length > 0 ? w : void 0
|
|
1008
1050
|
}), _(L);
|
|
1009
1051
|
} catch (L) {
|
|
1010
|
-
const
|
|
1011
|
-
A((
|
|
1052
|
+
const N = L instanceof T && L.message || "Failed to send. Please try again.";
|
|
1053
|
+
A((q) => ({ ...q, submit: N }));
|
|
1012
1054
|
} finally {
|
|
1013
1055
|
y(!1);
|
|
1014
1056
|
}
|
|
1015
1057
|
}
|
|
1016
1058
|
}, U = () => {
|
|
1017
1059
|
h(""), b(""), v([]), A({}), _(null);
|
|
1018
|
-
},
|
|
1060
|
+
}, z = "flex flex-col gap-3 bg-white px-6 pb-6 pt-3 sm:px-8", j = { boxShadow: "0 -4px 12px -4px rgba(15,23,42,0.06)" };
|
|
1019
1061
|
return O ? /* @__PURE__ */ u("div", { class: "relative flex-1 min-h-0 flex flex-col", children: [
|
|
1020
1062
|
/* @__PURE__ */ u("div", { class: "flex-1 min-h-0 overflow-y-auto flex flex-col items-center gap-4 px-6 pb-3 pt-6 sm:px-8 sm:pb-4 sm:pt-8 text-center", children: [
|
|
1021
1063
|
/* @__PURE__ */ o(
|
|
@@ -1048,14 +1090,14 @@ function _t({ client: r, authSession: e, origin: t, onBack: n }) {
|
|
|
1048
1090
|
"."
|
|
1049
1091
|
] })
|
|
1050
1092
|
] }),
|
|
1051
|
-
/* @__PURE__ */ o("div", { class:
|
|
1093
|
+
/* @__PURE__ */ o("div", { class: z, style: j, children: /* @__PURE__ */ u("div", { class: "flex items-center justify-center gap-3", children: [
|
|
1052
1094
|
/* @__PURE__ */ o(
|
|
1053
1095
|
"button",
|
|
1054
1096
|
{
|
|
1055
1097
|
type: "button",
|
|
1056
1098
|
onClick: n,
|
|
1057
1099
|
class: "rounded-xl px-3 py-2 text-sm font-medium text-gray-600 transition-colors hover:bg-gray-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
1058
|
-
children:
|
|
1100
|
+
children: r === "standalone" ? i("support.done_button", "Done") : i("nav.back_aria", "Back")
|
|
1059
1101
|
}
|
|
1060
1102
|
),
|
|
1061
1103
|
/* @__PURE__ */ o(
|
|
@@ -1073,7 +1115,7 @@ function _t({ client: r, authSession: e, origin: t, onBack: n }) {
|
|
|
1073
1115
|
)
|
|
1074
1116
|
] }) })
|
|
1075
1117
|
] }) : /* @__PURE__ */ u("form", { onSubmit: E, class: "relative flex-1 min-h-0 flex flex-col", children: [
|
|
1076
|
-
/* @__PURE__ */ o(
|
|
1118
|
+
/* @__PURE__ */ o(Mt, { onClick: n, ariaLabel: i("nav.back_aria", "Back") }),
|
|
1077
1119
|
/* @__PURE__ */ o("div", { class: "flex-1 min-h-0 overflow-y-auto px-6 pb-3 pt-6 sm:px-8 sm:pb-4 sm:pt-8", children: /* @__PURE__ */ u("div", { class: "flex flex-col gap-5", children: [
|
|
1078
1120
|
/* @__PURE__ */ u("div", { class: "flex flex-col gap-2 pr-10", children: [
|
|
1079
1121
|
/* @__PURE__ */ o("h2", { class: "text-3xl font-bold tracking-tight text-gray-900", children: i("support.heading", "Support") }),
|
|
@@ -1108,7 +1150,7 @@ function _t({ client: r, authSession: e, origin: t, onBack: n }) {
|
|
|
1108
1150
|
}
|
|
1109
1151
|
),
|
|
1110
1152
|
/* @__PURE__ */ o(
|
|
1111
|
-
|
|
1153
|
+
Et,
|
|
1112
1154
|
{
|
|
1113
1155
|
placeholder: i("support.message_placeholder", "Enter your message *"),
|
|
1114
1156
|
value: d,
|
|
@@ -1117,10 +1159,10 @@ function _t({ client: r, authSession: e, origin: t, onBack: n }) {
|
|
|
1117
1159
|
required: !0
|
|
1118
1160
|
}
|
|
1119
1161
|
),
|
|
1120
|
-
/* @__PURE__ */ o(
|
|
1162
|
+
/* @__PURE__ */ o(Pt, { files: w, onChange: v, disabled: p })
|
|
1121
1163
|
] })
|
|
1122
1164
|
] }) }),
|
|
1123
|
-
/* @__PURE__ */ u("div", { class:
|
|
1165
|
+
/* @__PURE__ */ u("div", { class: z, style: j, children: [
|
|
1124
1166
|
S.submit && /* @__PURE__ */ o("p", { class: "text-sm text-red-600", children: S.submit }),
|
|
1125
1167
|
/* @__PURE__ */ u("div", { class: "flex items-center justify-end gap-3", children: [
|
|
1126
1168
|
/* @__PURE__ */ o(
|
|
@@ -1130,7 +1172,7 @@ function _t({ client: r, authSession: e, origin: t, onBack: n }) {
|
|
|
1130
1172
|
onClick: n,
|
|
1131
1173
|
disabled: p,
|
|
1132
1174
|
class: "rounded-full px-4 py-2 text-base font-medium text-gray-700 transition-colors hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-60 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
1133
|
-
children:
|
|
1175
|
+
children: r === "standalone" ? i("support.close_button", "Close") : i("nav.back_aria", "Back")
|
|
1134
1176
|
}
|
|
1135
1177
|
),
|
|
1136
1178
|
/* @__PURE__ */ o(
|
|
@@ -1150,12 +1192,12 @@ function _t({ client: r, authSession: e, origin: t, onBack: n }) {
|
|
|
1150
1192
|
] })
|
|
1151
1193
|
] });
|
|
1152
1194
|
}
|
|
1153
|
-
function
|
|
1195
|
+
function Mt({ onClick: t, ariaLabel: e }) {
|
|
1154
1196
|
return /* @__PURE__ */ o(
|
|
1155
1197
|
"button",
|
|
1156
1198
|
{
|
|
1157
1199
|
type: "button",
|
|
1158
|
-
onClick:
|
|
1200
|
+
onClick: t,
|
|
1159
1201
|
"aria-label": e,
|
|
1160
1202
|
class: "absolute right-4 top-4 z-10 flex h-8 w-8 items-center justify-center rounded-full text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
1161
1203
|
children: /* @__PURE__ */ u("svg", { width: "18", height: "18", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: [
|
|
@@ -1184,9 +1226,9 @@ function St({ onClick: r, ariaLabel: e }) {
|
|
|
1184
1226
|
);
|
|
1185
1227
|
}
|
|
1186
1228
|
function be({
|
|
1187
|
-
type:
|
|
1229
|
+
type: t,
|
|
1188
1230
|
placeholder: e,
|
|
1189
|
-
value:
|
|
1231
|
+
value: r,
|
|
1190
1232
|
onInput: n,
|
|
1191
1233
|
error: i,
|
|
1192
1234
|
autocomplete: s,
|
|
@@ -1196,8 +1238,8 @@ function be({
|
|
|
1196
1238
|
/* @__PURE__ */ o(
|
|
1197
1239
|
"input",
|
|
1198
1240
|
{
|
|
1199
|
-
type:
|
|
1200
|
-
value:
|
|
1241
|
+
type: t,
|
|
1242
|
+
value: r,
|
|
1201
1243
|
placeholder: e,
|
|
1202
1244
|
onInput: (c) => n(c.target.value),
|
|
1203
1245
|
autocomplete: s,
|
|
@@ -1208,10 +1250,10 @@ function be({
|
|
|
1208
1250
|
i && /* @__PURE__ */ o("span", { class: "mt-1 ml-2 block text-sm text-red-600", children: i })
|
|
1209
1251
|
] });
|
|
1210
1252
|
}
|
|
1211
|
-
function
|
|
1212
|
-
placeholder:
|
|
1253
|
+
function Et({
|
|
1254
|
+
placeholder: t,
|
|
1213
1255
|
value: e,
|
|
1214
|
-
onInput:
|
|
1256
|
+
onInput: r,
|
|
1215
1257
|
error: n,
|
|
1216
1258
|
required: i
|
|
1217
1259
|
}) {
|
|
@@ -1220,8 +1262,8 @@ function Ct({
|
|
|
1220
1262
|
"textarea",
|
|
1221
1263
|
{
|
|
1222
1264
|
value: e,
|
|
1223
|
-
placeholder:
|
|
1224
|
-
onInput: (s) =>
|
|
1265
|
+
placeholder: t,
|
|
1266
|
+
onInput: (s) => r(s.target.value),
|
|
1225
1267
|
required: i,
|
|
1226
1268
|
rows: 5,
|
|
1227
1269
|
class: `min-h-[120px] w-full rounded-2xl bg-gray-100 px-5 py-3.5 text-base leading-relaxed text-gray-900 outline-none transition-all placeholder:text-gray-500 hover:bg-gray-200/60 focus:bg-gray-200/60 ${n ? "shadow-[0_0_0_2px_rgba(239,68,68,0.5)]" : "focus:shadow-[0_0_0_2px_color-mix(in_srgb,var(--pw-accent)_30%,transparent)]"}`
|
|
@@ -1230,23 +1272,23 @@ function Ct({
|
|
|
1230
1272
|
n && /* @__PURE__ */ o("span", { class: "mt-1 ml-2 block text-sm text-red-600", children: n })
|
|
1231
1273
|
] });
|
|
1232
1274
|
}
|
|
1233
|
-
function
|
|
1275
|
+
function Pt({ files: t, onChange: e, disabled: r }) {
|
|
1234
1276
|
const { t: n } = k(), i = R(null), [s, a] = x(!1), [c, l] = x(null), f = (h) => {
|
|
1235
|
-
if (!h ||
|
|
1277
|
+
if (!h || r) return;
|
|
1236
1278
|
l(null);
|
|
1237
1279
|
const d = Array.from(h);
|
|
1238
|
-
if (
|
|
1280
|
+
if (t.length + d.length > ne) {
|
|
1239
1281
|
l(n("support.too_many_files", "Up to {max} files", { max: ne }));
|
|
1240
1282
|
return;
|
|
1241
1283
|
}
|
|
1242
1284
|
const b = d.filter(
|
|
1243
|
-
(w) => xe.includes(w.type) && w.size <=
|
|
1285
|
+
(w) => xe.includes(w.type) && w.size <= It
|
|
1244
1286
|
);
|
|
1245
1287
|
if (b.length !== d.length) {
|
|
1246
1288
|
l(n("support.invalid_file", "Only JPEG/PNG/WebP, ≤ 10MB each"));
|
|
1247
1289
|
return;
|
|
1248
1290
|
}
|
|
1249
|
-
e([...
|
|
1291
|
+
e([...t, ...b]);
|
|
1250
1292
|
};
|
|
1251
1293
|
return /* @__PURE__ */ u("div", { children: [
|
|
1252
1294
|
/* @__PURE__ */ o("span", { class: "text-xs font-medium text-gray-700", children: n("support.attachments_label", "Attachments (optional)") }),
|
|
@@ -1256,15 +1298,15 @@ function It({ files: r, onChange: e, disabled: t }) {
|
|
|
1256
1298
|
role: "button",
|
|
1257
1299
|
tabIndex: 0,
|
|
1258
1300
|
"aria-label": n("support.attachments_aria", "Attachments upload"),
|
|
1259
|
-
onClick: () => !
|
|
1301
|
+
onClick: () => !r && i.current?.click(),
|
|
1260
1302
|
onDragOver: (h) => {
|
|
1261
|
-
h.preventDefault(),
|
|
1303
|
+
h.preventDefault(), r || a(!0);
|
|
1262
1304
|
},
|
|
1263
1305
|
onDragLeave: () => a(!1),
|
|
1264
1306
|
onDrop: (h) => {
|
|
1265
1307
|
h.preventDefault(), a(!1), f(h.dataTransfer?.files ?? null);
|
|
1266
1308
|
},
|
|
1267
|
-
class: `mt-1.5 cursor-pointer rounded-2xl border border-dashed p-3.5 text-center transition-all ${s ? "border-[var(--pw-accent)] bg-[color-mix(in_srgb,var(--pw-accent)_6%,white)]" : "border-gray-300 hover:border-gray-400 hover:bg-gray-50/60"} ${
|
|
1309
|
+
class: `mt-1.5 cursor-pointer rounded-2xl border border-dashed p-3.5 text-center transition-all ${s ? "border-[var(--pw-accent)] bg-[color-mix(in_srgb,var(--pw-accent)_6%,white)]" : "border-gray-300 hover:border-gray-400 hover:bg-gray-50/60"} ${r ? "cursor-not-allowed opacity-60" : ""}`,
|
|
1268
1310
|
children: [
|
|
1269
1311
|
/* @__PURE__ */ o("div", { class: "text-xs text-gray-500", children: n("support.dropzone_text", "Drop images here or click to select") }),
|
|
1270
1312
|
/* @__PURE__ */ o("div", { class: "mt-0.5 text-[11px] text-gray-400", children: n("support.file_requirements", "JPEG/PNG/WebP, up to {max} files, ≤ 10MB each", {
|
|
@@ -1287,7 +1329,7 @@ function It({ files: r, onChange: e, disabled: t }) {
|
|
|
1287
1329
|
}
|
|
1288
1330
|
),
|
|
1289
1331
|
c && /* @__PURE__ */ o("p", { class: "mt-1 text-xs text-red-600", children: c }),
|
|
1290
|
-
|
|
1332
|
+
t.length > 0 && /* @__PURE__ */ o("ul", { class: "mt-2 flex flex-col gap-1", children: t.map((h, d) => /* @__PURE__ */ u(
|
|
1291
1333
|
"li",
|
|
1292
1334
|
{
|
|
1293
1335
|
class: "flex items-center justify-between gap-2 rounded bg-gray-50 px-2 py-1 text-xs",
|
|
@@ -1298,10 +1340,10 @@ function It({ files: r, onChange: e, disabled: t }) {
|
|
|
1298
1340
|
{
|
|
1299
1341
|
type: "button",
|
|
1300
1342
|
onClick: () => {
|
|
1301
|
-
const b = [...
|
|
1343
|
+
const b = [...t];
|
|
1302
1344
|
b.splice(d, 1), e(b);
|
|
1303
1345
|
},
|
|
1304
|
-
disabled:
|
|
1346
|
+
disabled: r,
|
|
1305
1347
|
class: "text-gray-500 hover:text-red-600 disabled:cursor-not-allowed disabled:opacity-60",
|
|
1306
1348
|
"aria-label": n("support.remove_file_aria", "Remove {filename}", { filename: h.name }),
|
|
1307
1349
|
children: "✕"
|
|
@@ -1313,34 +1355,34 @@ function It({ files: r, onChange: e, disabled: t }) {
|
|
|
1313
1355
|
)) })
|
|
1314
1356
|
] });
|
|
1315
1357
|
}
|
|
1316
|
-
const
|
|
1358
|
+
const Tt = {
|
|
1317
1359
|
day: "cta.get_plan_daily",
|
|
1318
1360
|
week: "cta.get_plan_weekly",
|
|
1319
1361
|
month: "cta.get_plan_monthly",
|
|
1320
1362
|
year: "cta.get_plan_yearly"
|
|
1321
|
-
},
|
|
1363
|
+
}, Bt = {
|
|
1322
1364
|
day: "Get Daily Plan",
|
|
1323
1365
|
week: "Get Weekly Plan",
|
|
1324
1366
|
month: "Get Monthly Plan",
|
|
1325
1367
|
year: "Get Yearly Plan"
|
|
1326
1368
|
};
|
|
1327
|
-
function
|
|
1369
|
+
function Ot(t, e, r, n) {
|
|
1328
1370
|
if (e === "close") return n("cta.close", "Close");
|
|
1329
|
-
if (!
|
|
1330
|
-
if (!
|
|
1331
|
-
return n("cta.start_trial", "Start {days}-Day Free Trial", { days:
|
|
1332
|
-
if (!
|
|
1371
|
+
if (!t) return n("cta.continue", "Continue");
|
|
1372
|
+
if (!r && t.trial_days && t.interval && t.interval !== "lifetime")
|
|
1373
|
+
return n("cta.start_trial", "Start {days}-Day Free Trial", { days: t.trial_days });
|
|
1374
|
+
if (!t.interval || t.interval === "lifetime")
|
|
1333
1375
|
return n("cta.get_lifetime_access", "Get Lifetime Access");
|
|
1334
|
-
const i =
|
|
1335
|
-
return i ? n(i,
|
|
1336
|
-
interval:
|
|
1376
|
+
const i = Tt[t.interval];
|
|
1377
|
+
return i ? n(i, Bt[t.interval]) : n("cta.get_plan_generic", "Get {interval} Plan", {
|
|
1378
|
+
interval: Ut(t.interval)
|
|
1337
1379
|
});
|
|
1338
1380
|
}
|
|
1339
|
-
function
|
|
1340
|
-
return
|
|
1381
|
+
function Ut(t) {
|
|
1382
|
+
return t.length ? t[0].toUpperCase() + t.slice(1) : t;
|
|
1341
1383
|
}
|
|
1342
|
-
function
|
|
1343
|
-
const { t } = k(), [n, i] = x(!1), s =
|
|
1384
|
+
function jt({ block: t, ctx: e }) {
|
|
1385
|
+
const { t: r } = k(), [n, i] = x(!1), s = t.priceId ?? e.selectedPriceId, a = n || t.action === "checkout" && !s, c = s ? e.bootstrap.prices.find((d) => d.id === s) ?? null : null, l = e.bootstrap.user?.had_previous_trial ?? !1, f = t.label ?? Ot(c, t.action, l, r);
|
|
1344
1386
|
return /* @__PURE__ */ u(
|
|
1345
1387
|
"button",
|
|
1346
1388
|
{
|
|
@@ -1350,7 +1392,7 @@ function Pt({ block: r, ctx: e }) {
|
|
|
1350
1392
|
if (!a) {
|
|
1351
1393
|
i(!0);
|
|
1352
1394
|
try {
|
|
1353
|
-
await e.onAction(
|
|
1395
|
+
await e.onAction(t.action, { priceId: s });
|
|
1354
1396
|
} finally {
|
|
1355
1397
|
i(!1);
|
|
1356
1398
|
}
|
|
@@ -1377,9 +1419,9 @@ function Pt({ block: r, ctx: e }) {
|
|
|
1377
1419
|
}
|
|
1378
1420
|
);
|
|
1379
1421
|
}
|
|
1380
|
-
function
|
|
1381
|
-
const { t: e } = k(),
|
|
1382
|
-
if (
|
|
1422
|
+
function Rt({ ctx: t }) {
|
|
1423
|
+
const { t: e } = k(), r = t.authSession, n = t.auth, [i, s] = x(!1), a = () => t.onAction("support");
|
|
1424
|
+
if (r && !r.user.is_anonymous) {
|
|
1383
1425
|
const c = async () => {
|
|
1384
1426
|
if (!(!n || i)) {
|
|
1385
1427
|
s(!0);
|
|
@@ -1395,43 +1437,43 @@ function Tt({ ctx: r }) {
|
|
|
1395
1437
|
/* @__PURE__ */ u("span", { children: [
|
|
1396
1438
|
e("session.signed_in_as_prefix", "Signed in as"),
|
|
1397
1439
|
" ",
|
|
1398
|
-
/* @__PURE__ */ o("b", { class: "font-medium text-gray-700", children:
|
|
1440
|
+
/* @__PURE__ */ o("b", { class: "font-medium text-gray-700", children: r.user.email })
|
|
1399
1441
|
] }),
|
|
1400
1442
|
/* @__PURE__ */ u("div", { class: "flex items-center justify-center gap-3", children: [
|
|
1401
|
-
/* @__PURE__ */ o(
|
|
1443
|
+
/* @__PURE__ */ o(G, { onClick: c, disabled: !n || i, children: i ? e("session.signing_out", "Signing out…") : e("session.sign_out", "Sign Out") }),
|
|
1402
1444
|
/* @__PURE__ */ o(we, {}),
|
|
1403
|
-
/* @__PURE__ */ o(
|
|
1445
|
+
/* @__PURE__ */ o(G, { onClick: a, children: e("session.contact_support", "Contact Support") })
|
|
1404
1446
|
] })
|
|
1405
1447
|
] });
|
|
1406
1448
|
}
|
|
1407
1449
|
return /* @__PURE__ */ u("div", { class: "-mt-3 flex items-center justify-center gap-3 pt-1 text-center text-[13px]", children: [
|
|
1408
|
-
/* @__PURE__ */ o(
|
|
1450
|
+
/* @__PURE__ */ o(G, { onClick: () => t.onAction("restore"), children: e("session.restore_purchases", "Restore purchases") }),
|
|
1409
1451
|
/* @__PURE__ */ o(we, {}),
|
|
1410
|
-
/* @__PURE__ */ o(
|
|
1452
|
+
/* @__PURE__ */ o(G, { onClick: a, children: e("session.contact_support", "Contact Support") })
|
|
1411
1453
|
] });
|
|
1412
1454
|
}
|
|
1413
|
-
function
|
|
1414
|
-
onClick:
|
|
1455
|
+
function G({
|
|
1456
|
+
onClick: t,
|
|
1415
1457
|
disabled: e,
|
|
1416
|
-
children:
|
|
1458
|
+
children: r
|
|
1417
1459
|
}) {
|
|
1418
1460
|
return /* @__PURE__ */ o(
|
|
1419
1461
|
"button",
|
|
1420
1462
|
{
|
|
1421
1463
|
type: "button",
|
|
1422
|
-
onClick:
|
|
1464
|
+
onClick: t,
|
|
1423
1465
|
disabled: e,
|
|
1424
1466
|
class: "font-semibold transition-opacity hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-60 focus:outline-none focus-visible:opacity-80",
|
|
1425
1467
|
style: { color: "var(--pw-accent)" },
|
|
1426
|
-
children:
|
|
1468
|
+
children: r
|
|
1427
1469
|
}
|
|
1428
1470
|
);
|
|
1429
1471
|
}
|
|
1430
1472
|
function we() {
|
|
1431
1473
|
return /* @__PURE__ */ o("span", { class: "h-1 w-1 rounded-full bg-gray-300", "aria-hidden": "true" });
|
|
1432
1474
|
}
|
|
1433
|
-
function
|
|
1434
|
-
return
|
|
1475
|
+
function Dt({ block: t }) {
|
|
1476
|
+
return t.items.length ? /* @__PURE__ */ o("ul", { class: "flex flex-col gap-2.5", role: "list", children: t.items.map((e) => /* @__PURE__ */ u("li", { class: "flex items-start gap-3 text-sm text-gray-700", children: [
|
|
1435
1477
|
/* @__PURE__ */ o(
|
|
1436
1478
|
"svg",
|
|
1437
1479
|
{
|
|
@@ -1459,25 +1501,25 @@ function Bt({ block: r }) {
|
|
|
1459
1501
|
] })
|
|
1460
1502
|
] }, e.id)) }) : null;
|
|
1461
1503
|
}
|
|
1462
|
-
function
|
|
1463
|
-
const { t: e } = k(),
|
|
1504
|
+
function zt({ block: t }) {
|
|
1505
|
+
const { t: e } = k(), r = t.title ?? e("pricing.money_back", "30-day money-back guarantee"), n = t.subtitle, i = (t.icon ?? "dollar_shield") !== "none", s = Nt(r);
|
|
1464
1506
|
return /* @__PURE__ */ u("div", { class: "flex flex-col items-center gap-1.5 border-b-1 pb-4 mb-1 border-gray-100", children: [
|
|
1465
1507
|
/* @__PURE__ */ u("div", { class: "inline-flex items-center gap-2 text-[12px] text-gray-700", children: [
|
|
1466
|
-
i ? /* @__PURE__ */ o(
|
|
1508
|
+
i ? /* @__PURE__ */ o(qt, {}) : null,
|
|
1467
1509
|
s ? /* @__PURE__ */ u("span", { children: [
|
|
1468
1510
|
/* @__PURE__ */ o("b", { class: "font-bold text-gray-900", children: s.bold }),
|
|
1469
1511
|
" ",
|
|
1470
1512
|
/* @__PURE__ */ o("span", { class: "font-medium", children: s.rest })
|
|
1471
|
-
] }) : /* @__PURE__ */ o("span", { class: "font-medium", children:
|
|
1513
|
+
] }) : /* @__PURE__ */ o("span", { class: "font-medium", children: r })
|
|
1472
1514
|
] }),
|
|
1473
1515
|
n ? /* @__PURE__ */ o("span", { class: "text-center text-xs leading-relaxed text-gray-500", children: n }) : null
|
|
1474
1516
|
] });
|
|
1475
1517
|
}
|
|
1476
|
-
function
|
|
1477
|
-
const e =
|
|
1518
|
+
function Nt(t) {
|
|
1519
|
+
const e = t.match(/^(\d+[-\s]?days?)\s+(.+)$/i);
|
|
1478
1520
|
return e ? { bold: e[1], rest: e[2] } : null;
|
|
1479
1521
|
}
|
|
1480
|
-
function
|
|
1522
|
+
function qt() {
|
|
1481
1523
|
return /* @__PURE__ */ u(
|
|
1482
1524
|
"svg",
|
|
1483
1525
|
{
|
|
@@ -1512,121 +1554,112 @@ function jt() {
|
|
|
1512
1554
|
}
|
|
1513
1555
|
);
|
|
1514
1556
|
}
|
|
1515
|
-
const Oe = 24,
|
|
1516
|
-
function
|
|
1517
|
-
const
|
|
1557
|
+
const Oe = 24, Ft = 16, $t = 2;
|
|
1558
|
+
function Vt(t, e) {
|
|
1559
|
+
const r = e * $t;
|
|
1518
1560
|
let n = Oe;
|
|
1519
|
-
for (
|
|
1520
|
-
n -= 1,
|
|
1561
|
+
for (t.style.fontSize = `${n}px`; t.scrollHeight > r && n > Ft; )
|
|
1562
|
+
n -= 1, t.style.fontSize = `${n}px`;
|
|
1521
1563
|
}
|
|
1522
|
-
function
|
|
1523
|
-
const
|
|
1564
|
+
function Ht({ block: t, ctx: e }) {
|
|
1565
|
+
const r = t.level ?? 1, n = `h${r}`, i = r === 1 ? "text-[22px] sm:text-2xl font-semibold leading-tight text-center text-balance text-gray-800" : r === 2 ? "text-xl font-semibold leading-snug text-gray-900 tracking-tight" : "text-base font-medium text-gray-900", s = R(null), a = r === 1 && !!e.bootstrap.settings.title_auto_fit;
|
|
1524
1566
|
return B(() => {
|
|
1525
1567
|
if (!a || !s.current) return;
|
|
1526
1568
|
const c = getComputedStyle(s.current), l = parseFloat(c.lineHeight) || Oe * 1.5;
|
|
1527
|
-
|
|
1528
|
-
}, [a,
|
|
1569
|
+
Vt(s.current, l);
|
|
1570
|
+
}, [a, t.text]), /* @__PURE__ */ o(n, { ref: s, class: i, children: t.text });
|
|
1529
1571
|
}
|
|
1530
|
-
function
|
|
1531
|
-
const e =
|
|
1532
|
-
if (
|
|
1533
|
-
const
|
|
1534
|
-
return { amount: e.amount /
|
|
1572
|
+
function Gt(t) {
|
|
1573
|
+
const e = t.local ?? { currency: t.currency, amount: t.amount };
|
|
1574
|
+
if (t.interval === "year") {
|
|
1575
|
+
const r = (t.interval_count ?? 1) * 12;
|
|
1576
|
+
return { amount: e.amount / r, currency: e.currency };
|
|
1535
1577
|
}
|
|
1536
1578
|
return { amount: e.amount, currency: e.currency };
|
|
1537
1579
|
}
|
|
1538
|
-
function ie(
|
|
1539
|
-
const
|
|
1580
|
+
function ie(t, e) {
|
|
1581
|
+
const r = t % 1 !== 0 ? 2 : 0;
|
|
1540
1582
|
try {
|
|
1541
1583
|
const n = new Intl.NumberFormat(void 0, {
|
|
1542
1584
|
style: "currency",
|
|
1543
1585
|
currency: e,
|
|
1544
1586
|
currencyDisplay: "narrowSymbol",
|
|
1545
|
-
maximumFractionDigits:
|
|
1546
|
-
minimumFractionDigits:
|
|
1547
|
-
}).formatToParts(
|
|
1587
|
+
maximumFractionDigits: r,
|
|
1588
|
+
minimumFractionDigits: r
|
|
1589
|
+
}).formatToParts(t);
|
|
1548
1590
|
let i = "", s = "";
|
|
1549
1591
|
for (const a of n)
|
|
1550
1592
|
a.type === "currency" ? i = a.value : a.type !== "literal" && (s += a.value);
|
|
1551
1593
|
return { currency: i || e, amount: s.trim() };
|
|
1552
1594
|
} catch {
|
|
1553
|
-
return { currency: e, amount: String(
|
|
1595
|
+
return { currency: e, amount: String(t) };
|
|
1554
1596
|
}
|
|
1555
1597
|
}
|
|
1556
|
-
function ae(
|
|
1557
|
-
const { amount:
|
|
1598
|
+
function ae(t, e) {
|
|
1599
|
+
const { amount: r, currency: n } = Gt(t);
|
|
1558
1600
|
if (!e) {
|
|
1559
|
-
const { currency: c, amount: l } = ie(
|
|
1601
|
+
const { currency: c, amount: l } = ie(r, n);
|
|
1560
1602
|
return { currency: c, amount: l, originalAmount: null };
|
|
1561
1603
|
}
|
|
1562
|
-
const i =
|
|
1604
|
+
const i = r * (1 - e / 100), s = ie(i, n), a = ie(r, n);
|
|
1563
1605
|
return {
|
|
1564
1606
|
currency: s.currency,
|
|
1565
1607
|
amount: s.amount,
|
|
1566
1608
|
originalAmount: `${a.currency}${a.amount}`
|
|
1567
1609
|
};
|
|
1568
1610
|
}
|
|
1569
|
-
function
|
|
1570
|
-
if (
|
|
1571
|
-
|
|
1572
|
-
(i) => i.price_id === e && i.discount_percent && i.discount_percent > 0
|
|
1573
|
-
);
|
|
1574
|
-
return t || (r.find(
|
|
1575
|
-
(i) => i.price_id == null && i.discount_percent && i.discount_percent > 0
|
|
1576
|
-
) ?? null);
|
|
1577
|
-
}
|
|
1578
|
-
function Ue(r, e) {
|
|
1579
|
-
if (r.label) return r.label.toUpperCase();
|
|
1580
|
-
if (!r.interval || r.interval === "lifetime")
|
|
1611
|
+
function Ue(t, e) {
|
|
1612
|
+
if (t.label) return t.label.toUpperCase();
|
|
1613
|
+
if (!t.interval || t.interval === "lifetime")
|
|
1581
1614
|
return e("pricing.plan_label.lifetime", "LIFETIME");
|
|
1582
1615
|
const n = {
|
|
1583
1616
|
day: { key: "pricing.plan_label.daily", fallback: "DAILY PLAN" },
|
|
1584
1617
|
week: { key: "pricing.plan_label.weekly", fallback: "WEEKLY PLAN" },
|
|
1585
1618
|
month: { key: "pricing.plan_label.monthly", fallback: "MONTHLY PLAN" },
|
|
1586
1619
|
year: { key: "pricing.plan_label.yearly", fallback: "YEARLY PLAN" }
|
|
1587
|
-
}[
|
|
1588
|
-
return n ? e(n.key, n.fallback) : `${
|
|
1620
|
+
}[t.interval];
|
|
1621
|
+
return n ? e(n.key, n.fallback) : `${t.interval.toUpperCase()} PLAN`;
|
|
1589
1622
|
}
|
|
1590
|
-
function le(
|
|
1591
|
-
if (!
|
|
1623
|
+
function le(t, e) {
|
|
1624
|
+
if (!t.interval || t.interval === "lifetime")
|
|
1592
1625
|
return e("pricing.interval.lifetime_short", "lifetime");
|
|
1593
|
-
if (
|
|
1594
|
-
const
|
|
1595
|
-
return
|
|
1626
|
+
if (t.interval === "year") return e("pricing.interval.month", "month");
|
|
1627
|
+
const r = t.interval_count ?? 1;
|
|
1628
|
+
return r === 1 ? e(`pricing.interval.${t.interval}`, t.interval) : `${r} ${t.interval}s`;
|
|
1596
1629
|
}
|
|
1597
|
-
function
|
|
1598
|
-
const { t } = k(), n =
|
|
1630
|
+
function Wt({ block: t, ctx: e }) {
|
|
1631
|
+
const { t: r } = k(), n = t.priceIds && t.priceIds.length > 0 ? new Set(t.priceIds) : null, i = e.bootstrap.prices.filter((a) => !n || n.has(a.id));
|
|
1599
1632
|
if (i.length === 0)
|
|
1600
|
-
return /* @__PURE__ */ o("p", { class: "text-sm text-gray-500", children:
|
|
1601
|
-
const s =
|
|
1602
|
-
if (
|
|
1633
|
+
return /* @__PURE__ */ o("p", { class: "text-sm text-gray-500", children: r("pricing.no_prices", "No prices available.") });
|
|
1634
|
+
const s = t.popular_label ?? r("pricing.most_popular", "Most popular");
|
|
1635
|
+
if (t.view === "compact")
|
|
1603
1636
|
return /* @__PURE__ */ o(
|
|
1604
1637
|
"div",
|
|
1605
1638
|
{
|
|
1606
1639
|
class: "flex w-full flex-col rounded-xl border border-gray-200 bg-gray-50",
|
|
1607
1640
|
role: "radiogroup",
|
|
1608
|
-
"aria-label":
|
|
1641
|
+
"aria-label": r("pricing.plans_aria", "Plans"),
|
|
1609
1642
|
children: i.map((a, c) => /* @__PURE__ */ o(
|
|
1610
|
-
|
|
1643
|
+
Yt,
|
|
1611
1644
|
{
|
|
1612
1645
|
price: a,
|
|
1613
1646
|
isLast: c === i.length - 1,
|
|
1614
|
-
isPopular:
|
|
1647
|
+
isPopular: t.popular_price_id === a.id,
|
|
1615
1648
|
popularLabel: s,
|
|
1616
|
-
offer:
|
|
1649
|
+
offer: $(e.bootstrap.offers, a.id),
|
|
1617
1650
|
selected: e.selectedPriceId === a.id,
|
|
1618
1651
|
onSelect: () => {
|
|
1619
1652
|
e.setSelectedPriceId(a.id), e.onAction("price_selected", { priceId: a.id, price: a });
|
|
1620
1653
|
},
|
|
1621
|
-
t
|
|
1654
|
+
t: r
|
|
1622
1655
|
},
|
|
1623
1656
|
a.id
|
|
1624
1657
|
))
|
|
1625
1658
|
}
|
|
1626
1659
|
);
|
|
1627
|
-
if (
|
|
1660
|
+
if (t.view === "horizontal") {
|
|
1628
1661
|
const a = Math.min(i.length, 3), c = i.some(
|
|
1629
|
-
(l) => (
|
|
1662
|
+
(l) => ($(e.bootstrap.offers, l.id)?.discount_percent ?? 0) > 0
|
|
1630
1663
|
);
|
|
1631
1664
|
return /* @__PURE__ */ o(
|
|
1632
1665
|
"div",
|
|
@@ -1634,20 +1667,20 @@ function Ft({ block: r, ctx: e }) {
|
|
|
1634
1667
|
class: "grid items-stretch gap-2",
|
|
1635
1668
|
style: { gridTemplateColumns: `repeat(${a}, minmax(0, 1fr))` },
|
|
1636
1669
|
role: "radiogroup",
|
|
1637
|
-
"aria-label":
|
|
1670
|
+
"aria-label": r("pricing.plans_aria", "Plans"),
|
|
1638
1671
|
children: i.map((l) => /* @__PURE__ */ o(
|
|
1639
|
-
|
|
1672
|
+
Kt,
|
|
1640
1673
|
{
|
|
1641
1674
|
price: l,
|
|
1642
|
-
isPopular:
|
|
1675
|
+
isPopular: t.popular_price_id === l.id,
|
|
1643
1676
|
popularLabel: s,
|
|
1644
|
-
offer:
|
|
1677
|
+
offer: $(e.bootstrap.offers, l.id),
|
|
1645
1678
|
reserveStrikeRow: c,
|
|
1646
1679
|
selected: e.selectedPriceId === l.id,
|
|
1647
1680
|
onSelect: () => {
|
|
1648
1681
|
e.setSelectedPriceId(l.id), e.onAction("price_selected", { priceId: l.id, price: l });
|
|
1649
1682
|
},
|
|
1650
|
-
t
|
|
1683
|
+
t: r
|
|
1651
1684
|
},
|
|
1652
1685
|
l.id
|
|
1653
1686
|
))
|
|
@@ -1659,9 +1692,9 @@ function Ft({ block: r, ctx: e }) {
|
|
|
1659
1692
|
{
|
|
1660
1693
|
class: "flex flex-col gap-2",
|
|
1661
1694
|
role: "radiogroup",
|
|
1662
|
-
"aria-label":
|
|
1695
|
+
"aria-label": r("pricing.plans_aria", "Plans"),
|
|
1663
1696
|
children: i.map((a) => {
|
|
1664
|
-
const c = e.selectedPriceId === a.id, l =
|
|
1697
|
+
const c = e.selectedPriceId === a.id, l = t.popular_price_id === a.id, h = $(e.bootstrap.offers, a.id)?.discount_percent ?? null, { currency: d, amount: b, originalAmount: w } = ae(a, h);
|
|
1665
1698
|
return /* @__PURE__ */ u(
|
|
1666
1699
|
"button",
|
|
1667
1700
|
{
|
|
@@ -1717,7 +1750,7 @@ function Ft({ block: r, ctx: e }) {
|
|
|
1717
1750
|
),
|
|
1718
1751
|
/* @__PURE__ */ u("div", { class: "flex flex-1 flex-col gap-0.5", children: [
|
|
1719
1752
|
/* @__PURE__ */ u("div", { class: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
|
|
1720
|
-
/* @__PURE__ */ o("span", { class: "text-xs font-normal uppercase tracking-normal text-gray-800/70", children: Ue(a,
|
|
1753
|
+
/* @__PURE__ */ o("span", { class: "text-xs font-normal uppercase tracking-normal text-gray-800/70", children: Ue(a, r) }),
|
|
1721
1754
|
w ? (
|
|
1722
1755
|
// opacity-60 приглушает strike: глаз сначала ловит label
|
|
1723
1756
|
// и discount-badge, потом main price; original «бывшая цена»
|
|
@@ -1740,7 +1773,7 @@ function Ft({ block: r, ctx: e }) {
|
|
|
1740
1773
|
/* @__PURE__ */ u("span", { class: "text-sm font-normal text-gray-500", children: [
|
|
1741
1774
|
" ",
|
|
1742
1775
|
"/ ",
|
|
1743
|
-
le(a,
|
|
1776
|
+
le(a, r)
|
|
1744
1777
|
] })
|
|
1745
1778
|
] }) }),
|
|
1746
1779
|
a.description ? /* @__PURE__ */ o("span", { class: "mt-1 text-xs leading-relaxed text-gray-500", children: a.description }) : null
|
|
@@ -1761,20 +1794,20 @@ function Ft({ block: r, ctx: e }) {
|
|
|
1761
1794
|
}
|
|
1762
1795
|
);
|
|
1763
1796
|
}
|
|
1764
|
-
function
|
|
1765
|
-
return
|
|
1797
|
+
function Zt(t, e) {
|
|
1798
|
+
return t.label ? t.label : !t.interval || t.interval === "lifetime" ? e("pricing.interval.lifetime_short", "lifetime") : e(`pricing.interval.${t.interval}`, t.interval);
|
|
1766
1799
|
}
|
|
1767
|
-
function
|
|
1768
|
-
price:
|
|
1800
|
+
function Yt({
|
|
1801
|
+
price: t,
|
|
1769
1802
|
isLast: e,
|
|
1770
|
-
isPopular:
|
|
1803
|
+
isPopular: r,
|
|
1771
1804
|
popularLabel: n,
|
|
1772
1805
|
offer: i,
|
|
1773
1806
|
selected: s,
|
|
1774
1807
|
onSelect: a,
|
|
1775
1808
|
t: c
|
|
1776
1809
|
}) {
|
|
1777
|
-
const l = i?.discount_percent ?? null, { currency: f, amount: h, originalAmount: d } = ae(
|
|
1810
|
+
const l = i?.discount_percent ?? null, { currency: f, amount: h, originalAmount: d } = ae(t, l);
|
|
1778
1811
|
return /* @__PURE__ */ u(
|
|
1779
1812
|
"button",
|
|
1780
1813
|
{
|
|
@@ -1824,8 +1857,8 @@ function $t({
|
|
|
1824
1857
|
].join(" "),
|
|
1825
1858
|
children: [
|
|
1826
1859
|
/* @__PURE__ */ u("div", { class: "flex flex-wrap items-center gap-1 gap-x-1.5", children: [
|
|
1827
|
-
/* @__PURE__ */ o("span", { class: "text-base font-normal capitalize text-gray-800", children:
|
|
1828
|
-
|
|
1860
|
+
/* @__PURE__ */ o("span", { class: "text-base font-normal capitalize text-gray-800", children: Zt(t, c) }),
|
|
1861
|
+
r ? (
|
|
1829
1862
|
// Pastel brand-mix pill — точно как `badge` в TelegramPricingRadio.
|
|
1830
1863
|
// Низкий visual weight: pill про "имя плана" (most popular), а не
|
|
1831
1864
|
// про savings — не должна конкурировать с -X% discount-pill.
|
|
@@ -1856,7 +1889,7 @@ function $t({
|
|
|
1856
1889
|
/* @__PURE__ */ u("span", { class: "text-xs text-gray-400", children: [
|
|
1857
1890
|
" ",
|
|
1858
1891
|
"/ ",
|
|
1859
|
-
le(
|
|
1892
|
+
le(t, c)
|
|
1860
1893
|
] })
|
|
1861
1894
|
] })
|
|
1862
1895
|
] })
|
|
@@ -1867,17 +1900,17 @@ function $t({
|
|
|
1867
1900
|
}
|
|
1868
1901
|
);
|
|
1869
1902
|
}
|
|
1870
|
-
function
|
|
1871
|
-
price:
|
|
1903
|
+
function Kt({
|
|
1904
|
+
price: t,
|
|
1872
1905
|
isPopular: e,
|
|
1873
|
-
popularLabel:
|
|
1906
|
+
popularLabel: r,
|
|
1874
1907
|
offer: n,
|
|
1875
1908
|
reserveStrikeRow: i,
|
|
1876
1909
|
selected: s,
|
|
1877
1910
|
onSelect: a,
|
|
1878
1911
|
t: c
|
|
1879
1912
|
}) {
|
|
1880
|
-
const l = n?.discount_percent ?? null, { currency: f, amount: h, originalAmount: d } = ae(
|
|
1913
|
+
const l = n?.discount_percent ?? null, { currency: f, amount: h, originalAmount: d } = ae(t, l);
|
|
1881
1914
|
return /* @__PURE__ */ u(
|
|
1882
1915
|
"button",
|
|
1883
1916
|
{
|
|
@@ -1891,7 +1924,7 @@ function Ht({
|
|
|
1891
1924
|
].join(" "),
|
|
1892
1925
|
style: s ? { background: "color-mix(in srgb, var(--pw-accent) 6%, transparent)" } : void 0,
|
|
1893
1926
|
children: [
|
|
1894
|
-
/* @__PURE__ */ o("span", { class: "flex min-h-[2.4em] items-center text-[10px] font-normal uppercase leading-tight text-gray-800/70", children: Ue(
|
|
1927
|
+
/* @__PURE__ */ o("span", { class: "flex min-h-[2.4em] items-center text-[10px] font-normal uppercase leading-tight text-gray-800/70", children: Ue(t, c) }),
|
|
1895
1928
|
i ? /* @__PURE__ */ u("div", { class: "flex h-[22px] items-center justify-center gap-1.5", children: [
|
|
1896
1929
|
d ? /* @__PURE__ */ o("span", { class: "text-[12px] text-gray-400 line-through decoration-gray-400 decoration-[1.5px]", children: d }) : null,
|
|
1897
1930
|
l ? /* @__PURE__ */ u("span", { class: "rounded-md bg-emerald-100 px-1.5 py-0.5 text-[10px] font-bold leading-none text-emerald-700", children: [
|
|
@@ -1906,40 +1939,40 @@ function Ht({
|
|
|
1906
1939
|
] }),
|
|
1907
1940
|
/* @__PURE__ */ u("span", { class: "text-xs font-normal text-gray-500", children: [
|
|
1908
1941
|
"/ ",
|
|
1909
|
-
le(
|
|
1942
|
+
le(t, c)
|
|
1910
1943
|
] }),
|
|
1911
1944
|
e ? /* @__PURE__ */ o(
|
|
1912
1945
|
"span",
|
|
1913
1946
|
{
|
|
1914
1947
|
class: "absolute -top-[10px] left-1/2 -translate-x-1/2 whitespace-nowrap rounded-[11px] border-[3px] border-white px-2.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider text-white",
|
|
1915
1948
|
style: { background: "var(--pw-accent)" },
|
|
1916
|
-
children:
|
|
1949
|
+
children: r
|
|
1917
1950
|
}
|
|
1918
1951
|
) : null
|
|
1919
1952
|
]
|
|
1920
1953
|
}
|
|
1921
1954
|
);
|
|
1922
1955
|
}
|
|
1923
|
-
function
|
|
1924
|
-
return /* @__PURE__ */ o("p", { class: "text-[0.9375rem] leading-relaxed text-gray-600", children:
|
|
1956
|
+
function Xt({ block: t }) {
|
|
1957
|
+
return /* @__PURE__ */ o("p", { class: "text-[0.9375rem] leading-relaxed text-gray-600", children: t.text });
|
|
1925
1958
|
}
|
|
1926
|
-
const
|
|
1959
|
+
const Jt = {
|
|
1927
1960
|
week: 0.25,
|
|
1928
1961
|
month: 1,
|
|
1929
1962
|
year: 12
|
|
1930
1963
|
};
|
|
1931
|
-
function
|
|
1932
|
-
return
|
|
1964
|
+
function Qt(t, e) {
|
|
1965
|
+
return t ? e(`pricing.interval.${t}`, t) : e("pricing.interval.period", "period");
|
|
1933
1966
|
}
|
|
1934
|
-
function
|
|
1935
|
-
const { t } = k();
|
|
1936
|
-
if (!
|
|
1937
|
-
const i = e.bootstrap.prices.find((a) => a.id === e.selectedPriceId)?.interval ?? null, s = i ?
|
|
1967
|
+
function er({ block: t, ctx: e }) {
|
|
1968
|
+
const { t: r } = k();
|
|
1969
|
+
if (!t.queries.length) return null;
|
|
1970
|
+
const i = e.bootstrap.prices.find((a) => a.id === e.selectedPriceId)?.interval ?? null, s = i ? Jt[i] : void 0;
|
|
1938
1971
|
return /* @__PURE__ */ u("div", { class: "flex flex-col gap-2", children: [
|
|
1939
|
-
/* @__PURE__ */ o("div", { class: "text-sm font-semibold text-gray-800", children: !i || i === "lifetime" ?
|
|
1940
|
-
interval:
|
|
1972
|
+
/* @__PURE__ */ o("div", { class: "text-sm font-semibold text-gray-800", children: !i || i === "lifetime" ? r("pricing.included_total", "Included for lifetime:") : r("pricing.included_per", "Included per {interval}:", {
|
|
1973
|
+
interval: Qt(i, r)
|
|
1941
1974
|
}) }),
|
|
1942
|
-
/* @__PURE__ */ o("ul", { class: "flex flex-col gap-2", role: "list", children:
|
|
1975
|
+
/* @__PURE__ */ o("ul", { class: "flex flex-col gap-2", role: "list", children: t.queries.map((a) => {
|
|
1943
1976
|
const c = Number.isFinite(a.count) ? a.count : 0, l = s !== void 0 ? Math.round(c * s) : c;
|
|
1944
1977
|
return /* @__PURE__ */ u("li", { class: `flex gap-3 ${a.desc ? "items-start" : "items-center"}`, children: [
|
|
1945
1978
|
/* @__PURE__ */ o(
|
|
@@ -1976,33 +2009,33 @@ function Yt({ block: r, ctx: e }) {
|
|
|
1976
2009
|
}) })
|
|
1977
2010
|
] });
|
|
1978
2011
|
}
|
|
1979
|
-
const
|
|
1980
|
-
heading:
|
|
1981
|
-
text:
|
|
1982
|
-
price_grid:
|
|
1983
|
-
cta_button:
|
|
2012
|
+
const tr = {
|
|
2013
|
+
heading: Ht,
|
|
2014
|
+
text: Xt,
|
|
2015
|
+
price_grid: Wt,
|
|
2016
|
+
cta_button: jt,
|
|
1984
2017
|
auth_panel: Le,
|
|
1985
|
-
current_session:
|
|
1986
|
-
features_list:
|
|
1987
|
-
tokenization_gate:
|
|
1988
|
-
guarantee_badge:
|
|
1989
|
-
offer_banner:
|
|
2018
|
+
current_session: Rt,
|
|
2019
|
+
features_list: Dt,
|
|
2020
|
+
tokenization_gate: er,
|
|
2021
|
+
guarantee_badge: zt,
|
|
2022
|
+
offer_banner: St
|
|
1990
2023
|
};
|
|
1991
|
-
function
|
|
1992
|
-
const a =
|
|
1993
|
-
for (const v of
|
|
2024
|
+
function rr({ layout: t, bootstrap: e, onAction: r, auth: n, authSession: i, hasTopBanner: s }) {
|
|
2025
|
+
const a = Ve(() => {
|
|
2026
|
+
for (const v of t.blocks)
|
|
1994
2027
|
if (v.type === "price_grid" && v.popular_price_id && e.prices.some((p) => p.id === v.popular_price_id))
|
|
1995
2028
|
return v.popular_price_id;
|
|
1996
2029
|
return e.prices[0]?.id ?? null;
|
|
1997
|
-
}, [
|
|
2030
|
+
}, [t.blocks, e.prices]), [c, l] = x(a), f = {
|
|
1998
2031
|
bootstrap: e,
|
|
1999
2032
|
selectedPriceId: c,
|
|
2000
2033
|
setSelectedPriceId: l,
|
|
2001
|
-
onAction:
|
|
2034
|
+
onAction: r,
|
|
2002
2035
|
auth: n,
|
|
2003
2036
|
authSession: i
|
|
2004
|
-
}, h =
|
|
2005
|
-
const y =
|
|
2037
|
+
}, h = t.blocks.findIndex((v) => v.type === "cta_button"), d = h === -1 ? t.blocks : t.blocks.slice(0, h), b = h === -1 ? [] : t.blocks.slice(h), w = (v, p) => {
|
|
2038
|
+
const y = tr[v.type];
|
|
2006
2039
|
return y ? /* @__PURE__ */ o(y, { block: v, ctx: f }, `${v.type}-${p}`) : (typeof console < "u" && console.warn(`[paywall] unknown block type: ${v.type}`), null);
|
|
2007
2040
|
};
|
|
2008
2041
|
return /* @__PURE__ */ u(se, { children: [
|
|
@@ -2022,16 +2055,16 @@ function Xt({ layout: r, bootstrap: e, onAction: t, auth: n, authSession: i, has
|
|
|
2022
2055
|
) : null
|
|
2023
2056
|
] });
|
|
2024
2057
|
}
|
|
2025
|
-
function
|
|
2026
|
-
return
|
|
2058
|
+
function nr(t, e, r, n) {
|
|
2059
|
+
return t ? n ? { open: !0, view: "purchased", error: null } : e.status === "idle" || e.status === "loading" ? { open: !0, view: "loading", error: null } : e.status === "error" ? { open: !0, view: "error", error: e.error } : r.kind === "support" ? { open: !0, view: "support", error: null } : r.kind === "auth_gate" ? { open: !0, view: "auth", error: null } : r.kind === "awaiting_payment" ? { open: !0, view: "awaiting_payment", error: null } : r.kind === "popup_blocked" ? { open: !0, view: "popup_blocked", error: null } : r.kind === "purchase_success" ? { open: !0, view: "purchased", error: null } : r.kind === "verifying" ? { open: !0, view: "loading", error: null } : { open: !0, view: "layout", error: null } : { open: !1, view: null, error: null };
|
|
2027
2060
|
}
|
|
2028
|
-
function
|
|
2029
|
-
return
|
|
2061
|
+
function ir(t, e) {
|
|
2062
|
+
return t.open === e.open && t.view === e.view && t.error === e.error;
|
|
2030
2063
|
}
|
|
2031
|
-
function
|
|
2032
|
-
client:
|
|
2064
|
+
function or({
|
|
2065
|
+
client: t,
|
|
2033
2066
|
open: e,
|
|
2034
|
-
onClose:
|
|
2067
|
+
onClose: r,
|
|
2035
2068
|
onEvent: n,
|
|
2036
2069
|
initialView: i,
|
|
2037
2070
|
initialAuthMode: s,
|
|
@@ -2042,26 +2075,26 @@ function er({
|
|
|
2042
2075
|
locale: h
|
|
2043
2076
|
}) {
|
|
2044
2077
|
const [d, b] = x({ status: "idle" }), [w, v] = x(
|
|
2045
|
-
() =>
|
|
2078
|
+
() => t.auth?.getCachedSession() ?? null
|
|
2046
2079
|
), [p, y] = x(() => i === "support" ? { kind: "support", origin: "standalone" } : i === "auth" ? { kind: "auth_gate", origin: "standalone" } : { kind: "layout" }), O = R(!1), _ = R(null);
|
|
2047
2080
|
B(() => {
|
|
2048
2081
|
if (!l) return;
|
|
2049
|
-
const m =
|
|
2050
|
-
g &&
|
|
2082
|
+
const m = nr(e, d, p, a), g = _.current;
|
|
2083
|
+
g && ir(g, m) || (_.current = m, l(m));
|
|
2051
2084
|
}, [e, d, p, a, l]), B(() => {
|
|
2052
|
-
if (
|
|
2053
|
-
return
|
|
2054
|
-
}, [
|
|
2055
|
-
if (typeof
|
|
2056
|
-
return
|
|
2085
|
+
if (t.auth)
|
|
2086
|
+
return t.auth.onAuthChange((m, g) => v(g));
|
|
2087
|
+
}, [t.auth]), B(() => {
|
|
2088
|
+
if (typeof t.onBootstrapChange == "function")
|
|
2089
|
+
return t.onBootstrapChange((m) => {
|
|
2057
2090
|
b(
|
|
2058
2091
|
(g) => g.status === "ready" ? { status: "ready", data: m } : g
|
|
2059
2092
|
);
|
|
2060
2093
|
});
|
|
2061
|
-
}, [
|
|
2094
|
+
}, [t]), B(() => {
|
|
2062
2095
|
if (!e || d.status === "ready" || d.status === "loading") return;
|
|
2063
2096
|
let m = !1;
|
|
2064
|
-
return b({ status: "loading" }),
|
|
2097
|
+
return b({ status: "loading" }), t.bootstrap().then((g) => {
|
|
2065
2098
|
m || (b({ status: "ready", data: g }), n("ready", g), g.user?.has_active_subscription && !c && !i && (n("purchase_completed", {
|
|
2066
2099
|
priceId: null,
|
|
2067
2100
|
sessionId: null,
|
|
@@ -2074,7 +2107,7 @@ function er({
|
|
|
2074
2107
|
}), () => {
|
|
2075
2108
|
m = !0;
|
|
2076
2109
|
};
|
|
2077
|
-
}, [e,
|
|
2110
|
+
}, [e, t]), He(() => {
|
|
2078
2111
|
if (!e) {
|
|
2079
2112
|
y({ kind: "layout" }), O.current = !1;
|
|
2080
2113
|
return;
|
|
@@ -2083,7 +2116,7 @@ function er({
|
|
|
2083
2116
|
}, [e, i]);
|
|
2084
2117
|
const S = async (m) => {
|
|
2085
2118
|
try {
|
|
2086
|
-
const g = await
|
|
2119
|
+
const g = await t.createCheckout({
|
|
2087
2120
|
priceId: m,
|
|
2088
2121
|
ignoreActivePurchase: c === !0
|
|
2089
2122
|
});
|
|
@@ -2100,7 +2133,7 @@ function er({
|
|
|
2100
2133
|
} catch (g) {
|
|
2101
2134
|
if (g instanceof T && g.code === "already_purchased") {
|
|
2102
2135
|
try {
|
|
2103
|
-
await
|
|
2136
|
+
await t.getUser({ force: !0 });
|
|
2104
2137
|
} catch {
|
|
2105
2138
|
}
|
|
2106
2139
|
n("purchase_completed", { priceId: m, sessionId: null, restored: !0 }), y({ kind: "purchase_success", restored: !0 });
|
|
@@ -2127,7 +2160,7 @@ function er({
|
|
|
2127
2160
|
y({ kind: "verifying" }), (async () => {
|
|
2128
2161
|
if (!c)
|
|
2129
2162
|
try {
|
|
2130
|
-
if ((await
|
|
2163
|
+
if ((await t.getUser({ force: !0 })).has_active_subscription) {
|
|
2131
2164
|
n("purchase_completed", {
|
|
2132
2165
|
priceId: m?.priceId ?? null,
|
|
2133
2166
|
sessionId: null,
|
|
@@ -2138,7 +2171,7 @@ function er({
|
|
|
2138
2171
|
} catch {
|
|
2139
2172
|
}
|
|
2140
2173
|
if (!m) {
|
|
2141
|
-
g === "standalone" ?
|
|
2174
|
+
g === "standalone" ? r() : y({ kind: "layout" });
|
|
2142
2175
|
return;
|
|
2143
2176
|
}
|
|
2144
2177
|
await S(m.priceId);
|
|
@@ -2146,9 +2179,9 @@ function er({
|
|
|
2146
2179
|
O.current = !1;
|
|
2147
2180
|
});
|
|
2148
2181
|
}, [w, p]);
|
|
2149
|
-
const
|
|
2182
|
+
const D = async (m, g) => {
|
|
2150
2183
|
if (m === "close") {
|
|
2151
|
-
|
|
2184
|
+
r();
|
|
2152
2185
|
return;
|
|
2153
2186
|
}
|
|
2154
2187
|
if (m === "price_selected") {
|
|
@@ -2156,8 +2189,8 @@ function er({
|
|
|
2156
2189
|
return;
|
|
2157
2190
|
}
|
|
2158
2191
|
if (m === "restore") {
|
|
2159
|
-
if (!
|
|
2160
|
-
const C =
|
|
2192
|
+
if (!t.auth) return;
|
|
2193
|
+
const C = t.auth.getCachedSession();
|
|
2161
2194
|
if (C && !C.user.is_anonymous) return;
|
|
2162
2195
|
y({ kind: "auth_gate", intent: "restore" });
|
|
2163
2196
|
return;
|
|
@@ -2172,14 +2205,14 @@ function er({
|
|
|
2172
2205
|
n("error", new T("no_price", "No price selected"));
|
|
2173
2206
|
return;
|
|
2174
2207
|
}
|
|
2175
|
-
const K = d.data.settings.checkout_mode ?? "guest", I =
|
|
2176
|
-
if (K === "preauth" && !!
|
|
2208
|
+
const K = d.data.settings.checkout_mode ?? "guest", I = t.auth?.getCachedSession() ?? null, M = !!I && !I.user.is_anonymous;
|
|
2209
|
+
if (K === "preauth" && !!t.auth && !M) {
|
|
2177
2210
|
y({ kind: "auth_gate", pendingCheckout: { priceId: C } });
|
|
2178
2211
|
return;
|
|
2179
2212
|
}
|
|
2180
2213
|
await S(C);
|
|
2181
2214
|
}
|
|
2182
|
-
}, E = d.status === "ready" ? d.data.settings.brand_color : null, U = d.status === "ready" ? d.data.settings.allow_close !== !1 : !0, j = p.kind === "layout" && d.status === "ready" ? Ee(d.data.offers) : null, P = j ? /* @__PURE__ */ o(
|
|
2215
|
+
}, E = d.status === "ready" ? d.data.settings.brand_color : null, U = d.status === "ready" ? d.data.settings.allow_close !== !1 : !0, j = p.kind === "layout" && d.status === "ready" ? Ee(d.data.offers) : null, P = j ? /* @__PURE__ */ o(Ct, { offer: j }) : null, L = {
|
|
2183
2216
|
type: "auth_panel",
|
|
2184
2217
|
// Заголовок не задаём — AuthGate сам решит по intent'у (restore →
|
|
2185
2218
|
// "Restore Purchases", остальные → дефолтный "Welcome back!").
|
|
@@ -2189,46 +2222,46 @@ function er({
|
|
|
2189
2222
|
// чем хотим показывать "Signed in as ..." промежуточным экраном.
|
|
2190
2223
|
hide_when_authenticated: !1,
|
|
2191
2224
|
providers: d.status === "ready" ? d.data.settings.auth_providers : void 0
|
|
2192
|
-
},
|
|
2193
|
-
|
|
2225
|
+
}, N = p.kind === "support" ? /* @__PURE__ */ o(
|
|
2226
|
+
Lt,
|
|
2194
2227
|
{
|
|
2195
|
-
client:
|
|
2228
|
+
client: t,
|
|
2196
2229
|
authSession: w,
|
|
2197
2230
|
origin: p.origin,
|
|
2198
2231
|
onBack: () => {
|
|
2199
|
-
p.origin === "standalone" ?
|
|
2232
|
+
p.origin === "standalone" ? r() : y({ kind: "layout" });
|
|
2200
2233
|
}
|
|
2201
2234
|
}
|
|
2202
|
-
) : null,
|
|
2203
|
-
return /* @__PURE__ */ o(
|
|
2204
|
-
|
|
2235
|
+
) : null, q = p.kind === "auth_gate" && p.origin !== "standalone" || p.kind === "support", Y = d.status === "ready" ? d.data : null;
|
|
2236
|
+
return /* @__PURE__ */ o(ot, { bootstrap: Y, forceLocale: h, children: /* @__PURE__ */ o(
|
|
2237
|
+
st,
|
|
2205
2238
|
{
|
|
2206
2239
|
open: e,
|
|
2207
|
-
onClose:
|
|
2240
|
+
onClose: r,
|
|
2208
2241
|
brandColor: E,
|
|
2209
2242
|
topBanner: P,
|
|
2210
2243
|
allowClose: U,
|
|
2211
|
-
hideCloseButton:
|
|
2244
|
+
hideCloseButton: q,
|
|
2212
2245
|
inline: f,
|
|
2213
2246
|
labelledBy: "pw-title",
|
|
2214
|
-
children: a ? /* @__PURE__ */ o(ke, { onContinue:
|
|
2215
|
-
|
|
2247
|
+
children: a ? /* @__PURE__ */ o(ke, { onContinue: r }) : p.kind === "purchase_success" ? /* @__PURE__ */ o(ke, { restored: p.restored, onContinue: r }) : N || (d.status === "loading" || d.status === "idle" || p.kind === "verifying" ? /* @__PURE__ */ o(sr, { verifying: p.kind === "verifying" }) : d.status === "error" ? /* @__PURE__ */ o(ar, { message: d.error.message }) : p.kind === "auth_gate" && t.auth ? /* @__PURE__ */ o(
|
|
2248
|
+
kt,
|
|
2216
2249
|
{
|
|
2217
2250
|
block: L,
|
|
2218
2251
|
bootstrap: d.data,
|
|
2219
|
-
auth:
|
|
2252
|
+
auth: t.auth,
|
|
2220
2253
|
authSession: w,
|
|
2221
2254
|
showBack: p.origin !== "standalone",
|
|
2222
2255
|
intent: p.intent ?? (p.origin === "standalone" ? "standalone" : "preauth"),
|
|
2223
2256
|
initialMode: p.origin === "standalone" ? s : void 0,
|
|
2224
2257
|
onBack: () => {
|
|
2225
|
-
p.origin === "standalone" ?
|
|
2258
|
+
p.origin === "standalone" ? r() : y({ kind: "layout" });
|
|
2226
2259
|
}
|
|
2227
2260
|
}
|
|
2228
2261
|
) : p.kind === "awaiting_payment" ? /* @__PURE__ */ o(
|
|
2229
|
-
|
|
2262
|
+
cr,
|
|
2230
2263
|
{
|
|
2231
|
-
client:
|
|
2264
|
+
client: t,
|
|
2232
2265
|
onBack: () => y({ kind: "layout" }),
|
|
2233
2266
|
onReopen: () => {
|
|
2234
2267
|
if (typeof window > "u") return;
|
|
@@ -2241,27 +2274,27 @@ function er({
|
|
|
2241
2274
|
},
|
|
2242
2275
|
onRetry: () => S(p.priceId)
|
|
2243
2276
|
}
|
|
2244
|
-
) : p.kind === "popup_blocked" ? /* @__PURE__ */ o(
|
|
2245
|
-
|
|
2277
|
+
) : p.kind === "popup_blocked" ? /* @__PURE__ */ o(lr, { onReopen: () => A(p.priceId, p.url) }) : /* @__PURE__ */ o(
|
|
2278
|
+
rr,
|
|
2246
2279
|
{
|
|
2247
2280
|
layout: d.data.layout,
|
|
2248
2281
|
bootstrap: d.data,
|
|
2249
|
-
onAction:
|
|
2250
|
-
auth:
|
|
2282
|
+
onAction: D,
|
|
2283
|
+
auth: t.auth,
|
|
2251
2284
|
authSession: w
|
|
2252
2285
|
}
|
|
2253
2286
|
))
|
|
2254
2287
|
}
|
|
2255
2288
|
) });
|
|
2256
2289
|
}
|
|
2257
|
-
function
|
|
2290
|
+
function sr({ verifying: t }) {
|
|
2258
2291
|
const { t: e } = k();
|
|
2259
2292
|
return /* @__PURE__ */ u("div", { class: "flex flex-col items-center justify-center gap-3 py-12", children: [
|
|
2260
2293
|
/* @__PURE__ */ o("span", { class: "inline-block h-7 w-7 animate-spin rounded-full border-[2.5px] border-gray-200 border-t-[var(--pw-accent)]" }),
|
|
2261
|
-
/* @__PURE__ */ o("span", { class: "text-xs font-medium tracking-wide text-gray-500", children:
|
|
2294
|
+
/* @__PURE__ */ o("span", { class: "text-xs font-medium tracking-wide text-gray-500", children: t ? e("modal.verifying_subscription", "Checking your subscription…") : e("modal.loading", "Loading…") })
|
|
2262
2295
|
] });
|
|
2263
2296
|
}
|
|
2264
|
-
function
|
|
2297
|
+
function ar({ message: t }) {
|
|
2265
2298
|
const { t: e } = k();
|
|
2266
2299
|
return /* @__PURE__ */ u("div", { class: "flex flex-col items-center gap-2 py-8 text-center", children: [
|
|
2267
2300
|
/* @__PURE__ */ o("div", { class: "flex h-11 w-11 items-center justify-center rounded-full bg-red-50", children: /* @__PURE__ */ u("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", "aria-hidden": "true", children: [
|
|
@@ -2269,10 +2302,10 @@ function rr({ message: r }) {
|
|
|
2269
2302
|
/* @__PURE__ */ o("circle", { cx: "10", cy: "10", r: "8", stroke: "#dc2626", "stroke-width": "1.75" })
|
|
2270
2303
|
] }) }),
|
|
2271
2304
|
/* @__PURE__ */ o("p", { class: "text-sm font-semibold tracking-tight text-gray-900", children: e("modal.error_generic", "Something went wrong") }),
|
|
2272
|
-
/* @__PURE__ */ o("p", { class: "text-xs leading-relaxed text-gray-500", children:
|
|
2305
|
+
/* @__PURE__ */ o("p", { class: "text-xs leading-relaxed text-gray-500", children: t })
|
|
2273
2306
|
] });
|
|
2274
2307
|
}
|
|
2275
|
-
function
|
|
2308
|
+
function lr({ onReopen: t }) {
|
|
2276
2309
|
const { t: e } = k();
|
|
2277
2310
|
return /* @__PURE__ */ u("div", { class: "flex flex-col items-center gap-3 py-8 text-center", children: [
|
|
2278
2311
|
/* @__PURE__ */ o(
|
|
@@ -2293,7 +2326,7 @@ function nr({ onReopen: r }) {
|
|
|
2293
2326
|
"button",
|
|
2294
2327
|
{
|
|
2295
2328
|
type: "button",
|
|
2296
|
-
onClick:
|
|
2329
|
+
onClick: t,
|
|
2297
2330
|
class: "mt-1 rounded-xl px-4 py-2 text-xs font-semibold text-white transition-all hover:-translate-y-px hover:brightness-105 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--pw-accent)]",
|
|
2298
2331
|
style: {
|
|
2299
2332
|
background: "linear-gradient(180deg, color-mix(in srgb, var(--pw-accent) 92%, white), var(--pw-accent))",
|
|
@@ -2304,10 +2337,10 @@ function nr({ onReopen: r }) {
|
|
|
2304
2337
|
)
|
|
2305
2338
|
] });
|
|
2306
2339
|
}
|
|
2307
|
-
function
|
|
2308
|
-
client:
|
|
2340
|
+
function cr({
|
|
2341
|
+
client: t,
|
|
2309
2342
|
onBack: e,
|
|
2310
|
-
onReopen:
|
|
2343
|
+
onReopen: r,
|
|
2311
2344
|
onRetry: n
|
|
2312
2345
|
}) {
|
|
2313
2346
|
const { t: i } = k(), [s, a] = x(!1), [c, l] = x(!1), f = R(null);
|
|
@@ -2318,7 +2351,7 @@ function ir({
|
|
|
2318
2351
|
if (!s) {
|
|
2319
2352
|
a(!0), l(!1);
|
|
2320
2353
|
try {
|
|
2321
|
-
if ((await
|
|
2354
|
+
if ((await t.getUser({ force: !0 })).has_active_subscription) {
|
|
2322
2355
|
typeof window < "u" && window.postMessage({ type: "paywall_purchase" }, "*");
|
|
2323
2356
|
return;
|
|
2324
2357
|
}
|
|
@@ -2381,7 +2414,7 @@ function ir({
|
|
|
2381
2414
|
"button",
|
|
2382
2415
|
{
|
|
2383
2416
|
type: "button",
|
|
2384
|
-
onClick:
|
|
2417
|
+
onClick: r,
|
|
2385
2418
|
class: "mt-2.5 w-full rounded-xl border border-gray-200 bg-white px-3 py-2 text-xs font-semibold text-gray-700 transition-colors hover:border-gray-300 hover:bg-gray-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--pw-accent)]",
|
|
2386
2419
|
children: i("payment.open_checkout_again", "Open checkout again")
|
|
2387
2420
|
}
|
|
@@ -2399,10 +2432,10 @@ function ir({
|
|
|
2399
2432
|
] });
|
|
2400
2433
|
}
|
|
2401
2434
|
function ke({
|
|
2402
|
-
onContinue:
|
|
2435
|
+
onContinue: t,
|
|
2403
2436
|
restored: e = !1
|
|
2404
2437
|
}) {
|
|
2405
|
-
const { t } = k();
|
|
2438
|
+
const { t: r } = k();
|
|
2406
2439
|
return /* @__PURE__ */ u("div", { class: "flex flex-col items-center gap-3 py-8 text-center", children: [
|
|
2407
2440
|
/* @__PURE__ */ o(
|
|
2408
2441
|
"div",
|
|
@@ -2427,37 +2460,37 @@ function ke({
|
|
|
2427
2460
|
) })
|
|
2428
2461
|
}
|
|
2429
2462
|
),
|
|
2430
|
-
/* @__PURE__ */ o("p", { id: "pw-title", class: "mt-1 text-lg font-semibold tracking-tight text-gray-900", children: e ?
|
|
2431
|
-
/* @__PURE__ */ o("p", { class: "text-sm leading-relaxed text-gray-500", children: e ?
|
|
2463
|
+
/* @__PURE__ */ o("p", { id: "pw-title", class: "mt-1 text-lg font-semibold tracking-tight text-gray-900", children: e ? r("modal.purchase_restored_title", "Subscription restored") : r("modal.purchase_success_title", "Payment received") }),
|
|
2464
|
+
/* @__PURE__ */ o("p", { class: "text-sm leading-relaxed text-gray-500", children: e ? r(
|
|
2432
2465
|
"modal.purchase_restored_subtitle",
|
|
2433
2466
|
"Welcome back — your subscription is already active."
|
|
2434
|
-
) :
|
|
2467
|
+
) : r("modal.purchase_success_subtitle", "Your subscription is now active.") }),
|
|
2435
2468
|
/* @__PURE__ */ o(
|
|
2436
2469
|
"button",
|
|
2437
2470
|
{
|
|
2438
2471
|
type: "button",
|
|
2439
|
-
onClick:
|
|
2472
|
+
onClick: t,
|
|
2440
2473
|
class: "mt-3 rounded-xl px-5 py-2.5 text-sm font-semibold text-white transition-all hover:-translate-y-px hover:brightness-105 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--pw-accent)]",
|
|
2441
2474
|
style: {
|
|
2442
2475
|
background: "linear-gradient(180deg, color-mix(in srgb, var(--pw-accent) 92%, white), var(--pw-accent))",
|
|
2443
2476
|
boxShadow: "0 1px 2px rgba(15,23,42,0.08), 0 8px 20px -6px color-mix(in srgb, var(--pw-accent) 50%, transparent)"
|
|
2444
2477
|
},
|
|
2445
|
-
children:
|
|
2478
|
+
children: r("modal.continue", "Continue")
|
|
2446
2479
|
}
|
|
2447
2480
|
)
|
|
2448
2481
|
] });
|
|
2449
2482
|
}
|
|
2450
|
-
const
|
|
2451
|
-
class
|
|
2483
|
+
const ur = 10 * 6e4, dr = 5e3, hr = 3e4;
|
|
2484
|
+
class pr {
|
|
2452
2485
|
constructor(e) {
|
|
2453
2486
|
this.timer = null, this.timeoutTimer = null, this.visibilityHandler = null, this.focusHandler = null, this.messageHandler = null, this.stopped = !1, this.checking = !1, this.opts = {
|
|
2454
2487
|
client: e.client,
|
|
2455
2488
|
onActive: e.onActive,
|
|
2456
2489
|
onTimeout: e.onTimeout ?? (() => {
|
|
2457
2490
|
}),
|
|
2458
|
-
timeoutMs: e.timeoutMs ??
|
|
2459
|
-
visibleIntervalMs: e.visibleIntervalMs ??
|
|
2460
|
-
hiddenIntervalMs: e.hiddenIntervalMs ??
|
|
2491
|
+
timeoutMs: e.timeoutMs ?? ur,
|
|
2492
|
+
visibleIntervalMs: e.visibleIntervalMs ?? dr,
|
|
2493
|
+
hiddenIntervalMs: e.hiddenIntervalMs ?? hr
|
|
2461
2494
|
};
|
|
2462
2495
|
}
|
|
2463
2496
|
start() {
|
|
@@ -2483,20 +2516,20 @@ class lr {
|
|
|
2483
2516
|
}
|
|
2484
2517
|
scheduleNext() {
|
|
2485
2518
|
if (this.stopped) return;
|
|
2486
|
-
const
|
|
2519
|
+
const r = typeof document < "u" && document.visibilityState === "visible" ? this.opts.visibleIntervalMs : this.opts.hiddenIntervalMs;
|
|
2487
2520
|
this.timer = setTimeout(async () => {
|
|
2488
2521
|
await this.check(), this.scheduleNext();
|
|
2489
|
-
},
|
|
2522
|
+
}, r);
|
|
2490
2523
|
}
|
|
2491
2524
|
handleVisibilityChange() {
|
|
2492
2525
|
typeof document > "u" || (document.visibilityState === "visible" && this.check(), this.timer !== null && (clearTimeout(this.timer), this.timer = null), this.scheduleNext());
|
|
2493
2526
|
}
|
|
2494
2527
|
handleMessage(e) {
|
|
2495
|
-
const
|
|
2496
|
-
!
|
|
2528
|
+
const r = e.data;
|
|
2529
|
+
!r || typeof r != "object" || r.type === "paywall_purchase" && this.check();
|
|
2497
2530
|
}
|
|
2498
2531
|
}
|
|
2499
|
-
function
|
|
2532
|
+
function fr() {
|
|
2500
2533
|
return !(typeof document > "u" || typeof window > "u" || typeof location < "u" && location.protocol === "chrome-extension:");
|
|
2501
2534
|
}
|
|
2502
2535
|
const oe = { open: !1, view: null, error: null }, F = {
|
|
@@ -2504,11 +2537,11 @@ const oe = { open: !1, view: null, error: null }, F = {
|
|
|
2504
2537
|
priceId: "paywall_price_id",
|
|
2505
2538
|
sessionId: "paywall_session_id"
|
|
2506
2539
|
};
|
|
2507
|
-
let
|
|
2540
|
+
let gr = class {
|
|
2508
2541
|
constructor(e) {
|
|
2509
2542
|
this.handle = null, this.isOpen = !1, this.listeners = /* @__PURE__ */ new Map(), this.userUnsub = null, this.authUnsub = null, this.watcher = null, this.tracker = null, this.purchased = !1, this.trialStore = null, this.trialStoreConfig = null, this.lastTrialStatus = null, this.trialExpiredFired = !1, this.lastVisibility = null, this.currentState = oe, this.stateListeners = /* @__PURE__ */ new Set();
|
|
2510
|
-
const { auth:
|
|
2511
|
-
this.auth =
|
|
2543
|
+
const { auth: r, ownsAuth: n } = mr(e);
|
|
2544
|
+
this.auth = r, this.ownsAuth = n, this.billing = e.client ?? new je({ ...e, auth: this.auth }), this.host = e.host, this.shadowMode = e.shadowMode ?? "closed", this.mountThenLoad = e.mountThenLoad ?? !0, this.inline = e.inline === !0, this.forceLocale = e.locale ?? null, this.userUnsub = this.billing.onUserChange((i) => {
|
|
2512
2545
|
this.emit("userChange", i);
|
|
2513
2546
|
}), this.auth && (this.authUnsub = this.auth.onAuthChange((i, s) => {
|
|
2514
2547
|
this.emit("authChange", { event: i, session: s });
|
|
@@ -2516,9 +2549,9 @@ let ur = class {
|
|
|
2516
2549
|
}
|
|
2517
2550
|
initTracker(e) {
|
|
2518
2551
|
if (e === !1) return;
|
|
2519
|
-
const
|
|
2520
|
-
if (
|
|
2521
|
-
const n =
|
|
2552
|
+
const r = typeof e == "object" && e !== null ? e : {};
|
|
2553
|
+
if (r.enabled === !1) return;
|
|
2554
|
+
const n = r.endpoint ?? `${this.billing.apiOrigin}/api/v1/paywall/${this.billing.paywallId}/events`;
|
|
2522
2555
|
this.tracker = new Re({
|
|
2523
2556
|
endpoint: n,
|
|
2524
2557
|
paywallId: this.billing.paywallId,
|
|
@@ -2526,10 +2559,10 @@ let ur = class {
|
|
|
2526
2559
|
getVisitorId: () => this.billing.getVisitorId(),
|
|
2527
2560
|
getCachedVisitorId: () => this.billing.getCachedVisitorId(),
|
|
2528
2561
|
getUserId: () => this.billing.getIdentity()?.userId ?? null,
|
|
2529
|
-
flushIntervalMs:
|
|
2530
|
-
maxBufferSize:
|
|
2531
|
-
fetch:
|
|
2532
|
-
sendBeacon:
|
|
2562
|
+
flushIntervalMs: r.flushIntervalMs,
|
|
2563
|
+
maxBufferSize: r.maxBufferSize,
|
|
2564
|
+
fetch: r.fetch,
|
|
2565
|
+
sendBeacon: r.sendBeacon
|
|
2533
2566
|
}), this.on("open", () => this.tracker?.track("paywall_opened")), this.on(
|
|
2534
2567
|
"ready",
|
|
2535
2568
|
(i) => this.tracker?.track("paywall_viewed", {
|
|
@@ -2582,8 +2615,8 @@ let ur = class {
|
|
|
2582
2615
|
* Самый частый кейс — `track('app_opened')` от хоста сразу после загрузки
|
|
2583
2616
|
* приложения, чтобы зафиксировать воронку до открытия пейвола.
|
|
2584
2617
|
*/
|
|
2585
|
-
track(e,
|
|
2586
|
-
this.tracker?.track(e,
|
|
2618
|
+
track(e, r) {
|
|
2619
|
+
this.tracker?.track(e, r);
|
|
2587
2620
|
}
|
|
2588
2621
|
/**
|
|
2589
2622
|
* Удобный шорткат вместо `paywall.on('userChange', cb)` — самый частый
|
|
@@ -2615,20 +2648,20 @@ let ur = class {
|
|
|
2615
2648
|
* (navigator.language → locale_default).
|
|
2616
2649
|
*/
|
|
2617
2650
|
setLocale(e) {
|
|
2618
|
-
const
|
|
2619
|
-
|
|
2651
|
+
const r = e ?? null;
|
|
2652
|
+
r !== this.forceLocale && (this.forceLocale = r, this.handle && this.handle.update({ locale: r }));
|
|
2620
2653
|
}
|
|
2621
|
-
on(e,
|
|
2654
|
+
on(e, r) {
|
|
2622
2655
|
let n = this.listeners.get(e);
|
|
2623
|
-
return n || (n = /* @__PURE__ */ new Set(), this.listeners.set(e, n)), n.add(
|
|
2656
|
+
return n || (n = /* @__PURE__ */ new Set(), this.listeners.set(e, n)), n.add(r), () => n.delete(r);
|
|
2624
2657
|
}
|
|
2625
|
-
off(e,
|
|
2626
|
-
this.listeners.get(e)?.delete(
|
|
2658
|
+
off(e, r) {
|
|
2659
|
+
this.listeners.get(e)?.delete(r);
|
|
2627
2660
|
}
|
|
2628
|
-
emit(e, ...
|
|
2661
|
+
emit(e, ...r) {
|
|
2629
2662
|
const n = this.listeners.get(e);
|
|
2630
2663
|
if (!n) return;
|
|
2631
|
-
const i =
|
|
2664
|
+
const i = r[0];
|
|
2632
2665
|
for (const s of n)
|
|
2633
2666
|
try {
|
|
2634
2667
|
s(i);
|
|
@@ -2725,11 +2758,11 @@ let ur = class {
|
|
|
2725
2758
|
)
|
|
2726
2759
|
);
|
|
2727
2760
|
}
|
|
2728
|
-
openInternal(e,
|
|
2729
|
-
|
|
2730
|
-
const n =
|
|
2761
|
+
openInternal(e, r) {
|
|
2762
|
+
r.identity && this.billing.setIdentity(r.identity), this.purchased = !1;
|
|
2763
|
+
const n = r.skipTrial === !0 || e === "support", i = r.skipVisibility === !0 || e === "support" || e === "auth", s = r.renew === !0;
|
|
2731
2764
|
if (n && i) {
|
|
2732
|
-
this.mountAndShow(e, { renew: s, authMode:
|
|
2765
|
+
this.mountAndShow(e, { renew: s, authMode: r.authMode });
|
|
2733
2766
|
return;
|
|
2734
2767
|
}
|
|
2735
2768
|
const a = this.billing.getCachedBootstrap();
|
|
@@ -2749,16 +2782,16 @@ let ur = class {
|
|
|
2749
2782
|
/** Применить gates ПОСЛЕ того, как модалка уже смонтирована (mount-then-load
|
|
2750
2783
|
* путь). Если gate блокирует — close() + emit. Если юзер уже сам закрыл
|
|
2751
2784
|
* модалку до резолва bootstrap'а — no-op (isOpen=false). */
|
|
2752
|
-
runDelayedGates(e,
|
|
2785
|
+
runDelayedGates(e, r) {
|
|
2753
2786
|
if (!this.isOpen) return;
|
|
2754
|
-
if (!
|
|
2787
|
+
if (!r.skipVisibility) {
|
|
2755
2788
|
const s = e.settings.visibility;
|
|
2756
2789
|
if (s && (this.lastVisibility = s, !s.visible)) {
|
|
2757
2790
|
this.close(), this.emit("visibility_blocked", s);
|
|
2758
2791
|
return;
|
|
2759
2792
|
}
|
|
2760
2793
|
}
|
|
2761
|
-
if (
|
|
2794
|
+
if (r.skipTrial) return;
|
|
2762
2795
|
const n = e.settings.trial;
|
|
2763
2796
|
if (!n) return;
|
|
2764
2797
|
const i = this.ensureTrialStore(n);
|
|
@@ -2780,9 +2813,9 @@ let ur = class {
|
|
|
2780
2813
|
// вести trial-стейт «осталось N показов» под юзером, который вообще не
|
|
2781
2814
|
// должен увидеть пейвол по таргетингу — бессмысленно: при возврате в
|
|
2782
2815
|
// правильную страну он окажется со «слипшимся» триал-счётчиком.
|
|
2783
|
-
runOpenGates(e,
|
|
2816
|
+
runOpenGates(e, r, n) {
|
|
2784
2817
|
if (!n.skipVisibility) {
|
|
2785
|
-
const i =
|
|
2818
|
+
const i = r.settings.visibility;
|
|
2786
2819
|
if (i && (this.lastVisibility = i, !i.visible)) {
|
|
2787
2820
|
this.emit("visibility_blocked", i);
|
|
2788
2821
|
return;
|
|
@@ -2792,10 +2825,10 @@ let ur = class {
|
|
|
2792
2825
|
this.mountAndShow(e, { renew: n.renew });
|
|
2793
2826
|
return;
|
|
2794
2827
|
}
|
|
2795
|
-
this.gateThroughTrial(e,
|
|
2828
|
+
this.gateThroughTrial(e, r, n.renew);
|
|
2796
2829
|
}
|
|
2797
|
-
gateThroughTrial(e,
|
|
2798
|
-
const i =
|
|
2830
|
+
gateThroughTrial(e, r, n) {
|
|
2831
|
+
const i = r.settings.trial;
|
|
2799
2832
|
if (!i) {
|
|
2800
2833
|
this.mountAndShow(e, { renew: n });
|
|
2801
2834
|
return;
|
|
@@ -2817,14 +2850,14 @@ let ur = class {
|
|
|
2817
2850
|
});
|
|
2818
2851
|
}
|
|
2819
2852
|
ensureTrialStore(e) {
|
|
2820
|
-
if (this.trialStore && this.trialStoreConfig &&
|
|
2853
|
+
if (this.trialStore && this.trialStoreConfig && br(this.trialStoreConfig, e))
|
|
2821
2854
|
return this.trialStore;
|
|
2822
2855
|
this.trialStoreConfig = e;
|
|
2823
|
-
const
|
|
2824
|
-
return this.trialStore = typeof
|
|
2856
|
+
const r = this.billing.createTrialStore;
|
|
2857
|
+
return this.trialStore = typeof r == "function" ? r.call(this.billing, e) : De(this.billing.getStorage(), this.billing.paywallId, e), this.trialStore;
|
|
2825
2858
|
}
|
|
2826
|
-
mountAndShow(e,
|
|
2827
|
-
const n =
|
|
2859
|
+
mountAndShow(e, r = {}) {
|
|
2860
|
+
const n = r.renew === !0, i = r.authMode;
|
|
2828
2861
|
if (this.handle) {
|
|
2829
2862
|
this.isOpen = !0, this.handle.update({
|
|
2830
2863
|
open: !0,
|
|
@@ -2835,8 +2868,8 @@ let ur = class {
|
|
|
2835
2868
|
}), this.emit("open");
|
|
2836
2869
|
return;
|
|
2837
2870
|
}
|
|
2838
|
-
this.isOpen = !0, this.handle =
|
|
2839
|
-
|
|
2871
|
+
this.isOpen = !0, this.handle = Qe(
|
|
2872
|
+
or,
|
|
2840
2873
|
{
|
|
2841
2874
|
client: this.billing,
|
|
2842
2875
|
open: !0,
|
|
@@ -2856,11 +2889,11 @@ let ur = class {
|
|
|
2856
2889
|
), this.emit("open");
|
|
2857
2890
|
}
|
|
2858
2891
|
applyState(e) {
|
|
2859
|
-
if (!
|
|
2892
|
+
if (!xr(this.currentState, e)) {
|
|
2860
2893
|
this.currentState = e;
|
|
2861
|
-
for (const
|
|
2894
|
+
for (const r of this.stateListeners)
|
|
2862
2895
|
try {
|
|
2863
|
-
|
|
2896
|
+
r(e);
|
|
2864
2897
|
} catch (n) {
|
|
2865
2898
|
console.warn("[paywall] onStateChange listener threw", n);
|
|
2866
2899
|
}
|
|
@@ -2887,9 +2920,9 @@ let ur = class {
|
|
|
2887
2920
|
*
|
|
2888
2921
|
* Возвращает unsubscribe.
|
|
2889
2922
|
*/
|
|
2890
|
-
onStateChange(e,
|
|
2923
|
+
onStateChange(e, r = {}) {
|
|
2891
2924
|
this.stateListeners.add(e);
|
|
2892
|
-
const n =
|
|
2925
|
+
const n = r.immediate ?? "microtask";
|
|
2893
2926
|
if (n !== "none") {
|
|
2894
2927
|
const i = this.currentState;
|
|
2895
2928
|
if (n === "sync")
|
|
@@ -2934,6 +2967,36 @@ let ur = class {
|
|
|
2934
2967
|
getCachedPrices() {
|
|
2935
2968
|
return this.billing.getCachedPrices();
|
|
2936
2969
|
}
|
|
2970
|
+
/** Sync-снимок офферов. null = bootstrap не загружали, [] = пейвол без офферов.
|
|
2971
|
+
* Бэк уже применил серверный targeting (страны/email/режим) — наружу
|
|
2972
|
+
* выезжает только то, что применимо к текущему юзеру. */
|
|
2973
|
+
getCachedOffers() {
|
|
2974
|
+
return this.billing.getCachedOffers();
|
|
2975
|
+
}
|
|
2976
|
+
/**
|
|
2977
|
+
* Резолвит активный offer для конкретной цены: price_id-таргетинг +
|
|
2978
|
+
* countdown (`expires_at` ИЛИ `duration_minutes` от первого открытия
|
|
2979
|
+
* пейвола, см. clientStorage `pw-offer-{id}-start`).
|
|
2980
|
+
*
|
|
2981
|
+
* Read-only — НЕ записывает start для `duration_minutes`-офферов. Запись
|
|
2982
|
+
* стартует только когда модалка реально открыта (renderer'ом). До этого
|
|
2983
|
+
* `getOfferForPrice` вернёт `null` для duration-only офферов, чтобы
|
|
2984
|
+
* страницы-хосты вне модалки (pricing, landing) не активировали countdown
|
|
2985
|
+
* раньше времени.
|
|
2986
|
+
*
|
|
2987
|
+
* Хост-странице нужен countdown, который тикает каждую секунду — для
|
|
2988
|
+
* этого использовать React-хук `usePaywallOffer(priceId)` из sdk-react
|
|
2989
|
+
* либо обёртку поверх `setInterval(1000)` + повторный вызов этого метода.
|
|
2990
|
+
*/
|
|
2991
|
+
getOfferForPrice(e) {
|
|
2992
|
+
const r = this.billing.getCachedOffers();
|
|
2993
|
+
if (!r) return null;
|
|
2994
|
+
const n = $(r, e);
|
|
2995
|
+
return n ? Ze(n, {
|
|
2996
|
+
now: Date.now(),
|
|
2997
|
+
readStart: Xe
|
|
2998
|
+
}) : null;
|
|
2999
|
+
}
|
|
2937
3000
|
/** Снимок текущего «языка юзера» — proxy над `billing.getUserLanguage()`.
|
|
2938
3001
|
* Используй, чтобы синхронизировать i18n host'а с тем, что фактически
|
|
2939
3002
|
* показывает пейвол. См. подробности в `BillingClient.getUserLanguage`. */
|
|
@@ -2962,10 +3025,10 @@ let ur = class {
|
|
|
2962
3025
|
* `getAccess()`, а не только после первого `open()`.
|
|
2963
3026
|
*/
|
|
2964
3027
|
async getAccess(e = {}) {
|
|
2965
|
-
let
|
|
2966
|
-
if (!
|
|
3028
|
+
let r = this.billing.getCachedBootstrap();
|
|
3029
|
+
if (!r)
|
|
2967
3030
|
try {
|
|
2968
|
-
|
|
3031
|
+
r = await this.billing.bootstrap({ signal: e.signal });
|
|
2969
3032
|
} catch {
|
|
2970
3033
|
const a = this.billing.getCachedUser();
|
|
2971
3034
|
return a?.has_active_subscription ? {
|
|
@@ -2982,24 +3045,24 @@ let ur = class {
|
|
|
2982
3045
|
user: a
|
|
2983
3046
|
};
|
|
2984
3047
|
}
|
|
2985
|
-
const n =
|
|
3048
|
+
const n = r.user ?? null;
|
|
2986
3049
|
if (n?.has_active_subscription)
|
|
2987
3050
|
return {
|
|
2988
3051
|
access: "granted",
|
|
2989
3052
|
reason: "has_subscription",
|
|
2990
|
-
visibility:
|
|
3053
|
+
visibility: r.settings.visibility ?? null,
|
|
2991
3054
|
trial: null,
|
|
2992
3055
|
user: n
|
|
2993
3056
|
};
|
|
2994
3057
|
let i = null;
|
|
2995
3058
|
if (!e.skipVisibility) {
|
|
2996
|
-
const a =
|
|
3059
|
+
const a = r.settings.visibility;
|
|
2997
3060
|
if (a && (i = a, this.lastVisibility = a, !a.visible))
|
|
2998
3061
|
return { access: "granted", reason: "visibility_blocked", visibility: i, trial: null, user: n };
|
|
2999
3062
|
}
|
|
3000
3063
|
let s = null;
|
|
3001
3064
|
if (!e.skipTrial) {
|
|
3002
|
-
const a =
|
|
3065
|
+
const a = r.settings.trial;
|
|
3003
3066
|
if (a)
|
|
3004
3067
|
try {
|
|
3005
3068
|
if (s = await this.ensureTrialStore(a).check(), this.lastTrialStatus = s, s.blocked)
|
|
@@ -3022,14 +3085,14 @@ let ur = class {
|
|
|
3022
3085
|
// В extension popup runtime — no-op (popup не доживёт). Там полагаемся на
|
|
3023
3086
|
// bootstrap при следующем открытии.
|
|
3024
3087
|
startUserWatcher() {
|
|
3025
|
-
this.watcher ||
|
|
3088
|
+
this.watcher || fr() && (this.watcher = new pr({
|
|
3026
3089
|
client: this.billing,
|
|
3027
3090
|
onActive: (e) => {
|
|
3028
3091
|
this.watcher = null, this.emit("purchase_completed", { priceId: null, sessionId: null });
|
|
3029
|
-
const
|
|
3030
|
-
if (
|
|
3092
|
+
const r = this.billing.getCachedBootstrap()?.settings.success_redirect_url;
|
|
3093
|
+
if (r && typeof window < "u")
|
|
3031
3094
|
try {
|
|
3032
|
-
window.location.assign(
|
|
3095
|
+
window.location.assign(r);
|
|
3033
3096
|
return;
|
|
3034
3097
|
} catch {
|
|
3035
3098
|
}
|
|
@@ -3051,80 +3114,80 @@ let ur = class {
|
|
|
3051
3114
|
*/
|
|
3052
3115
|
checkReturn() {
|
|
3053
3116
|
if (typeof window > "u") return;
|
|
3054
|
-
const e = new URL(window.location.href),
|
|
3117
|
+
const e = new URL(window.location.href), r = ve(e.hash.replace(/^#/, "")), n = ve(e.search.replace(/^\?/, "")), i = r ?? n;
|
|
3055
3118
|
i && (i.status === "paid" ? (this.emit("purchase_completed", {
|
|
3056
3119
|
priceId: i.priceId,
|
|
3057
3120
|
sessionId: i.sessionId
|
|
3058
|
-
}),
|
|
3121
|
+
}), wr(i)) : (i.status === "failed" || i.status === "cancelled") && this.emit("purchase_failed", { reason: i.status }), kr(e));
|
|
3059
3122
|
}
|
|
3060
3123
|
destroy() {
|
|
3061
3124
|
this.tracker?.destroy(), this.tracker = null, this.listeners.clear(), this.stateListeners.clear(), this.watcher?.stop(), this.watcher = null, this.userUnsub?.(), this.userUnsub = null, this.authUnsub?.(), this.authUnsub = null, this.ownsAuth && this.auth && this.auth.destroy?.(), this.ownsAuth = !1, this.billing.destroy?.(), this.handle?.unmount(), this.handle = null, this.isOpen = !1, this.currentState = oe;
|
|
3062
3125
|
}
|
|
3063
3126
|
};
|
|
3064
|
-
function
|
|
3065
|
-
if (!
|
|
3066
|
-
if (
|
|
3067
|
-
return { auth:
|
|
3068
|
-
const e =
|
|
3127
|
+
function mr(t) {
|
|
3128
|
+
if (!t.auth) return { auth: void 0, ownsAuth: !1 };
|
|
3129
|
+
if (t.auth instanceof ce || yr(t.auth))
|
|
3130
|
+
return { auth: t.auth, ownsAuth: !1 };
|
|
3131
|
+
const e = t.auth === !0 ? {} : t.auth;
|
|
3069
3132
|
return {
|
|
3070
3133
|
auth: new ce({
|
|
3071
|
-
paywallId:
|
|
3072
|
-
apiOrigin: e.apiOrigin ??
|
|
3073
|
-
storage: e.storage ??
|
|
3074
|
-
fetch: e.fetch ??
|
|
3134
|
+
paywallId: t.paywallId,
|
|
3135
|
+
apiOrigin: e.apiOrigin ?? t.apiOrigin,
|
|
3136
|
+
storage: e.storage ?? t.storage,
|
|
3137
|
+
fetch: e.fetch ?? t.fetch,
|
|
3075
3138
|
openPopup: e.openPopup
|
|
3076
3139
|
}),
|
|
3077
3140
|
ownsAuth: !0
|
|
3078
3141
|
};
|
|
3079
3142
|
}
|
|
3080
|
-
function
|
|
3081
|
-
if (typeof
|
|
3082
|
-
const e =
|
|
3143
|
+
function yr(t) {
|
|
3144
|
+
if (typeof t != "object" || t === null) return !1;
|
|
3145
|
+
const e = t;
|
|
3083
3146
|
return typeof e.onAuthChange == "function" && typeof e.getCachedSession == "function" && typeof e.signOut == "function";
|
|
3084
3147
|
}
|
|
3085
|
-
function
|
|
3086
|
-
return
|
|
3148
|
+
function xr(t, e) {
|
|
3149
|
+
return t.open === e.open && t.view === e.view && t.error === e.error;
|
|
3087
3150
|
}
|
|
3088
|
-
function
|
|
3089
|
-
return
|
|
3151
|
+
function br(t, e) {
|
|
3152
|
+
return t.mode === e.mode && t.payload === e.payload && t.storage === e.storage;
|
|
3090
3153
|
}
|
|
3091
|
-
function ve(
|
|
3092
|
-
if (!
|
|
3093
|
-
const e = new URLSearchParams(
|
|
3094
|
-
return
|
|
3095
|
-
status:
|
|
3154
|
+
function ve(t) {
|
|
3155
|
+
if (!t) return null;
|
|
3156
|
+
const e = new URLSearchParams(t), r = e.get(F.status);
|
|
3157
|
+
return r ? {
|
|
3158
|
+
status: r,
|
|
3096
3159
|
priceId: e.get(F.priceId),
|
|
3097
3160
|
sessionId: e.get(F.sessionId)
|
|
3098
3161
|
} : null;
|
|
3099
3162
|
}
|
|
3100
|
-
function
|
|
3163
|
+
function wr(t) {
|
|
3101
3164
|
if (!(typeof window > "u" || !window.opener))
|
|
3102
3165
|
try {
|
|
3103
3166
|
window.opener.postMessage(
|
|
3104
3167
|
{
|
|
3105
3168
|
type: "paywall_purchase",
|
|
3106
|
-
status:
|
|
3107
|
-
priceId:
|
|
3108
|
-
sessionId:
|
|
3169
|
+
status: t.status,
|
|
3170
|
+
priceId: t.priceId,
|
|
3171
|
+
sessionId: t.sessionId
|
|
3109
3172
|
},
|
|
3110
3173
|
"*"
|
|
3111
3174
|
);
|
|
3112
3175
|
} catch {
|
|
3113
3176
|
}
|
|
3114
3177
|
}
|
|
3115
|
-
function
|
|
3178
|
+
function kr(t) {
|
|
3116
3179
|
const e = (n, i) => {
|
|
3117
3180
|
if (!n) return "";
|
|
3118
3181
|
const s = new URLSearchParams(n.replace(/^[?#]/, ""));
|
|
3119
3182
|
s.delete(F.status), s.delete(F.priceId), s.delete(F.sessionId);
|
|
3120
3183
|
const a = s.toString();
|
|
3121
3184
|
return a ? i + a : "";
|
|
3122
|
-
},
|
|
3123
|
-
window.history.replaceState(null, "",
|
|
3185
|
+
}, r = t.pathname + e(t.search, "?") + e(t.hash, "#");
|
|
3186
|
+
window.history.replaceState(null, "", r);
|
|
3124
3187
|
}
|
|
3125
|
-
class
|
|
3126
|
-
constructor(e,
|
|
3127
|
-
this.transport = e, this.paywallId =
|
|
3188
|
+
class vr {
|
|
3189
|
+
constructor(e, r, n) {
|
|
3190
|
+
this.transport = e, this.paywallId = r, this.config = n;
|
|
3128
3191
|
}
|
|
3129
3192
|
async check() {
|
|
3130
3193
|
return this.transport.request("trial.check", {
|
|
@@ -3145,9 +3208,9 @@ class yr {
|
|
|
3145
3208
|
});
|
|
3146
3209
|
}
|
|
3147
3210
|
}
|
|
3148
|
-
class
|
|
3149
|
-
constructor(e,
|
|
3150
|
-
this.transport = e, this.cachedBootstrap = null, this.cachedUser = null, this.cachedBalances = null, this.identity = null, this.userListeners = /* @__PURE__ */ new Set(), this.balanceListeners = /* @__PURE__ */ new Set(), this.bootstrapListeners = /* @__PURE__ */ new Set(), this.unsubUserBroadcast = null, this.unsubBalancesBroadcast = null, this.paywallId =
|
|
3211
|
+
class _r {
|
|
3212
|
+
constructor(e, r) {
|
|
3213
|
+
this.transport = e, this.cachedBootstrap = null, this.cachedUser = null, this.cachedBalances = null, this.identity = null, this.userListeners = /* @__PURE__ */ new Set(), this.balanceListeners = /* @__PURE__ */ new Set(), this.bootstrapListeners = /* @__PURE__ */ new Set(), this.unsubUserBroadcast = null, this.unsubBalancesBroadcast = null, this.paywallId = r.paywallId, this.apiOrigin = r.apiOrigin, this.remoteStorageAdapter = {
|
|
3151
3214
|
getItem: (n) => this.transport.request("storage.get", { key: n }),
|
|
3152
3215
|
setItem: async (n, i) => {
|
|
3153
3216
|
await this.transport.request("storage.set", { key: n, value: i });
|
|
@@ -3166,12 +3229,12 @@ class xr {
|
|
|
3166
3229
|
}
|
|
3167
3230
|
// === Bootstrap ===
|
|
3168
3231
|
async bootstrap(e = {}) {
|
|
3169
|
-
const
|
|
3232
|
+
const r = await this.transport.request(
|
|
3170
3233
|
"billing.bootstrap",
|
|
3171
3234
|
{ force: e.force },
|
|
3172
3235
|
{ signal: e.signal }
|
|
3173
3236
|
);
|
|
3174
|
-
return this.applyBootstrap(
|
|
3237
|
+
return this.applyBootstrap(r), r.user && this.applyUser(r.user), r;
|
|
3175
3238
|
}
|
|
3176
3239
|
getCachedBootstrap() {
|
|
3177
3240
|
return this.cachedBootstrap;
|
|
@@ -3184,9 +3247,9 @@ class xr {
|
|
|
3184
3247
|
* обновляется → listener вызывается). Cross-surface revalidate (другая вкладка
|
|
3185
3248
|
* обновила bootstrap) не доезжает до popup'а — для этого нужен отдельный
|
|
3186
3249
|
* bootstrapChange-broadcast в protocol.ts/server.ts. */
|
|
3187
|
-
onBootstrapChange(e,
|
|
3250
|
+
onBootstrapChange(e, r = {}) {
|
|
3188
3251
|
this.bootstrapListeners.add(e);
|
|
3189
|
-
const n =
|
|
3252
|
+
const n = r.immediate ?? "microtask";
|
|
3190
3253
|
if (this.cachedBootstrap && n !== "none") {
|
|
3191
3254
|
const i = this.cachedBootstrap;
|
|
3192
3255
|
if (n === "sync")
|
|
@@ -3213,18 +3276,24 @@ class xr {
|
|
|
3213
3276
|
getCachedPrices() {
|
|
3214
3277
|
return this.cachedBootstrap?.prices ?? null;
|
|
3215
3278
|
}
|
|
3279
|
+
/** Sync-снимок офферов. null = bootstrap не загружали, [] = пейвол без офферов.
|
|
3280
|
+
* Серверный таргетинг (страны/email/режим) уже применён бэком — наружу
|
|
3281
|
+
* выезжает только то, что применимо к текущему юзеру. */
|
|
3282
|
+
getCachedOffers() {
|
|
3283
|
+
return this.cachedBootstrap?.offers ?? null;
|
|
3284
|
+
}
|
|
3216
3285
|
// === Visitor ===
|
|
3217
3286
|
async getVisitorId() {
|
|
3218
3287
|
return this.transport.request("billing.getVisitorId", void 0);
|
|
3219
3288
|
}
|
|
3220
3289
|
// === User ===
|
|
3221
3290
|
async getUser(e = {}) {
|
|
3222
|
-
const
|
|
3291
|
+
const r = await this.transport.request(
|
|
3223
3292
|
"billing.getUser",
|
|
3224
3293
|
{ force: e.force },
|
|
3225
3294
|
{ signal: e.signal }
|
|
3226
3295
|
);
|
|
3227
|
-
return this.applyUser(
|
|
3296
|
+
return this.applyUser(r), r;
|
|
3228
3297
|
}
|
|
3229
3298
|
getCachedUser() {
|
|
3230
3299
|
return this.cachedUser;
|
|
@@ -3232,9 +3301,9 @@ class xr {
|
|
|
3232
3301
|
/** Подписка на user-state. Mirror'имся на broadcast'ы offscreen'а; initial
|
|
3233
3302
|
* snapshot отдаётся через microtask из локального cache (если есть) —
|
|
3234
3303
|
* ровно как в BillingClient.onUserChange. Возвращает функцию отписки. */
|
|
3235
|
-
onUserChange(e,
|
|
3304
|
+
onUserChange(e, r = {}) {
|
|
3236
3305
|
this.userListeners.add(e);
|
|
3237
|
-
const n =
|
|
3306
|
+
const n = r.immediate ?? "microtask";
|
|
3238
3307
|
if (this.cachedUser && n !== "none") {
|
|
3239
3308
|
const i = this.cachedUser;
|
|
3240
3309
|
if (n === "sync")
|
|
@@ -3264,9 +3333,9 @@ class xr {
|
|
|
3264
3333
|
getCachedBalances() {
|
|
3265
3334
|
return this.cachedBalances;
|
|
3266
3335
|
}
|
|
3267
|
-
onBalanceChange(e,
|
|
3336
|
+
onBalanceChange(e, r = {}) {
|
|
3268
3337
|
this.balanceListeners.add(e);
|
|
3269
|
-
const n =
|
|
3338
|
+
const n = r.immediate ?? "microtask";
|
|
3270
3339
|
if (this.cachedBalances && n !== "none") {
|
|
3271
3340
|
const i = this.cachedBalances;
|
|
3272
3341
|
if (n === "sync")
|
|
@@ -3286,8 +3355,8 @@ class xr {
|
|
|
3286
3355
|
}
|
|
3287
3356
|
// === Checkout ===
|
|
3288
3357
|
async createCheckout(e) {
|
|
3289
|
-
const { signal:
|
|
3290
|
-
return this.transport.request("billing.createCheckout", n, { signal:
|
|
3358
|
+
const { signal: r, ...n } = e;
|
|
3359
|
+
return this.transport.request("billing.createCheckout", n, { signal: r });
|
|
3291
3360
|
}
|
|
3292
3361
|
// === Customer portal: list/cancel purchases ===
|
|
3293
3362
|
/** Rich-shape список покупок юзера (с ценой, валютой, interval, discount,
|
|
@@ -3310,8 +3379,8 @@ class xr {
|
|
|
3310
3379
|
* периода (юзер сохраняет access до renewal date'ы). reason обязательна
|
|
3311
3380
|
* (валидируется бэком) — собирается через select причин в host-UI. */
|
|
3312
3381
|
async cancelSubscription(e) {
|
|
3313
|
-
const { signal:
|
|
3314
|
-
return this.transport.request("billing.cancelSubscription", n, { signal:
|
|
3382
|
+
const { signal: r, ...n } = e;
|
|
3383
|
+
return this.transport.request("billing.cancelSubscription", n, { signal: r });
|
|
3315
3384
|
}
|
|
3316
3385
|
// === Storage ===
|
|
3317
3386
|
/** PaywallUI просит storage у billing-клиента для TrialStore и других
|
|
@@ -3326,7 +3395,7 @@ class xr {
|
|
|
3326
3395
|
* read-modify-write. PaywallUI duck-types этот метод и предпочитает его
|
|
3327
3396
|
* локальной фабрике, если он есть. */
|
|
3328
3397
|
createTrialStore(e) {
|
|
3329
|
-
return new
|
|
3398
|
+
return new vr(this.transport, this.paywallId, e);
|
|
3330
3399
|
}
|
|
3331
3400
|
// === Identity ===
|
|
3332
3401
|
getIdentity() {
|
|
@@ -3347,9 +3416,9 @@ class xr {
|
|
|
3347
3416
|
}
|
|
3348
3417
|
applyBootstrap(e) {
|
|
3349
3418
|
this.cachedBootstrap = e;
|
|
3350
|
-
for (const
|
|
3419
|
+
for (const r of [...this.bootstrapListeners])
|
|
3351
3420
|
try {
|
|
3352
|
-
|
|
3421
|
+
r(e);
|
|
3353
3422
|
} catch (n) {
|
|
3354
3423
|
console.warn("[paywall] onBootstrapChange listener threw", n);
|
|
3355
3424
|
}
|
|
@@ -3359,41 +3428,41 @@ class xr {
|
|
|
3359
3428
|
* broadcast'ов от offscreen — чтобы host'овский onUserChange handler
|
|
3360
3429
|
* получил signal независимо от того, кто триггернул обновление. */
|
|
3361
3430
|
applyUser(e) {
|
|
3362
|
-
|
|
3431
|
+
Sr(this.cachedUser, e) || (this.cachedUser = e, this.fireUserListeners(e));
|
|
3363
3432
|
}
|
|
3364
3433
|
applyBalances(e) {
|
|
3365
|
-
|
|
3434
|
+
Cr(this.cachedBalances, e) || (this.cachedBalances = e, this.fireBalanceListeners(e));
|
|
3366
3435
|
}
|
|
3367
3436
|
fireUserListeners(e) {
|
|
3368
|
-
for (const
|
|
3437
|
+
for (const r of [...this.userListeners])
|
|
3369
3438
|
try {
|
|
3370
|
-
|
|
3439
|
+
r(e);
|
|
3371
3440
|
} catch (n) {
|
|
3372
3441
|
console.warn("[paywall] onUserChange listener threw", n);
|
|
3373
3442
|
}
|
|
3374
3443
|
}
|
|
3375
3444
|
fireBalanceListeners(e) {
|
|
3376
|
-
for (const
|
|
3445
|
+
for (const r of [...this.balanceListeners])
|
|
3377
3446
|
try {
|
|
3378
|
-
|
|
3447
|
+
r(e);
|
|
3379
3448
|
} catch (n) {
|
|
3380
3449
|
console.warn("[paywall] onBalanceChange listener threw", n);
|
|
3381
3450
|
}
|
|
3382
3451
|
}
|
|
3383
3452
|
}
|
|
3384
|
-
function
|
|
3385
|
-
return
|
|
3453
|
+
function Sr(t, e) {
|
|
3454
|
+
return t === e ? !0 : !t || !e ? !1 : t.has_active_subscription === e.has_active_subscription && (t.purchases?.length ?? 0) === (e.purchases?.length ?? 0);
|
|
3386
3455
|
}
|
|
3387
|
-
function
|
|
3388
|
-
if (
|
|
3389
|
-
if (!
|
|
3390
|
-
for (let
|
|
3391
|
-
if (r
|
|
3456
|
+
function Cr(t, e) {
|
|
3457
|
+
if (t === e) return !0;
|
|
3458
|
+
if (!t || !e || t.length !== e.length) return !1;
|
|
3459
|
+
for (let r = 0; r < t.length; r++)
|
|
3460
|
+
if (t[r].type !== e[r].type || t[r].count !== e[r].count) return !1;
|
|
3392
3461
|
return !0;
|
|
3393
3462
|
}
|
|
3394
|
-
class
|
|
3395
|
-
constructor(e,
|
|
3396
|
-
this.transport = e, this.session = null, this.listeners = /* @__PURE__ */ new Set(), this.unsubBroadcast = null, this.paywallId =
|
|
3463
|
+
class Ir {
|
|
3464
|
+
constructor(e, r) {
|
|
3465
|
+
this.transport = e, this.session = null, this.listeners = /* @__PURE__ */ new Set(), this.unsubBroadcast = null, this.paywallId = r.paywallId, this.apiOrigin = r.apiOrigin, this.unsubBroadcast = this.transport.on("authChange", ({ event: n, session: i }) => {
|
|
3397
3466
|
this.applySession(n, i);
|
|
3398
3467
|
}), this.hydrated = this.transport.request("auth.getCachedSession", void 0).then((n) => {
|
|
3399
3468
|
this.session === null && n !== null && (this.session = n);
|
|
@@ -3416,8 +3485,8 @@ class kr {
|
|
|
3416
3485
|
if (this.listeners.has(e))
|
|
3417
3486
|
try {
|
|
3418
3487
|
e("INITIAL_SESSION", this.session);
|
|
3419
|
-
} catch (
|
|
3420
|
-
console.warn("[paywall] onAuthChange INITIAL_SESSION threw",
|
|
3488
|
+
} catch (r) {
|
|
3489
|
+
console.warn("[paywall] onAuthChange INITIAL_SESSION threw", r);
|
|
3421
3490
|
}
|
|
3422
3491
|
}), () => {
|
|
3423
3492
|
this.listeners.delete(e);
|
|
@@ -3425,12 +3494,12 @@ class kr {
|
|
|
3425
3494
|
}
|
|
3426
3495
|
// === Email/password ===
|
|
3427
3496
|
async signInWithEmail(e) {
|
|
3428
|
-
const
|
|
3429
|
-
return this.applySession("SIGNED_IN",
|
|
3497
|
+
const r = await this.transport.request("auth.signInWithEmail", e);
|
|
3498
|
+
return this.applySession("SIGNED_IN", r), r;
|
|
3430
3499
|
}
|
|
3431
3500
|
async signUp(e) {
|
|
3432
|
-
const
|
|
3433
|
-
return
|
|
3501
|
+
const r = await this.transport.request("auth.signUp", e);
|
|
3502
|
+
return r.kind === "signed_in" && this.applySession("SIGNED_IN", r.session), r;
|
|
3434
3503
|
}
|
|
3435
3504
|
async signOut() {
|
|
3436
3505
|
await this.transport.request("auth.signOut", void 0);
|
|
@@ -3444,8 +3513,8 @@ class kr {
|
|
|
3444
3513
|
await this.transport.request("auth.sendOtp", e);
|
|
3445
3514
|
}
|
|
3446
3515
|
async verifyOtp(e) {
|
|
3447
|
-
const
|
|
3448
|
-
return this.applySession(e.type === "recovery" ? "PASSWORD_RECOVERY" : "SIGNED_IN",
|
|
3516
|
+
const r = await this.transport.request("auth.verifyOtp", e);
|
|
3517
|
+
return this.applySession(e.type === "recovery" ? "PASSWORD_RECOVERY" : "SIGNED_IN", r), r;
|
|
3449
3518
|
}
|
|
3450
3519
|
async resendConfirmation(e) {
|
|
3451
3520
|
await this.transport.request("auth.resendConfirmation", e);
|
|
@@ -3471,12 +3540,12 @@ class kr {
|
|
|
3471
3540
|
* offscreen-AuthClient'е — content только проксирует. captchaToken и
|
|
3472
3541
|
* forceNewAnon — pass-through для forward-compat / switch-account flow. */
|
|
3473
3542
|
async signInAnonymously(e = {}) {
|
|
3474
|
-
const
|
|
3543
|
+
const r = await this.transport.request("auth.signInAnonymously", {
|
|
3475
3544
|
captchaToken: e.captchaToken,
|
|
3476
3545
|
userMeta: e.userMeta,
|
|
3477
3546
|
forceNewAnon: e.forceNewAnon
|
|
3478
3547
|
});
|
|
3479
|
-
return this.applySession("SIGNED_IN",
|
|
3548
|
+
return this.applySession("SIGNED_IN", r), r;
|
|
3480
3549
|
}
|
|
3481
3550
|
/** Текущий access token (lazy-refreshable в offscreen'е). content/popup
|
|
3482
3551
|
* использует для Bearer'а в внешние fetch'и — ApiGatewayClient в
|
|
@@ -3503,13 +3572,13 @@ class kr {
|
|
|
3503
3572
|
async signInWithOAuth(e) {
|
|
3504
3573
|
if (typeof window > "u")
|
|
3505
3574
|
throw new T("oauth_unavailable", "window is required for OAuth");
|
|
3506
|
-
const
|
|
3575
|
+
const r = `pw-oauth-pending-${Math.random().toString(36).slice(2, 10)}`, n = window.open("about:blank", r, "width=480,height=640,popup=yes");
|
|
3507
3576
|
if (!n)
|
|
3508
3577
|
throw new T(
|
|
3509
3578
|
"popup_blocked",
|
|
3510
3579
|
"browser blocked auth popup — call from a user gesture"
|
|
3511
3580
|
);
|
|
3512
|
-
|
|
3581
|
+
Mr(n, e.provider);
|
|
3513
3582
|
try {
|
|
3514
3583
|
const { authorizeUrl: i, state: s } = await this.transport.request("auth.oauthStart", {
|
|
3515
3584
|
provider: e.provider,
|
|
@@ -3517,7 +3586,7 @@ class kr {
|
|
|
3517
3586
|
userMeta: e.userMeta
|
|
3518
3587
|
});
|
|
3519
3588
|
n.name = `pw-oauth-${s}`, n.location.replace(i), e.onPopupOpened?.();
|
|
3520
|
-
const a = await
|
|
3589
|
+
const a = await ze(n, s), c = await this.transport.request("auth.oauthExchange", { state: s, code: a });
|
|
3521
3590
|
return this.applySession("SIGNED_IN", c), c;
|
|
3522
3591
|
} catch (i) {
|
|
3523
3592
|
try {
|
|
@@ -3530,32 +3599,32 @@ class kr {
|
|
|
3530
3599
|
destroy() {
|
|
3531
3600
|
this.unsubBroadcast?.(), this.unsubBroadcast = null, this.listeners.clear(), this.session = null;
|
|
3532
3601
|
}
|
|
3533
|
-
applySession(e,
|
|
3534
|
-
if (!
|
|
3535
|
-
this.session =
|
|
3602
|
+
applySession(e, r) {
|
|
3603
|
+
if (!Ar(this.session, r)) {
|
|
3604
|
+
this.session = r;
|
|
3536
3605
|
for (const n of [...this.listeners])
|
|
3537
3606
|
try {
|
|
3538
|
-
n(e,
|
|
3607
|
+
n(e, r);
|
|
3539
3608
|
} catch (i) {
|
|
3540
3609
|
console.warn("[paywall] onAuthChange listener threw", i);
|
|
3541
3610
|
}
|
|
3542
3611
|
}
|
|
3543
3612
|
}
|
|
3544
3613
|
}
|
|
3545
|
-
function
|
|
3546
|
-
return
|
|
3614
|
+
function Ar(t, e) {
|
|
3615
|
+
return t === e ? !0 : !t || !e ? !1 : t.access_token === e.access_token && t.refresh_token === e.refresh_token && t.expires_at === e.expires_at && t.user.id === e.user.id;
|
|
3547
3616
|
}
|
|
3548
|
-
const
|
|
3617
|
+
const Lr = {
|
|
3549
3618
|
google: "Google",
|
|
3550
3619
|
apple: "Apple",
|
|
3551
3620
|
github: "GitHub",
|
|
3552
3621
|
facebook: "Facebook"
|
|
3553
3622
|
};
|
|
3554
|
-
function
|
|
3555
|
-
const
|
|
3623
|
+
function Mr(t, e) {
|
|
3624
|
+
const r = Lr[e] ?? e;
|
|
3556
3625
|
try {
|
|
3557
|
-
const n =
|
|
3558
|
-
n.title = `Sign in with ${
|
|
3626
|
+
const n = t.document;
|
|
3627
|
+
n.title = `Sign in with ${r}`;
|
|
3559
3628
|
const i = n.createElement("style");
|
|
3560
3629
|
i.textContent = "html,body{margin:0;padding:0;height:100%;font-family:-apple-system,system-ui,sans-serif;background:#fafafa;color:#475569}.pw-oauth-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px}.pw-oauth-spinner{width:36px;height:36px;border:3px solid #e2e8f0;border-top-color:#7c3aed;border-radius:50%;animation:pw-oauth-spin 800ms linear infinite}.pw-oauth-label{font-size:14px;font-weight:500;letter-spacing:-0.01em}@keyframes pw-oauth-spin{to{transform:rotate(360deg)}}", n.head.appendChild(i);
|
|
3561
3630
|
const s = n.createElement("div");
|
|
@@ -3563,23 +3632,23 @@ function Sr(r, e) {
|
|
|
3563
3632
|
const a = n.createElement("div");
|
|
3564
3633
|
a.className = "pw-oauth-spinner";
|
|
3565
3634
|
const c = n.createElement("div");
|
|
3566
|
-
c.className = "pw-oauth-label", c.textContent = `Connecting to ${
|
|
3635
|
+
c.className = "pw-oauth-label", c.textContent = `Connecting to ${r}…`, s.appendChild(a), s.appendChild(c), n.body.appendChild(s);
|
|
3567
3636
|
} catch {
|
|
3568
3637
|
}
|
|
3569
3638
|
}
|
|
3570
|
-
class
|
|
3639
|
+
class Er {
|
|
3571
3640
|
constructor(e) {
|
|
3572
3641
|
this.transport = e;
|
|
3573
3642
|
}
|
|
3574
3643
|
/** Отправить событие. Fire-and-forget — не возвращает Promise, не throw'ает.
|
|
3575
3644
|
* Сетевые/транспортные ошибки логируются в console и не блокируют caller. */
|
|
3576
|
-
track(e,
|
|
3577
|
-
typeof e != "string" || e.length === 0 || this.transport.request("tracker.track", { name: e, props:
|
|
3645
|
+
track(e, r) {
|
|
3646
|
+
typeof e != "string" || e.length === 0 || this.transport.request("tracker.track", { name: e, props: r }).catch((n) => {
|
|
3578
3647
|
console.warn("[paywall] track failed", n);
|
|
3579
3648
|
});
|
|
3580
3649
|
}
|
|
3581
3650
|
}
|
|
3582
|
-
class
|
|
3651
|
+
class Pr {
|
|
3583
3652
|
constructor(e) {
|
|
3584
3653
|
this.factory = e, this.channel = null, this.channelDisposers = [], this.pending = /* @__PURE__ */ new Map(), this.listeners = /* @__PURE__ */ new Map(), this.destroyed = !1, this.nextId = 0, this.clientId = `c-${Math.random().toString(36).slice(2, 10)}`;
|
|
3585
3654
|
}
|
|
@@ -3591,8 +3660,8 @@ class Ir {
|
|
|
3591
3660
|
if (this.channel) return this.channel;
|
|
3592
3661
|
const e = this.factory();
|
|
3593
3662
|
this.channel = e;
|
|
3594
|
-
const
|
|
3595
|
-
return this.channelDisposers = [
|
|
3663
|
+
const r = e.onMessage((i) => this.handleMessage(i)), n = e.onDisconnect(() => this.handleDisconnect());
|
|
3664
|
+
return this.channelDisposers = [r, n], this.request("handshake", {
|
|
3596
3665
|
protocolVersion: X,
|
|
3597
3666
|
clientId: this.clientId
|
|
3598
3667
|
}).then((i) => {
|
|
@@ -3603,17 +3672,17 @@ class Ir {
|
|
|
3603
3672
|
}), e;
|
|
3604
3673
|
}
|
|
3605
3674
|
handleMessage(e) {
|
|
3606
|
-
if (
|
|
3675
|
+
if (Br(e)) {
|
|
3607
3676
|
if (e.type === "response") {
|
|
3608
|
-
const
|
|
3609
|
-
if (!
|
|
3610
|
-
this.pending.delete(e.id),
|
|
3677
|
+
const r = this.pending.get(e.id);
|
|
3678
|
+
if (!r) return;
|
|
3679
|
+
this.pending.delete(e.id), r.signal?.removeEventListener("abort", r.abortListener), e.ok ? r.resolve(e.result) : r.reject(Ne(e.error));
|
|
3611
3680
|
return;
|
|
3612
3681
|
}
|
|
3613
3682
|
if (e.type === "event") {
|
|
3614
|
-
const
|
|
3615
|
-
if (!
|
|
3616
|
-
for (const n of [...
|
|
3683
|
+
const r = this.listeners.get(e.kind);
|
|
3684
|
+
if (!r) return;
|
|
3685
|
+
for (const n of [...r])
|
|
3617
3686
|
try {
|
|
3618
3687
|
n(e.payload);
|
|
3619
3688
|
} catch (i) {
|
|
@@ -3623,14 +3692,14 @@ class Ir {
|
|
|
3623
3692
|
}
|
|
3624
3693
|
}
|
|
3625
3694
|
handleDisconnect() {
|
|
3626
|
-
for (const
|
|
3695
|
+
for (const r of this.channelDisposers) r();
|
|
3627
3696
|
this.channelDisposers = [], this.channel = null;
|
|
3628
3697
|
const e = Array.from(this.pending.values());
|
|
3629
3698
|
this.pending.clear();
|
|
3630
|
-
for (const
|
|
3631
|
-
|
|
3699
|
+
for (const r of e)
|
|
3700
|
+
r.signal?.removeEventListener("abort", r.abortListener), r.reject(new Tr());
|
|
3632
3701
|
}
|
|
3633
|
-
request(e,
|
|
3702
|
+
request(e, r, n = {}) {
|
|
3634
3703
|
if (this.destroyed)
|
|
3635
3704
|
return Promise.reject(new Error("TransportClient destroyed"));
|
|
3636
3705
|
if (n.signal?.aborted)
|
|
@@ -3655,7 +3724,7 @@ class Ir {
|
|
|
3655
3724
|
type: "request",
|
|
3656
3725
|
id: s,
|
|
3657
3726
|
kind: e,
|
|
3658
|
-
params:
|
|
3727
|
+
params: r
|
|
3659
3728
|
};
|
|
3660
3729
|
try {
|
|
3661
3730
|
i.send(f);
|
|
@@ -3664,10 +3733,10 @@ class Ir {
|
|
|
3664
3733
|
}
|
|
3665
3734
|
});
|
|
3666
3735
|
}
|
|
3667
|
-
on(e,
|
|
3736
|
+
on(e, r) {
|
|
3668
3737
|
let n = this.listeners.get(e);
|
|
3669
3738
|
n || (n = /* @__PURE__ */ new Set(), this.listeners.set(e, n));
|
|
3670
|
-
const i =
|
|
3739
|
+
const i = r;
|
|
3671
3740
|
return n.add(i), this.ensureChannel(), () => {
|
|
3672
3741
|
n.delete(i);
|
|
3673
3742
|
};
|
|
@@ -3675,37 +3744,37 @@ class Ir {
|
|
|
3675
3744
|
destroy() {
|
|
3676
3745
|
if (this.destroyed) return;
|
|
3677
3746
|
this.destroyed = !0;
|
|
3678
|
-
for (const
|
|
3747
|
+
for (const r of this.channelDisposers) r();
|
|
3679
3748
|
this.channelDisposers = [], this.listeners.clear();
|
|
3680
3749
|
const e = Array.from(this.pending.values());
|
|
3681
3750
|
this.pending.clear();
|
|
3682
|
-
for (const
|
|
3683
|
-
|
|
3751
|
+
for (const r of e)
|
|
3752
|
+
r.signal?.removeEventListener("abort", r.abortListener), r.reject(new Error("TransportClient destroyed"));
|
|
3684
3753
|
this.channel?.close(), this.channel = null;
|
|
3685
3754
|
}
|
|
3686
3755
|
}
|
|
3687
|
-
class
|
|
3756
|
+
class Tr extends Error {
|
|
3688
3757
|
constructor() {
|
|
3689
3758
|
super("Transport channel disconnected mid-request"), this.code = "transport_disconnected", this.name = "TransportDisconnectedError";
|
|
3690
3759
|
}
|
|
3691
3760
|
}
|
|
3692
|
-
function
|
|
3693
|
-
if (typeof
|
|
3694
|
-
const e =
|
|
3761
|
+
function Br(t) {
|
|
3762
|
+
if (typeof t != "object" || t === null) return !1;
|
|
3763
|
+
const e = t.type;
|
|
3695
3764
|
return e === "request" || e === "response" || e === "event";
|
|
3696
3765
|
}
|
|
3697
3766
|
let W = null;
|
|
3698
|
-
function
|
|
3699
|
-
return W || (W = new
|
|
3767
|
+
function Or() {
|
|
3768
|
+
return W || (W = new Pr(() => qe(Ge)), W);
|
|
3700
3769
|
}
|
|
3701
|
-
class
|
|
3770
|
+
class qr extends gr {
|
|
3702
3771
|
constructor(e) {
|
|
3703
|
-
const
|
|
3772
|
+
const r = Or(), n = new _r(r, {
|
|
3704
3773
|
paywallId: e.paywallId,
|
|
3705
3774
|
apiOrigin: e.apiOrigin
|
|
3706
3775
|
});
|
|
3707
3776
|
let i;
|
|
3708
|
-
e.auth === !0 ? i = new
|
|
3777
|
+
e.auth === !0 ? i = new Ir(r, {
|
|
3709
3778
|
paywallId: e.paywallId,
|
|
3710
3779
|
apiOrigin: e.apiOrigin
|
|
3711
3780
|
}) : e.auth && console.warn(
|
|
@@ -3721,7 +3790,7 @@ class jr extends ur {
|
|
|
3721
3790
|
// Внутренний EventTracker отключаем — единственный tracker живёт в
|
|
3722
3791
|
// offscreen'е. Манчиально подписываемся ниже.
|
|
3723
3792
|
analytics: !1
|
|
3724
|
-
}), this.remoteTracker = null, this.trackerUnsubs = [], e.analytics !== !1 && (this.remoteTracker = new
|
|
3793
|
+
}), this.remoteTracker = null, this.trackerUnsubs = [], e.analytics !== !1 && (this.remoteTracker = new Er(r), this.bindAnalytics());
|
|
3725
3794
|
}
|
|
3726
3795
|
/** Зеркало sdk/PaywallUI.initTracker'овских биндингов, но с RemoteEventTracker.
|
|
3727
3796
|
* Когда @monetize.software/sdk экспоузнет публичный hook для inject'а tracker'а,
|
|
@@ -3732,46 +3801,46 @@ class jr extends ur {
|
|
|
3732
3801
|
this.on("open", () => e.track("paywall_opened")),
|
|
3733
3802
|
this.on(
|
|
3734
3803
|
"ready",
|
|
3735
|
-
(
|
|
3736
|
-
is_test_mode:
|
|
3737
|
-
prices_count:
|
|
3738
|
-
offers_count:
|
|
3804
|
+
(r) => e.track("paywall_viewed", {
|
|
3805
|
+
is_test_mode: r.settings.is_test_mode,
|
|
3806
|
+
prices_count: r.prices.length,
|
|
3807
|
+
offers_count: r.offers.length
|
|
3739
3808
|
})
|
|
3740
3809
|
),
|
|
3741
3810
|
this.on(
|
|
3742
3811
|
"price_selected",
|
|
3743
|
-
(
|
|
3812
|
+
(r) => e.track("price_selected", { price_id: r.priceId })
|
|
3744
3813
|
),
|
|
3745
3814
|
this.on(
|
|
3746
3815
|
"checkout_started",
|
|
3747
|
-
(
|
|
3816
|
+
(r) => e.track("checkout_started", { price_id: r.priceId, acquiring: r.acquiring })
|
|
3748
3817
|
),
|
|
3749
3818
|
this.on(
|
|
3750
3819
|
"purchase_completed",
|
|
3751
|
-
(
|
|
3820
|
+
(r) => e.track("purchase_completed", { price_id: r.priceId, session_id: r.sessionId })
|
|
3752
3821
|
),
|
|
3753
|
-
this.on("purchase_failed", (
|
|
3822
|
+
this.on("purchase_failed", (r) => e.track("purchase_failed", { reason: r.reason })),
|
|
3754
3823
|
this.on("close", () => e.track("paywall_closed")),
|
|
3755
3824
|
this.on(
|
|
3756
3825
|
"trial_blocked",
|
|
3757
|
-
(
|
|
3758
|
-
mode:
|
|
3759
|
-
...
|
|
3826
|
+
(r) => e.track("trial_blocked", {
|
|
3827
|
+
mode: r.mode,
|
|
3828
|
+
...r.mode === "time" ? { remaining_ms: r.remainingMs, total_ms: r.totalMs } : r.mode === "opens" ? { remaining_actions: r.remainingActions, total_actions: r.totalActions } : {}
|
|
3760
3829
|
})
|
|
3761
3830
|
),
|
|
3762
3831
|
this.on("trial_expired", () => e.track("trial_expired")),
|
|
3763
3832
|
this.on(
|
|
3764
3833
|
"visibility_blocked",
|
|
3765
|
-
(
|
|
3834
|
+
(r) => e.track("visibility_blocked", { reason: r.reason, country: r.country, tier: r.tier })
|
|
3766
3835
|
),
|
|
3767
|
-
this.on("error", (
|
|
3836
|
+
this.on("error", (r) => e.track("error", { code: r.code, message: r.message }))
|
|
3768
3837
|
);
|
|
3769
3838
|
}
|
|
3770
3839
|
/** Прокси через RemoteEventTracker. Hosts могут вызывать paywall.track
|
|
3771
3840
|
* для произвольных аналитических событий — летит в единственный
|
|
3772
3841
|
* offscreen-tracker наряду с auto-emit'ами PaywallUI. */
|
|
3773
|
-
track(e,
|
|
3774
|
-
this.remoteTracker?.track(e,
|
|
3842
|
+
track(e, r) {
|
|
3843
|
+
this.remoteTracker?.track(e, r);
|
|
3775
3844
|
}
|
|
3776
3845
|
destroy() {
|
|
3777
3846
|
for (const e of this.trackerUnsubs) e();
|
|
@@ -3780,10 +3849,10 @@ class jr extends ur {
|
|
|
3780
3849
|
}
|
|
3781
3850
|
export {
|
|
3782
3851
|
X as PROTOCOL_VERSION,
|
|
3783
|
-
|
|
3784
|
-
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3852
|
+
qr as PaywallUI,
|
|
3853
|
+
Ir as RemoteAuthClient,
|
|
3854
|
+
_r as RemoteBillingClient,
|
|
3855
|
+
Er as RemoteEventTracker,
|
|
3856
|
+
Or as getContentTransport
|
|
3788
3857
|
};
|
|
3789
3858
|
//# sourceMappingURL=content.js.map
|