@hopeplayer/core 1.4.0 → 1.6.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 (151) hide show
  1. package/dist/HopePlayerElement.d.ts +42 -2
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/NativeEme-CXosVcw8.js +80 -0
  4. package/dist/chunks/NativeEme-CXosVcw8.js.map +1 -0
  5. package/dist/chunks/{accessibility-DeUIoAda.js → accessibility-DFx4CE0H.js} +9 -8
  6. package/dist/chunks/{accessibility-DeUIoAda.js.map → accessibility-DFx4CE0H.js.map} +1 -1
  7. package/dist/chunks/adTriggers-BIAWe8o4.js +419 -0
  8. package/dist/chunks/adTriggers-BIAWe8o4.js.map +1 -0
  9. package/dist/chunks/{ads-CdWbE9aD.js → ads-DlpHPpR9.js} +3 -3
  10. package/dist/chunks/ads-DlpHPpR9.js.map +1 -0
  11. package/dist/chunks/analytics-DEjTAJO9.js +281 -0
  12. package/dist/chunks/analytics-DEjTAJO9.js.map +1 -0
  13. package/dist/chunks/{cast-BQ-suTcF.js → cast-vHyi7oV_.js} +2 -2
  14. package/dist/chunks/{cast-BQ-suTcF.js.map → cast-vHyi7oV_.js.map} +1 -1
  15. package/dist/chunks/dash-CWjy-y7B.js +22 -0
  16. package/dist/chunks/dash-CWjy-y7B.js.map +1 -0
  17. package/dist/chunks/docPip-wybMVP1H.js +82 -0
  18. package/dist/chunks/docPip-wybMVP1H.js.map +1 -0
  19. package/dist/chunks/heatmap-Bb7neaYU.js +92 -0
  20. package/dist/chunks/heatmap-Bb7neaYU.js.map +1 -0
  21. package/dist/chunks/{history-DAbqEhNB.js → history-CwqLXiZi.js} +2 -2
  22. package/dist/chunks/{history-DAbqEhNB.js.map → history-CwqLXiZi.js.map} +1 -1
  23. package/dist/chunks/interactive-CgltIneu.js +189 -0
  24. package/dist/chunks/interactive-CgltIneu.js.map +1 -0
  25. package/dist/chunks/keySystems-CNzjRq6e.js +70 -0
  26. package/dist/chunks/keySystems-CNzjRq6e.js.map +1 -0
  27. package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
  28. package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
  29. package/dist/chunks/{markers-B04NMI79.js → markers-L69W3kj6.js} +53 -51
  30. package/dist/chunks/markers-L69W3kj6.js.map +1 -0
  31. package/dist/chunks/player-D2_HRzot.js +4351 -0
  32. package/dist/chunks/player-D2_HRzot.js.map +1 -0
  33. package/dist/chunks/{playlist-C6Mh9BE8.js → playlist-CHfStNbQ.js} +29 -21
  34. package/dist/chunks/playlist-CHfStNbQ.js.map +1 -0
  35. package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
  36. package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
  37. package/dist/chunks/pluginHost-cN2uGFeG.js +566 -0
  38. package/dist/chunks/pluginHost-cN2uGFeG.js.map +1 -0
  39. package/dist/chunks/redirectScreen-TIqLdvBY.js +239 -0
  40. package/dist/chunks/redirectScreen-TIqLdvBY.js.map +1 -0
  41. package/dist/chunks/{rewardedUnlock-CGhQyWOk.js → rewardedUnlock-DUqYwXTr.js} +2 -2
  42. package/dist/chunks/{rewardedUnlock-CGhQyWOk.js.map → rewardedUnlock-DUqYwXTr.js.map} +1 -1
  43. package/dist/chunks/segments-Ds-c1b5e.js +66 -0
  44. package/dist/chunks/segments-Ds-c1b5e.js.map +1 -0
  45. package/dist/chunks/{skipSegments-BbWzPpXz.js → skipSegments-ByNoF1qZ.js} +2 -2
  46. package/dist/chunks/{skipSegments-BbWzPpXz.js.map → skipSegments-ByNoF1qZ.js.map} +1 -1
  47. package/dist/chunks/{spriteThumbnails-B7oDZFTo.js → spriteThumbnails-Cr9UmkM9.js} +74 -51
  48. package/dist/chunks/spriteThumbnails-Cr9UmkM9.js.map +1 -0
  49. package/dist/chunks/{statsPanel-DSClIwA3.js → statsPanel-D0DtoFgS.js} +2 -2
  50. package/dist/chunks/statsPanel-D0DtoFgS.js.map +1 -0
  51. package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
  52. package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
  53. package/dist/chunks/{story-BLBij82f.js → story-CodA2dfn.js} +2 -2
  54. package/dist/chunks/{story-BLBij82f.js.map → story-CodA2dfn.js.map} +1 -1
  55. package/dist/chunks/transcript-LG7E9UYE.js +186 -0
  56. package/dist/chunks/transcript-LG7E9UYE.js.map +1 -0
  57. package/dist/controls/ContextMenu.d.ts +1 -0
  58. package/dist/controls/ContextMenu.d.ts.map +1 -1
  59. package/dist/controls/ControlBar.d.ts +6 -0
  60. package/dist/controls/ControlBar.d.ts.map +1 -1
  61. package/dist/controls/SeekBar.d.ts +5 -2
  62. package/dist/controls/SeekBar.d.ts.map +1 -1
  63. package/dist/controls/SettingsMenu.d.ts +2 -1
  64. package/dist/controls/SettingsMenu.d.ts.map +1 -1
  65. package/dist/drm/NativeEme.d.ts +23 -0
  66. package/dist/drm/NativeEme.d.ts.map +1 -0
  67. package/dist/drm/keySystems.d.ts +18 -0
  68. package/dist/drm/keySystems.d.ts.map +1 -0
  69. package/dist/hls/SourceManager.d.ts +31 -5
  70. package/dist/hls/SourceManager.d.ts.map +1 -1
  71. package/dist/hls/dashEngine.d.ts +85 -0
  72. package/dist/hls/dashEngine.d.ts.map +1 -0
  73. package/dist/hls/sourceGroups.d.ts.map +1 -1
  74. package/dist/hope-player.js +1 -1
  75. package/dist/i18n/locales/en.d.ts.map +1 -1
  76. package/dist/i18n/locales/tr.d.ts.map +1 -1
  77. package/dist/i18n/types.d.ts +28 -0
  78. package/dist/i18n/types.d.ts.map +1 -1
  79. package/dist/index.d.ts +2 -2
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/keyboard/KeyboardController.d.ts +14 -0
  82. package/dist/keyboard/KeyboardController.d.ts.map +1 -1
  83. package/dist/plugin-api/PluginAds.d.ts +61 -0
  84. package/dist/plugin-api/PluginAds.d.ts.map +1 -0
  85. package/dist/plugin-api/PluginHost.d.ts +6 -0
  86. package/dist/plugin-api/PluginHost.d.ts.map +1 -1
  87. package/dist/plugin-api/types.d.ts +39 -0
  88. package/dist/plugin-api/types.d.ts.map +1 -1
  89. package/dist/plugins/accessibility/Accessibility.d.ts.map +1 -1
  90. package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
  91. package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
  92. package/dist/plugins/ads/AdsController.d.ts +2 -0
  93. package/dist/plugins/ads/AdsController.d.ts.map +1 -1
  94. package/dist/plugins/analytics/QoeTracker.d.ts +71 -0
  95. package/dist/plugins/analytics/QoeTracker.d.ts.map +1 -0
  96. package/dist/plugins/analytics/index.d.ts +6 -0
  97. package/dist/plugins/analytics/index.d.ts.map +1 -0
  98. package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
  99. package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
  100. package/dist/plugins/doc-pip/index.d.ts +5 -0
  101. package/dist/plugins/doc-pip/index.d.ts.map +1 -0
  102. package/dist/plugins/heatmap/Heatmap.d.ts +36 -0
  103. package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
  104. package/dist/plugins/heatmap/index.d.ts +6 -0
  105. package/dist/plugins/heatmap/index.d.ts.map +1 -0
  106. package/dist/plugins/interactive/Interactive.d.ts +45 -0
  107. package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
  108. package/dist/plugins/interactive/index.d.ts +6 -0
  109. package/dist/plugins/interactive/index.d.ts.map +1 -0
  110. package/dist/plugins/markers/MarkProgress.d.ts +3 -1
  111. package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
  112. package/dist/plugins/playlist/PlaylistRunner.d.ts +2 -0
  113. package/dist/plugins/playlist/PlaylistRunner.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/segments/Segments.d.ts +1 -0
  117. package/dist/plugins/segments/Segments.d.ts.map +1 -1
  118. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +9 -0
  119. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
  120. package/dist/plugins/sticky/StickyManager.d.ts +2 -0
  121. package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
  122. package/dist/plugins/transcript/Transcript.d.ts +65 -0
  123. package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
  124. package/dist/plugins/transcript/index.d.ts +6 -0
  125. package/dist/plugins/transcript/index.d.ts.map +1 -0
  126. package/dist/screens/ErrorScreen.d.ts +1 -1
  127. package/dist/screens/ErrorScreen.d.ts.map +1 -1
  128. package/dist/subtitles/attachTracks.d.ts +6 -0
  129. package/dist/subtitles/attachTracks.d.ts.map +1 -1
  130. package/dist/types/index.d.ts +320 -16
  131. package/dist/types/index.d.ts.map +1 -1
  132. package/dist/utils/plugin-style.d.ts +5 -0
  133. package/dist/utils/plugin-style.d.ts.map +1 -0
  134. package/package.json +2 -1
  135. package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
  136. package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
  137. package/dist/chunks/ads-CdWbE9aD.js.map +0 -1
  138. package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
  139. package/dist/chunks/markers-B04NMI79.js.map +0 -1
  140. package/dist/chunks/player-D7WQxMzr.js +0 -3894
  141. package/dist/chunks/player-D7WQxMzr.js.map +0 -1
  142. package/dist/chunks/playlist-C6Mh9BE8.js.map +0 -1
  143. package/dist/chunks/pluginHost-DjvLmMYZ.js +0 -376
  144. package/dist/chunks/pluginHost-DjvLmMYZ.js.map +0 -1
  145. package/dist/chunks/redirectScreen-5HAVRtxe.js +0 -208
  146. package/dist/chunks/redirectScreen-5HAVRtxe.js.map +0 -1
  147. package/dist/chunks/segments-gCPrWRig.js +0 -63
  148. package/dist/chunks/segments-gCPrWRig.js.map +0 -1
  149. package/dist/chunks/spriteThumbnails-B7oDZFTo.js.map +0 -1
  150. package/dist/chunks/statsPanel-DSClIwA3.js.map +0 -1
  151. package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginHost-cN2uGFeG.js","sources":["../../src/plugin-api/PluginAds.ts","../../src/plugin-api/PluginHost.ts"],"sourcesContent":["// Eklenti reklam API'si: reklam arası, preroll kapısı, midroll noktaları, duraklatma / bitiş kancaları, tag dönüşümü.\nimport type { PluginAdBreak, PluginAdBreakOptions, PluginAdBreakType, PluginCleanup } from './types';\n\nexport interface PluginAdsContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n isAdPlaying(): boolean;\n /** Player'ın reklam kilidi (kontroller gizli, isAdPlaying true). */\n blockAds(): void;\n unblockAds(): void;\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\nconst DEFAULT_BREAK_TIMEOUT_MS = 60_000;\nconst PREROLL_GATE_TIMEOUT_MS = 15_000;\nconst DEFAULT_PAUSE_DELAY_MS = 300;\n/** Reklam arasında engellenen içerik kısayolları. */\nconst BLOCKED_KEYS = new Set([' ', 'k', 'j', 'l', 'ArrowLeft', 'ArrowRight', ',', '.']);\n\ntype Guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void;\n\ninterface Mid {\n owner: string;\n marks: number[];\n fired: Set<number>;\n seekPast: 'last' | 'skip';\n fire: (mark: number) => void;\n}\n\ninterface Active {\n owner: string;\n finish: () => void;\n}\n\nexport class PluginAds {\n private active: Active | null = null;\n private prerolls: Array<{ owner: string; run: () => unknown }> = [];\n private mids: Mid[] = [];\n private pauses: Array<{ owner: string; run: () => unknown; delayMs: number }> = [];\n private endeds: Array<{ owner: string; run: () => void }> = [];\n private transforms: Array<{ owner: string; fn: (url: string, type: PluginAdBreakType) => string }> = [];\n private prerollDone = false;\n private gateRunning = false;\n private contentStarted = false;\n private lastPos = 0;\n private seekPending = false;\n private pauseTimer: ReturnType<typeof setTimeout> | null = null;\n private pauseCleanups: Array<() => void> = [];\n\n constructor(private readonly ctx: PluginAdsContext) {\n const v = ctx.video;\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('play', this.onPlay, true);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('pause', this.onPause);\n // Capture: playlist / yönlendirme dinleyicilerinden önce — postroll arası onlar çalışmadan başlar.\n v.addEventListener('ended', this.onEnded, true);\n ctx.element.addEventListener('keydown', this.onKeyDown, true);\n }\n\n destroy(): void {\n const v = this.ctx.video;\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('play', this.onPlay, true);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded, true);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown, true);\n this.active?.finish();\n this.clearPause();\n }\n\n /** Eklenti kaldırılınca onun kayıtları ve süren arası. */\n removeOwner(owner: string): void {\n this.prerolls = this.prerolls.filter((x) => x.owner !== owner);\n this.mids = this.mids.filter((x) => x.owner !== owner);\n this.pauses = this.pauses.filter((x) => x.owner !== owner);\n this.endeds = this.endeds.filter((x) => x.owner !== owner);\n this.transforms = this.transforms.filter((x) => x.owner !== owner);\n if (this.active?.owner === owner) this.active.finish();\n }\n\n /** IMA isteği öncesi tüm eklentilerin dönüşümleri. */\n transformTag(url: string, type: PluginAdBreakType): string {\n let out = url;\n for (const t of this.transforms) {\n try {\n const next = t.fn(out, type);\n if (typeof next === 'string' && next) out = next;\n } catch (err) {\n this.ctx.log(`Plugin \"${t.owner}\" failed in ads.transformTag: ${(err as Error)?.message ?? err}`, { plugin: t.owner });\n }\n }\n return out;\n }\n\n /** Bir eklentiye verilen `ads` nesnesi. */\n api(owner: string, guard: Guard) {\n const add = <T>(list: T[], item: T): (() => void) => {\n list.push(item);\n return () => {\n const i = list.indexOf(item);\n if (i >= 0) list.splice(i, 1);\n };\n };\n return {\n requestBreak: (run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions) => this.requestBreak(owner, run, options),\n beforeContent: (run: () => unknown) => add(this.prerolls, { owner, run }),\n atTime: (seconds: number | number[], run: (s: number) => unknown, options?: { seekPast?: 'last' | 'skip' }) => {\n const marks = (Array.isArray(seconds) ? seconds : [seconds]).filter((s) => Number.isFinite(s) && s >= 0).sort((a, b) => a - b);\n const fire = guard((m: number) => run(m), 'ads.atTime');\n return add(this.mids, { owner, marks, fired: new Set<number>(), seekPast: options?.seekPast ?? 'last', fire });\n },\n onPause: (run: () => void | PluginCleanup, options?: { delayMs?: number }) =>\n add(this.pauses, { owner, run: () => run(), delayMs: options?.delayMs ?? DEFAULT_PAUSE_DELAY_MS }),\n onEnded: (run: () => unknown) => add(this.endeds, { owner, run: guard(() => run(), 'ads.onEnded') }),\n transformTag: (fn: (url: string, type: PluginAdBreakType) => string) => add(this.transforms, { owner, fn }),\n };\n }\n\n // ── Reklam arası ──\n\n private requestBreak(owner: string, run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions): Promise<boolean> {\n if (this.active || this.ctx.isAdPlaying()) return Promise.resolve(false);\n const v = this.ctx.video;\n const type: PluginAdBreakType = options?.type ?? (v.ended ? 'postroll' : !this.contentStarted ? 'preroll' : 'midroll');\n const wasPlaying = !v.paused && !v.ended;\n if (!v.paused) v.pause();\n this.ctx.blockAds();\n\n const layer = document.createElement('div');\n layer.className = 'hp-plugin-layer hp-plugin-ad';\n layer.setAttribute('part', `plugin-ad plugin-${owner}`);\n layer.dataset.plugin = owner;\n layer.dataset.position = 'fill';\n layer.toggleAttribute('data-above', true);\n layer.toggleAttribute('data-interactive', true);\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) layer.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.videoArea.appendChild(layer);\n\n const ctrl = new AbortController();\n this.emit('hp:adstart', type, owner);\n\n return new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n ctrl.abort();\n layer.remove();\n this.active = null;\n this.ctx.unblockAds();\n this.emit('hp:adend', type, owner);\n if (wasPlaying && type !== 'postroll') void v.play().catch(() => {});\n resolve(true);\n };\n const timer = setTimeout(() => {\n this.ctx.log(`Plugin \"${owner}\" ad break timed out`, { plugin: owner, type });\n finish();\n }, options?.timeoutMs ?? DEFAULT_BREAK_TIMEOUT_MS);\n this.active = { owner, finish };\n const fail = (err: unknown): void => {\n this.ctx.log(`Plugin \"${owner}\" failed in ads.requestBreak: ${(err as Error)?.message ?? err}`, { plugin: owner, type });\n finish();\n };\n try {\n Promise.resolve(run({ type, layer, signal: ctrl.signal, end: finish })).then(finish, fail);\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private emit(name: 'hp:adstart' | 'hp:adend', type: PluginAdBreakType, plugin: string): void {\n this.ctx.element.dispatchEvent(new CustomEvent(name, { detail: { type, linear: true, plugin } }));\n }\n\n // ── Olaylar ──\n\n private readonly onLoadStart = (): void => {\n this.prerollDone = false;\n this.contentStarted = false;\n this.lastPos = 0;\n for (const m of this.mids) m.fired.clear();\n this.clearPause();\n };\n\n private readonly onPlay = (): void => {\n const v = this.ctx.video;\n // Reklam arasında / preroll beklenirken içerik oynamaz.\n if (this.active || this.gateRunning) {\n v.pause();\n return;\n }\n this.clearPause();\n if (this.prerollDone || !this.prerolls.length || this.ctx.isAdPlaying()) return;\n this.prerollDone = true;\n v.pause();\n void this.runPrerolls();\n };\n\n private async runPrerolls(): Promise<void> {\n this.gateRunning = true;\n const all = Promise.all(\n this.prerolls.map((p) =>\n Promise.resolve()\n .then(() => p.run())\n .catch((err) => this.ctx.log(`Plugin \"${p.owner}\" failed in ads.beforeContent: ${(err as Error)?.message ?? err}`, { plugin: p.owner }))\n )\n );\n await Promise.race([all, new Promise((r) => setTimeout(r, PREROLL_GATE_TIMEOUT_MS))]);\n // Süren bir ara varsa onun bitmesini bekle.\n while (this.active) await new Promise((r) => setTimeout(r, 100));\n this.gateRunning = false;\n void this.ctx.video.play().catch(() => {});\n }\n\n private readonly onPlaying = (): void => {\n if (!this.active && !this.ctx.isAdPlaying()) this.contentStarted = true;\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.video;\n const pos = v.currentTime;\n const prev = this.lastPos;\n this.lastPos = pos;\n const seeked = this.seekPending;\n this.seekPending = false;\n if (this.active || this.ctx.isAdPlaying() || v.paused || v.seeking || pos <= prev) return;\n for (const m of this.mids) {\n const crossed = m.marks.filter((s) => prev < s && s <= pos && !m.fired.has(s));\n if (!crossed.length) continue;\n for (const s of crossed) m.fired.add(s);\n // İleri sarınca geçilen noktalardan yalnızca sonuncusu (ya da hiçbiri).\n if (seeked && m.seekPast === 'skip') continue;\n m.fire(crossed[crossed.length - 1]!);\n }\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.video;\n if (!this.pauses.length || v.ended || v.seeking || this.active || this.gateRunning || this.ctx.isAdPlaying()) return;\n this.clearPause();\n const delay = Math.min(...this.pauses.map((p) => p.delayMs));\n this.pauseTimer = setTimeout(() => {\n this.pauseTimer = null;\n if (!v.paused || v.ended || this.active || this.ctx.isAdPlaying()) return;\n for (const p of this.pauses) {\n try {\n const cleanup = p.run();\n if (typeof cleanup === 'function') this.pauseCleanups.push(cleanup as () => void);\n } catch (err) {\n this.ctx.log(`Plugin \"${p.owner}\" failed in ads.onPause: ${(err as Error)?.message ?? err}`, { plugin: p.owner });\n }\n }\n }, delay);\n };\n\n private clearPause(): void {\n if (this.pauseTimer) clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n for (const c of this.pauseCleanups.splice(0)) {\n try {\n c();\n } catch {\n /* yok say */\n }\n }\n }\n\n private readonly onEnded = (): void => {\n this.clearPause();\n for (const e of this.endeds) e.run();\n };\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if ((this.active || this.gateRunning) && BLOCKED_KEYS.has(e.key)) e.preventDefault();\n };\n}\n","// Eklentileri kurar / kaldırır; eklenenleri izler ve temizler, hataları yakalar.\nimport { createIcon } from '../icons/Icon';\nimport { PluginAds } from './PluginAds';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../controls/SettingsMenu';\nimport {\n PLUGIN_API_VERSION,\n type HopePlugin,\n type PlayerApi,\n type PluginButtonHandle,\n type PluginButtonOptions,\n type PluginCleanup,\n type PluginEntry,\n type PluginLabel,\n type PluginLayerHandle,\n type PluginLayerOptions,\n type PluginLoader,\n type PluginSettingsHandle,\n} from './types';\n\n/** Player → PluginHost bağlamı (eklentiler görmez). */\nexport interface PluginHostContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n /** Alt katmanlar bunun önüne eklenir. */\n chromeEl: HTMLElement;\n labels: Readonly<Record<string, unknown>>;\n locale(): string;\n currentSrc(): string | null;\n isAdPlaying(): boolean;\n /** Reklam kilidi (`blockChrome('ads')`). */\n blockAds(): void;\n unblockAds(): void;\n isFullscreen(): boolean;\n addControlButton(button: HTMLButtonElement, position: 'left' | 'right'): void;\n settings: {\n registerToggle(row: { key: string; label: string; getValueLabel(): string; onToggle(): void }): void;\n unregisterToggle(key: string): void;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n };\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\ninterface Instance {\n plugin: HopePlugin<any>;\n optionsKey: string;\n api: PlayerApi;\n disposers: Array<() => void>;\n /** Dil değişince yeniden çizilecekler. */\n relabel: Array<() => void>;\n localeHandlers: Array<(locale: string) => void>;\n cleanup: PluginCleanup | null;\n removed: boolean;\n}\n\n/** `Shift+W` gibi kısayol. */\ninterface KeySpec {\n key: string;\n shift: boolean | null;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n}\n\nexport interface PluginShortcut {\n keys: string[];\n description: string;\n}\n\nconst resolve = (label: PluginLabel): string => (typeof label === 'function' ? label() : label);\n\nfunction parseKey(spec: string): KeySpec {\n const parts = spec.split('+');\n // \"Shift++\" gibi: son parça boşsa tuş \"+\".\n const key = (parts.pop() || '+').toLowerCase();\n const mods = parts.map((p) => p.toLowerCase());\n const letter = /^[a-z]$/.test(key);\n return { key, shift: mods.includes('shift') ? true : letter ? false : null, alt: mods.includes('alt'), ctrl: mods.includes('ctrl') || mods.includes('control'), meta: mods.includes('meta') || mods.includes('cmd') };\n}\n\nfunction matches(spec: KeySpec, e: KeyboardEvent): boolean {\n return (\n e.key.toLowerCase() === spec.key &&\n e.altKey === spec.alt &&\n e.ctrlKey === spec.ctrl &&\n e.metaKey === spec.meta &&\n (spec.shift === null || e.shiftKey === spec.shift)\n );\n}\n\nexport class PluginHost {\n private readonly instances = new Map<string, Instance>();\n private readonly shortcutList: Array<{ owner: string; spec: KeySpec; label: string; description: PluginLabel | undefined; handler: (e: KeyboardEvent) => void }> = [];\n private syncSeq = 0;\n private toastEl: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n /** Ayar satırı anahtarları. */\n private keySeq = 0;\n private readonly ads: PluginAds;\n\n constructor(private readonly ctx: PluginHostContext) {\n ctx.element.addEventListener('keydown', this.onKeyDown);\n this.ads = new PluginAds(ctx);\n }\n\n /** IMA tag'i eklenti dönüşümlerinden geçirir. */\n transformAdTag(url: string, type: 'preroll' | 'midroll' | 'postroll'): string {\n return this.ads.transformTag(url, type);\n }\n\n /** Listeye eşitler: kurar, kaldırır, günceller (aynı adlıda sonraki kazanır). */\n async sync(builtin: PluginEntry[], user: PluginEntry[]): Promise<void> {\n const seq = ++this.syncSeq;\n const resolved = await Promise.all([...builtin, ...user].map((e) => this.resolveEntry(e)));\n if (seq !== this.syncSeq) return; // daha yenisi başladı\n const wanted = new Map<string, { plugin: HopePlugin<any>; options: unknown }>();\n for (const r of resolved) if (r) wanted.set(r.plugin.name, r);\n\n for (const [name, inst] of this.instances) if (!wanted.has(name)) this.dispose(name, inst);\n for (const [name, { plugin, options }] of wanted) {\n const key = optionsKey(options);\n const inst = this.instances.get(name);\n if (inst && inst.plugin === plugin) {\n if (inst.optionsKey === key) continue;\n if (plugin.update) {\n inst.optionsKey = key;\n this.guard(name, () => plugin.update!(options))();\n continue;\n }\n }\n if (inst) this.dispose(name, inst);\n await this.install(plugin, options, key);\n }\n }\n\n /** Dil değişince. */\n refreshLabels(): void {\n for (const [name, inst] of this.instances) {\n for (const fn of inst.relabel) this.guard(name, fn)();\n for (const fn of inst.localeHandlers) this.guard(name, () => fn(this.ctx.locale()))();\n }\n }\n\n /** `?` listesi için. */\n shortcuts(): PluginShortcut[] {\n return this.shortcutList.filter((s) => s.description !== undefined).map((s) => ({ keys: [s.label], description: resolve(s.description!) }));\n }\n\n has(name: string): boolean {\n return this.instances.has(name);\n }\n\n destroy(): void {\n ++this.syncSeq;\n for (const [name, inst] of this.instances) this.dispose(name, inst);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown);\n this.ads.destroy();\n this.toastEl?.remove();\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n // ── Kurulum ──\n\n private async resolveEntry(entry: PluginEntry): Promise<{ plugin: HopePlugin<any>; options: unknown } | null> {\n const [target, options] = Array.isArray(entry) ? entry : [entry, undefined];\n try {\n if (typeof target === 'function') {\n const mod = await (target as PluginLoader)();\n const plugin = 'setup' in mod ? mod : 'default' in mod ? mod.default : mod.plugin;\n return plugin && typeof plugin.setup === 'function' ? { plugin, options } : null;\n }\n return target && typeof target.setup === 'function' && typeof target.name === 'string' ? { plugin: target, options } : null;\n } catch (err) {\n this.ctx.log(`Plugin could not be loaded: ${(err as Error)?.message ?? err}`, { plugin: typeof target === 'function' ? 'loader' : String((target as HopePlugin)?.name) });\n return null;\n }\n }\n\n private async install(plugin: HopePlugin<any>, options: unknown, key: string): Promise<void> {\n const name = plugin.name;\n if (plugin.apiVersion && plugin.apiVersion > PLUGIN_API_VERSION) {\n this.ctx.log(`Plugin \"${name}\" was written for plugin API v${plugin.apiVersion}; this player has v${PLUGIN_API_VERSION}`, { plugin: name });\n }\n const inst: Instance = { plugin, optionsKey: key, api: null as unknown as PlayerApi, disposers: [], relabel: [], localeHandlers: [], cleanup: null, removed: false };\n inst.api = this.createApi(inst);\n this.instances.set(name, inst);\n try {\n const result = await plugin.setup(inst.api, options);\n if (inst.removed) {\n if (typeof result === 'function') this.guard(name, result)();\n return;\n }\n if (typeof result === 'function') inst.cleanup = result;\n } catch (err) {\n this.report(name, err, 'setup');\n this.dispose(name, inst);\n }\n }\n\n private dispose(name: string, inst: Instance): void {\n if (inst.removed) return;\n inst.removed = true;\n if (this.instances.get(name) === inst) this.instances.delete(name);\n if (inst.cleanup) this.guard(name, inst.cleanup)();\n // Ters sırada kaldır.\n for (const d of inst.disposers.reverse()) {\n try {\n d();\n } catch {\n /* yok say */\n }\n }\n inst.disposers = [];\n this.ads.removeOwner(name);\n for (let i = this.shortcutList.length - 1; i >= 0; i--) if (this.shortcutList[i]!.owner === name) this.shortcutList.splice(i, 1);\n }\n\n private report(name: string, err: unknown, where: string): void {\n const message = (err as Error)?.message ?? String(err);\n this.ctx.log(`Plugin \"${name}\" failed in ${where}: ${message}`, { plugin: name });\n console.error(`[hope-player] plugin \"${name}\" (${where}):`, err);\n }\n\n /** Eklenti kodu hep bundan çağrılır; hata player'a geçmez. */\n private guard<A extends unknown[]>(name: string, fn: (...args: A) => unknown, where = 'handler'): (...args: A) => void {\n return (...args: A) => {\n try {\n const r = fn(...args);\n if (r instanceof Promise) r.catch((err) => this.report(name, err, where));\n } catch (err) {\n this.report(name, err, where);\n }\n };\n }\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n // Player'ın kendi tuşları önce; işlendiyse karışma.\n if (e.defaultPrevented) return;\n const target = e.composedPath()[0];\n if (target instanceof HTMLElement && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName))) return;\n for (const s of this.shortcutList) {\n if (matches(s.spec, e)) {\n e.preventDefault();\n s.handler(e);\n return;\n }\n }\n };\n\n // ── PlayerApi ──\n\n private createApi(inst: Instance): PlayerApi {\n const ctx = this.ctx;\n const name = inst.plugin.name;\n const track = (dispose: () => void): void => {\n if (inst.removed) dispose();\n else inst.disposers.push(dispose);\n };\n const guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => this.guard(name, fn, where);\n const strings: Record<string, Record<string, string>> = {};\n const host = this;\n\n const on = (event: string, handler: (event: Event) => void, once = false): (() => void) => {\n // `x:y` olayları elementte, diğerleri videoda.\n const target: EventTarget = event.includes(':') ? ctx.element : ctx.video;\n const wrapped = guard((ev: Event) => {\n if (once) off();\n handler(ev);\n }, `on(${event})`);\n target.addEventListener(event, wrapped);\n let done = false;\n const off = (): void => {\n if (done) return;\n done = true;\n target.removeEventListener(event, wrapped);\n };\n track(off);\n return off;\n };\n\n const api: PlayerApi = {\n plugin: name,\n apiVersion: PLUGIN_API_VERSION,\n element: ctx.element,\n video: ctx.video,\n get locale() {\n return ctx.locale();\n },\n labels: ctx.labels,\n get currentTime() {\n return ctx.video.currentTime;\n },\n get duration() {\n return ctx.video.duration;\n },\n get paused() {\n return ctx.video.paused;\n },\n get isLive() {\n return ctx.video.duration === Infinity;\n },\n get isAdPlaying() {\n return ctx.isAdPlaying();\n },\n get isFullscreen() {\n return ctx.isFullscreen();\n },\n get src() {\n return ctx.currentSrc();\n },\n play: () => ctx.video.play(),\n pause: () => ctx.video.pause(),\n seek: (time: number) => {\n if (Number.isFinite(time)) ctx.video.currentTime = Math.max(0, time);\n },\n on: (event, handler) => on(event, handler),\n once: (event, handler) => on(event, handler, true),\n emit: (event, detail) => {\n ctx.element.dispatchEvent(new CustomEvent(`${name}:${event}`, { detail, bubbles: true, composed: true }));\n },\n onSourceChange: (handler) => on('loadstart', () => handler(ctx.currentSrc())),\n onLocaleChange: (handler) => {\n inst.localeHandlers.push(handler);\n const off = (): void => {\n const i = inst.localeHandlers.indexOf(handler);\n if (i >= 0) inst.localeHandlers.splice(i, 1);\n };\n track(off);\n return off;\n },\n onDestroy: (handler) => track(guard(handler, 'onDestroy')),\n setTimeout: (handler, ms) => {\n const id = window.setTimeout(guard(handler, 'setTimeout'), ms);\n track(() => clearTimeout(id));\n return id;\n },\n setInterval: (handler, ms) => {\n const id = window.setInterval(guard(handler, 'setInterval'), ms);\n track(() => clearInterval(id));\n return id;\n },\n ui: {\n addButton: (o) => host.addButton(inst, o, track, guard),\n addLayer: (o) => host.addLayer(inst, o ?? {}, track),\n toast: (message, o) => host.toast(message, o?.durationMs),\n },\n settings: {\n addToggle: (o) => {\n const key = `plugin:${name}:toggle:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerToggle({\n key,\n label: resolve(o.label),\n getValueLabel: () => (o.get() ? onOff(ctx.labels, true) : onOff(ctx.labels, false)),\n onToggle: guard(() => o.set(!o.get()), 'settings.toggle'),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterToggle(key));\n return settingsHandle(register, () => ctx.settings.unregisterToggle(key));\n },\n addSelect: (o) => {\n const key = `plugin:${name}:select:${++host.keySeq}`;\n const list = () => (typeof o.options === 'function' ? o.options() : o.options);\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => {\n const current = list().find((x) => x.value === o.get());\n return current ? resolve(current.label) : '';\n },\n getItems: () => list().map((x) => ({ label: resolve(x.label), active: x.value === o.get(), onSelect: guard(() => o.set(x.value), 'settings.select') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n addSubmenu: (o) => {\n const key = `plugin:${name}:submenu:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => (o.value ? o.value() : ''),\n getItems: (): SettingsSubmenuItem[] =>\n o.items().map((x) => ({ label: resolve(x.label), active: !!x.active, onSelect: guard(() => x.onSelect(), 'settings.submenu') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n },\n keys: {\n add: (key, handler, description) => {\n const entry = { owner: name, spec: parseKey(key), label: key, description, handler: guard(handler, `keys(${key})`) };\n host.shortcutList.push(entry);\n const off = (): void => {\n const i = host.shortcutList.indexOf(entry);\n if (i >= 0) host.shortcutList.splice(i, 1);\n };\n track(off);\n return off;\n },\n },\n i18n: {\n add: (more) => {\n for (const [locale, values] of Object.entries(more)) strings[locale] = { ...strings[locale], ...values };\n },\n t: (key, fallback) => strings[ctx.locale()]?.[key] ?? strings.en?.[key] ?? fallback ?? key,\n },\n storage: {\n get: <T>(key: string, fallback?: T): T | undefined => {\n try {\n const raw = localStorage.getItem(storageKey(name, key));\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set: (key, value) => {\n try {\n localStorage.setItem(storageKey(name, key), JSON.stringify(value));\n } catch {\n /* yok say */\n }\n },\n remove: (key) => {\n try {\n localStorage.removeItem(storageKey(name, key));\n } catch {\n /* yok say */\n }\n },\n },\n ads: (() => {\n const raw = host.ads.api(name, guard);\n // Dönen kaldırıcılar eklenti kaldırılınca da çağrılır.\n const tracked = <F extends (...a: any[]) => () => void>(fn: F) =>\n ((...a: Parameters<F>) => {\n const off = fn(...a);\n track(off);\n return off;\n }) as F;\n return {\n requestBreak: raw.requestBreak,\n beforeContent: tracked(raw.beforeContent),\n atTime: tracked(raw.atTime),\n onPause: tracked(raw.onPause),\n onEnded: tracked(raw.onEnded),\n transformTag: tracked(raw.transformTag),\n };\n })(),\n log: (message, details) => ctx.log(message, { plugin: name, ...details }),\n };\n return api;\n }\n\n private addButton(\n inst: Instance,\n o: PluginButtonOptions,\n track: (d: () => void) => void,\n guard: <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void\n ): PluginButtonHandle {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-plugin-btn hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer hp:shrink-0';\n btn.setAttribute('part', `plugin-button plugin-${inst.plugin.name}`);\n btn.dataset.plugin = inst.plugin.name;\n let label: PluginLabel = o.label;\n let active = !!o.active;\n const setIcon = (icon: string): void => {\n btn.textContent = '';\n if (icon.trim().startsWith('<')) {\n btn.insertAdjacentHTML('beforeend', icon);\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n } else btn.appendChild(createIcon(icon, 'hp:text-[length:var(--hp-ctrl-icon-size)]'));\n };\n const applyLabel = (): void => btn.setAttribute('aria-label', resolve(label));\n const applyActive = (): void => {\n if (o.active !== undefined) btn.setAttribute('aria-pressed', String(active));\n };\n setIcon(o.icon);\n applyLabel();\n applyActive();\n inst.relabel.push(applyLabel);\n const handle: PluginButtonHandle = {\n el: btn,\n get active() {\n return active;\n },\n setLabel: (l) => {\n label = l;\n applyLabel();\n },\n setIcon,\n setActive: (a) => {\n active = a;\n btn.setAttribute('aria-pressed', String(a));\n },\n show: () => {\n btn.style.display = '';\n },\n hide: () => {\n btn.style.display = 'none';\n },\n remove: () => btn.remove(),\n };\n if (o.onClick) {\n const click = guard((e: MouseEvent) => o.onClick!(e, handle), 'button.onClick');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n click(e);\n });\n }\n this.ctx.addControlButton(btn, o.position ?? 'right');\n track(() => btn.remove());\n return handle;\n }\n\n private addLayer(inst: Instance, o: PluginLayerOptions, track: (d: () => void) => void): PluginLayerHandle {\n const el = document.createElement('div');\n el.className = 'hp-plugin-layer';\n el.setAttribute('part', `plugin-layer plugin-${inst.plugin.name}`);\n el.dataset.plugin = inst.plugin.name;\n el.dataset.position = o.position ?? 'fill';\n el.toggleAttribute('data-autohide', !!o.autoHide);\n el.toggleAttribute('data-interactive', !!o.interactive);\n el.toggleAttribute('data-above', !!o.above);\n let visible = o.visible !== false;\n el.hidden = !visible;\n\n if (o.above) this.ctx.videoArea.appendChild(el);\n else this.ctx.videoArea.insertBefore(el, this.ctx.chromeEl);\n // Stil katmanın dışında: `el.innerHTML` silmesin.\n let style: HTMLStyleElement | null = null;\n if (o.css) {\n style = document.createElement('style');\n style.textContent = o.css;\n el.before(style);\n }\n const removeAll = (): void => {\n el.remove();\n style?.remove();\n };\n if (o.interactive) {\n // Tıklama videoya geçmesin.\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n }\n track(removeAll);\n const set = (v: boolean): void => {\n visible = v;\n el.hidden = !v;\n };\n return {\n el,\n get visible() {\n return visible;\n },\n show: () => set(true),\n hide: () => set(false),\n toggle: (force) => set(force ?? !visible),\n remove: removeAll,\n };\n }\n\n private toast(message: string, durationMs = 2500): void {\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = 'hp-plugin-toast';\n this.toastEl.setAttribute('part', 'plugin-toast');\n this.toastEl.setAttribute('role', 'status');\n this.toastEl.setAttribute('aria-live', 'polite');\n this.ctx.videoArea.appendChild(this.toastEl);\n }\n this.toastEl.textContent = message;\n this.toastEl.setAttribute('data-visible', '');\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => this.toastEl?.removeAttribute('data-visible'), Math.max(500, durationMs));\n }\n}\n\nfunction settingsHandle(register: () => void, remove: () => void): PluginSettingsHandle {\n return { refresh: register, remove };\n}\n\nfunction onOff(labels: Readonly<Record<string, unknown>>, on: boolean): string {\n const value = on ? labels.a11yOn : labels.a11yOff;\n return typeof value === 'string' ? value : on ? 'On' : 'Off';\n}\n\nfunction storageKey(plugin: string, key: string): string {\n return `hp-plugin:${plugin}:${key}`;\n}\n\n/** Seçenek karşılaştırma anahtarı. */\nfunction optionsKey(options: unknown): string {\n try {\n return JSON.stringify(options ?? null, (_k, v: unknown) => (typeof v === 'function' ? `fn:${(v as { name?: string }).name ?? ''}` : v));\n } catch {\n return String(Math.random());\n }\n}\n\nexport { PLUGIN_API_VERSION };\nexport type { PluginShortcut as Shortcut };\n"],"names":["DEFAULT_BREAK_TIMEOUT_MS","PREROLL_GATE_TIMEOUT_MS","DEFAULT_PAUSE_DELAY_MS","BLOCKED_KEYS","PluginAds","ctx","__publicField","m","v","pos","prev","seeked","crossed","s","delay","p","cleanup","err","_a","owner","x","url","type","out","t","next","guard","add","list","item","i","run","options","seconds","marks","a","b","fire","fn","wasPlaying","layer","ev","e","ctrl","resolve","done","finish","timer","fail","name","plugin","all","r","c","label","parseKey","spec","parts","key","mods","letter","matches","PluginHost","target","builtin","user","seq","resolved","wanted","inst","optionsKey","entry","mod","PLUGIN_API_VERSION","result","d","where","message","args","track","dispose","strings","host","on","event","handler","once","wrapped","off","time","detail","ms","id","o","register","onOff","settingsHandle","current","description","more","locale","values","fallback","_b","raw","storageKey","value","tracked","details","btn","active","setIcon","icon","createIcon","applyLabel","applyActive","handle","click","el","visible","style","removeAll","set","force","durationMs","remove","labels","_k"],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ var C = Object.defineProperty;
