@hopeplayer/core 1.5.0 → 1.7.0
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/HopePlayerElement.d.ts +47 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/adTriggers-DVqgm92F.js +420 -0
- package/dist/chunks/adTriggers-DVqgm92F.js.map +1 -0
- package/dist/chunks/{ads-C4tDPsUs.js → ads-eSKyiH1o.js} +2 -2
- package/dist/chunks/{ads-C4tDPsUs.js.map → ads-eSKyiH1o.js.map} +1 -1
- package/dist/chunks/audioDescription-cpprKeB-.js +146 -0
- package/dist/chunks/audioDescription-cpprKeB-.js.map +1 -0
- package/dist/chunks/{cast-Baxvu76A.js → cast-DEowHmqA.js} +29 -28
- package/dist/chunks/{cast-Baxvu76A.js.map → cast-DEowHmqA.js.map} +1 -1
- package/dist/chunks/docPip-Bh6BWPk-.js +92 -0
- package/dist/chunks/docPip-Bh6BWPk-.js.map +1 -0
- package/dist/chunks/heatmap-Bz_EMQFk.js +117 -0
- package/dist/chunks/heatmap-Bz_EMQFk.js.map +1 -0
- package/dist/chunks/{history-CvydU0aN.js → history-ZSdDDsRF.js} +35 -34
- package/dist/chunks/{history-CvydU0aN.js.map → history-ZSdDDsRF.js.map} +1 -1
- package/dist/chunks/interactive-ClJC5Vyo.js +213 -0
- package/dist/chunks/interactive-ClJC5Vyo.js.map +1 -0
- package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
- package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
- package/dist/chunks/{markers-Dr4-CCxE.js → markers-D32rI-x-.js} +53 -51
- package/dist/chunks/markers-D32rI-x-.js.map +1 -0
- package/dist/chunks/multiview-CL1WfJKt.js +295 -0
- package/dist/chunks/multiview-CL1WfJKt.js.map +1 -0
- package/dist/chunks/{pauseAd-BQQe21X4.js → pauseAd-DF7KGwUs.js} +32 -31
- package/dist/chunks/{pauseAd-BQQe21X4.js.map → pauseAd-DF7KGwUs.js.map} +1 -1
- package/dist/chunks/{player-DV4Hf5Cw.js → player-B7mYS--8.js} +1580 -1284
- package/dist/chunks/player-B7mYS--8.js.map +1 -0
- package/dist/chunks/{playlist-DJsdK6xm.js → playlist-BkhIOfCy.js} +2 -2
- package/dist/chunks/{playlist-DJsdK6xm.js.map → playlist-BkhIOfCy.js.map} +1 -1
- package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
- package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
- package/dist/chunks/{pluginHost-GxNfyP5E.js → pluginHost-CXqkjNV1.js} +2 -2
- package/dist/chunks/{pluginHost-GxNfyP5E.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
- package/dist/chunks/redirectScreen-DgmjFVJH.js +251 -0
- package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
- package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
- package/dist/chunks/{rewardedUnlock-jFOdzfSq.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
- package/dist/chunks/segments-CuQQEIAX.js +66 -0
- package/dist/chunks/segments-CuQQEIAX.js.map +1 -0
- package/dist/chunks/share-BdqQ8sGE.js +216 -0
- package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
- package/dist/chunks/{skipSegments-vJMhdiJn.js → skipSegments-BbepQ4Y6.js} +2 -2
- package/dist/chunks/{skipSegments-vJMhdiJn.js.map → skipSegments-BbepQ4Y6.js.map} +1 -1
- package/dist/chunks/sponsorship-DoAZBbHE.js +241 -0
- package/dist/chunks/{sponsorship-BT21uwN5.js.map → sponsorship-DoAZBbHE.js.map} +1 -1
- package/dist/chunks/{spriteThumbnails-BoxVY--_.js → spriteThumbnails-BYg-DHx4.js} +28 -28
- package/dist/chunks/spriteThumbnails-BYg-DHx4.js.map +1 -0
- package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
- package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
- package/dist/chunks/{story-BRkhSDhR.js → story-DcBG6jUg.js} +2 -2
- package/dist/chunks/{story-BRkhSDhR.js.map → story-DcBG6jUg.js.map} +1 -1
- package/dist/chunks/transcript-CHPQ6S6E.js +206 -0
- package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
- package/dist/controls/ContextMenu.d.ts +1 -0
- package/dist/controls/ContextMenu.d.ts.map +1 -1
- package/dist/controls/ControlBar.d.ts +6 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts +5 -2
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +2 -1
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/hls/SourceManager.d.ts +2 -0
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hope-player.js +3 -3
- package/dist/i18n/index.d.ts +9 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/locales/en.d.ts +2 -2
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts +2 -2
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +52 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
- package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
- package/dist/plugins/ad-triggers/index.d.ts.map +1 -1
- package/dist/plugins/audio-description/AudioDescription.d.ts +52 -0
- package/dist/plugins/audio-description/AudioDescription.d.ts.map +1 -0
- package/dist/plugins/audio-description/index.d.ts +6 -0
- package/dist/plugins/audio-description/index.d.ts.map +1 -0
- package/dist/plugins/audio-description/strings.d.ts +8 -0
- package/dist/plugins/audio-description/strings.d.ts.map +1 -0
- package/dist/plugins/cast/index.d.ts.map +1 -1
- package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
- package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
- package/dist/plugins/doc-pip/index.d.ts +5 -0
- package/dist/plugins/doc-pip/index.d.ts.map +1 -0
- package/dist/plugins/doc-pip/strings.d.ts +8 -0
- package/dist/plugins/doc-pip/strings.d.ts.map +1 -0
- package/dist/plugins/heatmap/Heatmap.d.ts +44 -0
- package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
- package/dist/plugins/heatmap/index.d.ts +6 -0
- package/dist/plugins/heatmap/index.d.ts.map +1 -0
- package/dist/plugins/heatmap/strings.d.ts +8 -0
- package/dist/plugins/heatmap/strings.d.ts.map +1 -0
- package/dist/plugins/history/index.d.ts.map +1 -1
- package/dist/plugins/interactive/Interactive.d.ts +45 -0
- package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
- package/dist/plugins/interactive/index.d.ts +6 -0
- package/dist/plugins/interactive/index.d.ts.map +1 -0
- package/dist/plugins/interactive/strings.d.ts +8 -0
- package/dist/plugins/interactive/strings.d.ts.map +1 -0
- package/dist/plugins/markers/MarkProgress.d.ts +3 -1
- package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
- package/dist/plugins/multiview/Multiview.d.ts +92 -0
- package/dist/plugins/multiview/Multiview.d.ts.map +1 -0
- package/dist/plugins/multiview/index.d.ts +6 -0
- package/dist/plugins/multiview/index.d.ts.map +1 -0
- package/dist/plugins/multiview/strings.d.ts +8 -0
- package/dist/plugins/multiview/strings.d.ts.map +1 -0
- package/dist/plugins/pause-ad/index.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
- package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/index.d.ts.map +1 -1
- package/dist/plugins/redirect-screen/strings.d.ts +8 -0
- package/dist/plugins/redirect-screen/strings.d.ts.map +1 -0
- package/dist/plugins/rewarded/index.d.ts.map +1 -1
- package/dist/plugins/segments/Segments.d.ts +1 -0
- package/dist/plugins/segments/Segments.d.ts.map +1 -1
- package/dist/plugins/share/Share.d.ts +45 -0
- package/dist/plugins/share/Share.d.ts.map +1 -0
- package/dist/plugins/share/index.d.ts +6 -0
- package/dist/plugins/share/index.d.ts.map +1 -0
- package/dist/plugins/share/strings.d.ts +8 -0
- package/dist/plugins/share/strings.d.ts.map +1 -0
- package/dist/plugins/skip-segments/index.d.ts.map +1 -1
- package/dist/plugins/sponsorship/index.d.ts.map +1 -1
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +1 -0
- package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
- package/dist/plugins/sticky/StickyManager.d.ts +2 -0
- package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
- package/dist/plugins/transcript/Transcript.d.ts +65 -0
- package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
- package/dist/plugins/transcript/index.d.ts +6 -0
- package/dist/plugins/transcript/index.d.ts.map +1 -0
- package/dist/plugins/transcript/strings.d.ts +8 -0
- package/dist/plugins/transcript/strings.d.ts.map +1 -0
- package/dist/subtitles/attachTracks.d.ts +6 -0
- package/dist/subtitles/attachTracks.d.ts.map +1 -1
- package/dist/types/index.d.ts +257 -12
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/plugin-style.d.ts +5 -0
- package/dist/utils/plugin-style.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
- package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
- package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
- package/dist/chunks/markers-Dr4-CCxE.js.map +0 -1
- package/dist/chunks/player-DV4Hf5Cw.js.map +0 -1
- package/dist/chunks/redirectScreen-BT_26-5g.js +0 -208
- package/dist/chunks/redirectScreen-BT_26-5g.js.map +0 -1
- package/dist/chunks/rewardedUnlock-jFOdzfSq.js +0 -264
- package/dist/chunks/segments--hl_QVrI.js +0 -63
- package/dist/chunks/segments--hl_QVrI.js.map +0 -1
- package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
- package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +0 -1
- package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
var w = Object.defineProperty;
|
|
2
|
-
var N = (o, e, t) => e in o ? w(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
|
|
3
|
-
var l = (o, e, t) => N(o, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import { c as f } from "./player-DV4Hf5Cw.js";
|
|
5
|
-
const b = "http://www.w3.org/2000/svg", C = 18, g = 2 * Math.PI * C, A = 10;
|
|
6
|
-
function y(o) {
|
|
7
|
-
const e = document.createElementNS(b, "svg");
|
|
8
|
-
e.setAttribute("viewBox", "0 0 40 40"), e.setAttribute("aria-hidden", "true"), e.setAttribute("class", o);
|
|
9
|
-
const t = document.createElementNS(b, "circle"), i = document.createElementNS(b, "circle");
|
|
10
|
-
for (const n of [t, i])
|
|
11
|
-
n.setAttribute("cx", "20"), n.setAttribute("cy", "20"), n.setAttribute("r", String(C));
|
|
12
|
-
return t.setAttribute("class", "hp-redirect-ring-track"), i.setAttribute("class", "hp-redirect-ring-bar"), i.setAttribute("stroke-dasharray", String(g)), e.append(t, i), {
|
|
13
|
-
el: e,
|
|
14
|
-
set: (n) => i.setAttribute("stroke-dashoffset", String(g * (1 - Math.min(1, Math.max(0, n)))))
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function E(o, e, t) {
|
|
18
|
-
const i = document.createElement("span");
|
|
19
|
-
if (i.className = t, o) {
|
|
20
|
-
const s = document.createElement("img");
|
|
21
|
-
s.src = o, s.alt = "", s.decoding = "async", s.addEventListener("error", () => s.remove()), i.appendChild(s);
|
|
22
|
-
}
|
|
23
|
-
const n = y("hp-redirect-ring"), r = document.createElement("span");
|
|
24
|
-
if (r.className = "hp-redirect-play", r.appendChild(f("play")), i.append(n.el, r), e) {
|
|
25
|
-
const s = document.createElement("span");
|
|
26
|
-
s.className = "hp-redirect-duration", s.textContent = e, i.appendChild(s);
|
|
27
|
-
}
|
|
28
|
-
return { el: i, ring: n };
|
|
29
|
-
}
|
|
30
|
-
class L {
|
|
31
|
-
constructor(e, t) {
|
|
32
|
-
l(this, "counterTimer", null);
|
|
33
|
-
l(this, "wrapper", null);
|
|
34
|
-
l(this, "card", null);
|
|
35
|
-
l(this, "cardRing", null);
|
|
36
|
-
l(this, "cardLabel", null);
|
|
37
|
-
l(this, "cancelled", !1);
|
|
38
|
-
l(this, "waitingForAd", !1);
|
|
39
|
-
l(this, "mode");
|
|
40
|
-
l(this, "onPlay", () => {
|
|
41
|
-
this.remove();
|
|
42
|
-
});
|
|
43
|
-
l(this, "onEnded", () => {
|
|
44
|
-
if (this.ctx.isAdActive()) {
|
|
45
|
-
this.waitForAd();
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
this.finish();
|
|
49
|
-
});
|
|
50
|
-
l(this, "onAdEnd", () => {
|
|
51
|
-
this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.waitingForAd = !1, this.ctx.videoEl.ended && this.finish();
|
|
52
|
-
});
|
|
53
|
-
// ── 'card' modu ─────────────────────────────────────────────────────────
|
|
54
|
-
l(this, "onTimeUpdate", () => {
|
|
55
|
-
var s;
|
|
56
|
-
const e = this.ctx.videoEl, t = Math.max(1, this.options.showBefore ?? A), i = e.duration;
|
|
57
|
-
if (!Number.isFinite(i) || i <= 0) return;
|
|
58
|
-
const n = i - e.currentTime;
|
|
59
|
-
if (n > t) {
|
|
60
|
-
n > t + 1 && (this.cancelled = !1), this.hideCard();
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
if (this.cancelled || this.ctx.isAdActive() || e.ended || n <= 0) {
|
|
64
|
-
this.ctx.isAdActive() && this.hideCard();
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
this.card || this.showCard();
|
|
68
|
-
const r = Math.ceil(n);
|
|
69
|
-
(s = this.cardRing) == null || s.set(n / t), this.cardLabel && (this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${r}`);
|
|
70
|
-
});
|
|
71
|
-
this.ctx = e, this.options = t, this.mode = t.mode === "card" ? "card" : "screen", t.enabled !== !1 && (e.videoEl.addEventListener("ended", this.onEnded), e.videoEl.addEventListener("play", this.onPlay), this.mode === "card" && e.videoEl.addEventListener("timeupdate", this.onTimeUpdate));
|
|
72
|
-
}
|
|
73
|
-
/** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */
|
|
74
|
-
refreshLabels() {
|
|
75
|
-
var e, t;
|
|
76
|
-
(t = (e = this.card) == null ? void 0 : e.querySelector(".hp-redirect-close")) == null || t.setAttribute("aria-label", this.ctx.i18n.redirectCancelCard);
|
|
77
|
-
}
|
|
78
|
-
destroy() {
|
|
79
|
-
const e = this.ctx.videoEl;
|
|
80
|
-
e.removeEventListener("ended", this.onEnded), e.removeEventListener("play", this.onPlay), e.removeEventListener("timeupdate", this.onTimeUpdate), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.remove(), this.hideCard();
|
|
81
|
-
}
|
|
82
|
-
emit(e, t) {
|
|
83
|
-
return this.ctx.hostEl.dispatchEvent(
|
|
84
|
-
new CustomEvent("hp:redirect", { detail: { state: e, url: this.options.url, mode: this.mode, reason: t }, cancelable: e === "redirect" })
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
go(e) {
|
|
88
|
-
this.remove(), this.hideCard(), this.emit("redirect", e) && (this.options.newTab ? window.open(this.options.url, "_blank", "noopener") : window.location.href = this.options.url);
|
|
89
|
-
}
|
|
90
|
-
waitForAd() {
|
|
91
|
-
this.waitingForAd || (this.waitingForAd = !0, this.ctx.hostEl.addEventListener("hp:adend", this.onAdEnd));
|
|
92
|
-
}
|
|
93
|
-
finish() {
|
|
94
|
-
var e;
|
|
95
|
-
if (this.mode === "card") {
|
|
96
|
-
this.hideCard(), this.cancelled ? (e = this.options.suggestions) != null && e.length && this.showSuggestions(this.options.suggestions) : this.go("auto");
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
this.createScreen();
|
|
100
|
-
}
|
|
101
|
-
showCard() {
|
|
102
|
-
const e = this.options, t = document.createElement("div");
|
|
103
|
-
t.className = "hp-redirect-card", t.setAttribute("part", "redirect-card"), t.setAttribute("data-position", e.position ?? "bottom-right");
|
|
104
|
-
const i = document.createElement("button");
|
|
105
|
-
i.type = "button", i.className = "hp-redirect-card-main", i.addEventListener("click", () => this.go("click"));
|
|
106
|
-
const n = E(e.image, e.duration, "hp-redirect-thumb"), r = document.createElement("span");
|
|
107
|
-
r.className = "hp-redirect-text";
|
|
108
|
-
const s = document.createElement("span");
|
|
109
|
-
if (s.className = "hp-redirect-label", r.appendChild(s), e.title) {
|
|
110
|
-
const a = document.createElement("span");
|
|
111
|
-
a.className = "hp-redirect-title", a.textContent = e.title, r.appendChild(a);
|
|
112
|
-
}
|
|
113
|
-
if (e.subtitle) {
|
|
114
|
-
const a = document.createElement("span");
|
|
115
|
-
a.className = "hp-redirect-sub", a.textContent = e.subtitle, r.appendChild(a);
|
|
116
|
-
}
|
|
117
|
-
n.el.setAttribute("aria-hidden", "true");
|
|
118
|
-
const d = document.createElement("span");
|
|
119
|
-
d.className = "hp-sr-only", d.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`, r.appendChild(d), i.append(n.el, r);
|
|
120
|
-
const h = document.createElement("button");
|
|
121
|
-
h.type = "button", h.className = "hp-redirect-close", h.setAttribute("aria-label", this.ctx.i18n.redirectCancelCard), h.appendChild(f("close")), h.addEventListener("click", () => {
|
|
122
|
-
this.cancelled = !0, this.hideCard(), this.emit("cancel");
|
|
123
|
-
}), t.append(i, h);
|
|
124
|
-
for (const a of ["pointerdown", "click", "dblclick"]) t.addEventListener(a, (p) => p.stopPropagation());
|
|
125
|
-
this.ctx.overlayContainerEl.appendChild(t), this.card = t, this.cardRing = n.ring, this.cardLabel = s, this.emit("shown");
|
|
126
|
-
}
|
|
127
|
-
hideCard() {
|
|
128
|
-
var e;
|
|
129
|
-
(e = this.card) == null || e.remove(), this.card = null, this.cardRing = null, this.cardLabel = null;
|
|
130
|
-
}
|
|
131
|
-
// ── 'screen' modu ───────────────────────────────────────────────────────
|
|
132
|
-
remove() {
|
|
133
|
-
var e;
|
|
134
|
-
this.counterTimer && (clearInterval(this.counterTimer), this.counterTimer = null), (e = this.wrapper) == null || e.remove(), this.wrapper = null;
|
|
135
|
-
}
|
|
136
|
-
createScreen() {
|
|
137
|
-
this.remove();
|
|
138
|
-
const e = this.options, t = document.createElement("div");
|
|
139
|
-
if (t.setAttribute("part", "redirect-screen"), t.className = "hp-redirect-screen", e.image) {
|
|
140
|
-
const c = document.createElement("img");
|
|
141
|
-
c.className = "hp-redirect-bg", c.src = e.image, c.alt = "", c.addEventListener("error", () => c.remove()), t.appendChild(c);
|
|
142
|
-
}
|
|
143
|
-
const i = document.createElement("div");
|
|
144
|
-
i.className = "hp-redirect-panel";
|
|
145
|
-
const n = document.createElement("span");
|
|
146
|
-
n.className = "hp-redirect-label", n.textContent = e.label ?? this.ctx.i18n.redirectUpNext, i.appendChild(n);
|
|
147
|
-
const r = document.createElement("button");
|
|
148
|
-
r.type = "button", r.className = "hp-redirect-poster", r.setAttribute("aria-label", this.ctx.i18n.redirectPlayNow);
|
|
149
|
-
const s = E(e.image, e.duration, "hp-redirect-thumb");
|
|
150
|
-
if (r.appendChild(s.el), r.addEventListener("click", () => this.go("click")), i.appendChild(r), e.title) {
|
|
151
|
-
const c = document.createElement("div");
|
|
152
|
-
c.className = "hp-redirect-title", c.textContent = e.title, i.appendChild(c);
|
|
153
|
-
}
|
|
154
|
-
if (e.subtitle) {
|
|
155
|
-
const c = document.createElement("div");
|
|
156
|
-
c.className = "hp-redirect-sub", c.textContent = e.subtitle, i.appendChild(c);
|
|
157
|
-
}
|
|
158
|
-
const d = document.createElement("div");
|
|
159
|
-
d.className = "hp-redirect-counter", d.setAttribute("aria-live", "polite"), i.appendChild(d);
|
|
160
|
-
const h = document.createElement("div");
|
|
161
|
-
h.className = "hp-redirect-actions";
|
|
162
|
-
const a = document.createElement("button");
|
|
163
|
-
a.type = "button", a.className = "hp-redirect-btn", a.textContent = this.ctx.i18n.redirectCancel;
|
|
164
|
-
const p = document.createElement("button");
|
|
165
|
-
p.type = "button", p.className = "hp-redirect-btn hp-redirect-btn-primary", p.textContent = this.ctx.i18n.redirectPlayNow, p.addEventListener("click", () => this.go("click")), a.addEventListener("click", () => {
|
|
166
|
-
var c;
|
|
167
|
-
this.remove(), this.emit("cancel"), (c = e.suggestions) != null && c.length && this.showSuggestions(e.suggestions);
|
|
168
|
-
}), h.append(a, p), i.appendChild(h), t.appendChild(i);
|
|
169
|
-
for (const c of ["pointerdown", "click", "dblclick"]) t.addEventListener(c, (x) => x.stopPropagation());
|
|
170
|
-
this.ctx.overlayContainerEl.appendChild(t), this.wrapper = t, this.emit("shown");
|
|
171
|
-
const u = Math.max(0, e.time);
|
|
172
|
-
let m = u;
|
|
173
|
-
const v = () => {
|
|
174
|
-
d.textContent = this.ctx.i18n.redirectCountdown(m), s.ring.set(u > 0 ? m / u : 0);
|
|
175
|
-
};
|
|
176
|
-
v(), this.counterTimer = setInterval(() => {
|
|
177
|
-
if (m--, m > 0) {
|
|
178
|
-
v();
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
this.counterTimer && clearInterval(this.counterTimer), this.counterTimer = null, d.textContent = this.ctx.i18n.redirectNowPlaying, s.ring.set(0), this.go("auto");
|
|
182
|
-
}, 1e3);
|
|
183
|
-
}
|
|
184
|
-
showSuggestions(e) {
|
|
185
|
-
var i;
|
|
186
|
-
this.remove();
|
|
187
|
-
const t = document.createElement("div");
|
|
188
|
-
t.setAttribute("part", "redirect-suggestions"), t.className = "hp-redirect-suggestions";
|
|
189
|
-
for (const n of e) {
|
|
190
|
-
const r = document.createElement("a");
|
|
191
|
-
r.href = n.url, this.options.newTab && (r.target = "_blank", r.rel = "noopener"), r.className = "hp-redirect-suggestion";
|
|
192
|
-
const s = E(n.image, n.duration, "hp-redirect-thumb");
|
|
193
|
-
(i = s.el.querySelector(".hp-redirect-ring")) == null || i.remove();
|
|
194
|
-
const d = document.createElement("span");
|
|
195
|
-
d.className = "hp-redirect-title", d.textContent = n.title, r.append(s.el, d), t.appendChild(r);
|
|
196
|
-
}
|
|
197
|
-
for (const n of ["pointerdown", "click", "dblclick"]) t.addEventListener(n, (r) => r.stopPropagation());
|
|
198
|
-
this.ctx.overlayContainerEl.appendChild(t), this.wrapper = t;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
function T(o, e) {
|
|
202
|
-
return new L(o, e);
|
|
203
|
-
}
|
|
204
|
-
export {
|
|
205
|
-
L as RedirectScreen,
|
|
206
|
-
T as installRedirectScreen
|
|
207
|
-
};
|
|
208
|
-
//# sourceMappingURL=redirectScreen-BT_26-5g.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"redirectScreen-BT_26-5g.js","sources":["../../src/plugins/redirect-screen/RedirectScreen.ts","../../src/plugins/redirect-screen/index.ts"],"sourcesContent":["import type { RedirectScreenOptions, RedirectScreenSuggestion } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\n\nexport interface RedirectScreenPlayerContext {\n /** hp:redirect olayları ve postroll'un bitişini (hp:adend) dinlemek için. */\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst RING_R = 18;\nconst RING_C = 2 * Math.PI * RING_R;\nconst DEFAULT_SHOW_BEFORE = 10;\n\n/** Dairesel geri sayım halkası (SVG) — `set(oran)` ile 1 → 0 boşalır. */\nfunction ring(className: string): { el: SVGSVGElement; set(fraction: number): void } {\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', '0 0 40 40');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('class', className);\n const track = document.createElementNS(SVG_NS, 'circle');\n const bar = document.createElementNS(SVG_NS, 'circle');\n for (const c of [track, bar]) {\n c.setAttribute('cx', '20');\n c.setAttribute('cy', '20');\n c.setAttribute('r', String(RING_R));\n }\n track.setAttribute('class', 'hp-redirect-ring-track');\n bar.setAttribute('class', 'hp-redirect-ring-bar');\n bar.setAttribute('stroke-dasharray', String(RING_C));\n svg.append(track, bar);\n return {\n el: svg,\n set: (fraction) => bar.setAttribute('stroke-dashoffset', String(RING_C * (1 - Math.min(1, Math.max(0, fraction))))),\n };\n}\n\n/** Görsel + süre rozeti + oynat ikonu + halka — kart ve tam ekran aynı parçayı kullanır. */\nfunction thumb(image: string | undefined, duration: string | undefined, className: string): { el: HTMLSpanElement; ring: ReturnType<typeof ring> } {\n const el = document.createElement('span');\n el.className = className;\n if (image) {\n const img = document.createElement('img');\n img.src = image;\n img.alt = '';\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const r = ring('hp-redirect-ring');\n const play = document.createElement('span');\n play.className = 'hp-redirect-play';\n play.appendChild(createIcon('play'));\n el.append(r.el, play);\n if (duration) {\n const d = document.createElement('span');\n d.className = 'hp-redirect-duration';\n d.textContent = duration;\n el.appendChild(d);\n }\n return { el, ring: r };\n}\n\n/**\n * Sıradaki videoya yönlendirme. İki mod:\n * - 'screen' (varsayılan): video bitince tam alan ekran + `time` sn geri sayım; iptal → öneriler.\n * - 'card': bitime `showBefore` sn kala köşede küçük \"Sıradaki\" kartı; geri sayım videoyla birlikte işler (duraklatınca\n * durur), video bitince yönlendirilir. Karta tıklamak hemen yönlendirir, X iptal eder.\n * Bitişte postroll oynuyorsa yönlendirme reklam bitene kadar bekler. `hp:redirect` (state: redirect) iptal edilirse\n * (`preventDefault`) sayfa değişmez.\n */\nexport class RedirectScreen {\n private counterTimer: ReturnType<typeof setInterval> | null = null;\n private wrapper: HTMLElement | null = null;\n private card: HTMLDivElement | null = null;\n private cardRing: ReturnType<typeof ring> | null = null;\n private cardLabel: HTMLSpanElement | null = null;\n private cancelled = false;\n private waitingForAd = false;\n private readonly mode: 'screen' | 'card';\n\n constructor(\n private readonly ctx: RedirectScreenPlayerContext,\n private readonly options: RedirectScreenOptions\n ) {\n this.mode = options.mode === 'card' ? 'card' : 'screen';\n if (options.enabled === false) return;\n ctx.videoEl.addEventListener('ended', this.onEnded);\n ctx.videoEl.addEventListener('play', this.onPlay);\n if (this.mode === 'card') ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n /** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */\n refreshLabels(): void {\n this.card?.querySelector('.hp-redirect-close')?.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('ended', this.onEnded);\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.remove();\n this.hideCard();\n }\n\n private emit(state: 'shown' | 'cancel' | 'redirect', reason?: 'auto' | 'click'): boolean {\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:redirect', { detail: { state, url: this.options.url, mode: this.mode, reason }, cancelable: state === 'redirect' })\n );\n }\n\n private go(reason: 'auto' | 'click'): void {\n this.remove();\n this.hideCard();\n if (!this.emit('redirect', reason)) return; // entegratör kendisi yönlendirecek\n if (this.options.newTab) window.open(this.options.url, '_blank', 'noopener');\n else window.location.href = this.options.url;\n }\n\n private readonly onPlay = (): void => {\n this.remove();\n };\n\n private readonly onEnded = (): void => {\n // Postroll oynuyorsa (ya da birazdan başlayacaksa) reklam bitince devam.\n if (this.ctx.isAdActive()) {\n this.waitForAd();\n return;\n }\n this.finish();\n };\n\n private waitForAd(): void {\n if (this.waitingForAd) return;\n this.waitingForAd = true;\n this.ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n }\n\n private readonly onAdEnd = (): void => {\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.waitingForAd = false;\n if (this.ctx.videoEl.ended) this.finish();\n };\n\n private finish(): void {\n if (this.mode === 'card') {\n this.hideCard();\n if (!this.cancelled) this.go('auto');\n else if (this.options.suggestions?.length) this.showSuggestions(this.options.suggestions);\n return;\n }\n this.createScreen();\n }\n\n // ── 'card' modu ─────────────────────────────────────────────────────────\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n const showBefore = Math.max(1, this.options.showBefore ?? DEFAULT_SHOW_BEFORE);\n const d = v.duration;\n if (!Number.isFinite(d) || d <= 0) return; // canlı yayında kart yok\n const remaining = d - v.currentTime;\n if (remaining > showBefore) {\n // Geri sarıldı (eşiğin belirgin üstüne): iptal unutulur — tekrar yaklaşınca kart yine gelir.\n if (remaining > showBefore + 1) this.cancelled = false;\n this.hideCard();\n return;\n }\n if (this.cancelled || this.ctx.isAdActive() || v.ended || remaining <= 0) {\n if (this.ctx.isAdActive()) this.hideCard();\n return;\n }\n if (!this.card) this.showCard();\n const secs = Math.ceil(remaining);\n this.cardRing?.set(remaining / showBefore);\n if (this.cardLabel) this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${secs}`;\n };\n\n private showCard(): void {\n const o = this.options;\n const card = document.createElement('div');\n card.className = 'hp-redirect-card';\n card.setAttribute('part', 'redirect-card');\n card.setAttribute('data-position', o.position ?? 'bottom-right');\n\n const main = document.createElement('button');\n main.type = 'button';\n main.className = 'hp-redirect-card-main';\n main.addEventListener('click', () => this.go('click'));\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n const text = document.createElement('span');\n text.className = 'hp-redirect-text';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n text.appendChild(label);\n if (o.title) {\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n text.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('span');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n text.appendChild(sub);\n }\n // Erişilebilir ad görünen metinden oluşur (\"Sıradaki · 4 Başlık Alt başlık\"); sonuna yalnızca ekran okuyucunun\n // duyduğu \"Şimdi oynat\" eklenir — görsel / süre rozeti okunmaz.\n t.el.setAttribute('aria-hidden', 'true');\n const action = document.createElement('span');\n action.className = 'hp-sr-only';\n action.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`;\n text.appendChild(action);\n main.append(t.el, text);\n\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-redirect-close';\n close.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => {\n this.cancelled = true;\n this.hideCard();\n this.emit('cancel');\n });\n\n card.append(main, close);\n // Karta dokunmak videoyu oynat / duraklat yapmasın.\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) card.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(card);\n this.card = card;\n this.cardRing = t.ring;\n this.cardLabel = label;\n this.emit('shown');\n }\n\n private hideCard(): void {\n this.card?.remove();\n this.card = null;\n this.cardRing = null;\n this.cardLabel = null;\n }\n\n // ── 'screen' modu ───────────────────────────────────────────────────────\n\n private remove(): void {\n if (this.counterTimer) {\n clearInterval(this.counterTimer);\n this.counterTimer = null;\n }\n this.wrapper?.remove();\n this.wrapper = null;\n }\n\n private createScreen(): void {\n this.remove();\n const o = this.options;\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-screen');\n wrapper.className = 'hp-redirect-screen';\n\n if (o.image) {\n const bg = document.createElement('img');\n bg.className = 'hp-redirect-bg';\n bg.src = o.image;\n bg.alt = '';\n bg.addEventListener('error', () => bg.remove());\n wrapper.appendChild(bg);\n }\n\n const panel = document.createElement('div');\n panel.className = 'hp-redirect-panel';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n label.textContent = o.label ?? this.ctx.i18n.redirectUpNext;\n panel.appendChild(label);\n\n const poster = document.createElement('button');\n poster.type = 'button';\n poster.className = 'hp-redirect-poster';\n poster.setAttribute('aria-label', this.ctx.i18n.redirectPlayNow);\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n poster.appendChild(t.el);\n poster.addEventListener('click', () => this.go('click'));\n panel.appendChild(poster);\n\n if (o.title) {\n const title = document.createElement('div');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n panel.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('div');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n panel.appendChild(sub);\n }\n\n const counter = document.createElement('div');\n counter.className = 'hp-redirect-counter';\n counter.setAttribute('aria-live', 'polite');\n panel.appendChild(counter);\n\n const actions = document.createElement('div');\n actions.className = 'hp-redirect-actions';\n const cancelBtn = document.createElement('button');\n cancelBtn.type = 'button';\n cancelBtn.className = 'hp-redirect-btn';\n cancelBtn.textContent = this.ctx.i18n.redirectCancel;\n const acceptBtn = document.createElement('button');\n acceptBtn.type = 'button';\n acceptBtn.className = 'hp-redirect-btn hp-redirect-btn-primary';\n acceptBtn.textContent = this.ctx.i18n.redirectPlayNow;\n acceptBtn.addEventListener('click', () => this.go('click'));\n cancelBtn.addEventListener('click', () => {\n this.remove();\n this.emit('cancel');\n if (o.suggestions?.length) this.showSuggestions(o.suggestions);\n });\n actions.append(cancelBtn, acceptBtn);\n panel.appendChild(actions);\n wrapper.appendChild(panel);\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n this.emit('shown');\n\n const total = Math.max(0, o.time);\n let remaining = total;\n const render = (): void => {\n counter.textContent = this.ctx.i18n.redirectCountdown(remaining);\n t.ring.set(total > 0 ? remaining / total : 0);\n };\n render();\n this.counterTimer = setInterval(() => {\n remaining--;\n if (remaining > 0) {\n render();\n return;\n }\n if (this.counterTimer) clearInterval(this.counterTimer);\n this.counterTimer = null;\n counter.textContent = this.ctx.i18n.redirectNowPlaying;\n t.ring.set(0);\n this.go('auto');\n }, 1000);\n }\n\n private showSuggestions(items: RedirectScreenSuggestion[]): void {\n this.remove();\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-suggestions');\n wrapper.className = 'hp-redirect-suggestions';\n for (const item of items) {\n const box = document.createElement('a');\n box.href = item.url;\n if (this.options.newTab) {\n box.target = '_blank';\n box.rel = 'noopener';\n }\n box.className = 'hp-redirect-suggestion';\n const t = thumb(item.image, item.duration, 'hp-redirect-thumb');\n t.el.querySelector('.hp-redirect-ring')?.remove();\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = item.title;\n box.append(t.el, title);\n wrapper.appendChild(box);\n }\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n}\n","import { RedirectScreen, type RedirectScreenPlayerContext } from './RedirectScreen';\nimport type { RedirectScreenOptions } from '../../types';\n\nexport function installRedirectScreen(ctx: RedirectScreenPlayerContext, options: RedirectScreenOptions): RedirectScreen {\n return new RedirectScreen(ctx, options);\n}\n\nexport { RedirectScreen };\nexport type { RedirectScreenPlayerContext };\n"],"names":["SVG_NS","RING_R","RING_C","DEFAULT_SHOW_BEFORE","ring","className","svg","track","bar","c","fraction","thumb","image","duration","el","img","r","play","createIcon","d","RedirectScreen","ctx","options","__publicField","v","showBefore","remaining","secs","_a","_b","state","reason","o","card","main","t","text","label","title","sub","action","close","ev","e","wrapper","bg","panel","poster","counter","actions","cancelBtn","acceptBtn","total","render","items","item","box","installRedirectScreen"],"mappings":"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"}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
var y = Object.defineProperty;
|
|
2
|
-
var x = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
|
-
var u = (r, t, e) => x(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { L as E } from "./player-DV4Hf5Cw.js";
|
|
5
|
-
const k = "https://securepubads.g.doubleclick.net/tag/js/gpt.js";
|
|
6
|
-
let b = null;
|
|
7
|
-
function C() {
|
|
8
|
-
var t;
|
|
9
|
-
const r = window;
|
|
10
|
-
return r.googletag ?? (r.googletag = { cmd: [] }), (t = r.googletag).cmd ?? (t.cmd = []), r.googletag.apiReady || document.querySelector('script[src*="/tag/js/gpt.js"]') ? Promise.resolve() : (b ?? (b = new Promise((e, o) => {
|
|
11
|
-
const s = document.createElement("script");
|
|
12
|
-
s.async = !0, s.src = k, s.onload = () => e(), s.onerror = () => {
|
|
13
|
-
b = null, s.remove(), o(new Error("gpt.js could not be loaded (ad blocker / network / certificate)"));
|
|
14
|
-
}, document.head.appendChild(s);
|
|
15
|
-
})), b);
|
|
16
|
-
}
|
|
17
|
-
function L(r, t, e) {
|
|
18
|
-
return new Promise((o) => {
|
|
19
|
-
let s = !1, n = !1, m = !1, i = null, f = null;
|
|
20
|
-
const v = [], c = (d) => {
|
|
21
|
-
var p;
|
|
22
|
-
if (!s) {
|
|
23
|
-
if (s = !0, clearTimeout(h), e == null || e.removeEventListener("abort", l), f) {
|
|
24
|
-
const g = f.pubads();
|
|
25
|
-
for (const [a, w] of v) (p = g.removeEventListener) == null || p.call(g, a, w);
|
|
26
|
-
if (i)
|
|
27
|
-
try {
|
|
28
|
-
f.destroySlots([i]);
|
|
29
|
-
} catch {
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
o(d);
|
|
33
|
-
}
|
|
34
|
-
}, l = () => c("closed"), h = setTimeout(() => c("nofill"), t);
|
|
35
|
-
if (e != null && e.aborted) {
|
|
36
|
-
c("closed");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
e == null || e.addEventListener("abort", l), C().then(() => {
|
|
40
|
-
if (s) return;
|
|
41
|
-
const d = window.googletag;
|
|
42
|
-
d.cmd.push(() => {
|
|
43
|
-
if (s) return;
|
|
44
|
-
if (f = d, i = d.defineOutOfPageSlot(r, d.enums.OutOfPageFormat.REWARDED), !i) {
|
|
45
|
-
c("nofill");
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
i.addService(d.pubads());
|
|
49
|
-
const p = d.pubads(), g = (a, w) => {
|
|
50
|
-
v.push([a, w]), p.addEventListener(a, w);
|
|
51
|
-
};
|
|
52
|
-
g("rewardedSlotReady", (a) => {
|
|
53
|
-
var w;
|
|
54
|
-
a.slot !== i || s || (clearTimeout(h), e == null || e.removeEventListener("abort", l), (w = a.makeRewardedVisible) == null || w.call(a));
|
|
55
|
-
}), g("rewardedSlotGranted", (a) => {
|
|
56
|
-
a.slot === i && (n = !0, m && c("granted"));
|
|
57
|
-
}), g("rewardedSlotVideoCompleted", (a) => {
|
|
58
|
-
a.slot === i && (m = !0, n && c("granted"));
|
|
59
|
-
}), g("rewardedSlotClosed", (a) => {
|
|
60
|
-
a.slot === i && c(n ? "granted" : "closed");
|
|
61
|
-
}), g("slotRenderEnded", (a) => {
|
|
62
|
-
a.slot === i && a.isEmpty && c("nofill");
|
|
63
|
-
}), d.enableServices(), d.display(i);
|
|
64
|
-
});
|
|
65
|
-
}).catch(() => c("nofill"));
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
const T = 480, S = "hope-rewarded-unlock", A = 8e3, D = 2600;
|
|
69
|
-
let F = 0;
|
|
70
|
-
class K {
|
|
71
|
-
constructor(t, e) {
|
|
72
|
-
u(this, "options");
|
|
73
|
-
u(this, "button");
|
|
74
|
-
u(this, "dialog", null);
|
|
75
|
-
u(this, "toast", null);
|
|
76
|
-
u(this, "toastTimer", null);
|
|
77
|
-
u(this, "phase", "idle");
|
|
78
|
-
/** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */
|
|
79
|
-
u(this, "videoUnlockedKey", null);
|
|
80
|
-
u(this, "lastKey", "");
|
|
81
|
-
/** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */
|
|
82
|
-
u(this, "onSourceChange", () => {
|
|
83
|
-
const t = this.ctx.contentKey();
|
|
84
|
-
t !== this.lastKey && (this.lastKey = t, this.onQualitiesChanged());
|
|
85
|
-
});
|
|
86
|
-
u(this, "resumeAfterDialog", !1);
|
|
87
|
-
/** Reklam hazırlanırken "Vazgeç" — sağlayıcıya iletilir (GPT slotu temizlenir). */
|
|
88
|
-
u(this, "abort", null);
|
|
89
|
-
this.ctx = t, this.options = e;
|
|
90
|
-
const o = document.createElement("button");
|
|
91
|
-
o.type = "button", o.className = "hp-rw-button", o.setAttribute("part", "rewarded-button"), o.addEventListener("click", (s) => {
|
|
92
|
-
s.stopPropagation(), this.requestUnlock();
|
|
93
|
-
}), o.addEventListener("pointerdown", (s) => s.stopPropagation()), t.chromeEl.appendChild(o), this.button = o, t.videoEl.addEventListener("loadstart", this.onSourceChange), this.refreshLabels(), this.onQualitiesChanged();
|
|
94
|
-
}
|
|
95
|
-
update(t) {
|
|
96
|
-
const e = this.unlocked;
|
|
97
|
-
this.options = t, e !== this.unlocked && this.ctx.onLockChange(!1), this.onQualitiesChanged();
|
|
98
|
-
}
|
|
99
|
-
// ── Kilit durumu ────────────────────────────────────────────────────
|
|
100
|
-
get maxFreeHeight() {
|
|
101
|
-
const t = this.options.maxFreeHeight;
|
|
102
|
-
return typeof t == "number" && t > 0 ? t : T;
|
|
103
|
-
}
|
|
104
|
-
get storageKey() {
|
|
105
|
-
return this.options.storageKey || S;
|
|
106
|
-
}
|
|
107
|
-
get unlockFor() {
|
|
108
|
-
const t = this.options.unlockFor;
|
|
109
|
-
return typeof t == "number" && t > 0 ? t : t === "video" ? "video" : "session";
|
|
110
|
-
}
|
|
111
|
-
get unlocked() {
|
|
112
|
-
const t = this.unlockFor;
|
|
113
|
-
if (t === "video") return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();
|
|
114
|
-
try {
|
|
115
|
-
if (t === "session") return sessionStorage.getItem(this.storageKey) === "1";
|
|
116
|
-
const e = Number(localStorage.getItem(this.storageKey));
|
|
117
|
-
return Number.isFinite(e) && e > Date.now();
|
|
118
|
-
} catch {
|
|
119
|
-
return !1;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
grant() {
|
|
123
|
-
const t = this.unlockFor;
|
|
124
|
-
t === "video" && (this.videoUnlockedKey = this.ctx.contentKey());
|
|
125
|
-
try {
|
|
126
|
-
t === "session" ? sessionStorage.setItem(this.storageKey, "1") : typeof t == "number" && localStorage.setItem(this.storageKey, String(Date.now() + t * 6e4));
|
|
127
|
-
} catch {
|
|
128
|
-
this.videoUnlockedKey = this.ctx.contentKey();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
/** Player için: bu yükseklikteki kalite kilitli mi? */
|
|
132
|
-
isLocked(t) {
|
|
133
|
-
return this.unlocked ? !1 : t !== null && t > this.maxFreeHeight;
|
|
134
|
-
}
|
|
135
|
-
/** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */
|
|
136
|
-
onQualitiesChanged() {
|
|
137
|
-
const t = this.ctx.lockedQualityLabel(), e = this.options.button !== !1 && !!t && !this.unlocked;
|
|
138
|
-
if (this.button.hidden = !e, !e) return;
|
|
139
|
-
const o = this.fill(this.ctx.i18n.rewardedButton, t);
|
|
140
|
-
this.button.innerHTML = `${E}<span>${N(o)}</span>`, this.button.setAttribute("aria-label", o);
|
|
141
|
-
}
|
|
142
|
-
// ── Akış ────────────────────────────────────────────────────────────
|
|
143
|
-
/** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */
|
|
144
|
-
requestUnlock() {
|
|
145
|
-
if (this.unlocked || this.phase !== "idle") return;
|
|
146
|
-
const t = this.ctx.lockedQualityLabel() ?? "HD";
|
|
147
|
-
this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedprompt", { detail: { quality: t } })), this.showDialog("prompt", t);
|
|
148
|
-
}
|
|
149
|
-
async watch(t) {
|
|
150
|
-
const e = this.ctx.videoEl, o = !e.paused;
|
|
151
|
-
e.pause(), this.ctx.exitFullscreen(), this.abort = new AbortController();
|
|
152
|
-
const s = this.abort.signal;
|
|
153
|
-
this.showDialog("loading", t);
|
|
154
|
-
let n;
|
|
155
|
-
try {
|
|
156
|
-
n = await this.runProvider(s);
|
|
157
|
-
} catch (i) {
|
|
158
|
-
this.ctx.log({ message: `Rewarded ad failed: ${String(i)}` }), n = "nofill";
|
|
159
|
-
}
|
|
160
|
-
if (this.abort = null, s.aborted) {
|
|
161
|
-
this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1, cancelled: !0 } })), o && this.ctx.play();
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
let m = !1;
|
|
165
|
-
if (n === "nofill" && this.options.grantOnNoFill !== !1 && (this.ctx.log({ message: "Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)" }), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardednofill", { detail: { granted: !0 } })), n = "granted", m = !0), n === "granted") {
|
|
166
|
-
this.grant(), this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedgranted", { detail: { quality: t, noAd: m } })), this.ctx.onLockChange(!0), this.onQualitiesChanged(), this.showToast(this.fill(m ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, t)), o && this.ctx.play();
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
if (n === "nofill") {
|
|
170
|
-
this.ctx.log({ message: "Rewarded ad: no ad available (no fill / unsupported page / timeout)" }), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardednofill", { detail: { granted: !1 } })), this.showDialog("nofill", t), this.resumeAfterDialog = o;
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1 } })), o && this.ctx.play();
|
|
174
|
-
}
|
|
175
|
-
async runProvider(t) {
|
|
176
|
-
const e = this.options.provider;
|
|
177
|
-
if ((e == null ? void 0 : e.type) === "gpt") return L(e.adUnitPath, e.timeoutMs ?? A, t);
|
|
178
|
-
if ((e == null ? void 0 : e.type) === "custom") {
|
|
179
|
-
const o = new Promise((n) => t.addEventListener("abort", () => n("closed"), { once: !0 })), s = await Promise.race([e.show({ signal: t }), o]);
|
|
180
|
-
return s === !0 ? "granted" : s === !1 ? "closed" : s;
|
|
181
|
-
}
|
|
182
|
-
throw new Error("rewardedUnlock.provider is missing");
|
|
183
|
-
}
|
|
184
|
-
// ── Arayüz ─────────────────────────────────────────────────────────
|
|
185
|
-
fill(t, e) {
|
|
186
|
-
const o = this.unlockFor, s = this.ctx.i18n, n = o === "video" ? s.rewardedForVideo : o === "session" ? s.rewardedForSession : s.rewardedForMinutes.replace("{n}", String(o));
|
|
187
|
-
return t.replace("{quality}", e).replace("{duration}", n);
|
|
188
|
-
}
|
|
189
|
-
showDialog(t, e) {
|
|
190
|
-
this.phase = t;
|
|
191
|
-
const o = this.ctx.i18n;
|
|
192
|
-
if (!this.dialog) {
|
|
193
|
-
const l = document.createElement("div");
|
|
194
|
-
l.className = "hp-rw-dialog", l.setAttribute("part", "rewarded-dialog"), l.setAttribute("role", "dialog"), l.setAttribute("aria-modal", "true");
|
|
195
|
-
for (const h of ["click", "pointerdown", "dblclick"]) l.addEventListener(h, (d) => d.stopPropagation());
|
|
196
|
-
l.addEventListener("keydown", (h) => {
|
|
197
|
-
var d;
|
|
198
|
-
h.stopPropagation(), h.key === "Escape" && (this.phase === "loading" ? (d = this.abort) == null || d.abort() : this.dismiss());
|
|
199
|
-
}), this.ctx.overlayEl.appendChild(l), this.dialog = l;
|
|
200
|
-
}
|
|
201
|
-
const s = this.dialog;
|
|
202
|
-
s.setAttribute("data-phase", t), s.innerHTML = "";
|
|
203
|
-
const n = document.createElement("div");
|
|
204
|
-
n.className = "hp-rw-card";
|
|
205
|
-
const m = document.createElement("div");
|
|
206
|
-
m.className = "hp-rw-icon", m.innerHTML = E;
|
|
207
|
-
const i = document.createElement("div");
|
|
208
|
-
i.className = "hp-rw-title", i.id = `hp-rw-title-${++F}`, s.setAttribute("aria-labelledby", i.id);
|
|
209
|
-
const f = document.createElement("div");
|
|
210
|
-
f.className = "hp-rw-text";
|
|
211
|
-
const v = document.createElement("div");
|
|
212
|
-
v.className = "hp-rw-actions", n.append(m, i, f, v), s.appendChild(n);
|
|
213
|
-
const c = (l, h, d) => {
|
|
214
|
-
const p = document.createElement("button");
|
|
215
|
-
return p.type = "button", p.className = h ? "hp-rw-btn hp-rw-btn-primary" : "hp-rw-btn", p.textContent = l, p.addEventListener("click", d), v.appendChild(p), p;
|
|
216
|
-
};
|
|
217
|
-
if (t === "prompt")
|
|
218
|
-
i.textContent = this.fill(o.rewardedTitle, e), f.textContent = this.fill(o.rewardedBody, e), c(o.rewardedDecline, !1, () => this.dismiss()), c(o.rewardedWatch, !0, () => void this.watch(e)).focus();
|
|
219
|
-
else if (t === "loading") {
|
|
220
|
-
i.textContent = o.rewardedLoading;
|
|
221
|
-
const l = document.createElement("div");
|
|
222
|
-
l.className = "hp-rw-spinner", f.appendChild(l), c(o.rewardedDecline, !1, () => {
|
|
223
|
-
var h;
|
|
224
|
-
return (h = this.abort) == null ? void 0 : h.abort();
|
|
225
|
-
});
|
|
226
|
-
} else
|
|
227
|
-
i.textContent = this.fill(o.rewardedTitle, e), f.textContent = o.rewardedNoFill, c(o.rewardedOk, !0, () => this.dismiss()).focus();
|
|
228
|
-
}
|
|
229
|
-
dismiss() {
|
|
230
|
-
const t = this.phase === "nofill";
|
|
231
|
-
this.closeDialog(), t || this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1, declined: !0 } })), this.resumeAfterDialog && this.ctx.play(), this.resumeAfterDialog = !1;
|
|
232
|
-
}
|
|
233
|
-
closeDialog() {
|
|
234
|
-
var t;
|
|
235
|
-
this.phase = "idle", (t = this.dialog) == null || t.remove(), this.dialog = null;
|
|
236
|
-
}
|
|
237
|
-
showToast(t) {
|
|
238
|
-
var o;
|
|
239
|
-
this.toastTimer && clearTimeout(this.toastTimer), (o = this.toast) == null || o.remove();
|
|
240
|
-
const e = document.createElement("div");
|
|
241
|
-
e.className = "hp-rw-toast", e.setAttribute("part", "rewarded-toast"), e.setAttribute("role", "status"), e.textContent = t, this.ctx.overlayEl.appendChild(e), this.toast = e, this.toastTimer = setTimeout(() => {
|
|
242
|
-
var s;
|
|
243
|
-
(s = this.toast) == null || s.remove(), this.toast = null;
|
|
244
|
-
}, D);
|
|
245
|
-
}
|
|
246
|
-
refreshLabels() {
|
|
247
|
-
this.onQualitiesChanged();
|
|
248
|
-
}
|
|
249
|
-
destroy() {
|
|
250
|
-
var t, e;
|
|
251
|
-
(t = this.abort) == null || t.abort(), this.ctx.videoEl.removeEventListener("loadstart", this.onSourceChange), this.toastTimer && clearTimeout(this.toastTimer), (e = this.toast) == null || e.remove(), this.closeDialog(), this.button.remove();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
function N(r) {
|
|
255
|
-
return r.replace(/[&<>"']/g, (t) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[t]);
|
|
256
|
-
}
|
|
257
|
-
function R(r, t) {
|
|
258
|
-
return new K(r, t);
|
|
259
|
-
}
|
|
260
|
-
export {
|
|
261
|
-
K as RewardedUnlock,
|
|
262
|
-
R as installRewardedUnlock
|
|
263
|
-
};
|
|
264
|
-
//# sourceMappingURL=rewardedUnlock-jFOdzfSq.js.map
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
var m = Object.defineProperty;
|
|
2
|
-
var v = (r, t, e) => t in r ? m(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
|
-
var n = (r, t, e) => v(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { f as E } from "./player-DV4Hf5Cw.js";
|
|
5
|
-
class u {
|
|
6
|
-
constructor(t, e) {
|
|
7
|
-
n(this, "chapters", []);
|
|
8
|
-
n(this, "chapterEls", []);
|
|
9
|
-
n(this, "hoverIndex", -1);
|
|
10
|
-
n(this, "tooltipEl");
|
|
11
|
-
n(this, "titleEl");
|
|
12
|
-
n(this, "timeEl");
|
|
13
|
-
n(this, "onLoadedMetadata", () => {
|
|
14
|
-
const t = this.ctx.videoEl.duration;
|
|
15
|
-
!Number.isFinite(t) || t <= 0 || (this.chapters = f(this.segments, t), this.chapterEls = this.ctx.seekBar.setChapters(
|
|
16
|
-
this.chapters.map((e) => ({ start: e.start / t, end: e.end / t, color: e.color }))
|
|
17
|
-
));
|
|
18
|
-
});
|
|
19
|
-
n(this, "onPointerMove", (t) => {
|
|
20
|
-
const e = this.ctx.videoEl.duration;
|
|
21
|
-
if (!this.chapters.length || !Number.isFinite(e) || e <= 0) return;
|
|
22
|
-
const i = this.ctx.seekBar.ratioAtClientX(t.clientX) * e;
|
|
23
|
-
let a = this.chapters.findIndex((c) => i < c.end);
|
|
24
|
-
a === -1 && (a = this.chapters.length - 1), this.setHover(a);
|
|
25
|
-
const s = this.chapters[a];
|
|
26
|
-
this.titleEl.textContent = s.text ?? "", this.titleEl.style.display = s.text ? "" : "none", this.timeEl.textContent = E(i);
|
|
27
|
-
const o = this.ctx.seekBar.el.querySelector('[part="sprite-tooltip"]'), l = o && o.hasAttribute("data-visible") && o.offsetHeight > 0 ? o.offsetHeight + 8 : 0;
|
|
28
|
-
this.tooltipEl.style.bottom = l ? `calc(100% + 6px + ${l}px)` : "", this.timeEl.style.display = l ? "none" : "";
|
|
29
|
-
const h = this.ctx.seekBar.el.getBoundingClientRect();
|
|
30
|
-
this.tooltipEl.setAttribute("data-visible", "");
|
|
31
|
-
const p = this.tooltipEl.offsetWidth, d = Math.min(Math.max(t.clientX - h.left - p / 2, 0), Math.max(h.width - p, 0));
|
|
32
|
-
this.tooltipEl.style.transform = `translateX(${d}px)`;
|
|
33
|
-
});
|
|
34
|
-
n(this, "onPointerLeave", () => {
|
|
35
|
-
this.setHover(-1), this.tooltipEl.removeAttribute("data-visible");
|
|
36
|
-
});
|
|
37
|
-
this.ctx = t, this.segments = e, this.tooltipEl = document.createElement("div"), this.tooltipEl.className = "hp-chapter-tooltip", this.tooltipEl.setAttribute("part", "segment-tooltip"), this.titleEl = document.createElement("div"), this.titleEl.className = "hp-chapter-tooltip-title", this.timeEl = document.createElement("div"), this.timeEl.className = "hp-chapter-tooltip-time", this.tooltipEl.append(this.titleEl, this.timeEl), t.seekBar.el.appendChild(this.tooltipEl), t.seekBar.suppressHoverTime("segments", !0), t.seekBar.el.addEventListener("pointermove", this.onPointerMove), t.seekBar.el.addEventListener("pointerleave", this.onPointerLeave), t.videoEl.addEventListener("loadedmetadata", this.onLoadedMetadata), t.videoEl.readyState >= 1 && this.onLoadedMetadata();
|
|
38
|
-
}
|
|
39
|
-
destroy() {
|
|
40
|
-
this.ctx.videoEl.removeEventListener("loadedmetadata", this.onLoadedMetadata), this.ctx.seekBar.el.removeEventListener("pointermove", this.onPointerMove), this.ctx.seekBar.el.removeEventListener("pointerleave", this.onPointerLeave), this.ctx.seekBar.clearChapters(), this.ctx.seekBar.suppressHoverTime("segments", !1), this.tooltipEl.remove(), this.chapterEls = [], this.chapters = [];
|
|
41
|
-
}
|
|
42
|
-
setHover(t) {
|
|
43
|
-
var e, i;
|
|
44
|
-
t !== this.hoverIndex && ((e = this.chapterEls[this.hoverIndex]) == null || e.removeAttribute("data-hover"), this.hoverIndex = t, (i = this.chapterEls[t]) == null || i.setAttribute("data-hover", ""));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
function f(r, t) {
|
|
48
|
-
const e = r.filter((s) => Number.isFinite(s.start) && s.start < t).slice().sort((s, o) => s.start - o.start), i = [];
|
|
49
|
-
let a = 0;
|
|
50
|
-
for (const s of e) {
|
|
51
|
-
const o = Math.max(s.start, a), l = Math.min(Number.isFinite(s.end) ? s.end : t, t);
|
|
52
|
-
l <= o || (o > a && i.push({ start: a, end: o }), i.push({ start: o, end: l, text: s.text, color: s.color }), a = l);
|
|
53
|
-
}
|
|
54
|
-
return i.length ? (a < t && (i[i.length - 1].end = t), i) : [];
|
|
55
|
-
}
|
|
56
|
-
function g(r, t) {
|
|
57
|
-
return new u(r, t);
|
|
58
|
-
}
|
|
59
|
-
export {
|
|
60
|
-
u as Segments,
|
|
61
|
-
g as installSegments
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=segments--hl_QVrI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segments--hl_QVrI.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}
|