@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.
Files changed (159) hide show
  1. package/dist/HopePlayerElement.d.ts +47 -0
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/adTriggers-DVqgm92F.js +420 -0
  4. package/dist/chunks/adTriggers-DVqgm92F.js.map +1 -0
  5. package/dist/chunks/{ads-C4tDPsUs.js → ads-eSKyiH1o.js} +2 -2
  6. package/dist/chunks/{ads-C4tDPsUs.js.map → ads-eSKyiH1o.js.map} +1 -1
  7. package/dist/chunks/audioDescription-cpprKeB-.js +146 -0
  8. package/dist/chunks/audioDescription-cpprKeB-.js.map +1 -0
  9. package/dist/chunks/{cast-Baxvu76A.js → cast-DEowHmqA.js} +29 -28
  10. package/dist/chunks/{cast-Baxvu76A.js.map → cast-DEowHmqA.js.map} +1 -1
  11. package/dist/chunks/docPip-Bh6BWPk-.js +92 -0
  12. package/dist/chunks/docPip-Bh6BWPk-.js.map +1 -0
  13. package/dist/chunks/heatmap-Bz_EMQFk.js +117 -0
  14. package/dist/chunks/heatmap-Bz_EMQFk.js.map +1 -0
  15. package/dist/chunks/{history-CvydU0aN.js → history-ZSdDDsRF.js} +35 -34
  16. package/dist/chunks/{history-CvydU0aN.js.map → history-ZSdDDsRF.js.map} +1 -1
  17. package/dist/chunks/interactive-ClJC5Vyo.js +213 -0
  18. package/dist/chunks/interactive-ClJC5Vyo.js.map +1 -0
  19. package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
  20. package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
  21. package/dist/chunks/{markers-Dr4-CCxE.js → markers-D32rI-x-.js} +53 -51
  22. package/dist/chunks/markers-D32rI-x-.js.map +1 -0
  23. package/dist/chunks/multiview-CL1WfJKt.js +295 -0
  24. package/dist/chunks/multiview-CL1WfJKt.js.map +1 -0
  25. package/dist/chunks/{pauseAd-BQQe21X4.js → pauseAd-DF7KGwUs.js} +32 -31
  26. package/dist/chunks/{pauseAd-BQQe21X4.js.map → pauseAd-DF7KGwUs.js.map} +1 -1
  27. package/dist/chunks/{player-DV4Hf5Cw.js → player-B7mYS--8.js} +1580 -1284
  28. package/dist/chunks/player-B7mYS--8.js.map +1 -0
  29. package/dist/chunks/{playlist-DJsdK6xm.js → playlist-BkhIOfCy.js} +2 -2
  30. package/dist/chunks/{playlist-DJsdK6xm.js.map → playlist-BkhIOfCy.js.map} +1 -1
  31. package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
  32. package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
  33. package/dist/chunks/{pluginHost-GxNfyP5E.js → pluginHost-CXqkjNV1.js} +2 -2
  34. package/dist/chunks/{pluginHost-GxNfyP5E.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
  35. package/dist/chunks/redirectScreen-DgmjFVJH.js +251 -0
  36. package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
  37. package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
  38. package/dist/chunks/{rewardedUnlock-jFOdzfSq.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
  39. package/dist/chunks/segments-CuQQEIAX.js +66 -0
  40. package/dist/chunks/segments-CuQQEIAX.js.map +1 -0
  41. package/dist/chunks/share-BdqQ8sGE.js +216 -0
  42. package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
  43. package/dist/chunks/{skipSegments-vJMhdiJn.js → skipSegments-BbepQ4Y6.js} +2 -2
  44. package/dist/chunks/{skipSegments-vJMhdiJn.js.map → skipSegments-BbepQ4Y6.js.map} +1 -1
  45. package/dist/chunks/sponsorship-DoAZBbHE.js +241 -0
  46. package/dist/chunks/{sponsorship-BT21uwN5.js.map → sponsorship-DoAZBbHE.js.map} +1 -1
  47. package/dist/chunks/{spriteThumbnails-BoxVY--_.js → spriteThumbnails-BYg-DHx4.js} +28 -28
  48. package/dist/chunks/spriteThumbnails-BYg-DHx4.js.map +1 -0
  49. package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
  50. package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
  51. package/dist/chunks/{story-BRkhSDhR.js → story-DcBG6jUg.js} +2 -2
  52. package/dist/chunks/{story-BRkhSDhR.js.map → story-DcBG6jUg.js.map} +1 -1
  53. package/dist/chunks/transcript-CHPQ6S6E.js +206 -0
  54. package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
  55. package/dist/controls/ContextMenu.d.ts +1 -0
  56. package/dist/controls/ContextMenu.d.ts.map +1 -1
  57. package/dist/controls/ControlBar.d.ts +6 -0
  58. package/dist/controls/ControlBar.d.ts.map +1 -1
  59. package/dist/controls/SeekBar.d.ts +5 -2
  60. package/dist/controls/SeekBar.d.ts.map +1 -1
  61. package/dist/controls/SettingsMenu.d.ts +2 -1
  62. package/dist/controls/SettingsMenu.d.ts.map +1 -1
  63. package/dist/hls/SourceManager.d.ts +2 -0
  64. package/dist/hls/SourceManager.d.ts.map +1 -1
  65. package/dist/hope-player.js +3 -3
  66. package/dist/i18n/index.d.ts +9 -0
  67. package/dist/i18n/index.d.ts.map +1 -1
  68. package/dist/i18n/locales/en.d.ts +2 -2
  69. package/dist/i18n/locales/en.d.ts.map +1 -1
  70. package/dist/i18n/locales/tr.d.ts +2 -2
  71. package/dist/i18n/locales/tr.d.ts.map +1 -1
  72. package/dist/i18n/types.d.ts +52 -0
  73. package/dist/i18n/types.d.ts.map +1 -1
  74. package/dist/index.d.ts +1 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
  77. package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
  78. package/dist/plugins/ad-triggers/index.d.ts.map +1 -1
  79. package/dist/plugins/audio-description/AudioDescription.d.ts +52 -0
  80. package/dist/plugins/audio-description/AudioDescription.d.ts.map +1 -0
  81. package/dist/plugins/audio-description/index.d.ts +6 -0
  82. package/dist/plugins/audio-description/index.d.ts.map +1 -0
  83. package/dist/plugins/audio-description/strings.d.ts +8 -0
  84. package/dist/plugins/audio-description/strings.d.ts.map +1 -0
  85. package/dist/plugins/cast/index.d.ts.map +1 -1
  86. package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
  87. package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
  88. package/dist/plugins/doc-pip/index.d.ts +5 -0
  89. package/dist/plugins/doc-pip/index.d.ts.map +1 -0
  90. package/dist/plugins/doc-pip/strings.d.ts +8 -0
  91. package/dist/plugins/doc-pip/strings.d.ts.map +1 -0
  92. package/dist/plugins/heatmap/Heatmap.d.ts +44 -0
  93. package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
  94. package/dist/plugins/heatmap/index.d.ts +6 -0
  95. package/dist/plugins/heatmap/index.d.ts.map +1 -0
  96. package/dist/plugins/heatmap/strings.d.ts +8 -0
  97. package/dist/plugins/heatmap/strings.d.ts.map +1 -0
  98. package/dist/plugins/history/index.d.ts.map +1 -1
  99. package/dist/plugins/interactive/Interactive.d.ts +45 -0
  100. package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
  101. package/dist/plugins/interactive/index.d.ts +6 -0
  102. package/dist/plugins/interactive/index.d.ts.map +1 -0
  103. package/dist/plugins/interactive/strings.d.ts +8 -0
  104. package/dist/plugins/interactive/strings.d.ts.map +1 -0
  105. package/dist/plugins/markers/MarkProgress.d.ts +3 -1
  106. package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
  107. package/dist/plugins/multiview/Multiview.d.ts +92 -0
  108. package/dist/plugins/multiview/Multiview.d.ts.map +1 -0
  109. package/dist/plugins/multiview/index.d.ts +6 -0
  110. package/dist/plugins/multiview/index.d.ts.map +1 -0
  111. package/dist/plugins/multiview/strings.d.ts +8 -0
  112. package/dist/plugins/multiview/strings.d.ts.map +1 -0
  113. package/dist/plugins/pause-ad/index.d.ts.map +1 -1
  114. package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
  115. package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
  116. package/dist/plugins/redirect-screen/index.d.ts.map +1 -1
  117. package/dist/plugins/redirect-screen/strings.d.ts +8 -0
  118. package/dist/plugins/redirect-screen/strings.d.ts.map +1 -0
  119. package/dist/plugins/rewarded/index.d.ts.map +1 -1
  120. package/dist/plugins/segments/Segments.d.ts +1 -0
  121. package/dist/plugins/segments/Segments.d.ts.map +1 -1
  122. package/dist/plugins/share/Share.d.ts +45 -0
  123. package/dist/plugins/share/Share.d.ts.map +1 -0
  124. package/dist/plugins/share/index.d.ts +6 -0
  125. package/dist/plugins/share/index.d.ts.map +1 -0
  126. package/dist/plugins/share/strings.d.ts +8 -0
  127. package/dist/plugins/share/strings.d.ts.map +1 -0
  128. package/dist/plugins/skip-segments/index.d.ts.map +1 -1
  129. package/dist/plugins/sponsorship/index.d.ts.map +1 -1
  130. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +1 -0
  131. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
  132. package/dist/plugins/sticky/StickyManager.d.ts +2 -0
  133. package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
  134. package/dist/plugins/transcript/Transcript.d.ts +65 -0
  135. package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
  136. package/dist/plugins/transcript/index.d.ts +6 -0
  137. package/dist/plugins/transcript/index.d.ts.map +1 -0
  138. package/dist/plugins/transcript/strings.d.ts +8 -0
  139. package/dist/plugins/transcript/strings.d.ts.map +1 -0
  140. package/dist/subtitles/attachTracks.d.ts +6 -0
  141. package/dist/subtitles/attachTracks.d.ts.map +1 -1
  142. package/dist/types/index.d.ts +257 -12
  143. package/dist/types/index.d.ts.map +1 -1
  144. package/dist/utils/plugin-style.d.ts +5 -0
  145. package/dist/utils/plugin-style.d.ts.map +1 -0
  146. package/package.json +1 -1
  147. package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
  148. package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
  149. package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
  150. package/dist/chunks/markers-Dr4-CCxE.js.map +0 -1
  151. package/dist/chunks/player-DV4Hf5Cw.js.map +0 -1
  152. package/dist/chunks/redirectScreen-BT_26-5g.js +0 -208
  153. package/dist/chunks/redirectScreen-BT_26-5g.js.map +0 -1
  154. package/dist/chunks/rewardedUnlock-jFOdzfSq.js +0 -264
  155. package/dist/chunks/segments--hl_QVrI.js +0 -63
  156. package/dist/chunks/segments--hl_QVrI.js.map +0 -1
  157. package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
  158. package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +0 -1
  159. package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
@@ -0,0 +1,295 @@
1
+ var g = Object.defineProperty;
2
+ var w = (c, t, e) => t in c ? g(c, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[t] = e;
3
+ var l = (c, t, e) => w(c, typeof t != "symbol" ? t + "" : t, e);
4
+ import { r as x } from "./player-B7mYS--8.js";
5
+ import { a as E } from "./plugin-style-CPJELe-i.js";
6
+ const A = {
7
+ tr: {
8
+ multiviewLayout: "Bölünmüş ekran",
9
+ multiviewCameras: "Kameralar",
10
+ multiviewWatching: "İzleniyor",
11
+ multiviewSwitch: (c) => `${c} kamerasına geç`,
12
+ multiviewNotStarted: "Henüz başlamadı"
13
+ },
14
+ en: {
15
+ multiviewLayout: "Split view",
16
+ multiviewCameras: "Cameras",
17
+ multiviewWatching: "Watching",
18
+ multiviewSwitch: (c) => `Switch to ${c}`,
19
+ multiviewNotStarted: "Not started yet"
20
+ }
21
+ }, L = ".hp-mv{position:absolute;z-index:19;pointer-events:none}.hp-mv[data-ad]{display:none}.hp-mv-tile{position:relative;display:block;overflow:hidden;padding:0;border:2px solid transparent;border-radius:8px;background:#0b0b0f;color:#fff;font:600 12px/1.3 system-ui,-apple-system,sans-serif;cursor:pointer;pointer-events:auto;transition:border-color .15s,transform .15s,opacity .2s}.hp-mv-tile:hover{border-color:#ffffff8c}.hp-mv-tile[data-active]{border-color:var(--hp-color-accent, #fff);cursor:default}.hp-mv-tile:focus-visible{outline:2px solid var(--hp-color-accent, #fff);outline-offset:2px}.hp-mv-media{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;object-fit:cover;pointer-events:none}.hp-mv-tile[data-waiting] .hp-mv-media{opacity:.35}.hp-mv-label,.hp-mv-badge{position:absolute;max-width:calc(100% - 12px);overflow:hidden;padding:2px 6px;border-radius:4px;background:#0009;white-space:nowrap;text-overflow:ellipsis;line-height:1.4}.hp-mv-label{left:6px;bottom:6px}.hp-mv-badge{top:6px;right:6px;font-size:10.5px;letter-spacing:.04em;text-transform:uppercase}.hp-mv-badge:empty{display:none}.hp-mv-tile[data-active] .hp-mv-badge{background:var(--hp-color-accent, #fff);color:var(--hp-color-on-accent, #000)}.hp-mv[data-layout=focus]{display:flex;gap:8px;left:12px;right:12px;bottom:76px;justify-content:center;transition:opacity .2s ease}.hp-mv[data-layout=focus] .hp-mv-tile{flex:0 1 140px;min-width:84px;aspect-ratio:16 / 9}.video-area[data-chrome-hidden] .hp-mv[data-layout=focus]{opacity:0}.video-area[data-chrome-hidden] .hp-mv[data-layout=focus] .hp-mv-tile{pointer-events:none}.hp-mv[data-layout=focus][data-thumbs=right]{flex-direction:column;left:auto;top:12px;width:min(140px,22%);justify-content:flex-start}.hp-mv[data-layout=focus][data-thumbs=right] .hp-mv-tile{flex:none;width:100%;min-width:0}.video-area[data-compact] .hp-mv[data-layout=focus]{bottom:56px;left:8px;right:8px;gap:6px}.hp-mv[data-layout=grid]{top:0;right:0;bottom:0;left:0}.hp-mv[data-layout=grid] .hp-mv-tile{position:absolute;border-radius:0;border-width:1px;border-color:#0009}.hp-mv[data-layout=grid] .hp-mv-tile:hover{border-color:#ffffff8c}.hp-mv[data-layout=grid] .hp-mv-media{object-fit:contain}.video-area[data-mv-grid] .media-layer{background:#000}.video-area[data-mv-grid] .media-layer>video{position:absolute;left:var(--hp-mv-x);top:var(--hp-mv-y);width:var(--hp-mv-w);height:var(--hp-mv-h)}.hp-mv-frame{position:absolute;box-sizing:border-box;border:2px solid var(--hp-color-accent, #fff);pointer-events:none}.hp-mv-frame .hp-mv-label{background:var(--hp-color-accent, #fff);color:var(--hp-color-on-accent, #000);font:600 12px/1.4 system-ui,-apple-system,sans-serif}.video-area[data-compact] .hp-mv[data-layout=focus] .hp-mv-tile{min-width:60px;border-radius:6px;font-size:10px}.video-area[data-compact] .hp-mv[data-layout=focus] .hp-mv-badge{display:none}.video-area[data-compact] .hp-mv-label{left:3px;bottom:3px;padding:1px 4px}@media(prefers-reduced-motion:reduce){.hp-mv-tile,.hp-mv[data-layout=focus]{transition:none}}", T = {
22
+ 2: [
23
+ [0, 25, 50, 50],
24
+ [50, 25, 50, 50]
25
+ ],
26
+ 3: [
27
+ [0, 0, 50, 50],
28
+ [50, 0, 50, 50],
29
+ [25, 50, 50, 50]
30
+ ],
31
+ 4: [
32
+ [0, 0, 50, 50],
33
+ [50, 0, 50, 50],
34
+ [0, 50, 50, 50],
35
+ [50, 50, 50, 50]
36
+ ]
37
+ }, f = 0.6, k = (c) => c.type === "application/x-mpegURL" || /\.m3u8(\?|#|$)/i.test(c.src);
38
+ function v(c, t) {
39
+ var s, a, o, r, h;
40
+ if (t) {
41
+ const n = ((a = (s = t.levels) == null ? void 0 : s[Math.max(0, t.currentLevel)]) == null ? void 0 : a.details) ?? ((r = (o = t.levels) == null ? void 0 : o.find((m) => m.details)) == null ? void 0 : r.details), d = n == null ? void 0 : n.fragments.find((m) => m.programDateTime);
42
+ return d != null && d.programDateTime ? { pos: d.start, date: d.programDateTime } : null;
43
+ }
44
+ const e = (h = c.getStartDate) == null ? void 0 : h.call(c), i = e == null ? void 0 : e.getTime();
45
+ return i !== void 0 && Number.isFinite(i) ? { pos: 0, date: i } : null;
46
+ }
47
+ function b(c, t) {
48
+ const e = c.seekable;
49
+ return e.length ? Math.min(Math.max(t, e.start(0)), Math.max(e.start(0), e.end(e.length - 1) - 0.3)) : Math.max(0, t);
50
+ }
51
+ class M {
52
+ constructor(t, e) {
53
+ l(this, "cams");
54
+ l(this, "active");
55
+ l(this, "layout");
56
+ l(this, "root");
57
+ l(this, "frame");
58
+ l(this, "frameLabel");
59
+ l(this, "tiles", /* @__PURE__ */ new Map());
60
+ l(this, "button", null);
61
+ l(this, "syncTimer", null);
62
+ l(this, "posterTimer", null);
63
+ l(this, "switching", !1);
64
+ l(this, "destroyed", !1);
65
+ l(this, "HlsCtor", null);
66
+ l(this, "ro");
67
+ /** Önizlemeleri ana kameranın anına hizalar; oynat / duraklat / hızı izler. */
68
+ l(this, "sync", () => {
69
+ if (this.destroyed || this.switching || this.options.sync === !1) return;
70
+ const t = this.ctx.videoEl, e = v(t, this.ctx.mainHls()), i = e ? e.date + (t.currentTime - e.pos) * 1e3 : null, s = t.currentTime + (this.active.offset ?? 0);
71
+ for (const a of this.tiles.values()) {
72
+ const o = a.video;
73
+ if (!o || o.readyState < 1) continue;
74
+ const r = v(o, a.hls), h = i !== null && r ? r.pos + (i - r.date) / 1e3 : s - (a.cam.offset ?? 0), n = o.seekable, d = n.length ? h < n.start(0) - 0.2 : h < -0.2, m = n.length ? h > n.end(n.length - 1) + 0.2 : !1, p = d || m;
75
+ if (a.el.hasAttribute("data-waiting") !== p && (a.el.toggleAttribute("data-waiting", p), this.labelTile(a)), p) {
76
+ o.paused || o.pause();
77
+ continue;
78
+ }
79
+ o.readyState >= 3 && !o.seeking && Math.abs(o.currentTime - h) > f && (o.currentTime = b(o, h)), o.playbackRate = t.playbackRate || 1, t.paused || this.ctx.isAdActive() ? o.paused || o.pause() : o.paused && o.play().catch(() => {
80
+ });
81
+ }
82
+ });
83
+ l(this, "onMainPlay", () => this.sync());
84
+ l(this, "onMainPause", () => {
85
+ var t;
86
+ for (const e of this.tiles.values()) (t = e.video) == null || t.pause();
87
+ });
88
+ l(this, "onRate", () => this.sync());
89
+ l(this, "onAdStart", () => {
90
+ this.root.setAttribute("data-ad", ""), this.onMainPause();
91
+ });
92
+ l(this, "onAdEnd", () => {
93
+ this.root.removeAttribute("data-ad"), this.sync();
94
+ });
95
+ /** Canlı yayın posterleri: önbelleği atlayarak yenile. */
96
+ l(this, "refreshPosters", () => {
97
+ for (const t of this.tiles.values()) {
98
+ if (!t.img || !t.cam.poster) continue;
99
+ const e = new URL(t.cam.poster, location.href);
100
+ e.searchParams.set("_hp", String(Date.now())), t.img.src = e.toString();
101
+ }
102
+ });
103
+ this.ctx = t, this.options = e, E(t.videoAreaEl, "multiview", L), this.cams = e.sources.filter((s) => s.id && s.src), this.active = this.cams.find((s) => s.id === e.start) ?? this.cams[0], this.layout = e.layout === "grid" ? "grid" : "focus", this.root = document.createElement("div"), this.root.className = "hp-mv", this.root.setAttribute("part", "multiview"), this.root.setAttribute("data-thumbs", e.thumbnails === "right" ? "right" : "bottom"), this.root.setAttribute("role", "group"), this.frame = document.createElement("div"), this.frame.className = "hp-mv-frame", this.frameLabel = document.createElement("span"), this.frameLabel.className = "hp-mv-label", this.frame.appendChild(this.frameLabel);
104
+ for (const s of ["pointerdown", "click", "dblclick"]) this.root.addEventListener(s, (a) => a.stopPropagation());
105
+ if (t.videoAreaEl.appendChild(this.root), e.button !== !1 && this.cams.length > 1) {
106
+ const { btn: s } = t.addButton(t.i18n.multiviewLayout, "grid", () => this.setLayout(this.layout === "grid" ? "focus" : "grid"));
107
+ s.setAttribute("aria-pressed", "false"), this.button = s;
108
+ }
109
+ const i = t.videoEl;
110
+ i.addEventListener("play", this.onMainPlay), i.addEventListener("pause", this.onMainPause), i.addEventListener("seeked", this.sync), i.addEventListener("ratechange", this.onRate), t.hostEl.addEventListener("hp:adstart", this.onAdStart), t.hostEl.addEventListener("hp:adend", this.onAdEnd), this.ro = new ResizeObserver(() => this.render()), this.ro.observe(t.videoAreaEl), e.sync !== !1 && (this.syncTimer = setInterval(this.sync, 1e3)), e.posterRefresh && e.posterRefresh > 0 && (this.posterTimer = setInterval(this.refreshPosters, e.posterRefresh * 1e3)), this.refreshLabels(), this.render();
111
+ }
112
+ get activeId() {
113
+ return this.active.id;
114
+ }
115
+ refreshLabels() {
116
+ var e;
117
+ const t = this.ctx.i18n;
118
+ this.root.setAttribute("aria-label", t.multiviewCameras), (e = this.button) == null || e.setAttribute("aria-label", t.multiviewLayout);
119
+ for (const i of this.tiles.values()) this.labelTile(i);
120
+ }
121
+ setLayout(t) {
122
+ t !== this.layout && (this.layout = t, this.render(), this.emit("layout"));
123
+ }
124
+ /** Kamerayı değiştir: yeni yayın mevcut kameranın gerçek saatine hizalanır. */
125
+ async switchTo(t) {
126
+ const e = this.cams.find((m) => m.id === t);
127
+ if (!e || e === this.active || this.switching || this.ctx.isAdActive()) return;
128
+ this.switching = !0;
129
+ const i = this.ctx.videoEl, s = this.active, a = i.paused, o = i.playbackRate || 1, r = performance.now(), h = v(i, this.ctx.mainHls()), n = h ? h.date + (i.currentTime - h.pos) * 1e3 : null, d = i.currentTime + (s.offset ?? 0);
130
+ this.active = e, this.dropTile(e.id), this.render();
131
+ try {
132
+ if (await this.ctx.loadSource(e.src, e.type), await this.waitFor(i, "loadedmetadata", 1e4), this.options.sync !== !1) {
133
+ const m = n !== null ? await this.waitClock(i) : null, p = () => {
134
+ const u = a ? 0 : (performance.now() - r) / 1e3 * o;
135
+ return b(i, n !== null && m ? m.pos + (n + u * 1e3 - m.date) / 1e3 : d + u - (e.offset ?? 0));
136
+ };
137
+ await this.waitFor(i, "canplay", 5e3);
138
+ for (let u = 0; u < 3 && (i.currentTime = p(), await this.waitFor(i, "seeked", 3e3), !(Math.abs(i.currentTime - p()) <= f)); u++)
139
+ ;
140
+ }
141
+ i.playbackRate = o, a || await i.play().catch(() => {
142
+ });
143
+ } finally {
144
+ this.switching = !1;
145
+ }
146
+ this.destroyed || (this.render(), this.emit("switch", s.id));
147
+ }
148
+ destroy() {
149
+ var e;
150
+ this.destroyed = !0;
151
+ const t = this.ctx.videoEl;
152
+ t.removeEventListener("play", this.onMainPlay), t.removeEventListener("pause", this.onMainPause), t.removeEventListener("seeked", this.sync), t.removeEventListener("ratechange", this.onRate), this.ctx.hostEl.removeEventListener("hp:adstart", this.onAdStart), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.syncTimer && clearInterval(this.syncTimer), this.posterTimer && clearInterval(this.posterTimer), this.ro.disconnect();
153
+ for (const i of [...this.tiles.keys()]) this.dropTile(i);
154
+ this.root.remove(), (e = this.button) == null || e.remove(), this.setMainRect(null);
155
+ }
156
+ emit(t, e) {
157
+ this.ctx.hostEl.dispatchEvent(
158
+ new CustomEvent("hp:multiview", { detail: { state: t, id: this.active.id, ...e ? { from: e } : {}, layout: this.layout } })
159
+ );
160
+ }
161
+ /** Dar / dokunmatik ekran: akış sayısı sınırlı, önizleme poster. */
162
+ isMobile() {
163
+ return this.ctx.videoAreaEl.clientWidth < 560 || matchMedia("(pointer: coarse)").matches;
164
+ }
165
+ wantsVideo() {
166
+ const t = this.options.previews ?? "auto";
167
+ return t === "video" || t === "auto" && !this.isMobile();
168
+ }
169
+ /** Görünür kameralar: grid'de ana dahil en fazla 4 (mobilde maxMobileStreams); focus'ta hepsi. */
170
+ visibleOthers() {
171
+ const t = this.cams.filter((i) => i !== this.active);
172
+ if (this.layout === "focus") return t;
173
+ const e = this.isMobile() ? Math.max(2, this.options.maxMobileStreams ?? 2) : 4;
174
+ return t.slice(0, e - 1);
175
+ }
176
+ render() {
177
+ var o;
178
+ if (this.destroyed) return;
179
+ const t = this.layout === "grid" && this.cams.length > 1;
180
+ this.root.setAttribute("data-layout", t ? "grid" : "focus"), this.ctx.videoAreaEl.setAttribute("data-mv", t ? "grid" : "focus"), (o = this.button) == null || o.setAttribute("aria-pressed", String(t));
181
+ const e = this.visibleOthers(), i = new Set(e.map((r) => r.id));
182
+ t || i.add(this.active.id);
183
+ for (const r of [...this.tiles.keys()]) i.has(r) || this.dropTile(r);
184
+ const s = t ? e : this.cams, a = T[e.length + 1];
185
+ if (this.setMainRect(t && a ? a[0] : null), t && a) {
186
+ const [r, h, n, d] = a[0];
187
+ Object.assign(this.frame.style, { left: `${r}%`, top: `${h}%`, width: `${n}%`, height: `${d}%` }), this.frameLabel.textContent = `${this.active.label} · ${this.ctx.i18n.multiviewWatching}`, this.root.appendChild(this.frame);
188
+ } else
189
+ this.frame.remove();
190
+ s.forEach((r, h) => {
191
+ const n = this.tiles.get(r.id) ?? this.makeTile(r), d = r === this.active;
192
+ if (n.el.toggleAttribute("data-active", d), n.el.setAttribute("aria-pressed", String(d)), t && a) {
193
+ const [m, p, u, y] = a[h + 1];
194
+ Object.assign(n.el.style, { left: `${m}%`, top: `${p}%`, width: `${u}%`, height: `${y}%` });
195
+ } else
196
+ n.el.style.cssText = "";
197
+ this.root.appendChild(n.el), this.setPreview(n, !d && (t || this.wantsVideo()));
198
+ }), this.labelTiles(), this.sync();
199
+ }
200
+ /** Grid'de ana videonun hücresi (CSS değişkenleri); null → tam alan. */
201
+ setMainRect(t) {
202
+ const e = this.ctx.videoAreaEl;
203
+ if (!t) {
204
+ e.removeAttribute("data-mv-grid");
205
+ for (const r of ["x", "y", "w", "h"]) e.style.removeProperty(`--hp-mv-${r}`);
206
+ if (!this.destroyed) return;
207
+ e.removeAttribute("data-mv");
208
+ return;
209
+ }
210
+ e.setAttribute("data-mv-grid", "");
211
+ const [i, s, a, o] = t;
212
+ e.style.setProperty("--hp-mv-x", `${i}%`), e.style.setProperty("--hp-mv-y", `${s}%`), e.style.setProperty("--hp-mv-w", `${a}%`), e.style.setProperty("--hp-mv-h", `${o}%`);
213
+ }
214
+ makeTile(t) {
215
+ const e = document.createElement("button");
216
+ e.type = "button", e.className = "hp-mv-tile", e.setAttribute("data-cam", t.id);
217
+ const i = document.createElement("span");
218
+ i.className = "hp-mv-label", i.textContent = t.label;
219
+ const s = document.createElement("span");
220
+ s.className = "hp-mv-badge", e.append(i, s), e.addEventListener("click", () => void this.switchTo(t.id));
221
+ const a = { cam: t, el: e, video: null, hls: null, img: null };
222
+ return this.tiles.set(t.id, a), a;
223
+ }
224
+ labelTile(t) {
225
+ const e = this.ctx.i18n, i = t.cam === this.active;
226
+ t.el.setAttribute("aria-label", i ? `${t.cam.label} — ${e.multiviewWatching}` : e.multiviewSwitch(t.cam.label));
227
+ const s = t.el.querySelector(".hp-mv-badge");
228
+ s.textContent = i ? e.multiviewWatching : t.el.hasAttribute("data-waiting") ? e.multiviewNotStarted : "";
229
+ }
230
+ labelTiles() {
231
+ for (const t of this.tiles.values()) this.labelTile(t);
232
+ }
233
+ dropTile(t) {
234
+ const e = this.tiles.get(t);
235
+ e && (this.stopVideo(e), e.el.remove(), this.tiles.delete(t));
236
+ }
237
+ stopVideo(t) {
238
+ var e;
239
+ (e = t.hls) == null || e.destroy(), t.hls = null, t.video && (t.video.pause(), t.video.removeAttribute("src"), t.video.load(), t.video.remove(), t.video = null);
240
+ }
241
+ /** Önizleme: video (sessiz, en düşük kalite) ya da poster. */
242
+ setPreview(t, e) {
243
+ if (!e) {
244
+ if (this.stopVideo(t), !t.img && t.cam.poster) {
245
+ const s = document.createElement("img");
246
+ s.className = "hp-mv-media", s.alt = "", s.decoding = "async", s.src = t.cam.poster, s.addEventListener("error", () => s.remove()), t.el.prepend(s), t.img = s;
247
+ }
248
+ return;
249
+ }
250
+ if (t.video) return;
251
+ const i = document.createElement("video");
252
+ i.className = "hp-mv-media", i.muted = !0, i.playsInline = !0, i.setAttribute("playsinline", ""), i.preload = "auto", t.cam.poster && (i.poster = t.cam.poster), t.el.prepend(i), t.video = i, this.attach(t, i);
253
+ }
254
+ async attach(t, e) {
255
+ const i = t.cam, s = typeof window.MediaSource < "u" || "ManagedMediaSource" in window;
256
+ if (k(i) && s) {
257
+ if (this.HlsCtor || (this.HlsCtor = (await import("./hlsLight-CCe_8eOw.js")).default), t.video !== e) return;
258
+ const a = new this.HlsCtor({ startLevel: 0, capLevelToPlayerSize: !0, maxBufferLength: 8, maxMaxBufferLength: 16, backBufferLength: 4 });
259
+ a.on("hlsManifestParsed", () => {
260
+ a.autoLevelCapping = 0;
261
+ }), a.attachMedia(e), a.loadSource(i.src), t.hls = a;
262
+ } else
263
+ e.src = i.src;
264
+ e.addEventListener("loadedmetadata", () => this.sync(), { once: !0 });
265
+ }
266
+ waitFor(t, e, i) {
267
+ const s = t;
268
+ return e === "loadedmetadata" && s.readyState >= 1 || e === "canplay" && s.readyState >= 3 || e === "seeked" && !s.seeking ? Promise.resolve() : new Promise((a) => {
269
+ const o = () => {
270
+ clearTimeout(r), t.removeEventListener(e, o), a();
271
+ }, r = setTimeout(o, i);
272
+ t.addEventListener(e, o, { once: !0 });
273
+ });
274
+ }
275
+ /** Yeni yayının saat bilgisi (hls.js'te playlist yüklenince gelir) — en fazla 2 sn beklenir. */
276
+ async waitClock(t) {
277
+ var e;
278
+ for (let i = 0; i < 20; i++) {
279
+ const s = this.ctx.mainHls(), a = v(t, s);
280
+ if (a) return a;
281
+ if (!s || (e = s.levels) != null && e.some((o) => o.details)) return null;
282
+ await new Promise((o) => setTimeout(o, 100));
283
+ }
284
+ return null;
285
+ }
286
+ }
287
+ x(A);
288
+ function C(c, t) {
289
+ return new M(c, t);
290
+ }
291
+ export {
292
+ M as Multiview,
293
+ C as installMultiview
294
+ };
295
+ //# sourceMappingURL=multiview-CL1WfJKt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiview-CL1WfJKt.js","sources":["../../src/plugins/multiview/strings.ts","../../src/plugins/multiview/Multiview.ts","../../src/plugins/multiview/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, 'multiviewLayout' | 'multiviewCameras' | 'multiviewWatching' | 'multiviewSwitch' | 'multiviewNotStarted'>;\n\nexport const strings: { tr: Strings; en: Strings } = {\n tr: {\n multiviewLayout: 'Bölünmüş ekran',\n multiviewCameras: 'Kameralar',\n multiviewWatching: 'İzleniyor',\n multiviewSwitch: (label) => `${label} kamerasına geç`,\n multiviewNotStarted: 'Henüz başlamadı',\n },\n en: {\n multiviewLayout: 'Split view',\n multiviewCameras: 'Cameras',\n multiviewWatching: 'Watching',\n multiviewSwitch: (label) => `Switch to ${label}`,\n multiviewNotStarted: 'Not started yet',\n },\n};\n","import type { MultiviewOptions, MultiviewSource } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { adoptStyle } from '../../utils/plugin-style';\nimport css from './multiview.css?inline';\n\n/** hls.js'ten kullanılan kısım (ana player'ınki ve önizlemelerinki). */\nexport interface HlsLike {\n levels: { details?: { fragments: { start: number; programDateTime: number | null }[] } }[];\n currentLevel: number;\n autoLevelCapping: number;\n loadSource(src: string): void;\n attachMedia(video: HTMLVideoElement): void;\n on(event: string, fn: () => void): void;\n destroy(): void;\n}\n\nexport interface MultiviewPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n videoAreaEl: HTMLElement;\n i18n: HopeLocaleStrings;\n isAdActive(): boolean;\n loadSource(src: string, type?: string): Promise<void>;\n mainHls(): HlsLike | null;\n addButton(label: string, iconName: string, onClick: () => void): { btn: HTMLButtonElement; icon: HTMLElement };\n}\n\ninterface Tile {\n cam: MultiviewSource;\n el: HTMLButtonElement;\n video: HTMLVideoElement | null;\n hls: HlsLike | null;\n img: HTMLImageElement | null;\n}\n\ntype Rect = [x: number, y: number, w: number, h: number];\n\n/** Bölünmüş ekran hücreleri (% — oynatıcı 16:9'da her hücre de 16:9). İlk hücre seçili kameranın. */\nconst GRID: Record<number, Rect[]> = {\n 2: [\n [0, 25, 50, 50],\n [50, 25, 50, 50],\n ],\n 3: [\n [0, 0, 50, 50],\n [50, 0, 50, 50],\n [25, 50, 50, 50],\n ],\n 4: [\n [0, 0, 50, 50],\n [50, 0, 50, 50],\n [0, 50, 50, 50],\n [50, 50, 50, 50],\n ],\n};\n\n/** Senkron eşiği: önizleme bu kadardan fazla kayarsa yeniden hizalanır (sn). */\nconst DRIFT = 0.6;\n\nconst isHls = (cam: MultiviewSource): boolean => cam.type === 'application/x-mpegURL' || /\\.m3u8(\\?|#|$)/i.test(cam.src);\n\n/** Konum ↔ gerçek saat eşlemesi: hls.js'te EXT-X-PROGRAM-DATE-TIME'lı ilk segment, Safari'de getStartDate(). */\nfunction clockOf(video: HTMLVideoElement, hls: HlsLike | null): { pos: number; date: number } | null {\n if (hls) {\n const details = hls.levels?.[Math.max(0, hls.currentLevel)]?.details ?? hls.levels?.find((l) => l.details)?.details;\n const frag = details?.fragments.find((f) => f.programDateTime);\n return frag?.programDateTime ? { pos: frag.start, date: frag.programDateTime } : null;\n }\n const start = (video as HTMLVideoElement & { getStartDate?(): Date }).getStartDate?.();\n const t = start?.getTime();\n return t !== undefined && Number.isFinite(t) ? { pos: 0, date: t } : null;\n}\n\nfunction clamp(video: HTMLVideoElement, pos: number): number {\n const s = video.seekable;\n if (!s.length) return Math.max(0, pos);\n return Math.min(Math.max(pos, s.start(0)), Math.max(s.start(0), s.end(s.length - 1) - 0.3));\n}\n\n/**\n * Çoklu kamera: aynı etkinliğin birden fazla yayını. Seçili kamera player'ın kendi videosunda oynar (kontroller,\n * altyazı, reklam ona bağlı); diğerleri sessiz, düşük kaliteli önizleme olarak akar. Kamera değişince yeni yayın\n * mevcut kameranın gerçek saatine (PROGRAM-DATE-TIME ya da `offset`) hizalanıp oradan devam eder.\n */\nexport class Multiview {\n private readonly cams: MultiviewSource[];\n private active: MultiviewSource;\n private layout: 'focus' | 'grid';\n private readonly root: HTMLDivElement;\n private readonly frame: HTMLDivElement;\n private readonly frameLabel: HTMLSpanElement;\n private tiles = new Map<string, Tile>();\n private button: HTMLButtonElement | null = null;\n private syncTimer: ReturnType<typeof setInterval> | null = null;\n private posterTimer: ReturnType<typeof setInterval> | null = null;\n private switching = false;\n private destroyed = false;\n private HlsCtor: (new (config: object) => HlsLike) | null = null;\n private readonly ro: ResizeObserver;\n\n constructor(\n private readonly ctx: MultiviewPlayerContext,\n private readonly options: MultiviewOptions\n ) {\n adoptStyle(ctx.videoAreaEl, 'multiview', css);\n this.cams = options.sources.filter((c) => c.id && c.src);\n this.active = this.cams.find((c) => c.id === options.start) ?? this.cams[0]!;\n this.layout = options.layout === 'grid' ? 'grid' : 'focus';\n\n this.root = document.createElement('div');\n this.root.className = 'hp-mv';\n this.root.setAttribute('part', 'multiview');\n this.root.setAttribute('data-thumbs', options.thumbnails === 'right' ? 'right' : 'bottom');\n this.root.setAttribute('role', 'group');\n this.frame = document.createElement('div');\n this.frame.className = 'hp-mv-frame';\n this.frameLabel = document.createElement('span');\n this.frameLabel.className = 'hp-mv-label';\n this.frame.appendChild(this.frameLabel);\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) this.root.addEventListener(ev, (e) => e.stopPropagation());\n ctx.videoAreaEl.appendChild(this.root);\n\n if (options.button !== false && this.cams.length > 1) {\n const { btn } = ctx.addButton(ctx.i18n.multiviewLayout, 'grid', () => this.setLayout(this.layout === 'grid' ? 'focus' : 'grid'));\n btn.setAttribute('aria-pressed', 'false');\n this.button = btn;\n }\n\n const v = ctx.videoEl;\n v.addEventListener('play', this.onMainPlay);\n v.addEventListener('pause', this.onMainPause);\n v.addEventListener('seeked', this.sync);\n v.addEventListener('ratechange', this.onRate);\n ctx.hostEl.addEventListener('hp:adstart', this.onAdStart);\n ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n this.ro = new ResizeObserver(() => this.render());\n this.ro.observe(ctx.videoAreaEl);\n if (options.sync !== false) this.syncTimer = setInterval(this.sync, 1000);\n if (options.posterRefresh && options.posterRefresh > 0) this.posterTimer = setInterval(this.refreshPosters, options.posterRefresh * 1000);\n\n this.refreshLabels();\n this.render();\n }\n\n get activeId(): string {\n return this.active.id;\n }\n\n refreshLabels(): void {\n const i18n = this.ctx.i18n;\n this.root.setAttribute('aria-label', i18n.multiviewCameras);\n this.button?.setAttribute('aria-label', i18n.multiviewLayout);\n for (const t of this.tiles.values()) this.labelTile(t);\n }\n\n setLayout(layout: 'focus' | 'grid'): void {\n if (layout === this.layout) return;\n this.layout = layout;\n this.render();\n this.emit('layout');\n }\n\n /** Kamerayı değiştir: yeni yayın mevcut kameranın gerçek saatine hizalanır. */\n async switchTo(id: string): Promise<void> {\n const next = this.cams.find((c) => c.id === id);\n if (!next || next === this.active || this.switching || this.ctx.isAdActive()) return;\n this.switching = true;\n const v = this.ctx.videoEl;\n const from = this.active;\n const wasPaused = v.paused;\n const rate = v.playbackRate || 1;\n const startedAt = performance.now();\n // Şu anki an: gerçek saat (varsa) ve etkinlik saniyesi (offset ile).\n const clock = clockOf(v, this.ctx.mainHls());\n const nowDate = clock ? clock.date + (v.currentTime - clock.pos) * 1000 : null;\n const nowEvent = v.currentTime + (from.offset ?? 0);\n\n this.active = next;\n this.dropTile(next.id);\n this.render();\n try {\n await this.ctx.loadSource(next.src, next.type);\n await this.waitFor(v, 'loadedmetadata', 10_000);\n if (this.options.sync !== false) {\n const c = nowDate !== null ? await this.waitClock(v) : null;\n // Hedef her an yeniden hesaplanır: beklerken geçen süre de eklenir.\n const target = (): number => {\n const elapsed = wasPaused ? 0 : ((performance.now() - startedAt) / 1000) * rate;\n return clamp(v, nowDate !== null && c ? c.pos + (nowDate + elapsed * 1000 - c.date) / 1000 : nowEvent + elapsed - (next.offset ?? 0));\n };\n // hls.js ilk segmentte kendi başlangıç konumuna sarar — yavaş tarayıcıda bizim sarmamızı ezerdi.\n // Hizalama video oynamaya hazır olunca yapılır ve tutana kadar (en fazla 3 kez) tekrarlanır.\n await this.waitFor(v, 'canplay', 5000);\n for (let i = 0; i < 3; i++) {\n v.currentTime = target();\n await this.waitFor(v, 'seeked', 3000);\n if (Math.abs(v.currentTime - target()) <= DRIFT) break;\n }\n }\n v.playbackRate = rate;\n if (!wasPaused) await v.play().catch(() => {});\n } finally {\n this.switching = false;\n }\n if (this.destroyed) return;\n this.render();\n this.emit('switch', from.id);\n }\n\n destroy(): void {\n this.destroyed = true;\n const v = this.ctx.videoEl;\n v.removeEventListener('play', this.onMainPlay);\n v.removeEventListener('pause', this.onMainPause);\n v.removeEventListener('seeked', this.sync);\n v.removeEventListener('ratechange', this.onRate);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAdStart);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n if (this.syncTimer) clearInterval(this.syncTimer);\n if (this.posterTimer) clearInterval(this.posterTimer);\n this.ro.disconnect();\n for (const id of [...this.tiles.keys()]) this.dropTile(id);\n this.root.remove();\n this.button?.remove();\n this.setMainRect(null);\n }\n\n private emit(state: 'switch' | 'layout', from?: string): void {\n this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:multiview', { detail: { state, id: this.active.id, ...(from ? { from } : {}), layout: this.layout } })\n );\n }\n\n /** Dar / dokunmatik ekran: akış sayısı sınırlı, önizleme poster. */\n private isMobile(): boolean {\n return this.ctx.videoAreaEl.clientWidth < 560 || matchMedia('(pointer: coarse)').matches;\n }\n\n private wantsVideo(): boolean {\n const p = this.options.previews ?? 'auto';\n return p === 'video' || (p === 'auto' && !this.isMobile());\n }\n\n /** Görünür kameralar: grid'de ana dahil en fazla 4 (mobilde maxMobileStreams); focus'ta hepsi. */\n private visibleOthers(): MultiviewSource[] {\n const others = this.cams.filter((c) => c !== this.active);\n if (this.layout === 'focus') return others;\n const max = this.isMobile() ? Math.max(2, this.options.maxMobileStreams ?? 2) : 4;\n return others.slice(0, max - 1);\n }\n\n private render(): void {\n if (this.destroyed) return;\n const grid = this.layout === 'grid' && this.cams.length > 1;\n this.root.setAttribute('data-layout', grid ? 'grid' : 'focus');\n this.ctx.videoAreaEl.setAttribute('data-mv', grid ? 'grid' : 'focus');\n this.button?.setAttribute('aria-pressed', String(grid));\n\n const others = this.visibleOthers();\n // Görünmeyen önizlemeler kapanır (bant genişliği).\n const keep = new Set(others.map((c) => c.id));\n if (!grid) keep.add(this.active.id);\n for (const id of [...this.tiles.keys()]) if (!keep.has(id)) this.dropTile(id);\n\n const order = grid ? others : this.cams;\n const cells = GRID[others.length + 1];\n this.setMainRect(grid && cells ? cells[0]! : null);\n // Grid'de sesi açık (ana) hücrenin çerçevesi + adı.\n if (grid && cells) {\n const [x, y, w, h] = cells[0]!;\n Object.assign(this.frame.style, { left: `${x}%`, top: `${y}%`, width: `${w}%`, height: `${h}%` });\n this.frameLabel.textContent = `${this.active.label} · ${this.ctx.i18n.multiviewWatching}`;\n this.root.appendChild(this.frame);\n } else {\n this.frame.remove();\n }\n order.forEach((cam, i) => {\n const tile = this.tiles.get(cam.id) ?? this.makeTile(cam);\n const isActive = cam === this.active;\n tile.el.toggleAttribute('data-active', isActive);\n tile.el.setAttribute('aria-pressed', String(isActive));\n if (grid && cells) {\n const [x, y, w, h] = cells[i + 1]!;\n Object.assign(tile.el.style, { left: `${x}%`, top: `${y}%`, width: `${w}%`, height: `${h}%` });\n } else {\n tile.el.style.cssText = '';\n }\n this.root.appendChild(tile.el); // sırayı koru\n // Seçili kamera önizlemede akmaz (zaten büyük oynuyor); diğerleri ayara göre video ya da poster.\n this.setPreview(tile, !isActive && (grid || this.wantsVideo()));\n });\n this.labelTiles();\n this.sync();\n }\n\n /** Grid'de ana videonun hücresi (CSS değişkenleri); null → tam alan. */\n private setMainRect(rect: Rect | null): void {\n const area = this.ctx.videoAreaEl;\n if (!rect) {\n area.removeAttribute('data-mv-grid');\n for (const k of ['x', 'y', 'w', 'h']) area.style.removeProperty(`--hp-mv-${k}`);\n if (!this.destroyed) return;\n area.removeAttribute('data-mv');\n return;\n }\n area.setAttribute('data-mv-grid', '');\n const [x, y, w, h] = rect;\n area.style.setProperty('--hp-mv-x', `${x}%`);\n area.style.setProperty('--hp-mv-y', `${y}%`);\n area.style.setProperty('--hp-mv-w', `${w}%`);\n area.style.setProperty('--hp-mv-h', `${h}%`);\n }\n\n private makeTile(cam: MultiviewSource): Tile {\n const el = document.createElement('button');\n el.type = 'button';\n el.className = 'hp-mv-tile';\n el.setAttribute('data-cam', cam.id);\n const label = document.createElement('span');\n label.className = 'hp-mv-label';\n label.textContent = cam.label;\n const badge = document.createElement('span');\n badge.className = 'hp-mv-badge';\n el.append(label, badge);\n el.addEventListener('click', () => void this.switchTo(cam.id));\n const tile: Tile = { cam, el, video: null, hls: null, img: null };\n this.tiles.set(cam.id, tile);\n return tile;\n }\n\n private labelTile(t: Tile): void {\n const i18n = this.ctx.i18n;\n const active = t.cam === this.active;\n t.el.setAttribute('aria-label', active ? `${t.cam.label} — ${i18n.multiviewWatching}` : i18n.multiviewSwitch(t.cam.label));\n const badge = t.el.querySelector('.hp-mv-badge')!;\n badge.textContent = active ? i18n.multiviewWatching : t.el.hasAttribute('data-waiting') ? i18n.multiviewNotStarted : '';\n }\n\n private labelTiles(): void {\n for (const t of this.tiles.values()) this.labelTile(t);\n }\n\n private dropTile(id: string): void {\n const t = this.tiles.get(id);\n if (!t) return;\n this.stopVideo(t);\n t.el.remove();\n this.tiles.delete(id);\n }\n\n private stopVideo(t: Tile): void {\n t.hls?.destroy();\n t.hls = null;\n if (t.video) {\n t.video.pause();\n t.video.removeAttribute('src');\n t.video.load();\n t.video.remove();\n t.video = null;\n }\n }\n\n /** Önizleme: video (sessiz, en düşük kalite) ya da poster. */\n private setPreview(t: Tile, video: boolean): void {\n if (!video) {\n this.stopVideo(t);\n if (!t.img && t.cam.poster) {\n const img = document.createElement('img');\n img.className = 'hp-mv-media';\n img.alt = '';\n img.decoding = 'async';\n img.src = t.cam.poster;\n img.addEventListener('error', () => img.remove());\n t.el.prepend(img);\n t.img = img;\n }\n return;\n }\n if (t.video) return;\n const v = document.createElement('video');\n v.className = 'hp-mv-media';\n v.muted = true;\n v.playsInline = true;\n v.setAttribute('playsinline', '');\n v.preload = 'auto';\n if (t.cam.poster) v.poster = t.cam.poster;\n t.el.prepend(v);\n t.video = v;\n void this.attach(t, v);\n }\n\n private async attach(t: Tile, v: HTMLVideoElement): Promise<void> {\n const cam = t.cam;\n const mse = typeof window.MediaSource !== 'undefined' || 'ManagedMediaSource' in window;\n if (isHls(cam) && mse) {\n if (!this.HlsCtor) this.HlsCtor = (await import('hls.js/light')).default as unknown as new (config: object) => HlsLike;\n if (t.video !== v) return;\n // Önizleme: en düşük kalite, kısa tampon.\n const hls = new this.HlsCtor({ startLevel: 0, capLevelToPlayerSize: true, maxBufferLength: 8, maxMaxBufferLength: 16, backBufferLength: 4 });\n hls.on('hlsManifestParsed', () => {\n hls.autoLevelCapping = 0;\n });\n hls.attachMedia(v);\n hls.loadSource(cam.src);\n t.hls = hls;\n } else {\n v.src = cam.src;\n }\n v.addEventListener('loadedmetadata', () => this.sync(), { once: true });\n }\n\n /** Önizlemeleri ana kameranın anına hizalar; oynat / duraklat / hızı izler. */\n private readonly sync = (): void => {\n if (this.destroyed || this.switching || this.options.sync === false) return;\n const main = this.ctx.videoEl;\n const clock = clockOf(main, this.ctx.mainHls());\n const mainDate = clock ? clock.date + (main.currentTime - clock.pos) * 1000 : null;\n const mainEvent = main.currentTime + (this.active.offset ?? 0);\n for (const t of this.tiles.values()) {\n const v = t.video;\n if (!v || v.readyState < 1) continue;\n const c = clockOf(v, t.hls);\n const want = mainDate !== null && c ? c.pos + (mainDate - c.date) / 1000 : mainEvent - (t.cam.offset ?? 0);\n // Kamera bu anda henüz yayında değil (etkinliğe sonra katıldı) ya da bitti.\n const s = v.seekable;\n const before = s.length ? want < s.start(0) - 0.2 : want < -0.2;\n const after = s.length ? want > s.end(s.length - 1) + 0.2 : false;\n const waiting = before || after;\n if (t.el.hasAttribute('data-waiting') !== waiting) {\n t.el.toggleAttribute('data-waiting', waiting);\n this.labelTile(t);\n }\n if (waiting) {\n if (!v.paused) v.pause();\n continue;\n }\n // Oynamaya hazır olmadan sarılmaz (hls.js ilk segmentte başlangıç konumuna sarıp ezerdi).\n if (v.readyState >= 3 && !v.seeking && Math.abs(v.currentTime - want) > DRIFT) v.currentTime = clamp(v, want);\n v.playbackRate = main.playbackRate || 1;\n if (main.paused || this.ctx.isAdActive()) {\n if (!v.paused) v.pause();\n } else if (v.paused) {\n void v.play().catch(() => {});\n }\n }\n };\n\n private readonly onMainPlay = (): void => this.sync();\n private readonly onMainPause = (): void => {\n for (const t of this.tiles.values()) t.video?.pause();\n };\n private readonly onRate = (): void => this.sync();\n\n private readonly onAdStart = (): void => {\n this.root.setAttribute('data-ad', '');\n this.onMainPause();\n };\n\n private readonly onAdEnd = (): void => {\n this.root.removeAttribute('data-ad');\n this.sync();\n };\n\n /** Canlı yayın posterleri: önbelleği atlayarak yenile. */\n private readonly refreshPosters = (): void => {\n for (const t of this.tiles.values()) {\n if (!t.img || !t.cam.poster) continue;\n const u = new URL(t.cam.poster, location.href);\n u.searchParams.set('_hp', String(Date.now()));\n t.img.src = u.toString();\n }\n };\n\n private waitFor(target: EventTarget, type: string, ms: number): Promise<void> {\n const v = target as HTMLVideoElement;\n // Olay zaten olmuşsa beklenmez.\n if ((type === 'loadedmetadata' && v.readyState >= 1) || (type === 'canplay' && v.readyState >= 3) || (type === 'seeked' && !v.seeking)) return Promise.resolve();\n return new Promise((resolve) => {\n const done = (): void => {\n clearTimeout(timer);\n target.removeEventListener(type, done);\n resolve();\n };\n const timer = setTimeout(done, ms);\n target.addEventListener(type, done, { once: true });\n });\n }\n\n /** Yeni yayının saat bilgisi (hls.js'te playlist yüklenince gelir) — en fazla 2 sn beklenir. */\n private async waitClock(v: HTMLVideoElement): Promise<{ pos: number; date: number } | null> {\n for (let i = 0; i < 20; i++) {\n const hls = this.ctx.mainHls();\n const c = clockOf(v, hls);\n if (c) return c;\n // Liste yüklendi ama saat etiketi yok (ya da hls.js değil) — beklemeye gerek yok, offset kullanılır.\n if (!hls || hls.levels?.some((l) => l.details)) return null;\n await new Promise((r) => setTimeout(r, 100));\n }\n return null;\n }\n}\n","import { registerLocaleStrings } from '../../i18n';\nimport { strings } from './strings';\nimport { Multiview, type HlsLike, type MultiviewPlayerContext } from './Multiview';\nimport type { MultiviewOptions } from '../../types';\n\nregisterLocaleStrings(strings);\n\nexport function installMultiview(ctx: MultiviewPlayerContext, options: MultiviewOptions): Multiview {\n return new Multiview(ctx, options);\n}\n\nexport { Multiview };\nexport type { HlsLike, MultiviewPlayerContext };\n"],"names":["strings","label","GRID","DRIFT","isHls","cam","clockOf","video","hls","details","_b","_a","_d","_c","l","frag","f","start","_e","t","clamp","pos","s","Multiview","ctx","options","__publicField","main","clock","mainDate","mainEvent","v","c","want","before","after","waiting","u","adoptStyle","css","ev","e","btn","i18n","layout","id","next","from","wasPaused","rate","startedAt","nowDate","nowEvent","target","elapsed","i","state","p","others","max","grid","keep","order","cells","x","y","w","h","tile","isActive","rect","area","k","el","badge","active","img","mse","type","ms","resolve","done","timer","r","registerLocaleStrings","installMultiview"],"mappings":"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"}
@@ -1,15 +1,16 @@
1
- var u = Object.defineProperty;
2
- var c = (o, e, t) => e in o ? u(o, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : o[e] = t;
3
- var s = (o, e, t) => c(o, typeof e != "symbol" ? e + "" : e, t);
4
- import { l as m } from "./gpt-CGXHTG_H.js";
5
- const v = [
1
+ var c = Object.defineProperty;
2
+ var u = (r, e, t) => e in r ? c(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
+ var s = (r, e, t) => u(r, typeof e != "symbol" ? e + "" : e, t);
4
+ import { a as m } from "./plugin-style-CPJELe-i.js";
5
+ import { l as f } from "./gpt-CGXHTG_H.js";
6
+ const v = ".video-area[data-pause-ad-ready]>:is(.media-layer,.hp-chrome,.hp-center-play,.hp-caption-layer,.hp-error-screen,.hp-mini-progress){right:var(--hp-pause-ad-w, 0px);transition:right .38s cubic-bezier(.2,.8,.2,1),opacity .2s ease}.video-area[data-pause-ad] .media-layer video{object-fit:cover}.hp-pause-ad{position:absolute;top:0;right:0;bottom:0;z-index:25;width:var(--hp-pause-ad-panel-w, 332px);box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;gap:10px;padding:12px 16px;background:var(--hp-color-surface, #0a0a0a);color:var(--hp-color-on-surface, #fff);transform:translate(100%);visibility:hidden;transition:transform .38s cubic-bezier(.2,.8,.2,1),visibility 0s linear .38s}.hp-pause-ad[data-open]{transform:none;visibility:visible;transition:transform .38s cubic-bezier(.2,.8,.2,1)}.hp-pause-ad-header{display:flex;align-items:center;justify-content:space-between;gap:8px}.hp-pause-ad-label{font-size:13px;font-weight:600;color:var(--hp-color-on-surface-muted, rgba(255, 255, 255, .7))}.hp-pause-ad-close{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:9999px;background:transparent;color:var(--hp-color-on-surface, #fff);cursor:pointer;transition:background-color .15s ease}.hp-pause-ad-close:hover{background:var(--hp-chip-bg-hover)}.hp-pause-ad-body{display:flex;justify-content:center;overflow:hidden;border-radius:8px}.hp-pause-ad-resume{align-self:stretch;padding:9px 14px;border:1px solid var(--hp-chip-border);border-radius:9999px;background:var(--hp-chip-bg);color:var(--hp-color-on-surface, #fff);font:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.hp-pause-ad-resume:hover{background:var(--hp-chip-bg-hover);border-color:var(--hp-chip-border-hover)}.hp-pause-ad-close:focus-visible,.hp-pause-ad-resume:focus-visible{outline:2px solid var(--hp-color-accent);outline-offset:2px}@media(prefers-reduced-motion:reduce){.video-area[data-pause-ad-ready]>:is(.media-layer,.hp-chrome,.hp-center-play,.hp-caption-layer,.hp-error-screen,.hp-mini-progress),.hp-pause-ad,.hp-pause-ad[data-open]{transition:none}}", b = [
6
7
  [300, 250],
7
8
  [336, 280],
8
9
  [250, 250],
9
10
  [200, 200]
10
- ], d = 16, y = 104, h = "hp-pause-ad", f = 420;
11
+ ], l = 16, y = 104, h = "hp-pause-ad", g = 420;
11
12
  let E = 0;
12
- class g {
13
+ class x {
13
14
  constructor(e, t) {
14
15
  s(this, "panel");
15
16
  s(this, "adHost");
@@ -44,58 +45,58 @@ class g {
44
45
  }
45
46
  if (!t || !this.ctx.videoEl.paused || this.ctx.isBlocked()) return;
46
47
  const i = Array.isArray(e.size) && typeof e.size[0] == "number" ? e.size[0] : null;
47
- this.show(i ? i + d * 2 : void 0, e.size);
48
+ this.show(i ? i + l * 2 : void 0, e.size);
48
49
  });
49
50
  this.ctx = e, this.options = t, this.divId = `hp-pause-ad-${++E}`, this.panel = document.createElement("div"), this.panel.className = "hp-pause-ad", this.panel.setAttribute("part", "pause-ad"), this.panel.setAttribute("aria-hidden", "true");
50
51
  const i = document.createElement("div");
51
52
  i.className = "hp-pause-ad-header", this.labelEl = document.createElement("span"), this.labelEl.className = "hp-pause-ad-label", this.closeBtn = document.createElement("button"), this.closeBtn.type = "button", this.closeBtn.className = "hp-pause-ad-close", this.closeBtn.innerHTML = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>', this.closeBtn.addEventListener("click", () => this.hide("closed")), i.append(this.labelEl, this.closeBtn);
52
- const n = document.createElement("div");
53
- n.className = "hp-pause-ad-body";
54
- const r = document.createElement("slot");
55
- r.name = h, n.appendChild(r), this.resumeBtn = document.createElement("button"), this.resumeBtn.type = "button", this.resumeBtn.className = "hp-pause-ad-resume", this.resumeBtn.addEventListener("click", () => void this.ctx.videoEl.play()), t.showResumeButton === !1 && (this.resumeBtn.style.display = "none"), this.panel.append(i, n, this.resumeBtn), this.panel.addEventListener("pointerdown", (a) => a.stopPropagation()), this.panel.addEventListener("click", (a) => a.stopPropagation()), e.videoArea.appendChild(this.panel), e.videoArea.setAttribute("data-pause-ad-ready", ""), this.adHost = document.createElement("div"), this.adHost.slot = h, this.adHost.id = this.divId, e.hostEl.appendChild(this.adHost), this.refreshLabels(), e.videoEl.addEventListener("pause", this.onPause), e.videoEl.addEventListener("play", this.onPlay);
53
+ const o = document.createElement("div");
54
+ o.className = "hp-pause-ad-body";
55
+ const n = document.createElement("slot");
56
+ n.name = h, o.appendChild(n), this.resumeBtn = document.createElement("button"), this.resumeBtn.type = "button", this.resumeBtn.className = "hp-pause-ad-resume", this.resumeBtn.addEventListener("click", () => void this.ctx.videoEl.play()), t.showResumeButton === !1 && (this.resumeBtn.style.display = "none"), this.panel.append(i, o, this.resumeBtn), this.panel.addEventListener("pointerdown", (a) => a.stopPropagation()), this.panel.addEventListener("click", (a) => a.stopPropagation()), e.videoArea.appendChild(this.panel), e.videoArea.setAttribute("data-pause-ad-ready", ""), this.adHost = document.createElement("div"), this.adHost.slot = h, this.adHost.id = this.divId, e.hostEl.appendChild(this.adHost), this.refreshLabels(), e.videoEl.addEventListener("pause", this.onPause), e.videoEl.addEventListener("play", this.onPlay);
56
57
  }
57
58
  refreshLabels() {
58
59
  this.labelEl.textContent = this.options.label ?? this.ctx.i18n.pauseAdLabel, this.closeBtn.setAttribute("aria-label", this.ctx.i18n.pauseAdClose), this.resumeBtn.textContent = this.ctx.i18n.pauseAdResume;
59
60
  }
60
61
  destroy() {
61
- var e, t, i, n;
62
- this.destroyed = !0, this.delayTimer && clearTimeout(this.delayTimer), this.ctx.videoEl.removeEventListener("pause", this.onPause), this.ctx.videoEl.removeEventListener("play", this.onPlay), (i = (e = this.googletag) == null ? void 0 : (t = e.pubads()).removeEventListener) == null || i.call(t, "slotRenderEnded", this.onRenderEnded), this.slot && ((n = this.googletag) == null || n.destroySlots([this.slot])), this.setShift(0), this.coverTimer && clearTimeout(this.coverTimer), this.ctx.videoArea.removeAttribute("data-pause-ad"), this.ctx.videoArea.removeAttribute("data-pause-ad-ready"), this.panel.remove(), this.adHost.remove();
62
+ var e, t, i, o;
63
+ this.destroyed = !0, this.delayTimer && clearTimeout(this.delayTimer), this.ctx.videoEl.removeEventListener("pause", this.onPause), this.ctx.videoEl.removeEventListener("play", this.onPlay), (i = (e = this.googletag) == null ? void 0 : (t = e.pubads()).removeEventListener) == null || i.call(t, "slotRenderEnded", this.onRenderEnded), this.slot && ((o = this.googletag) == null || o.destroySlots([this.slot])), this.setShift(0), this.coverTimer && clearTimeout(this.coverTimer), this.ctx.videoArea.removeAttribute("data-pause-ad"), this.ctx.videoArea.removeAttribute("data-pause-ad-ready"), this.panel.remove(), this.adHost.remove();
63
64
  }
64
65
  // ── istek / gösterim ──
65
66
  /** Alana sığan reklam boyutları (genişlik oranı + dikey alan) — hiçbiri sığmazsa gösterilmez. */
66
67
  fittingSizes() {
67
68
  const e = this.ctx.videoArea.getBoundingClientRect();
68
69
  if (e.width < (this.options.minPlayerWidth ?? 640)) return [];
69
- const t = e.width * (this.options.maxWidthRatio ?? 0.5) - d * 2, i = e.height - y;
70
- return (this.options.sizes ?? v).filter(([n, r]) => n <= t && r <= i);
70
+ const t = e.width * (this.options.maxWidthRatio ?? 0.5) - l * 2, i = e.height - y;
71
+ return (this.options.sizes ?? b).filter(([o, n]) => o <= t && n <= i);
71
72
  }
72
73
  async request() {
73
74
  const e = this.ctx.videoEl;
74
75
  if (this.destroyed || !e.paused || e.ended || e.seeking || this.ctx.isBlocked()) return;
75
76
  const t = this.fittingSizes();
76
77
  if (!t.length) return;
77
- const i = Math.max(...t.map(([l]) => l)) + d * 2;
78
+ const i = Math.max(...t.map(([d]) => d)) + l * 2;
78
79
  this.panel.style.setProperty("--hp-pause-ad-panel-w", `${i}px`);
79
- const n = (this.options.refreshIntervalSec ?? 30) * 1e3, r = JSON.stringify(t);
80
- if (this.slot && this.lastFilled && r === this.slotSizesKey && Date.now() - this.lastFetchAt < n) {
80
+ const o = (this.options.refreshIntervalSec ?? 30) * 1e3, n = JSON.stringify(t);
81
+ if (this.slot && this.lastFilled && n === this.slotSizesKey && Date.now() - this.lastFetchAt < o) {
81
82
  this.show(i);
82
83
  return;
83
84
  }
84
85
  try {
85
- this.googletag = this.googletag ?? await m();
86
- } catch (l) {
87
- console.warn("[HopePlayer pause-ad]", l);
86
+ this.googletag = this.googletag ?? await f();
87
+ } catch (d) {
88
+ console.warn("[HopePlayer pause-ad]", d);
88
89
  return;
89
90
  }
90
91
  if (this.destroyed || !e.paused) return;
91
92
  const a = this.googletag;
92
93
  this.waitingForRender = !0, a.cmd.push(() => {
93
94
  if (!this.destroyed) {
94
- if (!this.slot || r !== this.slotSizesKey) {
95
+ if (!this.slot || n !== this.slotSizesKey) {
95
96
  if (this.slot && a.destroySlots([this.slot]), this.slot = a.defineSlot(this.options.adUnitPath, t, this.divId), !this.slot) return;
96
97
  this.slot.addService(a.pubads());
97
- for (const [l, p] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(l, p);
98
- this.slotSizesKey = r, a.pubads().addEventListener("slotRenderEnded", this.onRenderEnded), a.enableServices(), a.display(this.divId), a.pubads().isInitialLoadDisabled() && a.pubads().refresh([this.slot]);
98
+ for (const [d, p] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(d, p);
99
+ this.slotSizesKey = n, a.pubads().addEventListener("slotRenderEnded", this.onRenderEnded), a.enableServices(), a.display(this.divId), a.pubads().isInitialLoadDisabled() && a.pubads().refresh([this.slot]);
99
100
  } else
100
101
  a.pubads().refresh([this.slot]);
101
102
  this.lastFetchAt = Date.now();
@@ -115,17 +116,17 @@ class g {
115
116
  const t = this.ctx.videoArea;
116
117
  this.coverTimer && clearTimeout(this.coverTimer), this.coverTimer = null, t.style.setProperty("--hp-pause-ad-w", `${e}px`), e > 0 ? t.setAttribute("data-pause-ad", "") : t.hasAttribute("data-pause-ad") && (this.coverTimer = setTimeout(() => {
117
118
  this.coverTimer = null, t.removeAttribute("data-pause-ad");
118
- }, f));
119
+ }, g));
119
120
  }
120
121
  emit(e, t, i) {
121
122
  this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:pausead", { detail: { state: e, size: t, reason: i } }));
122
123
  }
123
124
  }
124
- function T(o, e) {
125
- return new g(o, e);
125
+ function S(r, e) {
126
+ return m(r.videoEl, "pause-ad", v), new x(r, e);
126
127
  }
127
128
  export {
128
- g as PauseAd,
129
- T as installPauseAd
129
+ x as PauseAd,
130
+ S as installPauseAd
130
131
  };
131
- //# sourceMappingURL=pauseAd-BQQe21X4.js.map
132
+ //# sourceMappingURL=pauseAd-DF7KGwUs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pauseAd-BQQe21X4.js","sources":["../../src/plugins/pause-ad/PauseAd.ts","../../src/plugins/pause-ad/index.ts"],"sourcesContent":["import type { PauseAdOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { loadGpt, type GoogleTag, type GptSlot, type GptSlotRenderEndedEvent } from './loadGpt';\n\nexport interface PauseAdPlayerContext {\n videoEl: HTMLVideoElement;\n /** Light DOM sahibi (GPT reklam div'ini bulabilsin diye slot'lu div buraya eklenir) + hp:pausead olayları. */\n hostEl: HTMLElement;\n videoArea: HTMLElement;\n i18n: HopeLocaleStrings;\n /** IMA reklamı oynuyor ya da giriş ekranı (countdown/geo) açık — bu sırada gösterilmez. */\n isBlocked(): boolean;\n}\n\nconst DEFAULT_SIZES: Array<[number, number]> = [\n [300, 250],\n [336, 280],\n [250, 250],\n [200, 200],\n];\nconst PANEL_PADDING_X = 16;\n/** Başlık + \"Videoya devam et\" satırı + boşluklar (px) — dikey sığma hesabı için. */\nconst PANEL_CHROME_Y = 104;\nconst SLOT_NAME = 'hp-pause-ad';\n/** tailwind.css'teki sıkışma geçişiyle (380ms) aynı + küçük pay. */\nconst SHIFT_TRANSITION_MS = 420;\nlet instanceCount = 0;\n\n/**\n * Pause reklamı: video duraklatılınca Google display reklamı (GPT) istenir; dolarsa video sola animasyonla\n * sıkışır (cover — dış kenarlar kırpılır), sağdan reklam paneli kayar. Boş dönerse hiçbir şey açılmaz.\n * GPT reklamı document.getElementById ile bulur — Shadow DOM'u göremez; bu yüzden reklam div'i host'un light\n * DOM çocuğu olarak oluşturulup paneldeki <slot>'a yansıtılır.\n */\nexport class PauseAd {\n private readonly panel: HTMLDivElement;\n private readonly adHost: HTMLDivElement;\n private readonly labelEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private readonly resumeBtn: HTMLButtonElement;\n private readonly divId: string;\n private googletag: GoogleTag | null = null;\n private slot: GptSlot | null = null;\n private slotSizesKey = '';\n private lastFetchAt = 0;\n private lastFilled = false;\n private waitingForRender = false;\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n private coverTimer: ReturnType<typeof setTimeout> | null = null;\n private open = false;\n private destroyed = false;\n\n constructor(\n private readonly ctx: PauseAdPlayerContext,\n private readonly options: PauseAdOptions\n ) {\n this.divId = `hp-pause-ad-${++instanceCount}`;\n\n this.panel = document.createElement('div');\n this.panel.className = 'hp-pause-ad';\n this.panel.setAttribute('part', 'pause-ad');\n this.panel.setAttribute('aria-hidden', 'true');\n\n const header = document.createElement('div');\n header.className = 'hp-pause-ad-header';\n this.labelEl = document.createElement('span');\n this.labelEl.className = 'hp-pause-ad-label';\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-pause-ad-close';\n this.closeBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n this.closeBtn.addEventListener('click', () => this.hide('closed'));\n header.append(this.labelEl, this.closeBtn);\n\n const body = document.createElement('div');\n body.className = 'hp-pause-ad-body';\n const slotEl = document.createElement('slot');\n slotEl.name = SLOT_NAME;\n body.appendChild(slotEl);\n\n this.resumeBtn = document.createElement('button');\n this.resumeBtn.type = 'button';\n this.resumeBtn.className = 'hp-pause-ad-resume';\n this.resumeBtn.addEventListener('click', () => void this.ctx.videoEl.play());\n if (options.showResumeButton === false) this.resumeBtn.style.display = 'none';\n\n this.panel.append(header, body, this.resumeBtn);\n // Videoya dokunma/tıklama (oynat/duraklat) panelden tetiklenmesin.\n this.panel.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.panel.addEventListener('click', (e) => e.stopPropagation());\n ctx.videoArea.appendChild(this.panel);\n ctx.videoArea.setAttribute('data-pause-ad-ready', '');\n\n // Light DOM reklam kapsayıcısı — GPT bunu id ile bulur; görüntüsü paneldeki slot'ta.\n this.adHost = document.createElement('div');\n this.adHost.slot = SLOT_NAME;\n this.adHost.id = this.divId;\n ctx.hostEl.appendChild(this.adHost);\n\n this.refreshLabels();\n ctx.videoEl.addEventListener('pause', this.onPause);\n ctx.videoEl.addEventListener('play', this.onPlay);\n }\n\n refreshLabels(): void {\n this.labelEl.textContent = this.options.label ?? this.ctx.i18n.pauseAdLabel;\n this.closeBtn.setAttribute('aria-label', this.ctx.i18n.pauseAdClose);\n this.resumeBtn.textContent = this.ctx.i18n.pauseAdResume;\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.ctx.videoEl.removeEventListener('pause', this.onPause);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.googletag?.pubads().removeEventListener?.('slotRenderEnded', this.onRenderEnded);\n if (this.slot) this.googletag?.destroySlots([this.slot]);\n this.setShift(0);\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.ctx.videoArea.removeAttribute('data-pause-ad');\n this.ctx.videoArea.removeAttribute('data-pause-ad-ready');\n this.panel.remove();\n this.adHost.remove();\n }\n\n // ── olaylar ──\n\n private readonly onPause = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.delayTimer = setTimeout(() => void this.request(), this.options.delayMs ?? 300);\n };\n\n private readonly onPlay = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.waitingForRender = false;\n this.hide('resumed');\n };\n\n // ── istek / gösterim ──\n\n /** Alana sığan reklam boyutları (genişlik oranı + dikey alan) — hiçbiri sığmazsa gösterilmez. */\n private fittingSizes(): Array<[number, number]> {\n const area = this.ctx.videoArea.getBoundingClientRect();\n if (area.width < (this.options.minPlayerWidth ?? 640)) return [];\n const maxW = area.width * (this.options.maxWidthRatio ?? 0.5) - PANEL_PADDING_X * 2;\n const maxH = area.height - PANEL_CHROME_Y;\n return (this.options.sizes ?? DEFAULT_SIZES).filter(([w, h]) => w <= maxW && h <= maxH);\n }\n\n private async request(): Promise<void> {\n const v = this.ctx.videoEl;\n if (this.destroyed || !v.paused || v.ended || v.seeking || this.ctx.isBlocked()) return;\n const sizes = this.fittingSizes();\n if (!sizes.length) return;\n\n // Panel genişliği: sığan en geniş reklam + iç boşluk.\n const panelW = Math.max(...sizes.map(([w]) => w)) + PANEL_PADDING_X * 2;\n this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n\n const refreshMs = (this.options.refreshIntervalSec ?? 30) * 1000;\n const sizesKey = JSON.stringify(sizes);\n // Yakın zamanda doldurulmuş ve boyutlar aynı → yeni istek atmadan mevcut reklamı göster.\n if (this.slot && this.lastFilled && sizesKey === this.slotSizesKey && Date.now() - this.lastFetchAt < refreshMs) {\n this.show(panelW);\n return;\n }\n\n try {\n this.googletag = this.googletag ?? (await loadGpt());\n } catch (err) {\n console.warn('[HopePlayer pause-ad]', err);\n return;\n }\n if (this.destroyed || !v.paused) return;\n const gt = this.googletag;\n this.waitingForRender = true;\n gt.cmd.push(() => {\n if (this.destroyed) return;\n if (!this.slot || sizesKey !== this.slotSizesKey) {\n if (this.slot) gt.destroySlots([this.slot]);\n this.slot = gt.defineSlot(this.options.adUnitPath, sizes, this.divId);\n if (!this.slot) return;\n this.slot.addService(gt.pubads());\n for (const [k, val] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(k, val);\n this.slotSizesKey = sizesKey;\n gt.pubads().addEventListener('slotRenderEnded', this.onRenderEnded);\n gt.enableServices();\n gt.display(this.divId);\n // Sayfa disableInitialLoad kullanıyorsa display istek atmaz — elle refresh.\n if (gt.pubads().isInitialLoadDisabled()) gt.pubads().refresh([this.slot]);\n } else {\n gt.pubads().refresh([this.slot]);\n }\n this.lastFetchAt = Date.now();\n });\n }\n\n private readonly onRenderEnded = (e: GptSlotRenderEndedEvent): void => {\n if (e.slot !== this.slot) return;\n this.lastFilled = !e.isEmpty;\n const wasWaiting = this.waitingForRender;\n this.waitingForRender = false;\n if (e.isEmpty) {\n this.emit('empty');\n return;\n }\n // İstek sürerken kullanıcı oynattıysa açma.\n if (!wasWaiting || !this.ctx.videoEl.paused || this.ctx.isBlocked()) return;\n const width = Array.isArray(e.size) && typeof e.size[0] === 'number' ? e.size[0] : null;\n this.show(width ? width + PANEL_PADDING_X * 2 : undefined, e.size as [number, number] | undefined);\n };\n\n private show(panelW?: number, size?: [number, number]): void {\n if (panelW) this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n const w = parseFloat(this.panel.style.getPropertyValue('--hp-pause-ad-panel-w')) || 332;\n this.open = true;\n this.panel.setAttribute('data-open', '');\n this.panel.setAttribute('aria-hidden', 'false');\n this.setShift(w);\n this.emit('shown', size);\n }\n\n private hide(reason: 'closed' | 'resumed'): void {\n if (!this.open) return;\n this.open = false;\n this.panel.removeAttribute('data-open');\n this.panel.setAttribute('aria-hidden', 'true');\n this.setShift(0);\n this.emit('hidden', undefined, reason);\n }\n\n /** Video ve kontrolleri panel genişliği kadar sola sıkıştırır (tailwind.css `.video-area[data-pause-ad]`). */\n private setShift(px: number): void {\n const area = this.ctx.videoArea;\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.coverTimer = null;\n area.style.setProperty('--hp-pause-ad-w', `${px}px`);\n if (px > 0) {\n area.setAttribute('data-pause-ad', '');\n } else if (area.hasAttribute('data-pause-ad')) {\n // cover, genişleme animasyonu bitene kadar kalır — hemen contain'e dönmek kapanışta görüntüyü sıçratıyordu.\n this.coverTimer = setTimeout(() => {\n this.coverTimer = null;\n area.removeAttribute('data-pause-ad');\n }, SHIFT_TRANSITION_MS);\n }\n }\n\n private emit(state: 'shown' | 'hidden' | 'empty', size?: [number, number], reason?: 'closed' | 'resumed'): void {\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:pausead', { detail: { state, size, reason } }));\n }\n}\n","import { PauseAd, type PauseAdPlayerContext } from './PauseAd';\nimport type { PauseAdOptions } from '../../types';\n\nexport function installPauseAd(ctx: PauseAdPlayerContext, options: PauseAdOptions): PauseAd {\n return new PauseAd(ctx, options);\n}\n\nexport { PauseAd };\nexport type { PauseAdPlayerContext };\n"],"names":["DEFAULT_SIZES","PANEL_PADDING_X","PANEL_CHROME_Y","SLOT_NAME","SHIFT_TRANSITION_MS","instanceCount","PauseAd","ctx","options","__publicField","wasWaiting","width","header","body","slotEl","e","_c","_a","_b","_d","area","maxW","maxH","w","h","v","sizes","panelW","refreshMs","sizesKey","loadGpt","err","gt","k","val","size","reason","px","state","installPauseAd"],"mappings":"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"}
1
+ {"version":3,"file":"pauseAd-DF7KGwUs.js","sources":["../../src/plugins/pause-ad/PauseAd.ts","../../src/plugins/pause-ad/index.ts"],"sourcesContent":["import type { PauseAdOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { loadGpt, type GoogleTag, type GptSlot, type GptSlotRenderEndedEvent } from './loadGpt';\n\nexport interface PauseAdPlayerContext {\n videoEl: HTMLVideoElement;\n /** Light DOM sahibi (GPT reklam div'ini bulabilsin diye slot'lu div buraya eklenir) + hp:pausead olayları. */\n hostEl: HTMLElement;\n videoArea: HTMLElement;\n i18n: HopeLocaleStrings;\n /** IMA reklamı oynuyor ya da giriş ekranı (countdown/geo) açık — bu sırada gösterilmez. */\n isBlocked(): boolean;\n}\n\nconst DEFAULT_SIZES: Array<[number, number]> = [\n [300, 250],\n [336, 280],\n [250, 250],\n [200, 200],\n];\nconst PANEL_PADDING_X = 16;\n/** Başlık + \"Videoya devam et\" satırı + boşluklar (px) — dikey sığma hesabı için. */\nconst PANEL_CHROME_Y = 104;\nconst SLOT_NAME = 'hp-pause-ad';\n/** tailwind.css'teki sıkışma geçişiyle (380ms) aynı + küçük pay. */\nconst SHIFT_TRANSITION_MS = 420;\nlet instanceCount = 0;\n\n/**\n * Pause reklamı: video duraklatılınca Google display reklamı (GPT) istenir; dolarsa video sola animasyonla\n * sıkışır (cover — dış kenarlar kırpılır), sağdan reklam paneli kayar. Boş dönerse hiçbir şey açılmaz.\n * GPT reklamı document.getElementById ile bulur — Shadow DOM'u göremez; bu yüzden reklam div'i host'un light\n * DOM çocuğu olarak oluşturulup paneldeki <slot>'a yansıtılır.\n */\nexport class PauseAd {\n private readonly panel: HTMLDivElement;\n private readonly adHost: HTMLDivElement;\n private readonly labelEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private readonly resumeBtn: HTMLButtonElement;\n private readonly divId: string;\n private googletag: GoogleTag | null = null;\n private slot: GptSlot | null = null;\n private slotSizesKey = '';\n private lastFetchAt = 0;\n private lastFilled = false;\n private waitingForRender = false;\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n private coverTimer: ReturnType<typeof setTimeout> | null = null;\n private open = false;\n private destroyed = false;\n\n constructor(\n private readonly ctx: PauseAdPlayerContext,\n private readonly options: PauseAdOptions\n ) {\n this.divId = `hp-pause-ad-${++instanceCount}`;\n\n this.panel = document.createElement('div');\n this.panel.className = 'hp-pause-ad';\n this.panel.setAttribute('part', 'pause-ad');\n this.panel.setAttribute('aria-hidden', 'true');\n\n const header = document.createElement('div');\n header.className = 'hp-pause-ad-header';\n this.labelEl = document.createElement('span');\n this.labelEl.className = 'hp-pause-ad-label';\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-pause-ad-close';\n this.closeBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n this.closeBtn.addEventListener('click', () => this.hide('closed'));\n header.append(this.labelEl, this.closeBtn);\n\n const body = document.createElement('div');\n body.className = 'hp-pause-ad-body';\n const slotEl = document.createElement('slot');\n slotEl.name = SLOT_NAME;\n body.appendChild(slotEl);\n\n this.resumeBtn = document.createElement('button');\n this.resumeBtn.type = 'button';\n this.resumeBtn.className = 'hp-pause-ad-resume';\n this.resumeBtn.addEventListener('click', () => void this.ctx.videoEl.play());\n if (options.showResumeButton === false) this.resumeBtn.style.display = 'none';\n\n this.panel.append(header, body, this.resumeBtn);\n // Videoya dokunma/tıklama (oynat/duraklat) panelden tetiklenmesin.\n this.panel.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.panel.addEventListener('click', (e) => e.stopPropagation());\n ctx.videoArea.appendChild(this.panel);\n ctx.videoArea.setAttribute('data-pause-ad-ready', '');\n\n // Light DOM reklam kapsayıcısı — GPT bunu id ile bulur; görüntüsü paneldeki slot'ta.\n this.adHost = document.createElement('div');\n this.adHost.slot = SLOT_NAME;\n this.adHost.id = this.divId;\n ctx.hostEl.appendChild(this.adHost);\n\n this.refreshLabels();\n ctx.videoEl.addEventListener('pause', this.onPause);\n ctx.videoEl.addEventListener('play', this.onPlay);\n }\n\n refreshLabels(): void {\n this.labelEl.textContent = this.options.label ?? this.ctx.i18n.pauseAdLabel;\n this.closeBtn.setAttribute('aria-label', this.ctx.i18n.pauseAdClose);\n this.resumeBtn.textContent = this.ctx.i18n.pauseAdResume;\n }\n\n destroy(): void {\n this.destroyed = true;\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.ctx.videoEl.removeEventListener('pause', this.onPause);\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.googletag?.pubads().removeEventListener?.('slotRenderEnded', this.onRenderEnded);\n if (this.slot) this.googletag?.destroySlots([this.slot]);\n this.setShift(0);\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.ctx.videoArea.removeAttribute('data-pause-ad');\n this.ctx.videoArea.removeAttribute('data-pause-ad-ready');\n this.panel.remove();\n this.adHost.remove();\n }\n\n // ── olaylar ──\n\n private readonly onPause = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.delayTimer = setTimeout(() => void this.request(), this.options.delayMs ?? 300);\n };\n\n private readonly onPlay = (): void => {\n if (this.delayTimer) clearTimeout(this.delayTimer);\n this.waitingForRender = false;\n this.hide('resumed');\n };\n\n // ── istek / gösterim ──\n\n /** Alana sığan reklam boyutları (genişlik oranı + dikey alan) — hiçbiri sığmazsa gösterilmez. */\n private fittingSizes(): Array<[number, number]> {\n const area = this.ctx.videoArea.getBoundingClientRect();\n if (area.width < (this.options.minPlayerWidth ?? 640)) return [];\n const maxW = area.width * (this.options.maxWidthRatio ?? 0.5) - PANEL_PADDING_X * 2;\n const maxH = area.height - PANEL_CHROME_Y;\n return (this.options.sizes ?? DEFAULT_SIZES).filter(([w, h]) => w <= maxW && h <= maxH);\n }\n\n private async request(): Promise<void> {\n const v = this.ctx.videoEl;\n if (this.destroyed || !v.paused || v.ended || v.seeking || this.ctx.isBlocked()) return;\n const sizes = this.fittingSizes();\n if (!sizes.length) return;\n\n // Panel genişliği: sığan en geniş reklam + iç boşluk.\n const panelW = Math.max(...sizes.map(([w]) => w)) + PANEL_PADDING_X * 2;\n this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n\n const refreshMs = (this.options.refreshIntervalSec ?? 30) * 1000;\n const sizesKey = JSON.stringify(sizes);\n // Yakın zamanda doldurulmuş ve boyutlar aynı → yeni istek atmadan mevcut reklamı göster.\n if (this.slot && this.lastFilled && sizesKey === this.slotSizesKey && Date.now() - this.lastFetchAt < refreshMs) {\n this.show(panelW);\n return;\n }\n\n try {\n this.googletag = this.googletag ?? (await loadGpt());\n } catch (err) {\n console.warn('[HopePlayer pause-ad]', err);\n return;\n }\n if (this.destroyed || !v.paused) return;\n const gt = this.googletag;\n this.waitingForRender = true;\n gt.cmd.push(() => {\n if (this.destroyed) return;\n if (!this.slot || sizesKey !== this.slotSizesKey) {\n if (this.slot) gt.destroySlots([this.slot]);\n this.slot = gt.defineSlot(this.options.adUnitPath, sizes, this.divId);\n if (!this.slot) return;\n this.slot.addService(gt.pubads());\n for (const [k, val] of Object.entries(this.options.targeting ?? {})) this.slot.setTargeting(k, val);\n this.slotSizesKey = sizesKey;\n gt.pubads().addEventListener('slotRenderEnded', this.onRenderEnded);\n gt.enableServices();\n gt.display(this.divId);\n // Sayfa disableInitialLoad kullanıyorsa display istek atmaz — elle refresh.\n if (gt.pubads().isInitialLoadDisabled()) gt.pubads().refresh([this.slot]);\n } else {\n gt.pubads().refresh([this.slot]);\n }\n this.lastFetchAt = Date.now();\n });\n }\n\n private readonly onRenderEnded = (e: GptSlotRenderEndedEvent): void => {\n if (e.slot !== this.slot) return;\n this.lastFilled = !e.isEmpty;\n const wasWaiting = this.waitingForRender;\n this.waitingForRender = false;\n if (e.isEmpty) {\n this.emit('empty');\n return;\n }\n // İstek sürerken kullanıcı oynattıysa açma.\n if (!wasWaiting || !this.ctx.videoEl.paused || this.ctx.isBlocked()) return;\n const width = Array.isArray(e.size) && typeof e.size[0] === 'number' ? e.size[0] : null;\n this.show(width ? width + PANEL_PADDING_X * 2 : undefined, e.size as [number, number] | undefined);\n };\n\n private show(panelW?: number, size?: [number, number]): void {\n if (panelW) this.panel.style.setProperty('--hp-pause-ad-panel-w', `${panelW}px`);\n const w = parseFloat(this.panel.style.getPropertyValue('--hp-pause-ad-panel-w')) || 332;\n this.open = true;\n this.panel.setAttribute('data-open', '');\n this.panel.setAttribute('aria-hidden', 'false');\n this.setShift(w);\n this.emit('shown', size);\n }\n\n private hide(reason: 'closed' | 'resumed'): void {\n if (!this.open) return;\n this.open = false;\n this.panel.removeAttribute('data-open');\n this.panel.setAttribute('aria-hidden', 'true');\n this.setShift(0);\n this.emit('hidden', undefined, reason);\n }\n\n /** Video ve kontrolleri panel genişliği kadar sola sıkıştırır (tailwind.css `.video-area[data-pause-ad]`). */\n private setShift(px: number): void {\n const area = this.ctx.videoArea;\n if (this.coverTimer) clearTimeout(this.coverTimer);\n this.coverTimer = null;\n area.style.setProperty('--hp-pause-ad-w', `${px}px`);\n if (px > 0) {\n area.setAttribute('data-pause-ad', '');\n } else if (area.hasAttribute('data-pause-ad')) {\n // cover, genişleme animasyonu bitene kadar kalır — hemen contain'e dönmek kapanışta görüntüyü sıçratıyordu.\n this.coverTimer = setTimeout(() => {\n this.coverTimer = null;\n area.removeAttribute('data-pause-ad');\n }, SHIFT_TRANSITION_MS);\n }\n }\n\n private emit(state: 'shown' | 'hidden' | 'empty', size?: [number, number], reason?: 'closed' | 'resumed'): void {\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:pausead', { detail: { state, size, reason } }));\n }\n}\n","import { adoptStyle } from '../../utils/plugin-style';\nimport css from './pause-ad.css?inline';\nimport { PauseAd, type PauseAdPlayerContext } from './PauseAd';\nimport type { PauseAdOptions } from '../../types';\n\nexport function installPauseAd(ctx: PauseAdPlayerContext, options: PauseAdOptions): PauseAd {\n adoptStyle(ctx.videoEl, 'pause-ad', css);\n return new PauseAd(ctx, options);\n}\n\nexport { PauseAd };\nexport type { PauseAdPlayerContext };\n"],"names":["DEFAULT_SIZES","PANEL_PADDING_X","PANEL_CHROME_Y","SLOT_NAME","SHIFT_TRANSITION_MS","instanceCount","PauseAd","ctx","options","__publicField","wasWaiting","width","header","body","slotEl","e","_c","_a","_b","_d","area","maxW","maxH","w","h","v","sizes","panelW","refreshMs","sizesKey","loadGpt","err","gt","k","val","size","reason","px","state","installPauseAd","adoptStyle","css"],"mappings":"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"}