2
+ var k = (p, e, t) => e in p ? C(p, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : p[e] = t;
3
+ var m = (p, e, t) => k(p, typeof e != "symbol" ? e + "" : e, t);
4
+ import { c as x } from "./player-D2_HRzot.js";
5
+ import { a as N } from "./plugin-style-CPJELe-i.js";
6
+ const A = '.hp-redirect-thumb{position:relative;display:block;flex:none;overflow:hidden;aspect-ratio:16 / 9;border-radius:8px;background:#111}.hp-redirect-thumb img{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;object-fit:cover;transition:transform .3s}.hp-redirect-ring{position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%) rotate(-90deg);filter:drop-shadow(0 2px 6px rgba(0,0,0,.6))}.hp-redirect-ring-track{fill:#00000073;stroke:#ffffff47;stroke-width:3}.hp-redirect-ring-bar{fill:none;stroke:var(--hp-color-accent, #fff);stroke-width:3;stroke-linecap:round;transition:stroke-dashoffset .3s linear}.hp-redirect-play{position:absolute;top:50%;left:50%;transform:translate(-45%,-50%);color:#fff;font-size:18px;line-height:1}.hp-redirect-duration{position:absolute;right:5px;bottom:5px;padding:1px 5px;border-radius:4px;background:#000000c7;color:#fff;font:600 10px/1.4 system-ui,-apple-system,sans-serif}.hp-redirect-label{color:var(--hp-color-accent, #fff);font:700 10px/1.2 system-ui,-apple-system,sans-serif;letter-spacing:.1em;text-transform:uppercase}.hp-redirect-title{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;font:600 13px/1.3 system-ui,-apple-system,sans-serif}.hp-redirect-sub{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;opacity:.7;font:500 11px/1.3 system-ui,-apple-system,sans-serif}.hp-redirect-card{position:absolute;z-index:24;display:flex;align-items:stretch;width:min(340px,calc(100% - 24px));border-radius:12px;background:#0e0e12e6;color:#fff;box-shadow:0 16px 36px -14px #000000d9;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:hp-redirect-in .35s cubic-bezier(.2,.8,.2,1);transition:bottom .25s,top .25s}.hp-redirect-card[data-position=bottom-right]{right:12px;bottom:76px}.hp-redirect-card[data-position=bottom-left]{left:12px;bottom:76px}.hp-redirect-card[data-position=top-right]{right:12px;top:12px}.hp-redirect-card[data-position=top-left]{left:12px;top:12px}.video-area[data-chrome-hidden] .hp-redirect-card[data-position^=bottom]{bottom:12px}.hp-redirect-card-main{display:flex;flex:1;min-width:0;gap:10px;align-items:center;padding:8px;border:0;border-radius:12px;background:transparent;color:inherit;text-align:left;cursor:pointer}.hp-redirect-card-main .hp-redirect-thumb{width:42%}.hp-redirect-card-main:hover .hp-redirect-thumb img{transform:scale(1.04)}.hp-redirect-text{display:flex;flex-direction:column;gap:3px;min-width:0;padding-right:22px}.hp-redirect-close{position:absolute;top:6px;right:6px;display:grid;place-items:center;width:24px;height:24px;padding:0;border:0;border-radius:999px;background:#ffffff1f;color:#fff;font-size:13px;cursor:pointer}.hp-redirect-close:hover{background:#ffffff3d}.hp-redirect-card-main:focus-visible,.hp-redirect-close:focus-visible,.hp-redirect-poster:focus-visible,.hp-redirect-btn:focus-visible{outline:2px solid var(--hp-color-accent, #fff);outline-offset:2px}.video-area[data-compact] .hp-redirect-card{width:min(260px,calc(100% - 16px))}.video-area[data-compact] .hp-redirect-card[data-position^=bottom]{bottom:56px}.video-area[data-compact][data-chrome-hidden] .hp-redirect-card[data-position^=bottom]{bottom:8px}.video-area[data-compact] .hp-redirect-card .hp-redirect-sub{display:none}.video-area[data-compact] .hp-redirect-card .hp-redirect-ring{width:34px;height:34px}.hp-redirect-screen{position:absolute;top:0;right:0;bottom:0;left:0;z-index:30;display:flex;align-items:center;justify-content:center;overflow:hidden;padding:16px;background:#060609e6;color:#fff;text-align:center;animation:hp-redirect-fade .3s ease-out}.hp-redirect-bg{position:absolute;top:-20px;right:-20px;bottom:-20px;left:-20px;width:calc(100% + 40px);height:calc(100% + 40px);object-fit:cover;opacity:.35;filter:blur(18px) saturate(1.2)}.hp-redirect-panel{position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;width:min(420px,100%)}.hp-redirect-poster{width:min(320px,70%);padding:0;border:0;border-radius:10px;background:transparent;cursor:pointer;box-shadow:0 18px 40px -16px #000000e6}.hp-redirect-poster .hp-redirect-thumb{width:100%;border-radius:10px}.hp-redirect-poster .hp-redirect-ring{width:64px;height:64px}.hp-redirect-poster .hp-redirect-play{font-size:24px}.hp-redirect-screen .hp-redirect-title{font-size:16px}.hp-redirect-counter{opacity:.75;font:500 12px/1.4 system-ui,-apple-system,sans-serif}.hp-redirect-actions{display:flex;gap:8px;margin-top:4px}.hp-redirect-btn{padding:7px 16px;border:0;border-radius:999px;background:#ffffff24;color:#fff;font:600 13px/1 system-ui,-apple-system,sans-serif;cursor:pointer}.hp-redirect-btn:hover{background:#ffffff3d}.hp-redirect-btn-primary,.hp-redirect-btn-primary:hover{background:var(--hp-color-accent, #fff);color:var(--hp-color-on-accent, #000)}.video-area[data-compact] .hp-redirect-poster{width:min(200px,55%)}.video-area[data-compact] .hp-redirect-screen .hp-redirect-sub,.video-area[data-compact] .hp-redirect-counter{display:none}.hp-redirect-suggestions{position:absolute;top:0;right:0;bottom:0;left:0;z-index:30;display:flex;flex-direction:column;gap:12px;overflow-y:auto;padding:16px clamp(16px,4%,40px);background:#060609eb;color:#fff;animation:hp-redirect-fade .25s ease-out}.hp-redirect-grid-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.hp-redirect-grid-title{font:600 15px/1.3 system-ui,-apple-system,sans-serif}.hp-redirect-suggestions .hp-redirect-close{position:static}.hp-redirect-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));align-content:center;gap:14px 12px;flex:1}.hp-redirect-grid[data-count="1"],.hp-redirect-grid[data-count="2"]{grid-template-columns:repeat(auto-fit,minmax(160px,260px));justify-content:center}.hp-redirect-grid[data-count="4"]{grid-template-columns:repeat(2,minmax(0,1fr));max-width:640px;width:100%;margin-inline:auto}.hp-redirect-grid[data-count="3"],.hp-redirect-grid[data-count="5"],.hp-redirect-grid[data-count="6"]{grid-template-columns:repeat(3,minmax(0,1fr))}.hp-redirect-suggestion{display:flex;flex-direction:column;gap:4px;min-width:0;color:#fff;text-decoration:none}.hp-redirect-replay{display:inline-flex;align-items:center;gap:6px;align-self:center}.video-area[data-compact] .hp-redirect-grid{grid-template-columns:repeat(2,minmax(0,1fr));align-content:start}.video-area[data-compact] .hp-redirect-suggestion .hp-redirect-sub{display:none}.hp-redirect-suggestion .hp-redirect-play{opacity:0;font-size:22px;transition:opacity .2s}.hp-redirect-suggestion:hover .hp-redirect-play,.hp-redirect-suggestion:focus-visible .hp-redirect-play{opacity:1}.hp-redirect-suggestion:hover .hp-redirect-thumb,.hp-redirect-suggestion:focus-visible .hp-redirect-thumb{outline:2px solid var(--hp-color-accent, #fff)}@media(prefers-reduced-motion:reduce){.hp-redirect-card,.hp-redirect-screen{animation:none}}', v = "http://www.w3.org/2000/svg", w = 18, E = 2 * Math.PI * w, L = 10;
7
+ function S(p) {
8
+ const e = document.createElementNS(v, "svg");
9
+ e.setAttribute("viewBox", "0 0 40 40"), e.setAttribute("aria-hidden", "true"), e.setAttribute("class", p);
10
+ const t = document.createElementNS(v, "circle"), i = document.createElementNS(v, "circle");
11
+ for (const r of [t, i])
12
+ r.setAttribute("cx", "20"), r.setAttribute("cy", "20"), r.setAttribute("r", String(w));
13
+ return t.setAttribute("class", "hp-redirect-ring-track"), i.setAttribute("class", "hp-redirect-ring-bar"), i.setAttribute("stroke-dasharray", String(E)), e.append(t, i), {
14
+ el: e,
15
+ set: (r) => i.setAttribute("stroke-dashoffset", String(E * (1 - Math.min(1, Math.max(0, r)))))
16
+ };
17
+ }
18
+ function y(p, e, t) {
19
+ const i = document.createElement("span");
20
+ if (i.className = t, p) {
21
+ const n = document.createElement("img");
22
+ n.src = p, n.alt = "", n.decoding = "async", n.addEventListener("error", () => n.remove()), i.appendChild(n);
23
+ }
24
+ const r = S("hp-redirect-ring"), s = document.createElement("span");
25
+ if (s.className = "hp-redirect-play", s.appendChild(x("play")), i.append(r.el, s), e) {
26
+ const n = document.createElement("span");
27
+ n.className = "hp-redirect-duration", n.textContent = e, i.appendChild(n);
28
+ }
29
+ return { el: i, ring: r };
30
+ }
31
+ class T {
32
+ constructor(e, t) {
33
+ m(this, "counterTimer", null);
34
+ m(this, "wrapper", null);
35
+ m(this, "card", null);
36
+ m(this, "cardRing", null);
37
+ m(this, "cardLabel", null);
38
+ m(this, "cancelled", !1);
39
+ m(this, "waitingForAd", !1);
40
+ m(this, "mode");
41
+ m(this, "onPlay", () => {
42
+ this.remove();
43
+ });
44
+ m(this, "onEnded", () => {
45
+ if (this.ctx.isAdActive()) {
46
+ this.waitForAd();
47
+ return;
48
+ }
49
+ this.finish();
50
+ });
51
+ m(this, "onAdEnd", () => {
52
+ this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.waitingForAd = !1, this.ctx.videoEl.ended && this.finish();
53
+ });
54
+ // ── 'card' modu ─────────────────────────────────────────────────────────
55
+ m(this, "onTimeUpdate", () => {
56
+ var n;
57
+ const e = this.ctx.videoEl, t = Math.max(1, this.options.showBefore ?? L), i = e.duration;
58
+ if (!Number.isFinite(i) || i <= 0) return;
59
+ const r = i - e.currentTime;
60
+ if (r > t) {
61
+ r > t + 1 && (this.cancelled = !1), this.hideCard();
62
+ return;
63
+ }
64
+ if (this.cancelled || this.ctx.isAdActive() || e.ended || r <= 0) {
65
+ this.ctx.isAdActive() && this.hideCard();
66
+ return;
67
+ }
68
+ this.card || this.showCard();
69
+ const s = Math.ceil(r);
70
+ (n = this.cardRing) == null || n.set(r / t), this.cardLabel && (this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${s}`);
71
+ });
72
+ this.ctx = e, this.options = t, this.mode = t.mode === "card" || t.mode === "endScreen" ? t.mode : "screen", N(e.overlayContainerEl, "redirect-screen", A), t.enabled !== !1 && (e.videoEl.addEventListener("ended", this.onEnded), e.videoEl.addEventListener("play", this.onPlay), this.mode === "card" && e.videoEl.addEventListener("timeupdate", this.onTimeUpdate));
73
+ }
74
+ /** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */
75
+ refreshLabels() {
76
+ var e, t;
77
+ (t = (e = this.card) == null ? void 0 : e.querySelector(".hp-redirect-close")) == null || t.setAttribute("aria-label", this.ctx.i18n.redirectCancelCard);
78
+ }
79
+ destroy() {
80
+ const e = this.ctx.videoEl;
81
+ e.removeEventListener("ended", this.onEnded), e.removeEventListener("play", this.onPlay), e.removeEventListener("timeupdate", this.onTimeUpdate), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.remove(), this.hideCard();
82
+ }
83
+ emit(e, t, i = this.options.url ?? "", r) {
84
+ return this.ctx.hostEl.dispatchEvent(
85
+ new CustomEvent("hp:redirect", { detail: { state: e, url: i, mode: this.mode, reason: t, index: r }, cancelable: e === "redirect" })
86
+ );
87
+ }
88
+ go(e) {
89
+ this.remove(), this.hideCard();
90
+ const t = this.options.url;
91
+ !this.emit("redirect", e) || !t || (this.options.newTab ? window.open(t, "_blank", "noopener") : window.location.href = t);
92
+ }
93
+ waitForAd() {
94
+ this.waitingForAd || (this.waitingForAd = !0, this.ctx.hostEl.addEventListener("hp:adend", this.onAdEnd));
95
+ }
96
+ finish() {
97
+ var e, t;
98
+ if (this.mode === "endScreen") {
99
+ (e = this.options.suggestions) != null && e.length && (this.showSuggestions(this.options.suggestions), this.emit("shown"));
100
+ return;
101
+ }
102
+ if (this.mode === "card") {
103
+ this.hideCard(), this.cancelled ? (t = this.options.suggestions) != null && t.length && this.showSuggestions(this.options.suggestions) : this.go("auto");
104
+ return;
105
+ }
106
+ this.createScreen();
107
+ }
108
+ showCard() {
109
+ const e = this.options, t = document.createElement("div");
110
+ t.className = "hp-redirect-card", t.setAttribute("part", "redirect-card"), t.setAttribute("data-position", e.position ?? "bottom-right");
111
+ const i = document.createElement("button");
112
+ i.type = "button", i.className = "hp-redirect-card-main", i.addEventListener("click", () => this.go("click"));
113
+ const r = y(e.image, e.duration, "hp-redirect-thumb"), s = document.createElement("span");
114
+ s.className = "hp-redirect-text";
115
+ const n = document.createElement("span");
116
+ if (n.className = "hp-redirect-label", s.appendChild(n), e.title) {
117
+ const c = document.createElement("span");
118
+ c.className = "hp-redirect-title", c.textContent = e.title, s.appendChild(c);
119
+ }
120
+ if (e.subtitle) {
121
+ const c = document.createElement("span");
122
+ c.className = "hp-redirect-sub", c.textContent = e.subtitle, s.appendChild(c);
123
+ }
124
+ r.el.setAttribute("aria-hidden", "true");
125
+ const l = document.createElement("span");
126
+ l.className = "hp-sr-only", l.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`, s.appendChild(l), i.append(r.el, s);
127
+ const d = document.createElement("button");
128
+ d.type = "button", d.className = "hp-redirect-close", d.setAttribute("aria-label", this.ctx.i18n.redirectCancelCard), d.appendChild(x("close")), d.addEventListener("click", () => {
129
+ this.cancelled = !0, this.hideCard(), this.emit("cancel");
130
+ }), t.append(i, d);
131
+ for (const c of ["pointerdown", "click", "dblclick"]) t.addEventListener(c, (o) => o.stopPropagation());
132
+ this.ctx.overlayContainerEl.appendChild(t), this.card = t, this.cardRing = r.ring, this.cardLabel = n, this.emit("shown");
133
+ }
134
+ hideCard() {
135
+ var e;
136
+ (e = this.card) == null || e.remove(), this.card = null, this.cardRing = null, this.cardLabel = null;
137
+ }
138
+ // ── 'screen' modu ───────────────────────────────────────────────────────
139
+ remove() {
140
+ var e;
141
+ this.counterTimer && (clearInterval(this.counterTimer), this.counterTimer = null), (e = this.wrapper) == null || e.remove(), this.wrapper = null;
142
+ }
143
+ createScreen() {
144
+ this.remove();
145
+ const e = this.options, t = document.createElement("div");
146
+ if (t.setAttribute("part", "redirect-screen"), t.className = "hp-redirect-screen", e.image) {
147
+ const a = document.createElement("img");
148
+ a.className = "hp-redirect-bg", a.src = e.image, a.alt = "", a.addEventListener("error", () => a.remove()), t.appendChild(a);
149
+ }
150
+ const i = document.createElement("div");
151
+ i.className = "hp-redirect-panel";
152
+ const r = document.createElement("span");
153
+ r.className = "hp-redirect-label", r.textContent = e.label ?? this.ctx.i18n.redirectUpNext, i.appendChild(r);
154
+ const s = document.createElement("button");
155
+ s.type = "button", s.className = "hp-redirect-poster", s.setAttribute("aria-label", this.ctx.i18n.redirectPlayNow);
156
+ const n = y(e.image, e.duration, "hp-redirect-thumb");
157
+ if (s.appendChild(n.el), s.addEventListener("click", () => this.go("click")), i.appendChild(s), e.title) {
158
+ const a = document.createElement("div");
159
+ a.className = "hp-redirect-title", a.textContent = e.title, i.appendChild(a);
160
+ }
161
+ if (e.subtitle) {
162
+ const a = document.createElement("div");
163
+ a.className = "hp-redirect-sub", a.textContent = e.subtitle, i.appendChild(a);
164
+ }
165
+ const l = document.createElement("div");
166
+ l.className = "hp-redirect-counter", l.setAttribute("aria-live", "polite"), i.appendChild(l);
167
+ const d = document.createElement("div");
168
+ d.className = "hp-redirect-actions";
169
+ const c = document.createElement("button");
170
+ c.type = "button", c.className = "hp-redirect-btn", c.textContent = this.ctx.i18n.redirectCancel;
171
+ const o = document.createElement("button");
172
+ o.type = "button", o.className = "hp-redirect-btn hp-redirect-btn-primary", o.textContent = this.ctx.i18n.redirectPlayNow, o.addEventListener("click", () => this.go("click")), c.addEventListener("click", () => {
173
+ var a;
174
+ this.remove(), this.emit("cancel"), (a = e.suggestions) != null && a.length && this.showSuggestions(e.suggestions);
175
+ }), d.append(c, o), i.appendChild(d), t.appendChild(i);
176
+ for (const a of ["pointerdown", "click", "dblclick"]) t.addEventListener(a, (b) => b.stopPropagation());
177
+ this.ctx.overlayContainerEl.appendChild(t), this.wrapper = t, this.emit("shown");
178
+ const u = Math.max(0, e.time ?? 10);
179
+ let h = u;
180
+ const f = () => {
181
+ l.textContent = this.ctx.i18n.redirectCountdown(h), n.ring.set(u > 0 ? h / u : 0);
182
+ };
183
+ f(), this.counterTimer = setInterval(() => {
184
+ if (h--, h > 0) {
185
+ f();
186
+ return;
187
+ }
188
+ this.counterTimer && clearInterval(this.counterTimer), this.counterTimer = null, l.textContent = this.ctx.i18n.redirectNowPlaying, n.ring.set(0), this.go("auto");
189
+ }, 1e3);
190
+ }
191
+ /** Öneri ızgarası (bitiş ekranı): başlık + kapat, kartlar, "Tekrar izle". */
192
+ showSuggestions(e) {
193
+ this.remove();
194
+ const t = this.options, i = this.ctx.i18n, r = document.createElement("div");
195
+ r.setAttribute("part", "redirect-suggestions"), r.className = "hp-redirect-suggestions", r.setAttribute("role", "region");
196
+ const s = t.suggestionsTitle ?? i.redirectSuggestions;
197
+ r.setAttribute("aria-label", s);
198
+ const n = document.createElement("div");
199
+ n.className = "hp-redirect-grid-head";
200
+ const l = document.createElement("span");
201
+ l.className = "hp-redirect-grid-title", l.textContent = s;
202
+ const d = document.createElement("button");
203
+ d.type = "button", d.className = "hp-redirect-close", d.setAttribute("aria-label", i.redirectCloseSuggestions), d.appendChild(x("close")), d.addEventListener("click", () => this.remove()), n.append(l, d);
204
+ const c = document.createElement("div");
205
+ if (c.className = "hp-redirect-grid", c.setAttribute("data-count", String(Math.min(e.length, 6))), e.forEach((o, u) => {
206
+ var b;
207
+ const h = document.createElement("a");
208
+ h.href = o.url, t.newTab && (h.target = "_blank", h.rel = "noopener"), h.className = "hp-redirect-suggestion";
209
+ const f = y(o.image, o.duration, "hp-redirect-thumb");
210
+ (b = f.el.querySelector(".hp-redirect-ring")) == null || b.remove();
211
+ const a = document.createElement("span");
212
+ if (a.className = "hp-redirect-title", a.textContent = o.title, h.append(f.el, a), o.subtitle) {
213
+ const g = document.createElement("span");
214
+ g.className = "hp-redirect-sub", g.textContent = o.subtitle, h.appendChild(g);
215
+ }
216
+ h.addEventListener("click", (g) => {
217
+ this.emit("redirect", "suggestion", o.url, u) || g.preventDefault();
218
+ }), c.appendChild(h);
219
+ }), r.append(n, c), t.replay !== !1) {
220
+ const o = document.createElement("button");
221
+ o.type = "button", o.className = "hp-redirect-btn hp-redirect-replay", o.append(x("loop"), document.createTextNode(i.redirectReplay)), o.addEventListener("click", () => {
222
+ this.remove(), this.emit("replay");
223
+ const u = this.ctx.videoEl;
224
+ u.currentTime = 0, u.play().catch(() => {
225
+ });
226
+ }), r.appendChild(o);
227
+ }
228
+ for (const o of ["pointerdown", "click", "dblclick"]) r.addEventListener(o, (u) => u.stopPropagation());
229
+ this.ctx.overlayContainerEl.appendChild(r), this.wrapper = r;
230
+ }
231
+ }
232
+ function F(p, e) {
233
+ return new T(p, e);
234
+ }
235
+ export {
236
+ T as RedirectScreen,
237
+ F as installRedirectScreen
238
+ };
239
+ //# sourceMappingURL=redirectScreen-TIqLdvBY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirectScreen-TIqLdvBY.js","sources":["../../src/plugins/redirect-screen/RedirectScreen.ts","../../src/plugins/redirect-screen/index.ts"],"sourcesContent":["import type { RedirectScreenOptions, RedirectScreenSuggestion } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\nimport { adoptStyle } from '../../utils/plugin-style';\nimport css from './redirect-screen.css?inline';\n\nexport interface RedirectScreenPlayerContext {\n /** hp:redirect olayları ve postroll'un bitişini (hp:adend) dinlemek için. */\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n isAdActive(): boolean;\n i18n: HopeLocaleStrings;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst RING_R = 18;\nconst RING_C = 2 * Math.PI * RING_R;\nconst DEFAULT_SHOW_BEFORE = 10;\n\n/** Dairesel geri sayım halkası (SVG) — `set(oran)` ile 1 → 0 boşalır. */\nfunction ring(className: string): { el: SVGSVGElement; set(fraction: number): void } {\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', '0 0 40 40');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('class', className);\n const track = document.createElementNS(SVG_NS, 'circle');\n const bar = document.createElementNS(SVG_NS, 'circle');\n for (const c of [track, bar]) {\n c.setAttribute('cx', '20');\n c.setAttribute('cy', '20');\n c.setAttribute('r', String(RING_R));\n }\n track.setAttribute('class', 'hp-redirect-ring-track');\n bar.setAttribute('class', 'hp-redirect-ring-bar');\n bar.setAttribute('stroke-dasharray', String(RING_C));\n svg.append(track, bar);\n return {\n el: svg,\n set: (fraction) => bar.setAttribute('stroke-dashoffset', String(RING_C * (1 - Math.min(1, Math.max(0, fraction))))),\n };\n}\n\n/** Görsel + süre rozeti + oynat ikonu + halka — kart ve tam ekran aynı parçayı kullanır. */\nfunction thumb(image: string | undefined, duration: string | undefined, className: string): { el: HTMLSpanElement; ring: ReturnType<typeof ring> } {\n const el = document.createElement('span');\n el.className = className;\n if (image) {\n const img = document.createElement('img');\n img.src = image;\n img.alt = '';\n img.decoding = 'async';\n img.addEventListener('error', () => img.remove());\n el.appendChild(img);\n }\n const r = ring('hp-redirect-ring');\n const play = document.createElement('span');\n play.className = 'hp-redirect-play';\n play.appendChild(createIcon('play'));\n el.append(r.el, play);\n if (duration) {\n const d = document.createElement('span');\n d.className = 'hp-redirect-duration';\n d.textContent = duration;\n el.appendChild(d);\n }\n return { el, ring: r };\n}\n\n/**\n * Sıradaki videoya yönlendirme. Üç mod:\n * - 'screen' (varsayılan): video bitince tam alan ekran + `time` sn geri sayım; iptal → öneriler.\n * - 'card': bitime `showBefore` sn kala köşede küçük \"Sıradaki\" kartı; geri sayım videoyla birlikte işler (duraklatınca\n * durur), video bitince yönlendirilir. Karta tıklamak hemen yönlendirir, X iptal eder.\n * - 'endScreen': yönlendirme yok; video bitince doğrudan öneri ızgarası (bitiş ekranı).\n * Bitişte postroll oynuyorsa yönlendirme reklam bitene kadar bekler. `hp:redirect` (state: redirect) iptal edilirse\n * (`preventDefault`) sayfa değişmez.\n */\nexport class RedirectScreen {\n private counterTimer: ReturnType<typeof setInterval> | null = null;\n private wrapper: HTMLElement | null = null;\n private card: HTMLDivElement | null = null;\n private cardRing: ReturnType<typeof ring> | null = null;\n private cardLabel: HTMLSpanElement | null = null;\n private cancelled = false;\n private waitingForAd = false;\n private readonly mode: 'screen' | 'card' | 'endScreen';\n\n constructor(\n private readonly ctx: RedirectScreenPlayerContext,\n private readonly options: RedirectScreenOptions\n ) {\n this.mode = options.mode === 'card' || options.mode === 'endScreen' ? options.mode : 'screen';\n adoptStyle(ctx.overlayContainerEl, 'redirect-screen', css);\n if (options.enabled === false) return;\n ctx.videoEl.addEventListener('ended', this.onEnded);\n ctx.videoEl.addEventListener('play', this.onPlay);\n if (this.mode === 'card') ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n /** Ekranlar her gösterimde güncel `ctx.i18n` ile kurulur; açık kartın etiketi burada tazelenir. */\n refreshLabels(): void {\n this.card?.querySelector('.hp-redirect-close')?.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('ended', this.onEnded);\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.remove();\n this.hideCard();\n }\n\n private emit(\n state: 'shown' | 'cancel' | 'redirect' | 'replay',\n reason?: 'auto' | 'click' | 'suggestion',\n url = this.options.url ?? '',\n index?: number\n ): boolean {\n return this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:redirect', { detail: { state, url, mode: this.mode, reason, index }, cancelable: state === 'redirect' })\n );\n }\n\n private go(reason: 'auto' | 'click'): void {\n this.remove();\n this.hideCard();\n const url = this.options.url;\n if (!this.emit('redirect', reason) || !url) return; // entegratör kendisi yönlendirecek\n if (this.options.newTab) window.open(url, '_blank', 'noopener');\n else window.location.href = url;\n }\n\n private readonly onPlay = (): void => {\n this.remove();\n };\n\n private readonly onEnded = (): void => {\n // Postroll oynuyorsa (ya da birazdan başlayacaksa) reklam bitince devam.\n if (this.ctx.isAdActive()) {\n this.waitForAd();\n return;\n }\n this.finish();\n };\n\n private waitForAd(): void {\n if (this.waitingForAd) return;\n this.waitingForAd = true;\n this.ctx.hostEl.addEventListener('hp:adend', this.onAdEnd);\n }\n\n private readonly onAdEnd = (): void => {\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAdEnd);\n this.waitingForAd = false;\n if (this.ctx.videoEl.ended) this.finish();\n };\n\n private finish(): void {\n if (this.mode === 'endScreen') {\n if (this.options.suggestions?.length) {\n this.showSuggestions(this.options.suggestions);\n this.emit('shown');\n }\n return;\n }\n if (this.mode === 'card') {\n this.hideCard();\n if (!this.cancelled) this.go('auto');\n else if (this.options.suggestions?.length) this.showSuggestions(this.options.suggestions);\n return;\n }\n this.createScreen();\n }\n\n // ── 'card' modu ─────────────────────────────────────────────────────────\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n const showBefore = Math.max(1, this.options.showBefore ?? DEFAULT_SHOW_BEFORE);\n const d = v.duration;\n if (!Number.isFinite(d) || d <= 0) return; // canlı yayında kart yok\n const remaining = d - v.currentTime;\n if (remaining > showBefore) {\n // Geri sarıldı (eşiğin belirgin üstüne): iptal unutulur — tekrar yaklaşınca kart yine gelir.\n if (remaining > showBefore + 1) this.cancelled = false;\n this.hideCard();\n return;\n }\n if (this.cancelled || this.ctx.isAdActive() || v.ended || remaining <= 0) {\n if (this.ctx.isAdActive()) this.hideCard();\n return;\n }\n if (!this.card) this.showCard();\n const secs = Math.ceil(remaining);\n this.cardRing?.set(remaining / showBefore);\n if (this.cardLabel) this.cardLabel.textContent = `${this.options.label ?? this.ctx.i18n.redirectUpNext} · ${secs}`;\n };\n\n private showCard(): void {\n const o = this.options;\n const card = document.createElement('div');\n card.className = 'hp-redirect-card';\n card.setAttribute('part', 'redirect-card');\n card.setAttribute('data-position', o.position ?? 'bottom-right');\n\n const main = document.createElement('button');\n main.type = 'button';\n main.className = 'hp-redirect-card-main';\n main.addEventListener('click', () => this.go('click'));\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n const text = document.createElement('span');\n text.className = 'hp-redirect-text';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n text.appendChild(label);\n if (o.title) {\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n text.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('span');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n text.appendChild(sub);\n }\n // Erişilebilir ad görünen metinden oluşur (\"Sıradaki · 4 Başlık Alt başlık\"); sonuna yalnızca ekran okuyucunun\n // duyduğu \"Şimdi oynat\" eklenir — görsel / süre rozeti okunmaz.\n t.el.setAttribute('aria-hidden', 'true');\n const action = document.createElement('span');\n action.className = 'hp-sr-only';\n action.textContent = ` — ${this.ctx.i18n.redirectPlayNow}`;\n text.appendChild(action);\n main.append(t.el, text);\n\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-redirect-close';\n close.setAttribute('aria-label', this.ctx.i18n.redirectCancelCard);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => {\n this.cancelled = true;\n this.hideCard();\n this.emit('cancel');\n });\n\n card.append(main, close);\n // Karta dokunmak videoyu oynat / duraklat yapmasın.\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) card.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(card);\n this.card = card;\n this.cardRing = t.ring;\n this.cardLabel = label;\n this.emit('shown');\n }\n\n private hideCard(): void {\n this.card?.remove();\n this.card = null;\n this.cardRing = null;\n this.cardLabel = null;\n }\n\n // ── 'screen' modu ───────────────────────────────────────────────────────\n\n private remove(): void {\n if (this.counterTimer) {\n clearInterval(this.counterTimer);\n this.counterTimer = null;\n }\n this.wrapper?.remove();\n this.wrapper = null;\n }\n\n private createScreen(): void {\n this.remove();\n const o = this.options;\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-screen');\n wrapper.className = 'hp-redirect-screen';\n\n if (o.image) {\n const bg = document.createElement('img');\n bg.className = 'hp-redirect-bg';\n bg.src = o.image;\n bg.alt = '';\n bg.addEventListener('error', () => bg.remove());\n wrapper.appendChild(bg);\n }\n\n const panel = document.createElement('div');\n panel.className = 'hp-redirect-panel';\n const label = document.createElement('span');\n label.className = 'hp-redirect-label';\n label.textContent = o.label ?? this.ctx.i18n.redirectUpNext;\n panel.appendChild(label);\n\n const poster = document.createElement('button');\n poster.type = 'button';\n poster.className = 'hp-redirect-poster';\n poster.setAttribute('aria-label', this.ctx.i18n.redirectPlayNow);\n const t = thumb(o.image, o.duration, 'hp-redirect-thumb');\n poster.appendChild(t.el);\n poster.addEventListener('click', () => this.go('click'));\n panel.appendChild(poster);\n\n if (o.title) {\n const title = document.createElement('div');\n title.className = 'hp-redirect-title';\n title.textContent = o.title;\n panel.appendChild(title);\n }\n if (o.subtitle) {\n const sub = document.createElement('div');\n sub.className = 'hp-redirect-sub';\n sub.textContent = o.subtitle;\n panel.appendChild(sub);\n }\n\n const counter = document.createElement('div');\n counter.className = 'hp-redirect-counter';\n counter.setAttribute('aria-live', 'polite');\n panel.appendChild(counter);\n\n const actions = document.createElement('div');\n actions.className = 'hp-redirect-actions';\n const cancelBtn = document.createElement('button');\n cancelBtn.type = 'button';\n cancelBtn.className = 'hp-redirect-btn';\n cancelBtn.textContent = this.ctx.i18n.redirectCancel;\n const acceptBtn = document.createElement('button');\n acceptBtn.type = 'button';\n acceptBtn.className = 'hp-redirect-btn hp-redirect-btn-primary';\n acceptBtn.textContent = this.ctx.i18n.redirectPlayNow;\n acceptBtn.addEventListener('click', () => this.go('click'));\n cancelBtn.addEventListener('click', () => {\n this.remove();\n this.emit('cancel');\n if (o.suggestions?.length) this.showSuggestions(o.suggestions);\n });\n actions.append(cancelBtn, acceptBtn);\n panel.appendChild(actions);\n wrapper.appendChild(panel);\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n this.emit('shown');\n\n const total = Math.max(0, o.time ?? 10);\n let remaining = total;\n const render = (): void => {\n counter.textContent = this.ctx.i18n.redirectCountdown(remaining);\n t.ring.set(total > 0 ? remaining / total : 0);\n };\n render();\n this.counterTimer = setInterval(() => {\n remaining--;\n if (remaining > 0) {\n render();\n return;\n }\n if (this.counterTimer) clearInterval(this.counterTimer);\n this.counterTimer = null;\n counter.textContent = this.ctx.i18n.redirectNowPlaying;\n t.ring.set(0);\n this.go('auto');\n }, 1000);\n }\n\n /** Öneri ızgarası (bitiş ekranı): başlık + kapat, kartlar, \"Tekrar izle\". */\n private showSuggestions(items: RedirectScreenSuggestion[]): void {\n this.remove();\n const o = this.options;\n const i18n = this.ctx.i18n;\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'redirect-suggestions');\n wrapper.className = 'hp-redirect-suggestions';\n wrapper.setAttribute('role', 'region');\n const heading = o.suggestionsTitle ?? i18n.redirectSuggestions;\n wrapper.setAttribute('aria-label', heading);\n\n const head = document.createElement('div');\n head.className = 'hp-redirect-grid-head';\n const h = document.createElement('span');\n h.className = 'hp-redirect-grid-title';\n h.textContent = heading;\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'hp-redirect-close';\n close.setAttribute('aria-label', i18n.redirectCloseSuggestions);\n close.appendChild(createIcon('close'));\n close.addEventListener('click', () => this.remove());\n head.append(h, close);\n\n const grid = document.createElement('div');\n grid.className = 'hp-redirect-grid';\n grid.setAttribute('data-count', String(Math.min(items.length, 6)));\n items.forEach((item, index) => {\n const box = document.createElement('a');\n box.href = item.url;\n if (o.newTab) {\n box.target = '_blank';\n box.rel = 'noopener';\n }\n box.className = 'hp-redirect-suggestion';\n const t = thumb(item.image, item.duration, 'hp-redirect-thumb');\n t.el.querySelector('.hp-redirect-ring')?.remove();\n const title = document.createElement('span');\n title.className = 'hp-redirect-title';\n title.textContent = item.title;\n box.append(t.el, title);\n if (item.subtitle) {\n const sub = document.createElement('span');\n sub.className = 'hp-redirect-sub';\n sub.textContent = item.subtitle;\n box.appendChild(sub);\n }\n // SPA: preventDefault ile sayfa değişmez.\n box.addEventListener('click', (e) => {\n if (!this.emit('redirect', 'suggestion', item.url, index)) e.preventDefault();\n });\n grid.appendChild(box);\n });\n wrapper.append(head, grid);\n\n if (o.replay !== false) {\n const replay = document.createElement('button');\n replay.type = 'button';\n replay.className = 'hp-redirect-btn hp-redirect-replay';\n replay.append(createIcon('loop'), document.createTextNode(i18n.redirectReplay));\n replay.addEventListener('click', () => {\n this.remove();\n this.emit('replay');\n const v = this.ctx.videoEl;\n v.currentTime = 0;\n void v.play().catch(() => {});\n });\n wrapper.appendChild(replay);\n }\n\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) wrapper.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n}\n","import { RedirectScreen, type RedirectScreenPlayerContext } from './RedirectScreen';\nimport type { RedirectScreenOptions } from '../../types';\n\nexport function installRedirectScreen(ctx: RedirectScreenPlayerContext, options: RedirectScreenOptions): RedirectScreen {\n return new RedirectScreen(ctx, options);\n}\n\nexport { RedirectScreen };\nexport type { RedirectScreenPlayerContext };\n"],"names":["SVG_NS","RING_R","RING_C","DEFAULT_SHOW_BEFORE","ring","className","svg","track","bar","c","fraction","thumb","image","duration","el","img","play","createIcon","d","RedirectScreen","ctx","options","__publicField","v","showBefore","remaining","secs","_a","adoptStyle","css","_b","state","reason","url","index","o","card","main","t","text","label","title","sub","action","close","ev","e","wrapper","bg","panel","poster","counter","actions","cancelBtn","acceptBtn","total","render","items","i18n","heading","head","h","grid","item","box","replay","installRedirectScreen"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  var y = Object.defineProperty;
2
2
  var x = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
3
  var u = (r, t, e) => x(r, typeof t != "symbol" ? t + "" : t, e);
4
- import { L as E } from "./player-D7WQxMzr.js";
4
+ import { L as E } from "./player-D2_HRzot.js";
5
5
  const k = "https://securepubads.g.doubleclick.net/tag/js/gpt.js";
6
6
  let b = null;
7
7
  function C() {
@@ -261,4 +261,4 @@ export {
261
261
  K as RewardedUnlock,
262
262
  R as installRewardedUnlock
263
263
  };
264
- //# sourceMappingURL=rewardedUnlock-CGhQyWOk.js.map
264
+ //# sourceMappingURL=rewardedUnlock-DUqYwXTr.js.map