@hopeplayer/core 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/HopePlayerElement.d.ts +23 -0
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/{adTriggers-BIAWe8o4.js → adTriggers-DVqgm92F.js} +94 -93
  4. package/dist/chunks/{adTriggers-BIAWe8o4.js.map → adTriggers-DVqgm92F.js.map} +1 -1
  5. package/dist/chunks/{ads-DlpHPpR9.js → ads-eSKyiH1o.js} +2 -2
  6. package/dist/chunks/{ads-DlpHPpR9.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-vHyi7oV_.js → cast-DEowHmqA.js} +29 -28
  10. package/dist/chunks/{cast-vHyi7oV_.js.map → cast-DEowHmqA.js.map} +1 -1
  11. package/dist/chunks/{docPip-wybMVP1H.js → docPip-Bh6BWPk-.js} +30 -20
  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-CwqLXiZi.js → history-ZSdDDsRF.js} +35 -34
  16. package/dist/chunks/{history-CwqLXiZi.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/{markers-L69W3kj6.js → markers-D32rI-x-.js} +2 -2
  20. package/dist/chunks/{markers-L69W3kj6.js.map → markers-D32rI-x-.js.map} +1 -1
  21. package/dist/chunks/multiview-CL1WfJKt.js +295 -0
  22. package/dist/chunks/multiview-CL1WfJKt.js.map +1 -0
  23. package/dist/chunks/{pauseAd-BQQe21X4.js → pauseAd-DF7KGwUs.js} +32 -31
  24. package/dist/chunks/{pauseAd-BQQe21X4.js.map → pauseAd-DF7KGwUs.js.map} +1 -1
  25. package/dist/chunks/{player-D2_HRzot.js → player-B7mYS--8.js} +754 -682
  26. package/dist/chunks/player-B7mYS--8.js.map +1 -0
  27. package/dist/chunks/{playlist-CHfStNbQ.js → playlist-BkhIOfCy.js} +2 -2
  28. package/dist/chunks/{playlist-CHfStNbQ.js.map → playlist-BkhIOfCy.js.map} +1 -1
  29. package/dist/chunks/{pluginHost-cN2uGFeG.js → pluginHost-CXqkjNV1.js} +2 -2
  30. package/dist/chunks/{pluginHost-cN2uGFeG.js.map → pluginHost-CXqkjNV1.js.map} +1 -1
  31. package/dist/chunks/{redirectScreen-TIqLdvBY.js → redirectScreen-DgmjFVJH.js} +51 -39
  32. package/dist/chunks/redirectScreen-DgmjFVJH.js.map +1 -0
  33. package/dist/chunks/rewardedUnlock-BL97P5ht.js +265 -0
  34. package/dist/chunks/{rewardedUnlock-DUqYwXTr.js.map → rewardedUnlock-BL97P5ht.js.map} +1 -1
  35. package/dist/chunks/{segments-Ds-c1b5e.js → segments-CuQQEIAX.js} +2 -2
  36. package/dist/chunks/{segments-Ds-c1b5e.js.map → segments-CuQQEIAX.js.map} +1 -1
  37. package/dist/chunks/share-BdqQ8sGE.js +216 -0
  38. package/dist/chunks/share-BdqQ8sGE.js.map +1 -0
  39. package/dist/chunks/{skipSegments-ByNoF1qZ.js → skipSegments-BbepQ4Y6.js} +2 -2
  40. package/dist/chunks/{skipSegments-ByNoF1qZ.js.map → skipSegments-BbepQ4Y6.js.map} +1 -1
  41. package/dist/chunks/sponsorship-DoAZBbHE.js +241 -0
  42. package/dist/chunks/{sponsorship-BT21uwN5.js.map → sponsorship-DoAZBbHE.js.map} +1 -1
  43. package/dist/chunks/{spriteThumbnails-Cr9UmkM9.js → spriteThumbnails-BYg-DHx4.js} +2 -2
  44. package/dist/chunks/{spriteThumbnails-Cr9UmkM9.js.map → spriteThumbnails-BYg-DHx4.js.map} +1 -1
  45. package/dist/chunks/{story-CodA2dfn.js → story-DcBG6jUg.js} +2 -2
  46. package/dist/chunks/{story-CodA2dfn.js.map → story-DcBG6jUg.js.map} +1 -1
  47. package/dist/chunks/{transcript-LG7E9UYE.js → transcript-CHPQ6S6E.js} +33 -13
  48. package/dist/chunks/transcript-CHPQ6S6E.js.map +1 -0
  49. package/dist/controls/SeekBar.d.ts.map +1 -1
  50. package/dist/hls/SourceManager.d.ts +2 -0
  51. package/dist/hls/SourceManager.d.ts.map +1 -1
  52. package/dist/hope-player.js +3 -3
  53. package/dist/i18n/index.d.ts +9 -0
  54. package/dist/i18n/index.d.ts.map +1 -1
  55. package/dist/i18n/locales/en.d.ts +2 -2
  56. package/dist/i18n/locales/en.d.ts.map +1 -1
  57. package/dist/i18n/locales/tr.d.ts +2 -2
  58. package/dist/i18n/locales/tr.d.ts.map +1 -1
  59. package/dist/i18n/types.d.ts +27 -0
  60. package/dist/i18n/types.d.ts.map +1 -1
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/plugins/ad-triggers/index.d.ts.map +1 -1
  64. package/dist/plugins/audio-description/AudioDescription.d.ts +52 -0
  65. package/dist/plugins/audio-description/AudioDescription.d.ts.map +1 -0
  66. package/dist/plugins/audio-description/index.d.ts +6 -0
  67. package/dist/plugins/audio-description/index.d.ts.map +1 -0
  68. package/dist/plugins/audio-description/strings.d.ts +8 -0
  69. package/dist/plugins/audio-description/strings.d.ts.map +1 -0
  70. package/dist/plugins/cast/index.d.ts.map +1 -1
  71. package/dist/plugins/doc-pip/index.d.ts.map +1 -1
  72. package/dist/plugins/doc-pip/strings.d.ts +8 -0
  73. package/dist/plugins/doc-pip/strings.d.ts.map +1 -0
  74. package/dist/plugins/heatmap/Heatmap.d.ts +8 -0
  75. package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -1
  76. package/dist/plugins/heatmap/index.d.ts.map +1 -1
  77. package/dist/plugins/heatmap/strings.d.ts +8 -0
  78. package/dist/plugins/heatmap/strings.d.ts.map +1 -0
  79. package/dist/plugins/history/index.d.ts.map +1 -1
  80. package/dist/plugins/interactive/index.d.ts.map +1 -1
  81. package/dist/plugins/interactive/strings.d.ts +8 -0
  82. package/dist/plugins/interactive/strings.d.ts.map +1 -0
  83. package/dist/plugins/multiview/Multiview.d.ts +92 -0
  84. package/dist/plugins/multiview/Multiview.d.ts.map +1 -0
  85. package/dist/plugins/multiview/index.d.ts +6 -0
  86. package/dist/plugins/multiview/index.d.ts.map +1 -0
  87. package/dist/plugins/multiview/strings.d.ts +8 -0
  88. package/dist/plugins/multiview/strings.d.ts.map +1 -0
  89. package/dist/plugins/pause-ad/index.d.ts.map +1 -1
  90. package/dist/plugins/redirect-screen/index.d.ts.map +1 -1
  91. package/dist/plugins/redirect-screen/strings.d.ts +8 -0
  92. package/dist/plugins/redirect-screen/strings.d.ts.map +1 -0
  93. package/dist/plugins/rewarded/index.d.ts.map +1 -1
  94. package/dist/plugins/share/Share.d.ts +45 -0
  95. package/dist/plugins/share/Share.d.ts.map +1 -0
  96. package/dist/plugins/share/index.d.ts +6 -0
  97. package/dist/plugins/share/index.d.ts.map +1 -0
  98. package/dist/plugins/share/strings.d.ts +8 -0
  99. package/dist/plugins/share/strings.d.ts.map +1 -0
  100. package/dist/plugins/skip-segments/index.d.ts.map +1 -1
  101. package/dist/plugins/sponsorship/index.d.ts.map +1 -1
  102. package/dist/plugins/transcript/index.d.ts.map +1 -1
  103. package/dist/plugins/transcript/strings.d.ts +8 -0
  104. package/dist/plugins/transcript/strings.d.ts.map +1 -0
  105. package/dist/types/index.d.ts +93 -0
  106. package/dist/types/index.d.ts.map +1 -1
  107. package/package.json +1 -1
  108. package/dist/chunks/docPip-wybMVP1H.js.map +0 -1
  109. package/dist/chunks/heatmap-Bb7neaYU.js +0 -92
  110. package/dist/chunks/heatmap-Bb7neaYU.js.map +0 -1
  111. package/dist/chunks/interactive-CgltIneu.js +0 -189
  112. package/dist/chunks/interactive-CgltIneu.js.map +0 -1
  113. package/dist/chunks/player-D2_HRzot.js.map +0 -1
  114. package/dist/chunks/redirectScreen-TIqLdvBY.js.map +0 -1
  115. package/dist/chunks/rewardedUnlock-DUqYwXTr.js +0 -264
  116. package/dist/chunks/sponsorship-BT21uwN5.js +0 -240
  117. package/dist/chunks/transcript-LG7E9UYE.js.map +0 -1
@@ -1 +0,0 @@
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,264 +0,0 @@
1
- var y = Object.defineProperty;
2
- var x = (r, t, e) => t in r ? y(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
3
- var u = (r, t, e) => x(r, typeof t != "symbol" ? t + "" : t, e);
4
- import { L as E } from "./player-D2_HRzot.js";
5
- const k = "https://securepubads.g.doubleclick.net/tag/js/gpt.js";
6
- let b = null;
7
- function C() {
8
- var t;
9
- const r = window;
10
- return r.googletag ?? (r.googletag = { cmd: [] }), (t = r.googletag).cmd ?? (t.cmd = []), r.googletag.apiReady || document.querySelector('script[src*="/tag/js/gpt.js"]') ? Promise.resolve() : (b ?? (b = new Promise((e, o) => {
11
- const s = document.createElement("script");
12
- s.async = !0, s.src = k, s.onload = () => e(), s.onerror = () => {
13
- b = null, s.remove(), o(new Error("gpt.js could not be loaded (ad blocker / network / certificate)"));
14
- }, document.head.appendChild(s);
15
- })), b);
16
- }
17
- function L(r, t, e) {
18
- return new Promise((o) => {
19
- let s = !1, n = !1, m = !1, i = null, f = null;
20
- const v = [], c = (d) => {
21
- var p;
22
- if (!s) {
23
- if (s = !0, clearTimeout(h), e == null || e.removeEventListener("abort", l), f) {
24
- const g = f.pubads();
25
- for (const [a, w] of v) (p = g.removeEventListener) == null || p.call(g, a, w);
26
- if (i)
27
- try {
28
- f.destroySlots([i]);
29
- } catch {
30
- }
31
- }
32
- o(d);
33
- }
34
- }, l = () => c("closed"), h = setTimeout(() => c("nofill"), t);
35
- if (e != null && e.aborted) {
36
- c("closed");
37
- return;
38
- }
39
- e == null || e.addEventListener("abort", l), C().then(() => {
40
- if (s) return;
41
- const d = window.googletag;
42
- d.cmd.push(() => {
43
- if (s) return;
44
- if (f = d, i = d.defineOutOfPageSlot(r, d.enums.OutOfPageFormat.REWARDED), !i) {
45
- c("nofill");
46
- return;
47
- }
48
- i.addService(d.pubads());
49
- const p = d.pubads(), g = (a, w) => {
50
- v.push([a, w]), p.addEventListener(a, w);
51
- };
52
- g("rewardedSlotReady", (a) => {
53
- var w;
54
- a.slot !== i || s || (clearTimeout(h), e == null || e.removeEventListener("abort", l), (w = a.makeRewardedVisible) == null || w.call(a));
55
- }), g("rewardedSlotGranted", (a) => {
56
- a.slot === i && (n = !0, m && c("granted"));
57
- }), g("rewardedSlotVideoCompleted", (a) => {
58
- a.slot === i && (m = !0, n && c("granted"));
59
- }), g("rewardedSlotClosed", (a) => {
60
- a.slot === i && c(n ? "granted" : "closed");
61
- }), g("slotRenderEnded", (a) => {
62
- a.slot === i && a.isEmpty && c("nofill");
63
- }), d.enableServices(), d.display(i);
64
- });
65
- }).catch(() => c("nofill"));
66
- });
67
- }
68
- const T = 480, S = "hope-rewarded-unlock", A = 8e3, D = 2600;
69
- let F = 0;
70
- class K {
71
- constructor(t, e) {
72
- u(this, "options");
73
- u(this, "button");
74
- u(this, "dialog", null);
75
- u(this, "toast", null);
76
- u(this, "toastTimer", null);
77
- u(this, "phase", "idle");
78
- /** 'video' modunda kilidin açık olduğu içerik (kaynak listesi — kalite dosyası değil). */
79
- u(this, "videoUnlockedKey", null);
80
- u(this, "lastKey", "");
81
- /** Kaynak değişti: 'video' modunda kilit yeniden kapanır; süreli kilit dolduysa menüler güncellenir. */
82
- u(this, "onSourceChange", () => {
83
- const t = this.ctx.contentKey();
84
- t !== this.lastKey && (this.lastKey = t, this.onQualitiesChanged());
85
- });
86
- u(this, "resumeAfterDialog", !1);
87
- /** Reklam hazırlanırken "Vazgeç" — sağlayıcıya iletilir (GPT slotu temizlenir). */
88
- u(this, "abort", null);
89
- this.ctx = t, this.options = e;
90
- const o = document.createElement("button");
91
- o.type = "button", o.className = "hp-rw-button", o.setAttribute("part", "rewarded-button"), o.addEventListener("click", (s) => {
92
- s.stopPropagation(), this.requestUnlock();
93
- }), o.addEventListener("pointerdown", (s) => s.stopPropagation()), t.chromeEl.appendChild(o), this.button = o, t.videoEl.addEventListener("loadstart", this.onSourceChange), this.refreshLabels(), this.onQualitiesChanged();
94
- }
95
- update(t) {
96
- const e = this.unlocked;
97
- this.options = t, e !== this.unlocked && this.ctx.onLockChange(!1), this.onQualitiesChanged();
98
- }
99
- // ── Kilit durumu ────────────────────────────────────────────────────
100
- get maxFreeHeight() {
101
- const t = this.options.maxFreeHeight;
102
- return typeof t == "number" && t > 0 ? t : T;
103
- }
104
- get storageKey() {
105
- return this.options.storageKey || S;
106
- }
107
- get unlockFor() {
108
- const t = this.options.unlockFor;
109
- return typeof t == "number" && t > 0 ? t : t === "video" ? "video" : "session";
110
- }
111
- get unlocked() {
112
- const t = this.unlockFor;
113
- if (t === "video") return !!this.videoUnlockedKey && this.videoUnlockedKey === this.ctx.contentKey();
114
- try {
115
- if (t === "session") return sessionStorage.getItem(this.storageKey) === "1";
116
- const e = Number(localStorage.getItem(this.storageKey));
117
- return Number.isFinite(e) && e > Date.now();
118
- } catch {
119
- return !1;
120
- }
121
- }
122
- grant() {
123
- const t = this.unlockFor;
124
- t === "video" && (this.videoUnlockedKey = this.ctx.contentKey());
125
- try {
126
- t === "session" ? sessionStorage.setItem(this.storageKey, "1") : typeof t == "number" && localStorage.setItem(this.storageKey, String(Date.now() + t * 6e4));
127
- } catch {
128
- this.videoUnlockedKey = this.ctx.contentKey();
129
- }
130
- }
131
- /** Player için: bu yükseklikteki kalite kilitli mi? */
132
- isLocked(t) {
133
- return this.unlocked ? !1 : t !== null && t > this.maxFreeHeight;
134
- }
135
- /** Player kalite listesi değişince çağırır: buton yalnızca kilitli kalite varken görünür. */
136
- onQualitiesChanged() {
137
- const t = this.ctx.lockedQualityLabel(), e = this.options.button !== !1 && !!t && !this.unlocked;
138
- if (this.button.hidden = !e, !e) return;
139
- const o = this.fill(this.ctx.i18n.rewardedButton, t);
140
- this.button.innerHTML = `${E}<span>${N(o)}</span>`, this.button.setAttribute("aria-label", o);
141
- }
142
- // ── Akış ────────────────────────────────────────────────────────────
143
- /** Kilitli kaliteye ya da butona dokunuldu: onay penceresi. */
144
- requestUnlock() {
145
- if (this.unlocked || this.phase !== "idle") return;
146
- const t = this.ctx.lockedQualityLabel() ?? "HD";
147
- this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedprompt", { detail: { quality: t } })), this.showDialog("prompt", t);
148
- }
149
- async watch(t) {
150
- const e = this.ctx.videoEl, o = !e.paused;
151
- e.pause(), this.ctx.exitFullscreen(), this.abort = new AbortController();
152
- const s = this.abort.signal;
153
- this.showDialog("loading", t);
154
- let n;
155
- try {
156
- n = await this.runProvider(s);
157
- } catch (i) {
158
- this.ctx.log({ message: `Rewarded ad failed: ${String(i)}` }), n = "nofill";
159
- }
160
- if (this.abort = null, s.aborted) {
161
- this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1, cancelled: !0 } })), o && this.ctx.play();
162
- return;
163
- }
164
- let m = !1;
165
- if (n === "nofill" && this.options.grantOnNoFill !== !1 && (this.ctx.log({ message: "Rewarded ad: no ad available (no fill / error / timeout) — unlocked anyway (grantOnNoFill)" }), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardednofill", { detail: { granted: !0 } })), n = "granted", m = !0), n === "granted") {
166
- this.grant(), this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedgranted", { detail: { quality: t, noAd: m } })), this.ctx.onLockChange(!0), this.onQualitiesChanged(), this.showToast(this.fill(m ? this.ctx.i18n.rewardedUnlockedNoAd : this.ctx.i18n.rewardedUnlocked, t)), o && this.ctx.play();
167
- return;
168
- }
169
- if (n === "nofill") {
170
- this.ctx.log({ message: "Rewarded ad: no ad available (no fill / unsupported page / timeout)" }), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardednofill", { detail: { granted: !1 } })), this.showDialog("nofill", t), this.resumeAfterDialog = o;
171
- return;
172
- }
173
- this.closeDialog(), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1 } })), o && this.ctx.play();
174
- }
175
- async runProvider(t) {
176
- const e = this.options.provider;
177
- if ((e == null ? void 0 : e.type) === "gpt") return L(e.adUnitPath, e.timeoutMs ?? A, t);
178
- if ((e == null ? void 0 : e.type) === "custom") {
179
- const o = new Promise((n) => t.addEventListener("abort", () => n("closed"), { once: !0 })), s = await Promise.race([e.show({ signal: t }), o]);
180
- return s === !0 ? "granted" : s === !1 ? "closed" : s;
181
- }
182
- throw new Error("rewardedUnlock.provider is missing");
183
- }
184
- // ── Arayüz ─────────────────────────────────────────────────────────
185
- fill(t, e) {
186
- const o = this.unlockFor, s = this.ctx.i18n, n = o === "video" ? s.rewardedForVideo : o === "session" ? s.rewardedForSession : s.rewardedForMinutes.replace("{n}", String(o));
187
- return t.replace("{quality}", e).replace("{duration}", n);
188
- }
189
- showDialog(t, e) {
190
- this.phase = t;
191
- const o = this.ctx.i18n;
192
- if (!this.dialog) {
193
- const l = document.createElement("div");
194
- l.className = "hp-rw-dialog", l.setAttribute("part", "rewarded-dialog"), l.setAttribute("role", "dialog"), l.setAttribute("aria-modal", "true");
195
- for (const h of ["click", "pointerdown", "dblclick"]) l.addEventListener(h, (d) => d.stopPropagation());
196
- l.addEventListener("keydown", (h) => {
197
- var d;
198
- h.stopPropagation(), h.key === "Escape" && (this.phase === "loading" ? (d = this.abort) == null || d.abort() : this.dismiss());
199
- }), this.ctx.overlayEl.appendChild(l), this.dialog = l;
200
- }
201
- const s = this.dialog;
202
- s.setAttribute("data-phase", t), s.innerHTML = "";
203
- const n = document.createElement("div");
204
- n.className = "hp-rw-card";
205
- const m = document.createElement("div");
206
- m.className = "hp-rw-icon", m.innerHTML = E;
207
- const i = document.createElement("div");
208
- i.className = "hp-rw-title", i.id = `hp-rw-title-${++F}`, s.setAttribute("aria-labelledby", i.id);
209
- const f = document.createElement("div");
210
- f.className = "hp-rw-text";
211
- const v = document.createElement("div");
212
- v.className = "hp-rw-actions", n.append(m, i, f, v), s.appendChild(n);
213
- const c = (l, h, d) => {
214
- const p = document.createElement("button");
215
- return p.type = "button", p.className = h ? "hp-rw-btn hp-rw-btn-primary" : "hp-rw-btn", p.textContent = l, p.addEventListener("click", d), v.appendChild(p), p;
216
- };
217
- if (t === "prompt")
218
- i.textContent = this.fill(o.rewardedTitle, e), f.textContent = this.fill(o.rewardedBody, e), c(o.rewardedDecline, !1, () => this.dismiss()), c(o.rewardedWatch, !0, () => void this.watch(e)).focus();
219
- else if (t === "loading") {
220
- i.textContent = o.rewardedLoading;
221
- const l = document.createElement("div");
222
- l.className = "hp-rw-spinner", f.appendChild(l), c(o.rewardedDecline, !1, () => {
223
- var h;
224
- return (h = this.abort) == null ? void 0 : h.abort();
225
- });
226
- } else
227
- i.textContent = this.fill(o.rewardedTitle, e), f.textContent = o.rewardedNoFill, c(o.rewardedOk, !0, () => this.dismiss()).focus();
228
- }
229
- dismiss() {
230
- const t = this.phase === "nofill";
231
- this.closeDialog(), t || this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:rewardedclosed", { detail: { granted: !1, declined: !0 } })), this.resumeAfterDialog && this.ctx.play(), this.resumeAfterDialog = !1;
232
- }
233
- closeDialog() {
234
- var t;
235
- this.phase = "idle", (t = this.dialog) == null || t.remove(), this.dialog = null;
236
- }
237
- showToast(t) {
238
- var o;
239
- this.toastTimer && clearTimeout(this.toastTimer), (o = this.toast) == null || o.remove();
240
- const e = document.createElement("div");
241
- e.className = "hp-rw-toast", e.setAttribute("part", "rewarded-toast"), e.setAttribute("role", "status"), e.textContent = t, this.ctx.overlayEl.appendChild(e), this.toast = e, this.toastTimer = setTimeout(() => {
242
- var s;
243
- (s = this.toast) == null || s.remove(), this.toast = null;
244
- }, D);
245
- }
246
- refreshLabels() {
247
- this.onQualitiesChanged();
248
- }
249
- destroy() {
250
- var t, e;
251
- (t = this.abort) == null || t.abort(), this.ctx.videoEl.removeEventListener("loadstart", this.onSourceChange), this.toastTimer && clearTimeout(this.toastTimer), (e = this.toast) == null || e.remove(), this.closeDialog(), this.button.remove();
252
- }
253
- }
254
- function N(r) {
255
- return r.replace(/[&<>"']/g, (t) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[t]);
256
- }
257
- function R(r, t) {
258
- return new K(r, t);
259
- }
260
- export {
261
- K as RewardedUnlock,
262
- R as installRewardedUnlock
263
- };
264
- //# sourceMappingURL=rewardedUnlock-DUqYwXTr.js.map
@@ -1,240 +0,0 @@
1
- var w = Object.defineProperty;
2
- var S = (i, t, e) => t in i ? w(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
3
- var a = (i, t, e) => S(i, typeof t != "symbol" ? t + "" : t, e);
4
- import { f as m } from "./trackingPixel-D2wxdCEz.js";
5
- const A = 5e3, T = 96, k = 3500, x = {
6
- accent: "--hp-color-accent",
7
- onAccent: "--hp-color-on-accent",
8
- surface: "--hp-color-surface",
9
- onSurface: "--hp-color-on-surface"
10
- }, C = ["top-left", "top-right", "bottom-left", "bottom-right"];
11
- function f(i) {
12
- if (typeof i != "string" || !i.trim()) return null;
13
- try {
14
- const t = new URL(i, document.baseURI);
15
- return t.protocol === "https:" || t.protocol === "http:" ? t.href : null;
16
- } catch {
17
- return null;
18
- }
19
- }
20
- function M(i) {
21
- return typeof i == "string" && i.length < 64 && CSS.supports("color", i) ? i : null;
22
- }
23
- function g(i, t, e, o) {
24
- return typeof i == "number" && Number.isFinite(i) ? Math.min(e, Math.max(t, i)) : o;
25
- }
26
- function L(i) {
27
- var p, l, n, c, v, y, E, b;
28
- if (!i || typeof i != "object") return null;
29
- const t = i;
30
- if (t.active !== !0 || !t.sponsor || typeof t.sponsor.name != "string" || !t.sponsor.name.trim()) return null;
31
- const e = Date.now(), o = t.validFrom ? Date.parse(t.validFrom) : NaN, s = t.validUntil ? Date.parse(t.validUntil) : NaN;
32
- if (Number.isFinite(o) && e < o || Number.isFinite(s) && e > s) return null;
33
- const r = {};
34
- for (const d of Object.keys(x)) {
35
- const u = M((p = t.theme) == null ? void 0 : p[d]);
36
- u && (r[d] = u);
37
- }
38
- const h = (d) => Array.isArray(d) ? d.map(f).filter((u) => !!u).slice(0, 10) : [];
39
- return {
40
- active: !0,
41
- id: typeof t.id == "string" ? t.id.slice(0, 120) : void 0,
42
- sponsor: {
43
- name: t.sponsor.name.slice(0, 80),
44
- logo: f(t.sponsor.logo) ?? void 0,
45
- url: f(t.sponsor.url) ?? void 0
46
- },
47
- theme: r,
48
- logo: {
49
- position: C.includes((l = t.logo) == null ? void 0 : l.position) ? t.logo.position : "top-left",
50
- width: g((n = t.logo) == null ? void 0 : n.width, 32, 240, T),
51
- opacity: g((c = t.logo) == null ? void 0 : c.opacity, 0.2, 1, 0.9),
52
- label: typeof ((v = t.logo) == null ? void 0 : v.label) == "string" ? t.logo.label.slice(0, 40) : void 0
53
- },
54
- intro: t.intro ? {
55
- text: typeof t.intro.text == "string" ? t.intro.text.slice(0, 120) : void 0,
56
- durationMs: g(t.intro.durationMs, 1e3, 15e3, k),
57
- repeatMinutes: typeof t.intro.repeatMinutes == "number" && t.intro.repeatMinutes > 0 ? Math.min(240, Math.max(1, t.intro.repeatMinutes)) : void 0,
58
- maxShows: typeof t.intro.maxShows == "number" && t.intro.maxShows >= 1 ? Math.min(100, Math.floor(t.intro.maxShows)) : void 0
59
- } : void 0,
60
- tracking: { impression: h((y = t.tracking) == null ? void 0 : y.impression), click: h((E = t.tracking) == null ? void 0 : E.click), intro: h((b = t.tracking) == null ? void 0 : b.intro) }
61
- };
62
- }
63
- class I {
64
- constructor(t, e) {
65
- a(this, "options");
66
- a(this, "config", null);
67
- a(this, "logoEl", null);
68
- a(this, "introEl", null);
69
- a(this, "introTimer", null);
70
- a(this, "refreshTimer", null);
71
- /** Player boyutu / kontrol düzeni değişince logo kontrollerin üstüne binmesin diye yeniden konumlanır. */
72
- a(this, "resizeObserver");
73
- /** Uygulanan tema değişkenlerinin önceki satır içi değerleri — katman kalkınca geri yüklenir. */
74
- a(this, "previousTokens", /* @__PURE__ */ new Map());
75
- /** Gösterim pikseli kampanya başına bir kez. */
76
- a(this, "impressed", /* @__PURE__ */ new Set());
77
- /** Kampanya başına giriş gösterim sayısı. */
78
- a(this, "introCount", /* @__PURE__ */ new Map());
79
- /** Son girişten bu yana gerçek izleme süresi (ms) — intro.repeatMinutes için. */
80
- a(this, "watchedSinceIntro", 0);
81
- a(this, "lastTick", 0);
82
- a(this, "tickTimer");
83
- a(this, "destroyed", !1);
84
- a(this, "requestSeq", 0);
85
- /** Oynatma başladı: kampanya başına bir kez gösterim pikseli + "X sunar" kartı. */
86
- a(this, "onPlay", () => {
87
- var o;
88
- const t = this.config;
89
- if (!t) return;
90
- const e = this.key(t);
91
- this.impressed.has(e) || (this.impressed.add(e), m((o = t.tracking) == null ? void 0 : o.impression), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorimpression", { detail: { id: t.id, sponsor: t.sponsor.name } }))), t.intro && !this.introCount.has(e) && this.showIntro(t);
92
- });
93
- /**
94
- * intro.repeatMinutes: yalnızca gerçekten izlenirken sayar (oynuyor, sekme önde, reklam yok); süre dolunca giriş
95
- * tekrar gösterilir — maxShows'a kadar.
96
- */
97
- a(this, "tick", () => {
98
- var p, l;
99
- const t = performance.now(), e = Math.min(2e3, Math.max(0, t - this.lastTick));
100
- this.lastTick = t;
101
- const o = this.config, s = (p = o == null ? void 0 : o.intro) == null ? void 0 : p.repeatMinutes;
102
- if (!o || !s || !(!this.ctx.videoEl.paused && !this.ctx.videoEl.ended && !document.hidden && !this.ctx.hostEl.hasAttribute("data-sponsor-hidden")) || !this.introCount.has(this.key(o)) || (this.watchedSinceIntro += e, this.watchedSinceIntro < s * 6e4)) return;
103
- const h = (l = o.intro) == null ? void 0 : l.maxShows;
104
- h && (this.introCount.get(this.key(o)) ?? 0) >= h || this.showIntro(o);
105
- });
106
- /** Lineer reklam sırasında logo / giriş gizlenir (reklamın üstüne binmesin). */
107
- a(this, "onAdStart", (t) => {
108
- var e;
109
- ((e = t.detail) == null ? void 0 : e.linear) !== !1 && this.ctx.hostEl.setAttribute("data-sponsor-hidden", "");
110
- });
111
- a(this, "onAdEnd", (t) => {
112
- var e;
113
- ((e = t.detail) == null ? void 0 : e.linear) !== !1 && this.ctx.hostEl.removeAttribute("data-sponsor-hidden");
114
- });
115
- var s, r;
116
- this.ctx = t, this.options = e, t.videoEl.addEventListener("play", this.onPlay), t.hostEl.addEventListener("hp:adstart", this.onAdStart), t.hostEl.addEventListener("hp:adend", this.onAdEnd), this.lastTick = performance.now(), this.tickTimer = setInterval(this.tick, 1e3), this.resizeObserver = typeof ResizeObserver < "u" ? new ResizeObserver(() => this.positionLogo()) : null, (s = this.resizeObserver) == null || s.observe(t.overlayEl);
117
- const o = t.overlayEl.querySelector(".hp-top-bar");
118
- o && ((r = this.resizeObserver) == null || r.observe(o)), this.load(), this.scheduleRefresh();
119
- }
120
- update(t) {
121
- const e = t.endpoint !== this.options.endpoint || JSON.stringify(t.params) !== JSON.stringify(this.options.params), o = t.refreshSeconds !== this.options.refreshSeconds;
122
- this.options = t, e && this.load(), o && this.scheduleRefresh();
123
- }
124
- /** Şu an uygulanan kampanya (yoksa null). */
125
- get current() {
126
- return this.config;
127
- }
128
- scheduleRefresh() {
129
- this.refreshTimer && clearInterval(this.refreshTimer), this.refreshTimer = null;
130
- const t = this.options.refreshSeconds;
131
- typeof t == "number" && t >= 10 && (this.refreshTimer = setInterval(() => void this.load(), t * 1e3));
132
- }
133
- buildUrl() {
134
- const t = new URL(this.options.endpoint, document.baseURI);
135
- for (const [e, o] of Object.entries(this.options.params ?? {})) t.searchParams.set(e, o);
136
- return t.href;
137
- }
138
- async load() {
139
- const t = ++this.requestSeq, e = typeof AbortController < "u" ? new AbortController() : null, o = setTimeout(() => e == null ? void 0 : e.abort(), this.options.timeoutMs ?? A);
140
- let s = "";
141
- try {
142
- s = this.buildUrl();
143
- const r = await fetch(s, { ...this.options.fetchInit, signal: e == null ? void 0 : e.signal });
144
- if (!r.ok) throw new Error(`HTTP ${r.status}`);
145
- const h = await r.json();
146
- if (this.destroyed || t !== this.requestSeq) return;
147
- this.apply(L(h));
148
- } catch (r) {
149
- if (this.destroyed || t !== this.requestSeq) return;
150
- this.ctx.log({ message: `Sponsorship API failed: ${String(r)}`, details: { url: s } });
151
- } finally {
152
- clearTimeout(o);
153
- }
154
- }
155
- apply(t) {
156
- const e = this.key(this.config);
157
- this.config = t, this.applyTheme((t == null ? void 0 : t.theme) ?? null), this.renderLogo(), this.ctx.hostEl.toggleAttribute("data-sponsored", !!t), this.key(t) !== e && (this.watchedSinceIntro = 0, this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorship", { detail: { config: t } })), t && !this.ctx.videoEl.paused && this.onPlay());
158
- }
159
- key(t) {
160
- return t ? t.id || t.sponsor.name : "";
161
- }
162
- applyTheme(t) {
163
- const e = this.ctx.hostEl.style;
164
- for (const [o, s] of this.previousTokens)
165
- s ? e.setProperty(o, s) : e.removeProperty(o);
166
- if (this.previousTokens.clear(), !!t)
167
- for (const [o, s] of Object.entries(x)) {
168
- const r = t[o];
169
- r && (this.previousTokens.set(s, e.getPropertyValue(s)), e.setProperty(s, r));
170
- }
171
- }
172
- renderLogo() {
173
- var o, s, r, h, p, l;
174
- (o = this.logoEl) == null || o.remove(), this.logoEl = null;
175
- const t = this.config;
176
- if (!t || !t.sponsor.logo && !((s = t.logo) != null && s.label)) return;
177
- const e = t.sponsor.url ? document.createElement("a") : document.createElement("div");
178
- if (e.className = "hp-sponsor-logo", e.setAttribute("part", "sponsor-logo"), e.setAttribute("data-position", ((r = t.logo) == null ? void 0 : r.position) ?? "top-left"), e.style.setProperty("--hp-sponsor-logo-w", `${((h = t.logo) == null ? void 0 : h.width) ?? T}px`), e.style.opacity = String(((p = t.logo) == null ? void 0 : p.opacity) ?? 0.9), e instanceof HTMLAnchorElement && (e.href = t.sponsor.url, e.target = "_blank", e.rel = "noopener sponsored", e.addEventListener("click", (n) => {
179
- var c;
180
- n.stopPropagation(), m((c = t.tracking) == null ? void 0 : c.click), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorclick", { detail: { id: t.id, sponsor: t.sponsor.name } }));
181
- })), e.setAttribute("aria-label", t.sponsor.name), t.sponsor.logo) {
182
- const n = document.createElement("img");
183
- n.src = t.sponsor.logo, n.alt = t.sponsor.name, n.decoding = "async", n.addEventListener("error", () => n.remove()), e.appendChild(n);
184
- }
185
- if ((l = t.logo) != null && l.label) {
186
- const n = document.createElement("span");
187
- n.className = "hp-sponsor-label", n.textContent = t.logo.label, e.appendChild(n);
188
- }
189
- for (const n of ["pointerdown", "dblclick"]) e.addEventListener(n, (c) => c.stopPropagation());
190
- this.ctx.overlayEl.appendChild(e), this.logoEl = e, this.positionLogo();
191
- }
192
- /**
193
- * Logo kontrollerin üstüne binmesin: sağ üstte (dar player'da ayarlar / PiP oraya taşınır) üst çubuğun soluna,
194
- * altta seek bar'ın hemen üstüne yerleşir. Dar player'da logo en fazla 48 px.
195
- */
196
- positionLogo() {
197
- var h, p;
198
- const t = this.logoEl;
199
- if (!t) return;
200
- const e = this.ctx.overlayEl, o = e.hasAttribute("data-compact"), s = t.getAttribute("data-position");
201
- t.style.removeProperty("--hp-sponsor-avoid-right"), t.style.removeProperty("--hp-sponsor-avoid-bottom"), t.toggleAttribute("data-compact", o);
202
- const r = e.getBoundingClientRect();
203
- if (s === "top-right") {
204
- const l = (h = e.querySelector(".hp-top-bar")) == null ? void 0 : h.getBoundingClientRect();
205
- l && l.width > 0 && t.style.setProperty("--hp-sponsor-avoid-right", `${Math.round(r.right - l.left + 8)}px`);
206
- } else if (s === "bottom-left" || s === "bottom-right") {
207
- const l = (p = e.querySelector('[part="seek-bar"]')) == null ? void 0 : p.getBoundingClientRect();
208
- l && l.height > 0 && t.style.setProperty("--hp-sponsor-avoid-bottom", `${Math.round(r.bottom - l.top + 6)}px`);
209
- }
210
- }
211
- showIntro(t) {
212
- var h, p, l, n;
213
- const e = this.key(t), o = (this.introCount.get(e) ?? 0) + 1;
214
- this.introCount.set(e, o), this.watchedSinceIntro = 0, m((h = t.tracking) == null ? void 0 : h.intro), this.ctx.hostEl.dispatchEvent(new CustomEvent("hp:sponsorintro", { detail: { id: t.id, sponsor: t.sponsor.name, count: o } })), this.introTimer && clearTimeout(this.introTimer), (p = this.introEl) == null || p.remove();
215
- const s = document.createElement("div");
216
- if (s.className = "hp-sponsor-intro", s.setAttribute("part", "sponsor-intro"), s.setAttribute("role", "status"), t.sponsor.logo) {
217
- const c = document.createElement("img");
218
- c.src = t.sponsor.logo, c.alt = "", c.addEventListener("error", () => c.remove()), s.appendChild(c);
219
- }
220
- const r = document.createElement("span");
221
- r.textContent = ((l = t.intro) == null ? void 0 : l.text) || this.ctx.i18n.sponsorPresents.replace("{name}", t.sponsor.name), s.appendChild(r), this.ctx.overlayEl.appendChild(s), this.introEl = s, this.ctx.hostEl.setAttribute("data-sponsor-intro", ""), this.introTimer = setTimeout(() => {
222
- s.setAttribute("data-leaving", ""), this.ctx.hostEl.removeAttribute("data-sponsor-intro"), this.introTimer = setTimeout(() => {
223
- s.remove(), this.introEl === s && (this.introEl = null);
224
- }, 400);
225
- }, ((n = t.intro) == null ? void 0 : n.durationMs) ?? k);
226
- }
227
- destroy() {
228
- var t, e, o;
229
- this.destroyed = !0, clearInterval(this.tickTimer), (t = this.resizeObserver) == null || t.disconnect(), this.refreshTimer && clearInterval(this.refreshTimer), this.introTimer && clearTimeout(this.introTimer), this.ctx.videoEl.removeEventListener("play", this.onPlay), this.ctx.hostEl.removeEventListener("hp:adstart", this.onAdStart), this.ctx.hostEl.removeEventListener("hp:adend", this.onAdEnd), this.applyTheme(null), (e = this.logoEl) == null || e.remove(), (o = this.introEl) == null || o.remove(), this.ctx.hostEl.removeAttribute("data-sponsored"), this.ctx.hostEl.removeAttribute("data-sponsor-hidden"), this.ctx.hostEl.removeAttribute("data-sponsor-intro");
230
- }
231
- }
232
- function N(i, t) {
233
- return new I(i, t);
234
- }
235
- export {
236
- I as SponsorshipLayer,
237
- N as installSponsorship,
238
- L as normalizeSponsorship
239
- };
240
- //# sourceMappingURL=sponsorship-BT21uwN5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcript-LG7E9UYE.js","sources":["../../src/plugins/transcript/Transcript.ts","../../src/plugins/transcript/index.ts"],"sourcesContent":["import type { TranscriptOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createIcon } from '../../icons/Icon';\nimport { formatTime } from '../../utils/format-time';\nimport { trackCues } from '../../subtitles/attachTracks';\nimport { adoptStyle } from '../../utils/plugin-style';\nimport css from './transcript.css?inline';\n\nexport interface TranscriptPlayerContext {\n hostEl: HTMLElement;\n videoEl: HTMLVideoElement;\n overlayEl: HTMLElement;\n i18n: HopeLocaleStrings;\n /** Altyazı menüsündeki izler (dosya + yayın). */\n getTracks(): { label: string; track: TextTrack }[];\n /** Seçili altyazının adı (kapalıysa null). */\n activeLabel(): string | null;\n addButton(label: string, iconName: string, onClick: () => void): { btn: HTMLButtonElement; icon: HTMLElement };\n}\n\ninterface Line {\n start: number;\n end: number;\n text: string;\n row: HTMLLIElement;\n textEl: HTMLSpanElement;\n}\n\nconst ENTITIES: Record<string, string> = { '&amp;': '&', '&lt;': '<', '&gt;': '>', '&nbsp;': ' ', '&quot;': '\"', '&#39;': \"'\" };\n\n/** VTT etiketlerini (<v Ad>, <b>, <c.renk>, zaman damgası) atar, satırları birleştirir. */\nfunction cleanCueText(raw: string): string {\n return raw\n .replace(/<[^>]*>/g, '')\n .replace(/&(amp|lt|gt|nbsp|quot|#39);/g, (m) => ENTITIES[m] ?? m)\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Arama için harf/aksan duyarsız biçim (İ/ı dahil). */\nfunction fold(s: string): string {\n return s.toLocaleLowerCase('tr').normalize('NFD').replace(/[̀-ͯ]/g, '');\n}\n\n/**\n * Transkript paneli: seçili (ya da `track`) altyazı izinin tüm satırları; tıklayınca o ana gider, oynayan satır\n * vurgulanır ve görünür tutulur, aranabilir. Dosyadan gelen altyazılar iz kapalıyken de okunur; yayın içi izler\n * (HLS / DASH) yalnızca açıkken dolar.\n */\nexport class Transcript {\n private readonly panel: HTMLElement;\n private readonly list: HTMLOListElement;\n private readonly status: HTMLParagraphElement;\n private readonly select: HTMLSelectElement;\n private readonly search: HTMLInputElement | null = null;\n private readonly titleEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private button: HTMLButtonElement | null = null;\n private lines: Line[] = [];\n private activeIndex = -1;\n private sourceLabel: string | null = null;\n private sourceTrack: TextTrack | null = null;\n private cueCount = -1;\n private query = '';\n private open = false;\n private userScrollUntil = 0;\n private lastSync = 0;\n private readonly autoScroll: boolean;\n\n constructor(\n private readonly ctx: TranscriptPlayerContext,\n private readonly options: TranscriptOptions\n ) {\n this.autoScroll = options.autoScroll !== false;\n adoptStyle(ctx.overlayEl, 'transcript', css);\n const panel = document.createElement('aside');\n panel.className = 'hp-transcript';\n panel.setAttribute('part', 'transcript');\n panel.setAttribute('data-position', options.position === 'left' ? 'left' : 'right');\n panel.hidden = true;\n\n const head = document.createElement('div');\n head.className = 'hp-transcript-head';\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'hp-transcript-title';\n this.select = document.createElement('select');\n this.select.className = 'hp-transcript-select';\n this.select.addEventListener('change', () => {\n this.sourceLabel = this.select.value;\n this.load();\n });\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-transcript-close';\n this.closeBtn.appendChild(createIcon('close'));\n this.closeBtn.addEventListener('click', () => this.setOpen(false));\n head.append(this.titleEl, this.select, this.closeBtn);\n panel.appendChild(head);\n\n if (options.search !== false) {\n const search = document.createElement('input');\n search.type = 'search';\n search.className = 'hp-transcript-search';\n search.addEventListener('input', () => {\n this.query = search.value;\n this.applyFilter();\n });\n this.search = search;\n panel.appendChild(search);\n }\n\n this.list = document.createElement('ol');\n this.list.className = 'hp-transcript-list';\n // Kullanıcı kaydırırken otomatik kaydırma birkaç saniye durur.\n for (const ev of ['wheel', 'touchmove'] as const) {\n this.list.addEventListener(ev, () => (this.userScrollUntil = performance.now() + 4000), { passive: true });\n }\n this.status = document.createElement('p');\n this.status.className = 'hp-transcript-status';\n this.status.setAttribute('aria-live', 'polite');\n panel.append(this.list, this.status);\n\n // Panel içindeki tıklama / yazma oynatıcıya (oynat-duraklat, kısayollar) gitmesin.\n for (const ev of ['pointerdown', 'click', 'dblclick'] as const) panel.addEventListener(ev, (e) => e.stopPropagation());\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.setOpen(false);\n this.button?.focus();\n }\n e.stopPropagation();\n });\n ctx.overlayEl.appendChild(panel);\n this.panel = panel;\n\n if (options.button !== false) {\n const { btn } = ctx.addButton(ctx.i18n.transcript, 'transcript', () => this.setOpen(!this.open));\n btn.classList.add('hp-transcript-btn');\n btn.setAttribute('aria-pressed', 'false');\n this.button = btn;\n }\n\n this.refreshLabels();\n ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n ctx.videoEl.addEventListener('seeked', this.onTimeUpdate);\n ctx.videoEl.addEventListener('hp-internal:subtitle-loaded', this.onTracksChanged);\n ctx.hostEl.addEventListener('hp:adstart', this.onAd);\n ctx.hostEl.addEventListener('hp:adend', this.onAd);\n this.onTracksChanged();\n if (options.open) this.setOpen(true, false);\n }\n\n get isOpen(): boolean {\n return this.open;\n }\n\n setOpen(open: boolean, emit = true): void {\n if (open === this.open) return;\n this.open = open;\n this.panel.hidden = !open;\n this.button?.setAttribute('aria-pressed', String(open));\n this.ctx.overlayEl.toggleAttribute('data-transcript-open', open);\n if (open) {\n this.onTracksChanged();\n this.scrollToActive(true);\n }\n if (emit) this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:transcript', { detail: { state: open ? 'open' : 'close' } }));\n }\n\n /** Altyazı listesi / seçimi değişti — kaynak iz yeniden seçilir. */\n readonly onTracksChanged = (): void => {\n const tracks = this.ctx.getTracks();\n const prev = this.select.value;\n this.select.replaceChildren(\n ...tracks.map((t) => {\n const o = document.createElement('option');\n o.value = o.textContent = t.label;\n return o;\n })\n );\n this.select.hidden = tracks.length < 2;\n const want = this.options.track;\n const byOption = want ? tracks.find((t) => t.label === want || t.track.language === want) : undefined;\n const keep = this.sourceLabel ? tracks.find((t) => t.label === this.sourceLabel) : undefined;\n const active = this.ctx.activeLabel();\n const pick = keep ?? (active ? tracks.find((t) => t.label === active) : undefined) ?? byOption ?? tracks[0];\n if (pick) this.select.value = pick.label;\n if (pick?.track !== this.sourceTrack || prev !== this.select.value || this.cueCount < 0) this.load();\n else this.syncCues();\n };\n\n refreshLabels(): void {\n const i18n = this.ctx.i18n;\n this.titleEl.textContent = i18n.transcript;\n this.panel.setAttribute('aria-label', i18n.transcript);\n this.select.setAttribute('aria-label', i18n.transcriptTrack);\n this.closeBtn.setAttribute('aria-label', i18n.transcriptClose);\n if (this.search) {\n this.search.placeholder = i18n.transcriptSearch;\n this.search.setAttribute('aria-label', i18n.transcriptSearch);\n }\n this.button?.setAttribute('aria-label', i18n.transcript);\n this.updateStatus();\n }\n\n destroy(): void {\n const v = this.ctx.videoEl;\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeked', this.onTimeUpdate);\n v.removeEventListener('hp-internal:subtitle-loaded', this.onTracksChanged);\n this.ctx.hostEl.removeEventListener('hp:adstart', this.onAd);\n this.ctx.hostEl.removeEventListener('hp:adend', this.onAd);\n this.ctx.overlayEl.removeAttribute('data-transcript-open');\n this.panel.remove();\n this.button?.remove();\n }\n\n private readonly onAd = (e: Event): void => {\n this.panel.toggleAttribute('data-ad', e.type === 'hp:adstart');\n };\n\n /** Seçili izin cue'larını baştan kurar. */\n private load(): void {\n const label = this.select.value || null;\n this.sourceTrack = this.ctx.getTracks().find((t) => t.label === label)?.track ?? null;\n this.cueCount = -1;\n this.syncCues();\n }\n\n /** Cue sayısı değiştiyse (yayın izi parça parça dolar) satırları yeniden çizer. */\n private syncCues(): void {\n const cues = this.sourceTrack ? trackCues(this.sourceTrack) : null;\n const count = cues?.length ?? 0;\n if (count === this.cueCount) return;\n this.cueCount = count;\n const sorted = (cues ?? []).slice().sort((a, b) => a.start - b.start);\n const lines: Line[] = [];\n for (const c of sorted) {\n const text = cleanCueText(c.text);\n if (!text) continue;\n // Kayan (roll-up) altyazılarda aynı satır art arda tekrar eder — birleştir.\n const last = lines[lines.length - 1];\n if (last && last.text === text) {\n last.end = Math.max(last.end, c.end);\n continue;\n }\n lines.push(this.buildLine(c.start, c.end, text));\n }\n this.lines = lines;\n this.activeIndex = -1;\n this.list.replaceChildren(...lines.map((l) => l.row));\n this.applyFilter();\n this.onTimeUpdate();\n }\n\n private buildLine(start: number, end: number, text: string): Line {\n const row = document.createElement('li');\n row.className = 'hp-transcript-line';\n const btn = document.createElement('button');\n btn.type = 'button';\n const time = document.createElement('span');\n time.className = 'hp-transcript-time';\n time.textContent = formatTime(start);\n const textEl = document.createElement('span');\n textEl.className = 'hp-transcript-text';\n textEl.textContent = text;\n btn.append(time, textEl);\n btn.addEventListener('click', () => {\n const v = this.ctx.videoEl;\n v.currentTime = start;\n this.userScrollUntil = 0;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:transcript', { detail: { state: 'seek', time: start } }));\n });\n row.appendChild(btn);\n return { start, end, text, row, textEl };\n }\n\n private readonly onTimeUpdate = (): void => {\n // Yayın izleri oynarken dolar — saniyede bir bakılır.\n const now = performance.now();\n if (this.sourceTrack && this.cueCount >= 0 && now - this.lastSync > 1000) {\n this.lastSync = now;\n this.syncCues();\n }\n const t = this.ctx.videoEl.currentTime;\n let index = -1;\n for (let i = 0; i < this.lines.length; i++) {\n if (this.lines[i]!.start > t) break;\n index = i;\n }\n // Satırlar arası boşlukta son satır vurgulu kalır; satırın bitişinden 3 sn sonra söner.\n if (index >= 0 && t > this.lines[index]!.end + 3) index = -1;\n if (index === this.activeIndex) return;\n if (this.activeIndex >= 0) {\n const prev = this.lines[this.activeIndex]?.row;\n prev?.removeAttribute('data-active');\n prev?.firstElementChild?.removeAttribute('aria-current');\n }\n this.activeIndex = index;\n const row = this.lines[index]?.row;\n row?.setAttribute('data-active', '');\n row?.firstElementChild?.setAttribute('aria-current', 'true');\n this.scrollToActive(false);\n };\n\n private scrollToActive(force: boolean): void {\n if (!this.open || (!force && (!this.autoScroll || performance.now() < this.userScrollUntil))) return;\n const row = this.lines[this.activeIndex]?.row;\n if (!row || row.hidden) return;\n // scrollIntoView sayfayı da kaydırır — yalnızca listeyi kaydır.\n const list = this.list;\n const top = row.offsetTop - list.offsetTop;\n if (force || top < list.scrollTop || top + row.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = Math.max(0, top - list.clientHeight / 3);\n }\n }\n\n /** Arama: eşleşmeyen satırlar gizlenir, eşleşen kısım <mark> ile vurgulanır. */\n private applyFilter(): void {\n const q = fold(this.query.trim());\n let shown = 0;\n for (const line of this.lines) {\n if (!q) {\n line.row.hidden = false;\n line.textEl.textContent = line.text;\n shown++;\n continue;\n }\n const at = fold(line.text).indexOf(q);\n line.row.hidden = at < 0;\n if (at < 0) continue;\n shown++;\n // fold() uzunluğu değiştirmeyen harflerde konum aynıdır; değiştiyse vurgusuz göster.\n if (fold(line.text).length !== line.text.length) {\n line.textEl.textContent = line.text;\n continue;\n }\n const mark = document.createElement('mark');\n mark.textContent = line.text.slice(at, at + q.length);\n line.textEl.replaceChildren(line.text.slice(0, at), mark, line.text.slice(at + q.length));\n }\n this.updateStatus(shown);\n }\n\n private updateStatus(shown = this.lines.filter((l) => !l.row.hidden).length): void {\n const i18n = this.ctx.i18n;\n let msg = '';\n if (!this.ctx.getTracks().length) msg = i18n.transcriptEmpty;\n else if (!this.lines.length) msg = i18n.transcriptWaiting;\n else if (!shown) msg = i18n.transcriptNoResults;\n this.status.textContent = msg;\n this.status.hidden = !msg;\n }\n}\n","import { Transcript, type TranscriptPlayerContext } from './Transcript';\nimport type { TranscriptOptions } from '../../types';\n\nexport function installTranscript(ctx: TranscriptPlayerContext, options: TranscriptOptions): Transcript {\n return new Transcript(ctx, options);\n}\n\nexport { Transcript };\nexport type { TranscriptPlayerContext };\n"],"names":["ENTITIES","cleanCueText","raw","m","fold","s","Transcript","ctx","options","__publicField","tracks","prev","t","o","want","byOption","keep","active","pick","e","now","index","i","_a","_b","row","_c","_d","adoptStyle","css","panel","head","createIcon","search","ev","btn","open","emit","i18n","v","label","cues","trackCues","count","sorted","a","b","lines","c","text","last","l","start","end","time","formatTime","textEl","force","list","top","q","shown","line","at","mark","msg","installTranscript"],"mappings":"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"}