@hopeplayer/core 1.6.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 +23 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/{adTriggers-BIAWe8o4.js → adTriggers-DVqgm92F.js} +94 -93
- package/dist/chunks/{adTriggers-BIAWe8o4.js.map → adTriggers-DVqgm92F.js.map} +1 -1
- package/dist/chunks/{ads-DlpHPpR9.js → ads-eSKyiH1o.js} +2 -2
- package/dist/chunks/{ads-DlpHPpR9.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-vHyi7oV_.js → cast-DEowHmqA.js} +29 -28
- package/dist/chunks/{cast-vHyi7oV_.js.map → cast-DEowHmqA.js.map} +1 -1
- package/dist/chunks/{docPip-wybMVP1H.js → docPip-Bh6BWPk-.js} +30 -20
- 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-CwqLXiZi.js → history-ZSdDDsRF.js} +35 -34
- package/dist/chunks/{history-CwqLXiZi.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/{markers-L69W3kj6.js → markers-D32rI-x-.js} +2 -2
- package/dist/chunks/{markers-L69W3kj6.js.map → markers-D32rI-x-.js.map} +1 -1
- 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-D2_HRzot.js → player-B7mYS--8.js} +754 -682
- package/dist/chunks/player-B7mYS--8.js.map +1 -0
- package/dist/chunks/{playlist-CHfStNbQ.js → playlist-BkhIOfCy.js} +2 -2
- package/dist/chunks/{playlist-CHfStNbQ.js.map → playlist-BkhIOfCy.js.map} +1 -1
- package/dist/chunks/{pluginHost-cN2uGFeG.js → pluginHost-CXqkjNV1.js} +2 -2
- package/dist/chunks/{pluginHost-cN2uGFeG.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
- package/dist/chunks/{redirectScreen-TIqLdvBY.js → redirectScreen-DgmjFVJH.js} +51 -39
- package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
- package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
- package/dist/chunks/{rewardedUnlock-DUqYwXTr.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
- package/dist/chunks/{segments-Ds-c1b5e.js → segments-CuQQEIAX.js} +2 -2
- package/dist/chunks/{segments-Ds-c1b5e.js.map → segments-CuQQEIAX.js.map} +1 -1
- package/dist/chunks/share-BdqQ8sGE.js +216 -0
- package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
- package/dist/chunks/{skipSegments-ByNoF1qZ.js → skipSegments-BbepQ4Y6.js} +2 -2
- package/dist/chunks/{skipSegments-ByNoF1qZ.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-Cr9UmkM9.js → spriteThumbnails-BYg-DHx4.js} +2 -2
- package/dist/chunks/{spriteThumbnails-Cr9UmkM9.js.map → spriteThumbnails-BYg-DHx4.js.map} +1 -1
- package/dist/chunks/{story-CodA2dfn.js → story-DcBG6jUg.js} +2 -2
- package/dist/chunks/{story-CodA2dfn.js.map → story-DcBG6jUg.js.map} +1 -1
- package/dist/chunks/{transcript-LG7E9UYE.js → transcript-CHPQ6S6E.js} +33 -13
- package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
- package/dist/controls/SeekBar.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 +27 -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/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/index.d.ts.map +1 -1
- 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 +8 -0
- package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -1
- package/dist/plugins/heatmap/index.d.ts.map +1 -1
- 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/index.d.ts.map +1 -1
- package/dist/plugins/interactive/strings.d.ts +8 -0
- package/dist/plugins/interactive/strings.d.ts.map +1 -0
- 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/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/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/transcript/index.d.ts.map +1 -1
- package/dist/plugins/transcript/strings.d.ts +8 -0
- package/dist/plugins/transcript/strings.d.ts.map +1 -0
- package/dist/types/index.d.ts +93 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/docPip-wybMVP1H.js.map +0 -1
- package/dist/chunks/heatmap-Bb7neaYU.js +0 -92
- package/dist/chunks/heatmap-Bb7neaYU.js.map +0 -1
- package/dist/chunks/interactive-CgltIneu.js +0 -189
- package/dist/chunks/interactive-CgltIneu.js.map +0 -1
- package/dist/chunks/player-D2_HRzot.js.map +0 -1
- package/dist/chunks/redirectScreen-TIqLdvBY.js.map +0 -1
- package/dist/chunks/rewardedUnlock-DUqYwXTr.js +0 -264
- package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
- package/dist/chunks/transcript-LG7E9UYE.js.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
var A = Object.defineProperty;
|
|
2
|
+
var S = (n, t, i) => t in n ? A(n, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : n[t] = i;
|
|
3
|
+
var c = (n, t, i) => S(n, typeof t != "symbol" ? t + "" : t, i);
|
|
4
|
+
import { c as z, r as L } from "./player-B7mYS--8.js";
|
|
5
|
+
import { a as q } from "./plugin-style-CPJELe-i.js";
|
|
6
|
+
const T = {
|
|
7
|
+
tr: {
|
|
8
|
+
interactivePoll: "Anket",
|
|
9
|
+
interactiveQuiz: "Soru",
|
|
10
|
+
interactiveCorrect: "Doğru!",
|
|
11
|
+
interactiveWrong: "Yanlış",
|
|
12
|
+
interactiveBuy: "Satın al",
|
|
13
|
+
interactiveGo: "Git",
|
|
14
|
+
interactiveSponsored: "Sponsorlu",
|
|
15
|
+
interactiveClose: "Kapat",
|
|
16
|
+
interactiveVotes: (n) => `%${n}`
|
|
17
|
+
},
|
|
18
|
+
en: {
|
|
19
|
+
interactivePoll: "Poll",
|
|
20
|
+
interactiveQuiz: "Quiz",
|
|
21
|
+
interactiveCorrect: "Correct!",
|
|
22
|
+
interactiveWrong: "Wrong",
|
|
23
|
+
interactiveBuy: "Buy now",
|
|
24
|
+
interactiveGo: "Open",
|
|
25
|
+
interactiveSponsored: "Sponsored",
|
|
26
|
+
interactiveClose: "Close",
|
|
27
|
+
interactiveVotes: (n) => `${n}%`
|
|
28
|
+
}
|
|
29
|
+
}, $ = '.hp-ia{position:absolute;z-index:24;width:min(320px,calc(100% - 24px));max-height:calc(100% - 100px);overflow-y:auto;box-sizing:border-box;padding:12px;border:1px solid rgba(255,255,255,.12);border-radius:12px;background:#0e0e12e0;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:#fff;box-shadow:0 16px 36px -14px #000000d9;font:13px/1.4 system-ui,-apple-system,sans-serif;animation:hp-redirect-in .3s cubic-bezier(.2,.8,.2,1)}.hp-ia[data-position=top-right]{top:12px;right:12px}.hp-ia[data-position=top-left]{top:12px;left:12px}.hp-ia[data-position=bottom-right]{right:12px;bottom:76px}.hp-ia[data-position=bottom-left]{left:12px;bottom:76px}.hp-ia[data-position=center]{top:50%;left:50%;transform:translate(-50%,-50%);animation:hp-redirect-fade .25s ease-out}.video-area[data-chrome-hidden] .hp-ia[data-position^=bottom]{bottom:12px}.video-area[data-compact] .hp-ia{width:calc(100% - 16px);max-height:calc(100% - 64px);padding:10px}.video-area[data-compact] .hp-ia[data-position$=right],.video-area[data-compact] .hp-ia[data-position$=left]{left:8px;right:8px}.video-area[data-compact] .hp-ia[data-position^=top]{top:8px}.video-area[data-compact] .hp-ia[data-position^=bottom]{bottom:56px}.hp-ia-close{position:absolute;top:8px;right:8px;display:grid;place-items:center;width:24px;height:24px;padding:0;border:0;border-radius:999px;background:#ffffff1f;color:#fff;font-size:12px;cursor:pointer}.hp-ia-close:hover{background:#ffffff3d}.hp-ia-label{display:block;margin-bottom:4px;color:var(--hp-color-accent, #fff);font:700 10px/1.2 system-ui,-apple-system,sans-serif;letter-spacing:.1em;text-transform:uppercase}.hp-ia-question{margin:0 28px 10px 0;font-weight:600;font-size:14px}.hp-ia-choices{display:grid;gap:6px}.hp-ia-choice{position:relative;display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;overflow:hidden;padding:8px 10px;border:1px solid rgba(255,255,255,.16);border-radius:8px;background:#ffffff0f;color:#fff;font:inherit;text-align:start;cursor:pointer;transition:background .15s,border-color .15s}.hp-ia-choice:hover:not(:disabled){background:#ffffff24}.hp-ia-choice:disabled{cursor:default}.hp-ia-choice[data-result]:before{content:"";position:absolute;inset:0 auto 0 0;width:var(--hp-ia-pct, 0%);background:#ffffff24;transition:width .6s cubic-bezier(.2,.8,.2,1)}.hp-ia-choice>span{position:relative}.hp-ia-choice[data-picked]{border-color:var(--hp-color-accent, #fff)}.hp-ia-choice[data-correct]{border-color:#2fbf71;background:#2fbf7138}.hp-ia-choice[data-wrong]{border-color:#e5484d;background:#e5484d38}.hp-ia-pct{flex:none;font-weight:600;font-variant-numeric:tabular-nums}.hp-ia-status{margin:8px 0 0;font-size:12.5px;opacity:.85}.hp-ia-status:empty{display:none}.hp-ia[data-type=product],.hp-ia[data-type=link]{padding:0}.hp-ia-card{display:flex;gap:10px;padding:8px 34px 8px 8px;color:#fff;text-decoration:none}.hp-ia-image{flex:none;width:72px;height:72px;border-radius:8px;object-fit:cover;background:#111}.hp-ia-body{display:flex;flex-direction:column;gap:2px;min-width:0}.hp-ia-body .hp-ia-label{margin-bottom:0}.hp-ia-title{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-weight:600}.hp-ia-sub{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;opacity:.7;font-size:12px}.hp-ia-price{display:flex;gap:6px;align-items:baseline}.hp-ia-price s{opacity:.55;font-size:12px}.hp-ia-cta{align-self:flex-start;margin-top:4px;padding:5px 12px;border-radius:999px;background:var(--hp-color-accent, #fff);color:var(--hp-color-on-accent, #000);font-weight:600;font-size:12px}.hp-ia-card:hover .hp-ia-cta{filter:brightness(.92)}.hp-ia-choice:focus-visible,.hp-ia-close:focus-visible,.hp-ia-card:focus-visible{outline:2px solid var(--hp-color-accent, #fff);outline-offset:2px}.hp-seek-marker.hp-ia-marker{background:var(--hp-ia-marker-color, #f5c518)}@media(prefers-reduced-motion:reduce){.hp-ia,.hp-ia-choice[data-result]:before{animation:none;transition:none}}', C = "hp-interactive:", E = 1.5;
|
|
30
|
+
function P(n, t) {
|
|
31
|
+
return typeof n == "string" ? { id: String(t), text: n } : { id: n.id ?? String(t), text: n.text };
|
|
32
|
+
}
|
|
33
|
+
function p(n, t, i) {
|
|
34
|
+
const e = document.createElement(n);
|
|
35
|
+
return e.className = t, i !== void 0 && (e.textContent = i), e;
|
|
36
|
+
}
|
|
37
|
+
class B {
|
|
38
|
+
constructor(t, i) {
|
|
39
|
+
c(this, "entries", []);
|
|
40
|
+
c(this, "active", null);
|
|
41
|
+
c(this, "markers", []);
|
|
42
|
+
c(this, "closeTimer", null);
|
|
43
|
+
c(this, "drawMarkers", () => {
|
|
44
|
+
for (const i of this.markers) i.remove();
|
|
45
|
+
this.markers = [];
|
|
46
|
+
const t = this.ctx.videoEl.duration;
|
|
47
|
+
if (!(this.options.markers === !1 || !Number.isFinite(t) || t <= 0))
|
|
48
|
+
for (const i of this.entries) {
|
|
49
|
+
if (i.item.time < 0 || i.item.time > t) continue;
|
|
50
|
+
const e = this.ctx.addSeekBarMarker(i.item.time / t, "hp-ia-marker", "question" in i.item ? i.item.question : i.item.title), o = i.item.markerColor ?? this.options.markerColor;
|
|
51
|
+
o && (e.style.backgroundColor = o), this.markers.push(e);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
/** Yeni kaynak: oturum durumu sıfırlanır. */
|
|
55
|
+
c(this, "onEmptied", () => {
|
|
56
|
+
this.hide(null);
|
|
57
|
+
for (const t of this.entries) t.done = !1;
|
|
58
|
+
});
|
|
59
|
+
c(this, "onAdStart", () => {
|
|
60
|
+
this.active && !this.active.answered && this.hide("timeout");
|
|
61
|
+
});
|
|
62
|
+
/** Geri sarınca sonraki öğeler yeniden gösterilebilir (cevaplanmış anket / quiz yine sorulmaz). */
|
|
63
|
+
c(this, "onSeeked", () => {
|
|
64
|
+
var i;
|
|
65
|
+
const t = this.ctx.videoEl.currentTime;
|
|
66
|
+
for (const e of this.entries) e.item.time > t + 0.1 && e !== ((i = this.active) == null ? void 0 : i.entry) && (e.done = !1);
|
|
67
|
+
this.onTime();
|
|
68
|
+
});
|
|
69
|
+
c(this, "onTime", () => {
|
|
70
|
+
const t = this.ctx.videoEl.currentTime, i = this.active;
|
|
71
|
+
if (i)
|
|
72
|
+
if (t < i.entry.item.time - 0.5) this.hide("seek");
|
|
73
|
+
else if (!i.answered && t >= i.shownAt + this.duration(i.entry.item)) this.hide("timeout");
|
|
74
|
+
else if (i.answered && this.entries.some((e) => !e.done && t >= e.item.time && t - e.item.time <= E)) this.hide(null);
|
|
75
|
+
else return;
|
|
76
|
+
if (!this.ctx.isAdActive()) {
|
|
77
|
+
for (const e of this.entries)
|
|
78
|
+
if (!(e.done || t < e.item.time) && (e.done = !0, !(t - e.item.time > E || this.remembered(e)))) {
|
|
79
|
+
this.show(e, t);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
this.ctx = t, this.options = i, q(t.overlayEl, "interactive", $), this.entries = i.items.map((o, s) => ({ item: o, id: o.id ?? `i${s}`, done: !1 }));
|
|
85
|
+
const e = t.videoEl;
|
|
86
|
+
e.addEventListener("timeupdate", this.onTime), e.addEventListener("seeked", this.onSeeked), e.addEventListener("loadedmetadata", this.drawMarkers), e.addEventListener("emptied", this.onEmptied), t.hostEl.addEventListener("hp:adstart", this.onAdStart), e.readyState >= 1 && this.drawMarkers();
|
|
87
|
+
}
|
|
88
|
+
/** Yalnızca fonksiyonlar değişti (ör. React'te her render'da yeni onAnswer). */
|
|
89
|
+
setOptions(t) {
|
|
90
|
+
this.options = t;
|
|
91
|
+
}
|
|
92
|
+
refreshLabels() {
|
|
93
|
+
var t, i;
|
|
94
|
+
(i = (t = this.active) == null ? void 0 : t.el.querySelector(".hp-ia-close")) == null || i.setAttribute("aria-label", this.ctx.i18n.interactiveClose);
|
|
95
|
+
}
|
|
96
|
+
destroy() {
|
|
97
|
+
const t = this.ctx.videoEl;
|
|
98
|
+
t.removeEventListener("timeupdate", this.onTime), t.removeEventListener("seeked", this.onSeeked), t.removeEventListener("loadedmetadata", this.drawMarkers), t.removeEventListener("emptied", this.onEmptied), this.ctx.hostEl.removeEventListener("hp:adstart", this.onAdStart), this.hide(null);
|
|
99
|
+
for (const i of this.markers) i.remove();
|
|
100
|
+
this.markers = [];
|
|
101
|
+
}
|
|
102
|
+
emit(t, i, e = {}) {
|
|
103
|
+
return this.ctx.hostEl.dispatchEvent(
|
|
104
|
+
new CustomEvent("hp:interactive", { detail: { state: t, id: i.id, type: i.item.type, ...e }, cancelable: t === "click" })
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
remembered(t) {
|
|
108
|
+
if (this.options.rememberAnswers === !1 || t.item.type !== "poll" && t.item.type !== "quiz") return !1;
|
|
109
|
+
try {
|
|
110
|
+
return localStorage.getItem(C + t.id) !== null;
|
|
111
|
+
} catch {
|
|
112
|
+
return !1;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
remember(t, i) {
|
|
116
|
+
if (this.options.rememberAnswers !== !1)
|
|
117
|
+
try {
|
|
118
|
+
localStorage.setItem(C + t.id, String(i));
|
|
119
|
+
} catch {
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
duration(t) {
|
|
123
|
+
return t.duration ?? (t.type === "poll" || t.type === "quiz" ? 15 : 8);
|
|
124
|
+
}
|
|
125
|
+
show(t, i) {
|
|
126
|
+
const e = t.item, o = p("div", "hp-ia");
|
|
127
|
+
o.setAttribute("part", `interactive interactive-${e.type}`), o.setAttribute("data-type", e.type), o.setAttribute("data-position", e.position ?? (e.type === "poll" || e.type === "quiz" ? "top-right" : "bottom-right")), o.setAttribute("role", "group");
|
|
128
|
+
for (const a of ["pointerdown", "click", "dblclick"]) o.addEventListener(a, (f) => f.stopPropagation());
|
|
129
|
+
if (o.addEventListener("keydown", (a) => a.stopPropagation()), e.dismissible !== !1) {
|
|
130
|
+
const a = p("button", "hp-ia-close");
|
|
131
|
+
a.type = "button", a.setAttribute("aria-label", this.ctx.i18n.interactiveClose), a.appendChild(z("close")), a.addEventListener("click", () => this.hide("user")), o.appendChild(a);
|
|
132
|
+
}
|
|
133
|
+
e.type === "poll" || e.type === "quiz" ? this.buildQuestion(o, t) : this.buildCard(o, t, e), this.ctx.overlayEl.appendChild(o);
|
|
134
|
+
const s = this.ctx.videoEl, r = !!e.pause && !s.paused;
|
|
135
|
+
r && s.pause(), this.active = { entry: t, el: o, shownAt: i, pausedByUs: r, answered: !1 }, this.emit("shown", t);
|
|
136
|
+
}
|
|
137
|
+
buildQuestion(t, i) {
|
|
138
|
+
const e = i.item, o = this.ctx.i18n;
|
|
139
|
+
t.appendChild(p("span", "hp-ia-label", e.type === "poll" ? o.interactivePoll : o.interactiveQuiz));
|
|
140
|
+
const s = p("p", "hp-ia-question", e.question);
|
|
141
|
+
s.id = `hp-ia-q-${i.id}`, t.setAttribute("aria-labelledby", s.id), t.appendChild(s);
|
|
142
|
+
const r = p("div", "hp-ia-choices"), a = e.choices.map(P), f = a.map((b, u) => {
|
|
143
|
+
const d = p("button", "hp-ia-choice");
|
|
144
|
+
return d.type = "button", d.appendChild(p("span", "hp-ia-choice-text", b.text)), d.addEventListener("click", () => void this.answer(i, u, a[u].id, f)), r.appendChild(d), d;
|
|
145
|
+
});
|
|
146
|
+
t.appendChild(r);
|
|
147
|
+
const l = p("p", "hp-ia-status");
|
|
148
|
+
l.setAttribute("aria-live", "polite"), t.appendChild(l);
|
|
149
|
+
}
|
|
150
|
+
async answer(t, i, e, o) {
|
|
151
|
+
var b, u, d, g, y, k;
|
|
152
|
+
const s = this.active;
|
|
153
|
+
if (!s || s.entry !== t || s.answered) return;
|
|
154
|
+
s.answered = !0;
|
|
155
|
+
const r = t.item, a = r.type === "quiz" ? i === r.answer : void 0;
|
|
156
|
+
this.remember(t, i);
|
|
157
|
+
for (const m of o) m.disabled = !0;
|
|
158
|
+
(b = o[i]) == null || b.setAttribute("data-picked", "");
|
|
159
|
+
const f = s.el.querySelector(".hp-ia-status");
|
|
160
|
+
this.emit("answer", t, { choice: i, choiceId: e, ...a !== void 0 ? { correct: a } : {} });
|
|
161
|
+
let l;
|
|
162
|
+
try {
|
|
163
|
+
l = await ((d = (u = this.options).onAnswer) == null ? void 0 : d.call(u, { item: r, id: t.id, choice: i, choiceId: e, correct: a }));
|
|
164
|
+
} catch {
|
|
165
|
+
l = void 0;
|
|
166
|
+
}
|
|
167
|
+
if (((g = this.active) == null ? void 0 : g.entry) === t) {
|
|
168
|
+
if (r.type === "quiz")
|
|
169
|
+
(y = o[r.answer]) == null || y.setAttribute("data-correct", ""), a || (k = o[i]) == null || k.setAttribute("data-wrong", ""), f && (f.textContent = `${a ? this.ctx.i18n.interactiveCorrect : this.ctx.i18n.interactiveWrong}${r.explanation ? ` ${r.explanation}` : ""}`);
|
|
170
|
+
else {
|
|
171
|
+
const m = Array.isArray(l) ? l : r.results ? r.results.map((x, h) => x + (h === i ? 1 : 0)) : null;
|
|
172
|
+
if (m) {
|
|
173
|
+
const x = m.reduce((h, v) => h + (Number.isFinite(v) && v > 0 ? v : 0), 0) || 1;
|
|
174
|
+
o.forEach((h, v) => {
|
|
175
|
+
const w = Math.round((m[v] ?? 0) / x * 100);
|
|
176
|
+
h.style.setProperty("--hp-ia-pct", `${w}%`), h.setAttribute("data-result", ""), h.appendChild(p("span", "hp-ia-pct", this.ctx.i18n.interactiveVotes(w)));
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
this.closeTimer = setTimeout(() => this.hide(null), r.type === "quiz" ? 5e3 : 3500);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
buildCard(t, i, e) {
|
|
184
|
+
const o = this.ctx.i18n, s = p("a", "hp-ia-card");
|
|
185
|
+
if (s.href = e.url, e.newTab !== !1 && (s.target = "_blank", s.rel = "noopener"), e.image) {
|
|
186
|
+
const a = p("img", "hp-ia-image");
|
|
187
|
+
a.src = e.image, a.alt = "", a.decoding = "async", a.addEventListener("error", () => a.remove()), s.appendChild(a);
|
|
188
|
+
}
|
|
189
|
+
const r = p("span", "hp-ia-body");
|
|
190
|
+
if (e.sponsored && r.appendChild(p("span", "hp-ia-label", o.interactiveSponsored)), r.appendChild(p("span", "hp-ia-title", e.title)), e.subtitle && r.appendChild(p("span", "hp-ia-sub", e.subtitle)), e.price || e.oldPrice) {
|
|
191
|
+
const a = p("span", "hp-ia-price");
|
|
192
|
+
e.price && a.appendChild(p("strong", "", e.price)), e.oldPrice && a.appendChild(p("s", "", e.oldPrice)), r.appendChild(a);
|
|
193
|
+
}
|
|
194
|
+
r.appendChild(p("span", "hp-ia-cta", e.cta ?? (e.type === "product" ? o.interactiveBuy : o.interactiveGo))), s.appendChild(r), s.addEventListener("click", (a) => {
|
|
195
|
+
this.emit("click", i, { url: e.url }) || a.preventDefault();
|
|
196
|
+
}), t.setAttribute("aria-label", e.title), t.appendChild(s);
|
|
197
|
+
}
|
|
198
|
+
hide(t) {
|
|
199
|
+
this.closeTimer && clearTimeout(this.closeTimer), this.closeTimer = null;
|
|
200
|
+
const i = this.active;
|
|
201
|
+
i && (this.active = null, i.el.remove(), t && this.emit("dismiss", i.entry, { reason: t }), i.pausedByUs && t !== "seek" && this.ctx.videoEl.play().catch(() => {
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
L(T);
|
|
206
|
+
function I(n, t) {
|
|
207
|
+
return new B(n, t);
|
|
208
|
+
}
|
|
209
|
+
export {
|
|
210
|
+
B as Interactive,
|
|
211
|
+
I as installInteractive
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=interactive-ClJC5Vyo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-ClJC5Vyo.js","sources":["../../src/plugins/interactive/strings.ts","../../src/plugins/interactive/Interactive.ts","../../src/plugins/interactive/index.ts"],"sourcesContent":["// Bu eklentinin metinleri — ana pakete girmez, eklenti yüklenince sözlüğe eklenir (bkz. i18n/index.ts).\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\ntype Strings = Pick<HopeLocaleStrings, 'interactivePoll' | 'interactiveQuiz' | 'interactiveCorrect' | 'interactiveWrong' | 'interactiveBuy' | 'interactiveGo' | 'interactiveSponsored' | 'interactiveClose' | 'interactiveVotes'>;\n\nexport const strings: { tr: Strings; en: Strings } = {\n tr: {\n interactivePoll: 'Anket',\n interactiveQuiz: 'Soru',\n interactiveCorrect: 'Doğru!',\n interactiveWrong: 'Yanlış',\n interactiveBuy: 'Satın al',\n interactiveGo: 'Git',\n interactiveSponsored: 'Sponsorlu',\n interactiveClose: 'Kapat',\n interactiveVotes: (percent) => `%${percent}`,\n },\n en: {\n interactivePoll: 'Poll',\n interactiveQuiz: 'Quiz',\n interactiveCorrect: 'Correct!',\n interactiveWrong: 'Wrong',\n interactiveBuy: 'Buy now',\n interactiveGo: 'Open',\n interactiveSponsored: 'Sponsored',\n interactiveClose: 'Close',\n interactiveVotes: (percent) => `${percent}%`,\n },\n};\n","import type { InteractiveCard, InteractiveChoice, InteractiveItem, InteractiveOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\nimport { adoptStyle } from '../../utils/plugin-style';\nimport css from './interactive.css?inline';\n\nexport interface InteractivePlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n isAdActive(): boolean;\n addSeekBarMarker(ratio: number, extraClass?: string, label?: string): HTMLElement;\n}\n\ninterface Entry {\n item: InteractiveItem;\n id: string;\n /** Bu oturumda gösterildi (ileri geri sarınca tekrar sorulmaz). */\n done: boolean;\n}\n\nconst STORE = 'hp-interactive:';\n/** Bu kadar saniye geç kalınırsa (ileri sarma) öğe atlanır. */\nconst LATE = 1.5;\n\nfunction choiceOf(c: string | InteractiveChoice, i: number): { id: string; text: string } {\n return typeof c === 'string' ? { id: String(i), text: c } : { id: c.id ?? String(i), text: c.text };\n}\n\nfunction el<K extends keyof HTMLElementTagNameMap>(tag: K, className: string, text?: string): HTMLElementTagNameMap[K] {\n const e = document.createElement(tag);\n e.className = className;\n if (text !== undefined) e.textContent = text;\n return e;\n}\n\n/**\n * Etkileşimli içerik: belirli saniyelerde anket, quiz, ürün ya da bağlantı kartı. Zamanlama videonun zamanıyla\n * işler (duraklatınca süre durur); ileri sarılıp geçilen öğe gösterilmez. Cevaplanan anket / quiz izleyiciye bir daha\n * sorulmaz (localStorage). Reklam oynarken gizlenir.\n */\nexport class Interactive {\n private entries: Entry[] = [];\n private active: { entry: Entry; el: HTMLElement; shownAt: number; pausedByUs: boolean; answered: boolean } | null = null;\n private markers: HTMLElement[] = [];\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private readonly ctx: InteractivePlayerContext,\n private options: InteractiveOptions\n ) {\n adoptStyle(ctx.overlayEl, 'interactive', css);\n this.entries = options.items.map((item, i) => ({ item, id: item.id ?? `i${i}`, done: false }));\n const v = ctx.videoEl;\n v.addEventListener('timeupdate', this.onTime);\n v.addEventListener('seeked', this.onSeeked);\n v.addEventListener('loadedmetadata', this.drawMarkers);\n v.addEventListener('emptied', this.onEmptied);\n ctx.hostEl.addEventListener('hp:adstart', this.onAdStart);\n if (v.readyState >= 1) this.drawMarkers();\n }\n\n /** Yalnızca fonksiyonlar değişti (ör. React'te her render'da yeni onAnswer). */\n setOptions(options: InteractiveOptions): void {\n this.options = options;\n }\n\n refreshLabels(): void {\n // Açık öğenin metinleri bir sonraki gösterimde dilden okunur; açık olanın kapat etiketi güncellenir.\n this.active?.el.querySelector('.hp-ia-close')?.setAttribute('aria-label', this.ctx.i18n.interactiveClose);\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('timeupdate', this.onTime);\n v.removeEventListener('seeked', this.onSeeked);\n v.removeEventListener('loadedmetadata', this.drawMarkers);\n v.removeEventListener('emptied', this.onEmptied);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAdStart);\n this.hide(null);\n for (const m of this.markers) m.remove();\n this.markers = [];\n }\n\n private emit(state: 'shown' | 'answer' | 'click' | 'dismiss', entry: Entry, extra: Record<string, unknown> = {}): boolean {\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:interactive', { detail: { state, id: entry.id, type: entry.item.type, ...extra }, cancelable: state === 'click' })\n );\n }\n\n private readonly drawMarkers = (): void => {\n for (const m of this.markers) m.remove();\n this.markers = [];\n const d = this.ctx.videoEl.duration;\n if (this.options.markers === false || !Number.isFinite(d) || d <= 0) return;\n for (const e of this.entries) {\n if (e.item.time < 0 || e.item.time > d) continue;\n const m = this.ctx.addSeekBarMarker(e.item.time / d, 'hp-ia-marker', 'question' in e.item ? e.item.question : e.item.title);\n const color = e.item.markerColor ?? this.options.markerColor;\n if (color) m.style.backgroundColor = color;\n this.markers.push(m);\n }\n };\n\n /** Yeni kaynak: oturum durumu sıfırlanır. */\n private readonly onEmptied = (): void => {\n this.hide(null);\n for (const e of this.entries) e.done = false;\n };\n\n private readonly onAdStart = (): void => {\n // Reklam açık öğeyi örtmesin — kapat, reklamdan sonra tekrar gösterilmez.\n if (this.active && !this.active.answered) this.hide('timeout');\n };\n\n private remembered(entry: Entry): boolean {\n if (this.options.rememberAnswers === false || (entry.item.type !== 'poll' && entry.item.type !== 'quiz')) return false;\n try {\n return localStorage.getItem(STORE + entry.id) !== null;\n } catch {\n return false;\n }\n }\n\n private remember(entry: Entry, choice: number): void {\n if (this.options.rememberAnswers === false) return;\n try {\n localStorage.setItem(STORE + entry.id, String(choice));\n } catch {\n /* depolama kapalı */\n }\n }\n\n private duration(item: InteractiveItem): number {\n return item.duration ?? (item.type === 'poll' || item.type === 'quiz' ? 15 : 8);\n }\n\n /** Geri sarınca sonraki öğeler yeniden gösterilebilir (cevaplanmış anket / quiz yine sorulmaz). */\n private readonly onSeeked = (): void => {\n const t = this.ctx.videoEl.currentTime;\n for (const e of this.entries) if (e.item.time > t + 0.1 && e !== this.active?.entry) e.done = false;\n this.onTime();\n };\n\n private readonly onTime = (): void => {\n const t = this.ctx.videoEl.currentTime;\n const a = this.active;\n if (a) {\n // Geri sarıldı ya da süresi doldu (cevaplanmış anket sonucu kendi zamanlayıcısıyla kapanır).\n if (t < a.entry.item.time - 0.5) this.hide('seek');\n else if (!a.answered && t >= a.shownAt + this.duration(a.entry.item)) this.hide('timeout');\n // Sonuç gösterilirken sıradaki öğenin zamanı geldi — sonucu kapat, yenisini göster.\n else if (a.answered && this.entries.some((e) => !e.done && t >= e.item.time && t - e.item.time <= LATE)) this.hide(null);\n else return;\n }\n if (this.ctx.isAdActive()) return;\n for (const e of this.entries) {\n if (e.done || t < e.item.time) continue;\n e.done = true;\n // İleri sarılıp geçildiyse ya da daha önce cevaplandıysa gösterme.\n if (t - e.item.time > LATE || this.remembered(e)) continue;\n this.show(e, t);\n return;\n }\n };\n\n private show(entry: Entry, t: number): void {\n const item = entry.item;\n const box = el('div', 'hp-ia');\n box.setAttribute('part', `interactive interactive-${item.type}`);\n box.setAttribute('data-type', item.type);\n box.setAttribute('data-position', item.position ?? (item.type === 'poll' || item.type === 'quiz' ? 'top-right' : 'bottom-right'));\n box.setAttribute('role', 'group');\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) box.addEventListener(ev, (e) => e.stopPropagation());\n box.addEventListener('keydown', (e) => e.stopPropagation());\n\n if (item.dismissible !== false) {\n const close = el('button', 'hp-ia-close');\n close.type = 'button';\n close.setAttribute('aria-label', this.ctx.i18n.interactiveClose);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => this.hide('user'));\n box.appendChild(close);\n }\n\n if (item.type === 'poll' || item.type === 'quiz') this.buildQuestion(box, entry);\n else this.buildCard(box, entry, item);\n\n this.ctx.overlayEl.appendChild(box);\n const v = this.ctx.videoEl;\n const pausedByUs = !!item.pause && !v.paused;\n if (pausedByUs) v.pause();\n this.active = { entry, el: box, shownAt: t, pausedByUs, answered: false };\n this.emit('shown', entry);\n }\n\n private buildQuestion(box: HTMLElement, entry: Entry): void {\n const item = entry.item as Extract<InteractiveItem, { type: 'poll' | 'quiz' }>;\n const i18n = this.ctx.i18n;\n box.appendChild(el('span', 'hp-ia-label', item.type === 'poll' ? i18n.interactivePoll : i18n.interactiveQuiz));\n const q = el('p', 'hp-ia-question', item.question);\n q.id = `hp-ia-q-${entry.id}`;\n box.setAttribute('aria-labelledby', q.id);\n box.appendChild(q);\n const list = el('div', 'hp-ia-choices');\n const choices = item.choices.map(choiceOf);\n const buttons = choices.map((c, i) => {\n const b = el('button', 'hp-ia-choice');\n b.type = 'button';\n b.appendChild(el('span', 'hp-ia-choice-text', c.text));\n b.addEventListener('click', () => void this.answer(entry, i, choices[i]!.id, buttons));\n list.appendChild(b);\n return b;\n });\n box.appendChild(list);\n const status = el('p', 'hp-ia-status');\n status.setAttribute('aria-live', 'polite');\n box.appendChild(status);\n }\n\n private async answer(entry: Entry, choice: number, choiceId: string, buttons: HTMLButtonElement[]): Promise<void> {\n const a = this.active;\n if (!a || a.entry !== entry || a.answered) return;\n a.answered = true;\n const item = entry.item as Extract<InteractiveItem, { type: 'poll' | 'quiz' }>;\n const correct = item.type === 'quiz' ? choice === item.answer : undefined;\n this.remember(entry, choice);\n for (const b of buttons) b.disabled = true;\n buttons[choice]?.setAttribute('data-picked', '');\n const status = a.el.querySelector<HTMLElement>('.hp-ia-status');\n this.emit('answer', entry, { choice, choiceId, ...(correct !== undefined ? { correct } : {}) });\n\n let results: number[] | void | undefined;\n try {\n results = await this.options.onAnswer?.({ item, id: entry.id, choice, choiceId, correct });\n } catch {\n results = undefined;\n }\n if (this.active?.entry !== entry) return;\n\n if (item.type === 'quiz') {\n buttons[item.answer]?.setAttribute('data-correct', '');\n if (!correct) buttons[choice]?.setAttribute('data-wrong', '');\n if (status) status.textContent = `${correct ? this.ctx.i18n.interactiveCorrect : this.ctx.i18n.interactiveWrong}${item.explanation ? ` ${item.explanation}` : ''}`;\n } else {\n // Sonuç: onAnswer'ın döndürdüğü, yoksa verilen dağılım + bu oy.\n const base = Array.isArray(results) ? results : item.results ? item.results.map((n, i) => n + (i === choice ? 1 : 0)) : null;\n if (base) {\n const total = base.reduce((s, n) => s + (Number.isFinite(n) && n > 0 ? n : 0), 0) || 1;\n buttons.forEach((b, i) => {\n const pct = Math.round(((base[i] ?? 0) / total) * 100);\n b.style.setProperty('--hp-ia-pct', `${pct}%`);\n b.setAttribute('data-result', '');\n b.appendChild(el('span', 'hp-ia-pct', this.ctx.i18n.interactiveVotes(pct)));\n });\n }\n }\n // Sonuç birkaç saniye görünür, sonra kapanır (duraklattıysak oynatma devam eder).\n this.closeTimer = setTimeout(() => this.hide(null), item.type === 'quiz' ? 5000 : 3500);\n }\n\n private buildCard(box: HTMLElement, entry: Entry, item: InteractiveCard): void {\n const i18n = this.ctx.i18n;\n const link = el('a', 'hp-ia-card');\n link.href = item.url;\n if (item.newTab !== false) {\n link.target = '_blank';\n link.rel = 'noopener';\n }\n if (item.image) {\n const img = el('img', 'hp-ia-image');\n img.src = item.image;\n img.alt = '';\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n link.appendChild(img);\n }\n const body = el('span', 'hp-ia-body');\n if (item.sponsored) body.appendChild(el('span', 'hp-ia-label', i18n.interactiveSponsored));\n body.appendChild(el('span', 'hp-ia-title', item.title));\n if (item.subtitle) body.appendChild(el('span', 'hp-ia-sub', item.subtitle));\n if (item.price || item.oldPrice) {\n const price = el('span', 'hp-ia-price');\n if (item.price) price.appendChild(el('strong', '', item.price));\n if (item.oldPrice) price.appendChild(el('s', '', item.oldPrice));\n body.appendChild(price);\n }\n body.appendChild(el('span', 'hp-ia-cta', item.cta ?? (item.type === 'product' ? i18n.interactiveBuy : i18n.interactiveGo)));\n link.appendChild(body);\n link.addEventListener('click', (e) => {\n // preventDefault → entegratör kendisi açar (sepete ekle, SPA router).\n if (!this.emit('click', entry, { url: item.url })) e.preventDefault();\n });\n box.setAttribute('aria-label', item.title);\n box.appendChild(link);\n }\n\n private hide(reason: 'user' | 'timeout' | 'seek' | null): void {\n if (this.closeTimer) clearTimeout(this.closeTimer);\n this.closeTimer = null;\n const a = this.active;\n if (!a) return;\n this.active = null;\n a.el.remove();\n if (reason) this.emit('dismiss', a.entry, { reason });\n if (a.pausedByUs && reason !== 'seek') void this.ctx.videoEl.play().catch(() => {});\n }\n}\n","import { registerLocaleStrings } from '../../i18n';\nimport { strings } from './strings';\nimport { Interactive, type InteractivePlayerContext } from './Interactive';\nimport type { InteractiveOptions } from '../../types';\n\nregisterLocaleStrings(strings);\n\nexport function installInteractive(ctx: InteractivePlayerContext, options: InteractiveOptions): Interactive {\n return new Interactive(ctx, options);\n}\n\nexport { Interactive };\nexport type { InteractivePlayerContext };\n"],"names":["strings","percent","STORE","LATE","choiceOf","c","i","el","tag","className","text","Interactive","ctx","options","__publicField","m","d","e","color","_a","a","adoptStyle","css","item","v","_b","state","entry","extra","choice","t","box","ev","close","createIcon","pausedByUs","i18n","q","list","choices","buttons","b","status","choiceId","correct","results","_c","_d","_e","_f","base","n","total","s","pct","link","img","body","price","reason","registerLocaleStrings","installInteractive"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var u = Object.defineProperty;
|
|
2
2
|
var m = (h, e, t) => e in h ? u(h, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[e] = t;
|
|
3
3
|
var s = (h, e, t) => m(h, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import { c as f } from "./player-
|
|
4
|
+
import { c as f } from "./player-B7mYS--8.js";
|
|
5
5
|
const b = {
|
|
6
6
|
enabled: !1,
|
|
7
7
|
mode: "rich",
|
|
@@ -204,4 +204,4 @@ export {
|
|
|
204
204
|
v as MarkProgress,
|
|
205
205
|
y as installMarkers
|
|
206
206
|
};
|
|
207
|
-
//# sourceMappingURL=markers-
|
|
207
|
+
//# sourceMappingURL=markers-D32rI-x-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markers-L69W3kj6.js","sources":["../../src/plugins/markers/MarkProgress.ts","../../src/plugins/markers/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { MarkerItem, MarkerPingOptions, MarkerPopupOptions, MarkersOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\nexport interface MarkersPlayerContext {\n videoEl: HTMLVideoElement;\n /** Popup overlay'in ekleneceği katman (shadow root içinde, video üzerinde). */\n overlayContainerEl: HTMLElement;\n /** Seek bar üzerinde işaretçi çizmek için — SeekBar.addMarker ile aynı imza. */\n addSeekBarMarker(ratio: number, extraClass?: string, label?: string): HTMLDivElement;\n i18n: HopeLocaleStrings;\n}\n\ninterface NormalizedMarker extends Required<Pick<MarkerItem, 'time'>> {\n idx: number;\n color?: string;\n label: string;\n pauseOnHit: boolean;\n once: boolean;\n tolerance: number;\n cooldownMs: number;\n action?: MarkerItem['action'];\n popup: MarkerPopupOptions | null;\n pingUrl: string;\n el?: HTMLElement;\n}\n\nconst POPUP_DEFAULTS: Required<MarkerPopupOptions> = {\n enabled: false,\n mode: 'rich',\n text: '',\n imageUrl: '',\n imageAlt: '',\n linkUrl: '',\n // Boş bırakılıyor (sentinel) — gerçek varsayılan metin showPopup()'ta\n // `ctx.i18n.markerLearnMore`/`markerContinue`'dan okunuyor, dil\n // değişimini takip edebilsin diye burada SABİT bir dilde gömülü değil.\n linkText: '',\n continueText: '',\n showContinue: true,\n showClose: true,\n autoplayOnClose: true,\n autoplayOnContinue: true,\n};\n\nconst PING_DEFAULTS: Required<MarkerPingOptions> = { enabled: false, url: '', method: 'GET', includeMarker: false };\n\n/** Zaman tabanlı seek bar işaretçileri — seek/jump koruması, once/cooldown, popup/ping/aksiyon. */\nexport class MarkProgress {\n private readonly markers: NormalizedMarker[];\n private readonly popupGlobal: Required<MarkerPopupOptions>;\n private readonly pingGlobal: Required<MarkerPingOptions>;\n private readonly triggerOnSeek: boolean;\n private readonly seekJumpThresholdSec: number;\n private readonly seekIgnoreWindowMs: number;\n /** `options.color` — öğede renk yoksa. */\n private readonly defaultColor: string | undefined;\n\n private hitSet = new Set<string>();\n private lastHitAt = new Map<string, number>();\n private lastTime = 0;\n private isSeeking = false;\n private ignoreUntilTs = 0;\n private popupEl: HTMLElement | null = null;\n\n constructor(\n private readonly ctx: MarkersPlayerContext,\n options: MarkersOptions\n ) {\n this.triggerOnSeek = options.triggerOnSeek === true;\n this.seekJumpThresholdSec = options.seekJumpThresholdSec ?? 1;\n this.seekIgnoreWindowMs = options.seekIgnoreWindowMs ?? 250;\n this.popupGlobal = { ...POPUP_DEFAULTS, ...options.popup };\n this.pingGlobal = { ...PING_DEFAULTS, ...options.ping };\n this.defaultColor = options.color;\n\n this.markers = (options.items || [])\n .map((m, idx) => this.normalize(m, idx))\n .filter((m) => Number.isFinite(m.time) && m.time >= 0)\n .sort((a, b) => a.time - b.time);\n\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n ctx.videoEl.addEventListener('seeking', this.onSeeking);\n ctx.videoEl.addEventListener('seeked', this.onSeeked);\n\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n /** Popup lazy oluşturulup yeniden kullanılıyor (`ensurePopup`) — zaten açıksa close butonunun statik etiketini tazeler. */\n refreshLabels(): void {\n const closeBtn = this.popupEl?.querySelector('button') as HTMLButtonElement | null;\n if (closeBtn) {\n closeBtn.setAttribute('aria-label', this.ctx.i18n.close);\n }\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.videoEl.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.videoEl.removeEventListener('seeking', this.onSeeking);\n this.ctx.videoEl.removeEventListener('seeked', this.onSeeked);\n this.markers.forEach((m) => m.el?.remove());\n this.popupEl?.remove();\n this.popupEl = null;\n this.hitSet.clear();\n this.lastHitAt.clear();\n }\n\n private normalize(m: MarkerItem, idx: number): NormalizedMarker {\n return {\n idx,\n time: Number(m.time),\n color: m.color ?? this.defaultColor,\n label: m.label ?? '',\n pauseOnHit: m.pauseOnHit ?? true,\n once: m.once ?? true,\n tolerance: m.tolerance ?? 0.25,\n cooldownMs: m.cooldownMs ?? 600,\n action: m.action,\n popup: m.popup ?? null,\n pingUrl: m.pingUrl ?? '',\n };\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.markers.forEach((m) => {\n if (m.el) return;\n const el = this.ctx.addSeekBarMarker(m.time / duration, '', m.label);\n if (m.color) el.style.backgroundColor = m.color;\n m.el = el;\n });\n\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n };\n\n private readonly onSeeking = (): void => {\n this.isSeeking = true;\n this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n };\n\n private readonly onSeeked = (): void => {\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n this.isSeeking = false;\n this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;\n };\n\n private readonly onTimeUpdate = (): void => {\n const now = Date.now();\n if (now < this.ignoreUntilTs) return;\n if (this.isSeeking) return;\n\n const t = this.ctx.videoEl.currentTime;\n if (!Number.isFinite(t)) return;\n\n const jumped = Math.abs(t - this.lastTime) >= this.seekJumpThresholdSec;\n if (jumped && !this.triggerOnSeek) {\n this.lastTime = t;\n return;\n }\n\n for (const m of this.markers) {\n const key = `${m.time}-${m.idx}`;\n if (m.once && this.hitSet.has(key)) continue;\n if (!m.once) {\n const last = this.lastHitAt.get(key) || 0;\n if (now - last < m.cooldownMs) continue;\n }\n\n const crossed = this.lastTime < m.time && t >= m.time - m.tolerance;\n if (!crossed) continue;\n\n if (m.once) this.hitSet.add(key);\n else this.lastHitAt.set(key, now);\n\n if (m.pauseOnHit) this.ctx.videoEl.pause();\n\n this.firePing(m);\n this.fireAction(m);\n\n const popupCfg = m.popup ? { ...this.popupGlobal, ...m.popup } : this.popupGlobal;\n if (popupCfg.enabled) {\n this.ctx.videoEl.pause();\n this.showPopup(popupCfg);\n }\n break;\n }\n\n this.lastTime = t;\n };\n\n private resolveUrlTemplate(url: string, m: NormalizedMarker): string {\n if (!url) return '';\n return url.replaceAll('{time}', encodeURIComponent(String(m.time))).replaceAll('{label}', encodeURIComponent(m.label));\n }\n\n private firePing(m: NormalizedMarker): void {\n const baseUrl = m.pingUrl || this.pingGlobal.url;\n const url = this.resolveUrlTemplate(baseUrl, m);\n if (!this.pingGlobal.enabled || !url) return;\n\n try {\n if (this.pingGlobal.method === 'POST') {\n fetch(url, {\n method: 'POST',\n keepalive: true,\n headers: this.pingGlobal.includeMarker ? { 'Content-Type': 'application/json' } : undefined,\n body: this.pingGlobal.includeMarker ? JSON.stringify({ time: m.time, label: m.label, ts: Date.now() }) : undefined,\n }).catch(() => {});\n } else {\n fetch(url, { method: 'GET', keepalive: true }).catch(() => {});\n }\n } catch {\n /* no-op */\n }\n }\n\n private fireAction(m: NormalizedMarker): void {\n const a = m.action;\n if (!a) return;\n\n if (a.type === 'log') {\n console.log('[HopePlayer markers]', a.name || 'marker_hit', { time: m.time, label: m.label }, a.payload);\n return;\n }\n\n if (a.type === 'datalayer') {\n try {\n const w = window as unknown as { dataLayer?: unknown[] };\n w.dataLayer = w.dataLayer || [];\n w.dataLayer.push({\n event: 'HopePlayerVideoEvents',\n trigger: a.name || 'marker_hit',\n marker: { time: m.time, label: m.label, color: m.color },\n payload: a.payload ?? {},\n ts: Date.now(),\n });\n } catch {\n /* no-op */\n }\n return;\n }\n\n if (a.type === 'custom') {\n const fn = a.name ? (window as unknown as Record<string, unknown>)[a.name] : null;\n if (typeof fn === 'function') {\n try {\n (fn as (ctx: unknown) => void)({ marker: m, payload: a.payload });\n } catch (err) {\n console.warn('[HopePlayer markers] custom action fonksiyonu hata verdi:', err);\n }\n } else {\n console.warn('[HopePlayer markers] custom action fonksiyonu bulunamadı: window.' + a.name);\n }\n }\n }\n\n private ensurePopup(): HTMLElement {\n if (this.popupEl) return this.popupEl;\n\n const overlay = document.createElement('div');\n overlay.setAttribute('part', 'marker-popup');\n overlay.className = 'hp:hidden hp:absolute hp:inset-0 hp:z-30 hp:items-center hp:justify-center hp:bg-black/70';\n\n const panel = document.createElement('div');\n panel.className = 'hp:relative hp:max-w-[85%] hp:bg-surface-elev hp:text-on-surface hp:rounded-lg hp:p-4 hp:text-center hp:shadow-xl';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.setAttribute('aria-label', this.ctx.i18n.close);\n closeBtn.className = 'hp:absolute hp:top-1 hp:right-1 hp:w-6 hp:h-6 hp:flex hp:items-center hp:justify-center hp:bg-transparent hp:border-0 hp:cursor-pointer hp:text-on-surface';\n closeBtn.appendChild(createIcon('close', 'hp:text-sm'));\n\n const mediaWrap = document.createElement('div');\n mediaWrap.className = 'hp:hidden hp:mb-2';\n const img = document.createElement('img');\n img.className = 'hp:max-w-full hp:rounded';\n mediaWrap.appendChild(img);\n\n const textEl = document.createElement('div');\n textEl.className = 'hp:text-sm hp:mb-2';\n\n const linkEl = document.createElement('a');\n linkEl.target = '_blank';\n linkEl.rel = 'noopener noreferrer';\n linkEl.className = 'hp:hidden hp:text-accent hp:underline hp:text-sm hp:block hp:mb-2';\n\n const continueBtn = document.createElement('button');\n continueBtn.type = 'button';\n continueBtn.className = 'hp:hidden hp:px-4 hp:py-1.5 hp:rounded hp:bg-accent hp:text-on-accent hp:border-0 hp:cursor-pointer hp:text-sm';\n\n panel.append(closeBtn, mediaWrap, textEl, linkEl, continueBtn);\n overlay.appendChild(panel);\n this.ctx.overlayContainerEl.appendChild(overlay);\n this.popupEl = overlay;\n return overlay;\n }\n\n private hidePopup(): void {\n this.popupEl?.classList.add('hp:hidden');\n this.popupEl?.classList.remove('hp:flex');\n }\n\n private safePlay(): void {\n void this.ctx.videoEl.play().catch(() => {});\n }\n\n private showPopup(cfg: Required<MarkerPopupOptions>): void {\n const el = this.ensurePopup();\n const textEl = el.querySelector('div.hp\\\\:text-sm.hp\\\\:mb-2:not(.hp\\\\:hidden)') as HTMLElement | null;\n const mediaWrap = el.querySelector('div.hp\\\\:mb-2') as HTMLElement | null;\n const img = el.querySelector('img') as HTMLImageElement | null;\n const linkEl = el.querySelector('a') as HTMLAnchorElement | null;\n const continueBtn = el.querySelectorAll('button')[1] as HTMLButtonElement | null;\n const closeBtn = el.querySelector('button') as HTMLButtonElement | null;\n\n if (closeBtn) closeBtn.style.display = cfg.showClose === false ? 'none' : '';\n if (textEl) textEl.textContent = cfg.text || '';\n\n const isRich = cfg.mode === 'rich';\n if (mediaWrap && img) {\n if (isRich && cfg.imageUrl) {\n mediaWrap.classList.remove('hp:hidden');\n img.src = cfg.imageUrl;\n img.alt = cfg.imageAlt || '';\n } else {\n mediaWrap.classList.add('hp:hidden');\n img.removeAttribute('src');\n }\n }\n\n if (linkEl) {\n if (isRich && cfg.linkUrl) {\n linkEl.classList.remove('hp:hidden');\n linkEl.href = cfg.linkUrl;\n linkEl.textContent = cfg.linkText || this.ctx.i18n.markerLearnMore;\n } else {\n linkEl.classList.add('hp:hidden');\n linkEl.removeAttribute('href');\n }\n }\n\n if (continueBtn) {\n if (cfg.showContinue) {\n continueBtn.classList.remove('hp:hidden');\n continueBtn.textContent = cfg.continueText || this.ctx.i18n.markerContinue;\n } else {\n continueBtn.classList.add('hp:hidden');\n }\n }\n\n const newClose = closeBtn?.cloneNode(true) as HTMLButtonElement | undefined;\n if (closeBtn && newClose) closeBtn.replaceWith(newClose);\n const newCont = continueBtn?.cloneNode(true) as HTMLButtonElement | undefined;\n if (continueBtn && newCont) continueBtn.replaceWith(newCont);\n\n newClose?.addEventListener('click', () => {\n this.hidePopup();\n if (cfg.autoplayOnClose) this.safePlay();\n });\n newCont?.addEventListener('click', () => {\n this.hidePopup();\n if (cfg.autoplayOnContinue) this.safePlay();\n });\n\n el.classList.remove('hp:hidden');\n el.classList.add('hp:flex');\n }\n}\n","import { MarkProgress, type MarkersPlayerContext } from './MarkProgress';\nimport type { MarkersOptions } from '../../types';\n\nexport function installMarkers(ctx: MarkersPlayerContext, options: MarkersOptions): MarkProgress {\n return new MarkProgress(ctx, options);\n}\n\nexport { MarkProgress };\nexport type { MarkersPlayerContext };\n"],"names":["POPUP_DEFAULTS","PING_DEFAULTS","MarkProgress","ctx","options","__publicField","duration","m","el","now","key","last","popupCfg","idx","a","b","closeBtn","_a","url","baseUrl","w","fn","err","overlay","panel","createIcon","mediaWrap","img","textEl","linkEl","continueBtn","_b","cfg","isRich","newClose","newCont","installMarkers"],"mappings":";;;;AA2BA,MAAMA,IAA+C;AAAA,EACjD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA;AAAA;AAAA;AAAA,EAIT,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,oBAAoB;AACxB,GAEMC,IAA6C,EAAE,SAAS,IAAO,KAAK,IAAI,QAAQ,OAAO,eAAe,GAAA;AAGrG,MAAMC,EAAa;AAAA,EAiBtB,YACqBC,GACjBC,GACF;AAnBe,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAET,IAAAA,EAAA,oCAAa,IAAA;AACb,IAAAA,EAAA,uCAAgB,IAAA;AAChB,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,iBAA8B;AA8DrB,IAAAA,EAAA,0BAAmB,MAAY;AAC5C,YAAMC,IAAW,KAAK,IAAI,QAAQ;AAClC,MAAI,CAAC,OAAO,SAASA,CAAQ,KAAKA,KAAY,MAE9C,KAAK,QAAQ,QAAQ,CAACC,MAAM;AACxB,YAAIA,EAAE,GAAI;AACV,cAAMC,IAAK,KAAK,IAAI,iBAAiBD,EAAE,OAAOD,GAAU,IAAIC,EAAE,KAAK;AACnE,QAAIA,EAAE,UAAOC,EAAG,MAAM,kBAAkBD,EAAE,QAC1CA,EAAE,KAAKC;AAAA,MACX,CAAC,GAED,KAAK,WAAW,KAAK,IAAI,QAAQ,eAAe;AAAA,IACpD;AAEiB,IAAAH,EAAA,mBAAY,MAAY;AACrC,WAAK,YAAY,IACjB,KAAK,gBAAgB,KAAK,IAAA,IAAQ,KAAK,oBACvC,KAAK,WAAW,KAAK,IAAI,QAAQ,eAAe;AAAA,IACpD;AAEiB,IAAAA,EAAA,kBAAW,MAAY;AACpC,WAAK,WAAW,KAAK,IAAI,QAAQ,eAAe,GAChD,KAAK,YAAY,IACjB,KAAK,gBAAgB,KAAK,IAAA,IAAQ,KAAK;AAAA,IAC3C;AAEiB,IAAAA,EAAA,sBAAe,MAAY;AACxC,YAAMI,IAAM,KAAK,IAAA;AAEjB,UADIA,IAAM,KAAK,iBACX,KAAK,UAAW;AAEpB,YAAM,IAAI,KAAK,IAAI,QAAQ;AAC3B,UAAI,CAAC,OAAO,SAAS,CAAC,EAAG;AAGzB,UADe,KAAK,IAAI,IAAI,KAAK,QAAQ,KAAK,KAAK,wBACrC,CAAC,KAAK,eAAe;AAC/B,aAAK,WAAW;AAChB;AAAA,MACJ;AAEA,iBAAWF,KAAK,KAAK,SAAS;AAC1B,cAAMG,IAAM,GAAGH,EAAE,IAAI,IAAIA,EAAE,GAAG;AAC9B,YAAIA,EAAE,QAAQ,KAAK,OAAO,IAAIG,CAAG,EAAG;AACpC,YAAI,CAACH,EAAE,MAAM;AACT,gBAAMI,IAAO,KAAK,UAAU,IAAID,CAAG,KAAK;AACxC,cAAID,IAAME,IAAOJ,EAAE,WAAY;AAAA,QACnC;AAGA,YAAI,EADY,KAAK,WAAWA,EAAE,QAAQ,KAAKA,EAAE,OAAOA,EAAE,WAC5C;AAEd,QAAIA,EAAE,OAAM,KAAK,OAAO,IAAIG,CAAG,IAC1B,KAAK,UAAU,IAAIA,GAAKD,CAAG,GAE5BF,EAAE,cAAY,KAAK,IAAI,QAAQ,MAAA,GAEnC,KAAK,SAASA,CAAC,GACf,KAAK,WAAWA,CAAC;AAEjB,cAAMK,IAAWL,EAAE,QAAQ,EAAE,GAAG,KAAK,aAAa,GAAGA,EAAE,MAAA,IAAU,KAAK;AACtE,QAAIK,EAAS,YACT,KAAK,IAAI,QAAQ,MAAA,GACjB,KAAK,UAAUA,CAAQ;AAE3B;AAAA,MACJ;AAEA,WAAK,WAAW;AAAA,IACpB;AA/HqB,SAAA,MAAAT,GAGjB,KAAK,gBAAgBC,EAAQ,kBAAkB,IAC/C,KAAK,uBAAuBA,EAAQ,wBAAwB,GAC5D,KAAK,qBAAqBA,EAAQ,sBAAsB,KACxD,KAAK,cAAc,EAAE,GAAGJ,GAAgB,GAAGI,EAAQ,MAAA,GACnD,KAAK,aAAa,EAAE,GAAGH,GAAe,GAAGG,EAAQ,KAAA,GACjD,KAAK,eAAeA,EAAQ,OAE5B,KAAK,WAAWA,EAAQ,SAAS,CAAA,GAC5B,IAAI,CAACG,GAAGM,MAAQ,KAAK,UAAUN,GAAGM,CAAG,CAAC,EACtC,OAAO,CAACN,MAAM,OAAO,SAASA,EAAE,IAAI,KAAKA,EAAE,QAAQ,CAAC,EACpD,KAAK,CAACO,GAAGC,MAAMD,EAAE,OAAOC,EAAE,IAAI,GAEnCZ,EAAI,QAAQ,iBAAiB,kBAAkB,KAAK,gBAAgB,GACpEA,EAAI,QAAQ,iBAAiB,cAAc,KAAK,YAAY,GAC5DA,EAAI,QAAQ,iBAAiB,WAAW,KAAK,SAAS,GACtDA,EAAI,QAAQ,iBAAiB,UAAU,KAAK,QAAQ,GAEhDA,EAAI,QAAQ,cAAc,UAAQ,iBAAA;AAAA,EAC1C;AAAA;AAAA,EAGA,gBAAsB;;AAClB,UAAMa,KAAWC,IAAA,KAAK,YAAL,gBAAAA,EAAc,cAAc;AAC7C,IAAID,KACAA,EAAS,aAAa,cAAc,KAAK,IAAI,KAAK,KAAK;AAAA,EAE/D;AAAA,EAEA,UAAgB;;AACZ,SAAK,IAAI,QAAQ,oBAAoB,kBAAkB,KAAK,gBAAgB,GAC5E,KAAK,IAAI,QAAQ,oBAAoB,cAAc,KAAK,YAAY,GACpE,KAAK,IAAI,QAAQ,oBAAoB,WAAW,KAAK,SAAS,GAC9D,KAAK,IAAI,QAAQ,oBAAoB,UAAU,KAAK,QAAQ,GAC5D,KAAK,QAAQ,QAAQ,CAACT;;AAAM,cAAAU,IAAAV,EAAE,OAAF,gBAAAU,EAAM;AAAA,KAAQ,IAC1CA,IAAA,KAAK,YAAL,QAAAA,EAAc,UACd,KAAK,UAAU,MACf,KAAK,OAAO,MAAA,GACZ,KAAK,UAAU,MAAA;AAAA,EACnB;AAAA,EAEQ,UAAUV,GAAeM,GAA+B;AAC5D,WAAO;AAAA,MACH,KAAAA;AAAA,MACA,MAAM,OAAON,EAAE,IAAI;AAAA,MACnB,OAAOA,EAAE,SAAS,KAAK;AAAA,MACvB,OAAOA,EAAE,SAAS;AAAA,MAClB,YAAYA,EAAE,cAAc;AAAA,MAC5B,MAAMA,EAAE,QAAQ;AAAA,MAChB,WAAWA,EAAE,aAAa;AAAA,MAC1B,YAAYA,EAAE,cAAc;AAAA,MAC5B,QAAQA,EAAE;AAAA,MACV,OAAOA,EAAE,SAAS;AAAA,MAClB,SAASA,EAAE,WAAW;AAAA,IAAA;AAAA,EAE9B;AAAA,EAwEQ,mBAAmBW,GAAaX,GAA6B;AACjE,WAAKW,IACEA,EAAI,WAAW,UAAU,mBAAmB,OAAOX,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,WAAW,mBAAmBA,EAAE,KAAK,CAAC,IADpG;AAAA,EAErB;AAAA,EAEQ,SAASA,GAA2B;AACxC,UAAMY,IAAUZ,EAAE,WAAW,KAAK,WAAW,KACvCW,IAAM,KAAK,mBAAmBC,GAASZ,CAAC;AAC9C,QAAI,GAAC,KAAK,WAAW,WAAW,CAACW;AAEjC,UAAI;AACA,QAAI,KAAK,WAAW,WAAW,SAC3B,MAAMA,GAAK;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,SAAS,KAAK,WAAW,gBAAgB,EAAE,gBAAgB,uBAAuB;AAAA,UAClF,MAAM,KAAK,WAAW,gBAAgB,KAAK,UAAU,EAAE,MAAMX,EAAE,MAAM,OAAOA,EAAE,OAAO,IAAI,KAAK,IAAA,EAAI,CAAG,IAAI;AAAA,QAAA,CAC5G,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC,IAEjB,MAAMW,GAAK,EAAE,QAAQ,OAAO,WAAW,GAAA,CAAM,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAErE,QAAQ;AAAA,MAER;AAAA,EACJ;AAAA,EAEQ,WAAWX,GAA2B;AAC1C,UAAMO,IAAIP,EAAE;AACZ,QAAKO,GAEL;AAAA,UAAIA,EAAE,SAAS,OAAO;AAClB,gBAAQ,IAAI,wBAAwBA,EAAE,QAAQ,cAAc,EAAE,MAAMP,EAAE,MAAM,OAAOA,EAAE,MAAA,GAASO,EAAE,OAAO;AACvG;AAAA,MACJ;AAEA,UAAIA,EAAE,SAAS,aAAa;AACxB,YAAI;AACA,gBAAMM,IAAI;AACV,UAAAA,EAAE,YAAYA,EAAE,aAAa,CAAA,GAC7BA,EAAE,UAAU,KAAK;AAAA,YACb,OAAO;AAAA,YACP,SAASN,EAAE,QAAQ;AAAA,YACnB,QAAQ,EAAE,MAAMP,EAAE,MAAM,OAAOA,EAAE,OAAO,OAAOA,EAAE,MAAA;AAAA,YACjD,SAASO,EAAE,WAAW,CAAA;AAAA,YACtB,IAAI,KAAK,IAAA;AAAA,UAAI,CAChB;AAAA,QACL,QAAQ;AAAA,QAER;AACA;AAAA,MACJ;AAEA,UAAIA,EAAE,SAAS,UAAU;AACrB,cAAMO,IAAKP,EAAE,OAAQ,OAA8CA,EAAE,IAAI,IAAI;AAC7E,YAAI,OAAOO,KAAO;AACd,cAAI;AACC,YAAAA,EAA8B,EAAE,QAAQd,GAAG,SAASO,EAAE,SAAS;AAAA,UACpE,SAASQ,GAAK;AACV,oBAAQ,KAAK,6DAA6DA,CAAG;AAAA,UACjF;AAAA;AAEA,kBAAQ,KAAK,sEAAsER,EAAE,IAAI;AAAA,MAEjG;AAAA;AAAA,EACJ;AAAA,EAEQ,cAA2B;AAC/B,QAAI,KAAK,QAAS,QAAO,KAAK;AAE9B,UAAMS,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,aAAa,QAAQ,cAAc,GAC3CA,EAAQ,YAAY;AAEpB,UAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,qHAClBA,EAAM,aAAa,QAAQ,QAAQ,GACnCA,EAAM,aAAa,cAAc,MAAM;AAEvC,UAAMR,IAAW,SAAS,cAAc,QAAQ;AAChD,IAAAA,EAAS,OAAO,UAChBA,EAAS,aAAa,cAAc,KAAK,IAAI,KAAK,KAAK,GACvDA,EAAS,YAAY,8JACrBA,EAAS,YAAYS,EAAW,SAAS,YAAY,CAAC;AAEtD,UAAMC,IAAY,SAAS,cAAc,KAAK;AAC9C,IAAAA,EAAU,YAAY;AACtB,UAAMC,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY,4BAChBD,EAAU,YAAYC,CAAG;AAEzB,UAAMC,IAAS,SAAS,cAAc,KAAK;AAC3C,IAAAA,EAAO,YAAY;AAEnB,UAAMC,IAAS,SAAS,cAAc,GAAG;AACzC,IAAAA,EAAO,SAAS,UAChBA,EAAO,MAAM,uBACbA,EAAO,YAAY;AAEnB,UAAMC,IAAc,SAAS,cAAc,QAAQ;AACnD,WAAAA,EAAY,OAAO,UACnBA,EAAY,YAAY,kHAExBN,EAAM,OAAOR,GAAUU,GAAWE,GAAQC,GAAQC,CAAW,GAC7DP,EAAQ,YAAYC,CAAK,GACzB,KAAK,IAAI,mBAAmB,YAAYD,CAAO,GAC/C,KAAK,UAAUA,GACRA;AAAA,EACX;AAAA,EAEQ,YAAkB;;AACtB,KAAAN,IAAA,KAAK,YAAL,QAAAA,EAAc,UAAU,IAAI,eAC5Bc,IAAA,KAAK,YAAL,QAAAA,EAAc,UAAU,OAAO;AAAA,EACnC;AAAA,EAEQ,WAAiB;AACrB,IAAK,KAAK,IAAI,QAAQ,KAAA,EAAO,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/C;AAAA,EAEQ,UAAUC,GAAyC;AACvD,UAAMxB,IAAK,KAAK,YAAA,GACVoB,IAASpB,EAAG,cAAc,8CAA8C,GACxEkB,IAAYlB,EAAG,cAAc,eAAe,GAC5CmB,IAAMnB,EAAG,cAAc,KAAK,GAC5BqB,IAASrB,EAAG,cAAc,GAAG,GAC7BsB,IAActB,EAAG,iBAAiB,QAAQ,EAAE,CAAC,GAC7CQ,IAAWR,EAAG,cAAc,QAAQ;AAE1C,IAAIQ,MAAUA,EAAS,MAAM,UAAUgB,EAAI,cAAc,KAAQ,SAAS,KACtEJ,MAAQA,EAAO,cAAcI,EAAI,QAAQ;AAE7C,UAAMC,IAASD,EAAI,SAAS;AAC5B,IAAIN,KAAaC,MACTM,KAAUD,EAAI,YACdN,EAAU,UAAU,OAAO,WAAW,GACtCC,EAAI,MAAMK,EAAI,UACdL,EAAI,MAAMK,EAAI,YAAY,OAE1BN,EAAU,UAAU,IAAI,WAAW,GACnCC,EAAI,gBAAgB,KAAK,KAI7BE,MACII,KAAUD,EAAI,WACdH,EAAO,UAAU,OAAO,WAAW,GACnCA,EAAO,OAAOG,EAAI,SAClBH,EAAO,cAAcG,EAAI,YAAY,KAAK,IAAI,KAAK,oBAEnDH,EAAO,UAAU,IAAI,WAAW,GAChCA,EAAO,gBAAgB,MAAM,KAIjCC,MACIE,EAAI,gBACJF,EAAY,UAAU,OAAO,WAAW,GACxCA,EAAY,cAAcE,EAAI,gBAAgB,KAAK,IAAI,KAAK,kBAE5DF,EAAY,UAAU,IAAI,WAAW;AAI7C,UAAMI,IAAWlB,KAAA,gBAAAA,EAAU,UAAU;AACrC,IAAIA,KAAYkB,KAAUlB,EAAS,YAAYkB,CAAQ;AACvD,UAAMC,IAAUL,KAAA,gBAAAA,EAAa,UAAU;AACvC,IAAIA,KAAeK,KAASL,EAAY,YAAYK,CAAO,GAE3DD,KAAA,QAAAA,EAAU,iBAAiB,SAAS,MAAM;AACtC,WAAK,UAAA,GACDF,EAAI,mBAAiB,KAAK,SAAA;AAAA,IAClC,IACAG,KAAA,QAAAA,EAAS,iBAAiB,SAAS,MAAM;AACrC,WAAK,UAAA,GACDH,EAAI,sBAAoB,KAAK,SAAA;AAAA,IACrC,IAEAxB,EAAG,UAAU,OAAO,WAAW,GAC/BA,EAAG,UAAU,IAAI,SAAS;AAAA,EAC9B;AACJ;ACnXO,SAAS4B,EAAejC,GAA2BC,GAAuC;AAC7F,SAAO,IAAIF,EAAaC,GAAKC,CAAO;AACxC;"}
|
|
1
|
+
{"version":3,"file":"markers-D32rI-x-.js","sources":["../../src/plugins/markers/MarkProgress.ts","../../src/plugins/markers/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { MarkerItem, MarkerPingOptions, MarkerPopupOptions, MarkersOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\nexport interface MarkersPlayerContext {\n videoEl: HTMLVideoElement;\n /** Popup overlay'in ekleneceği katman (shadow root içinde, video üzerinde). */\n overlayContainerEl: HTMLElement;\n /** Seek bar üzerinde işaretçi çizmek için — SeekBar.addMarker ile aynı imza. */\n addSeekBarMarker(ratio: number, extraClass?: string, label?: string): HTMLDivElement;\n i18n: HopeLocaleStrings;\n}\n\ninterface NormalizedMarker extends Required<Pick<MarkerItem, 'time'>> {\n idx: number;\n color?: string;\n label: string;\n pauseOnHit: boolean;\n once: boolean;\n tolerance: number;\n cooldownMs: number;\n action?: MarkerItem['action'];\n popup: MarkerPopupOptions | null;\n pingUrl: string;\n el?: HTMLElement;\n}\n\nconst POPUP_DEFAULTS: Required<MarkerPopupOptions> = {\n enabled: false,\n mode: 'rich',\n text: '',\n imageUrl: '',\n imageAlt: '',\n linkUrl: '',\n // Boş bırakılıyor (sentinel) — gerçek varsayılan metin showPopup()'ta\n // `ctx.i18n.markerLearnMore`/`markerContinue`'dan okunuyor, dil\n // değişimini takip edebilsin diye burada SABİT bir dilde gömülü değil.\n linkText: '',\n continueText: '',\n showContinue: true,\n showClose: true,\n autoplayOnClose: true,\n autoplayOnContinue: true,\n};\n\nconst PING_DEFAULTS: Required<MarkerPingOptions> = { enabled: false, url: '', method: 'GET', includeMarker: false };\n\n/** Zaman tabanlı seek bar işaretçileri — seek/jump koruması, once/cooldown, popup/ping/aksiyon. */\nexport class MarkProgress {\n private readonly markers: NormalizedMarker[];\n private readonly popupGlobal: Required<MarkerPopupOptions>;\n private readonly pingGlobal: Required<MarkerPingOptions>;\n private readonly triggerOnSeek: boolean;\n private readonly seekJumpThresholdSec: number;\n private readonly seekIgnoreWindowMs: number;\n /** `options.color` — öğede renk yoksa. */\n private readonly defaultColor: string | undefined;\n\n private hitSet = new Set<string>();\n private lastHitAt = new Map<string, number>();\n private lastTime = 0;\n private isSeeking = false;\n private ignoreUntilTs = 0;\n private popupEl: HTMLElement | null = null;\n\n constructor(\n private readonly ctx: MarkersPlayerContext,\n options: MarkersOptions\n ) {\n this.triggerOnSeek = options.triggerOnSeek === true;\n this.seekJumpThresholdSec = options.seekJumpThresholdSec ?? 1;\n this.seekIgnoreWindowMs = options.seekIgnoreWindowMs ?? 250;\n this.popupGlobal = { ...POPUP_DEFAULTS, ...options.popup };\n this.pingGlobal = { ...PING_DEFAULTS, ...options.ping };\n this.defaultColor = options.color;\n\n this.markers = (options.items || [])\n .map((m, idx) => this.normalize(m, idx))\n .filter((m) => Number.isFinite(m.time) && m.time >= 0)\n .sort((a, b) => a.time - b.time);\n\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n ctx.videoEl.addEventListener('seeking', this.onSeeking);\n ctx.videoEl.addEventListener('seeked', this.onSeeked);\n\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n /** Popup lazy oluşturulup yeniden kullanılıyor (`ensurePopup`) — zaten açıksa close butonunun statik etiketini tazeler. */\n refreshLabels(): void {\n const closeBtn = this.popupEl?.querySelector('button') as HTMLButtonElement | null;\n if (closeBtn) {\n closeBtn.setAttribute('aria-label', this.ctx.i18n.close);\n }\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.videoEl.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.videoEl.removeEventListener('seeking', this.onSeeking);\n this.ctx.videoEl.removeEventListener('seeked', this.onSeeked);\n this.markers.forEach((m) => m.el?.remove());\n this.popupEl?.remove();\n this.popupEl = null;\n this.hitSet.clear();\n this.lastHitAt.clear();\n }\n\n private normalize(m: MarkerItem, idx: number): NormalizedMarker {\n return {\n idx,\n time: Number(m.time),\n color: m.color ?? this.defaultColor,\n label: m.label ?? '',\n pauseOnHit: m.pauseOnHit ?? true,\n once: m.once ?? true,\n tolerance: m.tolerance ?? 0.25,\n cooldownMs: m.cooldownMs ?? 600,\n action: m.action,\n popup: m.popup ?? null,\n pingUrl: m.pingUrl ?? '',\n };\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.markers.forEach((m) => {\n if (m.el) return;\n const el = this.ctx.addSeekBarMarker(m.time / duration, '', m.label);\n if (m.color) el.style.backgroundColor = m.color;\n m.el = el;\n });\n\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n };\n\n private readonly onSeeking = (): void => {\n this.isSeeking = true;\n this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n };\n\n private readonly onSeeked = (): void => {\n this.lastTime = this.ctx.videoEl.currentTime || 0;\n this.isSeeking = false;\n this.ignoreUntilTs = Date.now() + this.seekIgnoreWindowMs;\n };\n\n private readonly onTimeUpdate = (): void => {\n const now = Date.now();\n if (now < this.ignoreUntilTs) return;\n if (this.isSeeking) return;\n\n const t = this.ctx.videoEl.currentTime;\n if (!Number.isFinite(t)) return;\n\n const jumped = Math.abs(t - this.lastTime) >= this.seekJumpThresholdSec;\n if (jumped && !this.triggerOnSeek) {\n this.lastTime = t;\n return;\n }\n\n for (const m of this.markers) {\n const key = `${m.time}-${m.idx}`;\n if (m.once && this.hitSet.has(key)) continue;\n if (!m.once) {\n const last = this.lastHitAt.get(key) || 0;\n if (now - last < m.cooldownMs) continue;\n }\n\n const crossed = this.lastTime < m.time && t >= m.time - m.tolerance;\n if (!crossed) continue;\n\n if (m.once) this.hitSet.add(key);\n else this.lastHitAt.set(key, now);\n\n if (m.pauseOnHit) this.ctx.videoEl.pause();\n\n this.firePing(m);\n this.fireAction(m);\n\n const popupCfg = m.popup ? { ...this.popupGlobal, ...m.popup } : this.popupGlobal;\n if (popupCfg.enabled) {\n this.ctx.videoEl.pause();\n this.showPopup(popupCfg);\n }\n break;\n }\n\n this.lastTime = t;\n };\n\n private resolveUrlTemplate(url: string, m: NormalizedMarker): string {\n if (!url) return '';\n return url.replaceAll('{time}', encodeURIComponent(String(m.time))).replaceAll('{label}', encodeURIComponent(m.label));\n }\n\n private firePing(m: NormalizedMarker): void {\n const baseUrl = m.pingUrl || this.pingGlobal.url;\n const url = this.resolveUrlTemplate(baseUrl, m);\n if (!this.pingGlobal.enabled || !url) return;\n\n try {\n if (this.pingGlobal.method === 'POST') {\n fetch(url, {\n method: 'POST',\n keepalive: true,\n headers: this.pingGlobal.includeMarker ? { 'Content-Type': 'application/json' } : undefined,\n body: this.pingGlobal.includeMarker ? JSON.stringify({ time: m.time, label: m.label, ts: Date.now() }) : undefined,\n }).catch(() => {});\n } else {\n fetch(url, { method: 'GET', keepalive: true }).catch(() => {});\n }\n } catch {\n /* no-op */\n }\n }\n\n private fireAction(m: NormalizedMarker): void {\n const a = m.action;\n if (!a) return;\n\n if (a.type === 'log') {\n console.log('[HopePlayer markers]', a.name || 'marker_hit', { time: m.time, label: m.label }, a.payload);\n return;\n }\n\n if (a.type === 'datalayer') {\n try {\n const w = window as unknown as { dataLayer?: unknown[] };\n w.dataLayer = w.dataLayer || [];\n w.dataLayer.push({\n event: 'HopePlayerVideoEvents',\n trigger: a.name || 'marker_hit',\n marker: { time: m.time, label: m.label, color: m.color },\n payload: a.payload ?? {},\n ts: Date.now(),\n });\n } catch {\n /* no-op */\n }\n return;\n }\n\n if (a.type === 'custom') {\n const fn = a.name ? (window as unknown as Record<string, unknown>)[a.name] : null;\n if (typeof fn === 'function') {\n try {\n (fn as (ctx: unknown) => void)({ marker: m, payload: a.payload });\n } catch (err) {\n console.warn('[HopePlayer markers] custom action fonksiyonu hata verdi:', err);\n }\n } else {\n console.warn('[HopePlayer markers] custom action fonksiyonu bulunamadı: window.' + a.name);\n }\n }\n }\n\n private ensurePopup(): HTMLElement {\n if (this.popupEl) return this.popupEl;\n\n const overlay = document.createElement('div');\n overlay.setAttribute('part', 'marker-popup');\n overlay.className = 'hp:hidden hp:absolute hp:inset-0 hp:z-30 hp:items-center hp:justify-center hp:bg-black/70';\n\n const panel = document.createElement('div');\n panel.className = 'hp:relative hp:max-w-[85%] hp:bg-surface-elev hp:text-on-surface hp:rounded-lg hp:p-4 hp:text-center hp:shadow-xl';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.setAttribute('aria-label', this.ctx.i18n.close);\n closeBtn.className = 'hp:absolute hp:top-1 hp:right-1 hp:w-6 hp:h-6 hp:flex hp:items-center hp:justify-center hp:bg-transparent hp:border-0 hp:cursor-pointer hp:text-on-surface';\n closeBtn.appendChild(createIcon('close', 'hp:text-sm'));\n\n const mediaWrap = document.createElement('div');\n mediaWrap.className = 'hp:hidden hp:mb-2';\n const img = document.createElement('img');\n img.className = 'hp:max-w-full hp:rounded';\n mediaWrap.appendChild(img);\n\n const textEl = document.createElement('div');\n textEl.className = 'hp:text-sm hp:mb-2';\n\n const linkEl = document.createElement('a');\n linkEl.target = '_blank';\n linkEl.rel = 'noopener noreferrer';\n linkEl.className = 'hp:hidden hp:text-accent hp:underline hp:text-sm hp:block hp:mb-2';\n\n const continueBtn = document.createElement('button');\n continueBtn.type = 'button';\n continueBtn.className = 'hp:hidden hp:px-4 hp:py-1.5 hp:rounded hp:bg-accent hp:text-on-accent hp:border-0 hp:cursor-pointer hp:text-sm';\n\n panel.append(closeBtn, mediaWrap, textEl, linkEl, continueBtn);\n overlay.appendChild(panel);\n this.ctx.overlayContainerEl.appendChild(overlay);\n this.popupEl = overlay;\n return overlay;\n }\n\n private hidePopup(): void {\n this.popupEl?.classList.add('hp:hidden');\n this.popupEl?.classList.remove('hp:flex');\n }\n\n private safePlay(): void {\n void this.ctx.videoEl.play().catch(() => {});\n }\n\n private showPopup(cfg: Required<MarkerPopupOptions>): void {\n const el = this.ensurePopup();\n const textEl = el.querySelector('div.hp\\\\:text-sm.hp\\\\:mb-2:not(.hp\\\\:hidden)') as HTMLElement | null;\n const mediaWrap = el.querySelector('div.hp\\\\:mb-2') as HTMLElement | null;\n const img = el.querySelector('img') as HTMLImageElement | null;\n const linkEl = el.querySelector('a') as HTMLAnchorElement | null;\n const continueBtn = el.querySelectorAll('button')[1] as HTMLButtonElement | null;\n const closeBtn = el.querySelector('button') as HTMLButtonElement | null;\n\n if (closeBtn) closeBtn.style.display = cfg.showClose === false ? 'none' : '';\n if (textEl) textEl.textContent = cfg.text || '';\n\n const isRich = cfg.mode === 'rich';\n if (mediaWrap && img) {\n if (isRich && cfg.imageUrl) {\n mediaWrap.classList.remove('hp:hidden');\n img.src = cfg.imageUrl;\n img.alt = cfg.imageAlt || '';\n } else {\n mediaWrap.classList.add('hp:hidden');\n img.removeAttribute('src');\n }\n }\n\n if (linkEl) {\n if (isRich && cfg.linkUrl) {\n linkEl.classList.remove('hp:hidden');\n linkEl.href = cfg.linkUrl;\n linkEl.textContent = cfg.linkText || this.ctx.i18n.markerLearnMore;\n } else {\n linkEl.classList.add('hp:hidden');\n linkEl.removeAttribute('href');\n }\n }\n\n if (continueBtn) {\n if (cfg.showContinue) {\n continueBtn.classList.remove('hp:hidden');\n continueBtn.textContent = cfg.continueText || this.ctx.i18n.markerContinue;\n } else {\n continueBtn.classList.add('hp:hidden');\n }\n }\n\n const newClose = closeBtn?.cloneNode(true) as HTMLButtonElement | undefined;\n if (closeBtn && newClose) closeBtn.replaceWith(newClose);\n const newCont = continueBtn?.cloneNode(true) as HTMLButtonElement | undefined;\n if (continueBtn && newCont) continueBtn.replaceWith(newCont);\n\n newClose?.addEventListener('click', () => {\n this.hidePopup();\n if (cfg.autoplayOnClose) this.safePlay();\n });\n newCont?.addEventListener('click', () => {\n this.hidePopup();\n if (cfg.autoplayOnContinue) this.safePlay();\n });\n\n el.classList.remove('hp:hidden');\n el.classList.add('hp:flex');\n }\n}\n","import { MarkProgress, type MarkersPlayerContext } from './MarkProgress';\nimport type { MarkersOptions } from '../../types';\n\nexport function installMarkers(ctx: MarkersPlayerContext, options: MarkersOptions): MarkProgress {\n return new MarkProgress(ctx, options);\n}\n\nexport { MarkProgress };\nexport type { MarkersPlayerContext };\n"],"names":["POPUP_DEFAULTS","PING_DEFAULTS","MarkProgress","ctx","options","__publicField","duration","m","el","now","key","last","popupCfg","idx","a","b","closeBtn","_a","url","baseUrl","w","fn","err","overlay","panel","createIcon","mediaWrap","img","textEl","linkEl","continueBtn","_b","cfg","isRich","newClose","newCont","installMarkers"],"mappings":"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"}
|